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

Commit 78f8d405 authored by Brian Isganitis's avatar Brian Isganitis
Browse files

Add tests for TaskbarScrimViewController.

Test: TaskbarScrimViewController
Bug: 346395034
Flag: TEST_ONLY
Change-Id: I418675ba9aeaa645a0b216d237c479ffd640baf9
parent 3231ba01
Loading
Loading
Loading
Loading
+16 −4
Original line number Diff line number Diff line
@@ -27,6 +27,8 @@ import android.animation.ObjectAnimator;
import android.view.animation.Interpolator;
import android.view.animation.PathInterpolator;

import androidx.annotation.VisibleForTesting;

import com.android.launcher3.anim.AnimatedFloat;
import com.android.launcher3.taskbar.bubbles.BubbleControllers;
import com.android.launcher3.util.DisplayController;
@@ -77,7 +79,7 @@ public class TaskbarScrimViewController implements TaskbarControllers.LoggableTa
    public void onTaskbarVisibilityChanged(int visibility) {
        mTaskbarVisible = visibility == VISIBLE;
        if (shouldShowScrim()) {
            showScrim(true, getScrimAlpha(), false /* skipAnim */);
            showScrim(true, computeScrimAlpha(), false /* skipAnim */);
        } else if (mScrimView.getScrimAlpha() > 0f) {
            showScrim(false, 0, false /* skipAnim */);
        }
@@ -96,7 +98,7 @@ public class TaskbarScrimViewController implements TaskbarControllers.LoggableTa
            return;
        }
        mSysUiStateFlags = stateFlags;
        showScrim(shouldShowScrim(), getScrimAlpha(), skipAnim);
        showScrim(shouldShowScrim(), computeScrimAlpha(), skipAnim);
    }

    private boolean shouldShowScrim() {
@@ -119,7 +121,7 @@ public class TaskbarScrimViewController implements TaskbarControllers.LoggableTa
                && !mControllers.taskbarStashController.isHiddenForBubbles();
    }

    private float getScrimAlpha() {
    private float computeScrimAlpha() {
        final boolean isPersistentTaskBarVisible =
                mTaskbarVisible && !DisplayController.isTransientTaskbar(mScrimView.getContext());
        final boolean manageMenuExpanded =
@@ -140,7 +142,7 @@ public class TaskbarScrimViewController implements TaskbarControllers.LoggableTa
        mScrimView.setOnClickListener(showScrim ? (view) -> onClick() : null);
        mScrimView.setClickable(showScrim);
        if (skipAnim) {
            mScrimView.setScrimAlpha(alpha);
            mScrimAlpha.updateValue(alpha);
        } else {
            ObjectAnimator anim = mScrimAlpha.animateToValue(showScrim ? alpha : 0);
            anim.setInterpolator(showScrim ? SCRIM_ALPHA_IN : SCRIM_ALPHA_OUT);
@@ -167,4 +169,14 @@ public class TaskbarScrimViewController implements TaskbarControllers.LoggableTa

        pw.println(prefix + "\tmScrimAlpha.value=" + mScrimAlpha.value);
    }

    @VisibleForTesting
    TaskbarScrimView getScrimView() {
        return mScrimView;
    }

    @VisibleForTesting
    float getScrimAlpha() {
        return mScrimAlpha.value;
    }
}
+3 −1
Original line number Diff line number Diff line
@@ -54,6 +54,7 @@ import android.window.TransitionFilter;

import androidx.annotation.MainThread;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import androidx.annotation.WorkerThread;

import com.android.internal.logging.InstanceId;
@@ -187,7 +188,8 @@ public class SystemUiProxy implements ISystemUiProxy, NavHandle, SafeCloseable {
    @Nullable
    private final ProxyUnfoldTransitionProvider mUnfoldTransitionProvider;

    private SystemUiProxy(Context context) {
    @VisibleForTesting
    protected SystemUiProxy(Context context) {
        mContext = context;
        mAsyncHandler = new Handler(UI_HELPER_EXECUTOR.getLooper(), this::handleMessageAsync);
        final Intent baseIntent = new Intent().setPackage(mContext.getPackageName());
+163 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2024 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.animation.AnimatorTestRule
import android.view.View.GONE
import android.view.View.VISIBLE
import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation
import com.android.launcher3.taskbar.rules.TaskbarModeRule
import com.android.launcher3.taskbar.rules.TaskbarModeRule.Mode.PINNED
import com.android.launcher3.taskbar.rules.TaskbarModeRule.Mode.TRANSIENT
import com.android.launcher3.taskbar.rules.TaskbarModeRule.TaskbarMode
import com.android.launcher3.taskbar.rules.TaskbarUnitTestRule
import com.android.launcher3.taskbar.rules.TaskbarUnitTestRule.InjectController
import com.android.launcher3.taskbar.rules.TaskbarWindowSandboxContext
import com.android.launcher3.util.LauncherMultivalentJUnit
import com.android.launcher3.util.LauncherMultivalentJUnit.EmulatedDevices
import com.android.quickstep.SystemUiProxy
import com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_BUBBLES_EXPANDED
import com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_BUBBLES_MANAGE_MENU_EXPANDED
import com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_NOTIFICATION_PANEL_VISIBLE
import com.android.wm.shell.shared.bubbles.BubbleConstants.BUBBLE_EXPANDED_SCRIM_ALPHA
import com.google.common.truth.Truth.assertThat
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith

@RunWith(LauncherMultivalentJUnit::class)
@EmulatedDevices(["pixelTablet2023"])
class TaskbarScrimViewControllerTest {
    private val context = TaskbarWindowSandboxContext.create(getInstrumentation().targetContext)

    @get:Rule(order = 0) val taskbarModeRule = TaskbarModeRule(context)
    @get:Rule(order = 1) val animatorTestRule = AnimatorTestRule(this)
    @get:Rule(order = 2) val taskbarUnitTestRule = TaskbarUnitTestRule(this, context)

    @InjectController lateinit var scrimViewController: TaskbarScrimViewController

    // Default animation duration.
    private val animationDuration =
        context.resources.getInteger(android.R.integer.config_mediumAnimTime).toLong()

    @Test
    @TaskbarMode(PINNED)
    fun testOnTaskbarVisibleChanged_onlyTaskbarVisible_noScrim() {
        getInstrumentation().runOnMainSync {
            scrimViewController.onTaskbarVisibilityChanged(VISIBLE)
            scrimViewController.updateStateForSysuiFlags(0, true)
        }
        assertThat(scrimViewController.scrimAlpha).isEqualTo(0)
    }

    @Test
    @TaskbarMode(PINNED)
    fun testOnTaskbarVisibilityChanged_pinnedTaskbarVisibleWithBubblesExpanded_showsScrim() {
        getInstrumentation().runOnMainSync {
            scrimViewController.updateStateForSysuiFlags(SYSUI_STATE_BUBBLES_EXPANDED, true)
            scrimViewController.onTaskbarVisibilityChanged(VISIBLE)
            animatorTestRule.advanceTimeBy(animationDuration)
        }

        assertThat(scrimViewController.scrimAlpha).isEqualTo(BUBBLE_EXPANDED_SCRIM_ALPHA)
    }

    @Test
    @TaskbarMode(PINNED)
    fun testOnTaskbarVisibilityChanged_pinnedTaskbarHiddenDuringScrim_hidesScrim() {
        getInstrumentation().runOnMainSync {
            scrimViewController.onTaskbarVisibilityChanged(VISIBLE)
            scrimViewController.updateStateForSysuiFlags(SYSUI_STATE_BUBBLES_EXPANDED, true)
        }
        assertThat(scrimViewController.scrimAlpha).isEqualTo(BUBBLE_EXPANDED_SCRIM_ALPHA)

        getInstrumentation().runOnMainSync {
            scrimViewController.onTaskbarVisibilityChanged(GONE)
            animatorTestRule.advanceTimeBy(animationDuration)
        }
        assertThat(scrimViewController.scrimAlpha).isEqualTo(0)
    }

    @Test
    @TaskbarMode(PINNED)
    fun testOnTaskbarVisibilityChanged_notificationsOverPinnedTaskbarAndBubbles_noScrim() {
        getInstrumentation().runOnMainSync {
            scrimViewController.updateStateForSysuiFlags(
                SYSUI_STATE_BUBBLES_EXPANDED or SYSUI_STATE_NOTIFICATION_PANEL_VISIBLE,
                true,
            )
            scrimViewController.onTaskbarVisibilityChanged(VISIBLE)
        }
        assertThat(scrimViewController.scrimAlpha).isEqualTo(0)
    }

    @Test
    @TaskbarMode(PINNED)
    fun testOnTaskbarVisibilityChanged_pinnedTaskbarWithBubbleMenu_darkerScrim() {
        getInstrumentation().runOnMainSync {
            scrimViewController.onTaskbarVisibilityChanged(VISIBLE)
            scrimViewController.updateStateForSysuiFlags(
                SYSUI_STATE_BUBBLES_EXPANDED or SYSUI_STATE_BUBBLES_MANAGE_MENU_EXPANDED,
                true,
            )
        }
        assertThat(scrimViewController.scrimAlpha).isGreaterThan(BUBBLE_EXPANDED_SCRIM_ALPHA)
    }

    @Test
    @TaskbarMode(TRANSIENT)
    fun testOnTaskbarVisibilityChanged_stashedTaskbarWithBubbles_noScrim() {
        getInstrumentation().runOnMainSync {
            scrimViewController.updateStateForSysuiFlags(SYSUI_STATE_BUBBLES_EXPANDED, true)
            scrimViewController.onTaskbarVisibilityChanged(VISIBLE)
        }
        assertThat(scrimViewController.scrimAlpha).isEqualTo(0)
    }

    @Test
    @TaskbarMode(PINNED)
    fun testOnClick_scrimShown_performsSystemBack() {
        var backPressed = false
        context.applicationContext.putObject(
            SystemUiProxy.INSTANCE,
            object : SystemUiProxy(context) {
                override fun onBackPressed() {
                    backPressed = true
                }
            },
        )

        getInstrumentation().runOnMainSync {
            scrimViewController.updateStateForSysuiFlags(SYSUI_STATE_BUBBLES_EXPANDED, true)
            scrimViewController.onTaskbarVisibilityChanged(VISIBLE)
        }
        assertThat(scrimViewController.scrimView.isClickable).isTrue()

        getInstrumentation().runOnMainSync { scrimViewController.scrimView.performClick() }
        assertThat(backPressed).isTrue()
    }

    @Test
    @TaskbarMode(TRANSIENT)
    fun testOnClick_scrimHidden_notClickable() {
        getInstrumentation().runOnMainSync {
            scrimViewController.updateStateForSysuiFlags(SYSUI_STATE_BUBBLES_EXPANDED, true)
            scrimViewController.onTaskbarVisibilityChanged(VISIBLE)
        }
        assertThat(scrimViewController.scrimView.isClickable).isFalse()
    }
}