Merge "[Dagger] Make SystemUiProxy provided by DaggerSingletonObject" into main

This commit is contained in:
Treehugger Robot
2024-10-29 21:57:58 +00:00
committed by Android (Google) Code Review
6 changed files with 93 additions and 53 deletions
@@ -54,15 +54,16 @@ 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;
import com.android.internal.util.ScreenshotRequest;
import com.android.internal.view.AppearanceRegion;
import com.android.launcher3.util.MainThreadInitializedObject;
import com.android.launcher3.dagger.ApplicationContext;
import com.android.launcher3.dagger.LauncherAppSingleton;
import com.android.launcher3.util.DaggerSingletonObject;
import com.android.launcher3.util.Preconditions;
import com.android.launcher3.util.SafeCloseable;
import com.android.quickstep.dagger.QuickstepBaseAppComponent;
import com.android.quickstep.util.ActiveGestureProtoLogProxy;
import com.android.quickstep.util.ContextualSearchInvoker;
import com.android.quickstep.util.unfold.ProxyUnfoldTransitionProvider;
@@ -109,14 +110,17 @@ import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;
import javax.inject.Inject;
/**
* Holds the reference to SystemUI.
*/
public class SystemUiProxy implements ISystemUiProxy, NavHandle, SafeCloseable {
@LauncherAppSingleton
public class SystemUiProxy implements ISystemUiProxy, NavHandle {
private static final String TAG = "SystemUiProxy";
public static final MainThreadInitializedObject<SystemUiProxy> INSTANCE =
new MainThreadInitializedObject<>(SystemUiProxy::new);
public static final DaggerSingletonObject<SystemUiProxy> INSTANCE =
new DaggerSingletonObject<>(QuickstepBaseAppComponent::getSystemUiProxy);
private static final int MSG_SET_SHELF_HEIGHT = 1;
private static final int MSG_SET_LAUNCHER_KEEP_CLEAR_AREA_HEIGHT = 2;
@@ -188,8 +192,8 @@ public class SystemUiProxy implements ISystemUiProxy, NavHandle, SafeCloseable {
@Nullable
private final ProxyUnfoldTransitionProvider mUnfoldTransitionProvider;
@VisibleForTesting
protected SystemUiProxy(Context context) {
@Inject
public SystemUiProxy(@ApplicationContext Context context) {
mContext = context;
mAsyncHandler = new Handler(UI_HELPER_EXECUTOR.getLooper(), this::handleMessageAsync);
final Intent baseIntent = new Intent().setPackage(mContext.getPackageName());
@@ -205,9 +209,6 @@ public class SystemUiProxy implements ISystemUiProxy, NavHandle, SafeCloseable {
? new ProxyUnfoldTransitionProvider() : null;
}
@Override
public void close() { }
@Override
public void onBackPressed() {
if (mSystemUiProxy != null) {
@@ -19,6 +19,7 @@ package com.android.quickstep.dagger;
import com.android.launcher3.dagger.LauncherAppComponent;
import com.android.launcher3.dagger.LauncherBaseAppComponent;
import com.android.launcher3.model.WellbeingModel;
import com.android.quickstep.SystemUiProxy;
import com.android.quickstep.util.AsyncClockEventDelegate;
/**
@@ -34,4 +35,6 @@ public interface QuickstepBaseAppComponent extends LauncherBaseAppComponent {
WellbeingModel getWellbeingModel();
AsyncClockEventDelegate getAsyncClockEventDelegate();
SystemUiProxy getSystemUiProxy();
}
@@ -24,6 +24,7 @@ import com.android.launcher3.taskbar.TaskbarAutohideSuspendController.FLAG_AUTOH
import com.android.launcher3.taskbar.rules.TaskbarModeRule
import com.android.launcher3.taskbar.rules.TaskbarModeRule.Mode.TRANSIENT
import com.android.launcher3.taskbar.rules.TaskbarModeRule.TaskbarMode
import com.android.launcher3.taskbar.rules.TaskbarSandboxComponent
import com.android.launcher3.taskbar.rules.TaskbarUnitTestRule
import com.android.launcher3.taskbar.rules.TaskbarUnitTestRule.InjectController
import com.android.launcher3.taskbar.rules.TaskbarWindowSandboxContext
@@ -33,36 +34,28 @@ import com.android.quickstep.SystemUiProxy
import com.google.common.truth.Truth.assertThat
import org.junit.Rule
import org.junit.Test
import org.junit.rules.TestRule
import org.junit.runner.RunWith
import org.junit.runners.model.Statement
@RunWith(LauncherMultivalentJUnit::class)
@EmulatedDevices(["pixelTablet2023"])
class TaskbarAutohideSuspendControllerTest {
@get:Rule(order = 0) val context = TaskbarWindowSandboxContext.create()
@get:Rule(order = 1) val animatorTestRule = AnimatorTestRule(this)
@get:Rule(order = 2)
val systemUiProxyRule = TestRule { base, _ ->
object : Statement() {
override fun evaluate() {
getInstrumentation().runOnMainSync {
context.putObject(
SystemUiProxy.INSTANCE,
object : SystemUiProxy(context) {
override fun notifyTaskbarAutohideSuspend(suspend: Boolean) {
latestSuspendNotification = suspend
}
},
)
@get:Rule(order = 0)
val context =
TaskbarWindowSandboxContext.create {
builder: TaskbarSandboxComponent.Builder,
sandboxContext: TaskbarWindowSandboxContext ->
builder.bindSystemUiProxy(
object : SystemUiProxy(sandboxContext) {
override fun notifyTaskbarAutohideSuspend(suspend: Boolean) {
latestSuspendNotification = suspend
}
}
base.evaluate()
}
)
}
}
@get:Rule(order = 3) val taskbarModeRule = TaskbarModeRule(context)
@get:Rule(order = 4) val taskbarUnitTestRule = TaskbarUnitTestRule(this, context)
@get:Rule(order = 1) val animatorTestRule = AnimatorTestRule(this)
@get:Rule(order = 2) val taskbarModeRule = TaskbarModeRule(context)
@get:Rule(order = 3) val taskbarUnitTestRule = TaskbarUnitTestRule(this, context)
@InjectController lateinit var autohideSuspendController: TaskbarAutohideSuspendController
@InjectController lateinit var stashController: TaskbarStashController
@@ -24,6 +24,7 @@ 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.TaskbarSandboxComponent
import com.android.launcher3.taskbar.rules.TaskbarUnitTestRule
import com.android.launcher3.taskbar.rules.TaskbarUnitTestRule.InjectController
import com.android.launcher3.taskbar.rules.TaskbarWindowSandboxContext
@@ -42,7 +43,20 @@ import org.junit.runner.RunWith
@RunWith(LauncherMultivalentJUnit::class)
@EmulatedDevices(["pixelTablet2023"])
class TaskbarScrimViewControllerTest {
@get:Rule(order = 0) val context = TaskbarWindowSandboxContext.create()
@get:Rule(order = 0)
val context =
TaskbarWindowSandboxContext.create {
builder: TaskbarSandboxComponent.Builder,
sandboxContext: TaskbarWindowSandboxContext ->
builder.bindSystemUiProxy(
object : SystemUiProxy(sandboxContext) {
override fun onBackPressed() {
super.onBackPressed()
backPressed = true
}
}
)
}
@get:Rule(order = 1) val taskbarModeRule = TaskbarModeRule(context)
@get:Rule(order = 2) val animatorTestRule = AnimatorTestRule(this)
@get:Rule(order = 3) val taskbarUnitTestRule = TaskbarUnitTestRule(this, context)
@@ -53,6 +67,8 @@ class TaskbarScrimViewControllerTest {
private val animationDuration =
context.resources.getInteger(android.R.integer.config_mediumAnimTime).toLong()
private var backPressed = false
@Test
@TaskbarMode(PINNED)
fun testOnTaskbarVisibleChanged_onlyTaskbarVisible_noScrim() {
@@ -130,16 +146,6 @@ class TaskbarScrimViewControllerTest {
@Test
@TaskbarMode(PINNED)
fun testOnClick_scrimShown_performsSystemBack() {
var backPressed = false
context.putObject(
SystemUiProxy.INSTANCE,
object : SystemUiProxy(context) {
override fun onBackPressed() {
backPressed = true
}
},
)
getInstrumentation().runOnMainSync {
scrimViewController.updateStateForSysuiFlags(SYSUI_STATE_BUBBLES_EXPANDED, true)
scrimViewController.onTaskbarVisibilityChanged(VISIBLE)
@@ -24,8 +24,13 @@ import android.view.Display.DEFAULT_DISPLAY
import androidx.test.core.app.ApplicationProvider
import com.android.launcher3.FakeLauncherPrefs
import com.android.launcher3.LauncherPrefs
import com.android.launcher3.dagger.LauncherAppComponent
import com.android.launcher3.dagger.LauncherAppSingleton
import com.android.launcher3.util.MainThreadInitializedObject.ObjectSandbox
import com.android.launcher3.util.SandboxApplication
import com.android.quickstep.SystemUiProxy
import dagger.BindsInstance
import dagger.Component
import org.junit.rules.ExternalResource
import org.junit.rules.RuleChain
import org.junit.rules.TestRule
@@ -50,7 +55,14 @@ private constructor(base: SandboxApplication, val virtualDisplay: VirtualDisplay
private const val VIRTUAL_DISPLAY_NAME = "TaskbarSandboxDisplay"
/** Creates a [SandboxApplication] for Taskbar tests. */
fun create(): TaskbarWindowSandboxContext {
fun create(
daggerComponentBinder:
((
builder: TaskbarSandboxComponent.Builder,
sandboxContext: TaskbarWindowSandboxContext,
) -> TaskbarSandboxComponent.Builder)? =
null
): TaskbarWindowSandboxContext {
val base = ApplicationProvider.getApplicationContext<Context>()
val displayManager = checkNotNull(base.getSystemService(DisplayManager::class.java))
@@ -67,10 +79,21 @@ private constructor(base: SandboxApplication, val virtualDisplay: VirtualDisplay
)
}
return TaskbarWindowSandboxContext(
SandboxApplication(base.createDisplayContext(virtualDisplay.display)),
virtualDisplay,
)
val sandboxApplication =
SandboxApplication(base.createDisplayContext(virtualDisplay.display))
val taskbarWindowSandboxContext =
TaskbarWindowSandboxContext(sandboxApplication, virtualDisplay)
if (daggerComponentBinder != null) {
sandboxApplication.initDaggerComponent(
daggerComponentBinder(
DaggerTaskbarSandboxComponent.builder(),
taskbarWindowSandboxContext,
)
)
}
return taskbarWindowSandboxContext
}
}
}
@@ -80,3 +103,14 @@ private fun virtualDisplayRule(virtualDisplay: VirtualDisplay): TestRule {
override fun after() = virtualDisplay.release()
}
}
@LauncherAppSingleton
@Component
interface TaskbarSandboxComponent : LauncherAppComponent {
@Component.Builder
interface Builder : LauncherAppComponent.Builder {
@BindsInstance fun bindSystemUiProxy(proxy: SystemUiProxy): Builder
override fun build(): TaskbarSandboxComponent
}
}
@@ -20,6 +20,7 @@ import android.graphics.PointF
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.launcher3.R
import com.android.launcher3.taskbar.rules.DaggerTaskbarSandboxComponent
import com.android.launcher3.util.LauncherModelHelper
import com.android.systemui.contextualeducation.GestureType
import com.android.systemui.shared.system.InputConsumerController
@@ -58,7 +59,9 @@ class LauncherSwipeHandlerV2Test {
@Before
fun setup() {
sandboxContext.putObject(SystemUiProxy.INSTANCE, systemUiProxy)
sandboxContext.initDaggerComponent(
DaggerTaskbarSandboxComponent.builder().bindSystemUiProxy(systemUiProxy)
)
val deviceState = mock(RecentsAnimationDeviceState::class.java)
whenever(deviceState.rotationTouchHelper).thenReturn(mock(RotationTouchHelper::class.java))
gestureState = spy(GestureState(OverviewComponentObserver(sandboxContext, deviceState), 0))
@@ -71,7 +74,7 @@ class LauncherSwipeHandlerV2Test {
gestureState,
0,
false,
inputConsumerController
inputConsumerController,
)
underTest.onGestureStarted(/* isLikelyToStartNewTask= */ false)
}
@@ -83,7 +86,7 @@ class LauncherSwipeHandlerV2Test {
verify(systemUiProxy)
.updateContextualEduStats(
/* isTrackpadGesture= */ eq(true),
eq(GestureType.HOME.toString())
eq(GestureType.HOME.toString()),
)
}
@@ -93,7 +96,7 @@ class LauncherSwipeHandlerV2Test {
verify(systemUiProxy)
.updateContextualEduStats(
/* isTrackpadGesture= */ eq(false),
eq(GestureType.HOME.toString())
eq(GestureType.HOME.toString()),
)
}
}