Home | History | Annotate | Download | only in telephony
      1 /*
      2  * Copyright (C) 2007 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.internal.telephony;
     17 
     18 import java.io.FileDescriptor;
     19 import java.io.PrintWriter;
     20 
     21 import android.content.Context;
     22 import android.content.pm.PackageManager;
     23 import android.os.Binder;
     24 import android.telephony.PhoneNumberUtils;
     25 import android.telephony.Rlog;
     26 
     27 import com.android.internal.telephony.uicc.IsimRecords;
     28 
     29 public class PhoneSubInfo extends IPhoneSubInfo.Stub {
     30     static final String LOG_TAG = "PhoneSubInfo";
     31     private static final boolean DBG = true;
     32     private static final boolean VDBG = false; // STOPSHIP if true
     33 
     34     private Phone mPhone;
     35     private Context mContext;
     36     private static final String READ_PHONE_STATE =
     37         android.Manifest.permission.READ_PHONE_STATE;
     38     // TODO: change getCompleteVoiceMailNumber() to require READ_PRIVILEGED_PHONE_STATE
     39     private static final String CALL_PRIVILEGED =
     40         android.Manifest.permission.CALL_PRIVILEGED;
     41     private static final String READ_PRIVILEGED_PHONE_STATE =
     42         android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE;
     43 
     44     public PhoneSubInfo(Phone phone) {
     45         mPhone = phone;
     46         mContext = phone.getContext();
     47     }
     48 
     49     public void dispose() {
     50     }
     51 
     52     @Override
     53     protected void finalize() {
     54         try {
     55             super.finalize();
     56         } catch (Throwable throwable) {
     57             loge("Error while finalizing:", throwable);
     58         }
     59         if (DBG) log("PhoneSubInfo finalized");
     60     }
     61 
     62     /**
     63      * Retrieves the unique device ID, e.g., IMEI for GSM phones and MEID for CDMA phones.
     64      */
     65     @Override
     66     public String getDeviceId() {
     67         mContext.enforceCallingOrSelfPermission(READ_PHONE_STATE, "Requires READ_PHONE_STATE");
     68         return mPhone.getDeviceId();
     69     }
     70 
     71     /**
     72      * Retrieves the software version number for the device, e.g., IMEI/SV
     73      * for GSM phones.
     74      */
     75     @Override
     76     public String getDeviceSvn() {
     77         mContext.enforceCallingOrSelfPermission(READ_PHONE_STATE, "Requires READ_PHONE_STATE");
     78         return mPhone.getDeviceSvn();
     79     }
     80 
     81     /**
     82      * Retrieves the unique subscriber ID, e.g., IMSI for GSM phones.
     83      */
     84     @Override
     85     public String getSubscriberId() {
     86         mContext.enforceCallingOrSelfPermission(READ_PHONE_STATE, "Requires READ_PHONE_STATE");
     87         return mPhone.getSubscriberId();
     88     }
     89 
     90     /**
     91      * Retrieves the Group Identifier Level1 for GSM phones.
     92      */
     93     public String getGroupIdLevel1() {
     94         mContext.enforceCallingOrSelfPermission(READ_PHONE_STATE, "Requires READ_PHONE_STATE");
     95         return mPhone.getGroupIdLevel1();
     96     }
     97 
     98     /**
     99      * Retrieves the serial number of the ICC, if applicable.
    100      */
    101     @Override
    102     public String getIccSerialNumber() {
    103         mContext.enforceCallingOrSelfPermission(READ_PHONE_STATE, "Requires READ_PHONE_STATE");
    104         return mPhone.getIccSerialNumber();
    105     }
    106 
    107     /**
    108      * Retrieves the phone number string for line 1.
    109      */
    110     @Override
    111     public String getLine1Number() {
    112         mContext.enforceCallingOrSelfPermission(READ_PHONE_STATE, "Requires READ_PHONE_STATE");
    113         return mPhone.getLine1Number();
    114     }
    115 
    116     /**
    117      * Retrieves the alpha identifier for line 1.
    118      */
    119     @Override
    120     public String getLine1AlphaTag() {
    121         mContext.enforceCallingOrSelfPermission(READ_PHONE_STATE, "Requires READ_PHONE_STATE");
    122         return mPhone.getLine1AlphaTag();
    123     }
    124 
    125     /**
    126      * Retrieves the MSISDN string.
    127      */
    128     @Override
    129     public String getMsisdn() {
    130         mContext.enforceCallingOrSelfPermission(READ_PHONE_STATE, "Requires READ_PHONE_STATE");
    131         return mPhone.getMsisdn();
    132     }
    133 
    134     /**
    135      * Retrieves the voice mail number.
    136      */
    137     @Override
    138     public String getVoiceMailNumber() {
    139         mContext.enforceCallingOrSelfPermission(READ_PHONE_STATE, "Requires READ_PHONE_STATE");
    140         String number = PhoneNumberUtils.extractNetworkPortion(mPhone.getVoiceMailNumber());
    141         if (VDBG) log("VM: PhoneSubInfo.getVoiceMailNUmber: " + number);
    142         return number;
    143     }
    144 
    145     /**
    146      * Retrieves the complete voice mail number.
    147      *
    148      * @hide
    149      */
    150     @Override
    151     public String getCompleteVoiceMailNumber() {
    152         mContext.enforceCallingOrSelfPermission(CALL_PRIVILEGED,
    153                 "Requires CALL_PRIVILEGED");
    154         String number = mPhone.getVoiceMailNumber();
    155         if (VDBG) log("VM: PhoneSubInfo.getCompleteVoiceMailNUmber: " + number);
    156         return number;
    157     }
    158 
    159     /**
    160      * Retrieves the alpha identifier associated with the voice mail number.
    161      */
    162     @Override
    163     public String getVoiceMailAlphaTag() {
    164         mContext.enforceCallingOrSelfPermission(READ_PHONE_STATE, "Requires READ_PHONE_STATE");
    165         return mPhone.getVoiceMailAlphaTag();
    166     }
    167 
    168     /**
    169      * Returns the IMS private user identity (IMPI) that was loaded from the ISIM.
    170      * @return the IMPI, or null if not present or not loaded
    171      */
    172     @Override
    173     public String getIsimImpi() {
    174         mContext.enforceCallingOrSelfPermission(READ_PRIVILEGED_PHONE_STATE,
    175                 "Requires READ_PRIVILEGED_PHONE_STATE");
    176         IsimRecords isim = mPhone.getIsimRecords();
    177         if (isim != null) {
    178             return isim.getIsimImpi();
    179         } else {
    180             return null;
    181         }
    182     }
    183 
    184     /**
    185      * Returns the IMS home network domain name that was loaded from the ISIM.
    186      * @return the IMS domain name, or null if not present or not loaded
    187      */
    188     @Override
    189     public String getIsimDomain() {
    190         mContext.enforceCallingOrSelfPermission(READ_PRIVILEGED_PHONE_STATE,
    191                 "Requires READ_PRIVILEGED_PHONE_STATE");
    192         IsimRecords isim = mPhone.getIsimRecords();
    193         if (isim != null) {
    194             return isim.getIsimDomain();
    195         } else {
    196             return null;
    197         }
    198     }
    199 
    200     /**
    201      * Returns the IMS public user identities (IMPU) that were loaded from the ISIM.
    202      * @return an array of IMPU strings, with one IMPU per string, or null if
    203      *      not present or not loaded
    204      */
    205     @Override
    206     public String[] getIsimImpu() {
    207         mContext.enforceCallingOrSelfPermission(READ_PRIVILEGED_PHONE_STATE,
    208                 "Requires READ_PRIVILEGED_PHONE_STATE");
    209         IsimRecords isim = mPhone.getIsimRecords();
    210         if (isim != null) {
    211             return isim.getIsimImpu();
    212         } else {
    213             return null;
    214         }
    215     }
    216 
    217     private void log(String s) {
    218         Rlog.d(LOG_TAG, s);
    219     }
    220 
    221     private void loge(String s, Throwable e) {
    222         Rlog.e(LOG_TAG, s, e);
    223     }
    224 
    225     @Override
    226     protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
    227         if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP)
    228                 != PackageManager.PERMISSION_GRANTED) {
    229             pw.println("Permission Denial: can't dump PhoneSubInfo from from pid="
    230                     + Binder.getCallingPid()
    231                     + ", uid=" + Binder.getCallingUid());
    232             return;
    233         }
    234 
    235         pw.println("Phone Subscriber Info:");
    236         pw.println("  Phone Type = " + mPhone.getPhoneName());
    237         pw.println("  Device ID = " + mPhone.getDeviceId());
    238     }
    239 }
    240