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

Unverified Commit 1fce4db6 authored by Pranav Vashi's avatar Pranav Vashi Committed by Michael Bestas
Browse files

VolumeDialog: Add support for left gravity



Co-authored-by: default avatarIdo Ben-Hur <idoybh2@gmail.com>
Change-Id: Ic000c35e363657e15de52f0dc7b985eaa2d30cb0
Signed-off-by: default avatarPranav Vashi <neobuddy89@gmail.com>
parent af86786c
Loading
Loading
Loading
Loading
+6 −4
Original line number Diff line number Diff line
@@ -19,10 +19,9 @@
    android:id="@+id/volume_dialog"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="right"
    android:alpha="0"
    android:clipChildren="false"
    android:minWidth="@dimen/volume_dialog_window_width">
    android:minWidth="@dimen/volume_dialog_width">

    <View
        android:id="@+id/volume_dialog_background"
@@ -58,12 +57,15 @@
        android:layout_width="@dimen/volume_dialog_slider_width"
        android:layout_height="0dp"
        android:layout_marginTop="@dimen/volume_dialog_slider_vertical_margin"
        android:layout_marginStart="@dimen/volume_dialog_window_margin"
        android:layout_marginEnd="@dimen/volume_dialog_window_margin"
        android:layout_marginBottom="@dimen/volume_dialog_slider_vertical_margin"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHeight_max="@dimen/volume_dialog_slider_height"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintHorizontal_bias="1"
        app:layout_constraintVertical_bias="0.5"/>

    <LinearLayout
@@ -98,7 +100,7 @@
        android:orientation="horizontal"
        android:showDividers="middle|beginning|end"
        app:layout_constraintBottom_toBottomOf="@id/volume_dialog_main_slider_container"
        app:layout_constraintRight_toLeftOf="@id/volume_dialog_background"
        app:layout_constraintStart_toEndOf="@id/volume_dialog_background"
        app:layout_constraintTop_toTopOf="@id/volume_dialog_main_slider_container"/>

</androidx.constraintlayout.widget.ConstraintLayout>
+1 −1
Original line number Diff line number Diff line
@@ -19,7 +19,7 @@
    android:id="@+id/volume_dialog"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="top|right"
    android:layout_gravity="top"
    android:alpha="0"
    android:clipChildren="false"
    android:minHeight="@dimen/volume_dialog_window_width">
+65 −7
Original line number Diff line number Diff line
@@ -17,7 +17,12 @@
package com.android.systemui.volume.dialog

import android.content.Context
import android.database.ContentObserver
import android.net.Uri
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.os.UserHandle
import android.view.Gravity
import android.view.MotionEvent
import android.view.View
@@ -34,6 +39,7 @@ import com.android.systemui.volume.dialog.domain.interactor.DesktopAudioTileDeta
import com.android.systemui.volume.dialog.domain.interactor.VolumeDialogVisibilityInteractor
import javax.inject.Inject
import kotlinx.coroutines.awaitCancellation
import lineageos.providers.LineageSettings

class VolumeDialog
@Inject
@@ -46,6 +52,45 @@ constructor(
    // Use horizontal volume dialog if the audio tile details view is enabled
    private val isVolumeDialogVertical = !desktopAudioTileDetailsFeatureInteractor.isEnabled()

    private var volumePanelOnLeft: Boolean = false

    private val volumePanelOnLeftObserver =
        object : ContentObserver(Handler(Looper.getMainLooper())) {
            override fun onChange(selfChange: Boolean) {
                val onLeft =
                    LineageSettings.Secure.getIntForUser(
                        context.contentResolver,
                        LineageSettings.Secure.VOLUME_PANEL_ON_LEFT,
                        0,
                        UserHandle.USER_CURRENT
                    ) != 0

                if (volumePanelOnLeft != onLeft) {
                    volumePanelOnLeft = onLeft
                    applyLayoutAndGravity()
                }
            }
        }

    private fun applyLayoutAndGravity() {
        val win = window ?: return
        val side = if (volumePanelOnLeft) Gravity.START else Gravity.END

        if (isVolumeDialogVertical) {
            win.setLayout(
                ViewGroup.LayoutParams.WRAP_CONTENT,
                ViewGroup.LayoutParams.MATCH_PARENT,
            )
            win.setGravity(side)
        } else {
            win.setLayout(
                ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.WRAP_CONTENT,
            )
            win.setGravity(Gravity.TOP or side)
        }
    }

    init {
        with(window!!) {
            addFlags(
@@ -62,13 +107,6 @@ constructor(
                attributes.apply {
                    title = "VolumeDialog" // Not the same as Window#setTitle
                }
            if (isVolumeDialogVertical) {
                setLayout(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT)
                setGravity(Gravity.END)
            } else {
                setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
                setGravity(Gravity.TOP or Gravity.END)
            }
        }
        setCancelable(false)
        setCanceledOnTouchOutside(false)
@@ -93,6 +131,26 @@ constructor(
        }
    }

    override fun onStart() {
        super.onStart()
        context.contentResolver.registerContentObserver(
            LineageSettings.Secure.getUriFor(LineageSettings.Secure.VOLUME_PANEL_ON_LEFT),
            false,
            volumePanelOnLeftObserver,
            UserHandle.USER_ALL
        )
        volumePanelOnLeft = LineageSettings.Secure.getIntForUser(
            context.contentResolver, LineageSettings.Secure.VOLUME_PANEL_ON_LEFT,
            0, UserHandle.USER_CURRENT
        ) != 0
        applyLayoutAndGravity()
    }

    override fun onStop() {
        super.onStop()
        context.contentResolver.unregisterContentObserver(volumePanelOnLeftObserver)
    }

    /**
     * NOTE: This will be called with ACTION_OUTSIDE MotionEvents for touches that occur outside of
     * the touchable region of the volume dialog (as returned by [.onComputeInternalInsets]) even if
+23 −4
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.systemui.volume.dialog.ui.binder

import android.app.Dialog
import android.content.Context
import android.view.Gravity
import android.view.MotionEvent
import android.view.View
import android.view.ViewGroup
@@ -165,7 +166,17 @@ constructor(
        dialog: Dialog,
        visibilityModel: Flow<VolumeDialogVisibilityModel>,
    ) {
        view.applyAnimationProgress(FRACTION_HIDE)
        val isLeft =
            dialog.window?.let { window ->
                val absGravity = Gravity.getAbsoluteGravity(
                    window.attributes.gravity,
                    view.layoutDirection
                )
                (absGravity and Gravity.LEFT) == Gravity.LEFT ||
                    (absGravity and Gravity.START) == Gravity.START
            } ?: false

        view.applyAnimationProgress(FRACTION_HIDE, isLeft)
        val animationValueHolder = FloatValueHolder(FRACTION_HIDE)
        val animation: SpringAnimation =
            SpringAnimation(animationValueHolder)
@@ -175,7 +186,7 @@ constructor(
                        .setDampingRatio(SPRING_DAMPING_RATIO)
                )
                .setMinimumVisibleChange(ANIMATION_MINIMUM_VISIBLE_CHANGE)
                .addUpdateListener { _, value, _ -> view.applyAnimationProgress(value) }
                .addUpdateListener { _, value, _ -> view.applyAnimationProgress(value, isLeft) }
        var junkListener: DynamicAnimation.OnAnimationUpdateListener? = null

        visibilityModel
@@ -209,10 +220,18 @@ constructor(

    /**
     * @param fraction in range [0, 1]. 0 corresponds to the dialog being hidden and 1 - visible.
     * @param isLeft whether the dialog is positioned on the left side of the screen.
     */
    private fun View.applyAnimationProgress(fraction: Float) {
    private fun View.applyAnimationProgress(fraction: Float, isLeft: Boolean) {
        alpha = ceil(fraction)
        translationX = lerp(width, 0, fraction).toFloat()

        val startTranslationX = if (isLeft) {
            -width.toFloat()
        } else {
            width.toFloat()
        }

        translationX = lerp(startTranslationX, 0f, fraction)
    }

    private suspend fun View.applyVerticalOffset(offsetPx: Float, shouldAnimate: Boolean) {