diff options
author | Amit Mahajan <amitmahajan@google.com> | 2016-05-19 00:13:50 +0000 |
---|---|---|
committer | android-build-merger <android-build-merger@google.com> | 2016-05-19 00:13:50 +0000 |
commit | ece01de16a6401d1824e83fabefe85ef49ae765d (patch) | |
tree | 1b462d2c0c4189be68dfcb2adac3282050984ef8 | |
parent | 87a5e2001174ba19ce0056582493fb65b8ffb0b7 (diff) | |
parent | 41a58e19c420cf2301aceed5f02813d1e5646f11 (diff) | |
download | android_frameworks_opt_telephony-ece01de16a6401d1824e83fabefe85ef49ae765d.tar.gz android_frameworks_opt_telephony-ece01de16a6401d1824e83fabefe85ef49ae765d.tar.bz2 android_frameworks_opt_telephony-ece01de16a6401d1824e83fabefe85ef49ae765d.zip |
Merge "Rebroadcast SIM_STATE_CHANGED after USER_UNLOCKED." into nyc-dev
am: 41a58e19c4
* commit '41a58e19c420cf2301aceed5f02813d1e5646f11':
Rebroadcast SIM_STATE_CHANGED after USER_UNLOCKED.
Change-Id: Id7687fc382cbfb497e8ae524152ca200fbe47449
3 files changed, 102 insertions, 10 deletions
diff --git a/src/java/com/android/internal/telephony/SubscriptionInfoUpdater.java b/src/java/com/android/internal/telephony/SubscriptionInfoUpdater.java index d83a2cfc7..6604cf595 100644 --- a/src/java/com/android/internal/telephony/SubscriptionInfoUpdater.java +++ b/src/java/com/android/internal/telephony/SubscriptionInfoUpdater.java @@ -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; @@ -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 @@ -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; @@ -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); @@ -171,8 +181,27 @@ 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)) { + !action.equals(IccCardProxy.ACTION_INTERNAL_SIM_STATE_CHANGED)) { return; } @@ -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 + - " for mCardIndex : " + slotId); - ActivityManagerNative.broadcastStickyIntent(i, READ_PHONE_STATE, - UserHandle.USER_ALL); + logd("Broadcasting intent ACTION_SIM_STATE_CHANGED " + state + " reason " + reason + + " for mCardIndex: " + slotId); + // 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() { diff --git a/tests/telephonytests/src/com/android/internal/telephony/ContextFixture.java b/tests/telephonytests/src/com/android/internal/telephony/ContextFixture.java index c52cdee4b..e3d87827f 100644 --- a/tests/telephonytests/src/com/android/internal/telephony/ContextFixture.java +++ b/tests/telephonytests/src/com/android/internal/telephony/ContextFixture.java @@ -303,6 +303,23 @@ public class ContextFixture implements TestFixture<Context> { } @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, int initialCode, String initialData, Bundle initialExtras) { @@ -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 = diff --git a/tests/telephonytests/src/com/android/internal/telephony/SubscriptionInfoUpdaterTest.java b/tests/telephonytests/src/com/android/internal/telephony/SubscriptionInfoUpdaterTest.java index d05af5ad8..74a2c2f4e 100644 --- a/tests/telephonytests/src/com/android/internal/telephony/SubscriptionInfoUpdaterTest.java +++ b/tests/telephonytests/src/com/android/internal/telephony/SubscriptionInfoUpdaterTest.java @@ -15,6 +15,7 @@ */ package com.android.internal.telephony; +import android.Manifest; import android.content.ContentProvider; import android.content.ContentValues; import android.content.Context; @@ -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; @@ -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; @@ -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; @@ -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( @@ -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 |