Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ca931643 authored by Oliver Woodman's avatar Oliver Woodman Committed by Automerger Merge Worker
Browse files

Tweak volume adjustment rules am: aa9dc925 am: e49fa1c0

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/16214371

Change-Id: Idf45273d3b7308bea1a0222693128333e73a6874
parents 249b619b e49fa1c0
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -1956,8 +1956,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 whether platform level volume adjustments are enabled for remote sessions
         on grouped devices. -->
    <bool name="config_volumeAdjustmentForRemoteGroupSessions">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. -->
+1 −1
Original line number Diff line number Diff line
@@ -4557,7 +4557,7 @@

  <java-symbol type="dimen" name="config_wallpaperDimAmount" />

  <java-symbol type="bool" name="config_volumeShowRemoteSessions" />
  <java-symbol type="bool" name="config_volumeAdjustmentForRemoteGroupSessions" />

  <!-- List of shared library packages that should be loaded by the classloader after the
       code and resources provided by applications. -->
+46 −12
Original line number Diff line number Diff line
@@ -33,7 +33,11 @@ import android.media.AudioManager;
import android.media.AudioSystem;
import android.media.IAudioService;
import android.media.IVolumeController;
import android.media.MediaRoute2Info;
import android.media.MediaRouter2Manager;
import android.media.RoutingSessionInfo;
import android.media.VolumePolicy;
import android.media.session.MediaController;
import android.media.session.MediaController.PlaybackInfo;
import android.media.session.MediaSession.Token;
import android.net.Uri;
@@ -71,6 +75,7 @@ import com.android.systemui.util.concurrency.ThreadFactory;
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
@@ -118,6 +123,7 @@ public class VolumeDialogControllerImpl implements VolumeDialogController, Dumpa
    private final Context mContext;
    private final Looper mWorkerLooper;
    private final PackageManager mPackageManager;
    private final MediaRouter2Manager mRouter2Manager;
    private final WakefulnessLifecycle mWakefulnessLifecycle;
    private AudioManager mAudio;
    private IAudioService mAudioService;
@@ -179,6 +185,7 @@ public class VolumeDialogControllerImpl implements VolumeDialogController, Dumpa
        mWorkerLooper = theadFactory.buildLooperOnNewThread(
                VolumeDialogControllerImpl.class.getSimpleName());
        mWorker = new W(mWorkerLooper);
        mRouter2Manager = MediaRouter2Manager.getInstance(mContext);
        mMediaSessionsCallbacksW = new MediaSessionsCallbacks(mContext);
        mMediaSessions = createMediaSessions(mContext, mWorkerLooper, mMediaSessionsCallbacksW);
        mAudio = audioManager;
@@ -1150,16 +1157,16 @@ 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;
        private final boolean mVolumeAdjustmentForRemoteGroupSessions;

        public MediaSessionsCallbacks(Context context) {
            mShowRemoteSessions = context.getResources().getBoolean(
                    com.android.internal.R.bool.config_volumeShowRemoteSessions);
            mVolumeAdjustmentForRemoteGroupSessions = context.getResources().getBoolean(
                    com.android.internal.R.bool.config_volumeAdjustmentForRemoteGroupSessions);
        }

        @Override
        public void onRemoteUpdate(Token token, String name, PlaybackInfo pi) {
            if (mShowRemoteSessions) {
            if (showForSession(token)) {
                addStream(token, "onRemoteUpdate");

                int stream = 0;
@@ -1191,7 +1198,7 @@ public class VolumeDialogControllerImpl implements VolumeDialogController, Dumpa

        @Override
        public void onRemoteVolumeChanged(Token token, int flags) {
            if (mShowRemoteSessions) {
            if (showForSession(token)) {
                addStream(token, "onRemoteVolumeChanged");
                int stream = 0;
                synchronized (mRemoteStreams) {
@@ -1215,7 +1222,7 @@ public class VolumeDialogControllerImpl implements VolumeDialogController, Dumpa

        @Override
        public void onRemoteRemoved(Token token) {
            if (mShowRemoteSessions) {
            if (showForSession(token)) {
                int stream = 0;
                synchronized (mRemoteStreams) {
                    if (!mRemoteStreams.containsKey(token)) {
@@ -1234,16 +1241,43 @@ public class VolumeDialogControllerImpl implements VolumeDialogController, Dumpa
        }

        public void setStreamVolume(int stream, int level) {
            if (mShowRemoteSessions) {
                final Token t = findToken(stream);
                if (t == null) {
            final Token token = findToken(stream);
            if (token == null) {
                Log.w(TAG, "setStreamVolume: No token found for stream: " + stream);
                return;
            }
                mMediaSessions.setVolume(t, level);
            if (showForSession(token)) {
                mMediaSessions.setVolume(token, level);
            }
        }

        private boolean showForSession(Token token) {
            if (mVolumeAdjustmentForRemoteGroupSessions) {
                return true;
            }
            MediaController ctr = new MediaController(mContext, token);
            String packageName = ctr.getPackageName();
            List<RoutingSessionInfo> sessions =
                    mRouter2Manager.getRoutingSessions(packageName);
            boolean foundNonSystemSession = false;
            boolean isGroup = false;
            for (RoutingSessionInfo session : sessions) {
                if (!session.isSystemSession()) {
                    foundNonSystemSession = true;
                    int selectedRouteCount = session.getSelectedRoutes().size();
                    if (selectedRouteCount > 1) {
                        isGroup = true;
                        break;
                    }
                }
            }
            if (!foundNonSystemSession) {
                Log.d(TAG, "No routing session for " + packageName);
                return false;
            }
            return !isGroup;
        }

        private Token findToken(int stream) {
            synchronized (mRemoteStreams) {
                for (Map.Entry<Token, Integer> entry : mRemoteStreams.entrySet()) {
+5 −0
Original line number Diff line number Diff line
@@ -101,6 +101,11 @@ public class VolumeDialogControllerImplTest extends SysuiTestCase {
        // Initial non-set value
        when(mRingerModeLiveData.getValue()).thenReturn(-1);
        when(mRingerModeInternalLiveData.getValue()).thenReturn(-1);
        // Enable group volume adjustments
        mContext.getOrCreateTestableResources().addOverride(
                com.android.internal.R.bool.config_volumeAdjustmentForRemoteGroupSessions,
                true);

        mCallback = mock(VolumeDialogControllerImpl.C.class);
        mThreadFactory.setLooper(TestableLooper.get(this).getLooper());
        mVolumeController = new TestableVolumeDialogControllerImpl(mContext,
+6 −0
Original line number Diff line number Diff line
@@ -145,6 +145,12 @@ public class MediaSession2Record implements MediaSessionRecordImpl {
        return false;
    }

    @Override
    public boolean canHandleVolumeKey() {
        // TODO: Implement when MediaSession2 starts to get key events.
        return false;
    }

    @Override
    public int getSessionPolicies() {
        synchronized (mLock) {
Loading