Add flag for remote streams

Test: manual, with remote stream active
Bug: 191356254
Change-Id: I59947b8d04ba717eac0e5a501965de97d200cc9c
This commit is contained in:
Julia Reynolds
2021-06-17 13:56:23 -04:00
parent 3d44d6ed95
commit 93ac0dad60
3 changed files with 79 additions and 58 deletions

View File

@@ -1890,6 +1890,9 @@
STREAM_MUSIC as if it's on TV platform. -->
<bool name="config_single_volume">false</bool>
<!-- Flag indicating whether the volume panel should show remote sessions. -->
<bool name="config_volumeShowRemoteSessions">true</bool>
<!-- Flag indicating that an outbound call must have a call capable phone account
that has declared it can process the call's handle. -->
<bool name="config_requireCallCapableAccountForHandle">false</bool>

View File

@@ -4400,4 +4400,6 @@
<java-symbol type="bool" name="config_assistTouchGestureEnabledDefault" />
<java-symbol type="dimen" name="config_wallpaperDimAmount" />
<java-symbol type="bool" name="config_volumeShowRemoteSessions" />
</resources>

View File

@@ -128,7 +128,7 @@ public class VolumeDialogControllerImpl implements VolumeDialogController, Dumpa
private final MediaSessions mMediaSessions;
protected C mCallbacks = new C();
private final State mState = new State();
protected final MediaSessionsCallbacks mMediaSessionsCallbacksW = new MediaSessionsCallbacks();
protected final MediaSessionsCallbacks mMediaSessionsCallbacksW;
private final Optional<Vibrator> mVibrator;
private final boolean mHasVibrator;
private boolean mShowA11yStream;
@@ -179,6 +179,7 @@ public class VolumeDialogControllerImpl implements VolumeDialogController, Dumpa
mWorkerLooper = theadFactory.buildLooperOnNewThread(
VolumeDialogControllerImpl.class.getSimpleName());
mWorker = new W(mWorkerLooper);
mMediaSessionsCallbacksW = new MediaSessionsCallbacks(mContext);
mMediaSessions = createMediaSessions(mContext, mWorkerLooper, mMediaSessionsCallbacksW);
mAudio = audioManager;
mNoMan = notificationManager;
@@ -1148,83 +1149,98 @@ public class VolumeDialogControllerImpl implements VolumeDialogController, Dumpa
private final HashMap<Token, Integer> mRemoteStreams = new HashMap<>();
private int mNextStream = DYNAMIC_STREAM_START_INDEX;
private final boolean mShowRemoteSessions;
public MediaSessionsCallbacks(Context context) {
mShowRemoteSessions = context.getResources().getBoolean(
com.android.internal.R.bool.config_volumeShowRemoteSessions);
}
@Override
public void onRemoteUpdate(Token token, String name, PlaybackInfo pi) {
addStream(token, "onRemoteUpdate");
if (mShowRemoteSessions) {
addStream(token, "onRemoteUpdate");
int stream = 0;
synchronized (mRemoteStreams) {
stream = mRemoteStreams.get(token);
}
Slog.d(TAG, "onRemoteUpdate: stream: " + stream + " volume: " + pi.getCurrentVolume());
boolean changed = mState.states.indexOfKey(stream) < 0;
final StreamState ss = streamStateW(stream);
ss.dynamic = true;
ss.levelMin = 0;
ss.levelMax = pi.getMaxVolume();
if (ss.level != pi.getCurrentVolume()) {
ss.level = pi.getCurrentVolume();
changed = true;
}
if (!Objects.equals(ss.remoteLabel, name)) {
ss.name = -1;
ss.remoteLabel = name;
changed = true;
}
if (changed) {
Log.d(TAG, "onRemoteUpdate: " + name + ": " + ss.level + " of " + ss.levelMax);
mCallbacks.onStateChanged(mState);
int stream = 0;
synchronized (mRemoteStreams) {
stream = mRemoteStreams.get(token);
}
Slog.d(TAG,
"onRemoteUpdate: stream: " + stream + " volume: " + pi.getCurrentVolume());
boolean changed = mState.states.indexOfKey(stream) < 0;
final StreamState ss = streamStateW(stream);
ss.dynamic = true;
ss.levelMin = 0;
ss.levelMax = pi.getMaxVolume();
if (ss.level != pi.getCurrentVolume()) {
ss.level = pi.getCurrentVolume();
changed = true;
}
if (!Objects.equals(ss.remoteLabel, name)) {
ss.name = -1;
ss.remoteLabel = name;
changed = true;
}
if (changed) {
Log.d(TAG, "onRemoteUpdate: " + name + ": " + ss.level + " of " + ss.levelMax);
mCallbacks.onStateChanged(mState);
}
}
}
@Override
public void onRemoteVolumeChanged(Token token, int flags) {
addStream(token, "onRemoteVolumeChanged");
int stream = 0;
synchronized (mRemoteStreams) {
stream = mRemoteStreams.get(token);
}
final boolean showUI = shouldShowUI(flags);
Slog.d(TAG, "onRemoteVolumeChanged: stream: " + stream + " showui? " + showUI);
boolean changed = updateActiveStreamW(stream);
if (showUI) {
changed |= checkRoutedToBluetoothW(AudioManager.STREAM_MUSIC);
}
if (changed) {
Slog.d(TAG, "onRemoteChanged: updatingState");
mCallbacks.onStateChanged(mState);
}
if (showUI) {
mCallbacks.onShowRequested(Events.SHOW_REASON_REMOTE_VOLUME_CHANGED);
if (mShowRemoteSessions) {
addStream(token, "onRemoteVolumeChanged");
int stream = 0;
synchronized (mRemoteStreams) {
stream = mRemoteStreams.get(token);
}
final boolean showUI = shouldShowUI(flags);
Slog.d(TAG, "onRemoteVolumeChanged: stream: " + stream + " showui? " + showUI);
boolean changed = updateActiveStreamW(stream);
if (showUI) {
changed |= checkRoutedToBluetoothW(AudioManager.STREAM_MUSIC);
}
if (changed) {
Slog.d(TAG, "onRemoteChanged: updatingState");
mCallbacks.onStateChanged(mState);
}
if (showUI) {
mCallbacks.onShowRequested(Events.SHOW_REASON_REMOTE_VOLUME_CHANGED);
}
}
}
@Override
public void onRemoteRemoved(Token token) {
int stream = 0;
synchronized (mRemoteStreams) {
if (!mRemoteStreams.containsKey(token)) {
Log.d(TAG, "onRemoteRemoved: stream doesn't exist, "
+ "aborting remote removed for token:" + token.toString());
return;
if (mShowRemoteSessions) {
int stream = 0;
synchronized (mRemoteStreams) {
if (!mRemoteStreams.containsKey(token)) {
Log.d(TAG, "onRemoteRemoved: stream doesn't exist, "
+ "aborting remote removed for token:" + token.toString());
return;
}
stream = mRemoteStreams.get(token);
}
stream = mRemoteStreams.get(token);
mState.states.remove(stream);
if (mState.activeStream == stream) {
updateActiveStreamW(-1);
}
mCallbacks.onStateChanged(mState);
}
mState.states.remove(stream);
if (mState.activeStream == stream) {
updateActiveStreamW(-1);
}
mCallbacks.onStateChanged(mState);
}
public void setStreamVolume(int stream, int level) {
final Token t = findToken(stream);
if (t == null) {
Log.w(TAG, "setStreamVolume: No token found for stream: " + stream);
return;
if (mShowRemoteSessions) {
final Token t = findToken(stream);
if (t == null) {
Log.w(TAG, "setStreamVolume: No token found for stream: " + stream);
return;
}
mMediaSessions.setVolume(t, level);
}
mMediaSessions.setVolume(t, level);
}
private Token findToken(int stream) {