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

Commit f2564685 authored by Oliver Woodman's avatar Oliver Woodman Committed by Android (Google) Code Review
Browse files

Merge changes from topic "grouped-volume-tweak" into sc-v2-dev

* changes:
  Re-enable volume control for non-grouped devices
  Tweak volume adjustment rules
parents bf3446ce f68e7fb4
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -1930,8 +1930,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
@@ -4444,7 +4444,7 @@

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

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

  <java-symbol type="integer" name="config_customizedMaxCachedProcesses" />

+7 −1
Original line number Diff line number Diff line
@@ -70,6 +70,7 @@ public class InfoMediaManager extends MediaManager {
    MediaRouter2Manager mRouterManager;
    @VisibleForTesting
    String mPackageName;
    private final boolean mVolumeAdjustmentForRemoteGroupSessions;

    private MediaDevice mCurrentConnectedDevice;
    private LocalBluetoothManager mBluetoothManager;
@@ -83,6 +84,9 @@ public class InfoMediaManager extends MediaManager {
        if (!TextUtils.isEmpty(packageName)) {
            mPackageName = packageName;
        }

        mVolumeAdjustmentForRemoteGroupSessions = context.getResources().getBoolean(
                com.android.internal.R.bool.config_volumeAdjustmentForRemoteGroupSessions);
    }

    @Override
@@ -387,7 +391,9 @@ public class InfoMediaManager extends MediaManager {

    @TargetApi(Build.VERSION_CODES.R)
    boolean shouldEnableVolumeSeekBar(RoutingSessionInfo sessionInfo) {
        return false;
        return sessionInfo.isSystemSession() // System sessions are not remote
                || mVolumeAdjustmentForRemoteGroupSessions
                || sessionInfo.getSelectedRoutes().size() <= 1;
    }

    private void refreshDevices() {
+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;
@@ -1149,16 +1156,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;
@@ -1190,7 +1197,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) {
@@ -1214,7 +1221,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)) {
@@ -1233,16 +1240,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,
Loading