Loading packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarViewController.kt +8 −4 Original line number Diff line number Diff line Loading @@ -151,7 +151,11 @@ private constructor( startSideContainer = mView.requireViewById(R.id.status_bar_start_side_content) startSideContainer.setOnHoverListener( statusOverlayHoverListenerFactory.createDarkAwareListener(startSideContainer) statusOverlayHoverListenerFactory.createDarkAwareListener( startSideContainer, topHoverMargin = 6, bottomHoverMargin = 6, ) ) startSideContainer.setOnTouchListener(iconsOnTouchListener) } Loading Loading @@ -210,7 +214,7 @@ private constructor( event.action == MotionEvent.ACTION_UP || event.action == MotionEvent.ACTION_CANCEL centralSurfaces.setInteracting( WINDOW_STATUS_BAR, !upOrCancel || shadeController.isExpandedVisible !upOrCancel || shadeController.isExpandedVisible, ) } } Loading Loading @@ -247,7 +251,7 @@ private constructor( String.format( "onTouchForwardedFromStatusBar: panel disabled, " + "ignoring touch at (${event.x.toInt()},${event.y.toInt()})" ) ), ) } return false Loading @@ -266,7 +270,7 @@ private constructor( if (!shadeViewController.isViewEnabled) { shadeLogger.logMotionEvent( event, "onTouchForwardedFromStatusBar: panel view disabled" "onTouchForwardedFromStatusBar: panel view disabled", ) return true } Loading packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusOverlayHoverListener.kt +69 −3 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import android.content.res.Configuration import android.content.res.Resources import android.graphics.Color import android.graphics.drawable.PaintDrawable import android.util.TypedValue import android.view.MotionEvent import android.view.View import android.view.View.OnHoverListener Loading @@ -27,10 +28,10 @@ import androidx.annotation.ColorInt import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle import com.android.systemui.res.R import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.lifecycle.repeatWhenAttached import com.android.systemui.plugins.DarkIconDispatcher import com.android.systemui.res.R import com.android.systemui.statusbar.phone.SysuiDarkIconDispatcher.DarkChange import com.android.systemui.statusbar.policy.ConfigurationController import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener Loading Loading @@ -64,6 +65,26 @@ constructor( fun createDarkAwareListener(view: View) = createDarkAwareListener(view, darkIconDispatcher.darkChangeFlow()) /** * Creates listener using [DarkIconDispatcher] to determine light or dark color of the overlay * Also sets margins for hover background relative to view bounds */ fun createDarkAwareListener( view: View, leftHoverMargin: Int = 0, rightHoverMargin: Int = 0, topHoverMargin: Int = 0, bottomHoverMargin: Int = 0, ) = createDarkAwareListener( view, darkIconDispatcher.darkChangeFlow(), leftHoverMargin, rightHoverMargin, topHoverMargin, bottomHoverMargin, ) /** * Creates listener using provided [DarkChange] producer to determine light or dark color of the * overlay Loading @@ -76,6 +97,25 @@ constructor( darkFlow.map { toHoverTheme(view, it) }, ) private fun createDarkAwareListener( view: View, darkFlow: StateFlow<DarkChange>, leftHoverMargin: Int = 0, rightHoverMargin: Int = 0, topHoverMargin: Int = 0, bottomHoverMargin: Int = 0, ) = StatusOverlayHoverListener( view, configurationController, resources, darkFlow.map { toHoverTheme(view, it) }, leftHoverMargin, rightHoverMargin, topHoverMargin, bottomHoverMargin, ) private fun toHoverTheme(view: View, darkChange: DarkChange): HoverTheme { val calculatedTint = DarkIconDispatcher.getTint(darkChange.areas, view, darkChange.tint) // currently calculated tint is either white or some shade of black. Loading @@ -91,7 +131,7 @@ constructor( */ enum class HoverTheme { LIGHT, DARK DARK, } /** Loading @@ -103,11 +143,19 @@ class StatusOverlayHoverListener( configurationController: ConfigurationController, private val resources: Resources, private val themeFlow: Flow<HoverTheme>, private val leftHoverMargin: Int = 0, private val rightHoverMargin: Int = 0, private val topHoverMargin: Int = 0, private val bottomHoverMargin: Int = 0, ) : OnHoverListener { @ColorInt private var darkColor: Int = 0 @ColorInt private var lightColor: Int = 0 private var cornerRadius = 0f private var leftHoverMarginInPx: Int = 0 private var rightHoverMarginInPx: Int = 0 private var topHoverMarginInPx: Int = 0 private var bottomHoverMarginInPx: Int = 0 private var lastTheme = HoverTheme.LIGHT Loading Loading @@ -138,7 +186,12 @@ class StatusOverlayHoverListener( val drawable = PaintDrawable(backgroundColor).apply { setCornerRadius(cornerRadius) setBounds(0, 0, v.width, v.height) setBounds( /*left = */ 0 + leftHoverMarginInPx, /*top = */ 0 + topHoverMarginInPx, /*right = */ v.width - rightHoverMarginInPx, /*bottom = */ v.height - bottomHoverMarginInPx, ) } v.overlay.add(drawable) } else if (event.action == MotionEvent.ACTION_HOVER_EXIT) { Loading @@ -151,5 +204,18 @@ class StatusOverlayHoverListener( lightColor = resources.getColor(R.color.status_bar_icons_hover_color_light) darkColor = resources.getColor(R.color.status_bar_icons_hover_color_dark) cornerRadius = resources.getDimension(R.dimen.status_icons_hover_state_background_radius) leftHoverMarginInPx = leftHoverMargin.dpToPx(resources) rightHoverMarginInPx = rightHoverMargin.dpToPx(resources) topHoverMarginInPx = topHoverMargin.dpToPx(resources) bottomHoverMarginInPx = bottomHoverMargin.dpToPx(resources) } private fun Int.dpToPx(resources: Resources): Int { return TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, toFloat(), resources.displayMetrics, ) .toInt() } } Loading
packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarViewController.kt +8 −4 Original line number Diff line number Diff line Loading @@ -151,7 +151,11 @@ private constructor( startSideContainer = mView.requireViewById(R.id.status_bar_start_side_content) startSideContainer.setOnHoverListener( statusOverlayHoverListenerFactory.createDarkAwareListener(startSideContainer) statusOverlayHoverListenerFactory.createDarkAwareListener( startSideContainer, topHoverMargin = 6, bottomHoverMargin = 6, ) ) startSideContainer.setOnTouchListener(iconsOnTouchListener) } Loading Loading @@ -210,7 +214,7 @@ private constructor( event.action == MotionEvent.ACTION_UP || event.action == MotionEvent.ACTION_CANCEL centralSurfaces.setInteracting( WINDOW_STATUS_BAR, !upOrCancel || shadeController.isExpandedVisible !upOrCancel || shadeController.isExpandedVisible, ) } } Loading Loading @@ -247,7 +251,7 @@ private constructor( String.format( "onTouchForwardedFromStatusBar: panel disabled, " + "ignoring touch at (${event.x.toInt()},${event.y.toInt()})" ) ), ) } return false Loading @@ -266,7 +270,7 @@ private constructor( if (!shadeViewController.isViewEnabled) { shadeLogger.logMotionEvent( event, "onTouchForwardedFromStatusBar: panel view disabled" "onTouchForwardedFromStatusBar: panel view disabled", ) return true } Loading
packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusOverlayHoverListener.kt +69 −3 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import android.content.res.Configuration import android.content.res.Resources import android.graphics.Color import android.graphics.drawable.PaintDrawable import android.util.TypedValue import android.view.MotionEvent import android.view.View import android.view.View.OnHoverListener Loading @@ -27,10 +28,10 @@ import androidx.annotation.ColorInt import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle import com.android.systemui.res.R import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.lifecycle.repeatWhenAttached import com.android.systemui.plugins.DarkIconDispatcher import com.android.systemui.res.R import com.android.systemui.statusbar.phone.SysuiDarkIconDispatcher.DarkChange import com.android.systemui.statusbar.policy.ConfigurationController import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener Loading Loading @@ -64,6 +65,26 @@ constructor( fun createDarkAwareListener(view: View) = createDarkAwareListener(view, darkIconDispatcher.darkChangeFlow()) /** * Creates listener using [DarkIconDispatcher] to determine light or dark color of the overlay * Also sets margins for hover background relative to view bounds */ fun createDarkAwareListener( view: View, leftHoverMargin: Int = 0, rightHoverMargin: Int = 0, topHoverMargin: Int = 0, bottomHoverMargin: Int = 0, ) = createDarkAwareListener( view, darkIconDispatcher.darkChangeFlow(), leftHoverMargin, rightHoverMargin, topHoverMargin, bottomHoverMargin, ) /** * Creates listener using provided [DarkChange] producer to determine light or dark color of the * overlay Loading @@ -76,6 +97,25 @@ constructor( darkFlow.map { toHoverTheme(view, it) }, ) private fun createDarkAwareListener( view: View, darkFlow: StateFlow<DarkChange>, leftHoverMargin: Int = 0, rightHoverMargin: Int = 0, topHoverMargin: Int = 0, bottomHoverMargin: Int = 0, ) = StatusOverlayHoverListener( view, configurationController, resources, darkFlow.map { toHoverTheme(view, it) }, leftHoverMargin, rightHoverMargin, topHoverMargin, bottomHoverMargin, ) private fun toHoverTheme(view: View, darkChange: DarkChange): HoverTheme { val calculatedTint = DarkIconDispatcher.getTint(darkChange.areas, view, darkChange.tint) // currently calculated tint is either white or some shade of black. Loading @@ -91,7 +131,7 @@ constructor( */ enum class HoverTheme { LIGHT, DARK DARK, } /** Loading @@ -103,11 +143,19 @@ class StatusOverlayHoverListener( configurationController: ConfigurationController, private val resources: Resources, private val themeFlow: Flow<HoverTheme>, private val leftHoverMargin: Int = 0, private val rightHoverMargin: Int = 0, private val topHoverMargin: Int = 0, private val bottomHoverMargin: Int = 0, ) : OnHoverListener { @ColorInt private var darkColor: Int = 0 @ColorInt private var lightColor: Int = 0 private var cornerRadius = 0f private var leftHoverMarginInPx: Int = 0 private var rightHoverMarginInPx: Int = 0 private var topHoverMarginInPx: Int = 0 private var bottomHoverMarginInPx: Int = 0 private var lastTheme = HoverTheme.LIGHT Loading Loading @@ -138,7 +186,12 @@ class StatusOverlayHoverListener( val drawable = PaintDrawable(backgroundColor).apply { setCornerRadius(cornerRadius) setBounds(0, 0, v.width, v.height) setBounds( /*left = */ 0 + leftHoverMarginInPx, /*top = */ 0 + topHoverMarginInPx, /*right = */ v.width - rightHoverMarginInPx, /*bottom = */ v.height - bottomHoverMarginInPx, ) } v.overlay.add(drawable) } else if (event.action == MotionEvent.ACTION_HOVER_EXIT) { Loading @@ -151,5 +204,18 @@ class StatusOverlayHoverListener( lightColor = resources.getColor(R.color.status_bar_icons_hover_color_light) darkColor = resources.getColor(R.color.status_bar_icons_hover_color_dark) cornerRadius = resources.getDimension(R.dimen.status_icons_hover_state_background_radius) leftHoverMarginInPx = leftHoverMargin.dpToPx(resources) rightHoverMarginInPx = rightHoverMargin.dpToPx(resources) topHoverMarginInPx = topHoverMargin.dpToPx(resources) bottomHoverMarginInPx = bottomHoverMargin.dpToPx(resources) } private fun Int.dpToPx(resources: Resources): Int { return TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, toFloat(), resources.displayMetrics, ) .toInt() } }