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

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

Merge changes I577dd4ec,I23db0581,I91993a8e,I05ad5e12 into main am: 42943cab

parents a6cda048 42943cab
Loading
Loading
Loading
Loading
+32 −8
Original line number Original line Diff line number Diff line
@@ -1221,8 +1221,8 @@ public class SubscriptionDatabaseManager extends Handler {
        try {
        try {
            SubscriptionInfoInternal subInfoCache = mAllSubscriptionInfoInternalCache.get(subId);
            SubscriptionInfoInternal subInfoCache = mAllSubscriptionInfoInternalCache.get(subId);
            if (subInfoCache == null) {
            if (subInfoCache == null) {
                throw new IllegalArgumentException("Subscription doesn't exist. subId=" + subId
                throw new IllegalArgumentException("setCardId: Subscription doesn't exist. subId="
                        + ", columnName=cardId");
                        + subId);
            }
            }
            mAllSubscriptionInfoInternalCache.put(subId,
            mAllSubscriptionInfoInternalCache.put(subId,
                    new SubscriptionInfoInternal.Builder(subInfoCache)
                    new SubscriptionInfoInternal.Builder(subInfoCache)
@@ -1763,6 +1763,36 @@ public class SubscriptionDatabaseManager extends Handler {
                SubscriptionInfoInternal.Builder::setSatelliteEnabled);
                SubscriptionInfoInternal.Builder::setSatelliteEnabled);
    }
    }


    /**
     * Set whether group of the subscription is disabled. This is only useful if it's a grouped
     * opportunistic subscription. In this case, if all primary (non-opportunistic)
     * subscriptions in the group are deactivated (unplugged pSIM or deactivated eSIM profile),
     * we should disable this opportunistic subscription.
     *
     * @param subId Subscription id.
     * @param isGroupDisabled if group of the subscription is disabled.
     *
     * @throws IllegalArgumentException if the subscription does not exist.
     */
    public void setGroupDisabled(int subId, boolean isGroupDisabled) {
        // group disabled does not have a corresponding SimInfo column. So we only update the cache.

        // Grab the write lock so no other threads can read or write the cache.
        mReadWriteLock.writeLock().lock();
        try {
            SubscriptionInfoInternal subInfoCache = mAllSubscriptionInfoInternalCache.get(subId);
            if (subInfoCache == null) {
                throw new IllegalArgumentException("setGroupDisabled: Subscription doesn't exist. "
                        + "subId=" + subId);
            }
            mAllSubscriptionInfoInternalCache.put(subId,
                    new SubscriptionInfoInternal.Builder(subInfoCache)
                            .setGroupDisabled(isGroupDisabled).build());
        } finally {
            mReadWriteLock.writeLock().unlock();
        }
    }

    /**
    /**
     * Load the entire database into the cache.
     * Load the entire database into the cache.
     */
     */
@@ -2004,12 +2034,6 @@ public class SubscriptionDatabaseManager extends Handler {
        }
        }
    }
    }


    /**
     * @return {@code true} if the database has been loaded into the cache.
     */
    public boolean isDatabaseLoaded() {
        return mDatabaseLoaded;
    }
    /**
    /**
     * Log debug messages.
     * Log debug messages.
     *
     *
+31 −0
Original line number Original line Diff line number Diff line
@@ -896,6 +896,7 @@ public class SubscriptionManagerService extends ISub.Stub {
                            SubscriptionManager.INVALID_SIM_SLOT_INDEX);
                            SubscriptionManager.INVALID_SIM_SLOT_INDEX);
                    mSlotIndexToSubId.remove(simSlotIndex);
                    mSlotIndexToSubId.remove(simSlotIndex);
                });
                });
        updateGroupDisabled();
    }
    }


    /**
    /**
@@ -1321,6 +1322,7 @@ public class SubscriptionManagerService extends ISub.Stub {
            MultiSimSettingController.getInstance().notifyAllSubscriptionLoaded();
            MultiSimSettingController.getInstance().notifyAllSubscriptionLoaded();
        }
        }


        updateGroupDisabled();
        updateDefaultSubId();
        updateDefaultSubId();
    }
    }


@@ -1464,6 +1466,8 @@ public class SubscriptionManagerService extends ISub.Stub {
            }
            }
        }
        }


        updateGroupDisabled();

        final int preferredUsageSetting = config.getInt(
        final int preferredUsageSetting = config.getInt(
                CarrierConfigManager.KEY_CELLULAR_USAGE_SETTING_INT,
                CarrierConfigManager.KEY_CELLULAR_USAGE_SETTING_INT,
                SubscriptionManager.USAGE_SETTING_UNKNOWN);
                SubscriptionManager.USAGE_SETTING_UNKNOWN);
@@ -1875,6 +1879,7 @@ public class SubscriptionManagerService extends ISub.Stub {
                }
                }


                int subId = insertSubscriptionInfo(iccId, slotIndex, displayName, subscriptionType);
                int subId = insertSubscriptionInfo(iccId, slotIndex, displayName, subscriptionType);
                updateGroupDisabled();
                mSlotIndexToSubId.put(slotIndex, subId);
                mSlotIndexToSubId.put(slotIndex, subId);
            } else {
            } else {
                // Record already exists.
                // Record already exists.
@@ -2189,6 +2194,7 @@ public class SubscriptionManagerService extends ISub.Stub {
                mSubscriptionDatabaseManager.setGroupUuid(subId, uuidString);
                mSubscriptionDatabaseManager.setGroupUuid(subId, uuidString);
                mSubscriptionDatabaseManager.setGroupOwner(subId, callingPackage);
                mSubscriptionDatabaseManager.setGroupOwner(subId, callingPackage);
            }
            }
            updateGroupDisabled();


            MultiSimSettingController.getInstance().notifySubscriptionGroupChanged(groupUUID);
            MultiSimSettingController.getInstance().notifySubscriptionGroupChanged(groupUUID);
            return groupUUID;
            return groupUUID;
@@ -2380,6 +2386,8 @@ public class SubscriptionManagerService extends ISub.Stub {
                            subInfo.getSubscriptionId(), callingPackage);
                            subInfo.getSubscriptionId(), callingPackage);
                }
                }
            }
            }

            updateGroupDisabled();
        } finally {
        } finally {
            Binder.restoreCallingIdentity(identity);
            Binder.restoreCallingIdentity(identity);
        }
        }
@@ -2439,6 +2447,7 @@ public class SubscriptionManagerService extends ISub.Stub {
                mSubscriptionDatabaseManager.setGroupOwner(subId, callingPackage);
                mSubscriptionDatabaseManager.setGroupOwner(subId, callingPackage);
            }
            }


            updateGroupDisabled();
            MultiSimSettingController.getInstance().notifySubscriptionGroupChanged(groupUuid);
            MultiSimSettingController.getInstance().notifySubscriptionGroupChanged(groupUuid);
            logl("addSubscriptionsIntoGroup: add subs " + Arrays.toString(subIdList)
            logl("addSubscriptionsIntoGroup: add subs " + Arrays.toString(subIdList)
                    + " to the group.");
                    + " to the group.");
@@ -3687,6 +3696,28 @@ public class SubscriptionManagerService extends ISub.Stub {
                Binder.getCallingUid()));
                Binder.getCallingUid()));
    }
    }


    /**
     * Update the {@link SubscriptionInfo#isGroupDisabled()} bit for the opportunistic
     * subscriptions.
     *
     * If all primary (non-opportunistic) subscriptions in the group are deactivated
     * (unplugged pSIM or deactivated eSIM profile), we should disable this opportunistic
     * subscriptions.
     */
    @VisibleForTesting
    public void updateGroupDisabled() {
        List<SubscriptionInfo> activeSubscriptions = getActiveSubscriptionInfoList(
                mContext.getOpPackageName(), mContext.getFeatureId());
        for (SubscriptionInfo oppSubInfo : getOpportunisticSubscriptions(
                mContext.getOpPackageName(), mContext.getFeatureId())) {
            boolean groupDisabled = activeSubscriptions.stream()
                    .noneMatch(subInfo -> !subInfo.isOpportunistic()
                            && Objects.equals(oppSubInfo.getGroupUuid(), subInfo.getGroupUuid()));
            mSubscriptionDatabaseManager.setGroupDisabled(
                    oppSubInfo.getSubscriptionId(), groupDisabled);
        }
    }

    /**
    /**
     * Log debug messages.
     * Log debug messages.
     *
     *
+24 −7
Original line number Original line Diff line number Diff line
@@ -90,6 +90,7 @@ import android.telephony.UiccAccessRule;
import android.test.mock.MockContentResolver;
import android.test.mock.MockContentResolver;
import android.testing.AndroidTestingRunner;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper;
import android.util.ArraySet;
import android.util.Base64;
import android.util.Base64;


import com.android.internal.telephony.ContextFixture;
import com.android.internal.telephony.ContextFixture;
@@ -136,6 +137,8 @@ public class SubscriptionManagerServiceTest extends TelephonyTest {
    private SubscriptionManagerServiceCallback mMockedSubscriptionManagerServiceCallback;
    private SubscriptionManagerServiceCallback mMockedSubscriptionManagerServiceCallback;
    private EuiccController mEuiccController;
    private EuiccController mEuiccController;


    private Set<Integer> mActiveSubs = new ArraySet<>();

    @Rule
    @Rule
    public TestRule compatChangeRule = new PlatformCompatChangeRule();
    public TestRule compatChangeRule = new PlatformCompatChangeRule();


@@ -158,6 +161,8 @@ public class SubscriptionManagerServiceTest extends TelephonyTest {
        doReturn(FAKE_ICCID1).when(mUiccCard).getCardId();
        doReturn(FAKE_ICCID1).when(mUiccCard).getCardId();
        doReturn(FAKE_ICCID1).when(mUiccPort).getIccId();
        doReturn(FAKE_ICCID1).when(mUiccPort).getIccId();


        doReturn(new int[0]).when(mSubscriptionManager).getCompleteActiveSubscriptionIdList();

        ((MockContentResolver) mContext.getContentResolver()).addProvider(
        ((MockContentResolver) mContext.getContentResolver()).addProvider(
                Telephony.Carriers.CONTENT_URI.getAuthority(), mSubscriptionProvider);
                Telephony.Carriers.CONTENT_URI.getAuthority(), mSubscriptionProvider);
        mSubscriptionManagerServiceUT = new SubscriptionManagerService(mContext, Looper.myLooper());
        mSubscriptionManagerServiceUT = new SubscriptionManagerService(mContext, Looper.myLooper());
@@ -249,6 +254,15 @@ public class SubscriptionManagerServiceTest extends TelephonyTest {
            processAllMessages();
            processAllMessages();
            verify(mMockedSubscriptionManagerServiceCallback).onSubscriptionChanged(eq(subId));
            verify(mMockedSubscriptionManagerServiceCallback).onSubscriptionChanged(eq(subId));
            Mockito.clearInvocations(mMockedSubscriptionManagerServiceCallback);
            Mockito.clearInvocations(mMockedSubscriptionManagerServiceCallback);

            if (subInfo.getSimSlotIndex() >= 0) {
                mActiveSubs.add(subId);
            } else {
                mActiveSubs.remove(subId);
            }

            doReturn(mActiveSubs.stream().mapToInt(i->i).toArray()).when(mSubscriptionManager)
                    .getCompleteActiveSubscriptionIdList();
            return subId;
            return subId;
        } catch (Exception e) {
        } catch (Exception e) {
            fail("Failed to insert subscription. e=" + e);
            fail("Failed to insert subscription. e=" + e);
@@ -379,7 +393,6 @@ public class SubscriptionManagerServiceTest extends TelephonyTest {
    @Test
    @Test
    public void testGetAllSubInfoList() {
    public void testGetAllSubInfoList() {
        mContextFixture.addCallingOrSelfPermission(Manifest.permission.MODIFY_PHONE_STATE);
        mContextFixture.addCallingOrSelfPermission(Manifest.permission.MODIFY_PHONE_STATE);
        doReturn(new int[]{1, 2}).when(mSubscriptionManager).getCompleteActiveSubscriptionIdList();
        insertSubscription(FAKE_SUBSCRIPTION_INFO1);
        insertSubscription(FAKE_SUBSCRIPTION_INFO1);
        insertSubscription(FAKE_SUBSCRIPTION_INFO2);
        insertSubscription(FAKE_SUBSCRIPTION_INFO2);


@@ -448,8 +461,6 @@ public class SubscriptionManagerServiceTest extends TelephonyTest {
    @Test
    @Test
    @EnableCompatChanges({SubscriptionManagerService.REQUIRE_DEVICE_IDENTIFIERS_FOR_GROUP_UUID})
    @EnableCompatChanges({SubscriptionManagerService.REQUIRE_DEVICE_IDENTIFIERS_FOR_GROUP_UUID})
    public void testGetSubscriptionsInGroup() {
    public void testGetSubscriptionsInGroup() {
        doReturn(new int[]{1, 2}).when(mSubscriptionManager).getCompleteActiveSubscriptionIdList();

        insertSubscription(FAKE_SUBSCRIPTION_INFO1);
        insertSubscription(FAKE_SUBSCRIPTION_INFO1);
        SubscriptionInfoInternal anotherSubInfo =
        SubscriptionInfoInternal anotherSubInfo =
                new SubscriptionInfoInternal.Builder(FAKE_SUBSCRIPTION_INFO2)
                new SubscriptionInfoInternal.Builder(FAKE_SUBSCRIPTION_INFO2)
@@ -665,7 +676,6 @@ public class SubscriptionManagerServiceTest extends TelephonyTest {


    @Test
    @Test
    public void testGetActiveSubscriptionInfoList() {
    public void testGetActiveSubscriptionInfoList() {
        doReturn(new int[]{1}).when(mSubscriptionManager).getCompleteActiveSubscriptionIdList();
        // Grant MODIFY_PHONE_STATE permission for insertion.
        // Grant MODIFY_PHONE_STATE permission for insertion.
        mContextFixture.addCallingOrSelfPermission(Manifest.permission.MODIFY_PHONE_STATE);
        mContextFixture.addCallingOrSelfPermission(Manifest.permission.MODIFY_PHONE_STATE);
        insertSubscription(FAKE_SUBSCRIPTION_INFO1);
        insertSubscription(FAKE_SUBSCRIPTION_INFO1);
@@ -843,7 +853,6 @@ public class SubscriptionManagerServiceTest extends TelephonyTest {


    @Test
    @Test
    public void testGetActiveSubInfoCount() {
    public void testGetActiveSubInfoCount() {
        doReturn(new int[]{1, 2}).when(mSubscriptionManager).getCompleteActiveSubscriptionIdList();
        insertSubscription(FAKE_SUBSCRIPTION_INFO1);
        insertSubscription(FAKE_SUBSCRIPTION_INFO1);
        insertSubscription(FAKE_SUBSCRIPTION_INFO2);
        insertSubscription(FAKE_SUBSCRIPTION_INFO2);


@@ -1011,7 +1020,6 @@ public class SubscriptionManagerServiceTest extends TelephonyTest {


    @Test
    @Test
    public void testSetUsageSetting() {
    public void testSetUsageSetting() {
        doReturn(new int[]{1}).when(mSubscriptionManager).getCompleteActiveSubscriptionIdList();
        insertSubscription(FAKE_SUBSCRIPTION_INFO1);
        insertSubscription(FAKE_SUBSCRIPTION_INFO1);


        // Should fail without MODIFY_PHONE_STATE
        // Should fail without MODIFY_PHONE_STATE
@@ -1056,7 +1064,6 @@ public class SubscriptionManagerServiceTest extends TelephonyTest {


    @Test
    @Test
    public void testSetOpportunistic() {
    public void testSetOpportunistic() {
        doReturn(new int[]{1}).when(mSubscriptionManager).getCompleteActiveSubscriptionIdList();
        insertSubscription(FAKE_SUBSCRIPTION_INFO1);
        insertSubscription(FAKE_SUBSCRIPTION_INFO1);


        // Should fail without MODIFY_PHONE_STATE
        // Should fail without MODIFY_PHONE_STATE
@@ -1800,4 +1807,14 @@ public class SubscriptionManagerServiceTest extends TelephonyTest {
        assertThat(subInfo.getAllowedNetworkTypesForReasons()).isEqualTo("user="
        assertThat(subInfo.getAllowedNetworkTypesForReasons()).isEqualTo("user="
                + RadioAccessFamily.getRafFromNetworkType(RILConstants.PREFERRED_NETWORK_MODE));
                + RadioAccessFamily.getRafFromNetworkType(RILConstants.PREFERRED_NETWORK_MODE));
    }
    }

    @Test
    public void testGroupDisable() {
        insertSubscription(FAKE_SUBSCRIPTION_INFO1);
        insertSubscription(new SubscriptionInfoInternal.Builder(FAKE_SUBSCRIPTION_INFO2)
                .setGroupUuid(FAKE_UUID1).build());

        assertThat(mSubscriptionManagerServiceUT.getSubscriptionInfo(2).isGroupDisabled())
                .isFalse();
    }
}
}