From f431088f9d9856cc937182c75e61834ca6696e1b Mon Sep 17 00:00:00 2001 From: hughchen Date: Tue, 17 Apr 2018 16:36:58 +0800 Subject: [PATCH] Change the title when in call/media state * For fix the "Automatic merge failed" in pi-dev, cherry pick the ag/3909960 in master. Change android.support.* to androidx.* * Change the title when in call/media state. Example: call state show "Available call devices" media state show "Available media devices" * Use isAudioModeOngoingCall() utility function for checking if it is in call status * Add register test to verify when in onStart() and onStop() the BluetoothCallback can be register and unregister. * Add title string test to verify when in call or media state, the title can be changed to corresponding string Bug: 78150641 Test: make -j40 RunSettingsRoboTests Change-Id: I6be72cf0cae75525084ac3c5be8524c709f51f7d --- .../AvailableMediaDeviceGroupController.java | 66 ++++++++++++++++++- .../AudioSwitchPreferenceController.java | 7 -- ...FreeProfileOutputPreferenceController.java | 6 +- .../MediaOutputPreferenceController.java | 4 +- ...ailableMediaDeviceGroupControllerTest.java | 46 +++++++++++++ 5 files changed, 118 insertions(+), 11 deletions(-) diff --git a/src/com/android/settings/connecteddevice/AvailableMediaDeviceGroupController.java b/src/com/android/settings/connecteddevice/AvailableMediaDeviceGroupController.java index 9c15282606b..1e5224a01ba 100644 --- a/src/com/android/settings/connecteddevice/AvailableMediaDeviceGroupController.java +++ b/src/com/android/settings/connecteddevice/AvailableMediaDeviceGroupController.java @@ -15,6 +15,8 @@ */ package com.android.settings.connecteddevice; +import static com.android.settingslib.Utils.isAudioModeOngoingCall; + import android.content.Context; import android.content.pm.PackageManager; import androidx.annotation.VisibleForTesting; @@ -23,8 +25,13 @@ import androidx.preference.PreferenceGroup; import androidx.preference.PreferenceScreen; import com.android.settings.bluetooth.AvailableMediaBluetoothDeviceUpdater; import com.android.settings.bluetooth.BluetoothDeviceUpdater; +import com.android.settings.bluetooth.Utils; import com.android.settings.core.BasePreferenceController; import com.android.settings.dashboard.DashboardFragment; +import com.android.settings.R; +import com.android.settingslib.bluetooth.BluetoothCallback; +import com.android.settingslib.bluetooth.CachedBluetoothDevice; +import com.android.settingslib.bluetooth.LocalBluetoothManager; import com.android.settingslib.core.lifecycle.LifecycleObserver; import com.android.settingslib.core.lifecycle.events.OnStart; import com.android.settingslib.core.lifecycle.events.OnStop; @@ -35,26 +42,30 @@ import com.android.settingslib.core.lifecycle.events.OnStop; * to add/remove {@link Preference} */ public class AvailableMediaDeviceGroupController extends BasePreferenceController - implements LifecycleObserver, OnStart, OnStop, DevicePreferenceCallback { + implements LifecycleObserver, OnStart, OnStop, DevicePreferenceCallback, BluetoothCallback { private static final String KEY = "available_device_list"; @VisibleForTesting PreferenceGroup mPreferenceGroup; private BluetoothDeviceUpdater mBluetoothDeviceUpdater; + private final LocalBluetoothManager mLocalBluetoothManager; public AvailableMediaDeviceGroupController(Context context) { super(context, KEY); + mLocalBluetoothManager = Utils.getLocalBtManager(mContext); } @Override public void onStart() { mBluetoothDeviceUpdater.registerCallback(); + mLocalBluetoothManager.getEventManager().registerCallback(this); } @Override public void onStop() { mBluetoothDeviceUpdater.unregisterCallback(); + mLocalBluetoothManager.getEventManager().unregisterCallback(this); } @Override @@ -63,6 +74,7 @@ public class AvailableMediaDeviceGroupController extends BasePreferenceControlle if (isAvailable()) { mPreferenceGroup = (PreferenceGroup) screen.findPreference(KEY); mPreferenceGroup.setVisible(false); + updateTitle(); mBluetoothDeviceUpdater.setPrefContext(screen.getContext()); mBluetoothDeviceUpdater.forceUpdate(); } @@ -105,4 +117,56 @@ public class AvailableMediaDeviceGroupController extends BasePreferenceControlle public void setBluetoothDeviceUpdater(BluetoothDeviceUpdater bluetoothDeviceUpdater) { mBluetoothDeviceUpdater = bluetoothDeviceUpdater; } + + @Override + public void onBluetoothStateChanged(int bluetoothState) { + // do nothing + } + + @Override + public void onScanningStateChanged(boolean started) { + // do nothing + } + + @Override + public void onDeviceAdded(CachedBluetoothDevice cachedDevice) { + // do nothing + } + + @Override + public void onDeviceDeleted(CachedBluetoothDevice cachedDevice) { + // do nothing + } + + @Override + public void onDeviceBondStateChanged(CachedBluetoothDevice cachedDevice, int bondState) { + // do nothing + } + + @Override + public void onConnectionStateChanged(CachedBluetoothDevice cachedDevice, int state) { + // do nothing + } + + @Override + public void onActiveDeviceChanged(CachedBluetoothDevice activeDevice, int bluetoothProfile) { + // do nothing + } + + @Override + public void onAudioModeChanged() { + updateTitle(); + } + + private void updateTitle() { + if (isAudioModeOngoingCall(mContext)) { + // in phone call + mPreferenceGroup. + setTitle(mContext.getString(R.string.connected_device_available_call_title)); + } else { + // without phone call + mPreferenceGroup. + setTitle(mContext.getString(R.string.connected_device_available_media_title)); + } + } } diff --git a/src/com/android/settings/sound/AudioSwitchPreferenceController.java b/src/com/android/settings/sound/AudioSwitchPreferenceController.java index cae7b0cbd9e..24d23ab8756 100644 --- a/src/com/android/settings/sound/AudioSwitchPreferenceController.java +++ b/src/com/android/settings/sound/AudioSwitchPreferenceController.java @@ -198,13 +198,6 @@ public abstract class AudioSwitchPreferenceController extends BasePreferenceCont return mAudioManager.getDevicesForStream(streamType) == device; } - protected boolean isOngoingCallStatus() { - final int audioMode = mAudioManager.getMode(); - return audioMode == AudioManager.MODE_RINGTONE - || audioMode == AudioManager.MODE_IN_CALL - || audioMode == AudioManager.MODE_IN_COMMUNICATION; - } - int getDefaultDeviceIndex() { // Default device is after all connected devices. return ArrayUtils.size(mConnectedDevices); diff --git a/src/com/android/settings/sound/HandsFreeProfileOutputPreferenceController.java b/src/com/android/settings/sound/HandsFreeProfileOutputPreferenceController.java index 7e9186541ee..732f0efbbbe 100644 --- a/src/com/android/settings/sound/HandsFreeProfileOutputPreferenceController.java +++ b/src/com/android/settings/sound/HandsFreeProfileOutputPreferenceController.java @@ -19,6 +19,8 @@ package com.android.settings.sound; import static android.media.AudioManager.STREAM_VOICE_CALL; import static android.media.AudioSystem.DEVICE_OUT_USB_HEADSET; +import com.android.settingslib.Utils; + import android.bluetooth.BluetoothDevice; import android.content.Context; import androidx.preference.Preference; @@ -45,7 +47,7 @@ public class HandsFreeProfileOutputPreferenceController extends return; } - if (!isOngoingCallStatus()) { + if (!Utils.isAudioModeOngoingCall(mContext)) { // Without phone call, disable the switch entry. mPreference.setVisible(false); preference.setSummary(mContext.getText(R.string.media_output_default_summary)); @@ -90,7 +92,7 @@ public class HandsFreeProfileOutputPreferenceController extends @Override public void setActiveBluetoothDevice(BluetoothDevice device) { - if (isOngoingCallStatus()) { + if (Utils.isAudioModeOngoingCall(mContext)) { mProfileManager.getHeadsetProfile().setActiveDevice(device); } } diff --git a/src/com/android/settings/sound/MediaOutputPreferenceController.java b/src/com/android/settings/sound/MediaOutputPreferenceController.java index 5ac0848f1e1..89ee412ee8e 100644 --- a/src/com/android/settings/sound/MediaOutputPreferenceController.java +++ b/src/com/android/settings/sound/MediaOutputPreferenceController.java @@ -20,6 +20,8 @@ import static android.media.AudioManager.STREAM_MUSIC; import static android.media.AudioSystem.DEVICE_OUT_REMOTE_SUBMIX; import static android.media.AudioSystem.DEVICE_OUT_USB_HEADSET; +import com.android.settingslib.Utils; + import android.bluetooth.BluetoothDevice; import android.content.Context; import android.media.AudioManager; @@ -57,7 +59,7 @@ public class MediaOutputPreferenceController extends AudioSwitchPreferenceContro return; } - if (isOngoingCallStatus()) { + if (Utils.isAudioModeOngoingCall(mContext)) { // Ongoing call status, switch entry for media will be disabled. mPreference.setVisible(false); preference.setSummary( diff --git a/tests/robotests/src/com/android/settings/connecteddevice/AvailableMediaDeviceGroupControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/AvailableMediaDeviceGroupControllerTest.java index fbcf5859dbc..c36d03b77a7 100644 --- a/tests/robotests/src/com/android/settings/connecteddevice/AvailableMediaDeviceGroupControllerTest.java +++ b/tests/robotests/src/com/android/settings/connecteddevice/AvailableMediaDeviceGroupControllerTest.java @@ -19,6 +19,7 @@ import static com.android.settings.core.BasePreferenceController.AVAILABLE; import static com.android.settings.core.BasePreferenceController.DISABLED_UNSUPPORTED; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; @@ -27,14 +28,21 @@ import static org.mockito.Mockito.when; import android.content.Context; import android.content.pm.PackageManager; +import android.media.AudioManager; import androidx.preference.Preference; import androidx.preference.PreferenceGroup; import androidx.preference.PreferenceManager; import androidx.preference.PreferenceScreen; +import com.android.settings.R; import com.android.settings.bluetooth.AvailableMediaBluetoothDeviceUpdater; import com.android.settings.dashboard.DashboardFragment; import com.android.settings.testutils.SettingsRobolectricTestRunner; +import com.android.settings.testutils.shadow.ShadowAudioManager; +import com.android.settings.testutils.shadow.ShadowBluetoothUtils; +import com.android.settingslib.bluetooth.BluetoothCallback; +import com.android.settingslib.bluetooth.BluetoothEventManager; +import com.android.settingslib.bluetooth.LocalBluetoothManager; import org.junit.Before; import org.junit.Test; @@ -43,8 +51,13 @@ import org.mockito.Answers; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RuntimeEnvironment; +import org.robolectric.annotation.Config; @RunWith(SettingsRobolectricTestRunner.class) +@Config(shadows = { + ShadowAudioManager.class, + ShadowBluetoothUtils.class} +) public class AvailableMediaDeviceGroupControllerTest { private static final String PREFERENCE_KEY_1 = "pref_key_1"; @@ -59,11 +72,17 @@ public class AvailableMediaDeviceGroupControllerTest { private PreferenceManager mPreferenceManager; @Mock private PackageManager mPackageManager; + @Mock + private BluetoothEventManager mEventManager; + @Mock + private LocalBluetoothManager mLocalManager; private PreferenceGroup mPreferenceGroup; private Context mContext; private Preference mPreference; private AvailableMediaDeviceGroupController mAvailableMediaDeviceGroupController; + private LocalBluetoothManager mLocalBluetoothManager; + private ShadowAudioManager mShadowAudioManager; @Before public void setUp() { @@ -78,6 +97,11 @@ public class AvailableMediaDeviceGroupControllerTest { doReturn(mPackageManager).when(mContext).getPackageManager(); doReturn(true).when(mPackageManager).hasSystemFeature(PackageManager.FEATURE_BLUETOOTH); + ShadowBluetoothUtils.sLocalBluetoothManager = mLocalManager; + mLocalBluetoothManager = ShadowBluetoothUtils.getLocalBtManager(mContext); + mShadowAudioManager = ShadowAudioManager.getShadow(); + doReturn(mEventManager).when(mLocalBluetoothManager).getEventManager(); + mAvailableMediaDeviceGroupController = new AvailableMediaDeviceGroupController(mContext); mAvailableMediaDeviceGroupController. setBluetoothDeviceUpdater(mAvailableMediaBluetoothDeviceUpdater); @@ -127,6 +151,8 @@ public class AvailableMediaDeviceGroupControllerTest { // register the callback in onStart() mAvailableMediaDeviceGroupController.onStart(); verify(mAvailableMediaBluetoothDeviceUpdater).registerCallback(); + verify(mLocalBluetoothManager.getEventManager()).registerCallback( + any(BluetoothCallback.class)); } @Test @@ -134,6 +160,8 @@ public class AvailableMediaDeviceGroupControllerTest { // unregister the callback in onStop() mAvailableMediaDeviceGroupController.onStop(); verify(mAvailableMediaBluetoothDeviceUpdater).unregisterCallback(); + verify(mLocalBluetoothManager.getEventManager()).unregisterCallback( + any(BluetoothCallback.class)); } @Test @@ -151,4 +179,22 @@ public class AvailableMediaDeviceGroupControllerTest { assertThat(mAvailableMediaDeviceGroupController.getAvailabilityStatus()).isEqualTo( AVAILABLE); } + + @Test + public void setTitle_inCallState_showCallStateTitle() { + mShadowAudioManager.setMode(AudioManager.MODE_IN_CALL); + mAvailableMediaDeviceGroupController.onAudioModeChanged(); + + assertThat(mPreferenceGroup.getTitle()).isEqualTo( + mContext.getText(R.string.connected_device_available_call_title)); + } + + @Test + public void setTitle_notInCallState_showMediaStateTitle() { + mShadowAudioManager.setMode(AudioManager.MODE_NORMAL); + mAvailableMediaDeviceGroupController.onAudioModeChanged(); + + assertThat(mPreferenceGroup.getTitle()).isEqualTo( + mContext.getText(R.string.connected_device_available_media_title)); + } }