/* * Copyright (C) 2007 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.internal.telephony; import java.io.FileDescriptor; import java.io.PrintWriter; import android.content.Context; import android.content.pm.PackageManager; import android.os.Binder; import android.telephony.PhoneNumberUtils; import android.telephony.Rlog; import com.android.internal.telephony.uicc.IsimRecords; public class PhoneSubInfo extends IPhoneSubInfo.Stub { static final String LOG_TAG = "PhoneSubInfo"; private static final boolean DBG = true; private static final boolean VDBG = false; // STOPSHIP if true private Phone mPhone; private Context mContext; private static final String READ_PHONE_STATE = android.Manifest.permission.READ_PHONE_STATE; // TODO: change getCompleteVoiceMailNumber() to require READ_PRIVILEGED_PHONE_STATE private static final String CALL_PRIVILEGED = android.Manifest.permission.CALL_PRIVILEGED; private static final String READ_PRIVILEGED_PHONE_STATE = android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE; public PhoneSubInfo(Phone phone) { mPhone = phone; mContext = phone.getContext(); } public void dispose() { } @Override protected void finalize() { try { super.finalize(); } catch (Throwable throwable) { loge("Error while finalizing:", throwable); } if (DBG) log("PhoneSubInfo finalized"); } /** * Retrieves the unique device ID, e.g., IMEI for GSM phones and MEID for CDMA phones. */ @Override public String getDeviceId() { mContext.enforceCallingOrSelfPermission(READ_PHONE_STATE, "Requires READ_PHONE_STATE"); return mPhone.getDeviceId(); } /** * Retrieves the software version number for the device, e.g., IMEI/SV * for GSM phones. */ @Override public String getDeviceSvn() { mContext.enforceCallingOrSelfPermission(READ_PHONE_STATE, "Requires READ_PHONE_STATE"); return mPhone.getDeviceSvn(); } /** * Retrieves the unique subscriber ID, e.g., IMSI for GSM phones. */ @Override public String getSubscriberId() { mContext.enforceCallingOrSelfPermission(READ_PHONE_STATE, "Requires READ_PHONE_STATE"); return mPhone.getSubscriberId(); } /** * Retrieves the Group Identifier Level1 for GSM phones. */ public String getGroupIdLevel1() { mContext.enforceCallingOrSelfPermission(READ_PHONE_STATE, "Requires READ_PHONE_STATE"); return mPhone.getGroupIdLevel1(); } /** * Retrieves the serial number of the ICC, if applicable. */ @Override public String getIccSerialNumber() { mContext.enforceCallingOrSelfPermission(READ_PHONE_STATE, "Requires READ_PHONE_STATE"); return mPhone.getIccSerialNumber(); } /** * Retrieves the phone number string for line 1. */ @Override public String getLine1Number() { mContext.enforceCallingOrSelfPermission(READ_PHONE_STATE, "Requires READ_PHONE_STATE"); return mPhone.getLine1Number(); } /** * Retrieves the alpha identifier for line 1. */ @Override public String getLine1AlphaTag() { mContext.enforceCallingOrSelfPermission(READ_PHONE_STATE, "Requires READ_PHONE_STATE"); return mPhone.getLine1AlphaTag(); } /** * Retrieves the MSISDN string. */ @Override public String getMsisdn() { mContext.enforceCallingOrSelfPermission(READ_PHONE_STATE, "Requires READ_PHONE_STATE"); return mPhone.getMsisdn(); } /** * Retrieves the voice mail number. */ @Override public String getVoiceMailNumber() { mContext.enforceCallingOrSelfPermission(READ_PHONE_STATE, "Requires READ_PHONE_STATE"); String number = PhoneNumberUtils.extractNetworkPortion(mPhone.getVoiceMailNumber()); if (VDBG) log("VM: PhoneSubInfo.getVoiceMailNUmber: " + number); return number; } /** * Retrieves the complete voice mail number. * * @hide */ @Override public String getCompleteVoiceMailNumber() { mContext.enforceCallingOrSelfPermission(CALL_PRIVILEGED, "Requires CALL_PRIVILEGED"); String number = mPhone.getVoiceMailNumber(); if (VDBG) log("VM: PhoneSubInfo.getCompleteVoiceMailNUmber: " + number); return number; } /** * Retrieves the alpha identifier associated with the voice mail number. */ @Override public String getVoiceMailAlphaTag() { mContext.enforceCallingOrSelfPermission(READ_PHONE_STATE, "Requires READ_PHONE_STATE"); return mPhone.getVoiceMailAlphaTag(); } /** * Returns the IMS private user identity (IMPI) that was loaded from the ISIM. * @return the IMPI, or null if not present or not loaded */ @Override public String getIsimImpi() { mContext.enforceCallingOrSelfPermission(READ_PRIVILEGED_PHONE_STATE, "Requires READ_PRIVILEGED_PHONE_STATE"); IsimRecords isim = mPhone.getIsimRecords(); if (isim != null) { return isim.getIsimImpi(); } else { return null; } } /** * Returns the IMS home network domain name that was loaded from the ISIM. * @return the IMS domain name, or null if not present or not loaded */ @Override public String getIsimDomain() { mContext.enforceCallingOrSelfPermission(READ_PRIVILEGED_PHONE_STATE, "Requires READ_PRIVILEGED_PHONE_STATE"); IsimRecords isim = mPhone.getIsimRecords(); if (isim != null) { return isim.getIsimDomain(); } else { return null; } } /** * Returns the IMS public user identities (IMPU) that were loaded from the ISIM. * @return an array of IMPU strings, with one IMPU per string, or null if * not present or not loaded */ @Override public String[] getIsimImpu() { mContext.enforceCallingOrSelfPermission(READ_PRIVILEGED_PHONE_STATE, "Requires READ_PRIVILEGED_PHONE_STATE"); IsimRecords isim = mPhone.getIsimRecords(); if (isim != null) { return isim.getIsimImpu(); } else { return null; } } private void log(String s) { Rlog.d(LOG_TAG, s); } private void loge(String s, Throwable e) { Rlog.e(LOG_TAG, s, e); } @Override protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP) != PackageManager.PERMISSION_GRANTED) { pw.println("Permission Denial: can't dump PhoneSubInfo from from pid=" + Binder.getCallingPid() + ", uid=" + Binder.getCallingUid()); return; } pw.println("Phone Subscriber Info:"); pw.println(" Phone Type = " + mPhone.getPhoneName()); pw.println(" Device ID = " + mPhone.getDeviceId()); } }