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

Commit c25ff251 authored by Ibrahim Yilmaz's avatar Ibrahim Yilmaz Committed by Android (Google) Code Review
Browse files

Merge changes I28127caa,Id6d59546 into main

* changes:
  MediaContainerView: Bind KeyguardMediaController visibility to MediaContainerView's visibility
  MediaContainerView: Log invalid visibility change
parents b24bcc88 31c681b9
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -529,3 +529,13 @@ flag {
        purpose: PURPOSE_BUGFIX
    }
}

flag {
    name: "bind_keyguard_media_visibility"
    namespace: "systemui"
    description: "Binds Keyguard Media Controller Visibility to MediaContainerView"
    bug: "298213983"
    metadata {
        purpose: PURPOSE_BUGFIX
    }
}
+11 −4
Original line number Diff line number Diff line
@@ -300,10 +300,17 @@ constructor(
    private fun setVisibility(view: ViewGroup?, newVisibility: Int) {
        val currentMediaContainer = view ?: return

        val isVisible = newVisibility == View.VISIBLE

        if (currentMediaContainer is MediaContainerView) {
            val previousVisibility = currentMediaContainer.visibility

            currentMediaContainer.setKeyguardVisibility(isVisible)
            if (previousVisibility != newVisibility) {
                visibilityChangedListener?.invoke(isVisible)
            }
        } else {
            currentMediaContainer.visibility = newVisibility
        if (previousVisibility != newVisibility && currentMediaContainer is MediaContainerView) {
            visibilityChangedListener?.invoke(newVisibility == View.VISIBLE)
        }
    }

+61 −0
Original line number Diff line number Diff line
@@ -22,6 +22,8 @@ import android.graphics.Canvas
import android.graphics.Path
import android.graphics.RectF
import android.util.AttributeSet
import android.util.Log
import com.android.systemui.Flags
import com.android.systemui.res.R
import com.android.systemui.statusbar.notification.row.ExpandableView

@@ -87,4 +89,63 @@ class MediaContainerView(context: Context, attrs: AttributeSet?) : ExpandableVie
    ) {
        // No animation, it doesn't need it, this would be local
    }

    override fun setVisibility(visibility: Int) {
        if (Flags.bindKeyguardMediaVisibility()) {
            if (isVisibilityValid(visibility)) {
                super.setVisibility(visibility)
            }
        } else {
            super.setVisibility(visibility)
        }

        assertMediaContainerVisibility(visibility)
    }

    /**
     * visibility should be aligned with MediaContainerView visibility on the keyguard.
     */
    private fun isVisibilityValid(visibility: Int): Boolean {
        val currentViewState = viewState as? MediaContainerViewState ?: return true
        val shouldBeGone = !currentViewState.shouldBeVisible
        return if (shouldBeGone) visibility == GONE else visibility != GONE
    }

    /**
     * b/298213983
     * MediaContainerView's visibility is changed to VISIBLE when it should be GONE.
     * This method check this state and logs.
     */
    private fun assertMediaContainerVisibility(visibility: Int) {
        val currentViewState = viewState

        if (currentViewState is MediaContainerViewState) {
            if (!currentViewState.shouldBeVisible && visibility == VISIBLE) {
                Log.wtf("MediaContainerView", "MediaContainerView should be GONE " +
                        "but its visibility changed to VISIBLE")
            }
        }
    }

    fun setKeyguardVisibility(isVisible: Boolean) {
        val currentViewState = viewState
        if (currentViewState is MediaContainerViewState) {
            currentViewState.shouldBeVisible = isVisible
        }

        visibility = if (isVisible) VISIBLE else GONE
    }

    override fun createExpandableViewState(): ExpandableViewState = MediaContainerViewState()

    class MediaContainerViewState : ExpandableViewState() {
        var shouldBeVisible: Boolean = false

        override fun copyFrom(viewState: ViewState) {
            super.copyFrom(viewState)
            if (viewState is MediaContainerViewState) {
                shouldBeVisible = viewState.shouldBeVisible
            }
        }
    }
}