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 android.telephony; 18 19 import android.content.Context; 20 import android.graphics.Bitmap; 21 import android.graphics.Canvas; 22 import android.graphics.Color; 23 import android.graphics.Paint; 24 import android.graphics.PorterDuff; 25 import android.graphics.PorterDuffColorFilter; 26 import android.graphics.Rect; 27 import android.graphics.Typeface; 28 import android.os.Build; 29 import android.os.Parcel; 30 import android.os.Parcelable; 31 import android.util.DisplayMetrics; 32 33 /** 34 * A Parcelable class for Subscription Information. 35 */ 36 public class SubscriptionInfo implements Parcelable { 37 38 /** 39 * Size of text to render on the icon. 40 */ 41 private static final int TEXT_SIZE = 16; 42 43 /** 44 * Subscription Identifier, this is a device unique number 45 * and not an index into an array 46 */ 47 private int mId; 48 49 /** 50 * The GID for a SIM that maybe associated with this subscription, empty if unknown 51 */ 52 private String mIccId; 53 54 /** 55 * The index of the slot that currently contains the subscription 56 * and not necessarily unique and maybe INVALID_SLOT_ID if unknown 57 */ 58 private int mSimSlotIndex; 59 60 /** 61 * The name displayed to the user that identifies this subscription 62 */ 63 private CharSequence mDisplayName; 64 65 /** 66 * String that identifies SPN/PLMN 67 * TODO : Add a new field that identifies only SPN for a sim 68 */ 69 private CharSequence mCarrierName; 70 71 /** 72 * The source of the name, NAME_SOURCE_UNDEFINED, NAME_SOURCE_DEFAULT_SOURCE, 73 * NAME_SOURCE_SIM_SOURCE or NAME_SOURCE_USER_INPUT. 74 */ 75 private int mNameSource; 76 77 /** 78 * The color to be used for tinting the icon when displaying to the user 79 */ 80 private int mIconTint; 81 82 /** 83 * A number presented to the user identify this subscription 84 */ 85 private String mNumber; 86 87 /** 88 * Data roaming state, DATA_RAOMING_ENABLE, DATA_RAOMING_DISABLE 89 */ 90 private int mDataRoaming; 91 92 /** 93 * SIM Icon bitmap 94 */ 95 private Bitmap mIconBitmap; 96 97 /** 98 * Mobile Country Code 99 */ 100 private int mMcc; 101 102 /** 103 * Mobile Network Code 104 */ 105 private int mMnc; 106 107 /** 108 * ISO Country code for the subscription's provider 109 */ 110 private String mCountryIso; 111 112 /** 113 * @hide 114 */ SubscriptionInfo(int id, String iccId, int simSlotIndex, CharSequence displayName, CharSequence carrierName, int nameSource, int iconTint, String number, int roaming, Bitmap icon, int mcc, int mnc, String countryIso)115 public SubscriptionInfo(int id, String iccId, int simSlotIndex, CharSequence displayName, 116 CharSequence carrierName, int nameSource, int iconTint, String number, int roaming, 117 Bitmap icon, int mcc, int mnc, String countryIso) { 118 this.mId = id; 119 this.mIccId = iccId; 120 this.mSimSlotIndex = simSlotIndex; 121 this.mDisplayName = displayName; 122 this.mCarrierName = carrierName; 123 this.mNameSource = nameSource; 124 this.mIconTint = iconTint; 125 this.mNumber = number; 126 this.mDataRoaming = roaming; 127 this.mIconBitmap = icon; 128 this.mMcc = mcc; 129 this.mMnc = mnc; 130 this.mCountryIso = countryIso; 131 } 132 133 /** 134 * @return the subscription ID. 135 */ getSubscriptionId()136 public int getSubscriptionId() { 137 return this.mId; 138 } 139 140 /** 141 * @return the ICC ID. 142 */ getIccId()143 public String getIccId() { 144 return this.mIccId; 145 } 146 147 /** 148 * @return the slot index of this Subscription's SIM card. 149 */ getSimSlotIndex()150 public int getSimSlotIndex() { 151 return this.mSimSlotIndex; 152 } 153 154 /** 155 * @return the name displayed to the user that identifies this subscription 156 */ getDisplayName()157 public CharSequence getDisplayName() { 158 return this.mDisplayName; 159 } 160 161 /** 162 * Sets the name displayed to the user that identifies this subscription 163 * @hide 164 */ setDisplayName(CharSequence name)165 public void setDisplayName(CharSequence name) { 166 this.mDisplayName = name; 167 } 168 169 /** 170 * @return the name displayed to the user that identifies Subscription provider name 171 */ getCarrierName()172 public CharSequence getCarrierName() { 173 return this.mCarrierName; 174 } 175 176 /** 177 * Sets the name displayed to the user that identifies Subscription provider name 178 * @hide 179 */ setCarrierName(CharSequence name)180 public void setCarrierName(CharSequence name) { 181 this.mCarrierName = name; 182 } 183 184 /** 185 * @return the source of the name, eg NAME_SOURCE_UNDEFINED, NAME_SOURCE_DEFAULT_SOURCE, 186 * NAME_SOURCE_SIM_SOURCE or NAME_SOURCE_USER_INPUT. 187 * @hide 188 */ getNameSource()189 public int getNameSource() { 190 return this.mNameSource; 191 } 192 193 /** 194 * Creates and returns an icon {@code Bitmap} to represent this {@code SubscriptionInfo} in a user 195 * interface. 196 * 197 * @param context A {@code Context} to get the {@code DisplayMetrics}s from. 198 * 199 * @return A bitmap icon for this {@code SubscriptionInfo}. 200 */ createIconBitmap(Context context)201 public Bitmap createIconBitmap(Context context) { 202 int width = mIconBitmap.getWidth(); 203 int height = mIconBitmap.getHeight(); 204 DisplayMetrics metrics = context.getResources().getDisplayMetrics(); 205 206 // Create a new bitmap of the same size because it will be modified. 207 Bitmap workingBitmap = Bitmap.createBitmap(metrics, width, height, mIconBitmap.getConfig()); 208 209 Canvas canvas = new Canvas(workingBitmap); 210 Paint paint = new Paint(); 211 212 // Tint the icon with the color. 213 paint.setColorFilter(new PorterDuffColorFilter(mIconTint, PorterDuff.Mode.SRC_ATOP)); 214 canvas.drawBitmap(mIconBitmap, 0, 0, paint); 215 paint.setColorFilter(null); 216 217 // Write the sim slot index. 218 paint.setAntiAlias(true); 219 paint.setTypeface(Typeface.create("sans-serif", Typeface.NORMAL)); 220 paint.setColor(Color.WHITE); 221 // Set text size scaled by density 222 paint.setTextSize(TEXT_SIZE * metrics.density); 223 // Convert sim slot index to localized string 224 final String index = String.format("%d", mSimSlotIndex + 1); 225 final Rect textBound = new Rect(); 226 paint.getTextBounds(index, 0, 1, textBound); 227 final float xOffset = (width / 2.f) - textBound.centerX(); 228 final float yOffset = (height / 2.f) - textBound.centerY(); 229 canvas.drawText(index, xOffset, yOffset, paint); 230 231 return workingBitmap; 232 } 233 234 /** 235 * A highlight color to use in displaying information about this {@code PhoneAccount}. 236 * 237 * @return A hexadecimal color value. 238 */ getIconTint()239 public int getIconTint() { 240 return mIconTint; 241 } 242 243 /** 244 * Sets the color displayed to the user that identifies this subscription 245 * @hide 246 */ setIconTint(int iconTint)247 public void setIconTint(int iconTint) { 248 this.mIconTint = iconTint; 249 } 250 251 /** 252 * @return the number of this subscription. 253 */ getNumber()254 public String getNumber() { 255 return mNumber; 256 } 257 258 /** 259 * @return the data roaming state for this subscription, either 260 * {@link SubscriptionManager#DATA_ROAMING_ENABLE} or {@link SubscriptionManager#DATA_ROAMING_DISABLE}. 261 */ getDataRoaming()262 public int getDataRoaming() { 263 return this.mDataRoaming; 264 } 265 266 /** 267 * @return the MCC. 268 */ getMcc()269 public int getMcc() { 270 return this.mMcc; 271 } 272 273 /** 274 * @return the MNC. 275 */ getMnc()276 public int getMnc() { 277 return this.mMnc; 278 } 279 280 /** 281 * @return the ISO country code 282 */ getCountryIso()283 public String getCountryIso() { 284 return this.mCountryIso; 285 } 286 287 public static final Parcelable.Creator<SubscriptionInfo> CREATOR = new Parcelable.Creator<SubscriptionInfo>() { 288 @Override 289 public SubscriptionInfo createFromParcel(Parcel source) { 290 int id = source.readInt(); 291 String iccId = source.readString(); 292 int simSlotIndex = source.readInt(); 293 CharSequence displayName = source.readCharSequence(); 294 CharSequence carrierName = source.readCharSequence(); 295 int nameSource = source.readInt(); 296 int iconTint = source.readInt(); 297 String number = source.readString(); 298 int dataRoaming = source.readInt(); 299 int mcc = source.readInt(); 300 int mnc = source.readInt(); 301 String countryIso = source.readString(); 302 Bitmap iconBitmap = Bitmap.CREATOR.createFromParcel(source); 303 304 return new SubscriptionInfo(id, iccId, simSlotIndex, displayName, carrierName, 305 nameSource, iconTint, number, dataRoaming, iconBitmap, mcc, mnc, countryIso); 306 } 307 308 @Override 309 public SubscriptionInfo[] newArray(int size) { 310 return new SubscriptionInfo[size]; 311 } 312 }; 313 314 @Override writeToParcel(Parcel dest, int flags)315 public void writeToParcel(Parcel dest, int flags) { 316 dest.writeInt(mId); 317 dest.writeString(mIccId); 318 dest.writeInt(mSimSlotIndex); 319 dest.writeCharSequence(mDisplayName); 320 dest.writeCharSequence(mCarrierName); 321 dest.writeInt(mNameSource); 322 dest.writeInt(mIconTint); 323 dest.writeString(mNumber); 324 dest.writeInt(mDataRoaming); 325 dest.writeInt(mMcc); 326 dest.writeInt(mMnc); 327 dest.writeString(mCountryIso); 328 mIconBitmap.writeToParcel(dest, flags); 329 } 330 331 @Override describeContents()332 public int describeContents() { 333 return 0; 334 } 335 336 /** 337 * @hide 338 */ givePrintableIccid(String iccId)339 public static String givePrintableIccid(String iccId) { 340 String iccIdToPrint = null; 341 if (iccId != null) { 342 if (iccId.length() > 9 && !Build.IS_DEBUGGABLE) { 343 iccIdToPrint = iccId.substring(0, 9) + "XXXXXXXXXXX"; 344 } else { 345 iccIdToPrint = iccId; 346 } 347 } 348 return iccIdToPrint; 349 } 350 351 @Override toString()352 public String toString() { 353 String iccIdToPrint = givePrintableIccid(mIccId); 354 return "{id=" + mId + ", iccId=" + iccIdToPrint + " simSlotIndex=" + mSimSlotIndex 355 + " displayName=" + mDisplayName + " carrierName=" + mCarrierName 356 + " nameSource=" + mNameSource + " iconTint=" + mIconTint 357 + " dataRoaming=" + mDataRoaming + " iconBitmap=" + mIconBitmap + " mcc " + mMcc 358 + " mnc " + mMnc + "}"; 359 } 360 } 361