summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Chris Göllner <chrisgollner@google.com> 2024-10-29 09:34:14 +0000
committer Chris Göllner <chrisgollner@google.com> 2024-10-29 15:03:15 +0000
commit55a516012c8f4b3552f44142f41b955dba03ea85 (patch)
tree3402683211693e74d64302058989cb96f9a11ee8
parentc736ec79a4b0a8d63adb4878f4eb2a84faea79a6 (diff)
Provide ScreenDecorations Executor via Dagger
This way the executor can be shared among multiple classes. Test: PrivacyDotViewControllerTest.kt Test: Build & Run Flag: EXEMPT no behavior change Bug: 362720432 Change-Id: I4df2f07915e410de52af06ab402b9a494ecf72e8
-rw-r--r--packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/events/PrivacyDotViewControllerTest.kt18
-rw-r--r--packages/SystemUI/src/com/android/systemui/ScreenDecorations.java17
-rw-r--r--packages/SystemUI/src/com/android/systemui/ScreenDecorationsModule.kt30
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/data/StatusBarDataLayerModule.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotViewController.kt21
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.kt5
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java29
7 files changed, 69 insertions, 53 deletions
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/events/PrivacyDotViewControllerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/events/PrivacyDotViewControllerTest.kt
index 16da3d22f4f7..49a9d0b7303c 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/events/PrivacyDotViewControllerTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/events/PrivacyDotViewControllerTest.kt
@@ -71,15 +71,15 @@ class PrivacyDotViewControllerTest : SysuiTestCase() {
private fun createController() =
PrivacyDotViewControllerImpl(
- executor,
- testScope.backgroundScope,
- statusBarStateController,
- configurationController,
- contentInsetsProvider,
- animationScheduler = mock<SystemStatusAnimationScheduler>(),
- shadeInteractor = null,
- )
- .also { it.setUiExecutor(executor) }
+ executor,
+ testScope.backgroundScope,
+ statusBarStateController,
+ configurationController,
+ contentInsetsProvider,
+ animationScheduler = mock<SystemStatusAnimationScheduler>(),
+ shadeInteractor = null,
+ uiExecutor = executor,
+ )
@Test
fun topMargin_topLeftView_basedOnSeascapeArea() {
diff --git a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java
index 9b5d5b6eadca..46e45aaf8a8a 100644
--- a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java
+++ b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java
@@ -92,7 +92,6 @@ import com.android.systemui.statusbar.commandline.CommandRegistry;
import com.android.systemui.statusbar.events.PrivacyDotViewController;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.util.concurrency.DelayableExecutor;
-import com.android.systemui.util.concurrency.ThreadFactory;
import com.android.systemui.util.kotlin.JavaAdapter;
import com.android.systemui.util.settings.SecureSettings;
@@ -147,7 +146,6 @@ public class ScreenDecorations implements
private CameraAvailabilityListener mCameraListener;
private final UserTracker mUserTracker;
private final PrivacyDotViewController mDotViewController;
- private final ThreadFactory mThreadFactory;
private final DecorProviderFactory mDotFactory;
private final FaceScanningProviderFactory mFaceScanningFactory;
private final CameraProtectionLoader mCameraProtectionLoader;
@@ -172,7 +170,6 @@ public class ScreenDecorations implements
private ViewCaptureAwareWindowManager mWindowManager;
private int mRotation;
private UserSettingObserver mColorInversionSetting;
- @Nullable
private DelayableExecutor mExecutor;
private Handler mHandler;
boolean mPendingConfigChange;
@@ -327,27 +324,28 @@ public class ScreenDecorations implements
}
@Inject
- public ScreenDecorations(Context context,
+ public ScreenDecorations(
+ Context context,
SecureSettings secureSettings,
CommandRegistry commandRegistry,
UserTracker userTracker,
DisplayTracker displayTracker,
PrivacyDotViewController dotViewController,
- ThreadFactory threadFactory,
PrivacyDotDecorProviderFactory dotFactory,
FaceScanningProviderFactory faceScanningFactory,
ScreenDecorationsLogger logger,
FacePropertyRepository facePropertyRepository,
JavaAdapter javaAdapter,
CameraProtectionLoader cameraProtectionLoader,
- ViewCaptureAwareWindowManager viewCaptureAwareWindowManager) {
+ ViewCaptureAwareWindowManager viewCaptureAwareWindowManager,
+ @ScreenDecorationsThread Handler handler,
+ @ScreenDecorationsThread DelayableExecutor executor) {
mContext = context;
mSecureSettings = secureSettings;
mCommandRegistry = commandRegistry;
mUserTracker = userTracker;
mDisplayTracker = displayTracker;
mDotViewController = dotViewController;
- mThreadFactory = threadFactory;
mDotFactory = dotFactory;
mFaceScanningFactory = faceScanningFactory;
mCameraProtectionLoader = cameraProtectionLoader;
@@ -356,6 +354,8 @@ public class ScreenDecorations implements
mFacePropertyRepository = facePropertyRepository;
mJavaAdapter = javaAdapter;
mWindowManager = viewCaptureAwareWindowManager;
+ mHandler = handler;
+ mExecutor = executor;
}
private final ScreenDecorCommand.Callback mScreenDecorCommandCallback = (cmd, pw) -> {
@@ -403,10 +403,7 @@ public class ScreenDecorations implements
Log.i(TAG, "ScreenDecorations is disabled");
return;
}
- mHandler = mThreadFactory.buildHandlerOnNewThread("ScreenDecorations");
- mExecutor = mThreadFactory.buildDelayableExecutorOnHandler(mHandler);
mExecutor.execute(this::startOnScreenDecorationsThread);
- mDotViewController.setUiExecutor(mExecutor);
mCommandRegistry.registerCommand(ScreenDecorCommand.SCREEN_DECOR_CMD_NAME,
() -> new ScreenDecorCommand(mScreenDecorCommandCallback));
}
diff --git a/packages/SystemUI/src/com/android/systemui/ScreenDecorationsModule.kt b/packages/SystemUI/src/com/android/systemui/ScreenDecorationsModule.kt
index 6fc50fb1f460..6786a71e7d4e 100644
--- a/packages/SystemUI/src/com/android/systemui/ScreenDecorationsModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/ScreenDecorationsModule.kt
@@ -17,16 +17,23 @@
package com.android.systemui
import android.content.Context
+import android.os.Handler
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.decor.FaceScanningProviderFactory
import com.android.systemui.decor.FaceScanningProviderFactoryImpl
import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener
+import com.android.systemui.util.concurrency.DelayableExecutor
+import com.android.systemui.util.concurrency.ThreadFactory
import dagger.Binds
import dagger.Module
import dagger.Provides
import dagger.multibindings.ClassKey
import dagger.multibindings.IntoMap
import dagger.multibindings.IntoSet
+import java.util.concurrent.Executor
+import javax.inject.Qualifier
+
+@Qualifier annotation class ScreenDecorationsThread
@Module
interface ScreenDecorationsModule {
@@ -41,6 +48,12 @@ interface ScreenDecorationsModule {
@IntoSet
fun bindScreenDecorationsConfigListener(impl: ScreenDecorations): ConfigurationListener
+ @Binds
+ @ScreenDecorationsThread
+ fun screenDecorationsExecutor(
+ @ScreenDecorationsThread delayableExecutor: DelayableExecutor
+ ): Executor
+
companion object {
@Provides
@SysUISingleton
@@ -50,5 +63,22 @@ interface ScreenDecorationsModule {
): FaceScanningProviderFactory {
return creator.create(context)
}
+
+ @Provides
+ @SysUISingleton
+ @ScreenDecorationsThread
+ fun screenDecorationsHandler(threadFactory: ThreadFactory): Handler {
+ return threadFactory.buildHandlerOnNewThread("ScreenDecorations")
+ }
+
+ @Provides
+ @SysUISingleton
+ @ScreenDecorationsThread
+ fun screenDecorationsDelayableExecutor(
+ @ScreenDecorationsThread handler: Handler,
+ threadFactory: ThreadFactory,
+ ): DelayableExecutor {
+ return threadFactory.buildDelayableExecutorOnHandler(handler)
+ }
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/data/StatusBarDataLayerModule.kt b/packages/SystemUI/src/com/android/systemui/statusbar/data/StatusBarDataLayerModule.kt
index 8a850b0fb199..c416bf7b4f92 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/data/StatusBarDataLayerModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/data/StatusBarDataLayerModule.kt
@@ -16,7 +16,6 @@
package com.android.systemui.statusbar.data
import com.android.systemui.statusbar.data.repository.KeyguardStatusBarRepositoryModule
-import com.android.systemui.statusbar.data.repository.PrivacyDotViewControllerStoreModule
import com.android.systemui.statusbar.data.repository.RemoteInputRepositoryModule
import com.android.systemui.statusbar.data.repository.StatusBarConfigurationControllerModule
import com.android.systemui.statusbar.data.repository.StatusBarContentInsetsProviderStoreModule
@@ -28,7 +27,6 @@ import dagger.Module
includes =
[
KeyguardStatusBarRepositoryModule::class,
- PrivacyDotViewControllerStoreModule::class,
RemoteInputRepositoryModule::class,
StatusBarConfigurationControllerModule::class,
StatusBarContentInsetsProviderStoreModule::class,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotViewController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotViewController.kt
index 914cc50a4a3a..76c109ea6aea 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotViewController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotViewController.kt
@@ -25,7 +25,9 @@ import android.view.View
import android.widget.FrameLayout
import androidx.core.animation.Animator
import com.android.app.animation.Interpolators
+import com.android.app.tracing.coroutines.launchTraced as launch
import com.android.internal.annotations.GuardedBy
+import com.android.systemui.ScreenDecorationsThread
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.dagger.qualifiers.Main
@@ -53,7 +55,6 @@ import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import java.util.concurrent.Executor
import kotlinx.coroutines.CoroutineScope
-import com.android.app.tracing.coroutines.launchTraced as launch
/**
* Understands how to keep the persistent privacy dot in the corner of the screen in
@@ -81,10 +82,6 @@ interface PrivacyDotViewController {
var showingListener: ShowingListener?
- fun setUiExecutor(e: DelayableExecutor)
-
- fun getUiExecutor(): DelayableExecutor?
-
@UiThread fun setNewRotation(rot: Int)
@UiThread fun hideDotView(dot: View, animate: Boolean)
@@ -117,6 +114,7 @@ constructor(
@Assisted private val contentInsetsProvider: StatusBarContentInsetsProvider,
private val animationScheduler: SystemStatusAnimationScheduler,
shadeInteractor: ShadeInteractor?,
+ @ScreenDecorationsThread val uiExecutor: DelayableExecutor,
) : PrivacyDotViewController {
private lateinit var tl: View
private lateinit var tr: View
@@ -136,9 +134,6 @@ constructor(
private val lock = Object()
private var cancelRunnable: Runnable? = null
- // Privacy dots are created in ScreenDecoration's UiThread, which is not the main thread
- private var uiExecutor: DelayableExecutor? = null
-
private val views: Sequence<View>
get() = if (!this::tl.isInitialized) sequenceOf() else sequenceOf(tl, tr, br, bl)
@@ -155,7 +150,7 @@ constructor(
private val configurationListener =
object : ConfigurationController.ConfigurationListener {
override fun onLayoutDirectionChanged(isRtl: Boolean) {
- uiExecutor?.execute {
+ uiExecutor.execute {
// If rtl changed, hide all dots until the next state resolves
setCornerVisibilities(View.INVISIBLE)
@@ -198,14 +193,6 @@ constructor(
stateController.removeCallback(statusBarStateListener)
}
- override fun setUiExecutor(e: DelayableExecutor) {
- uiExecutor = e
- }
-
- override fun getUiExecutor(): DelayableExecutor? {
- return uiExecutor
- }
-
@UiThread
override fun setNewRotation(rot: Int) {
dlog("updateRotation: $rot")
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.kt
index 99f25bd00839..e4a75beca9f9 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.kt
@@ -31,6 +31,7 @@ import com.android.systemui.statusbar.core.StatusBarInitializerImpl
import com.android.systemui.statusbar.core.StatusBarInitializerStore
import com.android.systemui.statusbar.core.StatusBarOrchestrator
import com.android.systemui.statusbar.core.StatusBarSimpleFragment
+import com.android.systemui.statusbar.data.repository.PrivacyDotViewControllerStoreModule
import com.android.systemui.statusbar.data.repository.StatusBarModeRepositoryStore
import com.android.systemui.statusbar.events.PrivacyDotViewControllerModule
import com.android.systemui.statusbar.phone.CentralSurfacesCommandQueueCallbacks
@@ -46,7 +47,9 @@ import dagger.multibindings.IntoMap
import kotlinx.coroutines.CoroutineScope
/** Similar in purpose to [StatusBarModule], but scoped only to phones */
-@Module(includes = [PrivacyDotViewControllerModule::class])
+@Module(
+ includes = [PrivacyDotViewControllerModule::class, PrivacyDotViewControllerStoreModule::class]
+)
interface StatusBarPhoneModule {
@Binds
diff --git a/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java b/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java
index 344d065979f9..0769ada805a2 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java
@@ -104,6 +104,7 @@ import com.android.systemui.settings.FakeDisplayTracker;
import com.android.systemui.settings.UserTracker;
import com.android.systemui.statusbar.commandline.CommandRegistry;
import com.android.systemui.statusbar.events.PrivacyDotViewController;
+import com.android.systemui.util.concurrency.DelayableExecutor;
import com.android.systemui.util.concurrency.FakeExecutor;
import com.android.systemui.util.concurrency.FakeThreadFactory;
import com.android.systemui.util.kotlin.JavaAdapter;
@@ -186,16 +187,17 @@ public class ScreenDecorationsTest extends SysuiTestCase {
private List<DecorProvider> mMockCutoutList;
private final CameraProtectionLoader mCameraProtectionLoader =
new CameraProtectionLoaderImpl(mContext);
+ private Handler mMainHandler;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
- Handler mainHandler = new Handler(TestableLooper.get(this).getLooper());
+ mMainHandler = new Handler(TestableLooper.get(this).getLooper());
mSecureSettings = new FakeSettings();
mExecutor = new FakeExecutor(new FakeSystemClock());
mThreadFactory = new FakeThreadFactory(mExecutor);
- mThreadFactory.setHandler(mainHandler);
+ mThreadFactory.setHandler(mMainHandler);
mWindowManager = mock(WindowManager.class);
WindowMetrics metrics = mContext.getSystemService(WindowManager.class)
@@ -214,26 +216,26 @@ public class ScreenDecorationsTest extends SysuiTestCase {
when(mMockTypedArray.length()).thenReturn(0);
mPrivacyDotTopLeftDecorProvider = spy(new PrivacyDotCornerDecorProviderImpl(
R.id.privacy_dot_top_left_container,
- DisplayCutout.BOUNDS_POSITION_TOP,
- DisplayCutout.BOUNDS_POSITION_LEFT,
+ BOUNDS_POSITION_TOP,
+ BOUNDS_POSITION_LEFT,
R.layout.privacy_dot_top_left));
mPrivacyDotTopRightDecorProvider = spy(new PrivacyDotCornerDecorProviderImpl(
R.id.privacy_dot_top_right_container,
- DisplayCutout.BOUNDS_POSITION_TOP,
- DisplayCutout.BOUNDS_POSITION_RIGHT,
+ BOUNDS_POSITION_TOP,
+ BOUNDS_POSITION_RIGHT,
R.layout.privacy_dot_top_right));
mPrivacyDotBottomLeftDecorProvider = spy(new PrivacyDotCornerDecorProviderImpl(
R.id.privacy_dot_bottom_left_container,
- DisplayCutout.BOUNDS_POSITION_BOTTOM,
- DisplayCutout.BOUNDS_POSITION_LEFT,
+ BOUNDS_POSITION_BOTTOM,
+ BOUNDS_POSITION_LEFT,
R.layout.privacy_dot_bottom_left));
mPrivacyDotBottomRightDecorProvider = spy(new PrivacyDotCornerDecorProviderImpl(
R.id.privacy_dot_bottom_right_container,
- DisplayCutout.BOUNDS_POSITION_BOTTOM,
- DisplayCutout.BOUNDS_POSITION_RIGHT,
+ BOUNDS_POSITION_BOTTOM,
+ BOUNDS_POSITION_RIGHT,
R.layout.privacy_dot_bottom_right));
// Default no cutout
@@ -256,11 +258,10 @@ public class ScreenDecorationsTest extends SysuiTestCase {
mLazyViewCapture, false);
mScreenDecorations = spy(new ScreenDecorations(mContext, mSecureSettings,
mCommandRegistry, mUserTracker, mDisplayTracker, mDotViewController,
- mThreadFactory,
mPrivacyDotDecorProviderFactory, mFaceScanningProviderFactory,
new ScreenDecorationsLogger(logcatLogBuffer("TestLogBuffer")),
mFakeFacePropertyRepository, mJavaAdapter, mCameraProtectionLoader,
- mViewCaptureAwareWindowManager) {
+ mViewCaptureAwareWindowManager, mMainHandler, mExecutor) {
@Override
public void start() {
super.start();
@@ -1272,10 +1273,10 @@ public class ScreenDecorationsTest extends SysuiTestCase {
ScreenDecorations screenDecorations = new ScreenDecorations(mContext,
mSecureSettings, mCommandRegistry, mUserTracker, mDisplayTracker,
mDotViewController,
- mThreadFactory, mPrivacyDotDecorProviderFactory, mFaceScanningProviderFactory,
+ mPrivacyDotDecorProviderFactory, mFaceScanningProviderFactory,
new ScreenDecorationsLogger(logcatLogBuffer("TestLogBuffer")),
mFakeFacePropertyRepository, mJavaAdapter, mCameraProtectionLoader,
- mViewCaptureAwareWindowManager);
+ mViewCaptureAwareWindowManager, mMainHandler, mExecutor);
screenDecorations.start();
when(mContext.getDisplay()).thenReturn(mDisplay);
when(mDisplay.getDisplayInfo(any())).thenAnswer(new Answer<Boolean>() {