diff options
5 files changed, 69 insertions, 3 deletions
diff --git a/services/core/java/com/android/server/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java index 5e5eacb5c767..ceb213594b8e 100644 --- a/services/core/java/com/android/server/TelephonyRegistry.java +++ b/services/core/java/com/android/server/TelephonyRegistry.java @@ -36,6 +36,7 @@ import android.telephony.CellInfo; import android.telephony.CellLocation; import android.telephony.DisconnectCause; import android.telephony.PhoneStateListener; +import android.telephony.PhysicalChannelConfig; import android.telephony.PreciseCallState; import android.telephony.PreciseDataConnectionState; import android.telephony.PreciseDisconnectCause; @@ -176,6 +177,8 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { private ArrayList<List<CellInfo>> mCellInfo = null; + private ArrayList<List<PhysicalChannelConfig>> mPhysicalChannelConfigs; + private VoLteServiceState mVoLteServiceState = new VoLteServiceState(); private int mDefaultSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID; @@ -332,6 +335,7 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { mDataConnectionLinkProperties = new LinkProperties[numPhones]; mDataConnectionNetworkCapabilities = new NetworkCapabilities[numPhones]; mCellInfo = new ArrayList<List<CellInfo>>(); + mPhysicalChannelConfigs = new ArrayList<List<PhysicalChannelConfig>>(); for (int i = 0; i < numPhones; i++) { mCallState[i] = TelephonyManager.CALL_STATE_IDLE; mDataActivity[i] = TelephonyManager.DATA_ACTIVITY_NONE; @@ -346,6 +350,7 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { mCallForwarding[i] = false; mCellLocation[i] = new Bundle(); mCellInfo.add(i, null); + mPhysicalChannelConfigs.add(i, null); mConnectedApns[i] = new ArrayList<String>(); } @@ -667,6 +672,14 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { remove(r.binder); } } + if ((events & PhoneStateListener.LISTEN_PHYSICAL_CHANNEL_CONFIGURATION) != 0) { + try { + r.callback.onPhysicalChannelConfigurationChanged( + mPhysicalChannelConfigs.get(phoneId)); + } catch (RemoteException ex) { + remove(r.binder); + } + } } } } else { @@ -1036,6 +1049,45 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { } } + public void notifyPhysicalChannelConfiguration(List<PhysicalChannelConfig> configs) { + notifyPhysicalChannelConfigurationForSubscriber(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID, + configs); + } + + public void notifyPhysicalChannelConfigurationForSubscriber(int subId, + List<PhysicalChannelConfig> configs) { + if (!checkNotifyPermission("notifyPhysicalChannelConfiguration()")) { + return; + } + + if (VDBG) { + log("notifyPhysicalChannelConfiguration: subId=" + subId + " configs=" + configs); + } + + synchronized (mRecords) { + int phoneId = SubscriptionManager.getPhoneId(subId); + if (validatePhoneId(phoneId)) { + mPhysicalChannelConfigs.set(phoneId, configs); + for (Record r : mRecords) { + if (r.matchPhoneStateListenerEvent( + PhoneStateListener.LISTEN_PHYSICAL_CHANNEL_CONFIGURATION) + && idMatch(r.subId, subId, phoneId)) { + try { + if (DBG_LOC) { + log("notifyPhysicalChannelConfiguration: mPhysicalChannelConfigs=" + + configs + " r=" + r); + } + r.callback.onPhysicalChannelConfigurationChanged(configs); + } catch (RemoteException ex) { + mRemoveList.add(r.binder); + } + } + } + } + handleRemoveListLocked(); + } + } + @Override public void notifyMessageWaitingChangedForPhoneId(int phoneId, int subId, boolean mwi) { if (!checkNotifyPermission("notifyMessageWaitingChanged()")) { diff --git a/telephony/java/android/telephony/PhoneStateListener.java b/telephony/java/android/telephony/PhoneStateListener.java index 0ee870aaa24b..0446925f8cb4 100644 --- a/telephony/java/android/telephony/PhoneStateListener.java +++ b/telephony/java/android/telephony/PhoneStateListener.java @@ -372,7 +372,7 @@ public class PhoneStateListener { break; case LISTEN_PHYSICAL_CHANNEL_CONFIGURATION: PhoneStateListener.this.onPhysicalChannelConfigurationChanged( - (List<PhysicalChannelConfig>)msg.obj); + (List<PhysicalChannelConfig>)msg.obj); break; } } @@ -700,6 +700,10 @@ public class PhoneStateListener { public void onCarrierNetworkChange(boolean active) { send(LISTEN_CARRIER_NETWORK_CHANGE, 0, 0, active); } + + public void onPhysicalChannelConfigurationChanged(List<PhysicalChannelConfig> configs) { + send(LISTEN_PHYSICAL_CHANNEL_CONFIGURATION, 0, 0, configs); + } } IPhoneStateListener callback = new IPhoneStateListenerStub(this); diff --git a/telephony/java/android/telephony/PhysicalChannelConfig.java b/telephony/java/android/telephony/PhysicalChannelConfig.java index 651d68d833dc..ce444dd00ce4 100644 --- a/telephony/java/android/telephony/PhysicalChannelConfig.java +++ b/telephony/java/android/telephony/PhysicalChannelConfig.java @@ -27,8 +27,9 @@ import java.lang.annotation.RetentionPolicy; */ public final class PhysicalChannelConfig implements Parcelable { + // TODO(b/72993578) consolidate these enums in a central location. @Retention(RetentionPolicy.SOURCE) - @IntDef({CONNECTION_PRIMARY_SERVING, CONNECTION_SECONDARY_SERVING}) + @IntDef({CONNECTION_PRIMARY_SERVING, CONNECTION_SECONDARY_SERVING, CONNECTION_UNKNOWN}) public @interface ConnectionStatus {} /** @@ -41,6 +42,9 @@ public final class PhysicalChannelConfig implements Parcelable { */ public static final int CONNECTION_SECONDARY_SERVING = 2; + /** Connection status is unknown. */ + public static final int CONNECTION_UNKNOWN = Integer.MAX_VALUE; + /** * Connection status of the cell. * @@ -86,6 +90,7 @@ public final class PhysicalChannelConfig implements Parcelable { * * @see #CONNECTION_PRIMARY_SERVING * @see #CONNECTION_SECONDARY_SERVING + * @see #CONNECTION_UNKNOWN * * @return Connection status of the cell */ diff --git a/telephony/java/com/android/internal/telephony/IPhoneStateListener.aidl b/telephony/java/com/android/internal/telephony/IPhoneStateListener.aidl index 8e3f4c070d2e..1cfe8c2442bd 100644 --- a/telephony/java/com/android/internal/telephony/IPhoneStateListener.aidl +++ b/telephony/java/com/android/internal/telephony/IPhoneStateListener.aidl @@ -21,6 +21,7 @@ import android.telephony.ServiceState; import android.telephony.SignalStrength; import android.telephony.CellInfo; import android.telephony.DataConnectionRealTimeInfo; +import android.telephony.PhysicalChannelConfig; import android.telephony.PreciseCallState; import android.telephony.PreciseDataConnectionState; import android.telephony.VoLteServiceState; @@ -37,6 +38,7 @@ oneway interface IPhoneStateListener { void onDataConnectionStateChanged(int state, int networkType); void onDataActivity(int direction); void onSignalStrengthsChanged(in SignalStrength signalStrength); + void onPhysicalChannelConfigurationChanged(in List<PhysicalChannelConfig> configs); void onOtaspChanged(in int otaspMode); void onCellInfoChanged(in List<CellInfo> cellInfo); void onPreciseCallStateChanged(in PreciseCallState callState); diff --git a/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl b/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl index 188167cc14f6..06dc13e53bf7 100644 --- a/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl +++ b/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl @@ -21,9 +21,9 @@ import android.net.LinkProperties; import android.net.NetworkCapabilities; import android.os.Bundle; import android.telephony.CellInfo; +import android.telephony.PhysicalChannelConfig; import android.telephony.ServiceState; import android.telephony.SignalStrength; -import android.telephony.CellInfo; import android.telephony.VoLteServiceState; import com.android.internal.telephony.IPhoneStateListener; import com.android.internal.telephony.IOnSubscriptionsChangedListener; @@ -58,6 +58,9 @@ interface ITelephonyRegistry { void notifyCellLocationForSubscriber(in int subId, in Bundle cellLocation); void notifyOtaspChanged(in int otaspMode); void notifyCellInfo(in List<CellInfo> cellInfo); + void notifyPhysicalChannelConfiguration(in List<PhysicalChannelConfig> configs); + void notifyPhysicalChannelConfigurationForSubscriber(in int subId, + in List<PhysicalChannelConfig> configs); void notifyPreciseCallState(int ringingCallState, int foregroundCallState, int backgroundCallState); void notifyDisconnectCause(int disconnectCause, int preciseDisconnectCause); |