Loading src/java/com/android/internal/telephony/SubscriptionController.java +95 −4 Original line number Diff line number Diff line Loading @@ -61,6 +61,7 @@ import java.util.Map.Entry; import java.util.Objects; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Collectors; /** Loading @@ -84,9 +85,13 @@ public class SubscriptionController extends ISub.Stub { static final String LOG_TAG = "SubscriptionController"; static final boolean DBG = true; static final boolean VDBG = false; static final boolean DBG_CACHE = false; static final int MAX_LOCAL_LOG_LINES = 500; // TODO: Reduce to 100 when 17678050 is fixed private ScLocalLog mLocalLog = new ScLocalLog(MAX_LOCAL_LOG_LINES); /* The Cache of Active SubInfoRecord(s) list of currently in use SubInfoRecord(s) */ private AtomicReference<List<SubscriptionInfo>> mCacheActiveSubInfoList = new AtomicReference(); /** * Copied from android.util.LocalLog with flush() adding flush and line number * TODO: Update LocalLog Loading Loading @@ -590,6 +595,43 @@ public class SubscriptionController extends ISub.Stub { return null; } // Get the active subscription info list from the cache if the cache is not null List<SubscriptionInfo> tmpCachedSubList = mCacheActiveSubInfoList.get(); if (tmpCachedSubList != null) { if (DBG_CACHE) { for (SubscriptionInfo si : tmpCachedSubList) { logd("[getActiveSubscriptionInfoList] Getting Cached subInfo=" + si); } } return new ArrayList<SubscriptionInfo>(tmpCachedSubList); } else { if (DBG_CACHE) { logd("[getActiveSubscriptionInfoList] Cached subInfo is null"); } return null; } } finally { Binder.restoreCallingIdentity(identity); } } /** * Refresh the cache of SubInfoRecord(s) of the currently inserted SIM(s) */ @VisibleForTesting protected void refreshCachedActiveSubscriptionInfoList() { // Now that all security checks passes, perform the operation as ourselves. final long identity = Binder.clearCallingIdentity(); try { if (!isSubInfoReady()) { if (DBG_CACHE) { logdl("[refreshCachedActiveSubscriptionInfoList] " + "Sub Controller not ready "); } return; } List<SubscriptionInfo> subList = getSubInfo( SubscriptionManager.SIM_SLOT_INDEX + ">=0", null); Loading @@ -597,12 +639,21 @@ public class SubscriptionController extends ISub.Stub { // FIXME: Unnecessary when an insertion sort is used! subList.sort(SUBSCRIPTION_INFO_COMPARATOR); if (VDBG) logdl("[getActiveSubInfoList]- " + subList.size() + " infos return"); if (DBG_CACHE) { logdl("[refreshCachedActiveSubscriptionInfoList]- " + subList.size() + " infos return"); } } else { if (DBG) logdl("[getActiveSubInfoList]- no info return"); if (DBG_CACHE) logdl("[refreshCachedActiveSubscriptionInfoList]- no info return"); } return subList; if (DBG_CACHE) { for (SubscriptionInfo si : subList) { logd("[refreshCachedActiveSubscriptionInfoList] Setting Cached subInfo=" + si); } } mCacheActiveSubInfoList.set(subList); } finally { Binder.restoreCallingIdentity(identity); } Loading Loading @@ -883,6 +934,9 @@ public class SubscriptionController extends ISub.Stub { resolver.update(SubscriptionManager.CONTENT_URI, value, SubscriptionManager.UNIQUE_KEY_SUBSCRIPTION_ID + "=" + Long.toString(subId), null); // Refresh the Cache of Active Subscription Info List refreshCachedActiveSubscriptionInfoList(); } if (DBG) logdl("[addSubInfoRecord] Record already exists"); Loading Loading @@ -976,6 +1030,9 @@ public class SubscriptionController extends ISub.Stub { SubscriptionManager.UNIQUE_KEY_SUBSCRIPTION_ID + "=" + Long.toString(subId), null); // Refresh the Cache of Active Subscription Info List refreshCachedActiveSubscriptionInfoList(); if (DBG) logdl("[addSubInfoRecord] sim name = " + nameToSet); } Loading Loading @@ -1008,7 +1065,13 @@ public class SubscriptionController extends ISub.Stub { value.put(SubscriptionManager.COLOR, color); value.put(SubscriptionManager.SIM_SLOT_INDEX, slotIndex); value.put(SubscriptionManager.CARRIER_NAME, ""); return resolver.insert(SubscriptionManager.CONTENT_URI, value); Uri uri = resolver.insert(SubscriptionManager.CONTENT_URI, value); // Refresh the Cache of Active Subscription Info List refreshCachedActiveSubscriptionInfoList(); return uri; } /** Loading Loading @@ -1074,6 +1137,10 @@ public class SubscriptionController extends ISub.Stub { int result = mContext.getContentResolver().update(SubscriptionManager.CONTENT_URI, value, SubscriptionManager.UNIQUE_KEY_SUBSCRIPTION_ID + "=" + Long.toString(subId), null); // Refresh the Cache of Active Subscription Info List refreshCachedActiveSubscriptionInfoList(); notifySubscriptionInfoChanged(); return result; Loading Loading @@ -1105,6 +1172,10 @@ public class SubscriptionController extends ISub.Stub { int result = mContext.getContentResolver().update(SubscriptionManager.CONTENT_URI, value, SubscriptionManager.UNIQUE_KEY_SUBSCRIPTION_ID + "=" + Long.toString(subId), null); // Refresh the Cache of Active Subscription Info List refreshCachedActiveSubscriptionInfoList(); notifySubscriptionInfoChanged(); return result; Loading Loading @@ -1165,6 +1236,10 @@ public class SubscriptionController extends ISub.Stub { int result = mContext.getContentResolver().update(SubscriptionManager.CONTENT_URI, value, SubscriptionManager.UNIQUE_KEY_SUBSCRIPTION_ID + "=" + Long.toString(subId), null); // Refresh the Cache of Active Subscription Info List refreshCachedActiveSubscriptionInfoList(); notifySubscriptionInfoChanged(); return result; Loading Loading @@ -1207,6 +1282,10 @@ public class SubscriptionController extends ISub.Stub { result = mContext.getContentResolver().update(SubscriptionManager.CONTENT_URI, value, SubscriptionManager.UNIQUE_KEY_SUBSCRIPTION_ID + "=" + Long.toString(subId), null); // Refresh the Cache of Active Subscription Info List refreshCachedActiveSubscriptionInfoList(); if (DBG) logd("[setDisplayNumber]- update result :" + result); notifySubscriptionInfoChanged(); Loading Loading @@ -1243,6 +1322,10 @@ public class SubscriptionController extends ISub.Stub { int result = mContext.getContentResolver().update(SubscriptionManager.CONTENT_URI, value, SubscriptionManager.UNIQUE_KEY_SUBSCRIPTION_ID + "=" + Long.toString(subId), null); // Refresh the Cache of Active Subscription Info List refreshCachedActiveSubscriptionInfoList(); notifySubscriptionInfoChanged(); return result; Loading Loading @@ -1273,6 +1356,10 @@ public class SubscriptionController extends ISub.Stub { int result = mContext.getContentResolver().update(SubscriptionManager.CONTENT_URI, value, SubscriptionManager.UNIQUE_KEY_SUBSCRIPTION_ID + "=" + Long.toString(subId), null); // Refresh the Cache of Active Subscription Info List refreshCachedActiveSubscriptionInfoList(); notifySubscriptionInfoChanged(); return result; Loading Loading @@ -1919,6 +2006,10 @@ public class SubscriptionController extends ISub.Stub { resolver.update(SubscriptionManager.CONTENT_URI, value, SubscriptionManager.UNIQUE_KEY_SUBSCRIPTION_ID + "=" + Integer.toString(subId), null); // Refresh the Cache of Active Subscription Info List refreshCachedActiveSubscriptionInfoList(); Binder.restoreCallingIdentity(token); } Loading src/java/com/android/internal/telephony/SubscriptionInfoUpdater.java +18 −0 Original line number Diff line number Diff line Loading @@ -425,6 +425,9 @@ public class SubscriptionInfoUpdater extends Handler { contentResolver.update(SubscriptionManager.CONTENT_URI, number, SubscriptionManager.UNIQUE_KEY_SUBSCRIPTION_ID + "=" + Long.toString(subId), null); // refresh Cached Active Subscription Info List SubscriptionController.getInstance().refreshCachedActiveSubscriptionInfoList(); } SubscriptionInfo subInfo = mSubscriptionManager.getActiveSubscriptionInfo(subId); Loading @@ -444,6 +447,9 @@ public class SubscriptionInfoUpdater extends Handler { contentResolver.update(SubscriptionManager.CONTENT_URI, name, SubscriptionManager.UNIQUE_KEY_SUBSCRIPTION_ID + "=" + Long.toString(subId), null); // refresh Cached Active Subscription Info List SubscriptionController.getInstance().refreshCachedActiveSubscriptionInfoList(); } /* Update preferred network type and network selection mode on SIM change. Loading Loading @@ -575,6 +581,9 @@ public class SubscriptionInfoUpdater extends Handler { contentResolver.update(SubscriptionManager.CONTENT_URI, value, SubscriptionManager.UNIQUE_KEY_SUBSCRIPTION_ID + "=" + Integer.toString(oldSubInfo.get(0).getSubscriptionId()), null); // refresh Cached Active Subscription Info List SubscriptionController.getInstance().refreshCachedActiveSubscriptionInfoList(); } } else { if (mInsertSimState[i] == SIM_NOT_CHANGE) { Loading Loading @@ -652,6 +661,9 @@ public class SubscriptionInfoUpdater extends Handler { contentResolver.update(SubscriptionManager.CONTENT_URI, value, SubscriptionManager.UNIQUE_KEY_SUBSCRIPTION_ID + "=" + Integer.toString(temp.getSubscriptionId()), null); // refresh Cached Active Subscription Info List SubscriptionController.getInstance().refreshCachedActiveSubscriptionInfoList(); } } Loading Loading @@ -724,6 +736,9 @@ public class SubscriptionInfoUpdater extends Handler { values.put(SubscriptionManager.NAME_SOURCE, SubscriptionManager.NAME_SOURCE_USER_INPUT); contentResolver.update(SubscriptionManager.CONTENT_URI, values, SubscriptionManager.ICC_ID + "=\"" + embeddedProfile.iccid + "\"", null); // refresh Cached Active Subscription Info List SubscriptionController.getInstance().refreshCachedActiveSubscriptionInfoList(); } // Remove all remaining subscriptions which have embedded = true. We set embedded to false Loading @@ -743,6 +758,9 @@ public class SubscriptionInfoUpdater extends Handler { ContentValues values = new ContentValues(); values.put(SubscriptionManager.IS_EMBEDDED, 0); contentResolver.update(SubscriptionManager.CONTENT_URI, values, whereClause, null); // refresh Cached Active Subscription Info List SubscriptionController.getInstance().refreshCachedActiveSubscriptionInfoList(); } } Loading tests/telephonytests/src/com/android/internal/telephony/SubscriptionControllerTest.java +27 −0 Original line number Diff line number Diff line Loading @@ -242,6 +242,33 @@ public class SubscriptionControllerTest extends TelephonyTest { captorIntent.getValue().getAction()); } @Test @SmallTest public void testSetGetDisplayNameSrc() { testInsertSim(); /* Get SUB ID */ int[] subIds = mSubscriptionControllerUT.getActiveSubIdList(); assertTrue(subIds != null && subIds.length != 0); int subID = subIds[0]; /* Setting */ String disName = "TESTING"; long nameSource = 1; mSubscriptionControllerUT.setDisplayNameUsingSrc(disName, subID, nameSource); SubscriptionInfo subInfo = mSubscriptionControllerUT .getActiveSubscriptionInfo(subID, mCallingPackage); assertNotNull(subInfo); assertEquals(disName, subInfo.getDisplayName()); assertEquals(nameSource, subInfo.getNameSource()); /* verify broadcast intent */ ArgumentCaptor<Intent> captorIntent = ArgumentCaptor.forClass(Intent.class); verify(mContext, atLeast(1)).sendBroadcast(captorIntent.capture()); assertEquals(TelephonyIntents.ACTION_SUBINFO_RECORD_UPDATED, captorIntent.getValue().getAction()); } @Test @SmallTest public void testCleanUpSIM() { testInsertSim(); Loading Loading
src/java/com/android/internal/telephony/SubscriptionController.java +95 −4 Original line number Diff line number Diff line Loading @@ -61,6 +61,7 @@ import java.util.Map.Entry; import java.util.Objects; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Collectors; /** Loading @@ -84,9 +85,13 @@ public class SubscriptionController extends ISub.Stub { static final String LOG_TAG = "SubscriptionController"; static final boolean DBG = true; static final boolean VDBG = false; static final boolean DBG_CACHE = false; static final int MAX_LOCAL_LOG_LINES = 500; // TODO: Reduce to 100 when 17678050 is fixed private ScLocalLog mLocalLog = new ScLocalLog(MAX_LOCAL_LOG_LINES); /* The Cache of Active SubInfoRecord(s) list of currently in use SubInfoRecord(s) */ private AtomicReference<List<SubscriptionInfo>> mCacheActiveSubInfoList = new AtomicReference(); /** * Copied from android.util.LocalLog with flush() adding flush and line number * TODO: Update LocalLog Loading Loading @@ -590,6 +595,43 @@ public class SubscriptionController extends ISub.Stub { return null; } // Get the active subscription info list from the cache if the cache is not null List<SubscriptionInfo> tmpCachedSubList = mCacheActiveSubInfoList.get(); if (tmpCachedSubList != null) { if (DBG_CACHE) { for (SubscriptionInfo si : tmpCachedSubList) { logd("[getActiveSubscriptionInfoList] Getting Cached subInfo=" + si); } } return new ArrayList<SubscriptionInfo>(tmpCachedSubList); } else { if (DBG_CACHE) { logd("[getActiveSubscriptionInfoList] Cached subInfo is null"); } return null; } } finally { Binder.restoreCallingIdentity(identity); } } /** * Refresh the cache of SubInfoRecord(s) of the currently inserted SIM(s) */ @VisibleForTesting protected void refreshCachedActiveSubscriptionInfoList() { // Now that all security checks passes, perform the operation as ourselves. final long identity = Binder.clearCallingIdentity(); try { if (!isSubInfoReady()) { if (DBG_CACHE) { logdl("[refreshCachedActiveSubscriptionInfoList] " + "Sub Controller not ready "); } return; } List<SubscriptionInfo> subList = getSubInfo( SubscriptionManager.SIM_SLOT_INDEX + ">=0", null); Loading @@ -597,12 +639,21 @@ public class SubscriptionController extends ISub.Stub { // FIXME: Unnecessary when an insertion sort is used! subList.sort(SUBSCRIPTION_INFO_COMPARATOR); if (VDBG) logdl("[getActiveSubInfoList]- " + subList.size() + " infos return"); if (DBG_CACHE) { logdl("[refreshCachedActiveSubscriptionInfoList]- " + subList.size() + " infos return"); } } else { if (DBG) logdl("[getActiveSubInfoList]- no info return"); if (DBG_CACHE) logdl("[refreshCachedActiveSubscriptionInfoList]- no info return"); } return subList; if (DBG_CACHE) { for (SubscriptionInfo si : subList) { logd("[refreshCachedActiveSubscriptionInfoList] Setting Cached subInfo=" + si); } } mCacheActiveSubInfoList.set(subList); } finally { Binder.restoreCallingIdentity(identity); } Loading Loading @@ -883,6 +934,9 @@ public class SubscriptionController extends ISub.Stub { resolver.update(SubscriptionManager.CONTENT_URI, value, SubscriptionManager.UNIQUE_KEY_SUBSCRIPTION_ID + "=" + Long.toString(subId), null); // Refresh the Cache of Active Subscription Info List refreshCachedActiveSubscriptionInfoList(); } if (DBG) logdl("[addSubInfoRecord] Record already exists"); Loading Loading @@ -976,6 +1030,9 @@ public class SubscriptionController extends ISub.Stub { SubscriptionManager.UNIQUE_KEY_SUBSCRIPTION_ID + "=" + Long.toString(subId), null); // Refresh the Cache of Active Subscription Info List refreshCachedActiveSubscriptionInfoList(); if (DBG) logdl("[addSubInfoRecord] sim name = " + nameToSet); } Loading Loading @@ -1008,7 +1065,13 @@ public class SubscriptionController extends ISub.Stub { value.put(SubscriptionManager.COLOR, color); value.put(SubscriptionManager.SIM_SLOT_INDEX, slotIndex); value.put(SubscriptionManager.CARRIER_NAME, ""); return resolver.insert(SubscriptionManager.CONTENT_URI, value); Uri uri = resolver.insert(SubscriptionManager.CONTENT_URI, value); // Refresh the Cache of Active Subscription Info List refreshCachedActiveSubscriptionInfoList(); return uri; } /** Loading Loading @@ -1074,6 +1137,10 @@ public class SubscriptionController extends ISub.Stub { int result = mContext.getContentResolver().update(SubscriptionManager.CONTENT_URI, value, SubscriptionManager.UNIQUE_KEY_SUBSCRIPTION_ID + "=" + Long.toString(subId), null); // Refresh the Cache of Active Subscription Info List refreshCachedActiveSubscriptionInfoList(); notifySubscriptionInfoChanged(); return result; Loading Loading @@ -1105,6 +1172,10 @@ public class SubscriptionController extends ISub.Stub { int result = mContext.getContentResolver().update(SubscriptionManager.CONTENT_URI, value, SubscriptionManager.UNIQUE_KEY_SUBSCRIPTION_ID + "=" + Long.toString(subId), null); // Refresh the Cache of Active Subscription Info List refreshCachedActiveSubscriptionInfoList(); notifySubscriptionInfoChanged(); return result; Loading Loading @@ -1165,6 +1236,10 @@ public class SubscriptionController extends ISub.Stub { int result = mContext.getContentResolver().update(SubscriptionManager.CONTENT_URI, value, SubscriptionManager.UNIQUE_KEY_SUBSCRIPTION_ID + "=" + Long.toString(subId), null); // Refresh the Cache of Active Subscription Info List refreshCachedActiveSubscriptionInfoList(); notifySubscriptionInfoChanged(); return result; Loading Loading @@ -1207,6 +1282,10 @@ public class SubscriptionController extends ISub.Stub { result = mContext.getContentResolver().update(SubscriptionManager.CONTENT_URI, value, SubscriptionManager.UNIQUE_KEY_SUBSCRIPTION_ID + "=" + Long.toString(subId), null); // Refresh the Cache of Active Subscription Info List refreshCachedActiveSubscriptionInfoList(); if (DBG) logd("[setDisplayNumber]- update result :" + result); notifySubscriptionInfoChanged(); Loading Loading @@ -1243,6 +1322,10 @@ public class SubscriptionController extends ISub.Stub { int result = mContext.getContentResolver().update(SubscriptionManager.CONTENT_URI, value, SubscriptionManager.UNIQUE_KEY_SUBSCRIPTION_ID + "=" + Long.toString(subId), null); // Refresh the Cache of Active Subscription Info List refreshCachedActiveSubscriptionInfoList(); notifySubscriptionInfoChanged(); return result; Loading Loading @@ -1273,6 +1356,10 @@ public class SubscriptionController extends ISub.Stub { int result = mContext.getContentResolver().update(SubscriptionManager.CONTENT_URI, value, SubscriptionManager.UNIQUE_KEY_SUBSCRIPTION_ID + "=" + Long.toString(subId), null); // Refresh the Cache of Active Subscription Info List refreshCachedActiveSubscriptionInfoList(); notifySubscriptionInfoChanged(); return result; Loading Loading @@ -1919,6 +2006,10 @@ public class SubscriptionController extends ISub.Stub { resolver.update(SubscriptionManager.CONTENT_URI, value, SubscriptionManager.UNIQUE_KEY_SUBSCRIPTION_ID + "=" + Integer.toString(subId), null); // Refresh the Cache of Active Subscription Info List refreshCachedActiveSubscriptionInfoList(); Binder.restoreCallingIdentity(token); } Loading
src/java/com/android/internal/telephony/SubscriptionInfoUpdater.java +18 −0 Original line number Diff line number Diff line Loading @@ -425,6 +425,9 @@ public class SubscriptionInfoUpdater extends Handler { contentResolver.update(SubscriptionManager.CONTENT_URI, number, SubscriptionManager.UNIQUE_KEY_SUBSCRIPTION_ID + "=" + Long.toString(subId), null); // refresh Cached Active Subscription Info List SubscriptionController.getInstance().refreshCachedActiveSubscriptionInfoList(); } SubscriptionInfo subInfo = mSubscriptionManager.getActiveSubscriptionInfo(subId); Loading @@ -444,6 +447,9 @@ public class SubscriptionInfoUpdater extends Handler { contentResolver.update(SubscriptionManager.CONTENT_URI, name, SubscriptionManager.UNIQUE_KEY_SUBSCRIPTION_ID + "=" + Long.toString(subId), null); // refresh Cached Active Subscription Info List SubscriptionController.getInstance().refreshCachedActiveSubscriptionInfoList(); } /* Update preferred network type and network selection mode on SIM change. Loading Loading @@ -575,6 +581,9 @@ public class SubscriptionInfoUpdater extends Handler { contentResolver.update(SubscriptionManager.CONTENT_URI, value, SubscriptionManager.UNIQUE_KEY_SUBSCRIPTION_ID + "=" + Integer.toString(oldSubInfo.get(0).getSubscriptionId()), null); // refresh Cached Active Subscription Info List SubscriptionController.getInstance().refreshCachedActiveSubscriptionInfoList(); } } else { if (mInsertSimState[i] == SIM_NOT_CHANGE) { Loading Loading @@ -652,6 +661,9 @@ public class SubscriptionInfoUpdater extends Handler { contentResolver.update(SubscriptionManager.CONTENT_URI, value, SubscriptionManager.UNIQUE_KEY_SUBSCRIPTION_ID + "=" + Integer.toString(temp.getSubscriptionId()), null); // refresh Cached Active Subscription Info List SubscriptionController.getInstance().refreshCachedActiveSubscriptionInfoList(); } } Loading Loading @@ -724,6 +736,9 @@ public class SubscriptionInfoUpdater extends Handler { values.put(SubscriptionManager.NAME_SOURCE, SubscriptionManager.NAME_SOURCE_USER_INPUT); contentResolver.update(SubscriptionManager.CONTENT_URI, values, SubscriptionManager.ICC_ID + "=\"" + embeddedProfile.iccid + "\"", null); // refresh Cached Active Subscription Info List SubscriptionController.getInstance().refreshCachedActiveSubscriptionInfoList(); } // Remove all remaining subscriptions which have embedded = true. We set embedded to false Loading @@ -743,6 +758,9 @@ public class SubscriptionInfoUpdater extends Handler { ContentValues values = new ContentValues(); values.put(SubscriptionManager.IS_EMBEDDED, 0); contentResolver.update(SubscriptionManager.CONTENT_URI, values, whereClause, null); // refresh Cached Active Subscription Info List SubscriptionController.getInstance().refreshCachedActiveSubscriptionInfoList(); } } Loading
tests/telephonytests/src/com/android/internal/telephony/SubscriptionControllerTest.java +27 −0 Original line number Diff line number Diff line Loading @@ -242,6 +242,33 @@ public class SubscriptionControllerTest extends TelephonyTest { captorIntent.getValue().getAction()); } @Test @SmallTest public void testSetGetDisplayNameSrc() { testInsertSim(); /* Get SUB ID */ int[] subIds = mSubscriptionControllerUT.getActiveSubIdList(); assertTrue(subIds != null && subIds.length != 0); int subID = subIds[0]; /* Setting */ String disName = "TESTING"; long nameSource = 1; mSubscriptionControllerUT.setDisplayNameUsingSrc(disName, subID, nameSource); SubscriptionInfo subInfo = mSubscriptionControllerUT .getActiveSubscriptionInfo(subID, mCallingPackage); assertNotNull(subInfo); assertEquals(disName, subInfo.getDisplayName()); assertEquals(nameSource, subInfo.getNameSource()); /* verify broadcast intent */ ArgumentCaptor<Intent> captorIntent = ArgumentCaptor.forClass(Intent.class); verify(mContext, atLeast(1)).sendBroadcast(captorIntent.capture()); assertEquals(TelephonyIntents.ACTION_SUBINFO_RECORD_UPDATED, captorIntent.getValue().getAction()); } @Test @SmallTest public void testCleanUpSIM() { testInsertSim(); Loading