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

Commit b069336a authored by Vinit Nayak's avatar Vinit Nayak Committed by Automerger Merge Worker
Browse files

Merge "Add unit tests for TaskbarKeyguardController" into tm-qpr-dev am: 8d98dd29

parents b9a217bf 8d98dd29
Loading
Loading
Loading
Loading
+0 −8
Original line number Diff line number Diff line
@@ -51,7 +51,6 @@ import android.annotation.IdRes;
import android.annotation.LayoutRes;
import android.content.pm.ActivityInfo.Config;
import android.content.res.ColorStateList;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.Color;
import android.graphics.Point;
@@ -725,13 +724,6 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT
            mPropertyHolders.add(new StatePropertyHolder(
                    mBackButtonAlpha.get(ALPHA_INDEX_SUW),
                    flags -> (flags & FLAG_IME_VISIBLE) == 0));

            // TODO(b/210906568) Dark intensity is currently not propagated during setup, so set
            //  it based on dark theme for now.
            int mode = res.getConfiguration().uiMode
                    & Configuration.UI_MODE_NIGHT_MASK;
            boolean isDarkTheme = mode == Configuration.UI_MODE_NIGHT_YES;
            mTaskbarNavButtonDarkIntensity.updateValue(isDarkTheme ? 0 : 1);
        } else if (isInKidsMode) {
            int iconSize = res.getDimensionPixelSize(
                    R.dimen.taskbar_icon_size_kids);
+7 −0
Original line number Diff line number Diff line
@@ -73,6 +73,13 @@ public class TaskbarControllers {
    // Roundness property for round corner above taskbar .
    private final AnimatedFloat mCornerRoundness = new AnimatedFloat(this::updateCornerRoundness);

    /**
     * Want to add a new controller? Don't forget to:
     *   * Call init
     *   * Call onDestroy
     *   * Add to mControllersToLog
     *   * Add tests by adding this controller to TaskbarBaseTestCase.kt and extending that class
     */
    public TaskbarControllers(TaskbarActivityContext taskbarActivityContext,
            TaskbarDragController taskbarDragController,
            TaskbarNavButtonController navButtonController,
+100 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2023 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.android.launcher3.taskbar

import com.android.launcher3.taskbar.allapps.TaskbarAllAppsController
import com.android.launcher3.taskbar.overlay.TaskbarOverlayController
import com.android.systemui.shared.rotation.RotationButtonController
import org.junit.Before
import org.mockito.Mock
import org.mockito.MockitoAnnotations

/**
 * Helper class to extend to get access to all controllers.
 * Gotta be careful of your relationship with this class though, it can be quite... controlling.
 */
abstract class TaskbarBaseTestCase {

    @Mock
    lateinit var taskbarActivityContext: TaskbarActivityContext
    @Mock
    lateinit var taskbarDragController: TaskbarDragController
    @Mock
    lateinit var navButtonController: TaskbarNavButtonController
    @Mock
    lateinit var navbarButtonsViewController: NavbarButtonsViewController
    @Mock
    lateinit var rotationButtonController: RotationButtonController
    @Mock
    lateinit var taskbarDragLayerController: TaskbarDragLayerController
    @Mock
    lateinit var taskbarScrimViewController: TaskbarScrimViewController
    @Mock
    lateinit var taskbarViewController: TaskbarViewController
    @Mock
    lateinit var taskbarUnfoldAnimationController: TaskbarUnfoldAnimationController
    @Mock
    lateinit var taskbarKeyguardController: TaskbarKeyguardController
    @Mock
    lateinit var stashedHandleViewController: StashedHandleViewController
    @Mock
    lateinit var taskbarStashController: TaskbarStashController
    @Mock
    lateinit var taskbarEduController: TaskbarEduController
    @Mock
    lateinit var taskbarAutohideSuspendController: TaskbarAutohideSuspendController
    @Mock
    lateinit var taskbarPopupController: TaskbarPopupController
    @Mock
    lateinit var taskbarForceVisibleImmersiveController: TaskbarForceVisibleImmersiveController
    @Mock
    lateinit var taskbarAllAppsController: TaskbarAllAppsController
    @Mock
    lateinit var taskbarInsetsController: TaskbarInsetsController
    @Mock
    lateinit var voiceInteractionWindowController: VoiceInteractionWindowController
    @Mock
    lateinit var taskbarRecentAppsController: TaskbarRecentAppsController
    @Mock
    lateinit var taskbarTranslationController: TaskbarTranslationController
    @Mock
    lateinit var taskbarOverlayController: TaskbarOverlayController

    lateinit var mTaskbarControllers: TaskbarControllers

    @Before
    open fun setup() {
        /*
         * NOTE: Mocking of controllers that are written in Kotlin won't work since their methods
         * are final by default (and should not be changed only for tests), meaning unmockable.
         * Womp, womp woooommmmppp.
         * If you want to mock one of those methods, you need to make a parent interface that
         * includes that method to allow mocking it.
         */
        MockitoAnnotations.initMocks(this)
        mTaskbarControllers = TaskbarControllers(
                taskbarActivityContext, taskbarDragController, navButtonController,
                navbarButtonsViewController, rotationButtonController, taskbarDragLayerController,
                taskbarViewController, taskbarScrimViewController, taskbarUnfoldAnimationController,
                taskbarKeyguardController, stashedHandleViewController, taskbarStashController,
                taskbarEduController, taskbarAutohideSuspendController, taskbarPopupController,
                taskbarForceVisibleImmersiveController, taskbarOverlayController,
                taskbarAllAppsController, taskbarInsetsController,
                voiceInteractionWindowController, taskbarTranslationController,
                taskbarRecentAppsController
        )
    }
}
 No newline at end of file
+150 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2023 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.android.launcher3.taskbar

import android.app.KeyguardManager
import com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_BACK_DISABLED
import com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_BOUNCER_SHOWING
import com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_DEVICE_DOZING
import com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_HOME_DISABLED
import com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_OVERVIEW_DISABLED
import com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING
import com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING_OCCLUDED
import org.junit.Before
import org.junit.Test
import org.mockito.Mock
import org.mockito.Mockito.anyBoolean
import org.mockito.Mockito.never
import org.mockito.Mockito.times
import org.mockito.Mockito.verify
import org.mockito.Mockito.`when` as whenever

class TaskbarKeyguardControllerTest : TaskbarBaseTestCase() {

    @Mock
    lateinit var baseDragLayer: TaskbarDragLayer
    @Mock
    lateinit var keyguardManager: KeyguardManager

    @Before
    override fun setup() {
        super.setup()
        whenever(taskbarActivityContext.getSystemService(KeyguardManager::class.java))
                .thenReturn(keyguardManager)
        whenever(baseDragLayer.childCount).thenReturn(0)
        whenever(taskbarActivityContext.dragLayer).thenReturn(baseDragLayer)

        taskbarKeyguardController = TaskbarKeyguardController(taskbarActivityContext)
        taskbarKeyguardController.init(navbarButtonsViewController)
    }

    @Test
    fun uninterestingFlags_noActions() {
        setFlags(0)
        verify(navbarButtonsViewController, never()).setKeyguardVisible(anyBoolean(), anyBoolean())
    }

    @Test
    fun keyguardShowing() {
        setFlags(SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING)
        verify(navbarButtonsViewController, times(1)).setKeyguardVisible(
                true /*isKeyguardVisible*/,
                false /*isKeyguardOccluded*/)
    }

    @Test
    fun dozingShowing() {
        setFlags(SYSUI_STATE_DEVICE_DOZING)
        verify(navbarButtonsViewController, times(1)).setKeyguardVisible(
                true /*isKeyguardVisible*/,
                false /*isKeyguardOccluded*/)
    }

    @Test
    fun keyguardOccluded() {
        setFlags(SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING_OCCLUDED)
        verify(navbarButtonsViewController, times(1)).setKeyguardVisible(
                false /*isKeyguardVisible*/,
                true /*isKeyguardOccluded*/)
    }

    @Test
    fun keyguardOccludedAndDozing() {
        setFlags(SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING_OCCLUDED.or(SYSUI_STATE_DEVICE_DOZING))
        verify(navbarButtonsViewController, times(1)).setKeyguardVisible(
                true /*isKeyguardVisible*/,
                true /*isKeyguardOccluded*/)
    }

    @Test
    fun deviceInsecure_hideBackForBouncer() {
        whenever(keyguardManager.isDeviceSecure).thenReturn(false)
        setFlags(SYSUI_STATE_OVERVIEW_DISABLED
                .or(SYSUI_STATE_HOME_DISABLED)
                .or(SYSUI_STATE_BOUNCER_SHOWING))

        verify(navbarButtonsViewController, times(1)).setBackForBouncer(false)
    }

    @Test
    fun deviceSecure_showBackForBouncer() {
        whenever(keyguardManager.isDeviceSecure).thenReturn(true)
        setFlags(SYSUI_STATE_OVERVIEW_DISABLED
                .or(SYSUI_STATE_HOME_DISABLED)
                .or(SYSUI_STATE_BOUNCER_SHOWING))

        verify(navbarButtonsViewController, times(1)).setBackForBouncer(true)
    }

    @Test
    fun homeShowing_hideBackForBouncer() {
        whenever(keyguardManager.isDeviceSecure).thenReturn(true)
        setFlags(SYSUI_STATE_OVERVIEW_DISABLED
                .or(SYSUI_STATE_BOUNCER_SHOWING))

        verify(navbarButtonsViewController, times(1)).setBackForBouncer(false)
    }

    @Test
    fun overviewShowing_hideBackForBouncer() {
        whenever(keyguardManager.isDeviceSecure).thenReturn(true)
        setFlags(SYSUI_STATE_HOME_DISABLED
                .or(SYSUI_STATE_BOUNCER_SHOWING))

        verify(navbarButtonsViewController, times(1)).setBackForBouncer(false)
    }

    @Test
    fun backDisabled_hideBackForBouncer() {
        whenever(keyguardManager.isDeviceSecure).thenReturn(true)
        setFlags(SYSUI_STATE_BACK_DISABLED
                .or(SYSUI_STATE_BOUNCER_SHOWING))

        verify(navbarButtonsViewController, times(1)).setBackForBouncer(false)

        // back disabled along with home and overview
        setFlags(SYSUI_STATE_BACK_DISABLED
                .or(SYSUI_STATE_HOME_DISABLED)
                .or(SYSUI_STATE_OVERVIEW_DISABLED)
                .or(SYSUI_STATE_BOUNCER_SHOWING))

        verify(navbarButtonsViewController, times(2)).setBackForBouncer(false)
    }

    private fun setFlags(flags: Int) {
        taskbarKeyguardController.updateStateForSysuiFlags(flags)
    }
}
 No newline at end of file