diff options
| author | 2024-10-16 10:09:24 +0100 | |
|---|---|---|
| committer | 2024-10-16 15:44:03 +0100 | |
| commit | 507feae5e8e1d908a05af50a2fb69932becbc9d2 (patch) | |
| tree | a3cef84a8f733e178830c89a9eb1c285846a37a0 | |
| parent | 9e39ccc6feca20081492cbe837dd50ff142285b4 (diff) | |
Prepare StatusBarContentInsetsProvider for multi display
Turn it into an AssistedInject class, so that we can create one per
display, with the correct per display properties.
Test: Build and run
Test: StatusBarContentInsetsProviderTest
Flag: EXEMPT no behavior change
Bug: 373799109
Change-Id: I6183a6c05f56c64c74c1c62c0e1e4067f02bf064
3 files changed, 178 insertions, 130 deletions
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/StatusBarContentInsetsProviderTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/StatusBarContentInsetsProviderTest.kt index c804fc6990ae..ba5fb7f8df00 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/StatusBarContentInsetsProviderTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/StatusBarContentInsetsProviderTest.kt @@ -98,7 +98,7 @@ class StatusBarContentInsetsProviderTest : SysuiTestCase() { isRtl, dotWidth, BOTTOM_ALIGNED_MARGIN_NONE, - statusBarContentHeight + statusBarContentHeight, ) var chipBounds = getPrivacyChipBoundingRectForInsets(bounds, dotWidth, chipWidth, isRtl) @@ -135,7 +135,7 @@ class StatusBarContentInsetsProviderTest : SysuiTestCase() { isRtl, dotWidth, BOTTOM_ALIGNED_MARGIN_NONE, - statusBarContentHeight + statusBarContentHeight, ) chipBounds = getPrivacyChipBoundingRectForInsets(bounds, dotWidth, chipWidth, isRtl) @@ -164,8 +164,7 @@ class StatusBarContentInsetsProviderTest : SysuiTestCase() { val chipWidth = 30 val dotWidth = 10 val isRtl = false - val contentRect = - Rect(/* left = */ 0, /* top = */ 10, /* right = */ 1000, /* bottom = */ 100) + val contentRect = Rect(/* left= */ 0, /* top= */ 10, /* right= */ 1000, /* bottom= */ 100) val chipBounds = getPrivacyChipBoundingRectForInsets(contentRect, dotWidth, chipWidth, isRtl) @@ -207,7 +206,7 @@ class StatusBarContentInsetsProviderTest : SysuiTestCase() { isRtl, dotWidth, BOTTOM_ALIGNED_MARGIN_NONE, - statusBarContentHeight + statusBarContentHeight, ) assertRects(expectedBounds, bounds, currentRotation, targetRotation) @@ -228,7 +227,7 @@ class StatusBarContentInsetsProviderTest : SysuiTestCase() { isRtl, dotWidth, BOTTOM_ALIGNED_MARGIN_NONE, - statusBarContentHeight + statusBarContentHeight, ) assertRects(expectedBounds, bounds, currentRotation, targetRotation) @@ -251,7 +250,7 @@ class StatusBarContentInsetsProviderTest : SysuiTestCase() { isRtl, dotWidth, BOTTOM_ALIGNED_MARGIN_NONE, - statusBarContentHeight + statusBarContentHeight, ) assertRects(expectedBounds, bounds, currentRotation, targetRotation) @@ -263,7 +262,7 @@ class StatusBarContentInsetsProviderTest : SysuiTestCase() { minLeftPadding, 0, screenBounds.height() - dcBounds.height() - dotWidth, - sbHeightLandscape + sbHeightLandscape, ) bounds = @@ -278,7 +277,7 @@ class StatusBarContentInsetsProviderTest : SysuiTestCase() { isRtl, dotWidth, BOTTOM_ALIGNED_MARGIN_NONE, - statusBarContentHeight + statusBarContentHeight, ) assertRects(expectedBounds, bounds, currentRotation, targetRotation) @@ -320,7 +319,7 @@ class StatusBarContentInsetsProviderTest : SysuiTestCase() { isRtl, dotWidth, BOTTOM_ALIGNED_MARGIN_NONE, - statusBarContentHeight + statusBarContentHeight, ) assertRects(expectedBounds, bounds, currentRotation, targetRotation) @@ -331,7 +330,7 @@ class StatusBarContentInsetsProviderTest : SysuiTestCase() { protectionBounds.bottom, 0, screenBounds.height() - minRightPadding, - sbHeightLandscape + sbHeightLandscape, ) bounds = @@ -346,7 +345,7 @@ class StatusBarContentInsetsProviderTest : SysuiTestCase() { isRtl, dotWidth, BOTTOM_ALIGNED_MARGIN_NONE, - statusBarContentHeight + statusBarContentHeight, ) assertRects(expectedBounds, bounds, currentRotation, targetRotation) @@ -369,7 +368,7 @@ class StatusBarContentInsetsProviderTest : SysuiTestCase() { isRtl, dotWidth, BOTTOM_ALIGNED_MARGIN_NONE, - statusBarContentHeight + statusBarContentHeight, ) assertRects(expectedBounds, bounds, currentRotation, targetRotation) @@ -381,7 +380,7 @@ class StatusBarContentInsetsProviderTest : SysuiTestCase() { minLeftPadding, 0, screenBounds.height() - protectionBounds.bottom - dotWidth, - sbHeightLandscape + sbHeightLandscape, ) bounds = @@ -396,7 +395,7 @@ class StatusBarContentInsetsProviderTest : SysuiTestCase() { isRtl, dotWidth, BOTTOM_ALIGNED_MARGIN_NONE, - statusBarContentHeight + statusBarContentHeight, ) assertRects(expectedBounds, bounds, currentRotation, targetRotation) @@ -415,7 +414,7 @@ class StatusBarContentInsetsProviderTest : SysuiTestCase() { left = screenBounds.right - dcWidth, top = 0, right = screenBounds.right, - bottom = dcHeight + bottom = dcHeight, ) val dcBoundsLandscape = Rect(left = 0, top = 0, right = dcHeight, bottom = dcWidth) val dcBoundsSeascape = @@ -423,14 +422,14 @@ class StatusBarContentInsetsProviderTest : SysuiTestCase() { left = screenBounds.right - dcHeight, top = screenBounds.bottom - dcWidth, right = screenBounds.right - dcHeight, - bottom = screenBounds.bottom - dcWidth + bottom = screenBounds.bottom - dcWidth, ) val dcBoundsUpsideDown = Rect( left = 0, top = screenBounds.bottom - dcHeight, right = dcWidth, - bottom = screenBounds.bottom - dcHeight + bottom = screenBounds.bottom - dcHeight, ) val minLeftPadding = 20 val minRightPadding = 20 @@ -448,7 +447,7 @@ class StatusBarContentInsetsProviderTest : SysuiTestCase() { left = minLeftPadding, top = 0, right = dcBoundsPortrait.left - dotWidth, - bottom = sbHeightPortrait + bottom = sbHeightPortrait, ) var bounds = @@ -463,7 +462,7 @@ class StatusBarContentInsetsProviderTest : SysuiTestCase() { isRtl, dotWidth, BOTTOM_ALIGNED_MARGIN_NONE, - statusBarContentHeight + statusBarContentHeight, ) assertRects(expectedBounds, bounds, currentRotation, targetRotation) @@ -475,7 +474,7 @@ class StatusBarContentInsetsProviderTest : SysuiTestCase() { left = dcBoundsLandscape.height(), top = 0, right = screenBounds.height() - minRightPadding, - bottom = sbHeightLandscape + bottom = sbHeightLandscape, ) bounds = @@ -490,7 +489,7 @@ class StatusBarContentInsetsProviderTest : SysuiTestCase() { isRtl, dotWidth, BOTTOM_ALIGNED_MARGIN_NONE, - statusBarContentHeight + statusBarContentHeight, ) assertRects(expectedBounds, bounds, currentRotation, targetRotation) @@ -502,7 +501,7 @@ class StatusBarContentInsetsProviderTest : SysuiTestCase() { left = minLeftPadding, top = 0, right = screenBounds.width() - minRightPadding, - bottom = sbHeightPortrait + bottom = sbHeightPortrait, ) bounds = @@ -517,7 +516,7 @@ class StatusBarContentInsetsProviderTest : SysuiTestCase() { isRtl, dotWidth, BOTTOM_ALIGNED_MARGIN_NONE, - statusBarContentHeight + statusBarContentHeight, ) assertRects(expectedBounds, bounds, currentRotation, targetRotation) @@ -529,7 +528,7 @@ class StatusBarContentInsetsProviderTest : SysuiTestCase() { left = minLeftPadding, top = 0, right = screenBounds.height() - minRightPadding, - bottom = sbHeightLandscape + bottom = sbHeightLandscape, ) bounds = @@ -544,7 +543,7 @@ class StatusBarContentInsetsProviderTest : SysuiTestCase() { isRtl, dotWidth, BOTTOM_ALIGNED_MARGIN_NONE, - statusBarContentHeight + statusBarContentHeight, ) assertRects(expectedBounds, bounds, currentRotation, targetRotation) @@ -584,7 +583,7 @@ class StatusBarContentInsetsProviderTest : SysuiTestCase() { isRtl, dotWidth, BOTTOM_ALIGNED_MARGIN_NONE, - statusBarContentHeight + statusBarContentHeight, ) assertRects(expectedBounds, bounds, currentRotation, targetRotation) @@ -595,7 +594,7 @@ class StatusBarContentInsetsProviderTest : SysuiTestCase() { protectionBounds.bottom, 0, screenBounds.height() - minRightPadding, - sbHeightLandscape + sbHeightLandscape, ) bounds = @@ -610,7 +609,7 @@ class StatusBarContentInsetsProviderTest : SysuiTestCase() { isRtl, dotWidth, BOTTOM_ALIGNED_MARGIN_NONE, - statusBarContentHeight + statusBarContentHeight, ) assertRects(expectedBounds, bounds, currentRotation, targetRotation) @@ -633,7 +632,7 @@ class StatusBarContentInsetsProviderTest : SysuiTestCase() { isRtl, dotWidth, BOTTOM_ALIGNED_MARGIN_NONE, - statusBarContentHeight + statusBarContentHeight, ) assertRects(expectedBounds, bounds, currentRotation, targetRotation) @@ -645,7 +644,7 @@ class StatusBarContentInsetsProviderTest : SysuiTestCase() { minLeftPadding, 0, screenBounds.height() - protectionBounds.bottom - dotWidth, - sbHeightLandscape + sbHeightLandscape, ) bounds = @@ -660,7 +659,7 @@ class StatusBarContentInsetsProviderTest : SysuiTestCase() { isRtl, dotWidth, BOTTOM_ALIGNED_MARGIN_NONE, - statusBarContentHeight + statusBarContentHeight, ) assertRects(expectedBounds, bounds, currentRotation, targetRotation) @@ -682,7 +681,7 @@ class StatusBarContentInsetsProviderTest : SysuiTestCase() { isRtl = false, dotWidth = 10, bottomAlignedMargin = BOTTOM_ALIGNED_MARGIN_NONE, - statusBarContentHeight = 15 + statusBarContentHeight = 15, ) assertThat(bounds.top).isEqualTo(0) @@ -704,7 +703,7 @@ class StatusBarContentInsetsProviderTest : SysuiTestCase() { isRtl = false, dotWidth = 10, bottomAlignedMargin = 5, - statusBarContentHeight = 15 + statusBarContentHeight = 15, ) // Content in the status bar is centered vertically. To achieve the bottom margin we want, @@ -756,7 +755,7 @@ class StatusBarContentInsetsProviderTest : SysuiTestCase() { isRtl, dotWidth, BOTTOM_ALIGNED_MARGIN_NONE, - statusBarContentHeight + statusBarContentHeight, ) assertRects(expectedBounds, bounds, currentRotation, targetRotation) @@ -777,7 +776,7 @@ class StatusBarContentInsetsProviderTest : SysuiTestCase() { isRtl, dotWidth, BOTTOM_ALIGNED_MARGIN_NONE, - statusBarContentHeight + statusBarContentHeight, ) assertRects(expectedBounds, bounds, currentRotation, targetRotation) @@ -798,7 +797,7 @@ class StatusBarContentInsetsProviderTest : SysuiTestCase() { isRtl, dotWidth, BOTTOM_ALIGNED_MARGIN_NONE, - statusBarContentHeight + statusBarContentHeight, ) assertRects(expectedBounds, bounds, currentRotation, targetRotation) @@ -809,7 +808,7 @@ class StatusBarContentInsetsProviderTest : SysuiTestCase() { minLeftPadding, 0, screenBounds.height() - dcBounds.height() - dotWidth, - sbHeightLandscape + sbHeightLandscape, ) bounds = @@ -824,7 +823,7 @@ class StatusBarContentInsetsProviderTest : SysuiTestCase() { isRtl, dotWidth, BOTTOM_ALIGNED_MARGIN_NONE, - statusBarContentHeight + statusBarContentHeight, ) assertRects(expectedBounds, bounds, currentRotation, targetRotation) @@ -860,7 +859,7 @@ class StatusBarContentInsetsProviderTest : SysuiTestCase() { isRtl, dotWidth, BOTTOM_ALIGNED_MARGIN_NONE, - statusBarContentHeight + statusBarContentHeight, ) assertRects(expectedBounds, bounds, currentRotation, targetRotation) @@ -880,7 +879,7 @@ class StatusBarContentInsetsProviderTest : SysuiTestCase() { isRtl, dotWidth, BOTTOM_ALIGNED_MARGIN_NONE, - statusBarContentHeight + statusBarContentHeight, ) assertRects(expectedBounds, bounds, currentRotation, targetRotation) @@ -900,7 +899,7 @@ class StatusBarContentInsetsProviderTest : SysuiTestCase() { isRtl, dotWidth, BOTTOM_ALIGNED_MARGIN_NONE, - statusBarContentHeight + statusBarContentHeight, ) assertRects(expectedBounds, bounds, currentRotation, targetRotation) @@ -920,7 +919,7 @@ class StatusBarContentInsetsProviderTest : SysuiTestCase() { isRtl, dotWidth, BOTTOM_ALIGNED_MARGIN_NONE, - statusBarContentHeight + statusBarContentHeight, ) assertRects(expectedBounds, bounds, currentRotation, targetRotation) } @@ -958,7 +957,7 @@ class StatusBarContentInsetsProviderTest : SysuiTestCase() { isRtl, dotWidth, BOTTOM_ALIGNED_MARGIN_NONE, - statusBarContentHeight + statusBarContentHeight, ) assertRects(expectedBounds, bounds, currentRotation, targetRotation) @@ -968,12 +967,12 @@ class StatusBarContentInsetsProviderTest : SysuiTestCase() { fun testDisplayChanged_returnsUpdatedInsets() { // GIVEN: get insets on the first display and switch to the second display val provider = - StatusBarContentInsetsProvider( + StatusBarContentInsetsProviderImpl( contextMock, configurationController, mock<DumpManager>(), mock<CommandRegistry>(), - mock<SysUICutoutProvider>() + mock<SysUICutoutProvider>(), ) configuration.windowConfiguration.setMaxBounds(Rect(0, 0, 1080, 2160)) @@ -993,12 +992,12 @@ class StatusBarContentInsetsProviderTest : SysuiTestCase() { // GIVEN: get insets on the first display, switch to the second display, // get insets and switch back val provider = - StatusBarContentInsetsProvider( + StatusBarContentInsetsProviderImpl( contextMock, configurationController, mock<DumpManager>(), mock<CommandRegistry>(), - mock<SysUICutoutProvider>() + mock<SysUICutoutProvider>(), ) configuration.windowConfiguration.setMaxBounds(Rect(0, 0, 1080, 2160)) @@ -1024,12 +1023,12 @@ class StatusBarContentInsetsProviderTest : SysuiTestCase() { configuration.windowConfiguration.setMaxBounds(0, 0, 100, 100) configurationController.onConfigurationChanged(configuration) val provider = - StatusBarContentInsetsProvider( + StatusBarContentInsetsProviderImpl( contextMock, configurationController, mock<DumpManager>(), mock<CommandRegistry>(), - mock<SysUICutoutProvider>() + mock<SysUICutoutProvider>(), ) val listener = object : StatusBarContentInsetsChangedListener { @@ -1053,12 +1052,12 @@ class StatusBarContentInsetsProviderTest : SysuiTestCase() { fun onDensityOrFontScaleChanged_listenerNotified() { configuration.densityDpi = 12 val provider = - StatusBarContentInsetsProvider( + StatusBarContentInsetsProviderImpl( contextMock, configurationController, mock<DumpManager>(), mock<CommandRegistry>(), - mock<SysUICutoutProvider>() + mock<SysUICutoutProvider>(), ) val listener = object : StatusBarContentInsetsChangedListener { @@ -1081,12 +1080,12 @@ class StatusBarContentInsetsProviderTest : SysuiTestCase() { @Test fun onThemeChanged_listenerNotified() { val provider = - StatusBarContentInsetsProvider( + StatusBarContentInsetsProviderImpl( contextMock, configurationController, mock<DumpManager>(), mock<CommandRegistry>(), - mock<SysUICutoutProvider>() + mock<SysUICutoutProvider>(), ) val listener = object : StatusBarContentInsetsChangedListener { @@ -1108,13 +1107,13 @@ class StatusBarContentInsetsProviderTest : SysuiTestCase() { expected: Rect, actual: Rect, @Rotation currentRotation: Int, - @Rotation targetRotation: Int + @Rotation targetRotation: Int, ) { assertTrue( "Rects must match. currentRotation=${RotationUtils.toString(currentRotation)}" + " targetRotation=${RotationUtils.toString(targetRotation)}" + " expected=$expected actual=$actual", - expected.equals(actual) + expected.equals(actual), ) } @@ -1126,7 +1125,7 @@ class StatusBarContentInsetsProviderTest : SysuiTestCase() { left: Rect = Rect(), top: Rect = Rect(), right: Rect = Rect(), - bottom: Rect = Rect() + bottom: Rect = Rect(), ) { whenever(dc.boundingRects) .thenReturn(listOf(left, top, right, bottom).filter { !it.isEmpty }) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StatusBarModule.kt b/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StatusBarModule.kt index 5aad11fe1034..f6f4503b210a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StatusBarModule.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/dagger/StatusBarModule.kt @@ -17,17 +17,20 @@ package com.android.systemui.statusbar.dagger import android.content.Context -import com.android.app.viewcapture.ViewCaptureAwareWindowManager import com.android.systemui.CoreStartable +import com.android.systemui.SysUICutoutProvider import com.android.systemui.dagger.SysUISingleton import com.android.systemui.log.LogBuffer import com.android.systemui.log.LogBufferFactory import com.android.systemui.statusbar.core.StatusBarConnectedDisplays import com.android.systemui.statusbar.data.StatusBarDataLayerModule import com.android.systemui.statusbar.phone.LightBarController +import com.android.systemui.statusbar.phone.StatusBarContentInsetsProvider +import com.android.systemui.statusbar.phone.StatusBarContentInsetsProviderImpl import com.android.systemui.statusbar.phone.StatusBarSignalPolicy import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallLog +import com.android.systemui.statusbar.policy.ConfigurationController import com.android.systemui.statusbar.ui.SystemBarUtilsProxyImpl import com.android.systemui.statusbar.window.MultiDisplayStatusBarWindowControllerStore import com.android.systemui.statusbar.window.SingleDisplayStatusBarWindowControllerStore @@ -108,5 +111,16 @@ abstract class StatusBarModule { fun provideOngoingCallLogBuffer(factory: LogBufferFactory): LogBuffer { return factory.create("OngoingCall", 75) } + + @Provides + @SysUISingleton + fun contentInsetsProvider( + factory: StatusBarContentInsetsProviderImpl.Factory, + context: Context, + configurationController: ConfigurationController, + sysUICutoutProvider: SysUICutoutProvider, + ): StatusBarContentInsetsProvider { + return factory.create(context, configurationController, sysUICutoutProvider) + } } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarContentInsetsProvider.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarContentInsetsProvider.kt index 613efaa148f5..c6f6bd90fce6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarContentInsetsProvider.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarContentInsetsProvider.kt @@ -34,10 +34,10 @@ import com.android.systemui.Dumpable import com.android.systemui.StatusBarInsetsCommand import com.android.systemui.SysUICutoutInformation import com.android.systemui.SysUICutoutProvider -import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dump.DumpManager import com.android.systemui.res.R import com.android.systemui.statusbar.commandline.CommandRegistry +import com.android.systemui.statusbar.phone.StatusBarContentInsetsProviderImpl.CacheKey import com.android.systemui.statusbar.policy.CallbackController import com.android.systemui.statusbar.policy.ConfigurationController import com.android.systemui.util.leak.RotationUtils.ROTATION_LANDSCAPE @@ -47,9 +47,11 @@ import com.android.systemui.util.leak.RotationUtils.ROTATION_UPSIDE_DOWN import com.android.systemui.util.leak.RotationUtils.Rotation import com.android.systemui.util.leak.RotationUtils.getExactRotation import com.android.systemui.util.leak.RotationUtils.getResourcesForRotation +import dagger.assisted.Assisted +import dagger.assisted.AssistedFactory +import dagger.assisted.AssistedInject import java.io.PrintWriter import java.lang.Math.max -import javax.inject.Inject /** * Encapsulates logic that can solve for the left/right insets required for the status bar contents. @@ -64,19 +66,87 @@ import javax.inject.Inject * * NOTE: This class is not threadsafe */ -@SysUISingleton -class StatusBarContentInsetsProvider -@Inject +interface StatusBarContentInsetsProvider : + CallbackController<StatusBarContentInsetsChangedListener> { + + /** + * Some views may need to care about whether or not the current top display cutout is located in + * the corner rather than somewhere in the center. In the case of a corner cutout, the status + * bar area is contiguous. + */ + fun currentRotationHasCornerCutout(): Boolean + + /** + * Calculates the maximum bounding rectangle for the privacy chip animation + ongoing privacy + * dot in the coordinates relative to the given rotation. + * + * @param rotation the rotation for which the bounds are required. This is an absolute value + * (i.e., ROTATION_NONE will always return the same bounds regardless of the context from + * which this method is called) + */ + fun getBoundingRectForPrivacyChipForRotation( + @Rotation rotation: Int, + displayCutout: DisplayCutout?, + ): Rect + + /** + * Calculate the distance from the left, right and top edges of the screen to the status bar + * content area. This differs from the content area rects in that these values can be used + * directly as padding. + * + * @param rotation the target rotation for which to calculate insets + */ + fun getStatusBarContentInsetsForRotation(@Rotation rotation: Int): Insets + + /** + * Calculate the insets for the status bar content in the device's current rotation + * + * @see getStatusBarContentAreaForRotation + */ + fun getStatusBarContentInsetsForCurrentRotation(): Insets + + /** + * Calculates the area of the status bar contents invariant of the current device rotation, in + * the target rotation's coordinates + * + * @param rotation the rotation for which the bounds are required. This is an absolute value + * (i.e., ROTATION_NONE will always return the same bounds regardless of the context from + * which this method is called) + */ + fun getStatusBarContentAreaForRotation(@Rotation rotation: Int): Rect + + /** Get the status bar content area for the given rotation, in absolute bounds */ + fun getStatusBarContentAreaForCurrentRotation(): Rect + + fun getStatusBarPaddingTop(@Rotation rotation: Int? = null): Int + + interface Factory { + fun create( + context: Context, + configurationController: ConfigurationController, + sysUICutoutProvider: SysUICutoutProvider, + ): StatusBarContentInsetsProvider + } +} + +class StatusBarContentInsetsProviderImpl +@AssistedInject constructor( - val context: Context, - val configurationController: ConfigurationController, + @Assisted val context: Context, + @Assisted val configurationController: ConfigurationController, val dumpManager: DumpManager, val commandRegistry: CommandRegistry, - val sysUICutoutProvider: SysUICutoutProvider, -) : - CallbackController<StatusBarContentInsetsChangedListener>, - ConfigurationController.ConfigurationListener, - Dumpable { + @Assisted val sysUICutoutProvider: SysUICutoutProvider, +) : StatusBarContentInsetsProvider, ConfigurationController.ConfigurationListener, Dumpable { + + @AssistedFactory + interface Factory : StatusBarContentInsetsProvider.Factory { + override fun create( + context: Context, + configurationController: ConfigurationController, + sysUICutoutProvider: SysUICutoutProvider, + ): StatusBarContentInsetsProviderImpl + } // Limit cache size as potentially we may connect large number of displays // (e.g. network displays) @@ -95,7 +165,7 @@ constructor( object : StatusBarInsetsCommand.Callback { override fun onExecute( command: StatusBarInsetsCommand, - printWriter: PrintWriter + printWriter: PrintWriter, ) { executeCommand(command, printWriter) } @@ -133,12 +203,7 @@ constructor( listeners.forEach { it.onStatusBarContentInsetsChanged() } } - /** - * Some views may need to care about whether or not the current top display cutout is located in - * the corner rather than somewhere in the center. In the case of a corner cutout, the status - * bar area is contiguous. - */ - fun currentRotationHasCornerCutout(): Boolean { + override fun currentRotationHasCornerCutout(): Boolean { val cutout = checkNotNull(context.display).cutout ?: return false val topBounds = cutout.boundingRectTop @@ -148,17 +213,9 @@ constructor( return topBounds.left <= 0 || topBounds.right >= point.x } - /** - * Calculates the maximum bounding rectangle for the privacy chip animation + ongoing privacy - * dot in the coordinates relative to the given rotation. - * - * @param rotation the rotation for which the bounds are required. This is an absolute value - * (i.e., ROTATION_NONE will always return the same bounds regardless of the context from - * which this method is called) - */ - fun getBoundingRectForPrivacyChipForRotation( + override fun getBoundingRectForPrivacyChipForRotation( @Rotation rotation: Int, - displayCutout: DisplayCutout? + displayCutout: DisplayCutout?, ): Rect { val key = getCacheKey(rotation, displayCutout) var insets = insetsCache[key] @@ -176,14 +233,7 @@ constructor( return getPrivacyChipBoundingRectForInsets(insets, dotWidth, chipWidth, isRtl) } - /** - * Calculate the distance from the left, right and top edges of the screen to the status bar - * content area. This differs from the content area rects in that these values can be used - * directly as padding. - * - * @param rotation the target rotation for which to calculate insets - */ - fun getStatusBarContentInsetsForRotation(@Rotation rotation: Int): Insets = + override fun getStatusBarContentInsetsForRotation(@Rotation rotation: Int): Insets = traceSection(tag = "StatusBarContentInsetsProvider.getStatusBarContentInsetsForRotation") { val sysUICutout = sysUICutoutProvider.cutoutInfoForCurrentDisplayAndRotation() val displayCutout = sysUICutout?.cutout @@ -202,31 +252,17 @@ constructor( rotation, sysUICutout, getResourcesForRotation(rotation, context), - key + key, ) Insets.of(area.left, area.top, /* right= */ width - area.right, /* bottom= */ 0) } - /** - * Calculate the insets for the status bar content in the device's current rotation - * - * @see getStatusBarContentAreaForRotation - */ - fun getStatusBarContentInsetsForCurrentRotation(): Insets { + override fun getStatusBarContentInsetsForCurrentRotation(): Insets { return getStatusBarContentInsetsForRotation(getExactRotation(context)) } - /** - * Calculates the area of the status bar contents invariant of the current device rotation, in - * the target rotation's coordinates - * - * @param rotation the rotation for which the bounds are required. This is an absolute value - * (i.e., ROTATION_NONE will always return the same bounds regardless of the context from - * which this method is called) - */ - @JvmOverloads - fun getStatusBarContentAreaForRotation(@Rotation rotation: Int): Rect { + override fun getStatusBarContentAreaForRotation(@Rotation rotation: Int): Rect { val sysUICutout = sysUICutoutProvider.cutoutInfoForCurrentDisplayAndRotation() val displayCutout = sysUICutout?.cutout val key = getCacheKey(rotation, displayCutout) @@ -235,12 +271,11 @@ constructor( rotation, sysUICutout, getResourcesForRotation(rotation, context), - key + key, ) } - /** Get the status bar content area for the given rotation, in absolute bounds */ - fun getStatusBarContentAreaForCurrentRotation(): Rect { + override fun getStatusBarContentAreaForCurrentRotation(): Rect { val rotation = getExactRotation(context) return getStatusBarContentAreaForRotation(rotation) } @@ -249,7 +284,7 @@ constructor( @Rotation targetRotation: Int, sysUICutout: SysUICutoutInformation?, rotatedResources: Resources, - key: CacheKey + key: CacheKey, ): Rect { return getCalculatedAreaForRotation(sysUICutout, targetRotation, rotatedResources).also { insetsCache.put(key, it) @@ -259,7 +294,7 @@ constructor( private fun getCalculatedAreaForRotation( sysUICutout: SysUICutoutInformation?, @Rotation targetRotation: Int, - rotatedResources: Resources + rotatedResources: Resources, ): Rect { val currentRotation = getExactRotation(context) @@ -299,7 +334,7 @@ constructor( configurationController.isLayoutRtl, dotWidth, bottomAlignedMargin, - statusBarContentHeight + statusBarContentHeight, ) } @@ -349,7 +384,7 @@ constructor( return resources.getDimensionPixelSize(dimenRes) } - fun getStatusBarPaddingTop(@Rotation rotation: Int? = null): Int { + override fun getStatusBarPaddingTop(@Rotation rotation: Int?): Int { val res = rotation?.let { it -> getResourcesForRotation(it, context) } ?: context.resources return res.getDimensionPixelSize(R.dimen.status_bar_padding_top) } @@ -364,13 +399,13 @@ constructor( CacheKey( rotation = rotation, displaySize = Rect(context.resources.configuration.windowConfiguration.maxBounds), - displayCutout = displayCutout + displayCutout = displayCutout, ) private data class CacheKey( @Rotation val rotation: Int, val displaySize: Rect, - val displayCutout: DisplayCutout? + val displayCutout: DisplayCutout?, ) } @@ -395,21 +430,21 @@ fun getPrivacyChipBoundingRectForInsets( contentRect: Rect, dotWidth: Int, chipWidth: Int, - isRtl: Boolean + isRtl: Boolean, ): Rect { return if (isRtl) { Rect( contentRect.left - dotWidth, contentRect.top, contentRect.left + chipWidth, - contentRect.bottom + contentRect.bottom, ) } else { Rect( contentRect.right - chipWidth, contentRect.top, contentRect.right + dotWidth, - contentRect.bottom + contentRect.bottom, ) } } @@ -443,7 +478,7 @@ fun calculateInsetsForRotationWithRotatedResources( isRtl: Boolean, dotWidth: Int, bottomAlignedMargin: Int, - statusBarContentHeight: Int + statusBarContentHeight: Int, ): Rect { /* TODO: Check if this is ever used for devices with no rounded corners @@ -467,7 +502,7 @@ fun calculateInsetsForRotationWithRotatedResources( targetRotation, currentRotation, bottomAlignedMargin, - statusBarContentHeight + statusBarContentHeight, ) } @@ -503,7 +538,7 @@ private fun getStatusBarContentBounds( @Rotation targetRotation: Int, @Rotation currentRotation: Int, bottomAlignedMargin: Int, - statusBarContentHeight: Int + statusBarContentHeight: Int, ): Rect { val insetTop = getInsetTop(bottomAlignedMargin, statusBarContentHeight, sbHeight) @@ -597,7 +632,7 @@ private val DisplayCutout.boundingRectsLeftRightTop private fun getInsetTop( bottomAlignedMargin: Int, statusBarContentHeight: Int, - statusBarHeight: Int + statusBarHeight: Int, ): Int { val bottomAlignmentEnabled = bottomAlignedMargin >= 0 if (!bottomAlignmentEnabled) { @@ -610,7 +645,7 @@ private fun getInsetTop( private fun sbRect( @Rotation relativeRotation: Int, sbHeight: Int, - displaySize: Pair<Int, Int> + displaySize: Pair<Int, Int>, ): Rect { val w = displaySize.first val h = displaySize.second @@ -626,7 +661,7 @@ private fun shareShortEdge( sbRect: Rect, cutoutRect: Rect, currentWidth: Int, - currentHeight: Int + currentHeight: Int, ): Boolean { if (currentWidth < currentHeight) { // Check top/bottom edges by extending the width of the display cutout rect and checking |