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

Commit 0c52d29a authored by Florence Yang's avatar Florence Yang
Browse files

Fix RegionSampler crashes

RegionSampler was crashing due to (1) the LS Smartspace not checking for
the View's existence in the RegionSampler map and (2) adding regions
that were out of bounds. These crashes prevented RegionSampler from
working properly (i.e. being able to edit thresholds from ag/21145349).

This change also addresses some faulty logic in ClockEventController that was causing only the large clock view to be sampled. Now, both the small clock and large clock are being sampled when there's a layout change detected.

Bug: 202758428
Flag: region_sampling
Test: manual (verified no more error logs related to RegionSampler in Logcat)
Change-Id: I7895f1c2aa8fb19feac325df71d8b7f04c39717b
parent a43f32d5
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
@@ -91,6 +91,22 @@ constructor(
        val sampledRegion = calculateSampledRegion(sampledView)
        val regions = ArrayList<RectF>()
        val sampledRegionWithOffset = convertBounds(sampledRegion)

        if (
            sampledRegionWithOffset.left < 0.0 ||
                sampledRegionWithOffset.right > 1.0 ||
                sampledRegionWithOffset.top < 0.0 ||
                sampledRegionWithOffset.bottom > 1.0
        ) {
            android.util.Log.e(
                "RegionSampler",
                "view out of bounds: $sampledRegion | " +
                    "screen width: ${displaySize.x}, screen height: ${displaySize.y}",
                Exception()
            )
            return
        }

        regions.add(sampledRegionWithOffset)

        wallpaperManager?.removeOnColorsChangedListener(this)
+9 −29
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.content.res.Resources
import android.graphics.Rect
import android.text.format.DateFormat
import android.util.TypedValue
import android.view.View
@@ -119,10 +120,6 @@ constructor(

    private val mLayoutChangedListener =
        object : View.OnLayoutChangeListener {
            private var currentSmallClockView: View? = null
            private var currentLargeClockView: View? = null
            private var currentSmallClockLocation = IntArray(2)
            private var currentLargeClockLocation = IntArray(2)

            override fun onLayoutChange(
                view: View?,
@@ -135,6 +132,8 @@ constructor(
                oldRight: Int,
                oldBottom: Int
            ) {
                view?.removeOnLayoutChangeListener(this)

                val parent = (view?.parent) as FrameLayout

                // don't pass in negative bounds when clocks are in transition state
@@ -142,34 +141,15 @@ constructor(
                    return
                }

                // SMALL CLOCK
                if (parent.id == R.id.lockscreen_clock_view) {
                    // view bounds have changed due to clock size changing (i.e. different character
                    // widths)
                    // AND/OR the view has been translated when transitioning between small and
                    // large clock
                    if (
                        view != currentSmallClockView ||
                            !view.locationOnScreen.contentEquals(currentSmallClockLocation)
                    ) {
                        currentSmallClockView = view
                        currentSmallClockLocation = view.locationOnScreen
                        updateRegionSampler(view)
                    }
                }
                // LARGE CLOCK
                else if (parent.id == R.id.lockscreen_clock_view_large) {
                    if (
                        view != currentLargeClockView ||
                            !view.locationOnScreen.contentEquals(currentLargeClockLocation)
                    ) {
                        currentLargeClockView = view
                        currentLargeClockLocation = view.locationOnScreen
                val currentViewRect = Rect(left, top, right, bottom)
                val oldViewRect = Rect(oldLeft, oldTop, oldRight, oldBottom)

                if (currentViewRect.width() != oldViewRect.width() ||
                    currentViewRect.height() != oldViewRect.height()) {
                    updateRegionSampler(view)
                }
            }
        }
        }

    private fun updateColors() {
        val wallpaperManager = WallpaperManager.getInstance(context)
+4 −2
Original line number Diff line number Diff line
@@ -500,10 +500,12 @@ constructor(

    private fun updateTextColorFromRegionSampler() {
        smartspaceViews.forEach {
            val textColor = regionSamplers.getValue(it).currentForegroundColor()
            val textColor = regionSamplers.get(it)?.currentForegroundColor()
            if (textColor != null) {
                it.setPrimaryTextColor(textColor)
            }
        }
    }

    private fun updateTextColorFromWallpaper() {
        val wallpaperManager = WallpaperManager.getInstance(context)