[Mainline] Copy the method getSelectableSubscriptionInfoList from SubscriptionManager to Settings
Bug: 147206736 Test: make RunSettingsRoboTests -j ROBOTEST_FILTER=SubscriptionUtilTest make RunSettingsRoboTests -j ROBOTEST_FILTER=MobileDataSliceTest Change-Id: I6d7e72a656723c0620d579e1e223945e2a3588af
This commit is contained in:
@@ -32,7 +32,9 @@ import android.text.TextUtils;
|
||||
import androidx.annotation.VisibleForTesting;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class SubscriptionUtil {
|
||||
private static final String TAG = "SubscriptionUtil";
|
||||
@@ -79,12 +81,7 @@ public class SubscriptionUtil {
|
||||
if (sAvailableResultsForTesting != null) {
|
||||
return sAvailableResultsForTesting;
|
||||
}
|
||||
final SubscriptionManager subMgr = context.getSystemService(SubscriptionManager.class);
|
||||
|
||||
final List<SubscriptionInfo> subscriptions =
|
||||
new ArrayList<>(emptyIfNull(subMgr.getSelectableSubscriptionInfoList()));
|
||||
|
||||
return subscriptions;
|
||||
return new ArrayList<>(emptyIfNull(getSelectableSubscriptionInfoList(context)));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -242,4 +239,70 @@ public class SubscriptionUtil {
|
||||
}
|
||||
return info.getSimSlotIndex();
|
||||
}
|
||||
|
||||
/**
|
||||
* Return a list of subscriptions that are available and visible to the user.
|
||||
*
|
||||
* @return list of user selectable subscriptions.
|
||||
*/
|
||||
public static List<SubscriptionInfo> getSelectableSubscriptionInfoList(Context context) {
|
||||
SubscriptionManager subManager = context.getSystemService(SubscriptionManager.class);
|
||||
List<SubscriptionInfo> availableList = subManager.getAvailableSubscriptionInfoList();
|
||||
if (availableList == null) {
|
||||
return null;
|
||||
} else {
|
||||
// Multiple subscriptions in a group should only have one representative.
|
||||
// It should be the current active primary subscription if any, or any
|
||||
// primary subscription.
|
||||
List<SubscriptionInfo> selectableList = new ArrayList<>();
|
||||
Map<ParcelUuid, SubscriptionInfo> groupMap = new HashMap<>();
|
||||
|
||||
for (SubscriptionInfo info : availableList) {
|
||||
// Opportunistic subscriptions are considered invisible
|
||||
// to users so they should never be returned.
|
||||
if (!isSubscriptionVisible(subManager, context, info)) continue;
|
||||
|
||||
ParcelUuid groupUuid = info.getGroupUuid();
|
||||
if (groupUuid == null) {
|
||||
// Doesn't belong to any group. Add in the list.
|
||||
selectableList.add(info);
|
||||
} else if (!groupMap.containsKey(groupUuid)
|
||||
|| (groupMap.get(groupUuid).getSimSlotIndex() == INVALID_SIM_SLOT_INDEX
|
||||
&& info.getSimSlotIndex() != INVALID_SIM_SLOT_INDEX)) {
|
||||
// If it belongs to a group that has never been recorded or it's the current
|
||||
// active subscription, add it in the list.
|
||||
selectableList.remove(groupMap.get(groupUuid));
|
||||
selectableList.add(info);
|
||||
groupMap.put(groupUuid, info);
|
||||
}
|
||||
|
||||
}
|
||||
return selectableList;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Whether a subscription is visible to API caller. If it's a bundled opportunistic
|
||||
* subscription, it should be hidden anywhere in Settings, dialer, status bar etc.
|
||||
* Exception is if caller owns carrier privilege, in which case they will
|
||||
* want to see their own hidden subscriptions.
|
||||
*
|
||||
* @param info the subscriptionInfo to check against.
|
||||
* @return true if this subscription should be visible to the API caller.
|
||||
*/
|
||||
private static boolean isSubscriptionVisible(
|
||||
SubscriptionManager subscriptionManager, Context context, SubscriptionInfo info) {
|
||||
if (info == null) return false;
|
||||
// If subscription is NOT grouped opportunistic subscription, it's visible.
|
||||
if (info.getGroupUuid() == null || !info.isOpportunistic()) return true;
|
||||
|
||||
// If the caller is the carrier app and owns the subscription, it should be visible
|
||||
// to the caller.
|
||||
TelephonyManager telephonyManager = context.getSystemService(TelephonyManager.class)
|
||||
.createForSubscriptionId(info.getSubscriptionId());
|
||||
boolean hasCarrierPrivilegePermission = telephonyManager.hasCarrierPrivileges()
|
||||
|| subscriptionManager.canManageSubscription(info);
|
||||
return hasCarrierPrivilegePermission;
|
||||
}
|
||||
}
|
||||
|
@@ -39,6 +39,7 @@ import androidx.slice.builders.SliceAction;
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.Utils;
|
||||
import com.android.settings.network.MobileDataContentObserver;
|
||||
import com.android.settings.network.SubscriptionUtil;
|
||||
import com.android.settings.slices.CustomSliceRegistry;
|
||||
import com.android.settings.slices.CustomSliceable;
|
||||
import com.android.settings.slices.SliceBackgroundWorker;
|
||||
@@ -177,7 +178,7 @@ public class MobileDataSlice implements CustomSliceable {
|
||||
*/
|
||||
private boolean isMobileDataAvailable() {
|
||||
final List<SubscriptionInfo> subInfoList =
|
||||
mSubscriptionManager.getSelectableSubscriptionInfoList();
|
||||
SubscriptionUtil.getSelectableSubscriptionInfoList(mContext);
|
||||
|
||||
return !(subInfoList == null || subInfoList.isEmpty());
|
||||
}
|
||||
|
@@ -62,7 +62,7 @@ public class SubscriptionUtilTest {
|
||||
|
||||
@Test
|
||||
public void getAvailableSubscriptions_nullInfoFromSubscriptionManager_nonNullResult() {
|
||||
when(mSubMgr.getSelectableSubscriptionInfoList()).thenReturn(null);
|
||||
when(mSubMgr.getAvailableSubscriptionInfoList()).thenReturn(null);
|
||||
final List<SubscriptionInfo> subs = SubscriptionUtil.getAvailableSubscriptions(mContext);
|
||||
assertThat(subs).isNotNull();
|
||||
assertThat(subs).isEmpty();
|
||||
@@ -71,7 +71,7 @@ public class SubscriptionUtilTest {
|
||||
@Test
|
||||
public void getAvailableSubscriptions_oneSubscription_oneResult() {
|
||||
final SubscriptionInfo info = mock(SubscriptionInfo.class);
|
||||
when(mSubMgr.getSelectableSubscriptionInfoList()).thenReturn(Arrays.asList(info));
|
||||
when(mSubMgr.getAvailableSubscriptionInfoList()).thenReturn(Arrays.asList(info));
|
||||
final List<SubscriptionInfo> subs = SubscriptionUtil.getAvailableSubscriptions(mContext);
|
||||
assertThat(subs).isNotNull();
|
||||
assertThat(subs).hasSize(1);
|
||||
@@ -81,7 +81,7 @@ public class SubscriptionUtilTest {
|
||||
public void getAvailableSubscriptions_twoSubscriptions_twoResults() {
|
||||
final SubscriptionInfo info1 = mock(SubscriptionInfo.class);
|
||||
final SubscriptionInfo info2 = mock(SubscriptionInfo.class);
|
||||
when(mSubMgr.getSelectableSubscriptionInfoList()).thenReturn(Arrays.asList(info1, info2));
|
||||
when(mSubMgr.getAvailableSubscriptionInfoList()).thenReturn(Arrays.asList(info1, info2));
|
||||
final List<SubscriptionInfo> subs = SubscriptionUtil.getAvailableSubscriptions(mContext);
|
||||
assertThat(subs).isNotNull();
|
||||
assertThat(subs).hasSize(2);
|
||||
@@ -106,7 +106,7 @@ public class SubscriptionUtilTest {
|
||||
when(info3.getSimSlotIndex()).thenReturn(0);
|
||||
when(info3.getCardString()).thenReturn("info3_cardid");
|
||||
|
||||
when(mSubMgr.getSelectableSubscriptionInfoList()).thenReturn(Arrays.asList(info1));
|
||||
when(mSubMgr.getAvailableSubscriptionInfoList()).thenReturn(Arrays.asList(info1));
|
||||
when(mSubMgr.getAllSubscriptionInfoList()).thenReturn(Arrays.asList(info1, info2, info3));
|
||||
|
||||
final UiccSlotInfo info2slot = mock(UiccSlotInfo.class);
|
||||
|
@@ -24,8 +24,8 @@ import static org.mockito.Mockito.doReturn;
|
||||
import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.times;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import android.app.PendingIntent;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.provider.Settings;
|
||||
@@ -79,9 +79,8 @@ public class MobileDataSliceTest {
|
||||
doReturn(mTelephonyManager).when(mTelephonyManager).createForSubscriptionId(SUB_ID);
|
||||
doReturn(mSubscriptionInfo).when(mSubscriptionManager).getActiveSubscriptionInfo(anyInt());
|
||||
doReturn(SUB_ID).when(mSubscriptionInfo).getSubscriptionId();
|
||||
doReturn(new ArrayList<>(Arrays.asList(mSubscriptionInfo)))
|
||||
.when(mSubscriptionManager).getSelectableSubscriptionInfoList();
|
||||
|
||||
when(mSubscriptionManager.getAvailableSubscriptionInfoList()).thenReturn(
|
||||
Arrays.asList(mSubscriptionInfo));
|
||||
|
||||
// Set-up specs for SliceMetadata.
|
||||
SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS);
|
||||
@@ -172,7 +171,7 @@ public class MobileDataSliceTest {
|
||||
|
||||
@Test
|
||||
public void isMobileDataAvailable_noSubscriptions_slicePrimaryActionIsEmpty() {
|
||||
doReturn(new ArrayList<>()).when(mSubscriptionManager).getSelectableSubscriptionInfoList();
|
||||
when(mSubscriptionManager.getAvailableSubscriptionInfoList()).thenReturn(new ArrayList<>());
|
||||
final Slice mobileData = mMobileDataSlice.getSlice();
|
||||
|
||||
assertThat(mobileData).isNull();
|
||||
@@ -180,7 +179,7 @@ public class MobileDataSliceTest {
|
||||
|
||||
@Test
|
||||
public void isMobileDataAvailable_nullSubscriptions_slicePrimaryActionIsEmpty() {
|
||||
doReturn(null).when(mSubscriptionManager).getSelectableSubscriptionInfoList();
|
||||
when(mSubscriptionManager.getAvailableSubscriptionInfoList()).thenReturn(null);
|
||||
final Slice mobileData = mMobileDataSlice.getSlice();
|
||||
|
||||
assertThat(mobileData).isNull();
|
||||
|
Reference in New Issue
Block a user