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

Commit 34df531d authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Open GlobalActionDialog on correct screen from QS footer" into main

parents 1f3cc21c a77a33f3
Loading
Loading
Loading
Loading
+7 −5
Original line number Diff line number Diff line
@@ -35,9 +35,7 @@ import com.android.systemui.qs.footer.FooterActionsTestUtils
import com.android.systemui.statusbar.policy.DeviceProvisionedController
import com.android.systemui.truth.correspondence.FakeUiEvent
import com.android.systemui.truth.correspondence.LogMaker
import com.android.systemui.util.mockito.any
import com.android.systemui.util.mockito.argumentCaptor
import com.android.systemui.util.mockito.eq
import com.android.systemui.util.mockito.mock
import com.android.systemui.util.mockito.nullable
import com.google.common.truth.Truth.assertThat
@@ -45,8 +43,11 @@ import kotlinx.coroutines.test.TestCoroutineScheduler
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.ArgumentMatchers.anyInt
import org.mockito.Mockito.verify
import org.mockito.Mockito.`when` as whenever
import org.mockito.kotlin.any
import org.mockito.kotlin.eq

@SmallTest
@RunWith(AndroidJUnit4::class)
@@ -92,9 +93,10 @@ class FooterActionsInteractorTest : SysuiTestCase() {
        // Dialog is shown.
        verify(globalActionsDialogLite)
            .showOrHideDialog(
                /* keyguardShowing= */ false,
                /* isDeviceProvisioned= */ true,
                expandable,
                /* keyguardShowing= */ eq(false),
                /* isDeviceProvisioned= */ eq(true),
                eq(expandable),
                anyInt(),
            )
    }

+47 −7
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
import static android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR_SUB_PANEL;
import static android.view.WindowManager.ScreenshotSource.SCREENSHOT_GLOBAL_ACTIONS;
import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_2BUTTON;

@@ -120,6 +121,8 @@ import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.colorextraction.SysuiColorExtractor;
import com.android.systemui.dagger.qualifiers.Background;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.display.data.repository.DisplayWindowPropertiesRepository;
import com.android.systemui.display.shared.model.DisplayWindowProperties;
import com.android.systemui.globalactions.domain.interactor.GlobalActionsInteractor;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.GlobalActions.GlobalActionsManager;
@@ -127,6 +130,7 @@ import com.android.systemui.plugins.GlobalActionsPanelPlugin;
import com.android.systemui.scrim.ScrimDrawable;
import com.android.systemui.settings.UserTracker;
import com.android.systemui.shade.ShadeController;
import com.android.systemui.shade.shared.flag.ShadeWindowGoesAround;
import com.android.systemui.statusbar.NotificationShadeWindowController;
import com.android.systemui.statusbar.VibratorHelper;
import com.android.systemui.statusbar.phone.LightBarController;
@@ -149,6 +153,8 @@ import java.util.concurrent.Executor;

import javax.inject.Inject;

import dagger.Lazy;

/**
 * Helper to show the global actions dialog.  Each item is an {@link Action} that may show depending
 * on whether the keyguard is showing, and whether the device is provisioned.
@@ -194,6 +200,8 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
    // See NotificationManagerService.LONG_DELAY
    private static final int TOAST_VISIBLE_TIME = 3500;

    private static final int DIALOG_WINDOW_TYPE = TYPE_STATUS_BAR_SUB_PANEL;

    private final Context mContext;
    private final GlobalActionsManager mWindowManagerFuncs;
    private final AudioManager mAudioManager;
@@ -261,6 +269,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
    private final DialogTransitionAnimator mDialogTransitionAnimator;
    private final UserLogoutInteractor mLogoutInteractor;
    private final GlobalActionsInteractor mInteractor;
    private final Lazy<DisplayWindowPropertiesRepository> mDisplayWindowPropertiesRepositoryLazy;

    @VisibleForTesting
    public enum GlobalActionsEvent implements UiEventLogger.UiEventEnum {
@@ -376,7 +385,8 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
            DialogTransitionAnimator dialogTransitionAnimator,
            SelectedUserInteractor selectedUserInteractor,
            UserLogoutInteractor logoutInteractor,
            GlobalActionsInteractor interactor) {
            GlobalActionsInteractor interactor,
            Lazy<DisplayWindowPropertiesRepository> displayWindowPropertiesRepository) {
        mContext = context;
        mWindowManagerFuncs = windowManagerFuncs;
        mAudioManager = audioManager;
@@ -413,6 +423,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
        mSelectedUserInteractor = selectedUserInteractor;
        mLogoutInteractor = logoutInteractor;
        mInteractor = interactor;
        mDisplayWindowPropertiesRepositoryLazy = displayWindowPropertiesRepository;

        // receive broadcasts
        IntentFilter filter = new IntentFilter();
@@ -473,9 +484,10 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
     * @param isDeviceProvisioned True if device is provisioned
     * @param expandable          The expandable from which we should animate the dialog when
     *                            showing it
     * @param displayId           Display that should show the dialog
     */
    public void showOrHideDialog(boolean keyguardShowing, boolean isDeviceProvisioned,
            @Nullable Expandable expandable) {
            @Nullable Expandable expandable, int displayId) {
        mKeyguardShowing = keyguardShowing;
        mDeviceProvisioned = isDeviceProvisioned;
        if (mDialog != null && mDialog.isShowing()) {
@@ -487,7 +499,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
            mDialog.dismiss();
            mDialog = null;
        } else {
            handleShow(expandable);
            handleShow(expandable, displayId);
        }
    }

@@ -507,8 +519,8 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
        mHandler.sendEmptyMessage(MESSAGE_DISMISS);
    }

    protected void handleShow(@Nullable Expandable expandable) {
        mDialog = createDialog();
    protected void handleShow(@Nullable Expandable expandable, int displayId) {
        mDialog = createDialog(displayId);
        prepareDialog();

        WindowManager.LayoutParams attrs = mDialog.getWindow().getAttributes();
@@ -686,16 +698,44 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
        mPowerAdapter = new MyPowerOptionsAdapter();
    }


    /**
     * Create the global actions dialog.
     *
     * @return A new dialog.
     */
    protected ActionsDialogLite createDialog() {
        return createDialog(mContext.getDisplayId());
    }

    private Context getContextForDisplay(int displayId) {
        if (!ShadeWindowGoesAround.isEnabled()) {
            Log.e(TAG, "Asked for the displayId=" + displayId
                    + " context but returning default display one as ShadeWindowGoesAround flag "
                    + "is disabled.");
            return mContext;
        }
        try {
            DisplayWindowProperties properties = mDisplayWindowPropertiesRepositoryLazy.get().get(
                    displayId,
                    DIALOG_WINDOW_TYPE);
            return properties.getContext();
        } catch (Exception e) {
            Log.e(TAG, "Couldn't get context for displayId=" + displayId);
            return mContext;
        }
    }
    /**
     * Create the global actions dialog with a specific context.
     *
     * @return A new dialog.
     */
    protected ActionsDialogLite createDialog(int displayId) {
        final Context context = getContextForDisplay(displayId);
        initDialogItems();

        ActionsDialogLite dialog = new ActionsDialogLite(
                mContext,
                context,
                com.android.systemui.res.R.style.Theme_SystemUI_Dialog_GlobalActionsLite,
                mAdapter,
                mOverflowAdapter,
@@ -704,7 +744,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
                mLightBarController,
                mKeyguardStateController,
                mNotificationShadeWindowController,
                mStatusBarWindowControllerStore.getDefaultDisplay(),
                mStatusBarWindowControllerStore.forDisplay(context.getDisplayId()),
                this::onRefresh,
                mKeyguardShowing,
                mPowerAdapter,
+2 −1
Original line number Diff line number Diff line
@@ -63,7 +63,8 @@ public class GlobalActionsImpl implements GlobalActions, CommandQueue.Callbacks
    public void showGlobalActions(GlobalActionsManager manager) {
        if (mDisabled) return;
        mGlobalActionsDialog.showOrHideDialog(mKeyguardStateController.isShowing(),
                mDeviceProvisionedController.isDeviceProvisioned(), null /* view */);
                mDeviceProvisionedController.isDeviceProvisioned(), null /* view */,
                mContext.getDisplayId());
    }

    @Override
+3 −0
Original line number Diff line number Diff line
@@ -40,6 +40,7 @@ import com.android.systemui.qs.footer.data.model.UserSwitcherStatusModel
import com.android.systemui.qs.footer.data.repository.ForegroundServicesRepository
import com.android.systemui.qs.footer.domain.model.SecurityButtonConfig
import com.android.systemui.security.data.repository.SecurityRepository
import com.android.systemui.shade.ShadeDisplayAware
import com.android.systemui.statusbar.policy.DeviceProvisionedController
import com.android.systemui.user.data.repository.UserSwitcherRepository
import com.android.systemui.user.domain.interactor.UserSwitcherInteractor
@@ -108,6 +109,7 @@ constructor(
    userSwitcherRepository: UserSwitcherRepository,
    broadcastDispatcher: BroadcastDispatcher,
    @Background bgDispatcher: CoroutineDispatcher,
    @ShadeDisplayAware private val context: Context,
) : FooterActionsInteractor {
    override val securityButtonConfig: Flow<SecurityButtonConfig?> =
        securityRepository.security.map { security ->
@@ -157,6 +159,7 @@ constructor(
            /* keyguardShowing= */ false,
            /* isDeviceProvisioned= */ true,
            expandable,
            context.displayId,
        )
    }

+15 −7
Original line number Diff line number Diff line
@@ -41,6 +41,7 @@ import android.os.Handler;
import android.os.UserManager;
import android.provider.Settings;
import android.testing.TestableLooper;
import android.view.Display;
import android.view.GestureDetector;
import android.view.IWindowManager;
import android.view.KeyEvent;
@@ -63,6 +64,7 @@ import com.android.systemui.SysuiTestCase;
import com.android.systemui.animation.DialogTransitionAnimator;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.colorextraction.SysuiColorExtractor;
import com.android.systemui.display.data.repository.FakeDisplayWindowPropertiesRepository;
import com.android.systemui.globalactions.domain.interactor.GlobalActionsInteractor;
import com.android.systemui.kosmos.KosmosJavaAdapter;
import com.android.systemui.plugins.ActivityStarter;
@@ -159,6 +161,8 @@ public class GlobalActionsDialogLiteTest extends SysuiTestCase {
                getContext().getResources().getConfiguration());
        when(mStatusBarWindowControllerStore.getDefaultDisplay())
                .thenReturn(mStatusBarWindowController);
        when(mStatusBarWindowControllerStore.forDisplay(anyInt()))
                .thenReturn(mStatusBarWindowController);
        mGlobalSettings = new FakeGlobalSettings();
        mSecureSettings = new FakeSettings();
        mInteractor = mKosmos.getGlobalActionsInteractor();
@@ -198,7 +202,9 @@ public class GlobalActionsDialogLiteTest extends SysuiTestCase {
                mDialogTransitionAnimator,
                mSelectedUserInteractor,
                mLogoutInteractor,
                mInteractor);
                mInteractor,
                () -> new FakeDisplayWindowPropertiesRepository(mContext)
        );
        mGlobalActionsDialogLite.setZeroDialogPressDelayForTesting();

        ColorExtractor.GradientColors backdropColors = new ColorExtractor.GradientColors();
@@ -609,13 +615,15 @@ public class GlobalActionsDialogLiteTest extends SysuiTestCase {

        // When entering power menu from lockscreen, with smart lock enabled
        when(mKeyguardUpdateMonitor.getUserHasTrust(anyInt())).thenReturn(true);
        mGlobalActionsDialogLite.showOrHideDialog(true, true, null /* view */);
        mGlobalActionsDialogLite.showOrHideDialog(true, true, null /* view */,
                Display.DEFAULT_DISPLAY);

        // Then smart lock will be disabled
        verify(mLockPatternUtils).requireCredentialEntry(eq(expectedUser));

        // hide dialog again
        mGlobalActionsDialogLite.showOrHideDialog(true, true, null /* view */);
        mGlobalActionsDialogLite.showOrHideDialog(true, true, null /* view */,
                Display.DEFAULT_DISPLAY);
    }

    @Test
@@ -729,13 +737,13 @@ public class GlobalActionsDialogLiteTest extends SysuiTestCase {
        doReturn(actions).when(mGlobalActionsDialogLite).getDefaultActions();

        // Show dialog with keyguard showing
        mGlobalActionsDialogLite.showOrHideDialog(true, true, null);
        mGlobalActionsDialogLite.showOrHideDialog(true, true, null, Display.DEFAULT_DISPLAY);

        assertOneItemOfType(mGlobalActionsDialogLite.mItems,
                GlobalActionsDialogLite.SystemUpdateAction.class);

        // Hide dialog
        mGlobalActionsDialogLite.showOrHideDialog(true, true, null);
        mGlobalActionsDialogLite.showOrHideDialog(true, true, null, Display.DEFAULT_DISPLAY);
    }

    @Test
@@ -754,13 +762,13 @@ public class GlobalActionsDialogLiteTest extends SysuiTestCase {
        doReturn(actions).when(mGlobalActionsDialogLite).getDefaultActions();

        // Show dialog with keyguard showing
        mGlobalActionsDialogLite.showOrHideDialog(false, false, null);
        mGlobalActionsDialogLite.showOrHideDialog(false, false, null, Display.DEFAULT_DISPLAY);

        assertNoItemsOfType(mGlobalActionsDialogLite.mItems,
                GlobalActionsDialogLite.SystemUpdateAction.class);

        // Hide dialog
        mGlobalActionsDialogLite.showOrHideDialog(false, false, null);
        mGlobalActionsDialogLite.showOrHideDialog(false, false, null, Display.DEFAULT_DISPLAY);
    }

    private UserInfo mockCurrentUser(int flags) {
Loading