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