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