Loading android/app/src/com/android/bluetooth/hfp/HeadsetPhoneState.java +11 −2 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.os.Handler; import android.telephony.PhoneStateListener; import android.telephony.ServiceState; import android.telephony.SignalStrength; import android.telephony.SignalStrengthUpdateRequest; import android.telephony.SubscriptionManager; import android.telephony.SubscriptionManager.OnSubscriptionsChangedListener; import android.telephony.TelephonyManager; Loading @@ -29,6 +30,7 @@ import android.util.Log; import com.android.internal.annotations.VisibleForTesting; import java.util.Collections; import java.util.HashMap; import java.util.Objects; import java.util.concurrent.Executor; Loading Loading @@ -70,8 +72,7 @@ public class HeadsetPhoneState { private final HashMap<BluetoothDevice, Integer> mDeviceEventMap = new HashMap<>(); private PhoneStateListener mPhoneStateListener; private final OnSubscriptionsChangedListener mOnSubscriptionsChangedListener; // TODO(b/205585585): Re-enable SignalStrengthUpdateRequest to support "always report signal // strength" when the crash is fixed. private SignalStrengthUpdateRequest mSignalStrengthUpdateRequest; HeadsetPhoneState(HeadsetService headsetService) { Objects.requireNonNull(headsetService, "headsetService is null"); Loading @@ -87,6 +88,10 @@ public class HeadsetPhoneState { mOnSubscriptionsChangedListener = new HeadsetPhoneStateOnSubscriptionChangedListener(); mSubscriptionManager.addOnSubscriptionsChangedListener(command -> mHandler.post(command), mOnSubscriptionsChangedListener); mSignalStrengthUpdateRequest = new SignalStrengthUpdateRequest.Builder() .setSignalThresholdInfos(Collections.EMPTY_LIST) .setSystemThresholdReportingRequestedWhileIdle(true) .build(); } /** Loading Loading @@ -158,6 +163,9 @@ public class HeadsetPhoneState { Log.i(TAG, "startListenForPhoneState(), subId=" + subId + ", enabled_events=" + events); mPhoneStateListener = new HeadsetPhoneStateListener(command -> mHandler.post(command)); mTelephonyManager.listen(mPhoneStateListener, events); if ((events & PhoneStateListener.LISTEN_SIGNAL_STRENGTHS) != 0) { mTelephonyManager.setSignalStrengthUpdateRequest(mSignalStrengthUpdateRequest); } } private void stopListenForPhoneState() { Loading @@ -169,6 +177,7 @@ public class HeadsetPhoneState { + getTelephonyEventsToListen()); mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE); mPhoneStateListener = null; mTelephonyManager.clearSignalStrengthUpdateRequest(mSignalStrengthUpdateRequest); } int getCindService() { Loading android/app/tests/unit/src/com/android/bluetooth/hfp/HeadsetPhoneStateTest.java +23 −0 Original line number Diff line number Diff line Loading @@ -27,6 +27,7 @@ import android.os.IBinder; import android.os.Looper; import android.os.ServiceManager; import android.telephony.PhoneStateListener; import android.telephony.SignalStrengthUpdateRequest; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; Loading Loading @@ -140,6 +141,8 @@ public class HeadsetPhoneStateTest { | PhoneStateListener.LISTEN_SIGNAL_STRENGTHS); verify(mTelephonyManager).listen(any(), eq(PhoneStateListener.LISTEN_SERVICE_STATE | PhoneStateListener.LISTEN_SIGNAL_STRENGTHS)); verify(mTelephonyManager).setSignalStrengthUpdateRequest( any(SignalStrengthUpdateRequest.class)); } /** Loading @@ -153,9 +156,14 @@ public class HeadsetPhoneStateTest { | PhoneStateListener.LISTEN_SIGNAL_STRENGTHS); verify(mTelephonyManager).listen(any(), eq(PhoneStateListener.LISTEN_SERVICE_STATE | PhoneStateListener.LISTEN_SIGNAL_STRENGTHS)); verify(mTelephonyManager).setSignalStrengthUpdateRequest( any(SignalStrengthUpdateRequest.class)); mHeadsetPhoneState.listenForPhoneState(device1, PhoneStateListener.LISTEN_SERVICE_STATE); verify(mTelephonyManager).listen(any(), eq(PhoneStateListener.LISTEN_NONE)); verify(mTelephonyManager).listen(any(), eq(PhoneStateListener.LISTEN_SERVICE_STATE)); verify(mTelephonyManager).clearSignalStrengthUpdateRequest( any(SignalStrengthUpdateRequest.class)); } /** Loading @@ -168,8 +176,13 @@ public class HeadsetPhoneStateTest { | PhoneStateListener.LISTEN_SIGNAL_STRENGTHS); verify(mTelephonyManager).listen(any(), eq(PhoneStateListener.LISTEN_SERVICE_STATE | PhoneStateListener.LISTEN_SIGNAL_STRENGTHS)); verify(mTelephonyManager).setSignalStrengthUpdateRequest( any(SignalStrengthUpdateRequest.class)); mHeadsetPhoneState.listenForPhoneState(device1, PhoneStateListener.LISTEN_NONE); verify(mTelephonyManager).listen(any(), eq(PhoneStateListener.LISTEN_NONE)); verify(mTelephonyManager).clearSignalStrengthUpdateRequest( any(SignalStrengthUpdateRequest.class)); } /** Loading @@ -186,6 +199,9 @@ public class HeadsetPhoneStateTest { | PhoneStateListener.LISTEN_SIGNAL_STRENGTHS); verify(mTelephonyManager).listen(any(), eq(PhoneStateListener.LISTEN_SERVICE_STATE | PhoneStateListener.LISTEN_SIGNAL_STRENGTHS)); verify(mTelephonyManager).setSignalStrengthUpdateRequest( any(SignalStrengthUpdateRequest.class)); // Enabling updates from second device should not trigger the same subscription mHeadsetPhoneState.listenForPhoneState(device2, PhoneStateListener.LISTEN_SERVICE_STATE | PhoneStateListener.LISTEN_SIGNAL_STRENGTHS); Loading @@ -194,6 +210,8 @@ public class HeadsetPhoneStateTest { // Disabling updates from second device should cancel subscription mHeadsetPhoneState.listenForPhoneState(device2, PhoneStateListener.LISTEN_NONE); verify(mTelephonyManager).listen(any(), eq(PhoneStateListener.LISTEN_NONE)); verify(mTelephonyManager).clearSignalStrengthUpdateRequest( any(SignalStrengthUpdateRequest.class)); } /** Loading @@ -215,6 +233,9 @@ public class HeadsetPhoneStateTest { verify(mTelephonyManager).listen(any(), eq(PhoneStateListener.LISTEN_NONE)); verify(mTelephonyManager).listen(any(), eq(PhoneStateListener.LISTEN_SERVICE_STATE | PhoneStateListener.LISTEN_SIGNAL_STRENGTHS)); verify(mTelephonyManager).setSignalStrengthUpdateRequest( any(SignalStrengthUpdateRequest.class)); // Partially disabling updates from first device should not cancel all subscription mHeadsetPhoneState.listenForPhoneState(device1, PhoneStateListener.LISTEN_NONE); verify(mTelephonyManager, times(2)).listen(any(), eq(PhoneStateListener.LISTEN_NONE)); Loading @@ -223,5 +244,7 @@ public class HeadsetPhoneStateTest { // Partially disabling updates from second device should cancel subscription mHeadsetPhoneState.listenForPhoneState(device2, PhoneStateListener.LISTEN_NONE); verify(mTelephonyManager, times(3)).listen(any(), eq(PhoneStateListener.LISTEN_NONE)); verify(mTelephonyManager, times(3)).clearSignalStrengthUpdateRequest( any(SignalStrengthUpdateRequest.class)); } } Loading
android/app/src/com/android/bluetooth/hfp/HeadsetPhoneState.java +11 −2 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.os.Handler; import android.telephony.PhoneStateListener; import android.telephony.ServiceState; import android.telephony.SignalStrength; import android.telephony.SignalStrengthUpdateRequest; import android.telephony.SubscriptionManager; import android.telephony.SubscriptionManager.OnSubscriptionsChangedListener; import android.telephony.TelephonyManager; Loading @@ -29,6 +30,7 @@ import android.util.Log; import com.android.internal.annotations.VisibleForTesting; import java.util.Collections; import java.util.HashMap; import java.util.Objects; import java.util.concurrent.Executor; Loading Loading @@ -70,8 +72,7 @@ public class HeadsetPhoneState { private final HashMap<BluetoothDevice, Integer> mDeviceEventMap = new HashMap<>(); private PhoneStateListener mPhoneStateListener; private final OnSubscriptionsChangedListener mOnSubscriptionsChangedListener; // TODO(b/205585585): Re-enable SignalStrengthUpdateRequest to support "always report signal // strength" when the crash is fixed. private SignalStrengthUpdateRequest mSignalStrengthUpdateRequest; HeadsetPhoneState(HeadsetService headsetService) { Objects.requireNonNull(headsetService, "headsetService is null"); Loading @@ -87,6 +88,10 @@ public class HeadsetPhoneState { mOnSubscriptionsChangedListener = new HeadsetPhoneStateOnSubscriptionChangedListener(); mSubscriptionManager.addOnSubscriptionsChangedListener(command -> mHandler.post(command), mOnSubscriptionsChangedListener); mSignalStrengthUpdateRequest = new SignalStrengthUpdateRequest.Builder() .setSignalThresholdInfos(Collections.EMPTY_LIST) .setSystemThresholdReportingRequestedWhileIdle(true) .build(); } /** Loading Loading @@ -158,6 +163,9 @@ public class HeadsetPhoneState { Log.i(TAG, "startListenForPhoneState(), subId=" + subId + ", enabled_events=" + events); mPhoneStateListener = new HeadsetPhoneStateListener(command -> mHandler.post(command)); mTelephonyManager.listen(mPhoneStateListener, events); if ((events & PhoneStateListener.LISTEN_SIGNAL_STRENGTHS) != 0) { mTelephonyManager.setSignalStrengthUpdateRequest(mSignalStrengthUpdateRequest); } } private void stopListenForPhoneState() { Loading @@ -169,6 +177,7 @@ public class HeadsetPhoneState { + getTelephonyEventsToListen()); mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE); mPhoneStateListener = null; mTelephonyManager.clearSignalStrengthUpdateRequest(mSignalStrengthUpdateRequest); } int getCindService() { Loading
android/app/tests/unit/src/com/android/bluetooth/hfp/HeadsetPhoneStateTest.java +23 −0 Original line number Diff line number Diff line Loading @@ -27,6 +27,7 @@ import android.os.IBinder; import android.os.Looper; import android.os.ServiceManager; import android.telephony.PhoneStateListener; import android.telephony.SignalStrengthUpdateRequest; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; Loading Loading @@ -140,6 +141,8 @@ public class HeadsetPhoneStateTest { | PhoneStateListener.LISTEN_SIGNAL_STRENGTHS); verify(mTelephonyManager).listen(any(), eq(PhoneStateListener.LISTEN_SERVICE_STATE | PhoneStateListener.LISTEN_SIGNAL_STRENGTHS)); verify(mTelephonyManager).setSignalStrengthUpdateRequest( any(SignalStrengthUpdateRequest.class)); } /** Loading @@ -153,9 +156,14 @@ public class HeadsetPhoneStateTest { | PhoneStateListener.LISTEN_SIGNAL_STRENGTHS); verify(mTelephonyManager).listen(any(), eq(PhoneStateListener.LISTEN_SERVICE_STATE | PhoneStateListener.LISTEN_SIGNAL_STRENGTHS)); verify(mTelephonyManager).setSignalStrengthUpdateRequest( any(SignalStrengthUpdateRequest.class)); mHeadsetPhoneState.listenForPhoneState(device1, PhoneStateListener.LISTEN_SERVICE_STATE); verify(mTelephonyManager).listen(any(), eq(PhoneStateListener.LISTEN_NONE)); verify(mTelephonyManager).listen(any(), eq(PhoneStateListener.LISTEN_SERVICE_STATE)); verify(mTelephonyManager).clearSignalStrengthUpdateRequest( any(SignalStrengthUpdateRequest.class)); } /** Loading @@ -168,8 +176,13 @@ public class HeadsetPhoneStateTest { | PhoneStateListener.LISTEN_SIGNAL_STRENGTHS); verify(mTelephonyManager).listen(any(), eq(PhoneStateListener.LISTEN_SERVICE_STATE | PhoneStateListener.LISTEN_SIGNAL_STRENGTHS)); verify(mTelephonyManager).setSignalStrengthUpdateRequest( any(SignalStrengthUpdateRequest.class)); mHeadsetPhoneState.listenForPhoneState(device1, PhoneStateListener.LISTEN_NONE); verify(mTelephonyManager).listen(any(), eq(PhoneStateListener.LISTEN_NONE)); verify(mTelephonyManager).clearSignalStrengthUpdateRequest( any(SignalStrengthUpdateRequest.class)); } /** Loading @@ -186,6 +199,9 @@ public class HeadsetPhoneStateTest { | PhoneStateListener.LISTEN_SIGNAL_STRENGTHS); verify(mTelephonyManager).listen(any(), eq(PhoneStateListener.LISTEN_SERVICE_STATE | PhoneStateListener.LISTEN_SIGNAL_STRENGTHS)); verify(mTelephonyManager).setSignalStrengthUpdateRequest( any(SignalStrengthUpdateRequest.class)); // Enabling updates from second device should not trigger the same subscription mHeadsetPhoneState.listenForPhoneState(device2, PhoneStateListener.LISTEN_SERVICE_STATE | PhoneStateListener.LISTEN_SIGNAL_STRENGTHS); Loading @@ -194,6 +210,8 @@ public class HeadsetPhoneStateTest { // Disabling updates from second device should cancel subscription mHeadsetPhoneState.listenForPhoneState(device2, PhoneStateListener.LISTEN_NONE); verify(mTelephonyManager).listen(any(), eq(PhoneStateListener.LISTEN_NONE)); verify(mTelephonyManager).clearSignalStrengthUpdateRequest( any(SignalStrengthUpdateRequest.class)); } /** Loading @@ -215,6 +233,9 @@ public class HeadsetPhoneStateTest { verify(mTelephonyManager).listen(any(), eq(PhoneStateListener.LISTEN_NONE)); verify(mTelephonyManager).listen(any(), eq(PhoneStateListener.LISTEN_SERVICE_STATE | PhoneStateListener.LISTEN_SIGNAL_STRENGTHS)); verify(mTelephonyManager).setSignalStrengthUpdateRequest( any(SignalStrengthUpdateRequest.class)); // Partially disabling updates from first device should not cancel all subscription mHeadsetPhoneState.listenForPhoneState(device1, PhoneStateListener.LISTEN_NONE); verify(mTelephonyManager, times(2)).listen(any(), eq(PhoneStateListener.LISTEN_NONE)); Loading @@ -223,5 +244,7 @@ public class HeadsetPhoneStateTest { // Partially disabling updates from second device should cancel subscription mHeadsetPhoneState.listenForPhoneState(device2, PhoneStateListener.LISTEN_NONE); verify(mTelephonyManager, times(3)).listen(any(), eq(PhoneStateListener.LISTEN_NONE)); verify(mTelephonyManager, times(3)).clearSignalStrengthUpdateRequest( any(SignalStrengthUpdateRequest.class)); } }