Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 75fb80ee authored by Ats Jenk's avatar Ats Jenk
Browse files

Refactor common logic in bubble pin controllers to base class

Move exclusion rect calculation to base class. All subclasses for
pinning the bubble bar share the same logic. The exclusion rect sits at
the bottom center of the screen. Subclasses only need to provide size
as the resource ids are different between launcher and shell.
Move everything related to screen size calculation to the parent class.
Subclasses have to provide a callback to fetch the screen size. As this
is different in launcher vs shell.

Bug: 330585402
Test: atest WMShellRobolectricTests:BubbleExpandedViewPinControllerTest
Test: atest WMShellMultivalentTestsOnDevice:BubbleExpandedViewPinControllerTest
Flag: ACONFIG com.android.wm.shell.enable_bubble_bar DEVELOPMENT
Change-Id: I2e52df9fa67b26413595371fcd92f360fdbbf7ad
parent 0e7d5365
Loading
Loading
Loading
Loading
+13 −19
Original line number Diff line number Diff line
@@ -17,8 +17,8 @@
package com.android.wm.shell.bubbles.bar

import android.content.Context
import android.graphics.Point
import android.graphics.Rect
import android.graphics.RectF
import android.view.LayoutInflater
import android.view.View
import android.widget.FrameLayout
@@ -37,31 +37,25 @@ class BubbleExpandedViewPinController(
    private val context: Context,
    private val container: FrameLayout,
    private val positioner: BubblePositioner
) : BaseBubblePinController() {
) : BaseBubblePinController({ positioner.availableRect.let { Point(it.width(), it.height()) } }) {

    private var dropTargetView: View? = null
    private val tempRect: Rect by lazy(LazyThreadSafetyMode.NONE) { Rect() }

    override fun getScreenCenterX(): Int {
        return positioner.screenRect.centerX()
    private val exclRectWidth: Float by lazy {
        context.resources.getDimension(R.dimen.bubble_bar_dismiss_zone_width)
    }

    override fun getExclusionRect(): RectF {
        val rect =
            RectF(
                0f,
                0f,
                context.resources.getDimension(R.dimen.bubble_bar_dismiss_zone_width),
    private val exclRectHeight: Float by lazy {
        context.resources.getDimension(R.dimen.bubble_bar_dismiss_zone_height)
            )
    }

    override fun getExclusionRectWidth(): Float {
        return exclRectWidth
    }

        val screenRect = positioner.screenRect
        // Center it around the bottom center of the screen
        rect.offsetTo(
            screenRect.exactCenterX() - rect.width() / 2f,
            screenRect.bottom - rect.height()
        )
        return rect
    override fun getExclusionRectHeight(): Float {
        return exclRectHeight
    }

    override fun createDropTargetView(): View {
+15 −7
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.wm.shell.common.bubbles

import android.graphics.Point
import android.graphics.RectF
import android.view.View
import androidx.annotation.VisibleForTesting
@@ -35,7 +36,7 @@ import com.android.wm.shell.common.bubbles.BubbleBarLocation.RIGHT
 *
 * Shows a drop target when releasing a view would update the [BubbleBarLocation].
 */
abstract class BaseBubblePinController {
abstract class BaseBubblePinController(private val screenSizeProvider: () -> Point) {

    private var onLeft = false
    private var dismissZone: RectF? = null
@@ -50,8 +51,8 @@ abstract class BaseBubblePinController {
     */
    fun onDragStart(initialLocationOnLeft: Boolean) {
        onLeft = initialLocationOnLeft
        screenCenterX = screenSizeProvider.invoke().x / 2
        dismissZone = getExclusionRect()
        screenCenterX = getScreenCenterX()
    }

    /** View has moved to [x] and [y] screen coordinates */
@@ -91,11 +92,10 @@ abstract class BaseBubblePinController {
        this.listener = listener
    }

    /** Get screen center coordinate on the x axis. */
    protected abstract fun getScreenCenterX(): Int

    /** Optional exclusion rect where drag interactions are not processed */
    protected abstract fun getExclusionRect(): RectF?
    /** Get width for exclusion rect where dismiss takes over drag */
    protected abstract fun getExclusionRectWidth(): Float
    /** Get height for exclusion rect where dismiss takes over drag */
    protected abstract fun getExclusionRectHeight(): Float

    /** Create the drop target view and attach it to the parent */
    protected abstract fun createDropTargetView(): View
@@ -114,6 +114,14 @@ abstract class BaseBubblePinController {
        listener?.onChange(location)
    }

    private fun getExclusionRect(): RectF {
        val rect = RectF(0f, 0f, getExclusionRectWidth(), getExclusionRectHeight())
        // Center it around the bottom center of the screen
        val screenBottom = screenSizeProvider.invoke().y
        rect.offsetTo(screenCenterX - rect.width() / 2, screenBottom - rect.height())
        return rect
    }

    private fun showDropTarget(location: BubbleBarLocation) {
        val targetView = getDropTargetView() ?: createDropTargetView().apply { alpha = 0f }
        if (targetView.alpha > 0) {