| /* |
| * 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.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.telephony.TelephonyManager; |
| 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 android.widget.Toast; |
| |
| import com.android.settings.R; |
| |
| 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 int dialogType = getIntent().getIntExtra(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(getIntent().getIntExtra(PREFERRED_SIM, 0)); |
| 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 = SubscriptionManager.from(context) |
| .getActiveSubscriptionInfoForSimSlotIndex(slotId); |
| |
| if (sir != null) { |
| 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(); |
| } else { |
| finish(); |
| } |
| } |
| |
| private static void setDefaultDataSubId(final Context context, final int subId) { |
| final SubscriptionManager subscriptionManager = SubscriptionManager.from(context); |
| subscriptionManager.setDefaultDataSubId(subId); |
| Toast.makeText(context, R.string.data_switch_started, Toast.LENGTH_LONG).show(); |
| } |
| |
| 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 TelephonyManager telephonyManager = TelephonyManager.from(this); |
| final Iterator<PhoneAccountHandle> phoneAccounts = |
| telecomManager.getCallCapablePhoneAccounts().listIterator(); |
| |
| while (phoneAccounts.hasNext()) { |
| final PhoneAccountHandle phoneAccountHandle = phoneAccounts.next(); |
| final PhoneAccount phoneAccount = telecomManager.getPhoneAccount(phoneAccountHandle); |
| if (subId == telephonyManager.getSubIdForPhoneAccount(phoneAccount)) { |
| 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 == null ? 0 : 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; |
| } |
| }; |
| |
| ArrayList<SubscriptionInfo> callsSubInfoList = new ArrayList<SubscriptionInfo>(); |
| if (id == CALLS_PICK) { |
| final TelecomManager telecomManager = TelecomManager.from(context); |
| final TelephonyManager telephonyManager = TelephonyManager.from(context); |
| final Iterator<PhoneAccountHandle> phoneAccounts = |
| telecomManager.getCallCapablePhoneAccounts().listIterator(); |
| |
| list.add(getResources().getString(R.string.sim_calls_ask_first_prefs_title)); |
| callsSubInfoList.add(null); |
| while (phoneAccounts.hasNext()) { |
| final PhoneAccount phoneAccount = |
| telecomManager.getPhoneAccount(phoneAccounts.next()); |
| list.add((String)phoneAccount.getLabel()); |
| int subId = telephonyManager.getSubIdForPhoneAccount(phoneAccount); |
| if (subId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) { |
| final SubscriptionInfo sir = SubscriptionManager.from(context) |
| .getActiveSubscriptionInfo(subId); |
| callsSubInfoList.add(sir); |
| } else { |
| callsSubInfoList.add(null); |
| } |
| } |
| } 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( |
| id == CALLS_PICK ? callsSubInfoList : 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); |
| |
| dialog.setOnCancelListener(new DialogInterface.OnCancelListener() { |
| @Override |
| public void onCancel(DialogInterface dialogInterface) { |
| finish(); |
| } |
| }); |
| |
| 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; |
| |
| 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(); |
| } |
| |
| final SubscriptionInfo sir = mSubInfoList.get(position); |
| if (sir == null) { |
| holder.title.setText(getItem(position)); |
| holder.summary.setText(""); |
| holder.icon.setImageDrawable(getResources() |
| .getDrawable(R.drawable.ic_live_help)); |
| holder.icon.setAlpha(OPACITY); |
| } else { |
| 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; |
| } |
| } |
| } |