| /* |
| * 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 com.android.internal.telephony.ITelephonyRegistry; |
| |
| import java.util.List; |
| |
| /** |
| * broadcast intents |
| */ |
| public class DefaultPhoneNotifier implements PhoneNotifier { |
| |
| private ITelephonyRegistry mRegistry; |
| |
| /*package*/ |
| DefaultPhoneNotifier() { |
| mRegistry = ITelephonyRegistry.Stub.asInterface(ServiceManager.getService( |
| "telephony.registry")); |
| } |
| |
| @Override |
| 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 |
| } |
| } |
| |
| @Override |
| 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 |
| } |
| } |
| |
| @Override |
| public void notifySignalStrength(Phone sender) { |
| try { |
| mRegistry.notifySignalStrength(sender.getSignalStrength()); |
| } catch (RemoteException ex) { |
| // system process is dead |
| } |
| } |
| |
| @Override |
| public void notifyMessageWaitingChanged(Phone sender) { |
| try { |
| mRegistry.notifyMessageWaitingChanged(sender.getMessageWaitingIndicator()); |
| } catch (RemoteException ex) { |
| // system process is dead |
| } |
| } |
| |
| @Override |
| public void notifyCallForwardingChanged(Phone sender) { |
| try { |
| mRegistry.notifyCallForwardingChanged(sender.getCallForwardingIndicator()); |
| } catch (RemoteException ex) { |
| // system process is dead |
| } |
| } |
| |
| @Override |
| public void notifyDataActivity(Phone sender) { |
| try { |
| mRegistry.notifyDataActivity(convertDataActivityState(sender.getDataActivityState())); |
| } catch (RemoteException ex) { |
| // system process is dead |
| } |
| } |
| |
| @Override |
| 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 |
| } |
| } |
| |
| @Override |
| public void notifyDataConnectionFailed(Phone sender, String reason, String apnType) { |
| try { |
| mRegistry.notifyDataConnectionFailed(reason, apnType); |
| } catch (RemoteException ex) { |
| // system process is dead |
| } |
| } |
| |
| @Override |
| public void notifyCellLocation(Phone sender) { |
| Bundle data = new Bundle(); |
| sender.getCellLocation().fillInNotifierBundle(data); |
| try { |
| mRegistry.notifyCellLocation(data); |
| } catch (RemoteException ex) { |
| // system process is dead |
| } |
| } |
| |
| @Override |
| public void notifyCellInfo(Phone sender, List<CellInfo> cellInfo) { |
| try { |
| mRegistry.notifyCellInfo(cellInfo); |
| } catch (RemoteException ex) { |
| |
| } |
| } |
| |
| @Override |
| public void notifyOtaspChanged(Phone sender, int otaspMode) { |
| try { |
| mRegistry.notifyOtaspChanged(otaspMode); |
| } catch (RemoteException ex) { |
| // system process is dead |
| } |
| } |
| |
| /** |
| * Convert the {@link PhoneConstants.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 PhoneConstants.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 PhoneConstants.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 PhoneConstants.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 Phone.DataActivityState} 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 Phone.DataActivityState} 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; |
| } |
| } |
| } |