Merge "Add flag for remote streams" into sc-dev

This commit is contained in:
Julia Reynolds
2021-06-24 16:44:34 +00:00
committed by Android (Google) Code Review
3 changed files with 79 additions and 58 deletions

View File

@@ -1894,6 +1894,9 @@
STREAM_MUSIC as if it's on TV platform. --> STREAM_MUSIC as if it's on TV platform. -->
<bool name="config_single_volume">false</bool> <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 <!-- Flag indicating that an outbound call must have a call capable phone account
that has declared it can process the call's handle. --> that has declared it can process the call's handle. -->
<bool name="config_requireCallCapableAccountForHandle">false</bool> <bool name="config_requireCallCapableAccountForHandle">false</bool>

View File

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

View File

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