From 4b2cdfece12a8ca67df50680868a03a470fa8859 Mon Sep 17 00:00:00 2001 From: Rambo Wang Date: Wed, 16 Mar 2022 20:36:41 -0700 Subject: [PATCH] Introduce CarrierPrivilegesCallback to replace CarrierPrivilegesListener Add new interface in CarrierPrivilegesCallback to notify the registrants that carrier service for current user has changed. Reshape the parameters of onCarrierPrivilegesChanged callback with both Set instead of List/Array. CarrierPrivilegesListener is deprecated. Once all clients have migrated to CarrierPrivilegesCallback, it will be throughly cleaned up. This CL only cherry-picks the CarrierPrivilegesCallback interface and provides stub implementation to remove the dependency of NetworkStack modul which is aosp-first. The implementation will be cherry-pick later. Bug: 216549778 Test: make Merged-In: I195a99ec6508c7fe3398908bfca632d8446ab29c Change-Id: I195a99ec6508c7fe3398908bfca632d8446ab29c (cherry picked from commit b66e3e3aa87395069833307716334ff577b778a7) --- core/api/system-current.txt | 15 +++- .../android/telephony/TelephonyManager.java | 89 +++++++++++++++++++ 2 files changed, 100 insertions(+), 4 deletions(-) diff --git a/core/api/system-current.txt b/core/api/system-current.txt index 6145886a47e4..b247ef3115e3 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -11594,7 +11594,7 @@ package android.telephony { } public class TelephonyManager { - method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void addCarrierPrivilegesListener(int, @NonNull java.util.concurrent.Executor, @NonNull android.telephony.TelephonyManager.CarrierPrivilegesListener); + method @Deprecated @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void addCarrierPrivilegesListener(int, @NonNull java.util.concurrent.Executor, @NonNull android.telephony.TelephonyManager.CarrierPrivilegesListener); method @RequiresPermission(anyOf={android.Manifest.permission.MODIFY_PHONE_STATE, android.Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION}) @WorkerThread public void bootstrapAuthenticationRequest(int, @NonNull android.net.Uri, @NonNull android.telephony.gba.UaSecurityProtocolIdentifier, boolean, @NonNull java.util.concurrent.Executor, @NonNull android.telephony.TelephonyManager.BootstrapAuthenticationCallback); method @Deprecated @RequiresPermission(android.Manifest.permission.CALL_PHONE) public void call(String, String); method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public android.telephony.PinResult changeIccLockPin(@NonNull String, @NonNull String); @@ -11687,7 +11687,8 @@ package android.telephony { method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void notifyOtaEmergencyNumberDbInstalled(); method @RequiresPermission(android.Manifest.permission.REBOOT) public int prepareForUnattendedReboot(); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean rebootRadio(); - method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void removeCarrierPrivilegesListener(@NonNull android.telephony.TelephonyManager.CarrierPrivilegesListener); + method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void registerCarrierPrivilegesCallback(int, @NonNull java.util.concurrent.Executor, @NonNull android.telephony.TelephonyManager.CarrierPrivilegesCallback); + method @Deprecated @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void removeCarrierPrivilegesListener(@NonNull android.telephony.TelephonyManager.CarrierPrivilegesListener); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void reportDefaultNetworkStatus(boolean); method @RequiresPermission(allOf={android.Manifest.permission.ACCESS_FINE_LOCATION, android.Manifest.permission.MODIFY_PHONE_STATE}) public void requestCellInfoUpdate(@NonNull android.os.WorkSource, @NonNull java.util.concurrent.Executor, @NonNull android.telephony.TelephonyManager.CellInfoCallback); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void requestModemActivityInfo(@NonNull java.util.concurrent.Executor, @NonNull android.os.OutcomeReceiver); @@ -11737,6 +11738,7 @@ package android.telephony { method @Deprecated @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public int[] supplyPukReportResult(String, String); method @Deprecated @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean switchSlots(int[]); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void toggleRadioOnOff(); + method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void unregisterCarrierPrivilegesCallback(@NonNull android.telephony.TelephonyManager.CarrierPrivilegesCallback); method @RequiresPermission(android.Manifest.permission.READ_ACTIVE_EMERGENCY_SESSION) public void updateOtaEmergencyNumberDbFilePath(@NonNull android.os.ParcelFileDescriptor); method public void updateServiceLocation(); field @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public static final String ACTION_ANOMALY_REPORTED = "android.telephony.action.ANOMALY_REPORTED"; @@ -11841,8 +11843,13 @@ package android.telephony { field public static final int RESULT_SUCCESS = 0; // 0x0 } - public static interface TelephonyManager.CarrierPrivilegesListener { - method public void onCarrierPrivilegesChanged(@NonNull java.util.List, @NonNull int[]); + public static interface TelephonyManager.CarrierPrivilegesCallback { + method public void onCarrierPrivilegesChanged(@NonNull java.util.Set, @NonNull java.util.Set); + method public default void onCarrierServiceChanged(@Nullable String, int); + } + + @Deprecated public static interface TelephonyManager.CarrierPrivilegesListener { + method @Deprecated public void onCarrierPrivilegesChanged(@NonNull java.util.List, @NonNull int[]); } public static class TelephonyManager.ModemActivityInfoException extends java.lang.Exception { diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index 63ff2324d385..a04bba037809 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -140,6 +140,7 @@ import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Objects; +import java.util.Set; import java.util.UUID; import java.util.concurrent.Executor; import java.util.concurrent.RejectedExecutionException; @@ -16138,6 +16139,8 @@ public class TelephonyManager { * Callback to listen for when the set of packages with carrier privileges for a SIM changes. * * @hide + * @deprecated Use {@link CarrierPrivilegesCallback} instead. This API will be removed soon + * prior to API finalization. */ @SystemApi public interface CarrierPrivilegesListener { @@ -16157,6 +16160,54 @@ public class TelephonyManager { @NonNull List privilegedPackageNames, @NonNull int[] privilegedUids); } + /** + * Callbacks to listen for when the set of packages with carrier privileges for a SIM changes. + * + *

Of note, when multiple callbacks are registered, they may be triggered one after another. + * The ordering of them is not guaranteed and thus should not be depend on. + * + * @hide + */ + @SystemApi + public interface CarrierPrivilegesCallback { + /** + * Called when the set of packages with carrier privileges has changed. + * + *

Of note, this callback will not be fired if a carrier triggers a SIM profile + * switch and the same set of packages remains privileged after the switch. + * + *

At registration, the callback will receive the current set of privileged packages. + * + * @param privilegedPackageNames The updated set of package names that have carrier + * privileges + * @param privilegedUids The updated set of UIDs that have carrier privileges + */ + void onCarrierPrivilegesChanged( + @NonNull Set privilegedPackageNames, @NonNull Set privilegedUids); + + /** + * Called when the {@link CarrierService} for the current user profile has changed. + * + *

This method does nothing by default. Clients that are interested in the carrier + * service change should override this method to get package name and UID info. + * + *

At registration, the callback will receive the current carrier service info. + * + *

Of note, this callback will not be fired if a carrier triggers a SIM profile + * switch and the same carrier service remains after switch. + * + * @param carrierServicePackageName package name of the {@link CarrierService}. May be + * {@code null} when no carrier service is detected. + * @param carrierServiceUid UID of the {@link CarrierService}. May be + * {@link android.os.Process#INVALID_UID} if no carrier + * service is detected. + */ + default void onCarrierServiceChanged( + @Nullable String carrierServicePackageName, int carrierServiceUid) { + // do nothing by default + } + } + /** * Registers a {@link CarrierPrivilegesListener} on the given {@code logicalSlotIndex} to * receive callbacks when the set of packages with carrier privileges changes. The callback will @@ -16166,7 +16217,10 @@ public class TelephonyManager { * @param executor The executor where {@code listener} will be invoked * @param listener The callback to register * @hide + * @deprecated Use {@link #registerCarrierPrivilegesCallback} instead. This API will be + * removed prior to API finalization. */ + @Deprecated @SystemApi @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void addCarrierPrivilegesListener( @@ -16190,7 +16244,10 @@ public class TelephonyManager { * Unregisters an existing {@link CarrierPrivilegesListener}. * * @hide + * @deprecated Use {@link #unregisterCarrierPrivilegesCallback} instead. This API will be + * removed prior to API finalization. */ + @Deprecated @SystemApi @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void removeCarrierPrivilegesListener(@NonNull CarrierPrivilegesListener listener) { @@ -16205,4 +16262,36 @@ public class TelephonyManager { } mTelephonyRegistryMgr.removeCarrierPrivilegesListener(listener); } + + /** + * Registers a {@link CarrierPrivilegesCallback} on the given {@code logicalSlotIndex} to + * receive callbacks when the set of packages with carrier privileges changes. The callback will + * immediately be called with the latest state. + * + * @param logicalSlotIndex The SIM slot to listen on + * @param executor The executor where {@code callback} will be invoked + * @param callback The callback to register + * @hide + */ + @SystemApi + @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE) + public void registerCarrierPrivilegesCallback( + int logicalSlotIndex, + @NonNull @CallbackExecutor Executor executor, + @NonNull CarrierPrivilegesCallback callback) { + // TODO(b/216549778): cherry-pick implementation once merge conflict is resolved + throw new UnsupportedOperationException("Not implemented, yet"); + } + + /** + * Unregisters an existing {@link CarrierPrivilegesCallback}. + * + * @hide + */ + @SystemApi + @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE) + public void unregisterCarrierPrivilegesCallback(@NonNull CarrierPrivilegesCallback callback) { + // TODO(b/216549778): cherry-pick implementation once merge conflict is resolved + throw new UnsupportedOperationException("Not implemented, yet"); + } }