diff options
Diffstat (limited to 'src/com/android/settings')
-rw-r--r-- | src/com/android/settings/sim/SimBootReceiver.java | 142 | ||||
-rw-r--r-- | src/com/android/settings/sim/SimSettings.java | 3 |
2 files changed, 144 insertions, 1 deletions
diff --git a/src/com/android/settings/sim/SimBootReceiver.java b/src/com/android/settings/sim/SimBootReceiver.java new file mode 100644 index 0000000..2d9d15e --- /dev/null +++ b/src/com/android/settings/sim/SimBootReceiver.java @@ -0,0 +1,142 @@ +/* + * Copyright (C) 2014 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.settings.sim; + +import com.android.settings.R; +import com.android.settings.Settings.SimSettingsActivity; + +import java.util.List; + +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.SharedPreferences.Editor; +import android.content.res.Resources; +import android.support.v4.app.NotificationCompat; +import android.telephony.SubscriptionInfo; +import android.telephony.SubscriptionListener; +import android.telephony.SubscriptionManager; +import android.telephony.TelephonyManager; +import android.util.Log; + +import com.android.settings.Utils; + +public class SimBootReceiver extends BroadcastReceiver { + private static final int SLOT_EMPTY = -1; + private static final int NOTIFICATION_ID = 1; + private static final String SHARED_PREFERENCES_NAME = "sim_state"; + private static final String SLOT_PREFIX = "sim_slot_"; + + private SharedPreferences mSharedPreferences = null; + private TelephonyManager mTelephonyManager; + private Context mContext; + + @Override + public void onReceive(Context context, Intent intent) { + mTelephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); + mContext = context; + mSharedPreferences = mContext.getSharedPreferences(SHARED_PREFERENCES_NAME, + Context.MODE_PRIVATE); + + SubscriptionManager.register(mContext, mSubscriptionListener, + SubscriptionListener.LISTEN_SUBSCRIPTION_INFO_LIST_CHANGED); + } + + private void detectChangeAndNotify() { + final int numSlots = mTelephonyManager.getSimCount(); + + // Do not create notifications on single SIM devices. + if (numSlots < 2) { + return; + } + + // We wait until SubscriptionManager returns a valid list of Subscription informations + // by checking if the list is empty. + // This is not completely correct, but works for most cases. + // See Bug: 18377252 + if (SubscriptionManager.getActiveSubscriptionInfoList().size() < 1) { + return; + } + + for (int i = 0; i < numSlots; i++) { + final SubscriptionInfo sir = Utils.findRecordBySlotId(i); + final String key = SLOT_PREFIX+i; + final int lastSubId = getLastSubId(key); + + if (sir != null) { + final int currentSubId = sir.getSubscriptionId(); + if (lastSubId != currentSubId) { + createNotification(mContext); + setLastSubId(key, currentSubId); + } + } else if (lastSubId != SLOT_EMPTY) { + createNotification(mContext); + setLastSubId(key, SLOT_EMPTY); + } + } + } + + private int getLastSubId(String strSlotId) { + return mSharedPreferences.getInt(strSlotId, SLOT_EMPTY); + } + + private void setLastSubId(String strSlotId, int value) { + Editor editor = mSharedPreferences.edit(); + editor.putInt(strSlotId, value); + editor.commit(); + } + + private void createNotification(Context context){ + final Resources resources = context.getResources(); + + NotificationCompat.Builder builder = + new NotificationCompat.Builder(context) + .setSmallIcon(R.drawable.ic_sim_card_alert_white_48dp) + .setColor(resources.getColor(R.color.sim_noitification)) + .setContentTitle(resources.getString(R.string.sim_notification_title)) + .setContentText(resources.getString(R.string.sim_notification_summary)); + Intent resultIntent = new Intent(context, SimSettingsActivity.class); + resultIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + PendingIntent resultPendingIntent = + PendingIntent.getActivity( + context, + 0, + resultIntent, + PendingIntent.FLAG_CANCEL_CURRENT + ); + builder.setContentIntent(resultPendingIntent); + NotificationManager notificationManager = + (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); + notificationManager.notify(NOTIFICATION_ID, builder.build()); + } + + public static void cancelNotification(Context context) { + NotificationManager notificationManager = + (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); + notificationManager.cancel(NOTIFICATION_ID); + } + + private final SubscriptionListener mSubscriptionListener = new SubscriptionListener() { + @Override + public void onSubscriptionInfoChanged() { + detectChangeAndNotify(); + } + }; +} diff --git a/src/com/android/settings/sim/SimSettings.java b/src/com/android/settings/sim/SimSettings.java index 6de0cc1..273d64c 100644 --- a/src/com/android/settings/sim/SimSettings.java +++ b/src/com/android/settings/sim/SimSettings.java @@ -131,6 +131,8 @@ public class SimSettings extends RestrictedSettingsFragment implements Indexable createPreferences(); updateAllOptions(); + + SimBootReceiver.cancelNotification(getActivity()); } private void createPreferences() { @@ -583,5 +585,4 @@ public class SimSettings extends RestrictedSettingsFragment implements Indexable return result; } }; - } |