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

Commit f7cbb7d8 authored by Jack Yu's avatar Jack Yu Committed by Automerger Merge Worker
Browse files

Merge changes I8752aea9,I89d1d6a1 into main am: 7a6ecced

parents e6c4964d 7a6ecced
Loading
Loading
Loading
Loading
+6 −11
Original line number Original line Diff line number Diff line
@@ -266,8 +266,12 @@ public class SubscriptionManagerService extends ISub.Stub {
    /**
    /**
     * Slot index/subscription map that automatically invalidate cache in
     * Slot index/subscription map that automatically invalidate cache in
     * {@link SubscriptionManager}.
     * {@link SubscriptionManager}.
     *
     * @param <K> The type of the key.
     * @param <V> The type of the value.
     */
     */
    private static class SubscriptionMap<K, V> extends ConcurrentHashMap<K, V> {
    @VisibleForTesting
    public static class SubscriptionMap<K, V> extends ConcurrentHashMap<K, V> {
        @Override
        @Override
        public void clear() {
        public void clear() {
            super.clear();
            super.clear();
@@ -2983,7 +2987,7 @@ public class SubscriptionManagerService extends ISub.Stub {
                        + columnName);
                        + columnName);
            }
            }
        } catch (IllegalArgumentException e) {
        } catch (IllegalArgumentException e) {
            logv("getSubscriptionProperty: Invalid subId " + subId + ", columnName=" + columnName);
            loge("getSubscriptionProperty: Invalid subId " + subId + ", columnName=" + columnName);
            return null;
            return null;
        } finally {
        } finally {
            Binder.restoreCallingIdentity(token);
            Binder.restoreCallingIdentity(token);
@@ -3870,15 +3874,6 @@ public class SubscriptionManagerService extends ISub.Stub {
        Rlog.e(LOG_TAG, s);
        Rlog.e(LOG_TAG, s);
    }
    }


    /**
     * Log verbose messages.
     *
     * @param s debug messages.
     */
    private void logv(@NonNull String s) {
        if (VDBG) Rlog.v(LOG_TAG, s);
    }

    /**
    /**
     * Log debug messages and also log into the local log.
     * Log debug messages and also log into the local log.
     *
     *
+36 −0
Original line number Original line Diff line number Diff line
@@ -63,6 +63,8 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Arrays;
import java.util.List;
import java.util.List;
import java.util.Map;
import java.util.Map;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executor;


@RunWith(AndroidTestingRunner.class)
@RunWith(AndroidTestingRunner.class)
@TestableLooper.RunWithLooper
@TestableLooper.RunWithLooper
@@ -1673,4 +1675,38 @@ public class SubscriptionDatabaseManagerTest extends TelephonyTest {
        assertThat(mDatabaseManagerUT.getSubscriptionInfoInternal(3)).isNull();
        assertThat(mDatabaseManagerUT.getSubscriptionInfoInternal(3)).isNull();
        verify(mSubscriptionDatabaseManagerCallback).onSubscriptionChanged(eq(3));
        verify(mSubscriptionDatabaseManagerCallback).onSubscriptionChanged(eq(3));
    }
    }

    @Test
    public void testCallback() {
        CountDownLatch latch = new CountDownLatch(2);
        Executor executor = Runnable::run;
        SubscriptionDatabaseManagerCallback callback =
                new SubscriptionDatabaseManagerCallback(executor) {
                    @Override
                    public void onInitialized() {
                        latch.countDown();
                        logd("onInitialized");
                    }

                    @Override
                    public void onSubscriptionChanged(int subId) {
                        latch.countDown();
                        logd("onSubscriptionChanged");
                    }
                };
        assertThat(callback.getExecutor()).isEqualTo(executor);
        mDatabaseManagerUT = new SubscriptionDatabaseManager(mContext, Looper.myLooper(), callback);
        processAllMessages();

        assertThat(latch.getCount()).isEqualTo(1);

        mDatabaseManagerUT.insertSubscriptionInfo(
                new SubscriptionInfoInternal.Builder()
                        .setId(SubscriptionManager.INVALID_SUBSCRIPTION_ID)
                        .setIccId(FAKE_ICCID1)
                        .setSimSlotIndex(0)
                        .build());
        processAllMessages();
        assertThat(latch.getCount()).isEqualTo(0);
    }
}
}
+85 −10
Original line number Original line Diff line number Diff line
@@ -104,6 +104,7 @@ import com.android.internal.telephony.TelephonyTest;
import com.android.internal.telephony.euicc.EuiccController;
import com.android.internal.telephony.euicc.EuiccController;
import com.android.internal.telephony.subscription.SubscriptionDatabaseManagerTest.SubscriptionProvider;
import com.android.internal.telephony.subscription.SubscriptionDatabaseManagerTest.SubscriptionProvider;
import com.android.internal.telephony.subscription.SubscriptionManagerService.SubscriptionManagerServiceCallback;
import com.android.internal.telephony.subscription.SubscriptionManagerService.SubscriptionManagerServiceCallback;
import com.android.internal.telephony.subscription.SubscriptionManagerService.SubscriptionMap;
import com.android.internal.telephony.uicc.UiccSlot;
import com.android.internal.telephony.uicc.UiccSlot;


import libcore.junit.util.compat.CoreCompatChangeRule.EnableCompatChanges;
import libcore.junit.util.compat.CoreCompatChangeRule.EnableCompatChanges;
@@ -122,11 +123,11 @@ import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.StringWriter;
import java.lang.reflect.Array;
import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Arrays;
import java.util.List;
import java.util.List;
import java.util.Set;
import java.util.Set;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executor;


@RunWith(AndroidTestingRunner.class)
@RunWith(AndroidTestingRunner.class)
@TestableLooper.RunWithLooper
@TestableLooper.RunWithLooper
@@ -136,6 +137,8 @@ public class SubscriptionManagerServiceTest extends TelephonyTest {


    private static final String CALLING_FEATURE = "calling_feature";
    private static final String CALLING_FEATURE = "calling_feature";


    private static final String GROUP_UUID = "6adbc864-691c-45dc-b698-8fc9a2176fae";

    private SubscriptionManagerService mSubscriptionManagerServiceUT;
    private SubscriptionManagerService mSubscriptionManagerServiceUT;


    private final SubscriptionProvider mSubscriptionProvider = new SubscriptionProvider();
    private final SubscriptionProvider mSubscriptionProvider = new SubscriptionProvider();
@@ -253,21 +256,17 @@ public class SubscriptionManagerServiceTest extends TelephonyTest {
            // Insertion is sync, but the onSubscriptionChanged callback is handled by the handler.
            // Insertion is sync, but the onSubscriptionChanged callback is handled by the handler.
            processAllMessages();
            processAllMessages();


            Class<?> SubscriptionMapClass = Class.forName(
                    "com.android.internal.telephony.subscription"
                            + ".SubscriptionManagerService$SubscriptionMap");
            Field field = SubscriptionManagerService.class.getDeclaredField("mSlotIndexToSubId");
            Field field = SubscriptionManagerService.class.getDeclaredField("mSlotIndexToSubId");
            field.setAccessible(true);
            field.setAccessible(true);
            Object map = field.get(mSubscriptionManagerServiceUT);
            SubscriptionMap<Integer, Integer> map = (SubscriptionMap<Integer, Integer>)
                    field.get(mSubscriptionManagerServiceUT);
            Class[] cArgs = new Class[2];
            Class[] cArgs = new Class[2];
            cArgs[0] = Object.class;
            cArgs[0] = Object.class;
            cArgs[1] = Object.class;
            cArgs[1] = Object.class;


            if (subInfo.getSimSlotIndex() >= 0) {
            if (subInfo.getSimSlotIndex() >= 0) {
                // Change the slot -> subId mapping
                // Change the slot -> subId mapping
                Method method = SubscriptionMapClass.getDeclaredMethod("put", cArgs);
                map.put(subInfo.getSimSlotIndex(), subId);
                method.setAccessible(true);
                method.invoke(map, subInfo.getSimSlotIndex(), subId);
            }
            }


            mContextFixture.removeCallingOrSelfPermission(Manifest.permission.MODIFY_PHONE_STATE);
            mContextFixture.removeCallingOrSelfPermission(Manifest.permission.MODIFY_PHONE_STATE);
@@ -1180,7 +1179,7 @@ public class SubscriptionManagerServiceTest extends TelephonyTest {
        insertSubscription(FAKE_SUBSCRIPTION_INFO1);
        insertSubscription(FAKE_SUBSCRIPTION_INFO1);
        insertSubscription(FAKE_SUBSCRIPTION_INFO2);
        insertSubscription(FAKE_SUBSCRIPTION_INFO2);


        ParcelUuid newUuid = ParcelUuid.fromString("6adbc864-691c-45dc-b698-8fc9a2176fae");
        ParcelUuid newUuid = ParcelUuid.fromString(GROUP_UUID);
        String newOwner = "new owner";
        String newOwner = "new owner";
        // Should fail without MODIFY_PHONE_STATE
        // Should fail without MODIFY_PHONE_STATE
        assertThrows(SecurityException.class, () -> mSubscriptionManagerServiceUT
        assertThrows(SecurityException.class, () -> mSubscriptionManagerServiceUT
@@ -2036,14 +2035,16 @@ public class SubscriptionManagerServiceTest extends TelephonyTest {
    @Test
    @Test
    public void testOnUiccApplicationsEnabled() {
    public void testOnUiccApplicationsEnabled() {
        CountDownLatch latch = new CountDownLatch(1);
        CountDownLatch latch = new CountDownLatch(1);
        Executor executor = Runnable::run;
        SubscriptionManagerServiceCallback callback =
        SubscriptionManagerServiceCallback callback =
                new SubscriptionManagerServiceCallback(Runnable::run) {
                new SubscriptionManagerServiceCallback(executor) {
                    @Override
                    @Override
                    public void onUiccApplicationsEnabledChanged(int subId) {
                    public void onUiccApplicationsEnabledChanged(int subId) {
                        latch.countDown();
                        latch.countDown();
                        logd("testOnSubscriptionChanged: onUiccApplicationsEnabledChanged");
                        logd("testOnSubscriptionChanged: onUiccApplicationsEnabledChanged");
                    }
                    }
                };
                };
        assertThat(callback.getExecutor()).isEqualTo(executor);
        mSubscriptionManagerServiceUT.registerCallback(callback);
        mSubscriptionManagerServiceUT.registerCallback(callback);
        int subId = insertSubscription(FAKE_SUBSCRIPTION_INFO1);
        int subId = insertSubscription(FAKE_SUBSCRIPTION_INFO1);


@@ -2051,6 +2052,13 @@ public class SubscriptionManagerServiceTest extends TelephonyTest {
        mSubscriptionManagerServiceUT.setUiccApplicationsEnabled(false, subId);
        mSubscriptionManagerServiceUT.setUiccApplicationsEnabled(false, subId);
        processAllMessages();
        processAllMessages();
        assertThat(latch.getCount()).isEqualTo(0);
        assertThat(latch.getCount()).isEqualTo(0);

        mSubscriptionManagerServiceUT.unregisterCallback(callback);
        // without override. Nothing should happen.
        callback = new SubscriptionManagerServiceCallback(Runnable::run);
        mSubscriptionManagerServiceUT.registerCallback(callback);
        mSubscriptionManagerServiceUT.setUiccApplicationsEnabled(true, subId);
        processAllMessages();
    }
    }


    @Test
    @Test
@@ -2107,4 +2115,71 @@ public class SubscriptionManagerServiceTest extends TelephonyTest {
        assertThat(mSubscriptionManagerServiceUT.getActiveSubscriptionInfoList(
        assertThat(mSubscriptionManagerServiceUT.getActiveSubscriptionInfoList(
                CALLING_PACKAGE, CALLING_FEATURE).get(0).getIccId()).isEqualTo(FAKE_MAC_ADDRESS2);
                CALLING_PACKAGE, CALLING_FEATURE).get(0).getIccId()).isEqualTo(FAKE_MAC_ADDRESS2);
    }
    }

    @Test
    public void testRemoveSubscriptionsFromGroup() {
        testAddSubscriptionsIntoGroup();

        mContextFixture.removeCallingOrSelfPermission(Manifest.permission.MODIFY_PHONE_STATE);
        assertThrows(SecurityException.class, ()
                -> mSubscriptionManagerServiceUT.removeSubscriptionsFromGroup(new int[]{2},
                ParcelUuid.fromString(GROUP_UUID), CALLING_PACKAGE));

        mContextFixture.addCallingOrSelfPermission(Manifest.permission.MODIFY_PHONE_STATE);

        assertThrows(IllegalArgumentException.class, ()
                -> mSubscriptionManagerServiceUT.removeSubscriptionsFromGroup(new int[]{3},
                ParcelUuid.fromString(GROUP_UUID), CALLING_PACKAGE));

        assertThrows(IllegalArgumentException.class, ()
                -> mSubscriptionManagerServiceUT.removeSubscriptionsFromGroup(new int[]{2},
                ParcelUuid.fromString("55911c5b-83ed-419d-8f9b-4e027cf09305"), CALLING_PACKAGE));

        mSubscriptionManagerServiceUT.removeSubscriptionsFromGroup(new int[]{2},
                ParcelUuid.fromString(GROUP_UUID), CALLING_PACKAGE);

        SubscriptionInfoInternal subInfo = mSubscriptionManagerServiceUT
                .getSubscriptionInfoInternal(2);
        assertThat(subInfo.getGroupUuid()).isEmpty();
        assertThat(subInfo.getGroupOwner()).isEmpty();
    }

    @Test
    public void testUpdateSimStateForInactivePort() {
        testSetUiccApplicationsEnabled();

        mContextFixture.addCallingOrSelfPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE);
        mSubscriptionManagerServiceUT.updateSimStateForInactivePort(0);
        processAllMessages();

        SubscriptionInfoInternal subInfo = mSubscriptionManagerServiceUT
                .getSubscriptionInfoInternal(1);
        assertThat(subInfo.areUiccApplicationsEnabled()).isTrue();
    }

    @Test
    public void testRestoreAllSimSpecificSettingsFromBackup() {
        assertThrows(SecurityException.class, ()
                -> mSubscriptionManagerServiceUT.restoreAllSimSpecificSettingsFromBackup(
                        new byte[0]));
        mContextFixture.addCallingOrSelfPermission(Manifest.permission.MODIFY_PHONE_STATE);

        // TODO: Briefly copy the logic from TelephonyProvider to
        //  SubscriptionDatabaseManagerTest.SubscriptionProvider
        mSubscriptionManagerServiceUT.restoreAllSimSpecificSettingsFromBackup(
                new byte[0]);
    }

    @Test
    public void testSubscriptionMap() {
        SubscriptionMap<Integer, Integer> map = new SubscriptionMap<>();
        map.put(1, 1);
        assertThat(map.get(1)).isEqualTo(1);
        map.put(0, 2);
        assertThat(map.get(0)).isEqualTo(2);
        map.remove(1);
        assertThat(map.get(1)).isNull();
        map.clear();
        assertThat(map).hasSize(0);
    }
}
}