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

Commit bc6e74b2 authored by Anton Potapov's avatar Anton Potapov
Browse files

Add collapsing VolumePanel when opening settings from the Media Output

Switcher

Flag: EXEMPT bugfix
Bug: 348580713
Test: manual on the foldable
Change-Id: Ib5354db60ce1ea125cc95c410a05d95b9c818eb1
parent d0193b05
Loading
Loading
Loading
Loading
+16 −4
Original line number Diff line number Diff line
@@ -94,6 +94,7 @@ import com.android.systemui.settings.UserTracker;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection;
import com.android.systemui.statusbar.phone.SystemUIDialog;
import com.android.systemui.volume.panel.domain.interactor.VolumePanelGlobalStateInteractor;

import dagger.assisted.Assisted;
import dagger.assisted.AssistedFactory;
@@ -173,6 +174,7 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback,
    private float mActiveRadius;
    private FeatureFlags mFeatureFlags;
    private UserTracker mUserTracker;
    private VolumePanelGlobalStateInteractor mVolumePanelGlobalStateInteractor;

    public enum BroadcastNotifyDialog {
        ACTION_FIRST_LAUNCH,
@@ -195,6 +197,7 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback,
            PowerExemptionManager powerExemptionManager,
            KeyguardManager keyGuardManager,
            FeatureFlags featureFlags,
            VolumePanelGlobalStateInteractor volumePanelGlobalStateInteractor,
            UserTracker userTracker) {
        mContext = context;
        mPackageName = packageName;
@@ -209,6 +212,7 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback,
        mFeatureFlags = featureFlags;
        mUserTracker = userTracker;
        mToken = token;
        mVolumePanelGlobalStateInteractor = volumePanelGlobalStateInteractor;
        InfoMediaManager imm =
                InfoMediaManager.createInstance(mContext, packageName, userHandle, lbm, token);
        mLocalMediaManager = new LocalMediaManager(mContext, lbm, imm, packageName);
@@ -436,7 +440,7 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback,
            launchIntent.putExtra(EXTRA_ROUTE_ID, routeId);
            launchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            mCallback.dismissDialog();
            mActivityStarter.startActivity(launchIntent, true, controller);
            startActivity(launchIntent, controller);
        }
    }

@@ -447,7 +451,7 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback,
        if (launchIntent != null) {
            launchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            mCallback.dismissDialog();
            mActivityStarter.startActivity(launchIntent, true, controller);
            startActivity(launchIntent, controller);
        }
    }

@@ -951,10 +955,10 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback,
            deepLinkIntent.putExtra(
                    Settings.EXTRA_SETTINGS_EMBEDDED_DEEP_LINK_HIGHLIGHT_MENU_KEY,
                    PAGE_CONNECTED_DEVICES_KEY);
            mActivityStarter.startActivity(deepLinkIntent, true, controller);
            startActivity(deepLinkIntent, controller);
            return;
        }
        mActivityStarter.startActivity(launchIntent, true, controller);
        startActivity(launchIntent, controller);
    }

    void launchLeBroadcastNotifyDialog(View mediaOutputDialog, BroadcastSender broadcastSender,
@@ -998,6 +1002,7 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback,
                        mPowerExemptionManager,
                        mKeyGuardManager,
                        mFeatureFlags,
                        mVolumePanelGlobalStateInteractor,
                        mUserTracker);
        MediaOutputBroadcastDialog dialog = new MediaOutputBroadcastDialog(mContext, true,
                broadcastSender, controller);
@@ -1244,6 +1249,13 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback,
        return !device.isVolumeFixed();
    }

    private void startActivity(Intent intent, ActivityTransitionAnimator.Controller controller) {
        // Media Output dialog can be shown from the volume panel. This makes sure the panel is
        // closed when navigating to another activity, so it doesn't stays on top of it
        mVolumePanelGlobalStateInteractor.setVisible(false);
        mActivityStarter.startActivity(intent, true, controller);
    }

    @Override
    public void onDevicesUpdated(List<NearbyDevice> nearbyDevices) throws RemoteException {
        mNearbyDeviceInfoMap.clear();
+10 −0
Original line number Diff line number Diff line
@@ -50,14 +50,18 @@ import com.android.settingslib.bluetooth.LocalBluetoothManager;
import com.android.settingslib.bluetooth.LocalBluetoothProfileManager;
import com.android.settingslib.media.LocalMediaManager;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.SysuiTestCaseExtKt;
import com.android.systemui.animation.DialogTransitionAnimator;
import com.android.systemui.broadcast.BroadcastSender;
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.kosmos.Kosmos;
import com.android.systemui.media.nearby.NearbyMediaDevicesManager;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.res.R;
import com.android.systemui.settings.UserTracker;
import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection;
import com.android.systemui.volume.panel.domain.interactor.VolumePanelGlobalStateInteractor;
import com.android.systemui.volume.panel.domain.interactor.VolumePanelGlobalStateInteractorKosmosKt;

import org.junit.Before;
import org.junit.Test;
@@ -73,6 +77,8 @@ public class MediaOutputBaseDialogTest extends SysuiTestCase {

    private static final String TEST_PACKAGE = "test_package";

    private final Kosmos mKosmos = SysuiTestCaseExtKt.testKosmos(this);

    // Mock
    private MediaOutputBaseAdapter mMediaOutputBaseAdapter = mock(MediaOutputBaseAdapter.class);
    private MediaController mMediaController = mock(MediaController.class);
@@ -122,6 +128,9 @@ public class MediaOutputBaseDialogTest extends SysuiTestCase {
        when(mMediaController.getPackageName()).thenReturn(TEST_PACKAGE);
        mMediaControllers.add(mMediaController);
        when(mMediaSessionManager.getActiveSessions(any())).thenReturn(mMediaControllers);
        VolumePanelGlobalStateInteractor volumePanelGlobalStateInteractor =
                VolumePanelGlobalStateInteractorKosmosKt.getVolumePanelGlobalStateInteractor(
                        mKosmos);

        mMediaOutputController =
                new MediaOutputController(
@@ -139,6 +148,7 @@ public class MediaOutputBaseDialogTest extends SysuiTestCase {
                        mPowerExemptionManager,
                        mKeyguardManager,
                        mFlags,
                        volumePanelGlobalStateInteractor,
                        mUserTracker);

        // Using a fake package will cause routing operations to fail, so we intercept
+10 −0
Original line number Diff line number Diff line
@@ -51,14 +51,18 @@ import com.android.settingslib.media.BluetoothMediaDevice;
import com.android.settingslib.media.LocalMediaManager;
import com.android.settingslib.media.MediaDevice;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.SysuiTestCaseExtKt;
import com.android.systemui.animation.DialogTransitionAnimator;
import com.android.systemui.broadcast.BroadcastSender;
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.kosmos.Kosmos;
import com.android.systemui.media.nearby.NearbyMediaDevicesManager;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.res.R;
import com.android.systemui.settings.UserTracker;
import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection;
import com.android.systemui.volume.panel.domain.interactor.VolumePanelGlobalStateInteractor;
import com.android.systemui.volume.panel.domain.interactor.VolumePanelGlobalStateInteractorKosmosKt;

import com.google.common.base.Strings;

@@ -81,6 +85,8 @@ public class MediaOutputBroadcastDialogTest extends SysuiTestCase {
    private static final String BROADCAST_CODE_TEST = "112233";
    private static final String BROADCAST_CODE_UPDATE_TEST = "11223344";

    private final Kosmos mKosmos = SysuiTestCaseExtKt.testKosmos(this);

    // Mock
    private final MediaSessionManager mMediaSessionManager = mock(MediaSessionManager.class);
    private final LocalBluetoothManager mLocalBluetoothManager = mock(LocalBluetoothManager.class);
@@ -123,6 +129,9 @@ public class MediaOutputBroadcastDialogTest extends SysuiTestCase {
        when(mLocalBluetoothLeBroadcast.getProgramInfo()).thenReturn(BROADCAST_NAME_TEST);
        when(mLocalBluetoothLeBroadcast.getBroadcastCode()).thenReturn(
                BROADCAST_CODE_TEST.getBytes(StandardCharsets.UTF_8));
        VolumePanelGlobalStateInteractor volumePanelGlobalStateInteractor =
                VolumePanelGlobalStateInteractorKosmosKt.getVolumePanelGlobalStateInteractor(
                        mKosmos);

        mMediaOutputController =
                new MediaOutputController(
@@ -140,6 +149,7 @@ public class MediaOutputBroadcastDialogTest extends SysuiTestCase {
                        mPowerExemptionManager,
                        mKeyguardManager,
                        mFlags,
                        volumePanelGlobalStateInteractor,
                        mUserTracker);
        mMediaOutputController.mLocalMediaManager = mLocalMediaManager;
        mMediaOutputBroadcastDialog = new MediaOutputBroadcastDialog(mContext, false,
+19 −0
Original line number Diff line number Diff line
@@ -72,15 +72,19 @@ import com.android.settingslib.bluetooth.LocalBluetoothManager;
import com.android.settingslib.media.LocalMediaManager;
import com.android.settingslib.media.MediaDevice;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.SysuiTestCaseExtKt;
import com.android.systemui.animation.ActivityTransitionAnimator;
import com.android.systemui.animation.DialogTransitionAnimator;
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.kosmos.Kosmos;
import com.android.systemui.media.nearby.NearbyMediaDevicesManager;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.res.R;
import com.android.systemui.settings.UserTracker;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection;
import com.android.systemui.volume.panel.domain.interactor.VolumePanelGlobalStateInteractor;
import com.android.systemui.volume.panel.domain.interactor.VolumePanelGlobalStateInteractorKosmosKt;

import com.google.common.collect.ImmutableList;

@@ -158,11 +162,16 @@ public class MediaOutputControllerTest extends SysuiTestCase {
    @Mock
    private UserTracker mUserTracker;

    private final Kosmos mKosmos = SysuiTestCaseExtKt.testKosmos(this);

    private FeatureFlags mFlags = mock(FeatureFlags.class);
    private View mDialogLaunchView = mock(View.class);
    private MediaOutputController.Callback mCallback = mock(MediaOutputController.Callback.class);

    final Notification mNotification = mock(Notification.class);
    private final VolumePanelGlobalStateInteractor mVolumePanelGlobalStateInteractor =
            VolumePanelGlobalStateInteractorKosmosKt.getVolumePanelGlobalStateInteractor(
                    mKosmos);

    private Context mSpyContext;
    private String mPackageName = null;
@@ -194,6 +203,7 @@ public class MediaOutputControllerTest extends SysuiTestCase {
        when(mLocalBluetoothManager.getCachedDeviceManager()).thenReturn(
                mCachedBluetoothDeviceManager);


        mMediaOutputController =
                new MediaOutputController(
                        mSpyContext,
@@ -210,6 +220,7 @@ public class MediaOutputControllerTest extends SysuiTestCase {
                        mPowerExemptionManager,
                        mKeyguardManager,
                        mFlags,
                        mVolumePanelGlobalStateInteractor,
                        mUserTracker);
        mLocalMediaManager = spy(mMediaOutputController.mLocalMediaManager);
        when(mLocalMediaManager.isPreferenceRouteListingExist()).thenReturn(false);
@@ -304,6 +315,7 @@ public class MediaOutputControllerTest extends SysuiTestCase {
                        mPowerExemptionManager,
                        mKeyguardManager,
                        mFlags,
                        mVolumePanelGlobalStateInteractor,
                        mUserTracker);

        mMediaOutputController.start(mCb);
@@ -346,6 +358,7 @@ public class MediaOutputControllerTest extends SysuiTestCase {
                        mPowerExemptionManager,
                        mKeyguardManager,
                        mFlags,
                        mVolumePanelGlobalStateInteractor,
                        mUserTracker);

        mMediaOutputController.start(mCb);
@@ -602,6 +615,7 @@ public class MediaOutputControllerTest extends SysuiTestCase {
                        mPowerExemptionManager,
                        mKeyguardManager,
                        mFlags,
                        mVolumePanelGlobalStateInteractor,
                        mUserTracker);
        testMediaOutputController.start(mCb);
        reset(mCb);
@@ -636,6 +650,7 @@ public class MediaOutputControllerTest extends SysuiTestCase {
                        mPowerExemptionManager,
                        mKeyguardManager,
                        mFlags,
                        mVolumePanelGlobalStateInteractor,
                        mUserTracker);
        testMediaOutputController.start(mCb);
        reset(mCb);
@@ -683,6 +698,7 @@ public class MediaOutputControllerTest extends SysuiTestCase {
                        mPowerExemptionManager,
                        mKeyguardManager,
                        mFlags,
                        mVolumePanelGlobalStateInteractor,
                        mUserTracker);

        LocalMediaManager mockLocalMediaManager = mock(LocalMediaManager.class);
@@ -710,6 +726,7 @@ public class MediaOutputControllerTest extends SysuiTestCase {
                        mPowerExemptionManager,
                        mKeyguardManager,
                        mFlags,
                        mVolumePanelGlobalStateInteractor,
                        mUserTracker);

        LocalMediaManager mockLocalMediaManager = mock(LocalMediaManager.class);
@@ -990,6 +1007,7 @@ public class MediaOutputControllerTest extends SysuiTestCase {
                        mPowerExemptionManager,
                        mKeyguardManager,
                        mFlags,
                        mVolumePanelGlobalStateInteractor,
                        mUserTracker);

        assertThat(mMediaOutputController.getNotificationIcon()).isNull();
@@ -1193,6 +1211,7 @@ public class MediaOutputControllerTest extends SysuiTestCase {
                        mPowerExemptionManager,
                        mKeyguardManager,
                        mFlags,
                        mVolumePanelGlobalStateInteractor,
                        mUserTracker);

        testMediaOutputController.setTemporaryAllowListExceptionIfNeeded(mMediaDevice2);
+10 −0
Original line number Diff line number Diff line
@@ -54,14 +54,18 @@ import com.android.settingslib.flags.Flags;
import com.android.settingslib.media.LocalMediaManager;
import com.android.settingslib.media.MediaDevice;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.SysuiTestCaseExtKt;
import com.android.systemui.animation.DialogTransitionAnimator;
import com.android.systemui.broadcast.BroadcastSender;
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.kosmos.Kosmos;
import com.android.systemui.media.nearby.NearbyMediaDevicesManager;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.res.R;
import com.android.systemui.settings.UserTracker;
import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection;
import com.android.systemui.volume.panel.domain.interactor.VolumePanelGlobalStateInteractor;
import com.android.systemui.volume.panel.domain.interactor.VolumePanelGlobalStateInteractorKosmosKt;

import org.junit.After;
import org.junit.Before;
@@ -84,6 +88,8 @@ public class MediaOutputDialogTest extends SysuiTestCase {
    @Rule
    public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();

    private final Kosmos mKosmos = SysuiTestCaseExtKt.testKosmos(this);

    // Mock
    private final MediaSessionManager mMediaSessionManager = mock(MediaSessionManager.class);
    private MediaController mMediaController = mock(MediaController.class);
@@ -136,6 +142,9 @@ public class MediaOutputDialogTest extends SysuiTestCase {
        when(mMediaSessionManager.getActiveSessionsForUser(any(),
                Mockito.eq(userHandle))).thenReturn(
                mMediaControllers);
        VolumePanelGlobalStateInteractor volumePanelGlobalStateInteractor =
                VolumePanelGlobalStateInteractorKosmosKt.getVolumePanelGlobalStateInteractor(
                        mKosmos);

        mMediaOutputController =
                new MediaOutputController(
@@ -153,6 +162,7 @@ public class MediaOutputDialogTest extends SysuiTestCase {
                        mPowerExemptionManager,
                        mKeyguardManager,
                        mFlags,
                        volumePanelGlobalStateInteractor,
                        mUserTracker);
        mMediaOutputController.mLocalMediaManager = mLocalMediaManager;
        mMediaOutputDialog = makeTestDialog(mMediaOutputController);