diff options
Diffstat (limited to 'src/com/android/settings/sim/SimDialogActivity.java')
-rw-r--r-- | src/com/android/settings/sim/SimDialogActivity.java | 152 |
1 files changed, 140 insertions, 12 deletions
diff --git a/src/com/android/settings/sim/SimDialogActivity.java b/src/com/android/settings/sim/SimDialogActivity.java index 03a9daf..b4c7f03 100644 --- a/src/com/android/settings/sim/SimDialogActivity.java +++ b/src/com/android/settings/sim/SimDialogActivity.java @@ -21,11 +21,16 @@ import android.app.AlertDialog; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; import android.content.res.Resources; import android.os.Bundle; +import android.os.RemoteException; +import android.os.ServiceManager; import android.telecom.PhoneAccount; import android.telecom.PhoneAccountHandle; import android.telecom.TelecomManager; +import android.telephony.SmsManager; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; @@ -33,12 +38,16 @@ import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.util.Log; import android.widget.ArrayAdapter; import android.widget.ImageView; import android.widget.ListAdapter; +import android.widget.RadioButton; import android.widget.TextView; import android.widget.Toast; +import com.android.internal.telephony.IExtTelephony; +import com.android.internal.telephony.SmsApplication; import com.android.settings.R; import com.android.settings.Utils; import java.util.ArrayList; @@ -56,11 +65,17 @@ public class SimDialogActivity extends Activity { public static final int SMS_PICK = 2; public static final int PREFERRED_PICK = 3; + private boolean mHideAlwaysAsk = false; + + private IExtTelephony mExtTelephony = IExtTelephony.Stub. + asInterface(ServiceManager.getService("extphone")); + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); final Bundle extras = getIntent().getExtras(); final int dialogType = extras.getInt(DIALOG_TYPE_KEY, INVALID_PICK); + mHideAlwaysAsk = !SmsApplication.canSmsAppHandleAlwaysAsk(this) && dialogType == SMS_PICK; switch (dialogType) { case DATA_PICK: @@ -152,6 +167,7 @@ public class SimDialogActivity extends Activity { public Dialog createDialog(final Context context, final int id) { final ArrayList<String> list = new ArrayList<String>(); final SubscriptionManager subscriptionManager = SubscriptionManager.from(context); + final ArrayList<SubscriptionInfo> smsSubInfoList = new ArrayList<SubscriptionInfo>(); final List<SubscriptionInfo> subInfoList = subscriptionManager.getActiveSubscriptionInfoList(); final int selectableSubInfoLength = subInfoList == null ? 0 : subInfoList.size(); @@ -166,7 +182,12 @@ public class SimDialogActivity extends Activity { switch (id) { case DATA_PICK: sir = subInfoList.get(value); - setDefaultDataSubId(context, sir.getSubscriptionId()); + SubscriptionInfo defaultSub = subscriptionManager + .getDefaultDataSubscriptionInfo(); + if (defaultSub == null || defaultSub.getSubscriptionId() + != sir.getSubscriptionId()) { + setDefaultDataSubId(context, sir.getSubscriptionId()); + } break; case CALLS_PICK: final TelecomManager telecomManager = @@ -177,8 +198,32 @@ public class SimDialogActivity extends Activity { value < 1 ? null : phoneAccountsList.get(value - 1)); break; case SMS_PICK: - sir = subInfoList.get(value); - setDefaultSmsSubId(context, sir.getSubscriptionId()); + boolean isSmsPrompt = false; + if (value < 1) { + isSmsPrompt = false; // user knows best + setDefaultSmsSubId(context, SubscriptionManager.INVALID_SUBSCRIPTION_ID); + } else { + sir = smsSubInfoList.get(value); + if ( sir != null) { + setDefaultSmsSubId(context, sir.getSubscriptionId()); + } else { + isSmsPrompt = true; + } + Log.d(TAG, "SubscriptionInfo:" + sir); + } + Log.d(TAG, "isSmsPrompt: " + isSmsPrompt); + try { + mExtTelephony.setSMSPromptEnabled(isSmsPrompt); + } catch (RemoteException ex) { + Log.e(TAG, "RemoteException @setSMSPromptEnabled" + ex); + } catch (NullPointerException ex) { + Log.e(TAG, "NullPointerException @setSMSPromptEnabled" + ex); + } + + //Regardless, ignore the secondary telephony framework + if (mExtTelephony == null) { + SmsManager.getDefault().setSMSPromptEnabled(isSmsPrompt); + } break; default: throw new IllegalArgumentException("Invalid dialog type " @@ -200,19 +245,25 @@ public class SimDialogActivity extends Activity { } }; + int currentIndex = 0; 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(); - + PhoneAccountHandle defaultPhoneAccount = + telecomManager.getUserSelectedOutgoingPhoneAccount(); 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()); + if (defaultPhoneAccount != null && defaultPhoneAccount.equals( + phoneAccount.getAccountHandle())) { + currentIndex = list.size() - 1; + } int subId = telephonyManager.getSubIdForPhoneAccount(phoneAccount); if (subId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) { final SubscriptionInfo sir = SubscriptionManager.from(context) @@ -222,7 +273,41 @@ public class SimDialogActivity extends Activity { callsSubInfoList.add(null); } } + } else if ((id == SMS_PICK)){ + list.add(getResources().getString(R.string.sim_calls_ask_first_prefs_title)); + smsSubInfoList.add(null); + SubscriptionInfo defaultSub = subscriptionManager.getActiveSubscriptionInfo( + SubscriptionManager.getDefaultSmsSubId()); + boolean isSMSPrompt = false; + try { + isSMSPrompt = mExtTelephony.isSMSPromptEnabled(); + } catch (RemoteException | NullPointerException e) { + // Assume sms prompt is disabled + } + // External telephony interfaces may not exist, fall back to our impl + if (mExtTelephony == null) { + isSMSPrompt = SmsManager.getDefault().isSMSPromptEnabled(); + } + for (int i = 0; i < selectableSubInfoLength; ++i) { + final SubscriptionInfo sir = subInfoList.get(i); + smsSubInfoList.add(sir); + CharSequence displayName = sir.getDisplayName(); + if (displayName == null) { + displayName = ""; + } + list.add(displayName.toString()); + if (!isSMSPrompt && defaultSub != null && sir.getSubscriptionId() + == defaultSub.getSubscriptionId()) { + currentIndex = list.size() - 1; + } + } + if (mHideAlwaysAsk && currentIndex == 0) { + // unselect always ask because user can't select it. + currentIndex = -1; + } } else { + currentIndex = -1; + final int defaultDataSubId = SubscriptionManager.getDefaultDataSubId(); for (int i = 0; i < selectableSubInfoLength; ++i) { final SubscriptionInfo sir = subInfoList.get(i); CharSequence displayName = sir.getDisplayName(); @@ -230,6 +315,9 @@ public class SimDialogActivity extends Activity { displayName = ""; } list.add(displayName.toString()); + if (defaultDataSubId == sir.getSubscriptionId()) { + currentIndex = list.size() - 1; + } } } @@ -237,12 +325,6 @@ public class SimDialogActivity extends Activity { 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); @@ -258,6 +340,12 @@ public class SimDialogActivity extends Activity { + id + " in SIM dialog."); } + ListAdapter adapter = new SelectAccountListAdapter( + id == CALLS_PICK ? callsSubInfoList : + (id == SMS_PICK ? smsSubInfoList: subInfoList), + builder.getContext(), + R.layout.select_account_list_item, + arr, id, currentIndex); Dialog dialog = builder.setAdapter(adapter, selectionListener).create(); dialog.setOnKeyListener(keyListener); @@ -267,6 +355,11 @@ public class SimDialogActivity extends Activity { finish(); } }); + if (mHideAlwaysAsk) { + // make sure the user doesn't click out accidentally and we keep spamming them + // with dialogs + dialog.setCancelable(false); + } return dialog; @@ -278,14 +371,26 @@ public class SimDialogActivity extends Activity { private int mDialogId; private final float OPACITY = 0.54f; private List<SubscriptionInfo> mSubInfoList; + private final int mSelectionIndex; + + @Override + public boolean areAllItemsEnabled() { + return false; + } + + @Override + public boolean isEnabled(int position) { + return !(mHideAlwaysAsk && mSubInfoList.get(position) == null); + } public SelectAccountListAdapter(List<SubscriptionInfo> subInfoList, - Context context, int resource, String[] arr, int dialogId) { + Context context, int resource, String[] arr, int dialogId, int selectionIndex) { super(context, resource, arr); mContext = context; mResId = resource; mDialogId = dialogId; mSubInfoList = subInfoList; + mSelectionIndex = selectionIndex; } @Override @@ -302,31 +407,54 @@ public class SimDialogActivity extends Activity { holder.title = (TextView) rowView.findViewById(R.id.title); holder.summary = (TextView) rowView.findViewById(R.id.summary); holder.icon = (ImageView) rowView.findViewById(R.id.icon); + holder.radio = (RadioButton) rowView.findViewById(R.id.radio); rowView.setTag(holder); } else { rowView = convertView; holder = (ViewHolder) rowView.getTag(); } + final boolean enabled = isEnabled(position); final SubscriptionInfo sir = mSubInfoList.get(position); if (sir == null) { holder.title.setText(getItem(position)); - holder.summary.setText(""); + holder.summary.setText(mHideAlwaysAsk + ? getString(R.string.not_available_with_app, getCurrentSmsAppName()) + : null); + holder.summary.setVisibility(View.VISIBLE); 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.summary.setVisibility(View.VISIBLE); holder.icon.setImageBitmap(sir.createIconBitmap(mContext)); } + holder.radio.setChecked(position == mSelectionIndex); + holder.radio.setEnabled(enabled); + holder.title.setEnabled(enabled); + holder.summary.setEnabled(enabled); return rowView; } + private String getCurrentSmsAppName() { + try { + final ApplicationInfo applicationInfo = getPackageManager().getApplicationInfo( + SmsApplication.getDefaultMmsApplication(getApplicationContext(), false) + .getPackageName(), 0); + return getPackageManager().getApplicationLabel(applicationInfo).toString(); + } catch (PackageManager.NameNotFoundException e) { + e.printStackTrace(); + } + return null; + } + private class ViewHolder { TextView title; TextView summary; ImageView icon; + RadioButton radio; } } } |