Merge "Modify rule of remote media session UI" into rvc-dev am: 1424b594c9

Change-Id: I74eedc4056be20f794ad37962cc3ad2f7a1351fc
This commit is contained in:
tim peng
2020-05-04 09:02:38 +00:00
committed by Automerger Merge Worker
6 changed files with 137 additions and 123 deletions

View File

@@ -25,6 +25,7 @@ import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.media.AudioManager;
import android.media.RoutingSessionInfo;
import android.net.Uri;
import android.os.UserHandle;
import android.os.UserManager;
@@ -173,6 +174,10 @@ public class MediaDeviceUpdateWorker extends SliceBackgroundWorker
return mLocalMediaManager.getSelectedMediaDevice();
}
void adjustSessionVolume(String sessionId, int volume) {
mLocalMediaManager.adjustSessionVolume(sessionId, volume);
}
void adjustSessionVolume(int volume) {
mLocalMediaManager.adjustSessionVolume(volume);
}
@@ -189,15 +194,14 @@ public class MediaDeviceUpdateWorker extends SliceBackgroundWorker
return mLocalMediaManager.getSessionName();
}
/**
* Find the active MediaDevice.
*
* @param type the media device type.
* @return MediaDevice list
*
*/
public List<MediaDevice> getActiveMediaDevice(@MediaDevice.MediaDeviceType int type) {
return mLocalMediaManager.getActiveMediaDevice(type);
List<RoutingSessionInfo> getActiveRemoteMediaDevice() {
final List<RoutingSessionInfo> sessionInfos = new ArrayList<>();
for (RoutingSessionInfo info : mLocalMediaManager.getActiveMediaSession()) {
if (!info.isSystemSession()) {
sessionInfos.add(info);
}
}
return sessionInfos;
}
/**

View File

@@ -24,6 +24,7 @@ import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.media.RoutingSessionInfo;
import android.net.Uri;
import android.text.TextUtils;
import android.util.Log;
@@ -41,7 +42,6 @@ import com.android.settings.slices.CustomSliceable;
import com.android.settings.slices.SliceBackgroundWorker;
import com.android.settings.slices.SliceBroadcastReceiver;
import com.android.settings.slices.SliceBuilderUtils;
import com.android.settingslib.media.MediaDevice;
import com.android.settingslib.media.MediaOutputSliceConstants;
import java.util.List;
@@ -67,7 +67,7 @@ public class RemoteMediaSlice implements CustomSliceable {
final int newPosition = intent.getIntExtra(EXTRA_RANGE_VALUE, -1);
final String id = intent.getStringExtra(MEDIA_ID);
if (!TextUtils.isEmpty(id)) {
getWorker().adjustVolume(getWorker().getMediaDeviceById(id), newPosition);
getWorker().adjustSessionVolume(id, newPosition);
}
}
@@ -80,9 +80,8 @@ public class RemoteMediaSlice implements CustomSliceable {
return listBuilder.build();
}
// Only displaying remote devices
final List<MediaDevice> mediaDevices = getWorker().getActiveMediaDevice(
MediaDevice.MediaDeviceType.TYPE_CAST_DEVICE);
if (mediaDevices.isEmpty()) {
final List<RoutingSessionInfo> infos = getWorker().getActiveRemoteMediaDevice();
if (infos.isEmpty()) {
Log.d(TAG, "No active remote media device");
return listBuilder.build();
}
@@ -93,27 +92,25 @@ public class RemoteMediaSlice implements CustomSliceable {
// To create an empty icon to indent the row
final IconCompat emptyIcon = createEmptyIcon();
int requestCode = 0;
for (MediaDevice mediaDevice : mediaDevices) {
final int maxVolume = mediaDevice.getMaxVolume();
for (RoutingSessionInfo info : infos) {
final int maxVolume = info.getVolumeMax();
if (maxVolume <= 0) {
Log.d(TAG, "Unable to add Slice. " + mediaDevice.getName() + ": max volume is "
Log.d(TAG, "Unable to add Slice. " + info.getName() + ": max volume is "
+ maxVolume);
continue;
}
final String title = castVolume + " (" + mediaDevice.getClientAppLabel() + ")";
listBuilder.addInputRange(new InputRangeBuilder()
.setTitleItem(icon, ListBuilder.ICON_IMAGE)
.setTitle(title)
.setInputAction(getSliderInputAction(requestCode++, mediaDevice.getId()))
.setPrimaryAction(getSoundSettingAction(title, icon, mediaDevice.getId()))
.setTitle(castVolume)
.setInputAction(getSliderInputAction(requestCode++, info.getId()))
.setPrimaryAction(getSoundSettingAction(castVolume, icon, info.getId()))
.setMax(maxVolume)
.setValue(mediaDevice.getCurrentVolume()));
.setValue(info.getVolume()));
listBuilder.addRow(new ListBuilder.RowBuilder()
.setTitle(outputTitle)
.setSubtitle(mediaDevice.getName())
.setSubtitle(info.getName())
.setTitleItem(emptyIcon, ListBuilder.ICON_IMAGE)
.setPrimaryAction(getMediaOutputSliceAction(
mediaDevice.getClientPackageName())));
.setPrimaryAction(getMediaOutputSliceAction(info.getClientPackageName())));
}
return listBuilder.build();
}
@@ -131,7 +128,8 @@ public class RemoteMediaSlice implements CustomSliceable {
return PendingIntent.getBroadcast(mContext, requestCode, intent, 0);
}
private SliceAction getSoundSettingAction(String actionTitle, IconCompat icon, String id) {
private SliceAction getSoundSettingAction(CharSequence actionTitle, IconCompat icon,
String id) {
final Uri contentUri = new Uri.Builder().appendPath(id).build();
final Intent intent = SliceBuilderUtils.buildSearchResultPageIntent(mContext,
SoundSettings.class.getName(),

View File

@@ -18,6 +18,8 @@ package com.android.settings.notification;
import android.content.Context;
import android.content.Intent;
import android.media.RoutingSessionInfo;
import android.text.TextUtils;
import android.util.Log;
import androidx.annotation.VisibleForTesting;
@@ -51,7 +53,7 @@ public class RemoteVolumeGroupController extends BasePreferenceController implem
static final String SWITCHER_PREFIX = "OUTPUT_SWITCHER";
private PreferenceCategory mPreferenceCategory;
private List<MediaDevice> mActiveRemoteMediaDevices = new ArrayList<>();
private List<RoutingSessionInfo> mRoutingSessionInfos = new ArrayList<>();
@VisibleForTesting
LocalMediaManager mLocalMediaManager;
@@ -67,7 +69,7 @@ public class RemoteVolumeGroupController extends BasePreferenceController implem
@Override
public int getAvailabilityStatus() {
if (mActiveRemoteMediaDevices.isEmpty()) {
if (mRoutingSessionInfos.isEmpty()) {
return CONDITIONALLY_UNAVAILABLE;
}
return AVAILABLE_UNSEARCHABLE;
@@ -77,12 +79,19 @@ public class RemoteVolumeGroupController extends BasePreferenceController implem
public void displayPreference(PreferenceScreen screen) {
super.displayPreference(screen);
mPreferenceCategory = screen.findPreference(getPreferenceKey());
mActiveRemoteMediaDevices.clear();
mActiveRemoteMediaDevices.addAll(mLocalMediaManager.getActiveMediaDevice(
MediaDevice.MediaDeviceType.TYPE_CAST_DEVICE));
initRemoteMediaSession();
refreshPreference();
}
private void initRemoteMediaSession() {
mRoutingSessionInfos.clear();
for (RoutingSessionInfo info : mLocalMediaManager.getActiveMediaSession()) {
if (!info.isSystemSession()) {
mRoutingSessionInfos.add(info);
}
}
}
/**
* onDestroy()
* {@link androidx.lifecycle.OnLifecycleEvent}
@@ -102,27 +111,27 @@ public class RemoteVolumeGroupController extends BasePreferenceController implem
final CharSequence outputTitle = mContext.getText(R.string.media_output_title);
final CharSequence castVolume = mContext.getText(R.string.remote_media_volume_option_title);
mPreferenceCategory.setVisible(true);
int i = 0;
for (MediaDevice device : mActiveRemoteMediaDevices) {
if (mPreferenceCategory.findPreference(device.getId()) != null) {
for (RoutingSessionInfo info : mRoutingSessionInfos) {
if (mPreferenceCategory.findPreference(info.getId()) != null) {
continue;
}
// Add slider
final RemoteVolumeSeekBarPreference seekBarPreference =
new RemoteVolumeSeekBarPreference(mContext);
seekBarPreference.setKey(device.getId());
seekBarPreference.setTitle(castVolume + " (" + device.getClientAppLabel() + ")");
seekBarPreference.setMax(device.getMaxVolume());
seekBarPreference.setProgress(device.getCurrentVolume());
seekBarPreference.setKey(info.getId());
seekBarPreference.setTitle(castVolume);
seekBarPreference.setMax(info.getVolumeMax());
seekBarPreference.setProgress(info.getVolume());
seekBarPreference.setMin(0);
seekBarPreference.setOnPreferenceChangeListener(this);
seekBarPreference.setIcon(R.drawable.ic_volume_remote);
mPreferenceCategory.addPreference(seekBarPreference);
// Add output indicator
final Preference preference = new Preference(mContext);
preference.setKey(SWITCHER_PREFIX + device.getId());
preference.setKey(SWITCHER_PREFIX + info.getId());
preference.setTitle(outputTitle);
preference.setSummary(device.getName());
preference.setSummary(info.getName());
mPreferenceCategory.addPreference(preference);
}
}
@@ -135,7 +144,7 @@ public class RemoteVolumeGroupController extends BasePreferenceController implem
return false;
}
ThreadUtils.postOnBackgroundThread(() -> {
device.requestSetVolume((int) newValue);
mLocalMediaManager.adjustSessionVolume(preference.getKey(), (int) newValue);
});
return true;
}
@@ -145,18 +154,19 @@ public class RemoteVolumeGroupController extends BasePreferenceController implem
if (!preference.getKey().startsWith(SWITCHER_PREFIX)) {
return false;
}
final String key = preference.getKey().substring(SWITCHER_PREFIX.length());
final MediaDevice device = mLocalMediaManager.getMediaDeviceById(key);
if (device == null) {
return false;
for (RoutingSessionInfo info : mRoutingSessionInfos) {
if (TextUtils.equals(info.getId(),
preference.getKey().substring(SWITCHER_PREFIX.length()))) {
final Intent intent = new Intent()
.setAction(MediaOutputSliceConstants.ACTION_MEDIA_OUTPUT)
.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
.putExtra(MediaOutputSliceConstants.EXTRA_PACKAGE_NAME,
info.getClientPackageName());
mContext.startActivity(intent);
return true;
}
}
final Intent intent = new Intent()
.setAction(MediaOutputSliceConstants.ACTION_MEDIA_OUTPUT)
.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
.putExtra(MediaOutputSliceConstants.EXTRA_PACKAGE_NAME,
device.getClientPackageName());
mContext.startActivity(intent);
return true;
return false;
}
@Override
@@ -170,9 +180,7 @@ public class RemoteVolumeGroupController extends BasePreferenceController implem
// Preference group is not ready.
return;
}
mActiveRemoteMediaDevices.clear();
mActiveRemoteMediaDevices.addAll(mLocalMediaManager.getActiveMediaDevice(
MediaDevice.MediaDeviceType.TYPE_CAST_DEVICE));
initRemoteMediaSession();
refreshPreference();
}