1 /* 2 * Copyright (C) 2015 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 package com.android.settings.sim; 17 18 import android.app.Activity; 19 import android.app.AlertDialog; 20 import android.content.Context; 21 import android.content.DialogInterface; 22 import android.content.res.Resources; 23 import android.graphics.Paint; 24 import android.graphics.drawable.ShapeDrawable; 25 import android.graphics.drawable.shapes.OvalShape; 26 import android.os.Bundle; 27 import android.telephony.PhoneNumberUtils; 28 import android.telephony.SubscriptionInfo; 29 import android.telephony.SubscriptionManager; 30 import android.telephony.TelephonyManager; 31 import android.text.TextUtils; 32 import android.view.LayoutInflater; 33 import android.view.View; 34 import android.view.ViewGroup; 35 import android.widget.AdapterView; 36 import android.widget.ArrayAdapter; 37 import android.widget.EditText; 38 import android.widget.ImageView; 39 import android.widget.Spinner; 40 import android.widget.TextView; 41 42 import com.android.settings.R; 43 import com.android.settings.Utils; 44 45 public class SimPreferenceDialog extends Activity { 46 47 private Context mContext; 48 private SubscriptionInfo mSubInfoRecord; 49 private int mSlotId; 50 private int[] mTintArr; 51 private String[] mColorStrings; 52 private int mTintSelectorPos; 53 private SubscriptionManager mSubscriptionManager; 54 AlertDialog.Builder mBuilder; 55 View mDialogLayout; 56 private final String SIM_NAME = "sim_name"; 57 private final String TINT_POS = "tint_pos"; 58 59 @Override 60 public void onCreate(Bundle bundle) { 61 super.onCreate(bundle); 62 mContext = this; 63 final Bundle extras = getIntent().getExtras(); 64 mSlotId = extras.getInt(SimSettings.EXTRA_SLOT_ID, -1); 65 mSubscriptionManager = SubscriptionManager.from(mContext); 66 mSubInfoRecord = mSubscriptionManager.getActiveSubscriptionInfoForSimSlotIndex(mSlotId); 67 mTintArr = mContext.getResources().getIntArray(com.android.internal.R.array.sim_colors); 68 mColorStrings = mContext.getResources().getStringArray(R.array.color_picker); 69 mTintSelectorPos = 0; 70 71 mBuilder = new AlertDialog.Builder(mContext); 72 LayoutInflater inflater = (LayoutInflater)mContext 73 .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 74 mDialogLayout = inflater.inflate(R.layout.multi_sim_dialog, null); 75 mBuilder.setView(mDialogLayout); 76 77 createEditDialog(bundle); 78 } 79 80 @Override 81 public void onSaveInstanceState(Bundle savedInstanceState) { 82 savedInstanceState.putInt(TINT_POS, mTintSelectorPos); 83 84 final EditText nameText = (EditText)mDialogLayout.findViewById(R.id.sim_name); 85 savedInstanceState.putString(SIM_NAME, nameText.getText().toString()); 86 87 super.onSaveInstanceState(savedInstanceState); 88 89 } 90 91 @Override 92 public void onRestoreInstanceState(Bundle savedInstanceState) { 93 super.onRestoreInstanceState(savedInstanceState); 94 95 int pos = savedInstanceState.getInt(TINT_POS); 96 final Spinner tintSpinner = (Spinner) mDialogLayout.findViewById(R.id.spinner); 97 tintSpinner.setSelection(pos); 98 mTintSelectorPos = pos; 99 100 EditText nameText = (EditText)mDialogLayout.findViewById(R.id.sim_name); 101 nameText.setText(savedInstanceState.getString(SIM_NAME)); 102 Utils.setEditTextCursorPosition(nameText); 103 } 104 105 private void createEditDialog(Bundle bundle) { 106 final Resources res = mContext.getResources(); 107 EditText nameText = (EditText)mDialogLayout.findViewById(R.id.sim_name); 108 nameText.setText(mSubInfoRecord.getDisplayName()); 109 Utils.setEditTextCursorPosition(nameText); 110 final Spinner tintSpinner = (Spinner) mDialogLayout.findViewById(R.id.spinner); 111 SelectColorAdapter adapter = new SelectColorAdapter(mContext, 112 R.layout.settings_color_picker_item, mColorStrings); 113 adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 114 tintSpinner.setAdapter(adapter); 115 116 for (int i = 0; i < mTintArr.length; i++) { 117 if (mTintArr[i] == mSubInfoRecord.getIconTint()) { 118 tintSpinner.setSelection(i); 119 mTintSelectorPos = i; 120 break; 121 } 122 } 123 124 tintSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 125 @Override 126 public void onItemSelected(AdapterView<?> parent, View view, 127 int pos, long id){ 128 tintSpinner.setSelection(pos); 129 mTintSelectorPos = pos; 130 } 131 132 @Override 133 public void onNothingSelected(AdapterView<?> parent) { 134 } 135 }); 136 137 final TelephonyManager tm = (TelephonyManager) mContext.getSystemService( 138 Context.TELEPHONY_SERVICE); 139 TextView numberView = (TextView)mDialogLayout.findViewById(R.id.number); 140 final String rawNumber = tm.getLine1Number(mSubInfoRecord.getSubscriptionId()); 141 if (TextUtils.isEmpty(rawNumber)) { 142 numberView.setText(res.getString(com.android.internal.R.string.unknownName)); 143 } else { 144 numberView.setText(PhoneNumberUtils.formatNumber(rawNumber)); 145 } 146 147 String simCarrierName = tm.getSimOperatorName(mSubInfoRecord.getSubscriptionId()); 148 TextView carrierView = (TextView)mDialogLayout.findViewById(R.id.carrier); 149 carrierView.setText(!TextUtils.isEmpty(simCarrierName) ? simCarrierName : 150 mContext.getString(com.android.internal.R.string.unknownName)); 151 152 mBuilder.setTitle(String.format(res.getString(R.string.sim_editor_title), 153 (mSubInfoRecord.getSimSlotIndex() + 1))); 154 155 mBuilder.setPositiveButton(R.string.okay, new DialogInterface.OnClickListener() { 156 @Override 157 public void onClick(DialogInterface dialog, int whichButton) { 158 final EditText nameText = (EditText)mDialogLayout.findViewById(R.id.sim_name); 159 Utils.setEditTextCursorPosition(nameText); 160 String displayName = nameText.getText().toString(); 161 int subId = mSubInfoRecord.getSubscriptionId(); 162 mSubInfoRecord.setDisplayName(displayName); 163 mSubscriptionManager.setDisplayName(displayName, subId, 164 SubscriptionManager.NAME_SOURCE_USER_INPUT); 165 166 final int tintSelected = tintSpinner.getSelectedItemPosition(); 167 int subscriptionId = mSubInfoRecord.getSubscriptionId(); 168 int tint = mTintArr[tintSelected]; 169 mSubInfoRecord.setIconTint(tint); 170 mSubscriptionManager.setIconTint(tint, subscriptionId); 171 dialog.dismiss(); 172 } 173 }); 174 175 mBuilder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { 176 @Override 177 public void onClick(DialogInterface dialog, int whichButton) { 178 dialog.dismiss(); 179 } 180 }); 181 182 mBuilder.setOnDismissListener(new DialogInterface.OnDismissListener() { 183 @Override 184 public void onDismiss(DialogInterface dialogInListener) { 185 finish(); 186 } 187 }); 188 189 mBuilder.create().show(); 190 } 191 192 private class SelectColorAdapter extends ArrayAdapter<CharSequence> { 193 private Context mContext; 194 private int mResId; 195 196 public SelectColorAdapter( 197 Context context, int resource, String[] arr) { 198 super(context, resource, arr); 199 mContext = context; 200 mResId = resource; 201 } 202 203 @Override 204 public View getView(int position, View convertView, ViewGroup parent) { 205 LayoutInflater inflater = (LayoutInflater) 206 mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 207 208 View rowView; 209 final ViewHolder holder; 210 Resources res = mContext.getResources(); 211 int iconSize = res.getDimensionPixelSize(R.dimen.color_swatch_size); 212 int strokeWidth = res.getDimensionPixelSize(R.dimen.color_swatch_stroke_width); 213 214 if (convertView == null) { 215 // Cache views for faster scrolling 216 rowView = inflater.inflate(mResId, null); 217 holder = new ViewHolder(); 218 ShapeDrawable drawable = new ShapeDrawable(new OvalShape()); 219 drawable.setIntrinsicHeight(iconSize); 220 drawable.setIntrinsicWidth(iconSize); 221 drawable.getPaint().setStrokeWidth(strokeWidth); 222 holder.label = (TextView) rowView.findViewById(R.id.color_text); 223 holder.icon = (ImageView) rowView.findViewById(R.id.color_icon); 224 holder.swatch = drawable; 225 rowView.setTag(holder); 226 } else { 227 rowView = convertView; 228 holder = (ViewHolder) rowView.getTag(); 229 } 230 231 holder.label.setText(getItem(position)); 232 holder.swatch.getPaint().setColor(mTintArr[position]); 233 holder.swatch.getPaint().setStyle(Paint.Style.FILL_AND_STROKE); 234 holder.icon.setVisibility(View.VISIBLE); 235 holder.icon.setImageDrawable(holder.swatch); 236 return rowView; 237 } 238 239 @Override 240 public View getDropDownView(int position, View convertView, ViewGroup parent) { 241 View rowView = getView(position, convertView, parent); 242 final ViewHolder holder = (ViewHolder) rowView.getTag(); 243 244 if (mTintSelectorPos == position) { 245 holder.swatch.getPaint().setStyle(Paint.Style.FILL_AND_STROKE); 246 } else { 247 holder.swatch.getPaint().setStyle(Paint.Style.STROKE); 248 } 249 holder.icon.setVisibility(View.VISIBLE); 250 return rowView; 251 } 252 253 private class ViewHolder { 254 TextView label; 255 ImageView icon; 256 ShapeDrawable swatch; 257 } 258 } 259 } 260