Merge "Use the new HAL API updateSystemSelectionChannels to pass the bands/frequency to vendor service." into main
diff --git a/src/com/android/phone/PhoneInterfaceManager.java b/src/com/android/phone/PhoneInterfaceManager.java
index 47c00af..6e7306a 100644
--- a/src/com/android/phone/PhoneInterfaceManager.java
+++ b/src/com/android/phone/PhoneInterfaceManager.java
@@ -163,6 +163,7 @@
import android.telephony.satellite.ISatelliteProvisionStateCallback;
import android.telephony.satellite.ISatelliteSupportedStateCallback;
import android.telephony.satellite.ISatelliteTransmissionUpdateCallback;
+import android.telephony.satellite.ISelectedNbIotSatelliteSubscriptionCallback;
import android.telephony.satellite.NtnSignalStrength;
import android.telephony.satellite.NtnSignalStrengthCallback;
import android.telephony.satellite.SatelliteCapabilities;
@@ -8595,9 +8596,10 @@
setNetworkSelectionModeAutomatic(subId);
Phone phone = getPhone(subId);
cleanUpAllowedNetworkTypes(phone, subId);
+
setDataRoamingEnabled(subId, phone == null ? false
: phone.getDataSettingsManager().isDefaultDataRoamingEnabled());
- getPhone(subId).resetCarrierKeysForImsiEncryption();
+ getPhone(subId).resetCarrierKeysForImsiEncryption(true);
}
// There has been issues when Sms raw table somehow stores orphan
// fragments. They lead to garbled message when new fragments come
@@ -13789,6 +13791,54 @@
}
/**
+ * Registers for selected satellite subscription changed event from the satellite service.
+ *
+ * @param callback The callback to handle the satellite subscription changed event.
+ *
+ * @return The {@link SatelliteManager.SatelliteResult} result of the operation.
+ *
+ * @throws SecurityException if the caller doesn't have required permission.
+ */
+ @Override
+ @SatelliteManager.SatelliteResult
+ public int registerForSelectedNbIotSatelliteSubscriptionChanged(
+ @NonNull ISelectedNbIotSatelliteSubscriptionCallback callback) {
+ enforceSatelliteCommunicationPermission(
+ "registerForSelectedNbIotSatelliteSubscriptionChanged");
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ return mSatelliteController.registerForSelectedNbIotSatelliteSubscriptionChanged(
+ callback);
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ /**
+ * Unregisters for selected satellite subscription changed event from the satellite service.
+ * If callback was not registered before, the request will be ignored.
+ *
+ * @param callback The callback that was passed to {@link
+ * #registerForSelectedNbIotSatelliteSubscriptionChanged(
+ * ISelectedNbIotSatelliteSubscriptionCallback)}.
+ *
+ * @throws SecurityException if the caller doesn't have required permission.
+ */
+ @Override
+ public void unregisterForSelectedNbIotSatelliteSubscriptionChanged(
+ @NonNull ISelectedNbIotSatelliteSubscriptionCallback callback) {
+ enforceSatelliteCommunicationPermission(
+ "unregisterForSelectedNbIotSatelliteSubscriptionChanged");
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ mSatelliteController.unregisterForSelectedNbIotSatelliteSubscriptionChanged(
+ callback);
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ /**
* Inform whether the device is aligned with the satellite in both real and demo mode.
*
* @param isAligned {@code true} Device is aligned with the satellite.
@@ -14867,4 +14917,25 @@
Binder.restoreCallingIdentity(identity);
}
}
+
+ /**
+ * Returns carrier id maps to the passing {@link CarrierIdentifier}.
+ *
+ * @param carrierIdentifier {@link CarrierIdentifier}.
+ *
+ * @return carrier id from passing {@link CarrierIdentifier} or UNKNOWN_CARRIER_ID
+ * if the carrier cannot be identified
+ */
+ public int getCarrierIdFromIdentifier(@NonNull CarrierIdentifier carrierIdentifier) {
+ enforceReadPrivilegedPermission("getCarrierIdFromIdentifier");
+ enforceTelephonyFeatureWithException(getCurrentPackageName(),
+ PackageManager.FEATURE_TELEPHONY_SUBSCRIPTION, "getCarrierIdFromIdentifier");
+
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ return CarrierResolver.getCarrierIdFromIdentifier(mApp, carrierIdentifier);
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
}
diff --git a/src/com/android/phone/TelephonyShellCommand.java b/src/com/android/phone/TelephonyShellCommand.java
index 5ea1304..93ac55e 100644
--- a/src/com/android/phone/TelephonyShellCommand.java
+++ b/src/com/android/phone/TelephonyShellCommand.java
@@ -232,6 +232,7 @@
"set-allowed-network-types-for-users";
private static final String GET_IMEI = "get-imei";
private static final String GET_SIM_SLOTS_MAPPING = "get-sim-slots-mapping";
+ private static final String COMMAND_DELETE_IMSI_KEY = "delete_imsi_key";
// Take advantage of existing methods that already contain permissions checks when possible.
private final ITelephony mInterface;
@@ -431,6 +432,8 @@
return handleSetSatelliteSubscriberIdListChangedIntentComponent();
case SET_SATELLITE_ACCESS_RESTRICTION_CHECKING_RESULT:
return handleOverrideCarrierRoamingNtnEligibilityChanged();
+ case COMMAND_DELETE_IMSI_KEY:
+ return handleDeleteTestImsiKey();
default: {
return handleDefaultCommands(cmd);
}
@@ -4132,4 +4135,22 @@
Log.d(LOG_TAG, "handleSetSatelliteAccessRestrictionCheckingResult(" + state + ")");
return 0;
}
+
+ private int handleDeleteTestImsiKey() {
+ if (!(checkShellUid())) {
+ Log.v(LOG_TAG,
+ "handleCarrierRestrictionStatusCommand, MockModem service check fails or "
+ + " checkShellUid fails");
+ return -1;
+ }
+
+ Phone phone = PhoneFactory.getDefaultPhone();
+ if (phone == null) {
+ Log.e(LOG_TAG,
+ "handleCarrierRestrictionStatusCommand" + "No default Phone available");
+ return SubscriptionManager.INVALID_SUBSCRIPTION_ID;
+ }
+ phone.resetCarrierKeysForImsiEncryption(true);
+ return 1;
+ }
}
diff --git a/src/com/android/phone/satellite/accesscontrol/SatelliteAccessController.java b/src/com/android/phone/satellite/accesscontrol/SatelliteAccessController.java
index 251ba65..f17377c 100644
--- a/src/com/android/phone/satellite/accesscontrol/SatelliteAccessController.java
+++ b/src/com/android/phone/satellite/accesscontrol/SatelliteAccessController.java
@@ -184,7 +184,8 @@
private static final String KEY_AVAILABLE_NOTIFICATION_SHOWN = "available_notification_shown";
private static final String KEY_UNAVAILABLE_NOTIFICATION_SHOWN =
"unavailable_notification_shown";
- private static final String NOTIFICATION_TAG = "SatelliteAccessController";
+ private static final String AVAILABLE_NOTIFICATION_TAG = "available_notification_tag";
+ private static final String UNAVAILABLE_NOTIFICATION_TAG = "unavailable_notification_tag";
private static final int NOTIFICATION_ID = 1;
private static final String NOTIFICATION_CHANNEL = "satelliteChannel";
private static final String NOTIFICATION_CHANNEL_ID = "satellite";
@@ -1453,44 +1454,41 @@
}
if (mSatelliteDisallowedReasons.isEmpty()) {
- if (!hasAlreadyNotified(KEY_AVAILABLE_NOTIFICATION_SHOWN, 0)) {
+ mNotificationManager.cancel(UNAVAILABLE_NOTIFICATION_TAG, NOTIFICATION_ID);
+ if (!hasAlreadyNotified(KEY_AVAILABLE_NOTIFICATION_SHOWN)) {
mNotificationManager.notifyAsUser(
- NOTIFICATION_TAG,
+ AVAILABLE_NOTIFICATION_TAG,
NOTIFICATION_ID,
mSatelliteAvailableNotification,
UserHandle.ALL
);
- markAsNotified(KEY_AVAILABLE_NOTIFICATION_SHOWN, 0);
+ markAsNotified(KEY_AVAILABLE_NOTIFICATION_SHOWN, true);
+ markAsNotified(KEY_UNAVAILABLE_NOTIFICATION_SHOWN, false);
}
} else {
+ mNotificationManager.cancel(AVAILABLE_NOTIFICATION_TAG, NOTIFICATION_ID);
for (Integer reason : mSatelliteDisallowedReasons) {
- if (!hasAlreadyNotified(KEY_UNAVAILABLE_NOTIFICATION_SHOWN, reason)) {
+ if (!hasAlreadyNotified(KEY_UNAVAILABLE_NOTIFICATION_SHOWN)) {
mNotificationManager.notifyAsUser(
- NOTIFICATION_TAG,
+ UNAVAILABLE_NOTIFICATION_TAG,
NOTIFICATION_ID,
mSatelliteUnAvailableNotifications.get(reason),
UserHandle.ALL
);
- markAsNotified(KEY_UNAVAILABLE_NOTIFICATION_SHOWN, reason);
+ markAsNotified(KEY_UNAVAILABLE_NOTIFICATION_SHOWN, true);
+ markAsNotified(KEY_AVAILABLE_NOTIFICATION_SHOWN, false);
break;
}
}
}
}
- private boolean hasAlreadyNotified(String key, int reason) {
- Set<String> reasons = mSharedPreferences.getStringSet(key, new HashSet<>());
- return reasons.contains(String.valueOf(reason));
+ private boolean hasAlreadyNotified(String key) {
+ return mSharedPreferences.getBoolean(key, false);
}
- private void markAsNotified(String key, int reason) {
- Set<String> reasons = mSharedPreferences.getStringSet(key, new HashSet<>());
- if (!reasons.contains(String.valueOf(reason))) {
- reasons.add(String.valueOf(reason));
- SharedPreferences.Editor editor = mSharedPreferences.edit();
- editor.putStringSet(key, reasons);
- editor.apply();
- }
+ private void markAsNotified(String key, boolean notified) {
+ mSharedPreferences.edit().putBoolean(key, notified).apply();
}
/**