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

Commit de967cfa authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge "Inform TelephonyRegistry when carrier privileged apps change."

parents e471ff32 140cd42e
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) {