aboutsummaryrefslogtreecommitdiff
path: root/src/java/com/android/internal/telephony/IntentBroadcaster.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/java/com/android/internal/telephony/IntentBroadcaster.java')
-rw-r--r--src/java/com/android/internal/telephony/IntentBroadcaster.java102
1 files changed, 102 insertions, 0 deletions
diff --git a/src/java/com/android/internal/telephony/IntentBroadcaster.java b/src/java/com/android/internal/telephony/IntentBroadcaster.java
new file mode 100644
index 0000000000..75288193d4
--- /dev/null
+++ b/src/java/com/android/internal/telephony/IntentBroadcaster.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.telephony;
+
+import android.app.ActivityManager;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.UserHandle;
+import android.util.Log;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+/**
+ * This class is used to broadcast intents that need to be rebroadcast after the device is unlocked.
+ * NOTE: Currently this is used only for SIM_STATE_CHANGED so logic is hardcoded for that;
+ * for example broadcasts are always sticky, only the last intent for the slotId is rebroadcast,
+ * etc.
+ */
+public class IntentBroadcaster {
+ private static final String TAG = "IntentBroadcaster";
+
+ private Map<Integer, Intent> mRebroadcastIntents = new HashMap<>();
+ private static IntentBroadcaster sIntentBroadcaster;
+
+ private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+ if (action.equals(Intent.ACTION_USER_UNLOCKED)) {
+ synchronized (mRebroadcastIntents) {
+ // rebroadcast intents
+ Iterator iterator = mRebroadcastIntents.entrySet().iterator();
+ while (iterator.hasNext()) {
+ Map.Entry pair = (Map.Entry) iterator.next();
+ Intent i = (Intent) pair.getValue();
+ i.putExtra(TelephonyIntents.EXTRA_REBROADCAST_ON_UNLOCK, true);
+ iterator.remove();
+ logd("Rebroadcasting intent " + i.getAction() + " "
+ + i.getStringExtra(IccCardConstants.INTENT_KEY_ICC_STATE)
+ + " for slotId " + pair.getKey());
+ ActivityManager.broadcastStickyIntent(i, UserHandle.USER_ALL);
+ }
+ }
+ }
+ }
+ };
+
+ private IntentBroadcaster(Context context) {
+ context.registerReceiver(mReceiver, new IntentFilter(Intent.ACTION_USER_UNLOCKED));
+ }
+
+ /**
+ * Method to get an instance of IntentBroadcaster after creating one if needed.
+ * @return IntentBroadcaster instance
+ */
+ public static IntentBroadcaster getInstance(Context context) {
+ if (sIntentBroadcaster == null) {
+ sIntentBroadcaster = new IntentBroadcaster(context);
+ }
+ return sIntentBroadcaster;
+ }
+
+ public static IntentBroadcaster getInstance() {
+ return sIntentBroadcaster;
+ }
+
+ /**
+ * Wrapper for ActivityManager.broadcastStickyIntent() that also stores intent to be rebroadcast
+ * on USER_UNLOCKED
+ */
+ public void broadcastStickyIntent(Intent intent, int slotId) {
+ logd("Broadcasting and adding intent for rebroadcast: " + intent.getAction() + " "
+ + intent.getStringExtra(IccCardConstants.INTENT_KEY_ICC_STATE)
+ + " for slotId " + slotId);
+ synchronized (mRebroadcastIntents) {
+ ActivityManager.broadcastStickyIntent(intent, UserHandle.USER_ALL);
+ mRebroadcastIntents.put(slotId, intent);
+ }
+ }
+
+ private void logd(String s) {
+ Log.d(TAG, s);
+ }
+}