diff options
-rw-r--r-- | AndroidManifest.xml | 7 | ||||
-rw-r--r-- | res/drawable-hdpi/ic_sim_card_alert_white_48dp.png | bin | 0 -> 412 bytes | |||
-rw-r--r-- | res/drawable-mdpi/ic_sim_card_alert_white_48dp.png | bin | 0 -> 321 bytes | |||
-rw-r--r-- | res/drawable-xhdpi/ic_sim_card_alert_white_48dp.png | bin | 0 -> 516 bytes | |||
-rw-r--r-- | res/drawable-xxhdpi/ic_sim_card_alert_white_48dp.png | bin | 0 -> 718 bytes | |||
-rw-r--r-- | res/drawable-xxxhdpi/ic_sim_card_alert_white_48dp.png | bin | 0 -> 931 bytes | |||
-rw-r--r-- | res/values/colors.xml | 2 | ||||
-rw-r--r-- | res/values/strings.xml | 4 | ||||
-rw-r--r-- | src/com/android/settings/sim/SimBootReceiver.java | 142 | ||||
-rw-r--r-- | src/com/android/settings/sim/SimSettings.java | 3 |
10 files changed, 157 insertions, 1 deletions
diff --git a/AndroidManifest.xml b/AndroidManifest.xml index a800b4b..99bb483 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -66,6 +66,7 @@ <uses-permission android:name="android.permission.SET_TIME" /> <uses-permission android:name="android.permission.ACCESS_NOTIFICATIONS" /> <uses-permission android:name="android.permission.REBOOT" /> + <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.MANAGE_DEVICE_ADMINS" /> <uses-permission android:name="android.permission.READ_SEARCH_INDEXABLES" /> <uses-permission android:name="android.permission.OEM_UNLOCK_STATE" /> @@ -1988,6 +1989,12 @@ </intent-filter> </receiver> + <receiver android:name=".sim.SimBootReceiver"> + <intent-filter> + <action android:name="android.intent.action.BOOT_COMPLETED"></action> + </intent-filter> + </receiver> + <provider android:name="android.support.v4.content.FileProvider" android:authorities="com.android.settings.files" diff --git a/res/drawable-hdpi/ic_sim_card_alert_white_48dp.png b/res/drawable-hdpi/ic_sim_card_alert_white_48dp.png Binary files differnew file mode 100644 index 0000000..c8fbf42 --- /dev/null +++ b/res/drawable-hdpi/ic_sim_card_alert_white_48dp.png diff --git a/res/drawable-mdpi/ic_sim_card_alert_white_48dp.png b/res/drawable-mdpi/ic_sim_card_alert_white_48dp.png Binary files differnew file mode 100644 index 0000000..18cd7f9 --- /dev/null +++ b/res/drawable-mdpi/ic_sim_card_alert_white_48dp.png diff --git a/res/drawable-xhdpi/ic_sim_card_alert_white_48dp.png b/res/drawable-xhdpi/ic_sim_card_alert_white_48dp.png Binary files differnew file mode 100644 index 0000000..6d983b7 --- /dev/null +++ b/res/drawable-xhdpi/ic_sim_card_alert_white_48dp.png diff --git a/res/drawable-xxhdpi/ic_sim_card_alert_white_48dp.png b/res/drawable-xxhdpi/ic_sim_card_alert_white_48dp.png Binary files differnew file mode 100644 index 0000000..6c8dd1f --- /dev/null +++ b/res/drawable-xxhdpi/ic_sim_card_alert_white_48dp.png diff --git a/res/drawable-xxxhdpi/ic_sim_card_alert_white_48dp.png b/res/drawable-xxxhdpi/ic_sim_card_alert_white_48dp.png Binary files differnew file mode 100644 index 0000000..e8b6667 --- /dev/null +++ b/res/drawable-xxxhdpi/ic_sim_card_alert_white_48dp.png diff --git a/res/values/colors.xml b/res/values/colors.xml index 9e3161d..a5abbbe 100644 --- a/res/values/colors.xml +++ b/res/values/colors.xml @@ -72,4 +72,6 @@ <color name="switch_accent_color">#ff7fcac3</color> <color name="wifi_divider">#ffe0e0e0</color> + <color name="sim_noitification">@*android:color/material_deep_teal_500</color> + </resources> diff --git a/res/values/strings.xml b/res/values/strings.xml index f6f4d5a..415c4c9 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -5548,6 +5548,10 @@ <string name="preferred_network_offload_popup">Disabling Network Name Broadcast will prevent automatic connection to hidden networks.</string> <!-- Summary text describing signal strength to the user. [CHAR LIMIT=60] --> <string name="sim_signal_strength"><xliff:g id="dbm">%1$d</xliff:g> dBm <xliff:g id="asu">%2$d</xliff:g> asu</string> + <!-- Title for SIM card notification. [CHAR LIMIT=40] --> + <string name="sim_notification_title">SIM cards changed.</string> + <!-- Message under title informing the user to touch to go to SIM Cards in Settings. [CHAR LIMIT=40] --> + <string name="sim_notification_summary">Touch to set up</string> <!-- This is a divider in the SIM cards preferences that is the header of various settings where the user chooses which SIM to use for phone calls, data, and SMS messages [CHAR LIMIT=50] --> <string name="sim_pref_divider">Preferred SIM for</string> 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; } }; - } |