summaryrefslogtreecommitdiffstats
path: root/src/com/android/settings/sim
diff options
context:
space:
mode:
authorPauloftheWest <paulofthewest@google.com>2014-12-03 23:30:52 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2014-12-03 23:30:53 +0000
commite8a868f26616f59206eba19c0b08ad4c99882b8c (patch)
tree77cf77792eb753cba379e28f9d3f4204a872f73f /src/com/android/settings/sim
parent45893e65b65a11abda22ea299f217d22c91228ca (diff)
parentffef98b3a0742319f40982ade420586bb7d603e5 (diff)
downloadpackages_apps_Settings-e8a868f26616f59206eba19c0b08ad4c99882b8c.zip
packages_apps_Settings-e8a868f26616f59206eba19c0b08ad4c99882b8c.tar.gz
packages_apps_Settings-e8a868f26616f59206eba19c0b08ad4c99882b8c.tar.bz2
Merge "Add SIM notification pop-ups." into lmp-mr1-dev
Diffstat (limited to 'src/com/android/settings/sim')
-rw-r--r--src/com/android/settings/sim/SimBootReceiver.java21
-rw-r--r--src/com/android/settings/sim/SimDialogActivity.java313
-rw-r--r--src/com/android/settings/sim/SimSettings.java14
3 files changed, 345 insertions, 3 deletions
diff --git a/src/com/android/settings/sim/SimBootReceiver.java b/src/com/android/settings/sim/SimBootReceiver.java
index d3fb996..213a585 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 0000000..cf3ccdf
--- /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<PhoneAccountHandle> 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<String> list = new ArrayList<String>();
+ final SubscriptionManager subscriptionManager = SubscriptionManager.from(context);
+ final List<SubscriptionInfo> 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<PhoneAccountHandle> 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<PhoneAccountHandle> 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<String> {
+ private Context mContext;
+ private int mResId;
+ private int mDialogId;
+ private final float OPACITY = 0.54f;
+ private List<SubscriptionInfo> mSubInfoList;
+
+ public SelectAccountListAdapter(List<SubscriptionInfo> 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 69dbbe0..6c3ddb5 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;