Merge "Hidden menu fix to hide the non-eSOS test button if the carrier config KEY_SATELLITE_ATTACH_SUPPORTED_BOOL is false for the given sim" into main
diff --git a/src/com/android/phone/PhoneInterfaceManager.java b/src/com/android/phone/PhoneInterfaceManager.java
index 6dc2add..41e8647 100644
--- a/src/com/android/phone/PhoneInterfaceManager.java
+++ b/src/com/android/phone/PhoneInterfaceManager.java
@@ -479,6 +479,8 @@
 
     private static final int MODEM_ACTIVITY_TIME_OFFSET_CORRECTION_MS = 50;
 
+    private static final int LINE1_NUMBER_MAX_LEN = 50;
+
     /**
      * With support for MEP(multiple enabled profile) in Android T, a SIM card can have more than
      * one ICCID active at the same time.
@@ -7581,8 +7583,11 @@
             }
         }
 
-        enforceTelephonyFeatureWithException(getCurrentPackageName(),
-                PackageManager.FEATURE_TELEPHONY_DATA, "isDataEnabledForReason");
+        if (!mApp.getResources().getBoolean(
+                    com.android.internal.R.bool.config_force_phone_globals_creation)) {
+            enforceTelephonyFeatureWithException(getCurrentPackageName(),
+                    PackageManager.FEATURE_TELEPHONY_DATA, "isDataEnabledForReason");
+        }
 
         final long identity = Binder.clearCallingIdentity();
         try {
@@ -7669,9 +7674,12 @@
     public int checkCarrierPrivilegesForPackageAnyPhone(String pkgName) {
         enforceReadPrivilegedPermission("checkCarrierPrivilegesForPackageAnyPhone");
 
-        enforceTelephonyFeatureWithException(getCurrentPackageName(),
-                PackageManager.FEATURE_TELEPHONY_SUBSCRIPTION,
-                "checkCarrierPrivilegesForPackageAnyPhone");
+        if (!mApp.getResources().getBoolean(
+                    com.android.internal.R.bool.config_force_phone_globals_creation)) {
+            enforceTelephonyFeatureWithException(getCurrentPackageName(),
+                    PackageManager.FEATURE_TELEPHONY_SUBSCRIPTION,
+                    "checkCarrierPrivilegesForPackageAnyPhone");
+        }
 
         return checkCarrierPrivilegesForPackageAnyPhoneWithPermission(pkgName);
     }
@@ -7852,6 +7860,10 @@
             if (phone == null) {
                 return false;
             }
+            if (!TextUtils.isEmpty(number) && number.length() > LINE1_NUMBER_MAX_LEN) {
+                Rlog.e(LOG_TAG, "Number is too long");
+                return false;
+            }
             final String subscriberId = phone.getSubscriberId();
 
             if (DBG_MERGE) {
diff --git a/testapps/TestSatelliteApp/res/layout/activity_TestSatelliteWrapper.xml b/testapps/TestSatelliteApp/res/layout/activity_TestSatelliteWrapper.xml
index a6259c8..39a4bd6 100644
--- a/testapps/TestSatelliteApp/res/layout/activity_TestSatelliteWrapper.xml
+++ b/testapps/TestSatelliteApp/res/layout/activity_TestSatelliteWrapper.xml
@@ -155,6 +155,18 @@
             android:layout_height="wrap_content"
             android:paddingRight="4dp"
             android:text="@string/unregisterForCommunicationAllowedStateChanged"/>
+        <Button
+            android:id="@+id/registerForModemStateChanged"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:paddingRight="4dp"
+            android:text="@string/registerForModemStateChanged"/>
+        <Button
+            android:id="@+id/unregisterForModemStateChanged"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:paddingRight="4dp"
+            android:text="@string/unregisterForModemStateChanged"/>
         <LinearLayout
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
diff --git a/testapps/TestSatelliteApp/res/values/donottranslate_strings.xml b/testapps/TestSatelliteApp/res/values/donottranslate_strings.xml
index 86f458e..c51d574 100644
--- a/testapps/TestSatelliteApp/res/values/donottranslate_strings.xml
+++ b/testapps/TestSatelliteApp/res/values/donottranslate_strings.xml
@@ -102,4 +102,7 @@
 
     <string name="registerForCarrierRoamingNtnModeChanged">registerForCarrierRoamingNtnModeChanged</string>
     <string name="unregisterForCarrierRoamingNtnModeChanged">unregisterForCarrierRoamingNtnModeChanged</string>
+
+    <string name="registerForModemStateChanged">registerForModemStateChanged</string>
+    <string name="unregisterForModemStateChanged">unregisterForModemStateChanged</string>
 </resources>
diff --git a/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/TestSatelliteWrapper.java b/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/TestSatelliteWrapper.java
index bc42f1d..109ebbf 100644
--- a/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/TestSatelliteWrapper.java
+++ b/testapps/TestSatelliteApp/src/com/android/phone/testapps/satellitetestapp/TestSatelliteWrapper.java
@@ -29,6 +29,7 @@
 import android.telephony.satellite.wrapper.SatelliteCapabilitiesCallbackWrapper;
 import android.telephony.satellite.wrapper.SatelliteCommunicationAllowedStateCallbackWrapper;
 import android.telephony.satellite.wrapper.SatelliteManagerWrapper;
+import android.telephony.satellite.wrapper.SatelliteModemStateCallbackWrapper;
 import android.util.Log;
 import android.view.View;
 import android.view.View.OnClickListener;
@@ -55,6 +56,7 @@
     private final ExecutorService mExecutor = Executors.newSingleThreadExecutor();
     private SatelliteManagerWrapper mSatelliteManagerWrapper;
     private NtnSignalStrengthCallback mNtnSignalStrengthCallback = null;
+    private SatelliteModemStateCallback mModemStateCallback = null;
     private CarrierRoamingNtnModeListener mCarrierRoamingNtnModeListener = null;
     private SatelliteCommunicationAllowedStateCallback mSatelliteCommunicationAllowedStateCallback;
     private SatelliteCapabilitiesCallbackWrapper mSatelliteCapabilitiesCallback;
@@ -111,6 +113,10 @@
                 .setOnClickListener(this::registerForCommunicationAllowedStateChanged);
         findViewById(R.id.unregisterForCommunicationAllowedStateChanged)
                 .setOnClickListener(this::unregisterForCommunicationAllowedStateChanged);
+        findViewById(R.id.registerForModemStateChanged)
+                .setOnClickListener(this::registerForModemStateChanged);
+        findViewById(R.id.unregisterForModemStateChanged)
+                .setOnClickListener(this::unregisterForModemStateChanged);
 
         findViewById(R.id.Back).setOnClickListener(new OnClickListener() {
             @Override
@@ -353,6 +359,38 @@
         }
     }
 
+    private void registerForModemStateChanged(View view) {
+        addLogMessage("registerForModemStateChanged");
+        logd("registerForSatelliteModemStateChanged()");
+        if (mModemStateCallback == null) {
+            logd("create new ModemStateCallback instance.");
+            mModemStateCallback = new SatelliteModemStateCallback();
+        }
+
+        try {
+            mSatelliteManagerWrapper.registerForModemStateChanged(mExecutor, mModemStateCallback);
+        } catch (Exception ex) {
+            String errorMessage = "registerForModemStateChanged: " + ex.getMessage();
+            logd(errorMessage);
+            addLogMessage(errorMessage);
+            mModemStateCallback = null;
+        }
+    }
+
+    private void unregisterForModemStateChanged(View view) {
+        addLogMessage("unregisterForModemStateChanged");
+        logd("unregisterForModemStateChanged()");
+        if (mModemStateCallback != null) {
+            mSatelliteManagerWrapper.unregisterForModemStateChanged(mModemStateCallback);
+            mModemStateCallback = null;
+            addLogMessage("mModemStateCallback was unregistered");
+        } else {
+            addLogMessage("mModemStateCallback is null, ignored.");
+        }
+    }
+
+
+
     public class NtnSignalStrengthCallback implements NtnSignalStrengthCallbackWrapper {
         @Override
         public void onNtnSignalStrengthChanged(
@@ -393,6 +431,22 @@
         }
     }
 
+    private class SatelliteModemStateCallback implements SatelliteModemStateCallbackWrapper {
+        @Override
+        public void onSatelliteModemStateChanged(int state) {
+            String message = "Received onSatelliteModemStateChanged state: " + state;
+            logd(message);
+            addLogMessage(message);
+        }
+
+        @Override
+        public void onEmergencyModeChanged(boolean isEmergency) {
+            String message = "Received onEmergencyModeChanged isEmergency: " + isEmergency;
+            logd(message);
+            addLogMessage(message);
+        }
+    }
+
     private void isNonTerrestrialNetwork(View view) {
         boolean isNonTerrestrialNetwork = mSatelliteManagerWrapper.isNonTerrestrialNetwork(mSubId);
         addLogMessage("isNonTerrestrialNetwork=" + isNonTerrestrialNetwork);