From ffef98b3a0742319f40982ade420586bb7d603e5 Mon Sep 17 00:00:00 2001 From: PauloftheWest Date: Tue, 18 Nov 2014 07:12:48 -0800 Subject: [PATCH] Add SIM notification pop-ups. + Added a SimDialogActivity so any application can iniate a request to se tthe default Data, Calls, and SMS. Bug: 18293625 Change-Id: I60535125b40ece5ebc14542d732e4493bddefbae --- AndroidManifest.xml | 9 + res/values/strings.xml | 4 + src/com/android/settings/sim/SimBootReceiver.java | 21 ++ .../android/settings/sim/SimDialogActivity.java | 313 +++++++++++++++++++++ src/com/android/settings/sim/SimSettings.java | 14 +- 5 files changed, 358 insertions(+), 3 deletions(-) create mode 100644 src/com/android/settings/sim/SimDialogActivity.java diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 82b135f6de..120ee9cd72 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -2027,6 +2027,15 @@ android:resource="@id/sim_settings" /> + + + + + + + Change data SIM? Use %1$s instead of %2$s for cellular data? + + Update preferred SIM card? + + %1$s is the only SIM in your device. Do you want to use this SIM for cellular data, calls, and SMS messages? diff --git a/src/com/android/settings/sim/SimBootReceiver.java b/src/com/android/settings/sim/SimBootReceiver.java index d3fb99679f..213a585440 100644 --- a/src/com/android/settings/sim/SimBootReceiver.java +++ b/src/com/android/settings/sim/SimBootReceiver.java @@ -38,6 +38,7 @@ import com.android.settings.Utils; import java.util.List; public class SimBootReceiver extends BroadcastReceiver { + private static final String TAG = "SimBootReceiver"; private static final int SLOT_EMPTY = -1; private static final int NOTIFICATION_ID = 1; private static final String SHARED_PREFERENCES_NAME = "sim_state"; @@ -61,6 +62,9 @@ public class SimBootReceiver extends BroadcastReceiver { private void detectChangeAndNotify() { final int numSlots = mTelephonyManager.getSimCount(); + boolean notificationSent = false; + int numSIMsDetected = 0; + int lastSIMSlotDetected = -1; // Do not create notifications on single SIM devices. if (numSlots < 2) { @@ -82,16 +86,32 @@ public class SimBootReceiver extends BroadcastReceiver { final int lastSubId = getLastSubId(key); if (sir != null) { + numSIMsDetected++; final int currentSubId = sir.getSubscriptionId(); if (lastSubId != currentSubId) { createNotification(mContext); setLastSubId(key, currentSubId); + notificationSent = true; } + lastSIMSlotDetected = i; } else if (lastSubId != SLOT_EMPTY) { createNotification(mContext); setLastSubId(key, SLOT_EMPTY); + notificationSent = true; } } + + if (notificationSent) { + Intent intent = new Intent(mContext, SimDialogActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + if (numSIMsDetected == 1) { + intent.putExtra(SimDialogActivity.DIALOG_TYPE_KEY, SimDialogActivity.PREFERRED_PICK); + intent.putExtra(SimDialogActivity.PREFERRED_SIM, lastSIMSlotDetected); + } else { + intent.putExtra(SimDialogActivity.DIALOG_TYPE_KEY, SimDialogActivity.DATA_PICK); + } + mContext.startActivity(intent); + } } private int getLastSubId(String strSlotId) { @@ -141,4 +161,5 @@ public class SimBootReceiver extends BroadcastReceiver { detectChangeAndNotify(); } }; + } diff --git a/src/com/android/settings/sim/SimDialogActivity.java b/src/com/android/settings/sim/SimDialogActivity.java new file mode 100644 index 0000000000..cf3ccdf537 --- /dev/null +++ b/src/com/android/settings/sim/SimDialogActivity.java @@ -0,0 +1,313 @@ +/* + * 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 android.app.Activity; +import android.app.AlertDialog; +import android.app.Dialog; +import android.content.ComponentName; +import android.content.Context; +import android.content.DialogInterface; +import android.content.res.Resources; +import android.os.Bundle; +import android.telecom.PhoneAccount; +import android.telecom.PhoneAccountHandle; +import android.telecom.TelecomManager; +import android.telephony.SubscriptionInfo; +import android.telephony.SubscriptionManager; +import android.text.TextUtils; +import android.util.Log; +import android.view.KeyEvent; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.ImageView; +import android.widget.ListAdapter; +import android.widget.TextView; + +import com.android.settings.R; +import com.android.settings.Utils; +import com.android.internal.telephony.Phone; +import com.android.internal.telephony.PhoneFactory; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +public class SimDialogActivity extends Activity { + private static String TAG = "SimDialogActivity"; + + public static String PREFERRED_SIM = "preferred_sim"; + public static String DIALOG_TYPE_KEY = "dialog_type"; + public static final int INVALID_PICK = -1; + public static final int DATA_PICK = 0; + public static final int CALLS_PICK = 1; + public static final int SMS_PICK = 2; + public static final int PREFERRED_PICK = 3; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + final Bundle extras = getIntent().getExtras(); + final int dialogType = extras.getInt(DIALOG_TYPE_KEY, INVALID_PICK); + + switch (dialogType) { + case DATA_PICK: + case CALLS_PICK: + case SMS_PICK: + createDialog(this, dialogType).show(); + break; + case PREFERRED_PICK: + displayPreferredDialog(extras.getInt(PREFERRED_SIM)); + break; + default: + throw new IllegalArgumentException("Invalid dialog type " + dialogType + " sent."); + } + + } + + private void displayPreferredDialog(final int slotId) { + final Resources res = getResources(); + final Context context = getApplicationContext(); + final SubscriptionInfo sir = Utils.findRecordBySlotId(context, slotId); + + AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this); + alertDialogBuilder.setTitle(R.string.sim_preferred_title); + alertDialogBuilder.setMessage(res.getString( + R.string.sim_preferred_message, sir.getDisplayName())); + + alertDialogBuilder.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int id) { + final int subId = sir.getSubscriptionId(); + PhoneAccountHandle phoneAccountHandle = subscriptionIdToPhoneAccountHandle(subId); + setDefaultDataSubId(context, subId); + setDefaultSmsSubId(context, subId); + setUserSelectedOutgoingPhoneAccount(phoneAccountHandle); + finish(); + } + }); + alertDialogBuilder.setNegativeButton(R.string.no, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog,int id) { + finish(); + } + }); + + alertDialogBuilder.create().show(); + } + + private static void setDefaultDataSubId(final Context context, final int subId) { + final SubscriptionManager subscriptionManager = SubscriptionManager.from(context); + subscriptionManager.setDefaultDataSubId(subId); + } + + private static void setDefaultSmsSubId(final Context context, final int subId) { + final SubscriptionManager subscriptionManager = SubscriptionManager.from(context); + subscriptionManager.setDefaultSmsSubId(subId); + } + + private void setUserSelectedOutgoingPhoneAccount(PhoneAccountHandle phoneAccount) { + final TelecomManager telecomManager = TelecomManager.from(this); + telecomManager.setUserSelectedOutgoingPhoneAccount(phoneAccount); + } + + private PhoneAccountHandle subscriptionIdToPhoneAccountHandle(final int subId) { + final TelecomManager telecomManager = TelecomManager.from(this); + final Iterator phoneAccounts = + telecomManager.getCallCapablePhoneAccounts().listIterator(); + + while (phoneAccounts.hasNext()) { + final PhoneAccountHandle phoneAccountHandle = phoneAccounts.next(); + final PhoneAccount phoneAccount = telecomManager.getPhoneAccount(phoneAccountHandle); + final String phoneAccountId = phoneAccountHandle.getId(); + + if (phoneAccount.hasCapabilities(PhoneAccount.CAPABILITY_SIM_SUBSCRIPTION) + && TextUtils.isDigitsOnly(phoneAccountId) + && Integer.parseInt(phoneAccountId) == subId){ + return phoneAccountHandle; + } + } + + return null; + } + + public Dialog createDialog(final Context context, final int id) { + final ArrayList list = new ArrayList(); + final SubscriptionManager subscriptionManager = SubscriptionManager.from(context); + final List subInfoList = + subscriptionManager.getActiveSubscriptionInfoList(); + final int selectableSubInfoLength = subInfoList.size(); + + final DialogInterface.OnClickListener selectionListener = + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int value) { + + final SubscriptionInfo sir; + + switch (id) { + case DATA_PICK: + sir = subInfoList.get(value); + setDefaultDataSubId(context, sir.getSubscriptionId()); + break; + case CALLS_PICK: + final TelecomManager telecomManager = + TelecomManager.from(context); + final List phoneAccountsList = + telecomManager.getCallCapablePhoneAccounts(); + setUserSelectedOutgoingPhoneAccount( + value < 1 ? null : phoneAccountsList.get(value - 1)); + break; + case SMS_PICK: + sir = subInfoList.get(value); + setDefaultSmsSubId(context, sir.getSubscriptionId()); + break; + default: + throw new IllegalArgumentException("Invalid dialog type " + + id + " in SIM dialog."); + } + + finish(); + } + }; + + Dialog.OnKeyListener keyListener = new Dialog.OnKeyListener() { + @Override + public boolean onKey(DialogInterface arg0, int keyCode, + KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_BACK) { + finish(); + } + return true; + } + }; + + if (id == CALLS_PICK) { + final TelecomManager telecomManager = TelecomManager.from(context); + final Iterator phoneAccounts = + telecomManager.getCallCapablePhoneAccounts().listIterator(); + + list.add(getResources().getString(R.string.sim_calls_ask_first_prefs_title)); + while (phoneAccounts.hasNext()) { + final PhoneAccount phoneAccount = + telecomManager.getPhoneAccount(phoneAccounts.next()); + list.add((String)phoneAccount.getLabel()); + } + } else { + for (int i = 0; i < selectableSubInfoLength; ++i) { + final SubscriptionInfo sir = subInfoList.get(i); + CharSequence displayName = sir.getDisplayName(); + if (displayName == null) { + displayName = ""; + } + list.add(displayName.toString()); + } + } + + String[] arr = list.toArray(new String[0]); + + AlertDialog.Builder builder = new AlertDialog.Builder(context); + + ListAdapter adapter = new SelectAccountListAdapter( + subInfoList, + builder.getContext(), + R.layout.select_account_list_item, + arr, id); + + switch (id) { + case DATA_PICK: + builder.setTitle(R.string.select_sim_for_data); + break; + case CALLS_PICK: + builder.setTitle(R.string.select_sim_for_calls); + break; + case SMS_PICK: + builder.setTitle(R.string.sim_card_select_title); + break; + default: + throw new IllegalArgumentException("Invalid dialog type " + + id + " in SIM dialog."); + } + + Dialog dialog = builder.setAdapter(adapter, selectionListener).create(); + dialog.setOnKeyListener(keyListener); + + return dialog; + + } + + private class SelectAccountListAdapter extends ArrayAdapter { + private Context mContext; + private int mResId; + private int mDialogId; + private final float OPACITY = 0.54f; + private List mSubInfoList; + + public SelectAccountListAdapter(List subInfoList, + Context context, int resource, String[] arr, int dialogId) { + super(context, resource, arr); + mContext = context; + mResId = resource; + mDialogId = dialogId; + mSubInfoList = subInfoList; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + LayoutInflater inflater = (LayoutInflater) + mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + View rowView; + final ViewHolder holder; + SubscriptionInfo sir; + + if (convertView == null) { + // Cache views for faster scrolling + rowView = inflater.inflate(mResId, null); + holder = new ViewHolder(); + holder.title = (TextView) rowView.findViewById(R.id.title); + holder.summary = (TextView) rowView.findViewById(R.id.summary); + holder.icon = (ImageView) rowView.findViewById(R.id.icon); + rowView.setTag(holder); + } else { + rowView = convertView; + holder = (ViewHolder) rowView.getTag(); + } + + if (mDialogId == CALLS_PICK) { + holder.title.setText(getItem(position)); + holder.summary.setText(""); + holder.icon.setImageDrawable(getResources() + .getDrawable(R.drawable.ic_live_help)); + holder.icon.setAlpha(OPACITY); + } else { + sir = mSubInfoList.get(position); + holder.title.setText(sir.getDisplayName()); + holder.summary.setText(sir.getNumber()); + holder.icon.setImageBitmap(sir.createIconBitmap(mContext)); + } + return rowView; + } + + private class ViewHolder { + TextView title; + TextView summary; + ImageView icon; + } + } +} diff --git a/src/com/android/settings/sim/SimSettings.java b/src/com/android/settings/sim/SimSettings.java index 3869cd374d..7c13cde26c 100644 --- a/src/com/android/settings/sim/SimSettings.java +++ b/src/com/android/settings/sim/SimSettings.java @@ -20,6 +20,7 @@ import android.app.AlertDialog; import android.content.Context; import android.content.ContentUris; import android.content.DialogInterface; +import android.content.Intent; import android.content.res.Resources; import android.database.Cursor; import android.graphics.Paint; @@ -264,14 +265,21 @@ public class SimSettings extends RestrictedSettingsFragment implements Indexable @Override public boolean onPreferenceTreeClick(final PreferenceScreen preferenceScreen, final Preference preference) { + final Context context = getActivity(); + Intent intent = new Intent(context, SimDialogActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + if (preference instanceof SimPreference) { ((SimPreference)preference).createEditDialog((SimPreference)preference); } else if (findPreference(KEY_CELLULAR_DATA) == preference) { - showDialog(DATA_PICK); + intent.putExtra(SimDialogActivity.DIALOG_TYPE_KEY, SimDialogActivity.DATA_PICK); + context.startActivity(intent); } else if (findPreference(KEY_CALLS) == preference) { - showDialog(CALLS_PICK); + intent.putExtra(SimDialogActivity.DIALOG_TYPE_KEY, SimDialogActivity.CALLS_PICK); + context.startActivity(intent); } else if (findPreference(KEY_SMS) == preference) { - showDialog(SMS_PICK); + intent.putExtra(SimDialogActivity.DIALOG_TYPE_KEY, SimDialogActivity.SMS_PICK); + context.startActivity(intent); } return true; -- 2.11.0