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 Bundle extras = getIntent().getExtras();
63         final int dialogType = extras.getInt(DIALOG_TYPE_KEY, INVALID_PICK);
64 
65         switch (dialogType) {
66             case DATA_PICK:
67             case CALLS_PICK:
68             case SMS_PICK:
69                 createDialog(this, dialogType).show();
70                 break;
71             case PREFERRED_PICK:
72                 displayPreferredDialog(extras.getInt(PREFERRED_SIM));
73                 break;
74             default:
75                 throw new IllegalArgumentException("Invalid dialog type " + dialogType + " sent.");
76         }
77 
78     }
79 
displayPreferredDialog(final int slotId)80     private void displayPreferredDialog(final int slotId) {
81         final Resources res = getResources();
82         final Context context = getApplicationContext();
83         final SubscriptionInfo sir = SubscriptionManager.from(context)
84                 .getActiveSubscriptionInfoForSimSlotIndex(slotId);
85 
86         if (sir != null) {
87             AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
88             alertDialogBuilder.setTitle(R.string.sim_preferred_title);
89             alertDialogBuilder.setMessage(res.getString(
90                         R.string.sim_preferred_message, sir.getDisplayName()));
91 
92             alertDialogBuilder.setPositiveButton(R.string.yes, new
93                     DialogInterface.OnClickListener() {
94                 @Override
95                 public void onClick(DialogInterface dialog, int id) {
96                     final int subId = sir.getSubscriptionId();
97                     PhoneAccountHandle phoneAccountHandle =
98                             subscriptionIdToPhoneAccountHandle(subId);
99                     setDefaultDataSubId(context, subId);
100                     setDefaultSmsSubId(context, subId);
101                     setUserSelectedOutgoingPhoneAccount(phoneAccountHandle);
102                     finish();
103                 }
104             });
105             alertDialogBuilder.setNegativeButton(R.string.no, new
106                     DialogInterface.OnClickListener() {
107                 @Override
108                 public void onClick(DialogInterface dialog,int id) {
109                     finish();
110                 }
111             });
112 
113             alertDialogBuilder.create().show();
114         } else {
115             finish();
116         }
117     }
118 
setDefaultDataSubId(final Context context, final int subId)119     private static void setDefaultDataSubId(final Context context, final int subId) {
120         final SubscriptionManager subscriptionManager = SubscriptionManager.from(context);
121         subscriptionManager.setDefaultDataSubId(subId);
122         Toast.makeText(context, R.string.data_switch_started, Toast.LENGTH_LONG).show();
123     }
124 
setDefaultSmsSubId(final Context context, final int subId)125     private static void setDefaultSmsSubId(final Context context, final int subId) {
126         final SubscriptionManager subscriptionManager = SubscriptionManager.from(context);
127         subscriptionManager.setDefaultSmsSubId(subId);
128     }
129 
setUserSelectedOutgoingPhoneAccount(PhoneAccountHandle phoneAccount)130     private void setUserSelectedOutgoingPhoneAccount(PhoneAccountHandle phoneAccount) {
131         final TelecomManager telecomManager = TelecomManager.from(this);
132         telecomManager.setUserSelectedOutgoingPhoneAccount(phoneAccount);
133     }
134 
subscriptionIdToPhoneAccountHandle(final int subId)135     private PhoneAccountHandle subscriptionIdToPhoneAccountHandle(final int subId) {
136         final TelecomManager telecomManager = TelecomManager.from(this);
137         final TelephonyManager telephonyManager = TelephonyManager.from(this);
138         final Iterator<PhoneAccountHandle> phoneAccounts =
139                 telecomManager.getCallCapablePhoneAccounts().listIterator();
140 
141         while (phoneAccounts.hasNext()) {
142             final PhoneAccountHandle phoneAccountHandle = phoneAccounts.next();
143             final PhoneAccount phoneAccount = telecomManager.getPhoneAccount(phoneAccountHandle);
144             if (subId == telephonyManager.getSubIdForPhoneAccount(phoneAccount)) {
145                 return phoneAccountHandle;
146             }
147         }
148 
149         return null;
150     }
151 
createDialog(final Context context, final int id)152     public Dialog createDialog(final Context context, final int id) {
153         final ArrayList<String> list = new ArrayList<String>();
154         final SubscriptionManager subscriptionManager = SubscriptionManager.from(context);
155         final List<SubscriptionInfo> subInfoList =
156             subscriptionManager.getActiveSubscriptionInfoList();
157         final int selectableSubInfoLength = subInfoList == null ? 0 : subInfoList.size();
158 
159         final DialogInterface.OnClickListener selectionListener =
160                 new DialogInterface.OnClickListener() {
161                     @Override
162                     public void onClick(DialogInterface dialog, int value) {
163 
164                         final SubscriptionInfo sir;
165 
166                         switch (id) {
167                             case DATA_PICK:
168                                 sir = subInfoList.get(value);
169                                 setDefaultDataSubId(context, sir.getSubscriptionId());
170                                 break;
171                             case CALLS_PICK:
172                                 final TelecomManager telecomManager =
173                                         TelecomManager.from(context);
174                                 final List<PhoneAccountHandle> phoneAccountsList =
175                                         telecomManager.getCallCapablePhoneAccounts();
176                                 setUserSelectedOutgoingPhoneAccount(
177                                         value < 1 ? null : phoneAccountsList.get(value - 1));
178                                 break;
179                             case SMS_PICK:
180                                 sir = subInfoList.get(value);
181                                 setDefaultSmsSubId(context, sir.getSubscriptionId());
182                                 break;
183                             default:
184                                 throw new IllegalArgumentException("Invalid dialog type "
185                                         + id + " in SIM dialog.");
186                         }
187 
188                         finish();
189                     }
190                 };
191 
192         Dialog.OnKeyListener keyListener = new Dialog.OnKeyListener() {
193             @Override
194             public boolean onKey(DialogInterface arg0, int keyCode,
195                     KeyEvent event) {
196                     if (keyCode == KeyEvent.KEYCODE_BACK) {
197                         finish();
198                     }
199                     return true;
200                 }
201             };
202 
203         ArrayList<SubscriptionInfo> callsSubInfoList = new ArrayList<SubscriptionInfo>();
204         if (id == CALLS_PICK) {
205             final TelecomManager telecomManager = TelecomManager.from(context);
206             final TelephonyManager telephonyManager = TelephonyManager.from(context);
207             final Iterator<PhoneAccountHandle> phoneAccounts =
208                     telecomManager.getCallCapablePhoneAccounts().listIterator();
209 
210             list.add(getResources().getString(R.string.sim_calls_ask_first_prefs_title));
211             callsSubInfoList.add(null);
212             while (phoneAccounts.hasNext()) {
213                 final PhoneAccount phoneAccount =
214                         telecomManager.getPhoneAccount(phoneAccounts.next());
215                 list.add((String)phoneAccount.getLabel());
216                 int subId = telephonyManager.getSubIdForPhoneAccount(phoneAccount);
217                 if (subId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
218                     final SubscriptionInfo sir = SubscriptionManager.from(context)
219                             .getActiveSubscriptionInfo(subId);
220                     callsSubInfoList.add(sir);
221                 } else {
222                     callsSubInfoList.add(null);
223                 }
224             }
225         } else {
226             for (int i = 0; i < selectableSubInfoLength; ++i) {
227                 final SubscriptionInfo sir = subInfoList.get(i);
228                 CharSequence displayName = sir.getDisplayName();
229                 if (displayName == null) {
230                     displayName = "";
231                 }
232                 list.add(displayName.toString());
233             }
234         }
235 
236         String[] arr = list.toArray(new String[0]);
237 
238         AlertDialog.Builder builder = new AlertDialog.Builder(context);
239 
240         ListAdapter adapter = new SelectAccountListAdapter(
241                 id == CALLS_PICK ? callsSubInfoList : subInfoList,
242                 builder.getContext(),
243                 R.layout.select_account_list_item,
244                 arr, id);
245 
246         switch (id) {
247             case DATA_PICK:
248                 builder.setTitle(R.string.select_sim_for_data);
249                 break;
250             case CALLS_PICK:
251                 builder.setTitle(R.string.select_sim_for_calls);
252                 break;
253             case SMS_PICK:
254                 builder.setTitle(R.string.sim_card_select_title);
255                 break;
256             default:
257                 throw new IllegalArgumentException("Invalid dialog type "
258                         + id + " in SIM dialog.");
259         }
260 
261         Dialog dialog = builder.setAdapter(adapter, selectionListener).create();
262         dialog.setOnKeyListener(keyListener);
263 
264         dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
265             @Override
266             public void onCancel(DialogInterface dialogInterface) {
267                 finish();
268             }
269         });
270 
271         return dialog;
272 
273     }
274 
275     private class SelectAccountListAdapter extends ArrayAdapter<String> {
276         private Context mContext;
277         private int mResId;
278         private int mDialogId;
279         private final float OPACITY = 0.54f;
280         private List<SubscriptionInfo> mSubInfoList;
281 
SelectAccountListAdapter(List<SubscriptionInfo> subInfoList, Context context, int resource, String[] arr, int dialogId)282         public SelectAccountListAdapter(List<SubscriptionInfo> subInfoList,
283                 Context context, int resource, String[] arr, int dialogId) {
284             super(context, resource, arr);
285             mContext = context;
286             mResId = resource;
287             mDialogId = dialogId;
288             mSubInfoList = subInfoList;
289         }
290 
291         @Override
getView(int position, View convertView, ViewGroup parent)292         public View getView(int position, View convertView, ViewGroup parent) {
293             LayoutInflater inflater = (LayoutInflater)
294                     mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
295             View rowView;
296             final ViewHolder holder;
297 
298             if (convertView == null) {
299                 // Cache views for faster scrolling
300                 rowView = inflater.inflate(mResId, null);
301                 holder = new ViewHolder();
302                 holder.title = (TextView) rowView.findViewById(R.id.title);
303                 holder.summary = (TextView) rowView.findViewById(R.id.summary);
304                 holder.icon = (ImageView) rowView.findViewById(R.id.icon);
305                 rowView.setTag(holder);
306             } else {
307                 rowView = convertView;
308                 holder = (ViewHolder) rowView.getTag();
309             }
310 
311             final SubscriptionInfo sir = mSubInfoList.get(position);
312             if (sir == null) {
313                 holder.title.setText(getItem(position));
314                 holder.summary.setText("");
315                 holder.icon.setImageDrawable(getResources()
316                         .getDrawable(R.drawable.ic_live_help));
317                 holder.icon.setAlpha(OPACITY);
318             } else {
319                 holder.title.setText(sir.getDisplayName());
320                 holder.summary.setText(sir.getNumber());
321                 holder.icon.setImageBitmap(sir.createIconBitmap(mContext));
322             }
323             return rowView;
324         }
325 
326         private class ViewHolder {
327             TextView title;
328             TextView summary;
329             ImageView icon;
330         }
331     }
332 }
333