Loading src/com/android/settings/media/MediaOutputIndicatorSlice.java +2 −2 Original line number Diff line number Diff line Loading @@ -129,9 +129,9 @@ public class MediaOutputIndicatorSlice implements CustomSliceable { // Return true if // 1. AudioMode is not in on-going call // 2. worker is not null // 3. Available devices are more than 1 // 3. Available devices are more than 0 return getWorker() != null && !com.android.settingslib.Utils.isAudioModeOngoingCall(mContext) && getWorker().getMediaDevices().size() > 1; && getWorker().getMediaDevices().size() > 0; } } src/com/android/settings/media/MediaOutputSlice.java +46 −13 Original line number Diff line number Diff line Loading @@ -22,8 +22,11 @@ import static android.text.Spanned.SPAN_EXCLUSIVE_EXCLUSIVE; import static com.android.settings.slices.CustomSliceRegistry.MEDIA_OUTPUT_SLICE_URI; import android.app.PendingIntent; import android.app.settings.SettingsEnums; import android.content.Context; import android.content.Intent; import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; import android.graphics.drawable.Drawable; import android.net.Uri; import android.text.SpannableString; Loading @@ -39,6 +42,8 @@ import androidx.slice.builders.SliceAction; import com.android.settings.R; import com.android.settings.Utils; import com.android.settings.bluetooth.BluetoothPairingDetail; import com.android.settings.core.SubSettingLauncher; import com.android.settings.slices.CustomSliceable; import com.android.settings.slices.SliceBackgroundWorker; import com.android.settings.slices.SliceBroadcastReceiver; Loading Loading @@ -81,7 +86,6 @@ public class MediaOutputSlice implements CustomSliceable { final ListBuilder listBuilder = new ListBuilder(mContext, getUri(), ListBuilder.INFINITY) .setAccentColor(COLOR_NOT_TINTED); if (!isVisible()) { Log.d(TAG, "getSlice() is not visible"); return listBuilder.build(); Loading @@ -99,6 +103,11 @@ public class MediaOutputSlice implements CustomSliceable { } } else { final MediaDevice connectedDevice = worker.getCurrentConnectedMediaDevice(); if (devices.size() == 1) { // Zero state addRow(connectedDevice, connectedDevice, listBuilder); listBuilder.addRow(getPairNewRow()); } else { final boolean isTouched = worker.getIsTouched(); // Fix the last top device when user press device to transfer. final MediaDevice topDevice = isTouched ? worker.getTopDevice() : connectedDevice; Loading @@ -114,9 +123,33 @@ public class MediaOutputSlice implements CustomSliceable { } } } } return listBuilder.build(); } private ListBuilder.RowBuilder getPairNewRow() { final Drawable d = mContext.getDrawable(R.drawable.ic_add_24dp); d.setColorFilter(new PorterDuffColorFilter(Utils.getColorAccentDefaultColor(mContext), PorterDuff.Mode.SRC_IN)); final IconCompat icon = Utils.createIconWithDrawable(d); final String title = mContext.getString(R.string.bluetooth_pairing_pref_title); final Intent intent = new SubSettingLauncher(mContext) .setDestination(BluetoothPairingDetail.class.getName()) .setTitleRes(R.string.bluetooth_pairing_page_title) .setSourceMetricsCategory(SettingsEnums.PANEL_MEDIA_OUTPUT) .toIntent(); final SliceAction primarySliceAction = SliceAction.createDeeplink( PendingIntent.getActivity(mContext, 0 /* requestCode */, intent, 0 /* flags */), IconCompat.createWithResource(mContext, R.drawable.ic_add_24dp/*ic_add_blue_24dp*/), ListBuilder.ICON_IMAGE, mContext.getText(R.string.bluetooth_pairing_pref_title)); final ListBuilder.RowBuilder builder = new ListBuilder.RowBuilder() .setTitleItem(icon, ListBuilder.ICON_IMAGE) .setTitle(title) .setPrimaryAction(primarySliceAction); return builder; } private ListBuilder.InputRangeBuilder getGroupRow() { final IconCompat icon = IconCompat.createWithResource(mContext, R.drawable.ic_speaker_group_black_24dp); Loading Loading @@ -321,10 +354,10 @@ public class MediaOutputSlice implements CustomSliceable { // Return true if // 1. AudioMode is not in on-going call // 2. worker is not null // 3. Available devices are more than 1 // 3. Available devices are more than 0 return getWorker() != null && !com.android.settingslib.Utils.isAudioModeOngoingCall(mContext) && getWorker().getMediaDevices().size() > 1; && getWorker().getMediaDevices().size() > 0; } } src/com/android/settings/sound/MediaOutputPreferenceController.java +10 −3 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import android.media.AudioManager; import android.text.TextUtils; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; import com.android.settings.R; import com.android.settingslib.Utils; Loading @@ -46,6 +47,15 @@ public class MediaOutputPreferenceController extends AudioSwitchPreferenceContro super(context, key); } @Override public void displayPreference(PreferenceScreen screen) { super.displayPreference(screen); if (!Utils.isAudioModeOngoingCall(mContext)) { mPreference.setVisible(true); } } @Override public void updateState(Preference preference) { if (preference == null) { Loading @@ -61,7 +71,6 @@ public class MediaOutputPreferenceController extends AudioSwitchPreferenceContro return; } boolean deviceConnected = false; BluetoothDevice activeDevice = null; // Show preference if there is connected or previously connected device // Find active device and set its name as the preference's summary Loading @@ -70,10 +79,8 @@ public class MediaOutputPreferenceController extends AudioSwitchPreferenceContro if (mAudioManager.getMode() == AudioManager.MODE_NORMAL && ((connectedA2dpDevices != null && !connectedA2dpDevices.isEmpty()) || (connectedHADevices != null && !connectedHADevices.isEmpty()))) { deviceConnected = true; activeDevice = findActiveDevice(); } mPreference.setVisible(deviceConnected); mPreference.setSummary((activeDevice == null) ? mContext.getText(R.string.media_output_default_summary) : activeDevice.getAlias()); Loading tests/robotests/src/com/android/settings/media/MediaOutputIndicatorSliceTest.java +0 −1 Original line number Diff line number Diff line Loading @@ -123,7 +123,6 @@ public class MediaOutputIndicatorSliceTest { @Test public void getSlice_withConnectedDevice_verifyMetadata() { mDevices.add(mDevice1); mDevices.add(mDevice2); when(sMediaOutputIndicatorWorker.getMediaDevices()).thenReturn(mDevices); doReturn(mDevice1).when(sMediaOutputIndicatorWorker).getCurrentConnectedMediaDevice(); mAudioManager.setMode(AudioManager.MODE_NORMAL); Loading tests/robotests/src/com/android/settings/media/MediaOutputSliceTest.java +63 −0 Original line number Diff line number Diff line Loading @@ -410,6 +410,69 @@ public class MediaOutputSliceTest { R.string.media_output_switch_error_text))).isNotEqualTo(-1); } @Test public void getSlice_zeroState_containPairingText() { final List<MediaDevice> mSelectedDevices = new ArrayList<>(); final List<MediaDevice> mSelectableDevices = new ArrayList<>(); mDevices.clear(); final MediaDevice device = mock(MediaDevice.class); when(device.getName()).thenReturn(TEST_DEVICE_1_NAME); when(device.getIcon()).thenReturn(mTestDrawable); when(device.getMaxVolume()).thenReturn(100); when(device.isConnected()).thenReturn(true); when(device.getDeviceType()).thenReturn(MediaDevice.MediaDeviceType.TYPE_PHONE_DEVICE); when(device.getId()).thenReturn(TEST_DEVICE_1_ID); mSelectedDevices.add(device); when(mLocalMediaManager.getCurrentConnectedDevice()).thenReturn(device); mDevices.add(device); when(mLocalMediaManager.getSelectedMediaDevice()).thenReturn(mSelectedDevices); when(mLocalMediaManager.getSelectableMediaDevice()).thenReturn(mSelectableDevices); mMediaDeviceUpdateWorker.onDeviceListUpdate(mDevices); final Slice mediaSlice = mMediaOutputSlice.getSlice(); String sliceInfo = SliceQuery.findAll(mediaSlice, FORMAT_SLICE, HINT_LIST_ITEM, null).toString(); assertThat(TextUtils.indexOf(sliceInfo, mContext.getText( R.string.bluetooth_pairing_pref_title))).isNotEqualTo(-1); } @Test public void getSlice_twoConnectedDevices_notContainPairingText() { final List<MediaDevice> mSelectedDevices = new ArrayList<>(); final List<MediaDevice> mSelectableDevices = new ArrayList<>(); mDevices.clear(); final MediaDevice device = mock(MediaDevice.class); when(device.getName()).thenReturn(TEST_DEVICE_1_NAME); when(device.getIcon()).thenReturn(mTestDrawable); when(device.getMaxVolume()).thenReturn(100); when(device.isConnected()).thenReturn(true); when(device.getDeviceType()).thenReturn(MediaDevice.MediaDeviceType.TYPE_CAST_DEVICE); when(device.getId()).thenReturn(TEST_DEVICE_1_ID); final MediaDevice device2 = mock(MediaDevice.class); when(device2.getName()).thenReturn(TEST_DEVICE_2_NAME); when(device2.getIcon()).thenReturn(mTestDrawable); when(device2.getMaxVolume()).thenReturn(100); when(device2.isConnected()).thenReturn(true); when(device2.getDeviceType()).thenReturn(MediaDevice.MediaDeviceType.TYPE_CAST_DEVICE); when(device2.getId()).thenReturn(TEST_DEVICE_2_ID); mSelectedDevices.add(device); mSelectableDevices.add(device2); when(mLocalMediaManager.getCurrentConnectedDevice()).thenReturn(device); mDevices.add(device); mDevices.add(device2); when(mLocalMediaManager.getSelectedMediaDevice()).thenReturn(mSelectedDevices); when(mLocalMediaManager.getSelectableMediaDevice()).thenReturn(mSelectableDevices); mMediaDeviceUpdateWorker.onDeviceListUpdate(mDevices); final Slice mediaSlice = mMediaOutputSlice.getSlice(); String sliceInfo = SliceQuery.findAll(mediaSlice, FORMAT_SLICE, HINT_LIST_ITEM, null).toString(); assertThat(TextUtils.indexOf(sliceInfo, mContext.getText( R.string.bluetooth_pairing_pref_title))).isEqualTo(-1); } @Test public void onNotifyChange_foundMediaDevice_connect() { mDevices.clear(); Loading Loading
src/com/android/settings/media/MediaOutputIndicatorSlice.java +2 −2 Original line number Diff line number Diff line Loading @@ -129,9 +129,9 @@ public class MediaOutputIndicatorSlice implements CustomSliceable { // Return true if // 1. AudioMode is not in on-going call // 2. worker is not null // 3. Available devices are more than 1 // 3. Available devices are more than 0 return getWorker() != null && !com.android.settingslib.Utils.isAudioModeOngoingCall(mContext) && getWorker().getMediaDevices().size() > 1; && getWorker().getMediaDevices().size() > 0; } }
src/com/android/settings/media/MediaOutputSlice.java +46 −13 Original line number Diff line number Diff line Loading @@ -22,8 +22,11 @@ import static android.text.Spanned.SPAN_EXCLUSIVE_EXCLUSIVE; import static com.android.settings.slices.CustomSliceRegistry.MEDIA_OUTPUT_SLICE_URI; import android.app.PendingIntent; import android.app.settings.SettingsEnums; import android.content.Context; import android.content.Intent; import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; import android.graphics.drawable.Drawable; import android.net.Uri; import android.text.SpannableString; Loading @@ -39,6 +42,8 @@ import androidx.slice.builders.SliceAction; import com.android.settings.R; import com.android.settings.Utils; import com.android.settings.bluetooth.BluetoothPairingDetail; import com.android.settings.core.SubSettingLauncher; import com.android.settings.slices.CustomSliceable; import com.android.settings.slices.SliceBackgroundWorker; import com.android.settings.slices.SliceBroadcastReceiver; Loading Loading @@ -81,7 +86,6 @@ public class MediaOutputSlice implements CustomSliceable { final ListBuilder listBuilder = new ListBuilder(mContext, getUri(), ListBuilder.INFINITY) .setAccentColor(COLOR_NOT_TINTED); if (!isVisible()) { Log.d(TAG, "getSlice() is not visible"); return listBuilder.build(); Loading @@ -99,6 +103,11 @@ public class MediaOutputSlice implements CustomSliceable { } } else { final MediaDevice connectedDevice = worker.getCurrentConnectedMediaDevice(); if (devices.size() == 1) { // Zero state addRow(connectedDevice, connectedDevice, listBuilder); listBuilder.addRow(getPairNewRow()); } else { final boolean isTouched = worker.getIsTouched(); // Fix the last top device when user press device to transfer. final MediaDevice topDevice = isTouched ? worker.getTopDevice() : connectedDevice; Loading @@ -114,9 +123,33 @@ public class MediaOutputSlice implements CustomSliceable { } } } } return listBuilder.build(); } private ListBuilder.RowBuilder getPairNewRow() { final Drawable d = mContext.getDrawable(R.drawable.ic_add_24dp); d.setColorFilter(new PorterDuffColorFilter(Utils.getColorAccentDefaultColor(mContext), PorterDuff.Mode.SRC_IN)); final IconCompat icon = Utils.createIconWithDrawable(d); final String title = mContext.getString(R.string.bluetooth_pairing_pref_title); final Intent intent = new SubSettingLauncher(mContext) .setDestination(BluetoothPairingDetail.class.getName()) .setTitleRes(R.string.bluetooth_pairing_page_title) .setSourceMetricsCategory(SettingsEnums.PANEL_MEDIA_OUTPUT) .toIntent(); final SliceAction primarySliceAction = SliceAction.createDeeplink( PendingIntent.getActivity(mContext, 0 /* requestCode */, intent, 0 /* flags */), IconCompat.createWithResource(mContext, R.drawable.ic_add_24dp/*ic_add_blue_24dp*/), ListBuilder.ICON_IMAGE, mContext.getText(R.string.bluetooth_pairing_pref_title)); final ListBuilder.RowBuilder builder = new ListBuilder.RowBuilder() .setTitleItem(icon, ListBuilder.ICON_IMAGE) .setTitle(title) .setPrimaryAction(primarySliceAction); return builder; } private ListBuilder.InputRangeBuilder getGroupRow() { final IconCompat icon = IconCompat.createWithResource(mContext, R.drawable.ic_speaker_group_black_24dp); Loading Loading @@ -321,10 +354,10 @@ public class MediaOutputSlice implements CustomSliceable { // Return true if // 1. AudioMode is not in on-going call // 2. worker is not null // 3. Available devices are more than 1 // 3. Available devices are more than 0 return getWorker() != null && !com.android.settingslib.Utils.isAudioModeOngoingCall(mContext) && getWorker().getMediaDevices().size() > 1; && getWorker().getMediaDevices().size() > 0; } }
src/com/android/settings/sound/MediaOutputPreferenceController.java +10 −3 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import android.media.AudioManager; import android.text.TextUtils; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; import com.android.settings.R; import com.android.settingslib.Utils; Loading @@ -46,6 +47,15 @@ public class MediaOutputPreferenceController extends AudioSwitchPreferenceContro super(context, key); } @Override public void displayPreference(PreferenceScreen screen) { super.displayPreference(screen); if (!Utils.isAudioModeOngoingCall(mContext)) { mPreference.setVisible(true); } } @Override public void updateState(Preference preference) { if (preference == null) { Loading @@ -61,7 +71,6 @@ public class MediaOutputPreferenceController extends AudioSwitchPreferenceContro return; } boolean deviceConnected = false; BluetoothDevice activeDevice = null; // Show preference if there is connected or previously connected device // Find active device and set its name as the preference's summary Loading @@ -70,10 +79,8 @@ public class MediaOutputPreferenceController extends AudioSwitchPreferenceContro if (mAudioManager.getMode() == AudioManager.MODE_NORMAL && ((connectedA2dpDevices != null && !connectedA2dpDevices.isEmpty()) || (connectedHADevices != null && !connectedHADevices.isEmpty()))) { deviceConnected = true; activeDevice = findActiveDevice(); } mPreference.setVisible(deviceConnected); mPreference.setSummary((activeDevice == null) ? mContext.getText(R.string.media_output_default_summary) : activeDevice.getAlias()); Loading
tests/robotests/src/com/android/settings/media/MediaOutputIndicatorSliceTest.java +0 −1 Original line number Diff line number Diff line Loading @@ -123,7 +123,6 @@ public class MediaOutputIndicatorSliceTest { @Test public void getSlice_withConnectedDevice_verifyMetadata() { mDevices.add(mDevice1); mDevices.add(mDevice2); when(sMediaOutputIndicatorWorker.getMediaDevices()).thenReturn(mDevices); doReturn(mDevice1).when(sMediaOutputIndicatorWorker).getCurrentConnectedMediaDevice(); mAudioManager.setMode(AudioManager.MODE_NORMAL); Loading
tests/robotests/src/com/android/settings/media/MediaOutputSliceTest.java +63 −0 Original line number Diff line number Diff line Loading @@ -410,6 +410,69 @@ public class MediaOutputSliceTest { R.string.media_output_switch_error_text))).isNotEqualTo(-1); } @Test public void getSlice_zeroState_containPairingText() { final List<MediaDevice> mSelectedDevices = new ArrayList<>(); final List<MediaDevice> mSelectableDevices = new ArrayList<>(); mDevices.clear(); final MediaDevice device = mock(MediaDevice.class); when(device.getName()).thenReturn(TEST_DEVICE_1_NAME); when(device.getIcon()).thenReturn(mTestDrawable); when(device.getMaxVolume()).thenReturn(100); when(device.isConnected()).thenReturn(true); when(device.getDeviceType()).thenReturn(MediaDevice.MediaDeviceType.TYPE_PHONE_DEVICE); when(device.getId()).thenReturn(TEST_DEVICE_1_ID); mSelectedDevices.add(device); when(mLocalMediaManager.getCurrentConnectedDevice()).thenReturn(device); mDevices.add(device); when(mLocalMediaManager.getSelectedMediaDevice()).thenReturn(mSelectedDevices); when(mLocalMediaManager.getSelectableMediaDevice()).thenReturn(mSelectableDevices); mMediaDeviceUpdateWorker.onDeviceListUpdate(mDevices); final Slice mediaSlice = mMediaOutputSlice.getSlice(); String sliceInfo = SliceQuery.findAll(mediaSlice, FORMAT_SLICE, HINT_LIST_ITEM, null).toString(); assertThat(TextUtils.indexOf(sliceInfo, mContext.getText( R.string.bluetooth_pairing_pref_title))).isNotEqualTo(-1); } @Test public void getSlice_twoConnectedDevices_notContainPairingText() { final List<MediaDevice> mSelectedDevices = new ArrayList<>(); final List<MediaDevice> mSelectableDevices = new ArrayList<>(); mDevices.clear(); final MediaDevice device = mock(MediaDevice.class); when(device.getName()).thenReturn(TEST_DEVICE_1_NAME); when(device.getIcon()).thenReturn(mTestDrawable); when(device.getMaxVolume()).thenReturn(100); when(device.isConnected()).thenReturn(true); when(device.getDeviceType()).thenReturn(MediaDevice.MediaDeviceType.TYPE_CAST_DEVICE); when(device.getId()).thenReturn(TEST_DEVICE_1_ID); final MediaDevice device2 = mock(MediaDevice.class); when(device2.getName()).thenReturn(TEST_DEVICE_2_NAME); when(device2.getIcon()).thenReturn(mTestDrawable); when(device2.getMaxVolume()).thenReturn(100); when(device2.isConnected()).thenReturn(true); when(device2.getDeviceType()).thenReturn(MediaDevice.MediaDeviceType.TYPE_CAST_DEVICE); when(device2.getId()).thenReturn(TEST_DEVICE_2_ID); mSelectedDevices.add(device); mSelectableDevices.add(device2); when(mLocalMediaManager.getCurrentConnectedDevice()).thenReturn(device); mDevices.add(device); mDevices.add(device2); when(mLocalMediaManager.getSelectedMediaDevice()).thenReturn(mSelectedDevices); when(mLocalMediaManager.getSelectableMediaDevice()).thenReturn(mSelectableDevices); mMediaDeviceUpdateWorker.onDeviceListUpdate(mDevices); final Slice mediaSlice = mMediaOutputSlice.getSlice(); String sliceInfo = SliceQuery.findAll(mediaSlice, FORMAT_SLICE, HINT_LIST_ITEM, null).toString(); assertThat(TextUtils.indexOf(sliceInfo, mContext.getText( R.string.bluetooth_pairing_pref_title))).isEqualTo(-1); } @Test public void onNotifyChange_foundMediaDevice_connect() { mDevices.clear(); Loading