Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit eb91e7e4 authored by Treehugger Robot's avatar Treehugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Inform TelephonyRegistry when carrier privileged apps change." am: de967cfa

Original change: https://android-review.googlesource.com/c/platform/frameworks/opt/telephony/+/1931317

Change-Id: I9603608d4a9e87798013a652daf39ef3c00c666e
parents 51ed8254 de967cfa
Loading
Loading
Loading
Loading
+24 −4
Original line number Diff line number Diff line
@@ -50,6 +50,7 @@ import android.os.UserManager;
import android.telephony.CarrierConfigManager;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.telephony.TelephonyRegistryManager;
import android.telephony.UiccAccessRule;
import android.text.TextUtils;
import android.util.ArrayMap;
@@ -135,10 +136,11 @@ public class CarrierPrivilegesTracker extends Handler {

    private final Context mContext;
    private final Phone mPhone;
    private final CarrierConfigManager mCarrierConfigManager;
    private final PackageManager mPackageManager;
    private final UserManager mUserManager;
    private final CarrierConfigManager mCarrierConfigManager;
    private final TelephonyManager mTelephonyManager;
    private final TelephonyRegistryManager mTelephonyRegistryManager;

    private final LocalLog mLocalLog = new LocalLog(64);
    private final RegistrantList mRegistrantList = new RegistrantList();
@@ -262,12 +264,15 @@ public class CarrierPrivilegesTracker extends Handler {
            @NonNull Looper looper, @NonNull Phone phone, @NonNull Context context) {
        super(looper);
        mContext = context;
        mCarrierConfigManager =
                (CarrierConfigManager) mContext.getSystemService(Context.CARRIER_CONFIG_SERVICE);
        mPhone = phone;
        mPackageManager = mContext.getPackageManager();
        mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
        mCarrierConfigManager =
                (CarrierConfigManager) mContext.getSystemService(Context.CARRIER_CONFIG_SERVICE);
        mTelephonyManager = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
        mPhone = phone;
        mTelephonyRegistryManager =
                (TelephonyRegistryManager)
                        mContext.getSystemService(Context.TELEPHONY_REGISTRY_SERVICE);

        IntentFilter certFilter = new IntentFilter();
        certFilter.addAction(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED);
@@ -546,6 +551,12 @@ public class CarrierPrivilegesTracker extends Handler {
            mRegistrantList.notifyResult(
                    Arrays.copyOf(
                            mPrivilegedPackageInfo.mUids, mPrivilegedPackageInfo.mUids.length));
            mTelephonyRegistryManager.notifyCarrierPrivilegesChanged(
                    mPhone.getPhoneId(),
                    Collections.unmodifiableList(
                            new ArrayList<>(mPrivilegedPackageInfo.mPackageNames)),
                    Arrays.copyOf(
                            mPrivilegedPackageInfo.mUids, mPrivilegedPackageInfo.mUids.length));
        } finally {
            mPrivilegedPackageInfoLock.readLock().unlock();
        }
@@ -640,14 +651,23 @@ public class CarrierPrivilegesTracker extends Handler {
     *
     * <p>After being registered, the Registrant will be notified with the current Carrier
     * Privileged UIDs for this Phone.
     *
     * @deprecated Use {@link TelephonyManager#addCarrierPrivilegesListener} instead, which also
     *     provides package names
     *     <p>TODO(b/211658797) migrate callers, then delete all Registrant logic from CPT
     */
    @Deprecated
    public void registerCarrierPrivilegesListener(Handler h, int what, Object obj) {
        sendMessage(obtainMessage(ACTION_REGISTER_LISTENER, new Registrant(h, what, obj)));
    }

    /**
     * Unregisters the given listener with this tracker.
     *
     * @deprecated Use {@link TelephonyManager#removeCarrierPrivilegesListener} instead
     *     <p>TODO(b/211658797) migrate callers, then delete all Registrant logic from CPT
     */
    @Deprecated
    public void unregisterCarrierPrivilegesListener(Handler handler) {
        sendMessage(obtainMessage(ACTION_UNREGISTER_LISTENER, handler));
    }
+114 −34
Original line number Diff line number Diff line
@@ -30,7 +30,14 @@ import static android.telephony.TelephonyManager.SIM_STATE_NOT_READY;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.argThat;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import android.annotation.Nullable;
@@ -50,6 +57,7 @@ import android.telephony.UiccAccessRule;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.util.ArraySet;
import android.util.Pair;

import com.android.internal.telephony.uicc.IccUtils;

@@ -57,6 +65,7 @@ import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InOrder;
import org.mockito.Mock;

import java.security.MessageDigest;
@@ -81,6 +90,7 @@ public class CarrierPrivilegesTrackerTest extends TelephonyTest {

    private static final String PACKAGE_1 = "android.test.package1";
    private static final String PACKAGE_2 = "android.test.package2";
    private static final Set<String> PRIVILEGED_PACKAGES = Set.of(PACKAGE_1, PACKAGE_2);

    private static final String CERT_1 = "11223344";
    private static final String CERT_2 = "AABBCCDD";
@@ -238,13 +248,33 @@ public class CarrierPrivilegesTrackerTest extends TelephonyTest {
        }
    }

    private void verifyPrivilegedUids(@Nullable int[] expectedUids, int expectedUidUpdates) {
    private void verifyRegistrantUpdates(@Nullable int[] expectedUids, int expectedUidUpdates) {
        assertArrayEquals(expectedUids, mHandler.privilegedUids);
        assertEquals(expectedUidUpdates, mHandler.numUidUpdates);
    }

    private void verifyRegisterListener(int[] expectedUids, int expectedUidUpdates)
            throws Exception {
    private void verifyCarrierPrivilegesChangedUpdates(
            List<Pair<Set<String>, int[]>> expectedUpdates) {
        if (expectedUpdates.isEmpty()) {
            verify(mTelephonyRegistryManager, never())
                    .notifyCarrierPrivilegesChanged(anyInt(), any(), any());
        } else {
            InOrder inOrder = inOrder(mTelephonyRegistryManager);
            for (Pair<Set<String>, int[]> expectedUpdate : expectedUpdates) {
                // By looking at TelephonyRegistryManager, we can see the full flow as it evolves.
                inOrder.verify(mTelephonyRegistryManager)
                        .notifyCarrierPrivilegesChanged(
                                eq(PHONE_ID),
                                // Callback gets a list, but we don't care about order so use Set
                                argThat(list -> Set.copyOf(list).equals(expectedUpdate.first)),
                                eq(expectedUpdate.second));
            }
        }
    }

    @Test
    public void testRegisterListener() throws Exception {
        mCarrierPrivilegesTracker = createCarrierPrivilegesTracker();
        // mHandler registered in createCarrierPrivilegesTracker(), so reset it
        mHandler = new CarrierPrivilegesTrackerTestHandler();

@@ -252,34 +282,40 @@ public class CarrierPrivilegesTrackerTest extends TelephonyTest {
                mHandler, REGISTRANT_WHAT, null);
        mTestableLooper.processAllMessages();

        verifyPrivilegedUids(expectedUids, expectedUidUpdates);
    }

    @Test
    public void testRegisterListener() throws Exception {
        mCarrierPrivilegesTracker = createCarrierPrivilegesTracker();

        verifyRegisterListener(new int[0] /* expectedUids */, 1 /* expectedUidUpdates */);
        verifyRegistrantUpdates(new int[0] /* expectedUids */, 1 /* expectedUidUpdates */);
        // No updates triggered, so TelephonyRegistry doesn't get any updates.
        verifyCarrierPrivilegesChangedUpdates(List.of());
    }

    @Test
    public void testUnregisterListener() throws Exception {
        // Start with privileges. Verify no updates received after clearing UIDs.
        setupCarrierPrivilegesTrackerWithCarrierConfigUids();
        // mHandler registered in createCarrierPrivilegesTracker(), so reset it
        mHandler = new CarrierPrivilegesTrackerTestHandler();

        mCarrierPrivilegesTracker.registerCarrierPrivilegesListener(
                mHandler, REGISTRANT_WHAT, null);
        mTestableLooper.processAllMessages();

        verifyRegisterListener(PRIVILEGED_UIDS, 1 /* expectedUidUpdates */);
        verifyRegistrantUpdates(PRIVILEGED_UIDS /* expectedUids */, 1 /* expectedUidUpdates */);
        verifyCarrierPrivilegesChangedUpdates(
                List.of(new Pair<>(PRIVILEGED_PACKAGES, PRIVILEGED_UIDS)));
        mHandler.reset();
        reset(mTelephonyRegistryManager);

        mCarrierPrivilegesTracker.unregisterCarrierPrivilegesListener(mHandler);
        mTestableLooper.processAllMessages();

        verifyPrivilegedUids(null /* expectedUids */, 0 /* expectedUidUpdates */);
        verifyRegistrantUpdates(null /* expectedUids */, 0 /* expectedUidUpdates */);
        verifyCarrierPrivilegesChangedUpdates(List.of());

        // Clear UIDs
        sendCarrierConfigChangedIntent(INVALID_SUBSCRIPTION_ID, PHONE_ID);
        mTestableLooper.processAllMessages();

        verifyPrivilegedUids(null /* expectedUids */, 0 /* expectedUidUpdates */);
        verifyRegistrantUpdates(null /* expectedUids */, 0 /* expectedUidUpdates */);
        verifyCarrierPrivilegesChangedUpdates(List.of(new Pair<>(Set.of(), new int[0])));
    }

    @Test
@@ -295,7 +331,9 @@ public class CarrierPrivilegesTrackerTest extends TelephonyTest {
        sendCarrierConfigChangedIntent(SUB_ID, PHONE_ID);
        mTestableLooper.processAllMessages();

        verifyPrivilegedUids(PRIVILEGED_UIDS, 1 /* expectedUidUpdates */);
        verifyRegistrantUpdates(PRIVILEGED_UIDS, 1 /* expectedUidUpdates */);
        verifyCarrierPrivilegesChangedUpdates(
                List.of(new Pair<>(PRIVILEGED_PACKAGES, PRIVILEGED_UIDS)));
    }

    @Test
@@ -306,7 +344,9 @@ public class CarrierPrivilegesTrackerTest extends TelephonyTest {
        sendCarrierConfigChangedIntent(SUB_ID, PHONE_ID_INCORRECT);
        mTestableLooper.processAllMessages();

        verifyPrivilegedUids(null /* expectedUids */, 0 /* expectedUidUpdates */);
        verifyRegistrantUpdates(null /* expectedUids */, 0 /* expectedUidUpdates */);
        verifyCarrierPrivilegesChangedUpdates(
                List.of(new Pair<>(PRIVILEGED_PACKAGES, PRIVILEGED_UIDS)));
    }

    @Test
@@ -317,7 +357,11 @@ public class CarrierPrivilegesTrackerTest extends TelephonyTest {
        sendCarrierConfigChangedIntent(INVALID_SUBSCRIPTION_ID, PHONE_ID);
        mTestableLooper.processAllMessages();

        verifyPrivilegedUids(new int[0] /* expectedUids */, 1 /* expectedUidUpdates */);
        verifyRegistrantUpdates(new int[0] /* expectedUids */, 1 /* expectedUidUpdates */);
        verifyCarrierPrivilegesChangedUpdates(
                List.of(
                        new Pair<>(PRIVILEGED_PACKAGES, PRIVILEGED_UIDS),
                        new Pair<>(Set.of(), new int[0])));
    }

    @Test
@@ -331,7 +375,8 @@ public class CarrierPrivilegesTrackerTest extends TelephonyTest {
        sendCarrierConfigChangedIntent(SUB_ID, PHONE_ID);
        mTestableLooper.processAllMessages();

        verifyPrivilegedUids(new int[0] /* expectedUids */, 1 /* expectedUidUpdates */);
        verifyRegistrantUpdates(new int[0] /* expectedUids */, 1 /* expectedUidUpdates */);
        verifyCarrierPrivilegesChangedUpdates(List.of(new Pair<>(Set.of(), new int[0])));
    }

    @Test
@@ -349,7 +394,9 @@ public class CarrierPrivilegesTrackerTest extends TelephonyTest {
        sendCarrierConfigChangedIntent(SUB_ID, PHONE_ID);
        mTestableLooper.processAllMessages();

        verifyPrivilegedUids(new int[] {UID_1} /* expectedUids */, 1 /* expectedUidUpdates */);
        verifyRegistrantUpdates(new int[] {UID_1}, 1 /* expectedUidUpdates */);
        verifyCarrierPrivilegesChangedUpdates(
                List.of(new Pair<>(Set.of(PACKAGE_1), new int[] {UID_1})));

        // Give package 2 privileges again.
        setupCarrierConfigRules(
@@ -359,7 +406,9 @@ public class CarrierPrivilegesTrackerTest extends TelephonyTest {
        sendCarrierConfigChangedIntent(SUB_ID, PHONE_ID);
        mTestableLooper.processAllMessages();

        verifyPrivilegedUids(PRIVILEGED_UIDS /* expectedUids */, 2 /* expectedUidUpdates */);
        verifyRegistrantUpdates(PRIVILEGED_UIDS, 2 /* expectedUidUpdates */);
        verifyCarrierPrivilegesChangedUpdates(
                List.of(new Pair<>(PRIVILEGED_PACKAGES, PRIVILEGED_UIDS)));
    }

    @Test
@@ -375,7 +424,9 @@ public class CarrierPrivilegesTrackerTest extends TelephonyTest {
        sendSimCardStateChangedIntent(PHONE_ID, SIM_STATE_LOADED);
        mTestableLooper.processAllMessages();

        verifyPrivilegedUids(PRIVILEGED_UIDS, 1 /* expectedUidUpdates */);
        verifyRegistrantUpdates(PRIVILEGED_UIDS, 1 /* expectedUidUpdates */);
        verifyCarrierPrivilegesChangedUpdates(
                List.of(new Pair<>(PRIVILEGED_PACKAGES, PRIVILEGED_UIDS)));
    }

    @Test
@@ -391,7 +442,9 @@ public class CarrierPrivilegesTrackerTest extends TelephonyTest {
        sendSimApplicationStateChangedIntent(PHONE_ID, SIM_STATE_LOADED);
        mTestableLooper.processAllMessages();

        verifyPrivilegedUids(PRIVILEGED_UIDS, 1 /* expectedUidUpdates */);
        verifyRegistrantUpdates(PRIVILEGED_UIDS, 1 /* expectedUidUpdates */);
        verifyCarrierPrivilegesChangedUpdates(
                List.of(new Pair<>(PRIVILEGED_PACKAGES, PRIVILEGED_UIDS)));
    }

    @Test
@@ -404,7 +457,11 @@ public class CarrierPrivilegesTrackerTest extends TelephonyTest {
        sendSimCardStateChangedIntent(PHONE_ID, SIM_STATE_LOADED);
        mTestableLooper.processAllMessages();

        verifyPrivilegedUids(new int[0] /* expectedUids */, 1 /* expectedUidUpdates */);
        verifyRegistrantUpdates(new int[0], 1 /* expectedUidUpdates */);
        verifyCarrierPrivilegesChangedUpdates(
                List.of(
                        new Pair<>(PRIVILEGED_PACKAGES, PRIVILEGED_UIDS),
                        new Pair<>(Set.of(), new int[0])));
    }

    @Test
@@ -417,7 +474,9 @@ public class CarrierPrivilegesTrackerTest extends TelephonyTest {
        sendSimCardStateChangedIntent(PHONE_ID_INCORRECT, SIM_STATE_LOADED);
        mTestableLooper.processAllMessages();

        verifyPrivilegedUids(null /* expectedUids */, 0 /* expectedUidUpdates */);
        verifyRegistrantUpdates(null /* expectedUids */, 0 /* expectedUidUpdates */);
        verifyCarrierPrivilegesChangedUpdates(
                List.of(new Pair<>(PRIVILEGED_PACKAGES, PRIVILEGED_UIDS)));
    }

    @Test
@@ -428,7 +487,11 @@ public class CarrierPrivilegesTrackerTest extends TelephonyTest {
        sendSimCardStateChangedIntent(PHONE_ID, SIM_STATE_NOT_READY);
        mTestableLooper.processAllMessages();

        verifyPrivilegedUids(new int[0] /* expectedUids */, 1 /* expectedUidUpdates */);
        verifyRegistrantUpdates(new int[0], 1 /* expectedUidUpdates */);
        verifyCarrierPrivilegesChangedUpdates(
                List.of(
                        new Pair<>(PRIVILEGED_PACKAGES, PRIVILEGED_UIDS),
                        new Pair<>(Set.of(), new int[0])));
    }

    @Test
@@ -446,7 +509,9 @@ public class CarrierPrivilegesTrackerTest extends TelephonyTest {
        sendSimCardStateChangedIntent(PHONE_ID, SIM_STATE_LOADED);
        mTestableLooper.processAllMessages();

        verifyPrivilegedUids(new int[] {UID_1} /* expectedUids */, 1 /* expectedUidUpdates */);
        verifyRegistrantUpdates(new int[] {UID_1}, 1 /* expectedUidUpdates */);
        verifyCarrierPrivilegesChangedUpdates(
                List.of(new Pair<>(Set.of(PACKAGE_1), new int[] {UID_1})));

        // Give package 2 privileges again.
        setupSimLoadedRules(
@@ -457,7 +522,9 @@ public class CarrierPrivilegesTrackerTest extends TelephonyTest {
        sendSimCardStateChangedIntent(PHONE_ID, SIM_STATE_LOADED);
        mTestableLooper.processAllMessages();

        verifyPrivilegedUids(PRIVILEGED_UIDS /* expectedUids */, 2 /* expectedUidUpdates */);
        verifyRegistrantUpdates(PRIVILEGED_UIDS, 2 /* expectedUidUpdates */);
        verifyCarrierPrivilegesChangedUpdates(
                List.of(new Pair<>(PRIVILEGED_PACKAGES, PRIVILEGED_UIDS)));
    }

    @Test
@@ -471,7 +538,9 @@ public class CarrierPrivilegesTrackerTest extends TelephonyTest {
        sendPackageChangedIntent(Intent.ACTION_PACKAGE_ADDED, PACKAGE_1);
        mTestableLooper.processAllMessages();

        verifyPrivilegedUids(new int[] {UID_1}, 1 /* expectedUidUpdates */);
        verifyRegistrantUpdates(new int[] {UID_1}, 1 /* expectedUidUpdates */);
        verifyCarrierPrivilegesChangedUpdates(
                List.of(new Pair<>(Set.of(PACKAGE_1), new int[] {UID_1})));
    }

    @Test
@@ -488,7 +557,9 @@ public class CarrierPrivilegesTrackerTest extends TelephonyTest {
        sendPackageChangedIntent(Intent.ACTION_PACKAGE_ADDED, PACKAGE_1);
        mTestableLooper.processAllMessages();

        verifyPrivilegedUids(PRIVILEGED_UIDS, 1 /* expectedUidUpdates */);
        verifyRegistrantUpdates(PRIVILEGED_UIDS, 1 /* expectedUidUpdates */);
        verifyCarrierPrivilegesChangedUpdates(
                List.of(new Pair<>(Set.of(PACKAGE_1), PRIVILEGED_UIDS)));
    }

    @Test
@@ -506,7 +577,9 @@ public class CarrierPrivilegesTrackerTest extends TelephonyTest {
        sendPackageChangedIntent(Intent.ACTION_PACKAGE_REPLACED, PACKAGE_1);
        mTestableLooper.processAllMessages();

        verifyPrivilegedUids(PRIVILEGED_UIDS, 1 /* expectedUidUpdates */);
        verifyRegistrantUpdates(PRIVILEGED_UIDS, 1 /* expectedUidUpdates */);
        verifyCarrierPrivilegesChangedUpdates(
                List.of(new Pair<>(Set.of(PACKAGE_1), PRIVILEGED_UIDS)));
    }

    @Test
@@ -528,7 +601,9 @@ public class CarrierPrivilegesTrackerTest extends TelephonyTest {
        sendPackageChangedIntent(Intent.ACTION_PACKAGE_ADDED, PACKAGE_1);
        mTestableLooper.processAllMessages();

        verifyPrivilegedUids(new int[] {UID_2} /* expectedUids */, 1 /* expectedUidUpdates */);
        verifyRegistrantUpdates(new int[] {UID_2}, 1 /* expectedUidUpdates */);
        verifyCarrierPrivilegesChangedUpdates(
                List.of(new Pair<>(Set.of(PACKAGE_2), new int[] {UID_2})));
    }

    @Test
@@ -549,7 +624,9 @@ public class CarrierPrivilegesTrackerTest extends TelephonyTest {
        sendPackageChangedIntent(Intent.ACTION_PACKAGE_ADDED, PACKAGE_1);
        mTestableLooper.processAllMessages();

        verifyPrivilegedUids(new int[] {UID_2} /* expectedUids */, 1 /* expectedUidUpdates */);
        verifyRegistrantUpdates(new int[] {UID_2}, 1 /* expectedUidUpdates */);
        verifyCarrierPrivilegesChangedUpdates(
                List.of(new Pair<>(Set.of(PACKAGE_2), new int[] {UID_2})));
    }

    @Test
@@ -565,7 +642,9 @@ public class CarrierPrivilegesTrackerTest extends TelephonyTest {
        sendPackageChangedIntent(Intent.ACTION_PACKAGE_REMOVED, PACKAGE_1);
        mTestableLooper.processAllMessages();

        verifyPrivilegedUids(new int[] {UID_2} /* expectedUids */, 1 /* expectedUidUpdates */);
        verifyRegistrantUpdates(new int[] {UID_2}, 1 /* expectedUidUpdates */);
        verifyCarrierPrivilegesChangedUpdates(
                List.of(new Pair<>(Set.of(PACKAGE_2), new int[] {UID_2})));
    }

    @Test
@@ -577,7 +656,8 @@ public class CarrierPrivilegesTrackerTest extends TelephonyTest {
        sendPackageChangedIntent(Intent.ACTION_PACKAGE_REMOVED, PACKAGE_1);
        mTestableLooper.processAllMessages();

        verifyPrivilegedUids(null /* expectedUids */, 0 /* expectedUidUpdates */);
        verifyRegistrantUpdates(null /* expectedUidUpdates */, 0 /* expectedUidUpdates */);
        verifyCarrierPrivilegesChangedUpdates(List.of());
    }

    private void sendCarrierConfigChangedIntent(int subId, int phoneId) {