From 98e0b146b80670b52805b4b210ef5582dad6bb68 Mon Sep 17 00:00:00 2001 From: Robert Greenwalt Date: Thu, 8 Oct 2009 21:15:52 -0700 Subject: [PATCH] Make PhoneStateListeners not call TelephonyManager Since the StatusBarPolicy is run in the System Process and shouldn't therefore call into the Telephony process we decided to make sure all the needed info was passed along with the original notifications. bug: 2173053 --- .../com/android/server/TelephonyRegistry.java | 10 +++-- .../server/status/StatusBarPolicy.java | 18 ++++---- .../android/telephony/PhoneStateListener.java | 13 +++++- .../java/android/telephony/ServiceState.java | 41 +++++++++++++++++++ .../telephony/DefaultPhoneNotifier.java | 5 ++- .../telephony/IPhoneStateListener.aidl | 2 +- .../telephony/ITelephonyRegistry.aidl | 2 +- .../internal/telephony/cdma/CDMAPhone.java | 10 +++++ 8 files changed, 84 insertions(+), 17 deletions(-) diff --git a/services/java/com/android/server/TelephonyRegistry.java b/services/java/com/android/server/TelephonyRegistry.java index aacae1802bcd5..101b075e22560 100644 --- a/services/java/com/android/server/TelephonyRegistry.java +++ b/services/java/com/android/server/TelephonyRegistry.java @@ -94,6 +94,8 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { private Bundle mCellLocation = new Bundle(); + private int mDataConnectionNetworkType; + static final int PHONE_STATE_PERMISSION_MASK = PhoneStateListener.LISTEN_CALL_FORWARDING_INDICATOR | PhoneStateListener.LISTEN_CALL_STATE | @@ -187,7 +189,8 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { } if ((events & PhoneStateListener.LISTEN_DATA_CONNECTION_STATE) != 0) { try { - r.callback.onDataConnectionStateChanged(mDataConnectionState); + r.callback.onDataConnectionStateChanged(mDataConnectionState, + mDataConnectionNetworkType); } catch (RemoteException ex) { remove(r.binder); } @@ -345,7 +348,7 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { } public void notifyDataConnection(int state, boolean isDataConnectivityPossible, - String reason, String apn, String[] apnTypes, String interfaceName) { + String reason, String apn, String[] apnTypes, String interfaceName, int networkType) { if (!checkNotifyPermission("notifyDataConnection()" )) { return; } @@ -356,11 +359,12 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { mDataConnectionApn = apn; mDataConnectionApnTypes = apnTypes; mDataConnectionInterfaceName = interfaceName; + mDataConnectionNetworkType = networkType; for (int i = mRecords.size() - 1; i >= 0; i--) { Record r = mRecords.get(i); if ((r.events & PhoneStateListener.LISTEN_DATA_CONNECTION_STATE) != 0) { try { - r.callback.onDataConnectionStateChanged(state); + r.callback.onDataConnectionStateChanged(state, networkType); } catch (RemoteException ex) { remove(r.binder); } diff --git a/services/java/com/android/server/status/StatusBarPolicy.java b/services/java/com/android/server/status/StatusBarPolicy.java index d590c40286122..2b9d18f436e4a 100644 --- a/services/java/com/android/server/status/StatusBarPolicy.java +++ b/services/java/com/android/server/status/StatusBarPolicy.java @@ -782,7 +782,7 @@ public class StatusBarPolicy { public void onServiceStateChanged(ServiceState state) { mServiceState = state; updateSignalStrength(); - updateCdmaRoamingIcon(); + updateCdmaRoamingIcon(state); updateDataIcon(); } @@ -796,9 +796,9 @@ public class StatusBarPolicy { } @Override - public void onDataConnectionStateChanged(int state) { + public void onDataConnectionStateChanged(int state, int networkType) { mDataState = state; - updateDataNetType(); + updateDataNetType(networkType); updateDataIcon(); } @@ -835,7 +835,7 @@ public class StatusBarPolicy { } private boolean isCdma() { - return ((mPhone != null) && (mPhone.getPhoneType() == TelephonyManager.PHONE_TYPE_CDMA)); + return (mSignalStrength != null) && !mSignalStrength.isGsm(); } private boolean isEvdo() { @@ -889,6 +889,7 @@ public class StatusBarPolicy { else if (asu >= 4) iconLevel = 2; else iconLevel = 1; + // Though mPhone is a Manager, this call is not an IPC if (mPhone.isNetworkRoaming()) { iconList = sSignalImages_r; } else { @@ -956,8 +957,7 @@ public class StatusBarPolicy { return (levelEvdoDbm < levelEvdoSnr) ? levelEvdoDbm : levelEvdoSnr; } - private final void updateDataNetType() { - int net = mPhone.getNetworkType(); + private final void updateDataNetType(int net) { switch (net) { case TelephonyManager.NETWORK_TYPE_EDGE: @@ -1211,7 +1211,7 @@ public class StatusBarPolicy { } } - private final void updateCdmaRoamingIcon() { + private final void updateCdmaRoamingIcon(ServiceState state) { if (!hasService()) { mService.setIconVisibility(mCdmaRoamingIndicatorIcon, false); return; @@ -1223,8 +1223,8 @@ public class StatusBarPolicy { } int[] iconList = sRoamingIndicatorImages_cdma; - int iconIndex = mPhone.getCdmaEriIconIndex(); - int iconMode = mPhone.getCdmaEriIconMode(); + int iconIndex = state.getCdmaEriIconIndex(); + int iconMode = state.getCdmaEriIconMode(); if (iconIndex == -1) { Log.e(TAG, "getCdmaEriIconIndex returned null, skipping ERI icon update"); diff --git a/telephony/java/android/telephony/PhoneStateListener.java b/telephony/java/android/telephony/PhoneStateListener.java index 73e7baa593a64..ea6593e2ecc86 100644 --- a/telephony/java/android/telephony/PhoneStateListener.java +++ b/telephony/java/android/telephony/PhoneStateListener.java @@ -205,6 +205,13 @@ public class PhoneStateListener { // default implementation empty } + /** + * @hide + * same as above, but with the network type. Both called. + */ + public void onDataConnectionStateChanged(int state, int networkType) { + } + /** * Callback invoked when data activity state changes. * @@ -264,8 +271,9 @@ public class PhoneStateListener { Message.obtain(mHandler, LISTEN_CALL_STATE, state, 0, incomingNumber).sendToTarget(); } - public void onDataConnectionStateChanged(int state) { - Message.obtain(mHandler, LISTEN_DATA_CONNECTION_STATE, state, 0, null).sendToTarget(); + public void onDataConnectionStateChanged(int state, int networkType) { + Message.obtain(mHandler, LISTEN_DATA_CONNECTION_STATE, state, networkType, null). + sendToTarget(); } public void onDataActivity(int direction) { @@ -299,6 +307,7 @@ public class PhoneStateListener { PhoneStateListener.this.onCallStateChanged(msg.arg1, (String)msg.obj); break; case LISTEN_DATA_CONNECTION_STATE: + PhoneStateListener.this.onDataConnectionStateChanged(msg.arg1, msg.arg2); PhoneStateListener.this.onDataConnectionStateChanged(msg.arg1); break; case LISTEN_DATA_ACTIVITY: diff --git a/telephony/java/android/telephony/ServiceState.java b/telephony/java/android/telephony/ServiceState.java index 06b5c2619689a..48a40fa6a6ae6 100644 --- a/telephony/java/android/telephony/ServiceState.java +++ b/telephony/java/android/telephony/ServiceState.java @@ -120,6 +120,8 @@ public class ServiceState implements Parcelable { private int mSystemId; private int mCdmaRoamingIndicator; private int mCdmaDefaultRoamingIndicator; + private int mCdmaEriIconIndex; + private int mCdmaEriIconMode; /** * Create a new ServiceState from a intent notifier Bundle @@ -166,6 +168,8 @@ public class ServiceState implements Parcelable { mSystemId = s.mSystemId; mCdmaRoamingIndicator = s.mCdmaRoamingIndicator; mCdmaDefaultRoamingIndicator = s.mCdmaDefaultRoamingIndicator; + mCdmaEriIconIndex = s.mCdmaEriIconIndex; + mCdmaEriIconMode = s.mCdmaEriIconMode; } /** @@ -184,6 +188,8 @@ public class ServiceState implements Parcelable { mSystemId = in.readInt(); mCdmaRoamingIndicator = in.readInt(); mCdmaDefaultRoamingIndicator = in.readInt(); + mCdmaEriIconIndex = in.readInt(); + mCdmaEriIconMode = in.readInt(); } public void writeToParcel(Parcel out, int flags) { @@ -199,6 +205,8 @@ public class ServiceState implements Parcelable { out.writeInt(mSystemId); out.writeInt(mCdmaRoamingIndicator); out.writeInt(mCdmaDefaultRoamingIndicator); + out.writeInt(mCdmaEriIconIndex); + out.writeInt(mCdmaEriIconMode); } public int describeContents() { @@ -253,6 +261,20 @@ public class ServiceState implements Parcelable { return this.mCdmaDefaultRoamingIndicator; } + /** + * @hide + */ + public int getCdmaEriIconIndex() { + return this.mCdmaEriIconIndex; + } + + /** + * @hide + */ + public int getCdmaEriIconMode() { + return this.mCdmaEriIconMode; + } + /** * Get current registered operator name in long alphanumeric format * @@ -412,8 +434,11 @@ public class ServiceState implements Parcelable { mSystemId = -1; mCdmaRoamingIndicator = -1; mCdmaDefaultRoamingIndicator = -1; + mCdmaEriIconIndex = -1; + mCdmaEriIconMode = -1; } + // TODO - can't this be combined with the above func.. public void setStateOff() { mState = STATE_POWER_OFF; mRoaming = false; @@ -427,6 +452,8 @@ public class ServiceState implements Parcelable { mSystemId = -1; mCdmaRoamingIndicator = -1; mCdmaDefaultRoamingIndicator = -1; + mCdmaEriIconIndex = -1; + mCdmaEriIconMode = -1; } public void setState(int state) { @@ -451,6 +478,20 @@ public class ServiceState implements Parcelable { this.mCdmaDefaultRoamingIndicator = roaming; } + /** + * @hide + */ + public void setCdmaEriIconIndex(int index) { + this.mCdmaEriIconIndex = index; + } + + /** + * @hide + */ + public void setCdmaEriIconMode(int mode) { + this.mCdmaEriIconMode = mode; + } + public void setOperatorName(String longName, String shortName, String numeric) { mOperatorAlphaLong = longName; mOperatorAlphaShort = shortName; diff --git a/telephony/java/com/android/internal/telephony/DefaultPhoneNotifier.java b/telephony/java/com/android/internal/telephony/DefaultPhoneNotifier.java index 00d7c72e14253..4da4b6abe73d5 100644 --- a/telephony/java/com/android/internal/telephony/DefaultPhoneNotifier.java +++ b/telephony/java/com/android/internal/telephony/DefaultPhoneNotifier.java @@ -93,13 +93,16 @@ public class DefaultPhoneNotifier implements PhoneNotifier { } public void notifyDataConnection(Phone sender, String reason) { + TelephonyManager telephony = TelephonyManager.getDefault(); try { mRegistry.notifyDataConnection( convertDataState(sender.getDataConnectionState()), sender.isDataConnectivityPossible(), reason, sender.getActiveApn(), sender.getActiveApnTypes(), - sender.getInterfaceName(null)); + sender.getInterfaceName(null), + ((telephony!=null) ? telephony.getNetworkType() : + TelephonyManager.NETWORK_TYPE_UNKNOWN)); } catch (RemoteException ex) { // system process is dead } diff --git a/telephony/java/com/android/internal/telephony/IPhoneStateListener.aidl b/telephony/java/com/android/internal/telephony/IPhoneStateListener.aidl index 0202ec81edf3f..856d6638d71b6 100644 --- a/telephony/java/com/android/internal/telephony/IPhoneStateListener.aidl +++ b/telephony/java/com/android/internal/telephony/IPhoneStateListener.aidl @@ -29,7 +29,7 @@ oneway interface IPhoneStateListener { // we use bundle here instead of CellLocation so it can get the right subclass void onCellLocationChanged(in Bundle location); void onCallStateChanged(int state, String incomingNumber); - void onDataConnectionStateChanged(int state); + void onDataConnectionStateChanged(int state, int networkType); void onDataActivity(int direction); void onSignalStrengthsChanged(in SignalStrength signalStrength); } diff --git a/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl b/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl index 6b42e6b3c8601..5bf8e58265932 100644 --- a/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl +++ b/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl @@ -32,7 +32,7 @@ interface ITelephonyRegistry { void notifyCallForwardingChanged(boolean cfi); void notifyDataActivity(int state); void notifyDataConnection(int state, boolean isDataConnectivityPossible, - String reason, String apn, in String[] apnTypes, String interfaceName); + String reason, String apn, in String[] apnTypes, String interfaceName, int networkType); void notifyDataConnectionFailed(String reason); void notifyCellLocation(in Bundle cellLocation); } diff --git a/telephony/java/com/android/internal/telephony/cdma/CDMAPhone.java b/telephony/java/com/android/internal/telephony/cdma/CDMAPhone.java index 6dcfcd93beb5c..22fbe8bf1a303 100755 --- a/telephony/java/com/android/internal/telephony/cdma/CDMAPhone.java +++ b/telephony/java/com/android/internal/telephony/cdma/CDMAPhone.java @@ -257,6 +257,12 @@ public class CDMAPhone extends PhoneBase { } public ServiceState getServiceState() { + int roamInd = mSST.ss.getCdmaRoamingIndicator(); + int defRoamInd = mSST.ss.getCdmaDefaultRoamingIndicator(); + + mSST.ss.setCdmaEriIconIndex(mEriManager.getCdmaEriIconIndex(roamInd, defRoamInd)); + mSST.ss.setCdmaEriIconMode(mEriManager.getCdmaEriIconMode(roamInd, defRoamInd)); + return mSST.ss; } @@ -798,6 +804,10 @@ public class CDMAPhone extends PhoneBase { } void notifyServiceStateChanged(ServiceState ss) { + // TODO this seems really inefficient. Can't we calc this when the fundamentals change and store in the + // service state? + ss.setCdmaEriIconIndex(this.getCdmaEriIconIndex()); + ss.setCdmaEriIconMode(this.getCdmaEriIconMode()); super.notifyServiceStateChangedP(ss); }