Skip to content
Snippets Groups Projects
Commit 868859d4 authored by Jean Chalard's avatar Jean Chalard Committed by Gerrit Code Review
Browse files

Merge changes I52fcfd3f,I6de4abdc,I1e8944de,I9525bfe0,Ife09fef8, ... into main

* changes:
  Use carrier service changed callbacks when flag is on
  Delete slots as the listeners are unregistered.
  Have a full class (not inline) for privilege listener
  Update the carrier service UID when onCarrierServiceChanged
  Pass the modem count to registerCarrierPrivilegeListeners
  Reorder add/remove/register/unregister carrier listeners
parents 06c8691f 361dad32
No related branches found
No related tags found
No related merge requests found
......@@ -21,6 +21,7 @@ import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
import static com.android.server.connectivity.ConnectivityFlags.CARRIER_SERVICE_CHANGED_USE_CALLBACK;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
......@@ -72,9 +73,7 @@ public class CarrierPrivilegeAuthenticator {
private final Object mLock = new Object();
private final Handler mHandler;
@NonNull
@GuardedBy("mLock")
private final List<CarrierPrivilegesListenerShim> mCarrierPrivilegesChangedListeners =
new ArrayList<>();
private final List<PrivilegeListener> mCarrierPrivilegesChangedListeners = new ArrayList<>();
private final boolean mUseCallbacksForServiceChanged;
public CarrierPrivilegeAuthenticator(@NonNull final Context c,
......@@ -119,32 +118,49 @@ public class CarrierPrivilegeAuthenticator {
synchronized (mLock) {
unregisterCarrierPrivilegesListeners();
mModemCount = mTelephonyManager.getActiveModemCount();
registerCarrierPrivilegesListeners();
registerCarrierPrivilegesListeners(mModemCount);
if (!mUseCallbacksForServiceChanged) updateCarrierServiceUid();
}
}
private class PrivilegeListener implements CarrierPrivilegesListenerShim {
public final int mLogicalSlot;
PrivilegeListener(final int logicalSlot) {
mLogicalSlot = logicalSlot;
}
@Override public void onCarrierPrivilegesChanged(
@NonNull List<String> privilegedPackageNames,
@NonNull int[] privilegedUids) {
if (mUseCallbacksForServiceChanged) return;
// Re-trigger the synchronous check (which is also very cheap due
// to caching in CarrierPrivilegesTracker). This allows consistency
// with the onSubscriptionsChangedListener and broadcasts.
updateCarrierServiceUid();
}
@Override
public void onCarrierServiceChanged(@Nullable final String carrierServicePackageName,
final int carrierServiceUid) {
if (!mUseCallbacksForServiceChanged) {
// Re-trigger the synchronous check (which is also very cheap due
// to caching in CarrierPrivilegesTracker). This allows consistency
// with the onSubscriptionsChangedListener and broadcasts.
updateCarrierServiceUid();
return;
}
synchronized (mLock) {
mCarrierServiceUid.put(mLogicalSlot, carrierServiceUid);
}
}
}
private void registerCarrierPrivilegesListeners() {
private void registerCarrierPrivilegesListeners(final int modemCount) {
final HandlerExecutor executor = new HandlerExecutor(mHandler);
int modemCount;
synchronized (mLock) {
modemCount = mModemCount;
}
try {
for (int i = 0; i < modemCount; i++) {
CarrierPrivilegesListenerShim carrierPrivilegesListener =
new CarrierPrivilegesListenerShim() {
@Override
public void onCarrierPrivilegesChanged(
@NonNull List<String> privilegedPackageNames,
@NonNull int[] privilegedUids) {
// Re-trigger the synchronous check (which is also very cheap due
// to caching in CarrierPrivilegesTracker). This allows consistency
// with the onSubscriptionsChangedListener and broadcasts.
updateCarrierServiceUid();
}
};
addCarrierPrivilegesListener(i, executor, carrierPrivilegesListener);
PrivilegeListener carrierPrivilegesListener = new PrivilegeListener(i);
addCarrierPrivilegesListener(executor, carrierPrivilegesListener);
mCarrierPrivilegesChangedListeners.add(carrierPrivilegesListener);
}
} catch (IllegalArgumentException e) {
......@@ -152,24 +168,13 @@ public class CarrierPrivilegeAuthenticator {
}
}
private void addCarrierPrivilegesListener(int logicalSlotIndex, Executor executor,
CarrierPrivilegesListenerShim listener) {
try {
mTelephonyManagerShim.addCarrierPrivilegesListener(
logicalSlotIndex, executor, listener);
} catch (UnsupportedApiLevelException unsupportedApiLevelException) {
// Should not happen since CarrierPrivilegeAuthenticator is only used on T+
Log.e(TAG, "addCarrierPrivilegesListener API is not available");
}
}
private void removeCarrierPrivilegesListener(CarrierPrivilegesListenerShim listener) {
try {
mTelephonyManagerShim.removeCarrierPrivilegesListener(listener);
} catch (UnsupportedApiLevelException unsupportedApiLevelException) {
// Should not happen since CarrierPrivilegeAuthenticator is only used on T+
Log.e(TAG, "removeCarrierPrivilegesListener API is not available");
@GuardedBy("mLock")
private void unregisterCarrierPrivilegesListeners() {
for (PrivilegeListener carrierPrivilegesListener : mCarrierPrivilegesChangedListeners) {
removeCarrierPrivilegesListener(carrierPrivilegesListener);
mCarrierServiceUid.delete(carrierPrivilegesListener.mLogicalSlot);
}
mCarrierPrivilegesChangedListeners.clear();
}
private String getCarrierServicePackageNameForLogicalSlot(int logicalSlotIndex) {
......@@ -183,14 +188,6 @@ public class CarrierPrivilegeAuthenticator {
return null;
}
private void unregisterCarrierPrivilegesListeners() {
for (CarrierPrivilegesListenerShim carrierPrivilegesListener :
mCarrierPrivilegesChangedListeners) {
removeCarrierPrivilegesListener(carrierPrivilegesListener);
}
mCarrierPrivilegesChangedListeners.clear();
}
/**
* Check if a UID is the carrier service app of the subscription ID in the provided capabilities
*
......@@ -273,4 +270,26 @@ public class CarrierPrivilegeAuthenticator {
int getCarrierServicePackageUidForSlot(int slotId) {
return getUidForPackage(getCarrierServicePackageNameForLogicalSlot(slotId));
}
// Helper methods to avoid having to deal with UnsupportedApiLevelException.
private void addCarrierPrivilegesListener(@NonNull final Executor executor,
@NonNull final PrivilegeListener listener) {
try {
mTelephonyManagerShim.addCarrierPrivilegesListener(listener.mLogicalSlot, executor,
listener);
} catch (UnsupportedApiLevelException unsupportedApiLevelException) {
// Should not happen since CarrierPrivilegeAuthenticator is only used on T+
Log.e(TAG, "addCarrierPrivilegesListener API is not available");
}
}
private void removeCarrierPrivilegesListener(PrivilegeListener listener) {
try {
mTelephonyManagerShim.removeCarrierPrivilegesListener(listener);
} catch (UnsupportedApiLevelException unsupportedApiLevelException) {
// Should not happen since CarrierPrivilegeAuthenticator is only used on T+
Log.e(TAG, "removeCarrierPrivilegesListener API is not available");
}
}
}
......@@ -158,6 +158,8 @@ public class CarrierPrivilegeAuthenticatorTest {
assertNotNull(initialListeners.get(1));
assertEquals(2, initialListeners.size());
initialListeners.get(0).onCarrierServiceChanged(null, mCarrierConfigPkgUid);
final NetworkCapabilities.Builder ncBuilder = new NetworkCapabilities.Builder()
.addTransportType(TRANSPORT_CELLULAR)
.setNetworkSpecifier(new TelephonyNetworkSpecifier(0));
......@@ -194,6 +196,8 @@ public class CarrierPrivilegeAuthenticatorTest {
assertNotNull(newListeners.get(0));
assertEquals(1, newListeners.size());
newListeners.get(0).onCarrierServiceChanged(null, mCarrierConfigPkgUid);
final TelephonyNetworkSpecifier specifier = new TelephonyNetworkSpecifier(0);
final NetworkCapabilities nc = new NetworkCapabilities.Builder()
.addTransportType(TRANSPORT_CELLULAR)
......@@ -219,6 +223,7 @@ public class CarrierPrivilegeAuthenticatorTest {
applicationInfo.uid = mCarrierConfigPkgUid + 1;
doReturn(applicationInfo).when(mPackageManager).getApplicationInfo(eq(mTestPkg), anyInt());
listener.onCarrierPrivilegesChanged(Collections.emptyList(), new int[] {});
listener.onCarrierServiceChanged(null, applicationInfo.uid);
assertFalse(mCarrierPrivilegeAuthenticator.hasCarrierPrivilegeForNetworkCapabilities(
mCarrierConfigPkgUid, nc));
......@@ -228,6 +233,9 @@ public class CarrierPrivilegeAuthenticatorTest {
@Test
public void testDefaultSubscription() throws Exception {
final CarrierPrivilegesListenerShim listener = getCarrierPrivilegesListeners().get(0);
listener.onCarrierServiceChanged(null, mCarrierConfigPkgUid);
final NetworkCapabilities.Builder ncBuilder = new NetworkCapabilities.Builder();
ncBuilder.addTransportType(TRANSPORT_CELLULAR);
assertFalse(mCarrierPrivilegeAuthenticator.hasCarrierPrivilegeForNetworkCapabilities(
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment