1 /* 2 * Copyright (C) 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.settings.sim; 18 19 import android.app.Activity; 20 import android.app.AlertDialog; 21 import android.app.Dialog; 22 import android.content.Context; 23 import android.content.DialogInterface; 24 import android.content.res.Resources; 25 import android.os.Bundle; 26 import android.telecom.PhoneAccount; 27 import android.telecom.PhoneAccountHandle; 28 import android.telecom.TelecomManager; 29 import android.telephony.SubscriptionInfo; 30 import android.telephony.SubscriptionManager; 31 import android.telephony.TelephonyManager; 32 import android.view.KeyEvent; 33 import android.view.LayoutInflater; 34 import android.view.View; 35 import android.view.ViewGroup; 36 import android.widget.ArrayAdapter; 37 import android.widget.ImageView; 38 import android.widget.ListAdapter; 39 import android.widget.TextView; 40 import android.widget.Toast; 41 42 import com.android.settings.R; 43 44 import java.util.ArrayList; 45 import java.util.Iterator; 46 import java.util.List; 47 48 public class SimDialogActivity extends Activity { 49 private static String TAG = "SimDialogActivity"; 50 51 public static String PREFERRED_SIM = "preferred_sim"; 52 public static String DIALOG_TYPE_KEY = "dialog_type"; 53 public static final int INVALID_PICK = -1; 54 public static final int DATA_PICK = 0; 55 public static final int CALLS_PICK = 1; 56 public static final int SMS_PICK = 2; 57 public static final int PREFERRED_PICK = 3; 58 59 @Override onCreate(Bundle savedInstanceState)60 protected void onCreate(Bundle savedInstanceState) { 61 super.onCreate(savedInstanceState); 62 final int dialogType = getIntent().getIntExtra(DIALOG_TYPE_KEY, INVALID_PICK); 63 64 switch (dialogType) { 65 case DATA_PICK: 66 case CALLS_PICK: 67 case SMS_PICK: 68 createDialog(this, dialogType).show(); 69 break; 70 case PREFERRED_PICK: 71 displayPreferredDialog(getIntent().getIntExtra(PREFERRED_SIM, 0)); 72 break; 73 default: 74 throw new IllegalArgumentException("Invalid dialog type " + dialogType + " sent."); 75 } 76 77 } 78 displayPreferredDialog(final int slotId)79 private void displayPreferredDialog(final int slotId) { 80 final Resources res = getResources(); 81 final Context context = getApplicationContext(); 82 final SubscriptionInfo sir = SubscriptionManager.from(context) 83 .getActiveSubscriptionInfoForSimSlotIndex(slotId); 84 85 if (sir != null) { 86 AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this); 87 alertDialogBuilder.setTitle(R.string.sim_preferred_title); 88 alertDialogBuilder.setMessage(res.getString( 89 R.string.sim_preferred_message, sir.getDisplayName())); 90 91 alertDialogBuilder.setPositiveButton(R.string.yes, new 92 DialogInterface.OnClickListener() { 93 @Override 94 public void onClick(DialogInterface dialog, int id) { 95 final int subId = sir.getSubscriptionId(); 96 PhoneAccountHandle phoneAccountHandle = 97 subscriptionIdToPhoneAccountHandle(subId); 98 setDefaultDataSubId(context, subId); 99 setDefaultSmsSubId(context, subId); 100 setUserSelectedOutgoingPhoneAccount(phoneAccountHandle); 101 finish(); 102 } 103 }); 104 alertDialogBuilder.setNegativeButton(R.string.no, new 105 DialogInterface.OnClickListener() { 106 @Override 107 public void onClick(DialogInterface dialog,int id) { 108 finish(); 109 } 110 }); 111 112 alertDialogBuilder.create().show(); 113 } else { 114 finish(); 115 } 116 } 117 setDefaultDataSubId(final Context context, final int subId)118 private static void setDefaultDataSubId(final Context context, final int subId) { 119 final SubscriptionManager subscriptionManager = SubscriptionManager.from(context); 120 subscriptionManager.setDefaultDataSubId(subId); 121 Toast.makeText(context, R.string.data_switch_started, Toast.LENGTH_LONG).show(); 122 } 123 setDefaultSmsSubId(final Context context, final int subId)124 private static void setDefaultSmsSubId(final Context context, final int subId) { 125 final SubscriptionManager subscriptionManager = SubscriptionManager.from(context); 126 subscriptionManager.setDefaultSmsSubId(subId); 127 } 128 setUserSelectedOutgoingPhoneAccount(PhoneAccountHandle phoneAccount)129 private void setUserSelectedOutgoingPhoneAccount(PhoneAccountHandle phoneAccount) { 130 final TelecomManager telecomManager = TelecomManager.from(this); 131 telecomManager.setUserSelectedOutgoingPhoneAccount(phoneAccount); 132 } 133 subscriptionIdToPhoneAccountHandle(final int subId)134 private PhoneAccountHandle subscriptionIdToPhoneAccountHandle(final int subId) { 135 final TelecomManager telecomManager = TelecomManager.from(this); 136 final TelephonyManager telephonyManager = TelephonyManager.from(this); 137 final Iterator<PhoneAccountHandle> phoneAccounts = 138 telecomManager.getCallCapablePhoneAccounts().listIterator(); 139 140 while (phoneAccounts.hasNext()) { 141 final PhoneAccountHandle phoneAccountHandle = phoneAccounts.next(); 142 final PhoneAccount phoneAccount = telecomManager.getPhoneAccount(phoneAccountHandle); 143 if (subId == telephonyManager.getSubIdForPhoneAccount(phoneAccount)) { 144 return phoneAccountHandle; 145 } 146 } 147 148 return null; 149 } 150 createDialog(final Context context, final int id)151 public Dialog createDialog(final Context context, final int id) { 152 final ArrayList<String> list = new ArrayList<String>(); 153 final SubscriptionManager subscriptionManager = SubscriptionManager.from(context); 154 final List<SubscriptionInfo> subInfoList = 155 subscriptionManager.getActiveSubscriptionInfoList(); 156 final int selectableSubInfoLength = subInfoList == null ? 0 : subInfoList.size(); 157 158 final DialogInterface.OnClickListener selectionListener = 159 new DialogInterface.OnClickListener() { 160 @Override 161 public void onClick(DialogInterface dialog, int value) { 162 163 final SubscriptionInfo sir; 164 165 switch (id) { 166 case DATA_PICK: 167 sir = subInfoList.get(value); 168 setDefaultDataSubId(context, sir.getSubscriptionId()); 169 break; 170 case CALLS_PICK: 171 final TelecomManager telecomManager = 172 TelecomManager.from(context); 173 final List<PhoneAccountHandle> phoneAccountsList = 174 telecomManager.getCallCapablePhoneAccounts(); 175 setUserSelectedOutgoingPhoneAccount( 176 value < 1 ? null : phoneAccountsList.get(value - 1)); 177 break; 178 case SMS_PICK: 179 sir = subInfoList.get(value); 180 setDefaultSmsSubId(context, sir.getSubscriptionId()); 181 break; 182 default: 183 throw new IllegalArgumentException("Invalid dialog type " 184 + id + " in SIM dialog."); 185 } 186 187 finish(); 188 } 189 }; 190 191 Dialog.OnKeyListener keyListener = new Dialog.OnKeyListener() { 192 @Override 193 public boolean onKey(DialogInterface arg0, int keyCode, 194 KeyEvent event) { 195 if (keyCode == KeyEvent.KEYCODE_BACK) { 196 finish(); 197 } 198 return true; 199 } 200 }; 201 202 ArrayList<SubscriptionInfo> callsSubInfoList = new ArrayList<SubscriptionInfo>(); 203 if (id == CALLS_PICK) { 204 final TelecomManager telecomManager = TelecomManager.from(context); 205 final TelephonyManager telephonyManager = TelephonyManager.from(context); 206 final Iterator<PhoneAccountHandle> phoneAccounts = 207 telecomManager.getCallCapablePhoneAccounts().listIterator(); 208 209 list.add(getResources().getString(R.string.sim_calls_ask_first_prefs_title)); 210 callsSubInfoList.add(null); 211 while (phoneAccounts.hasNext()) { 212 final PhoneAccount phoneAccount = 213 telecomManager.getPhoneAccount(phoneAccounts.next()); 214 list.add((String)phoneAccount.getLabel()); 215 int subId = telephonyManager.getSubIdForPhoneAccount(phoneAccount); 216 if (subId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) { 217 final SubscriptionInfo sir = SubscriptionManager.from(context) 218 .getActiveSubscriptionInfo(subId); 219 callsSubInfoList.add(sir); 220 } else { 221 callsSubInfoList.add(null); 222 } 223 } 224 } else { 225 for (int i = 0; i < selectableSubInfoLength; ++i) { 226 final SubscriptionInfo sir = subInfoList.get(i); 227 CharSequence displayName = sir.getDisplayName(); 228 if (displayName == null) { 229 displayName = ""; 230 } 231 list.add(displayName.toString()); 232 } 233 } 234 235 String[] arr = list.toArray(new String[0]); 236 237 AlertDialog.Builder builder = new AlertDialog.Builder(context); 238 239 ListAdapter adapter = new SelectAccountListAdapter( 240 id == CALLS_PICK ? callsSubInfoList : subInfoList, 241 builder.getContext(), 242 R.layout.select_account_list_item, 243 arr, id); 244 245 switch (id) { 246 case DATA_PICK: 247 builder.setTitle(R.string.select_sim_for_data); 248 break; 249 case CALLS_PICK: 250 builder.setTitle(R.string.select_sim_for_calls); 251 break; 252 case SMS_PICK: 253 builder.setTitle(R.string.sim_card_select_title); 254 break; 255 default: 256 throw new IllegalArgumentException("Invalid dialog type " 257 + id + " in SIM dialog."); 258 } 259 260 Dialog dialog = builder.setAdapter(adapter, selectionListener).create(); 261 dialog.setOnKeyListener(keyListener); 262 263 dialog.setOnCancelListener(new DialogInterface.OnCancelListener() { 264 @Override 265 public void onCancel(DialogInterface dialogInterface) { 266 finish(); 267 } 268 }); 269 270 return dialog; 271 272 } 273 274 private class SelectAccountListAdapter extends ArrayAdapter<String> { 275 private Context mContext; 276 private int mResId; 277 private int mDialogId; 278 private final float OPACITY = 0.54f; 279 private List<SubscriptionInfo> mSubInfoList; 280 SelectAccountListAdapter(List<SubscriptionInfo> subInfoList, Context context, int resource, String[] arr, int dialogId)281 public SelectAccountListAdapter(List<SubscriptionInfo> subInfoList, 282 Context context, int resource, String[] arr, int dialogId) { 283 super(context, resource, arr); 284 mContext = context; 285 mResId = resource; 286 mDialogId = dialogId; 287 mSubInfoList = subInfoList; 288 } 289 290 @Override getView(int position, View convertView, ViewGroup parent)291 public View getView(int position, View convertView, ViewGroup parent) { 292 LayoutInflater inflater = (LayoutInflater) 293 mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 294 View rowView; 295 final ViewHolder holder; 296 297 if (convertView == null) { 298 // Cache views for faster scrolling 299 rowView = inflater.inflate(mResId, null); 300 holder = new ViewHolder(); 301 holder.title = (TextView) rowView.findViewById(R.id.title); 302 holder.summary = (TextView) rowView.findViewById(R.id.summary); 303 holder.icon = (ImageView) rowView.findViewById(R.id.icon); 304 rowView.setTag(holder); 305 } else { 306 rowView = convertView; 307 holder = (ViewHolder) rowView.getTag(); 308 } 309 310 final SubscriptionInfo sir = mSubInfoList.get(position); 311 if (sir == null) { 312 holder.title.setText(getItem(position)); 313 holder.summary.setText(""); 314 holder.icon.setImageDrawable(getResources() 315 .getDrawable(R.drawable.ic_live_help)); 316 holder.icon.setAlpha(OPACITY); 317 } else { 318 holder.title.setText(sir.getDisplayName()); 319 holder.summary.setText(sir.getNumber()); 320 holder.icon.setImageBitmap(sir.createIconBitmap(mContext)); 321 } 322 return rowView; 323 } 324 325 private class ViewHolder { 326 TextView title; 327 TextView summary; 328 ImageView icon; 329 } 330 } 331 } 332