/* * 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; } } }