aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAmit Mahajan <amitmahajan@google.com>2016-05-19 00:13:50 +0000
committerandroid-build-merger <android-build-merger@google.com>2016-05-19 00:13:50 +0000
commitece01de16a6401d1824e83fabefe85ef49ae765d (patch)
tree1b462d2c0c4189be68dfcb2adac3282050984ef8
parent87a5e2001174ba19ce0056582493fb65b8ffb0b7 (diff)
parent41a58e19c420cf2301aceed5f02813d1e5646f11 (diff)
downloadandroid_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
-rw-r--r--src/java/com/android/internal/telephony/SubscriptionInfoUpdater.java45
-rw-r--r--tests/telephonytests/src/com/android/internal/telephony/ContextFixture.java21
-rw-r--r--tests/telephonytests/src/com/android/internal/telephony/SubscriptionInfoUpdaterTest.java46
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