Loading src/java/com/android/internal/telephony/SubscriptionInfoUpdater.java +39 −6 Original line number Diff line number Diff line Loading @@ -33,6 +33,7 @@ import android.os.Message; import android.os.RemoteException; import android.os.ServiceManager; import android.os.UserHandle; import android.os.UserManager; import android.preference.PreferenceManager; import android.provider.Settings; import android.telephony.CarrierConfigManager; Loading @@ -50,9 +51,13 @@ import com.android.internal.telephony.uicc.IccUtils; import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import static android.Manifest.permission.READ_PHONE_STATE; import static android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE; /** *@hide Loading Loading @@ -102,6 +107,9 @@ public class SubscriptionInfoUpdater extends Handler { private static int[] mInsertSimState = new int[PROJECT_SIM_NUM]; private SubscriptionManager mSubscriptionManager = null; private IPackageManager mPackageManager; private UserManager mUserManager; private Map<Integer, Intent> rebroadcastIntentsOnUnlock = new HashMap<>(); // The current foreground user ID. private int mCurrentlyActiveUserId; private CarrierServiceBindHelper mCarrierServiceBindHelper; Loading @@ -113,9 +121,11 @@ public class SubscriptionInfoUpdater extends Handler { mPhone = phone; mSubscriptionManager = SubscriptionManager.from(mContext); mPackageManager = IPackageManager.Stub.asInterface(ServiceManager.getService("package")); mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE); IntentFilter intentFilter = new IntentFilter(TelephonyIntents.ACTION_SIM_STATE_CHANGED); intentFilter.addAction(IccCardProxy.ACTION_INTERNAL_SIM_STATE_CHANGED); intentFilter.addAction(Intent.ACTION_USER_UNLOCKED); mContext.registerReceiver(sReceiver, intentFilter); mCarrierServiceBindHelper = new CarrierServiceBindHelper(mContext); Loading Loading @@ -171,6 +181,25 @@ public class SubscriptionInfoUpdater extends Handler { String action = intent.getAction(); logd("Action: " + action); if (action.equals(Intent.ACTION_USER_UNLOCKED)) { // broadcast pending intents Iterator iterator = rebroadcastIntentsOnUnlock.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry pair = (Map.Entry) iterator.next(); Intent i = (Intent)pair.getValue(); iterator.remove(); logd("Broadcasting intent ACTION_SIM_STATE_CHANGED for mCardIndex: " + pair.getKey()); // Send broadcast twice, once for apps that have PRIVILEGED permission and once // for those that have the runtime one mContext.sendBroadcast(i, READ_PHONE_STATE); mContext.sendBroadcast(i, READ_PRIVILEGED_PHONE_STATE); } rebroadcastIntentsOnUnlock = null; logd("[Receiver]-"); return; } if (!action.equals(TelephonyIntents.ACTION_SIM_STATE_CHANGED) && !action.equals(IccCardProxy.ACTION_INTERNAL_SIM_STATE_CHANGED)) { return; Loading Loading @@ -649,11 +678,15 @@ public class SubscriptionInfoUpdater extends Handler { i.putExtra(IccCardConstants.INTENT_KEY_ICC_STATE, state); i.putExtra(IccCardConstants.INTENT_KEY_LOCKED_REASON, reason); SubscriptionManager.putPhoneIdAndSubIdExtra(i, slotId); logd("Broadcasting intent ACTION_SIM_STATE_CHANGED " + IccCardConstants.INTENT_VALUE_ICC_LOADED + " reason " + null + logd("Broadcasting intent ACTION_SIM_STATE_CHANGED " + state + " reason " + reason + " for mCardIndex: " + slotId); ActivityManagerNative.broadcastStickyIntent(i, READ_PHONE_STATE, UserHandle.USER_ALL); // Send broadcast twice, once for apps that have PRIVILEGED permission and once for those // that have the runtime one mContext.sendBroadcast(i, READ_PHONE_STATE); mContext.sendBroadcast(i, READ_PRIVILEGED_PHONE_STATE); if (!mUserManager.isUserUnlocked()) { rebroadcastIntentsOnUnlock.put(slotId, i); } } public void dispose() { Loading tests/telephonytests/src/com/android/internal/telephony/ContextFixture.java +21 −0 Original line number Diff line number Diff line Loading @@ -302,6 +302,23 @@ public class ContextFixture implements TestFixture<Context> { sendBroadcast(intent); } @Override public void sendBroadcastAsUser(Intent intent, UserHandle user) { sendBroadcast(intent); } @Override public void sendBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission) { sendBroadcast(intent); } @Override public void sendBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission, int appOp) { sendBroadcast(intent); } @Override public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler, Loading Loading @@ -395,6 +412,10 @@ public class ContextFixture implements TestFixture<Context> { public boolean testMethod1() { return true; } public boolean testMethod2() { return true; } } private final Multimap<String, ComponentName> mComponentNamesByAction = Loading tests/telephonytests/src/com/android/internal/telephony/SubscriptionInfoUpdaterTest.java +42 −4 Original line number Diff line number Diff line Loading @@ -15,6 +15,7 @@ */ package com.android.internal.telephony; import android.Manifest; import android.content.ContentProvider; import android.content.ContentValues; import android.content.Context; Loading @@ -24,6 +25,7 @@ import android.net.Uri; import android.os.AsyncResult; import android.os.HandlerThread; import android.os.Message; import android.provider.Telephony; import android.telephony.CarrierConfigManager; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; Loading @@ -40,6 +42,7 @@ import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; Loading @@ -48,6 +51,7 @@ import java.util.Arrays; import java.util.HashMap; import static com.android.internal.telephony.TelephonyTestUtils.waitForMs; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.any; import static org.mockito.Mockito.anyBoolean; import static org.mockito.Mockito.anyInt; Loading Loading @@ -221,13 +225,30 @@ public class SubscriptionInfoUpdaterTest extends TelephonyTest { .getSubInfoUsingSlotIdWithCheck(eq(0), anyBoolean(), anyString()); doReturn("89012604200000000000").when(mIccRecord).getFullIccId(); doReturn(FAKE_PLMN).when(mTelephonyManager).getSimOperatorNumericForPhone(0); Intent mIntent = new Intent(IccCardProxy.ACTION_INTERNAL_SIM_STATE_CHANGED); mIntent.putExtra(IccCardConstants.INTENT_KEY_ICC_STATE, Intent intentInternalSimStateChanged = new Intent(IccCardProxy.ACTION_INTERNAL_SIM_STATE_CHANGED); intentInternalSimStateChanged.putExtra(IccCardConstants.INTENT_KEY_ICC_STATE, IccCardConstants.INTENT_VALUE_ICC_LOADED); mIntent.putExtra(PhoneConstants.PHONE_KEY, 0); intentInternalSimStateChanged.putExtra(PhoneConstants.PHONE_KEY, 0); mContext.sendBroadcast(mIntent); mContext.sendBroadcast(intentInternalSimStateChanged); waitForMs(100); // verify SIM_STATE_CHANGED broadcast. It should be broadcast twice, once for // READ_PHONE_STATE and once for READ_PRIVILEGED_PHONE_STATE ArgumentCaptor<Intent> intentArgumentCaptor = ArgumentCaptor.forClass(Intent.class); ArgumentCaptor<String> stringArgumentCaptor = ArgumentCaptor.forClass(String.class); verify(mContext, times(2)).sendBroadcast(intentArgumentCaptor.capture(), stringArgumentCaptor.capture()); assertEquals(TelephonyIntents.ACTION_SIM_STATE_CHANGED, intentArgumentCaptor.getAllValues().get(0).getAction()); assertEquals(Manifest.permission.READ_PHONE_STATE, stringArgumentCaptor.getAllValues().get(0)); assertEquals(TelephonyIntents.ACTION_SIM_STATE_CHANGED, intentArgumentCaptor.getAllValues().get(1).getAction()); assertEquals(Manifest.permission.READ_PRIVILEGED_PHONE_STATE, stringArgumentCaptor.getAllValues().get(1)); SubscriptionManager mSubscriptionManager = SubscriptionManager.from(mContext); verify(mTelephonyManager).getSimOperatorNumericForPhone(0); verify(mSubscriptionManager, times(1)).addSubscriptionInfoRecord( Loading @@ -238,6 +259,23 @@ public class SubscriptionInfoUpdaterTest extends TelephonyTest { mContext.getSystemService(Context.CARRIER_CONFIG_SERVICE); verify(mConfigManager, times(1)).updateConfigForPhoneId(eq(0), eq(IccCardConstants.INTENT_VALUE_ICC_LOADED)); // ACTION_USER_UNLOCKED should trigger another SIM_STATE_CHANGED Intent intentSimStateChanged = new Intent(Intent.ACTION_USER_UNLOCKED); mContext.sendBroadcast(intentSimStateChanged); waitForMs(100); // verify SIM_STATE_CHANGED broadcast verify(mContext, times(4)).sendBroadcast(intentArgumentCaptor.capture(), stringArgumentCaptor.capture()); assertEquals(TelephonyIntents.ACTION_SIM_STATE_CHANGED, intentArgumentCaptor.getAllValues().get(2).getAction()); assertEquals(Manifest.permission.READ_PHONE_STATE, stringArgumentCaptor.getAllValues().get(2)); assertEquals(TelephonyIntents.ACTION_SIM_STATE_CHANGED, intentArgumentCaptor.getAllValues().get(3).getAction()); assertEquals(Manifest.permission.READ_PRIVILEGED_PHONE_STATE, stringArgumentCaptor.getAllValues().get(3)); } @Test Loading Loading
src/java/com/android/internal/telephony/SubscriptionInfoUpdater.java +39 −6 Original line number Diff line number Diff line Loading @@ -33,6 +33,7 @@ import android.os.Message; import android.os.RemoteException; import android.os.ServiceManager; import android.os.UserHandle; import android.os.UserManager; import android.preference.PreferenceManager; import android.provider.Settings; import android.telephony.CarrierConfigManager; Loading @@ -50,9 +51,13 @@ import com.android.internal.telephony.uicc.IccUtils; import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import static android.Manifest.permission.READ_PHONE_STATE; import static android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE; /** *@hide Loading Loading @@ -102,6 +107,9 @@ public class SubscriptionInfoUpdater extends Handler { private static int[] mInsertSimState = new int[PROJECT_SIM_NUM]; private SubscriptionManager mSubscriptionManager = null; private IPackageManager mPackageManager; private UserManager mUserManager; private Map<Integer, Intent> rebroadcastIntentsOnUnlock = new HashMap<>(); // The current foreground user ID. private int mCurrentlyActiveUserId; private CarrierServiceBindHelper mCarrierServiceBindHelper; Loading @@ -113,9 +121,11 @@ public class SubscriptionInfoUpdater extends Handler { mPhone = phone; mSubscriptionManager = SubscriptionManager.from(mContext); mPackageManager = IPackageManager.Stub.asInterface(ServiceManager.getService("package")); mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE); IntentFilter intentFilter = new IntentFilter(TelephonyIntents.ACTION_SIM_STATE_CHANGED); intentFilter.addAction(IccCardProxy.ACTION_INTERNAL_SIM_STATE_CHANGED); intentFilter.addAction(Intent.ACTION_USER_UNLOCKED); mContext.registerReceiver(sReceiver, intentFilter); mCarrierServiceBindHelper = new CarrierServiceBindHelper(mContext); Loading Loading @@ -171,6 +181,25 @@ public class SubscriptionInfoUpdater extends Handler { String action = intent.getAction(); logd("Action: " + action); if (action.equals(Intent.ACTION_USER_UNLOCKED)) { // broadcast pending intents Iterator iterator = rebroadcastIntentsOnUnlock.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry pair = (Map.Entry) iterator.next(); Intent i = (Intent)pair.getValue(); iterator.remove(); logd("Broadcasting intent ACTION_SIM_STATE_CHANGED for mCardIndex: " + pair.getKey()); // Send broadcast twice, once for apps that have PRIVILEGED permission and once // for those that have the runtime one mContext.sendBroadcast(i, READ_PHONE_STATE); mContext.sendBroadcast(i, READ_PRIVILEGED_PHONE_STATE); } rebroadcastIntentsOnUnlock = null; logd("[Receiver]-"); return; } if (!action.equals(TelephonyIntents.ACTION_SIM_STATE_CHANGED) && !action.equals(IccCardProxy.ACTION_INTERNAL_SIM_STATE_CHANGED)) { return; Loading Loading @@ -649,11 +678,15 @@ public class SubscriptionInfoUpdater extends Handler { i.putExtra(IccCardConstants.INTENT_KEY_ICC_STATE, state); i.putExtra(IccCardConstants.INTENT_KEY_LOCKED_REASON, reason); SubscriptionManager.putPhoneIdAndSubIdExtra(i, slotId); logd("Broadcasting intent ACTION_SIM_STATE_CHANGED " + IccCardConstants.INTENT_VALUE_ICC_LOADED + " reason " + null + logd("Broadcasting intent ACTION_SIM_STATE_CHANGED " + state + " reason " + reason + " for mCardIndex: " + slotId); ActivityManagerNative.broadcastStickyIntent(i, READ_PHONE_STATE, UserHandle.USER_ALL); // Send broadcast twice, once for apps that have PRIVILEGED permission and once for those // that have the runtime one mContext.sendBroadcast(i, READ_PHONE_STATE); mContext.sendBroadcast(i, READ_PRIVILEGED_PHONE_STATE); if (!mUserManager.isUserUnlocked()) { rebroadcastIntentsOnUnlock.put(slotId, i); } } public void dispose() { Loading
tests/telephonytests/src/com/android/internal/telephony/ContextFixture.java +21 −0 Original line number Diff line number Diff line Loading @@ -302,6 +302,23 @@ public class ContextFixture implements TestFixture<Context> { sendBroadcast(intent); } @Override public void sendBroadcastAsUser(Intent intent, UserHandle user) { sendBroadcast(intent); } @Override public void sendBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission) { sendBroadcast(intent); } @Override public void sendBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission, int appOp) { sendBroadcast(intent); } @Override public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler, Loading Loading @@ -395,6 +412,10 @@ public class ContextFixture implements TestFixture<Context> { public boolean testMethod1() { return true; } public boolean testMethod2() { return true; } } private final Multimap<String, ComponentName> mComponentNamesByAction = Loading
tests/telephonytests/src/com/android/internal/telephony/SubscriptionInfoUpdaterTest.java +42 −4 Original line number Diff line number Diff line Loading @@ -15,6 +15,7 @@ */ package com.android.internal.telephony; import android.Manifest; import android.content.ContentProvider; import android.content.ContentValues; import android.content.Context; Loading @@ -24,6 +25,7 @@ import android.net.Uri; import android.os.AsyncResult; import android.os.HandlerThread; import android.os.Message; import android.provider.Telephony; import android.telephony.CarrierConfigManager; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; Loading @@ -40,6 +42,7 @@ import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; Loading @@ -48,6 +51,7 @@ import java.util.Arrays; import java.util.HashMap; import static com.android.internal.telephony.TelephonyTestUtils.waitForMs; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.any; import static org.mockito.Mockito.anyBoolean; import static org.mockito.Mockito.anyInt; Loading Loading @@ -221,13 +225,30 @@ public class SubscriptionInfoUpdaterTest extends TelephonyTest { .getSubInfoUsingSlotIdWithCheck(eq(0), anyBoolean(), anyString()); doReturn("89012604200000000000").when(mIccRecord).getFullIccId(); doReturn(FAKE_PLMN).when(mTelephonyManager).getSimOperatorNumericForPhone(0); Intent mIntent = new Intent(IccCardProxy.ACTION_INTERNAL_SIM_STATE_CHANGED); mIntent.putExtra(IccCardConstants.INTENT_KEY_ICC_STATE, Intent intentInternalSimStateChanged = new Intent(IccCardProxy.ACTION_INTERNAL_SIM_STATE_CHANGED); intentInternalSimStateChanged.putExtra(IccCardConstants.INTENT_KEY_ICC_STATE, IccCardConstants.INTENT_VALUE_ICC_LOADED); mIntent.putExtra(PhoneConstants.PHONE_KEY, 0); intentInternalSimStateChanged.putExtra(PhoneConstants.PHONE_KEY, 0); mContext.sendBroadcast(mIntent); mContext.sendBroadcast(intentInternalSimStateChanged); waitForMs(100); // verify SIM_STATE_CHANGED broadcast. It should be broadcast twice, once for // READ_PHONE_STATE and once for READ_PRIVILEGED_PHONE_STATE ArgumentCaptor<Intent> intentArgumentCaptor = ArgumentCaptor.forClass(Intent.class); ArgumentCaptor<String> stringArgumentCaptor = ArgumentCaptor.forClass(String.class); verify(mContext, times(2)).sendBroadcast(intentArgumentCaptor.capture(), stringArgumentCaptor.capture()); assertEquals(TelephonyIntents.ACTION_SIM_STATE_CHANGED, intentArgumentCaptor.getAllValues().get(0).getAction()); assertEquals(Manifest.permission.READ_PHONE_STATE, stringArgumentCaptor.getAllValues().get(0)); assertEquals(TelephonyIntents.ACTION_SIM_STATE_CHANGED, intentArgumentCaptor.getAllValues().get(1).getAction()); assertEquals(Manifest.permission.READ_PRIVILEGED_PHONE_STATE, stringArgumentCaptor.getAllValues().get(1)); SubscriptionManager mSubscriptionManager = SubscriptionManager.from(mContext); verify(mTelephonyManager).getSimOperatorNumericForPhone(0); verify(mSubscriptionManager, times(1)).addSubscriptionInfoRecord( Loading @@ -238,6 +259,23 @@ public class SubscriptionInfoUpdaterTest extends TelephonyTest { mContext.getSystemService(Context.CARRIER_CONFIG_SERVICE); verify(mConfigManager, times(1)).updateConfigForPhoneId(eq(0), eq(IccCardConstants.INTENT_VALUE_ICC_LOADED)); // ACTION_USER_UNLOCKED should trigger another SIM_STATE_CHANGED Intent intentSimStateChanged = new Intent(Intent.ACTION_USER_UNLOCKED); mContext.sendBroadcast(intentSimStateChanged); waitForMs(100); // verify SIM_STATE_CHANGED broadcast verify(mContext, times(4)).sendBroadcast(intentArgumentCaptor.capture(), stringArgumentCaptor.capture()); assertEquals(TelephonyIntents.ACTION_SIM_STATE_CHANGED, intentArgumentCaptor.getAllValues().get(2).getAction()); assertEquals(Manifest.permission.READ_PHONE_STATE, stringArgumentCaptor.getAllValues().get(2)); assertEquals(TelephonyIntents.ACTION_SIM_STATE_CHANGED, intentArgumentCaptor.getAllValues().get(3).getAction()); assertEquals(Manifest.permission.READ_PRIVILEGED_PHONE_STATE, stringArgumentCaptor.getAllValues().get(3)); } @Test Loading