Add test activiy to TestSatelliteApp for SatelliteManagerWrapper

Added test activity to enhance the ability to test public APIs run by GMS core apps

Bug: 305647534
Test: manual
  1. Install SatelliteTestApp
  2. run Test test satellite wrapper activity
Change-Id: I060897e63b6735b1a45bda61b2005df7820bed16
diff --git a/testapps/TestSatelliteApp/Android.bp b/testapps/TestSatelliteApp/Android.bp
index fd3c424..78d125d 100644
--- a/testapps/TestSatelliteApp/Android.bp
+++ b/testapps/TestSatelliteApp/Android.bp
@@ -11,6 +11,9 @@
         "src/**/*.java",
         "src/**/I*.aidl",
     ],
+    static_libs: [
+        "SatelliteClient",
+    ],
     owner: "google",
     privileged: true,
     certificate: "platform",
diff --git a/testapps/TestSatelliteApp/AndroidManifest.xml b/testapps/TestSatelliteApp/AndroidManifest.xml
index 4a6076b..4e9a7c1 100644
--- a/testapps/TestSatelliteApp/AndroidManifest.xml
+++ b/testapps/TestSatelliteApp/AndroidManifest.xml
@@ -45,5 +45,6 @@
         <activity android:name=".Provisioning" />
         <activity android:name=".MultipleSendReceive" />
         <activity android:name=".SendReceive" />
+        <activity android:name=".TestSatelliteWrapper" />
     </application>
 </manifest>
diff --git a/testapps/TestSatelliteApp/res/layout/activity_SatelliteTestApp.xml b/testapps/TestSatelliteApp/res/layout/activity_SatelliteTestApp.xml
index d32916f..90a6f94 100644
--- a/testapps/TestSatelliteApp/res/layout/activity_SatelliteTestApp.xml
+++ b/testapps/TestSatelliteApp/res/layout/activity_SatelliteTestApp.xml
@@ -64,5 +64,11 @@
              android:layout_height="wrap_content"
              android:paddingRight="4dp"
              android:text="@string/SendReceive"/>
+        <Button
+            android:id="@+id/TestSatelliteWrapper"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:paddingRight="4dp"
+            android:text="@string/TestSatelliteWrapper"/>
     </LinearLayout>
 </LinearLayout>
diff --git a/testapps/TestSatelliteApp/res/layout/activity_TestSatelliteWrapper.xml b/testapps/TestSatelliteApp/res/layout/activity_TestSatelliteWrapper.xml
new file mode 100644
index 0000000..9035c0c
--- /dev/null
+++ b/testapps/TestSatelliteApp/res/layout/activity_TestSatelliteWrapper.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2023 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License
+  -->
+
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:orientation="vertical"
+    android:gravity="center"
+    android:paddingLeft="4dp">
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="vertical" >
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_weight="0"
+            android:textColor="@android:color/holo_blue_dark"
+            android:textSize="20dp"
+            android:text="Satellite Wrapper Test"/>
+        <Button
+            android:id="@+id/requestNtnSignalStrength"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:paddingRight="4dp"
+            android:text="@string/requestNtnSignalStrength"/>
+        <Button
+            android:id="@+id/registerForNtnSignalStrengthChanged"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:paddingRight="4dp"
+            android:text="@string/registerForNtnSignalStrengthChanged"/>
+        <Button
+            android:id="@+id/unregisterForNtnSignalStrengthChanged"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:paddingRight="4dp"
+            android:text="@string/unregisterForNtnSignalStrengthChanged"/>
+         <Button
+            android:id="@+id/Back"
+            android:onClick="Back"
+            android:textColor="@android:color/holo_blue_dark"
+            android:layout_marginTop="100dp"
+            android:layout_gravity="center"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:paddingRight="4dp"
+            android:text="@string/Back"/>
+         <TextView
+            android:id="@+id/text_id"
+            android:layout_width="300dp"
+            android:layout_height="200dp"
+            android:capitalize="characters"
+            android:textColor="@android:color/holo_blue_light"
+            android:layout_centerVertical="true"
+            android:textSize="15dp" />
+    </LinearLayout>
+</LinearLayout>
diff --git a/testapps/TestSatelliteApp/res/values/donottranslate_strings.xml b/testapps/TestSatelliteApp/res/values/donottranslate_strings.xml
index f2c1f57..b39ba59 100644
--- a/testapps/TestSatelliteApp/res/values/donottranslate_strings.xml
+++ b/testapps/TestSatelliteApp/res/values/donottranslate_strings.xml
@@ -57,5 +57,10 @@
     <string name="sendMessage">sendMessage</string>
     <string name="receiveMessage">receiveMessage</string>
 
+    <string name="TestSatelliteWrapper">Test Satellite Wrapper</string>
+    <string name="requestNtnSignalStrength">requestNtnSignalStrength</string>
+    <string name="registerForNtnSignalStrengthChanged">registerForNtnSignalStrengthChanged</string>
+    <string name="unregisterForNtnSignalStrengthChanged">unregisterForNtnSignalStrengthChanged</string>
+
     <string name="Back">Back</string>
 </resources>
diff --git a/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/SatelliteTestApp.java b/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/SatelliteTestApp.java
index ac1dcfb..ced9a06 100644
--- a/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/SatelliteTestApp.java
+++ b/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/SatelliteTestApp.java
@@ -89,6 +89,13 @@
                 startActivity(intent);
             }
         });
+        findViewById(R.id.TestSatelliteWrapper).setOnClickListener(new OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                Intent intent = new Intent(SatelliteTestApp.this, TestSatelliteWrapper.class);
+                startActivity(intent);
+            }
+        });
     }
 
     private final ILocalSatelliteListener mSatelliteListener =
diff --git a/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/TestSatelliteWrapper.java b/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/TestSatelliteWrapper.java
new file mode 100644
index 0000000..16df37e
--- /dev/null
+++ b/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/TestSatelliteWrapper.java
@@ -0,0 +1,207 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.phone.testapps.satellitetestapp;
+
+import android.annotation.NonNull;
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.OutcomeReceiver;
+import android.telephony.satellite.wrapper.NtnSignalStrengthCallbackWrapper;
+import android.telephony.satellite.wrapper.NtnSignalStrengthWrapper;
+import android.telephony.satellite.wrapper.SatelliteManagerWrapper;
+import android.util.Log;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+/**
+ * Activity related to SatelliteControl APIs for satellite.
+ */
+public class TestSatelliteWrapper extends Activity {
+    private static final String TAG = "TestSatelliteWrapper";
+
+    private final ExecutorService mExecutor = Executors.newSingleThreadExecutor();
+    private SatelliteManagerWrapper mSatelliteManagerWrapper;
+    private NtnSignalStrengthCallback mNtnSignalStrengthCallback = null;
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        mSatelliteManagerWrapper = SatelliteManagerWrapper.getInstance(this);
+
+        setContentView(R.layout.activity_TestSatelliteWrapper);
+        findViewById(R.id.requestNtnSignalStrength)
+                .setOnClickListener(this::requestNtnSignalStrength);
+        findViewById(R.id.registerForNtnSignalStrengthChanged)
+                .setOnClickListener(this::registerForNtnSignalStrengthChanged);
+        findViewById(R.id.unregisterForNtnSignalStrengthChanged)
+                .setOnClickListener(this::unregisterForNtnSignalStrengthChanged);
+        findViewById(R.id.Back).setOnClickListener(new OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                startActivity(new Intent(TestSatelliteWrapper.this, SatelliteTestApp.class));
+            }
+        });
+    }
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+
+        if (mSatelliteManagerWrapper != null && mNtnSignalStrengthCallback != null) {
+            Log.d(TAG, "unregisterForNtnSignalStrengthChanged()");
+            mSatelliteManagerWrapper.unregisterForNtnSignalStrengthChanged(
+                    mNtnSignalStrengthCallback);
+        }
+    }
+
+    private void requestNtnSignalStrength(View view) {
+        Log.d(TAG, "requestNtnSignalStrength");
+        TextView textView = findViewById(R.id.text_id);
+        OutcomeReceiver<NtnSignalStrengthWrapper,
+                SatelliteManagerWrapper.SatelliteExceptionWrapper> receiver =
+                new OutcomeReceiver<>() {
+                    @Override
+                    public void onResult(NtnSignalStrengthWrapper level) {
+                        TextView textView = findViewById(R.id.text_id);
+                        if (level != null) {
+                            textView.setText("requestNtnSignalStrength level is "
+                                    + level.getLevel());
+                        }
+                    }
+
+                    @Override
+                    public void onError(
+                            SatelliteManagerWrapper.SatelliteExceptionWrapper exception) {
+                        if (exception != null) {
+                            TextView textView = findViewById(R.id.text_id);
+                            String onError = "requestNtnSignalStrength exception: "
+                                    + translateResultCodeToString(exception.getErrorCode());
+                            Log.d(TAG, onError);
+                            textView.setText(onError);
+                        }
+                    }
+                };
+
+        mSatelliteManagerWrapper.requestNtnSignalStrength(mExecutor, receiver);
+    }
+
+    private void registerForNtnSignalStrengthChanged(View view) {
+        Log.d(TAG, "registerForNtnSignalStrengthChanged()");
+        TextView textView = findViewById(R.id.text_id);
+        if (mNtnSignalStrengthCallback == null) {
+            Log.d(TAG, "create new NtnSignalStrengthCallback instance.");
+            mNtnSignalStrengthCallback = new NtnSignalStrengthCallback();
+        }
+        int result = mSatelliteManagerWrapper.registerForNtnSignalStrengthChanged(mExecutor,
+                mNtnSignalStrengthCallback);
+        if (result != SatelliteManagerWrapper.SATELLITE_RESULT_SUCCESS) {
+            String onError = translateResultCodeToString(result);
+            Log.d(TAG, onError);
+            textView.setText(onError);
+            mNtnSignalStrengthCallback = null;
+        }
+    }
+
+    private void unregisterForNtnSignalStrengthChanged(View view) {
+        Log.d(TAG, "unregisterForNtnSignalStrengthChanged()");
+        TextView textView = findViewById(R.id.text_id);
+        if (mNtnSignalStrengthCallback != null) {
+            mSatelliteManagerWrapper.unregisterForNtnSignalStrengthChanged(
+                    mNtnSignalStrengthCallback);
+            mNtnSignalStrengthCallback = null;
+            textView.setText("mNtnSignalStrengthCallback was unregistered");
+        } else {
+            textView.setText("mNtnSignalStrengthCallback is null, ignored.");
+        }
+    }
+
+    public class NtnSignalStrengthCallback implements NtnSignalStrengthCallbackWrapper {
+        @Override
+        public void onNtnSignalStrengthChanged(
+                @NonNull NtnSignalStrengthWrapper ntnSignalStrength) {
+            String toastMessage = "Received NTN SignalStrength : " + ntnSignalStrength.getLevel();
+            Log.d(TAG, toastMessage);
+            runOnUiThread(new Runnable() {
+                @Override
+                public void run() {
+                    Toast.makeText(getApplicationContext(), toastMessage,
+                            Toast.LENGTH_SHORT).show();
+                }
+            });
+        }
+    }
+
+    private String translateResultCodeToString(
+            @SatelliteManagerWrapper.SatelliteResult int result) {
+        switch (result) {
+            case SatelliteManagerWrapper.SATELLITE_RESULT_SUCCESS:
+                return "SATELLITE_RESULT_SUCCESS";
+            case SatelliteManagerWrapper.SATELLITE_RESULT_ERROR:
+                return "SATELLITE_RESULT_ERROR";
+            case SatelliteManagerWrapper.SATELLITE_RESULT_SERVER_ERROR:
+                return "SATELLITE_RESULT_SERVER_ERROR";
+            case SatelliteManagerWrapper.SATELLITE_RESULT_SERVICE_ERROR:
+                return "SATELLITE_RESULT_SERVICE_ERROR";
+            case SatelliteManagerWrapper.SATELLITE_RESULT_MODEM_ERROR:
+                return "SATELLITE_RESULT_MODEM_ERROR";
+            case SatelliteManagerWrapper.SATELLITE_RESULT_NETWORK_ERROR:
+                return "SATELLITE_RESULT_NETWORK_ERROR";
+            case SatelliteManagerWrapper.SATELLITE_RESULT_INVALID_TELEPHONY_STATE:
+                return "SATELLITE_RESULT_INVALID_TELEPHONY_STATE";
+            case SatelliteManagerWrapper.SATELLITE_RESULT_INVALID_MODEM_STATE:
+                return "SATELLITE_RESULT_INVALID_MODEM_STATE";
+            case SatelliteManagerWrapper.SATELLITE_RESULT_INVALID_ARGUMENTS:
+                return "SATELLITE_RESULT_INVALID_ARGUMENTS";
+            case SatelliteManagerWrapper.SATELLITE_RESULT_REQUEST_FAILED:
+                return "SATELLITE_RESULT_REQUEST_FAILED";
+            case SatelliteManagerWrapper.SATELLITE_RESULT_RADIO_NOT_AVAILABLE:
+                return "SATELLITE_RESULT_RADIO_NOT_AVAILABLE";
+            case SatelliteManagerWrapper.SATELLITE_RESULT_REQUEST_NOT_SUPPORTED:
+                return "SATELLITE_RESULT_REQUEST_NOT_SUPPORTED";
+            case SatelliteManagerWrapper.SATELLITE_RESULT_NO_RESOURCES:
+                return "SATELLITE_RESULT_NO_RESOURCES";
+            case SatelliteManagerWrapper.SATELLITE_RESULT_SERVICE_NOT_PROVISIONED:
+                return "SATELLITE_RESULT_SERVICE_NOT_PROVISIONED";
+            case SatelliteManagerWrapper.SATELLITE_RESULT_SERVICE_PROVISION_IN_PROGRESS:
+                return "SATELLITE_RESULT_SERVICE_PROVISION_IN_PROGRESS";
+            case SatelliteManagerWrapper.SATELLITE_RESULT_REQUEST_ABORTED:
+                return "SATELLITE_RESULT_REQUEST_ABORTED";
+            case SatelliteManagerWrapper.SATELLITE_RESULT_ACCESS_BARRED:
+                return "SATELLITE_RESULT_ACCESS_BARRED";
+            case SatelliteManagerWrapper.SATELLITE_RESULT_NETWORK_TIMEOUT:
+                return "SATELLITE_RESULT_NETWORK_TIMEOUT";
+            case SatelliteManagerWrapper.SATELLITE_RESULT_NOT_REACHABLE:
+                return "SATELLITE_RESULT_NOT_REACHABLE";
+            case SatelliteManagerWrapper.SATELLITE_RESULT_NOT_AUTHORIZED:
+                return "SATELLITE_RESULT_NOT_AUTHORIZED";
+            case SatelliteManagerWrapper.SATELLITE_RESULT_NOT_SUPPORTED:
+                return "SATELLITE_RESULT_NOT_SUPPORTED";
+            case SatelliteManagerWrapper.SATELLITE_RESULT_REQUEST_IN_PROGRESS:
+                return "SATELLITE_RESULT_REQUEST_IN_PROGRESS";
+            case SatelliteManagerWrapper.SATELLITE_RESULT_MODEM_BUSY:
+                return "SATELLITE_RESULT_MODEM_BUSY";
+            default:
+                return "INVALID CODE: " + result;
+        }
+    }
+}