/* * 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.internal.telephony; import android.net.LinkCapabilities; import android.net.LinkProperties; import android.os.Bundle; import android.os.RemoteException; import android.os.ServiceManager; import android.telephony.CellInfo; import android.telephony.ServiceState; import android.telephony.TelephonyManager; import android.util.Log; import com.android.internal.telephony.ITelephonyRegistry; import java.util.List; /** * broadcast intents */ public class DefaultPhoneNotifier implements PhoneNotifier { static final String LOG_TAG = "GSM"; private static final boolean DBG = true; private ITelephonyRegistry mRegistry; /*package*/ DefaultPhoneNotifier() { mRegistry = ITelephonyRegistry.Stub.asInterface(ServiceManager.getService( "telephony.registry")); } public void notifyPhoneState(Phone sender) { Call ringingCall = sender.getRingingCall(); String incomingNumber = ""; if (ringingCall != null && ringingCall.getEarliestConnection() != null){ incomingNumber = ringingCall.getEarliestConnection().getAddress(); } try { mRegistry.notifyCallState(convertCallState(sender.getState()), incomingNumber); } catch (RemoteException ex) { // system process is dead } } public void notifyServiceState(Phone sender) { ServiceState ss = sender.getServiceState(); if (ss == null) { ss = new ServiceState(); ss.setStateOutOfService(); } try { mRegistry.notifyServiceState(ss); } catch (RemoteException ex) { // system process is dead } } public void notifySignalStrength(Phone sender) { try { mRegistry.notifySignalStrength(sender.getSignalStrength()); } catch (RemoteException ex) { // system process is dead } } public void notifyMessageWaitingChanged(Phone sender) { try { mRegistry.notifyMessageWaitingChanged(sender.getMessageWaitingIndicator()); } catch (RemoteException ex) { // system process is dead } } public void notifyCallForwardingChanged(Phone sender) { try { mRegistry.notifyCallForwardingChanged(sender.getCallForwardingIndicator()); } catch (RemoteException ex) { // system process is dead } } public void notifyDataActivity(Phone sender) { try { mRegistry.notifyDataActivity(convertDataActivityState(sender.getDataActivityState())); } catch (RemoteException ex) { // system process is dead } } public void notifyDataConnection(Phone sender, String reason, String apnType, PhoneConstants.DataState state) { doNotifyDataConnection(sender, reason, apnType, state); } private void doNotifyDataConnection(Phone sender, String reason, String apnType, PhoneConstants.DataState state) { // TODO // use apnType as the key to which connection we're talking about. // pass apnType back up to fetch particular for this one. TelephonyManager telephony = TelephonyManager.getDefault(); LinkProperties linkProperties = null; LinkCapabilities linkCapabilities = null; boolean roaming = false; if (state == PhoneConstants.DataState.CONNECTED) { linkProperties = sender.getLinkProperties(apnType); linkCapabilities = sender.getLinkCapabilities(apnType); } ServiceState ss = sender.getServiceState(); if (ss != null) roaming = ss.getRoaming(); try { mRegistry.notifyDataConnection( convertDataState(state), sender.isDataConnectivityPossible(apnType), reason, sender.getActiveApnHost(apnType), apnType, linkProperties, linkCapabilities, ((telephony!=null) ? telephony.getNetworkType() : TelephonyManager.NETWORK_TYPE_UNKNOWN), roaming); } catch (RemoteException ex) { // system process is dead } } public void notifyDataConnectionFailed(Phone sender, String reason, String apnType) { try { mRegistry.notifyDataConnectionFailed(reason, apnType); } catch (RemoteException ex) { // system process is dead } } public void notifyCellLocation(Phone sender) { Bundle data = new Bundle(); sender.getCellLocation().fillInNotifierBundle(data); try { mRegistry.notifyCellLocation(data); } catch (RemoteException ex) { // system process is dead } } public void notifyCellInfo(Phone sender, List cellInfo) { try { mRegistry.notifyCellInfo(cellInfo); } catch (RemoteException ex) { } } public void notifyOtaspChanged(Phone sender, int otaspMode) { try { mRegistry.notifyOtaspChanged(otaspMode); } catch (RemoteException ex) { // system process is dead } } private void log(String s) { Log.d(LOG_TAG, "[PhoneNotifier] " + s); } /** * Convert the {@link State} enum into the TelephonyManager.CALL_STATE_* constants * for the public API. */ public static int convertCallState(PhoneConstants.State state) { switch (state) { case RINGING: return TelephonyManager.CALL_STATE_RINGING; case OFFHOOK: return TelephonyManager.CALL_STATE_OFFHOOK; default: return TelephonyManager.CALL_STATE_IDLE; } } /** * Convert the TelephonyManager.CALL_STATE_* constants into the {@link State} enum * for the public API. */ public static PhoneConstants.State convertCallState(int state) { switch (state) { case TelephonyManager.CALL_STATE_RINGING: return PhoneConstants.State.RINGING; case TelephonyManager.CALL_STATE_OFFHOOK: return PhoneConstants.State.OFFHOOK; default: return PhoneConstants.State.IDLE; } } /** * Convert the {@link DataState} enum into the TelephonyManager.DATA_* constants * for the public API. */ public static int convertDataState(PhoneConstants.DataState state) { switch (state) { case CONNECTING: return TelephonyManager.DATA_CONNECTING; case CONNECTED: return TelephonyManager.DATA_CONNECTED; case SUSPENDED: return TelephonyManager.DATA_SUSPENDED; default: return TelephonyManager.DATA_DISCONNECTED; } } /** * Convert the TelephonyManager.DATA_* constants into {@link DataState} enum * for the public API. */ public static PhoneConstants.DataState convertDataState(int state) { switch (state) { case TelephonyManager.DATA_CONNECTING: return PhoneConstants.DataState.CONNECTING; case TelephonyManager.DATA_CONNECTED: return PhoneConstants.DataState.CONNECTED; case TelephonyManager.DATA_SUSPENDED: return PhoneConstants.DataState.SUSPENDED; default: return PhoneConstants.DataState.DISCONNECTED; } } /** * Convert the {@link DataState} enum into the TelephonyManager.DATA_* constants * for the public API. */ public static int convertDataActivityState(Phone.DataActivityState state) { switch (state) { case DATAIN: return TelephonyManager.DATA_ACTIVITY_IN; case DATAOUT: return TelephonyManager.DATA_ACTIVITY_OUT; case DATAINANDOUT: return TelephonyManager.DATA_ACTIVITY_INOUT; case DORMANT: return TelephonyManager.DATA_ACTIVITY_DORMANT; default: return TelephonyManager.DATA_ACTIVITY_NONE; } } /** * Convert the TelephonyManager.DATA_* constants into the {@link DataState} enum * for the public API. */ public static Phone.DataActivityState convertDataActivityState(int state) { switch (state) { case TelephonyManager.DATA_ACTIVITY_IN: return Phone.DataActivityState.DATAIN; case TelephonyManager.DATA_ACTIVITY_OUT: return Phone.DataActivityState.DATAOUT; case TelephonyManager.DATA_ACTIVITY_INOUT: return Phone.DataActivityState.DATAINANDOUT; case TelephonyManager.DATA_ACTIVITY_DORMANT: return Phone.DataActivityState.DORMANT; default: return Phone.DataActivityState.NONE; } } }