diff options
| author | Hunter Knepshield <hknepshield@google.com> | 2021-12-16 19:48:39 +0000 |
|---|---|---|
| committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2021-12-16 19:48:39 +0000 |
| commit | 93a25e9cd155c4c82cc14efcde0bda298cd67bf0 (patch) | |
| tree | 8d9bf704dfceb67af28bc0bab770675834af6b0f /core/java | |
| parent | 0e229b7f33c451a7d8de248ff3bc6ab9af9e98c4 (diff) | |
| parent | c7a0de9f6fae693e00c5e80b6bf5799804241071 (diff) | |
Merge "Create CarrierPrivilegesListener callback." am: d54e1126ab am: e66c82b449 am: c7a0de9f6f
Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1912993
Change-Id: Id89455067252fd32f2c8890af120c4241185fcf7
Diffstat (limited to 'core/java')
3 files changed, 148 insertions, 0 deletions
diff --git a/core/java/android/telephony/TelephonyRegistryManager.java b/core/java/android/telephony/TelephonyRegistryManager.java index e7f89204c1ec..9eaaa91532d0 100644 --- a/core/java/android/telephony/TelephonyRegistryManager.java +++ b/core/java/android/telephony/TelephonyRegistryManager.java @@ -36,18 +36,24 @@ import android.telephony.Annotation.PreciseDisconnectCauses; import android.telephony.Annotation.RadioPowerState; import android.telephony.Annotation.SimActivationState; import android.telephony.Annotation.SrvccState; +import android.telephony.TelephonyManager.CarrierPrivilegesListener; import android.telephony.emergency.EmergencyNumber; import android.telephony.ims.ImsReasonInfo; import android.util.ArraySet; import android.util.Log; +import com.android.internal.annotations.GuardedBy; +import com.android.internal.listeners.ListenerExecutor; +import com.android.internal.telephony.ICarrierPrivilegesListener; import com.android.internal.telephony.IOnSubscriptionsChangedListener; import com.android.internal.telephony.ITelephonyRegistry; +import java.lang.ref.WeakReference; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.WeakHashMap; import java.util.concurrent.Executor; /** @@ -1214,4 +1220,117 @@ public class TelephonyRegistryManager { listenFromCallback(false, false, subId, pkgName, attributionTag, callback, new int[0], notifyNow); } + + private static class CarrierPrivilegesListenerWrapper extends ICarrierPrivilegesListener.Stub + implements ListenerExecutor { + private final WeakReference<CarrierPrivilegesListener> mListener; + private final Executor mExecutor; + + CarrierPrivilegesListenerWrapper(CarrierPrivilegesListener listener, Executor executor) { + mListener = new WeakReference<>(listener); + mExecutor = executor; + } + + @Override + public void onCarrierPrivilegesChanged( + List<String> privilegedPackageNames, int[] privilegedUids) { + Binder.withCleanCallingIdentity( + () -> + executeSafely( + mExecutor, + mListener::get, + cpl -> + cpl.onCarrierPrivilegesChanged( + privilegedPackageNames, privilegedUids))); + } + } + + @GuardedBy("sCarrierPrivilegeListeners") + private static final WeakHashMap< + CarrierPrivilegesListener, WeakReference<CarrierPrivilegesListenerWrapper>> + sCarrierPrivilegeListeners = new WeakHashMap<>(); + + /** + * Registers a {@link CarrierPrivilegesListener} 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 listener} will be invoked + * @param listener The callback to register + */ + public void addCarrierPrivilegesListener( + int logicalSlotIndex, + @NonNull @CallbackExecutor Executor executor, + @NonNull CarrierPrivilegesListener listener) { + if (listener == null || executor == null) { + throw new IllegalArgumentException("listener and executor must be non-null"); + } + synchronized (sCarrierPrivilegeListeners) { + WeakReference<CarrierPrivilegesListenerWrapper> existing = + sCarrierPrivilegeListeners.get(listener); + if (existing != null && existing.get() != null) { + Log.d(TAG, "addCarrierPrivilegesListener: listener already registered"); + return; + } + CarrierPrivilegesListenerWrapper wrapper = + new CarrierPrivilegesListenerWrapper(listener, executor); + sCarrierPrivilegeListeners.put(listener, new WeakReference<>(wrapper)); + try { + sRegistry.addCarrierPrivilegesListener( + logicalSlotIndex, + wrapper, + mContext.getOpPackageName(), + mContext.getAttributionTag()); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + } + + /** + * Unregisters a {@link CarrierPrivilegesListener}. + * + * @param listener The callback to unregister + */ + public void removeCarrierPrivilegesListener(@NonNull CarrierPrivilegesListener listener) { + if (listener == null) { + throw new IllegalArgumentException("listener must be non-null"); + } + synchronized (sCarrierPrivilegeListeners) { + WeakReference<CarrierPrivilegesListenerWrapper> ref = + sCarrierPrivilegeListeners.remove(listener); + if (ref == null) return; + CarrierPrivilegesListenerWrapper wrapper = ref.get(); + if (wrapper == null) return; + try { + sRegistry.removeCarrierPrivilegesListener(wrapper, mContext.getOpPackageName()); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + } + + /** + * Notify listeners that the set of packages with carrier privileges has changed. + * + * @param logicalSlotIndex The SIM slot the change occurred on + * @param privilegedPackageNames The updated set of packages names with carrier privileges + * @param privilegedUids The updated set of UIDs with carrier privileges + */ + public void notifyCarrierPrivilegesChanged( + int logicalSlotIndex, + @NonNull List<String> privilegedPackageNames, + @NonNull int[] privilegedUids) { + if (privilegedPackageNames == null || privilegedUids == null) { + throw new IllegalArgumentException( + "privilegedPackageNames and privilegedUids must be non-null"); + } + try { + sRegistry.notifyCarrierPrivilegesChanged( + logicalSlotIndex, privilegedPackageNames, privilegedUids); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } } diff --git a/core/java/com/android/internal/telephony/ICarrierPrivilegesListener.aidl b/core/java/com/android/internal/telephony/ICarrierPrivilegesListener.aidl new file mode 100644 index 000000000000..6ca8cecba3c8 --- /dev/null +++ b/core/java/com/android/internal/telephony/ICarrierPrivilegesListener.aidl @@ -0,0 +1,22 @@ +/* + * Copyright (C) 2021 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.internal.telephony; + +oneway interface ICarrierPrivilegesListener { + void onCarrierPrivilegesChanged( + in List<String> privilegedPackageNames, in int[] privilegedUids); +} diff --git a/core/java/com/android/internal/telephony/ITelephonyRegistry.aidl b/core/java/com/android/internal/telephony/ITelephonyRegistry.aidl index 15d4246e302a..9712d7e38a4b 100644 --- a/core/java/com/android/internal/telephony/ITelephonyRegistry.aidl +++ b/core/java/com/android/internal/telephony/ITelephonyRegistry.aidl @@ -32,6 +32,7 @@ import android.telephony.PreciseDataConnectionState; import android.telephony.ServiceState; import android.telephony.SignalStrength; import android.telephony.emergency.EmergencyNumber; +import com.android.internal.telephony.ICarrierPrivilegesListener; import com.android.internal.telephony.IPhoneStateListener; import com.android.internal.telephony.IOnSubscriptionsChangedListener; @@ -100,4 +101,10 @@ interface ITelephonyRegistry { void notifyAllowedNetworkTypesChanged(in int phoneId, in int subId, in int reason, in long allowedNetworkType); void notifyLinkCapacityEstimateChanged(in int phoneId, in int subId, in List<LinkCapacityEstimate> linkCapacityEstimateList); + + void addCarrierPrivilegesListener( + int phoneId, ICarrierPrivilegesListener callback, String pkg, String featureId); + void removeCarrierPrivilegesListener(ICarrierPrivilegesListener callback, String pkg); + void notifyCarrierPrivilegesChanged( + int phoneId, in List<String> privilegedPackageNames, in int[] privilegedUids); } |
