diff options
Diffstat (limited to 'src/com/android/phone/PhoneInterfaceManager.java')
-rw-r--r-- | src/com/android/phone/PhoneInterfaceManager.java | 884 |
1 files changed, 0 insertions, 884 deletions
diff --git a/src/com/android/phone/PhoneInterfaceManager.java b/src/com/android/phone/PhoneInterfaceManager.java deleted file mode 100644 index 6600ae51..00000000 --- a/src/com/android/phone/PhoneInterfaceManager.java +++ /dev/null @@ -1,884 +0,0 @@ -/* - * Copyright (C) 2006 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.phone; - -import android.app.ActivityManager; -import android.app.AppOpsManager; -import android.content.ActivityNotFoundException; -import android.content.Context; -import android.content.Intent; -import android.net.ConnectivityManager; -import android.net.Uri; -import android.os.AsyncResult; -import android.os.Binder; -import android.os.Bundle; -import android.os.Handler; -import android.os.Looper; -import android.os.Message; -import android.os.Process; -import android.os.ServiceManager; -import android.os.UserHandle; -import android.telephony.NeighboringCellInfo; -import android.telephony.CellInfo; -import android.telephony.ServiceState; -import android.text.TextUtils; -import android.util.Log; - -import com.android.internal.telephony.DefaultPhoneNotifier; -import com.android.internal.telephony.IccCard; -import com.android.internal.telephony.ITelephony; -import com.android.internal.telephony.Phone; -import com.android.internal.telephony.CallManager; -import com.android.internal.telephony.PhoneConstants; - -import java.util.List; -import java.util.ArrayList; - -/** - * Implementation of the ITelephony interface. - */ -public class PhoneInterfaceManager extends ITelephony.Stub { - private static final String LOG_TAG = "PhoneInterfaceManager"; - private static final boolean DBG = (PhoneGlobals.DBG_LEVEL >= 2); - private static final boolean DBG_LOC = false; - - // Message codes used with mMainThreadHandler - private static final int CMD_HANDLE_PIN_MMI = 1; - private static final int CMD_HANDLE_NEIGHBORING_CELL = 2; - private static final int EVENT_NEIGHBORING_CELL_DONE = 3; - private static final int CMD_ANSWER_RINGING_CALL = 4; - private static final int CMD_END_CALL = 5; // not used yet - private static final int CMD_SILENCE_RINGER = 6; - - /** The singleton instance. */ - private static PhoneInterfaceManager sInstance; - - PhoneGlobals mApp; - Phone mPhone; - CallManager mCM; - AppOpsManager mAppOps; - MainThreadHandler mMainThreadHandler; - - /** - * A request object for use with {@link MainThreadHandler}. Requesters should wait() on the - * request after sending. The main thread will notify the request when it is complete. - */ - private static final class MainThreadRequest { - /** The argument to use for the request */ - public Object argument; - /** The result of the request that is run on the main thread */ - public Object result; - - public MainThreadRequest(Object argument) { - this.argument = argument; - } - } - - /** - * A handler that processes messages on the main thread in the phone process. Since many - * of the Phone calls are not thread safe this is needed to shuttle the requests from the - * inbound binder threads to the main thread in the phone process. The Binder thread - * may provide a {@link MainThreadRequest} object in the msg.obj field that they are waiting - * on, which will be notified when the operation completes and will contain the result of the - * request. - * - * <p>If a MainThreadRequest object is provided in the msg.obj field, - * note that request.result must be set to something non-null for the calling thread to - * unblock. - */ - private final class MainThreadHandler extends Handler { - @Override - public void handleMessage(Message msg) { - MainThreadRequest request; - Message onCompleted; - AsyncResult ar; - - switch (msg.what) { - case CMD_HANDLE_PIN_MMI: - request = (MainThreadRequest) msg.obj; - request.result = Boolean.valueOf( - mPhone.handlePinMmi((String) request.argument)); - // Wake up the requesting thread - synchronized (request) { - request.notifyAll(); - } - break; - - case CMD_HANDLE_NEIGHBORING_CELL: - request = (MainThreadRequest) msg.obj; - onCompleted = obtainMessage(EVENT_NEIGHBORING_CELL_DONE, - request); - mPhone.getNeighboringCids(onCompleted); - break; - - case EVENT_NEIGHBORING_CELL_DONE: - ar = (AsyncResult) msg.obj; - request = (MainThreadRequest) ar.userObj; - if (ar.exception == null && ar.result != null) { - request.result = ar.result; - } else { - // create an empty list to notify the waiting thread - request.result = new ArrayList<NeighboringCellInfo>(); - } - // Wake up the requesting thread - synchronized (request) { - request.notifyAll(); - } - break; - - case CMD_ANSWER_RINGING_CALL: - answerRingingCallInternal(); - break; - - case CMD_SILENCE_RINGER: - silenceRingerInternal(); - break; - - case CMD_END_CALL: - request = (MainThreadRequest) msg.obj; - boolean hungUp = false; - int phoneType = mPhone.getPhoneType(); - if (phoneType == PhoneConstants.PHONE_TYPE_CDMA) { - // CDMA: If the user presses the Power button we treat it as - // ending the complete call session - hungUp = PhoneUtils.hangupRingingAndActive(mPhone); - } else if (phoneType == PhoneConstants.PHONE_TYPE_GSM) { - // GSM: End the call as per the Phone state - hungUp = PhoneUtils.hangup(mCM); - } else { - throw new IllegalStateException("Unexpected phone type: " + phoneType); - } - if (DBG) log("CMD_END_CALL: " + (hungUp ? "hung up!" : "no call to hang up")); - request.result = hungUp; - // Wake up the requesting thread - synchronized (request) { - request.notifyAll(); - } - break; - - default: - Log.w(LOG_TAG, "MainThreadHandler: unexpected message code: " + msg.what); - break; - } - } - } - - /** - * Posts the specified command to be executed on the main thread, - * waits for the request to complete, and returns the result. - * @see #sendRequestAsync - */ - private Object sendRequest(int command, Object argument) { - if (Looper.myLooper() == mMainThreadHandler.getLooper()) { - throw new RuntimeException("This method will deadlock if called from the main thread."); - } - - MainThreadRequest request = new MainThreadRequest(argument); - Message msg = mMainThreadHandler.obtainMessage(command, request); - msg.sendToTarget(); - - // Wait for the request to complete - synchronized (request) { - while (request.result == null) { - try { - request.wait(); - } catch (InterruptedException e) { - // Do nothing, go back and wait until the request is complete - } - } - } - return request.result; - } - - /** - * Asynchronous ("fire and forget") version of sendRequest(): - * Posts the specified command to be executed on the main thread, and - * returns immediately. - * @see #sendRequest - */ - private void sendRequestAsync(int command) { - mMainThreadHandler.sendEmptyMessage(command); - } - - /** - * Initialize the singleton PhoneInterfaceManager instance. - * This is only done once, at startup, from PhoneApp.onCreate(). - */ - /* package */ static PhoneInterfaceManager init(PhoneGlobals app, Phone phone) { - synchronized (PhoneInterfaceManager.class) { - if (sInstance == null) { - sInstance = new PhoneInterfaceManager(app, phone); - } else { - Log.wtf(LOG_TAG, "init() called multiple times! sInstance = " + sInstance); - } - return sInstance; - } - } - - /** Private constructor; @see init() */ - private PhoneInterfaceManager(PhoneGlobals app, Phone phone) { - mApp = app; - mPhone = phone; - mCM = PhoneGlobals.getInstance().mCM; - mAppOps = (AppOpsManager)app.getSystemService(Context.APP_OPS_SERVICE); - mMainThreadHandler = new MainThreadHandler(); - publish(); - } - - private void publish() { - if (DBG) log("publish: " + this); - - ServiceManager.addService("phone", this); - } - - // - // Implementation of the ITelephony interface. - // - - public void dial(String number) { - if (DBG) log("dial: " + number); - // No permission check needed here: This is just a wrapper around the - // ACTION_DIAL intent, which is available to any app since it puts up - // the UI before it does anything. - - String url = createTelUrl(number); - if (url == null) { - return; - } - - // PENDING: should we just silently fail if phone is offhook or ringing? - PhoneConstants.State state = mCM.getState(); - if (state != PhoneConstants.State.OFFHOOK && state != PhoneConstants.State.RINGING) { - Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse(url)); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - mApp.startActivity(intent); - } - } - - public void call(String callingPackage, String number) { - if (DBG) log("call: " + number); - - // This is just a wrapper around the ACTION_CALL intent, but we still - // need to do a permission check since we're calling startActivity() - // from the context of the phone app. - enforceCallPermission(); - - if (mAppOps.noteOp(AppOpsManager.OP_CALL_PHONE, Binder.getCallingUid(), callingPackage) - != AppOpsManager.MODE_ALLOWED) { - return; - } - - String url = createTelUrl(number); - if (url == null) { - return; - } - - Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse(url)); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - mApp.startActivity(intent); - } - - private boolean showCallScreenInternal(boolean specifyInitialDialpadState, - boolean initialDialpadState) { - if (!PhoneGlobals.sVoiceCapable) { - // Never allow the InCallScreen to appear on data-only devices. - return false; - } - if (isIdle()) { - return false; - } - // If the phone isn't idle then go to the in-call screen - long callingId = Binder.clearCallingIdentity(); - try { - Intent intent; - if (specifyInitialDialpadState) { - intent = PhoneGlobals.createInCallIntent(initialDialpadState); - } else { - intent = PhoneGlobals.createInCallIntent(); - } - try { - mApp.startActivity(intent); - } catch (ActivityNotFoundException e) { - // It's possible that the in-call UI might not exist - // (like on non-voice-capable devices), although we - // shouldn't be trying to bring up the InCallScreen on - // devices like that in the first place! - Log.w(LOG_TAG, "showCallScreenInternal: " - + "transition to InCallScreen failed; intent = " + intent); - } - } finally { - Binder.restoreCallingIdentity(callingId); - } - return true; - } - - // Show the in-call screen without specifying the initial dialpad state. - public boolean showCallScreen() { - return showCallScreenInternal(false, false); - } - - // The variation of showCallScreen() that specifies the initial dialpad state. - // (Ideally this would be called showCallScreen() too, just with a different - // signature, but AIDL doesn't allow that.) - public boolean showCallScreenWithDialpad(boolean showDialpad) { - return showCallScreenInternal(true, showDialpad); - } - - /** - * End a call based on call state - * @return true is a call was ended - */ - public boolean endCall() { - enforceCallPermission(); - return (Boolean) sendRequest(CMD_END_CALL, null); - } - - public void answerRingingCall() { - if (DBG) log("answerRingingCall..."); - // TODO: there should eventually be a separate "ANSWER_PHONE" permission, - // but that can probably wait till the big TelephonyManager API overhaul. - // For now, protect this call with the MODIFY_PHONE_STATE permission. - enforceModifyPermission(); - sendRequestAsync(CMD_ANSWER_RINGING_CALL); - } - - /** - * Make the actual telephony calls to implement answerRingingCall(). - * This should only be called from the main thread of the Phone app. - * @see #answerRingingCall - * - * TODO: it would be nice to return true if we answered the call, or - * false if there wasn't actually a ringing incoming call, or some - * other error occurred. (In other words, pass back the return value - * from PhoneUtils.answerCall() or PhoneUtils.answerAndEndActive().) - * But that would require calling this method via sendRequest() rather - * than sendRequestAsync(), and right now we don't actually *need* that - * return value, so let's just return void for now. - */ - private void answerRingingCallInternal() { - final boolean hasRingingCall = !mPhone.getRingingCall().isIdle(); - if (hasRingingCall) { - final boolean hasActiveCall = !mPhone.getForegroundCall().isIdle(); - final boolean hasHoldingCall = !mPhone.getBackgroundCall().isIdle(); - if (hasActiveCall && hasHoldingCall) { - // Both lines are in use! - // TODO: provide a flag to let the caller specify what - // policy to use if both lines are in use. (The current - // behavior is hardwired to "answer incoming, end ongoing", - // which is how the CALL button is specced to behave.) - PhoneUtils.answerAndEndActive(mCM, mCM.getFirstActiveRingingCall()); - return; - } else { - // answerCall() will automatically hold the current active - // call, if there is one. - PhoneUtils.answerCall(mCM.getFirstActiveRingingCall()); - return; - } - } else { - // No call was ringing. - return; - } - } - - public void silenceRinger() { - if (DBG) log("silenceRinger..."); - // TODO: find a more appropriate permission to check here. - // (That can probably wait till the big TelephonyManager API overhaul. - // For now, protect this call with the MODIFY_PHONE_STATE permission.) - enforceModifyPermission(); - sendRequestAsync(CMD_SILENCE_RINGER); - } - - /** - * Internal implemenation of silenceRinger(). - * This should only be called from the main thread of the Phone app. - * @see #silenceRinger - */ - private void silenceRingerInternal() { - if ((mCM.getState() == PhoneConstants.State.RINGING) - && mApp.notifier.isRinging()) { - // Ringer is actually playing, so silence it. - if (DBG) log("silenceRingerInternal: silencing..."); - mApp.notifier.silenceRinger(); - } - } - - public boolean isOffhook() { - return (mCM.getState() == PhoneConstants.State.OFFHOOK); - } - - public boolean isRinging() { - return (mCM.getState() == PhoneConstants.State.RINGING); - } - - public boolean isIdle() { - return (mCM.getState() == PhoneConstants.State.IDLE); - } - - public boolean isSimPinEnabled() { - enforceReadPermission(); - return (PhoneGlobals.getInstance().isSimPinEnabled()); - } - - public boolean supplyPin(String pin) { - enforceModifyPermission(); - final UnlockSim checkSimPin = new UnlockSim(mPhone.getIccCard()); - checkSimPin.start(); - return checkSimPin.unlockSim(null, pin); - } - - public boolean supplyPuk(String puk, String pin) { - enforceModifyPermission(); - final UnlockSim checkSimPuk = new UnlockSim(mPhone.getIccCard()); - checkSimPuk.start(); - return checkSimPuk.unlockSim(puk, pin); - } - - /** - * Helper thread to turn async call to {@link SimCard#supplyPin} into - * a synchronous one. - */ - private static class UnlockSim extends Thread { - - private final IccCard mSimCard; - - private boolean mDone = false; - private boolean mResult = false; - - // For replies from SimCard interface - private Handler mHandler; - - // For async handler to identify request type - private static final int SUPPLY_PIN_COMPLETE = 100; - - public UnlockSim(IccCard simCard) { - mSimCard = simCard; - } - - @Override - public void run() { - Looper.prepare(); - synchronized (UnlockSim.this) { - mHandler = new Handler() { - @Override - public void handleMessage(Message msg) { - AsyncResult ar = (AsyncResult) msg.obj; - switch (msg.what) { - case SUPPLY_PIN_COMPLETE: - Log.d(LOG_TAG, "SUPPLY_PIN_COMPLETE"); - synchronized (UnlockSim.this) { - mResult = (ar.exception == null); - mDone = true; - UnlockSim.this.notifyAll(); - } - break; - } - } - }; - UnlockSim.this.notifyAll(); - } - Looper.loop(); - } - - /* - * Use PIN or PUK to unlock SIM card - * - * If PUK is null, unlock SIM card with PIN - * - * If PUK is not null, unlock SIM card with PUK and set PIN code - */ - synchronized boolean unlockSim(String puk, String pin) { - - while (mHandler == null) { - try { - wait(); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - } - } - Message callback = Message.obtain(mHandler, SUPPLY_PIN_COMPLETE); - - if (puk == null) { - mSimCard.supplyPin(pin, callback); - } else { - mSimCard.supplyPuk(puk, pin, callback); - } - - while (!mDone) { - try { - Log.d(LOG_TAG, "wait for done"); - wait(); - } catch (InterruptedException e) { - // Restore the interrupted status - Thread.currentThread().interrupt(); - } - } - Log.d(LOG_TAG, "done"); - return mResult; - } - } - - public void updateServiceLocation() { - // No permission check needed here: this call is harmless, and it's - // needed for the ServiceState.requestStateUpdate() call (which is - // already intentionally exposed to 3rd parties.) - mPhone.updateServiceLocation(); - } - - public boolean isRadioOn() { - return mPhone.getServiceState().getVoiceRegState() != ServiceState.STATE_POWER_OFF; - } - - public void toggleRadioOnOff() { - enforceModifyPermission(); - mPhone.setRadioPower(!isRadioOn()); - } - public boolean setRadio(boolean turnOn) { - enforceModifyPermission(); - if ((mPhone.getServiceState().getVoiceRegState() != ServiceState.STATE_POWER_OFF) != turnOn) { - toggleRadioOnOff(); - } - return true; - } - public boolean setRadioPower(boolean turnOn) { - enforceModifyPermission(); - mPhone.setRadioPower(turnOn); - return true; - } - - public boolean enableDataConnectivity() { - enforceModifyPermission(); - ConnectivityManager cm = - (ConnectivityManager)mApp.getSystemService(Context.CONNECTIVITY_SERVICE); - cm.setMobileDataEnabled(true); - return true; - } - - public int enableApnType(String type) { - enforceModifyPermission(); - return mPhone.enableApnType(type); - } - - public int disableApnType(String type) { - enforceModifyPermission(); - return mPhone.disableApnType(type); - } - - public boolean disableDataConnectivity() { - enforceModifyPermission(); - ConnectivityManager cm = - (ConnectivityManager)mApp.getSystemService(Context.CONNECTIVITY_SERVICE); - cm.setMobileDataEnabled(false); - return true; - } - - public boolean isDataConnectivityPossible() { - return mPhone.isDataConnectivityPossible(); - } - - public boolean handlePinMmi(String dialString) { - enforceModifyPermission(); - return (Boolean) sendRequest(CMD_HANDLE_PIN_MMI, dialString); - } - - public void cancelMissedCallsNotification() { - enforceModifyPermission(); - mApp.notificationMgr.cancelMissedCallNotification(); - } - - public int getCallState() { - return DefaultPhoneNotifier.convertCallState(mCM.getState()); - } - - public int getDataState() { - return DefaultPhoneNotifier.convertDataState(mPhone.getDataConnectionState()); - } - - public int getDataActivity() { - return DefaultPhoneNotifier.convertDataActivityState(mPhone.getDataActivityState()); - } - - @Override - public Bundle getCellLocation() { - try { - mApp.enforceCallingOrSelfPermission( - android.Manifest.permission.ACCESS_FINE_LOCATION, null); - } catch (SecurityException e) { - // If we have ACCESS_FINE_LOCATION permission, skip the check for ACCESS_COARSE_LOCATION - // A failure should throw the SecurityException from ACCESS_COARSE_LOCATION since this - // is the weaker precondition - mApp.enforceCallingOrSelfPermission( - android.Manifest.permission.ACCESS_COARSE_LOCATION, null); - } - - if (checkIfCallerIsSelfOrForegoundUser()) { - if (DBG_LOC) log("getCellLocation: is active user"); - Bundle data = new Bundle(); - mPhone.getCellLocation().fillInNotifierBundle(data); - return data; - } else { - if (DBG_LOC) log("getCellLocation: suppress non-active user"); - return null; - } - } - - @Override - public void enableLocationUpdates() { - mApp.enforceCallingOrSelfPermission( - android.Manifest.permission.CONTROL_LOCATION_UPDATES, null); - mPhone.enableLocationUpdates(); - } - - @Override - public void disableLocationUpdates() { - mApp.enforceCallingOrSelfPermission( - android.Manifest.permission.CONTROL_LOCATION_UPDATES, null); - mPhone.disableLocationUpdates(); - } - - @Override - @SuppressWarnings("unchecked") - public List<NeighboringCellInfo> getNeighboringCellInfo(String callingPackage) { - try { - mApp.enforceCallingOrSelfPermission( - android.Manifest.permission.ACCESS_FINE_LOCATION, null); - } catch (SecurityException e) { - // If we have ACCESS_FINE_LOCATION permission, skip the check - // for ACCESS_COARSE_LOCATION - // A failure should throw the SecurityException from - // ACCESS_COARSE_LOCATION since this is the weaker precondition - mApp.enforceCallingOrSelfPermission( - android.Manifest.permission.ACCESS_COARSE_LOCATION, null); - } - - if (mAppOps.noteOp(AppOpsManager.OP_NEIGHBORING_CELLS, Binder.getCallingUid(), - callingPackage) != AppOpsManager.MODE_ALLOWED) { - return null; - } - if (checkIfCallerIsSelfOrForegoundUser()) { - if (DBG_LOC) log("getNeighboringCellInfo: is active user"); - - ArrayList<NeighboringCellInfo> cells = null; - - try { - cells = (ArrayList<NeighboringCellInfo>) sendRequest( - CMD_HANDLE_NEIGHBORING_CELL, null); - } catch (RuntimeException e) { - Log.e(LOG_TAG, "getNeighboringCellInfo " + e); - } - return cells; - } else { - if (DBG_LOC) log("getNeighboringCellInfo: suppress non-active user"); - return null; - } - } - - - @Override - public List<CellInfo> getAllCellInfo() { - try { - mApp.enforceCallingOrSelfPermission( - android.Manifest.permission.ACCESS_FINE_LOCATION, null); - } catch (SecurityException e) { - // If we have ACCESS_FINE_LOCATION permission, skip the check for ACCESS_COARSE_LOCATION - // A failure should throw the SecurityException from ACCESS_COARSE_LOCATION since this - // is the weaker precondition - mApp.enforceCallingOrSelfPermission( - android.Manifest.permission.ACCESS_COARSE_LOCATION, null); - } - - if (checkIfCallerIsSelfOrForegoundUser()) { - if (DBG_LOC) log("getAllCellInfo: is active user"); - return mPhone.getAllCellInfo(); - } else { - if (DBG_LOC) log("getAllCellInfo: suppress non-active user"); - return null; - } - } - - public void setCellInfoListRate(int rateInMillis) { - mPhone.setCellInfoListRate(rateInMillis); - } - - // - // Internal helper methods. - // - - private boolean checkIfCallerIsSelfOrForegoundUser() { - boolean ok; - - boolean self = Binder.getCallingUid() == Process.myUid(); - if (!self) { - // Get the caller's user id then clear the calling identity - // which will be restored in the finally clause. - int callingUser = UserHandle.getCallingUserId(); - long ident = Binder.clearCallingIdentity(); - - try { - // With calling identity cleared the current user is the foreground user. - int foregroundUser = ActivityManager.getCurrentUser(); - ok = (foregroundUser == callingUser); - if (DBG_LOC) { - log("checkIfCallerIsSelfOrForegoundUser: foregroundUser=" + foregroundUser - + " callingUser=" + callingUser + " ok=" + ok); - } - } catch (Exception ex) { - if (DBG_LOC) loge("checkIfCallerIsSelfOrForegoundUser: Exception ex=" + ex); - ok = false; - } finally { - Binder.restoreCallingIdentity(ident); - } - } else { - if (DBG_LOC) log("checkIfCallerIsSelfOrForegoundUser: is self"); - ok = true; - } - if (DBG_LOC) log("checkIfCallerIsSelfOrForegoundUser: ret=" + ok); - return ok; - } - - /** - * Make sure the caller has the READ_PHONE_STATE permission. - * - * @throws SecurityException if the caller does not have the required permission - */ - private void enforceReadPermission() { - mApp.enforceCallingOrSelfPermission(android.Manifest.permission.READ_PHONE_STATE, null); - } - - /** - * Make sure the caller has the MODIFY_PHONE_STATE permission. - * - * @throws SecurityException if the caller does not have the required permission - */ - private void enforceModifyPermission() { - mApp.enforceCallingOrSelfPermission(android.Manifest.permission.MODIFY_PHONE_STATE, null); - } - - /** - * Make sure the caller has the CALL_PHONE permission. - * - * @throws SecurityException if the caller does not have the required permission - */ - private void enforceCallPermission() { - mApp.enforceCallingOrSelfPermission(android.Manifest.permission.CALL_PHONE, null); - } - - - private String createTelUrl(String number) { - if (TextUtils.isEmpty(number)) { - return null; - } - - StringBuilder buf = new StringBuilder("tel:"); - buf.append(number); - return buf.toString(); - } - - private void log(String msg) { - Log.d(LOG_TAG, "[PhoneIntfMgr] " + msg); - } - - private void loge(String msg) { - Log.e(LOG_TAG, "[PhoneIntfMgr] " + msg); - } - - public int getActivePhoneType() { - return mPhone.getPhoneType(); - } - - /** - * Returns the CDMA ERI icon index to display - */ - public int getCdmaEriIconIndex() { - return mPhone.getCdmaEriIconIndex(); - } - - /** - * Returns the CDMA ERI icon mode, - * 0 - ON - * 1 - FLASHING - */ - public int getCdmaEriIconMode() { - return mPhone.getCdmaEriIconMode(); - } - - /** - * Returns the CDMA ERI text, - */ - public String getCdmaEriText() { - return mPhone.getCdmaEriText(); - } - - /** - * Returns true if CDMA provisioning needs to run. - */ - public boolean needsOtaServiceProvisioning() { - return mPhone.needsOtaServiceProvisioning(); - } - - /** - * Returns the unread count of voicemails - */ - public int getVoiceMessageCount() { - return mPhone.getVoiceMessageCount(); - } - - /** - * Returns the data network type - * - * @Deprecated to be removed Q3 2013 use {@link #getDataNetworkType}. - */ - @Override - public int getNetworkType() { - return mPhone.getServiceState().getDataNetworkType(); - } - - /** - * Returns the data network type - */ - @Override - public int getDataNetworkType() { - return mPhone.getServiceState().getDataNetworkType(); - } - - /** - * Returns the data network type - */ - @Override - public int getVoiceNetworkType() { - return mPhone.getServiceState().getVoiceNetworkType(); - } - - /** - * @return true if a ICC card is present - */ - public boolean hasIccCard() { - return mPhone.getIccCard().hasIccCard(); - } - - /** - * Return if the current radio is LTE on CDMA. This - * is a tri-state return value as for a period of time - * the mode may be unknown. - * - * @return {@link Phone#LTE_ON_CDMA_UNKNOWN}, {@link Phone#LTE_ON_CDMA_FALSE} - * or {@link PHone#LTE_ON_CDMA_TRUE} - */ - public int getLteOnCdmaMode() { - return mPhone.getLteOnCdmaMode(); - } -} |