Add unit tests for TaskbarKeyguardController

* Remove setting back button tint for SUW as that
is now done in ag/20953768

Bug: 230027385
Change-Id: I2c157ed67487cab9ba721fa659973351780509bb
diff --git a/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java b/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java
index cbee58b..2b976df 100644
--- a/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java
@@ -51,7 +51,6 @@
 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 @@
             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);
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java
index bc41c2b..260876b 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java
@@ -73,6 +73,13 @@
     // 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,
diff --git a/quickstep/tests/src/com/android/launcher3/taskbar/TaskbarBaseTestCase.kt b/quickstep/tests/src/com/android/launcher3/taskbar/TaskbarBaseTestCase.kt
new file mode 100644
index 0000000..e8a575e
--- /dev/null
+++ b/quickstep/tests/src/com/android/launcher3/taskbar/TaskbarBaseTestCase.kt
@@ -0,0 +1,100 @@
+/*
+ * 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
diff --git a/quickstep/tests/src/com/android/launcher3/taskbar/TaskbarKeyguardControllerTest.kt b/quickstep/tests/src/com/android/launcher3/taskbar/TaskbarKeyguardControllerTest.kt
new file mode 100644
index 0000000..59db8c8
--- /dev/null
+++ b/quickstep/tests/src/com/android/launcher3/taskbar/TaskbarKeyguardControllerTest.kt
@@ -0,0 +1,150 @@
+/*
+ * 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