diff options
| author | 2024-10-29 09:34:14 +0000 | |
|---|---|---|
| committer | 2024-10-29 15:03:15 +0000 | |
| commit | 55a516012c8f4b3552f44142f41b955dba03ea85 (patch) | |
| tree | 3402683211693e74d64302058989cb96f9a11ee8 | |
| parent | c736ec79a4b0a8d63adb4878f4eb2a84faea79a6 (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
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>() { |