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

Commit 30dd125a authored by Julia Reynolds's avatar Julia Reynolds
Browse files

The volume dialog window size should match content

So tapping outside the panel taps on underlying windows

Test: manual
Change-Id: Ie90567d6f1c16657b33f932fb95804f8b26383f9
Fixes: 73165559
parent 4945e8e3
Loading
Loading
Loading
Loading
+4 −5
Original line number Diff line number Diff line
@@ -15,8 +15,8 @@
-->
<com.android.systemui.volume.VolumeUiLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@android:color/transparent"
    android:theme="@style/qs_theme"
    android:clipChildren="false" >
@@ -29,7 +29,6 @@
        android:minWidth="@dimen/volume_dialog_panel_width"
        android:background="@android:color/transparent"
        android:layout_margin="@dimen/volume_dialog_base_margin"
        android:translationZ="8dp"
        android:orientation="vertical"
        android:clipChildren="false" >

@@ -42,7 +41,7 @@
            android:paddingTop="10dp"
            android:paddingBottom="10dp"
            android:background="@drawable/rounded_bg_full"
            android:translationZ="8dp"
            android:translationZ="@dimen/volume_panel_elevation"
            android:orientation="horizontal" >
                <!-- volume rows added and removed here! :-) -->
        </LinearLayout>
@@ -59,7 +58,7 @@
            android:background="@drawable/rounded_bg_full"
            android:gravity="center"
            android:layout_gravity="end"
            android:translationZ="8dp"
            android:translationZ="@dimen/volume_panel_elevation"
            android:clickable="true"
            android:orientation="vertical" >

+2 −0
Original line number Diff line number Diff line
@@ -704,6 +704,8 @@
    <dimen name="volume_expander_margin_end">2dp</dimen>
    <dimen name="volume_expander_margin_top">6dp</dimen>

    <dimen name="volume_panel_elevation">8dp</dimen>

    <!-- Padding between icon and text for managed profile toast -->
    <dimen name="managed_profile_toast_padding">4dp</dimen>

+24 −8
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@ import android.content.pm.PackageManager;
import android.content.res.ColorStateList;
import android.content.res.Resources;
import android.graphics.Color;
import android.graphics.PixelFormat;
import android.graphics.drawable.ColorDrawable;
import android.media.AudioManager;
import android.media.AudioSystem;
@@ -54,6 +55,7 @@ import android.util.Log;
import android.util.Slog;
import android.util.SparseBooleanArray;
import android.view.ContextThemeWrapper;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.AccessibilityDelegate;
@@ -176,7 +178,15 @@ public class VolumeDialogImpl implements VolumeDialog {
        mWindow.setTitle(VolumeDialogImpl.class.getSimpleName());
        mWindow.setType(WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY);
        mWindow.setWindowAnimations(com.android.internal.R.style.Animation_Toast);

        final WindowManager.LayoutParams lp = mWindow.getAttributes();
        lp.format = PixelFormat.TRANSLUCENT;
        lp.setTitle(VolumeDialogImpl.class.getSimpleName());
        lp.gravity = Gravity.RIGHT | Gravity.CENTER_VERTICAL;
        lp.windowAnimations = -1;
        mWindow.setAttributes(lp);
        mWindow.setLayout(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);

        mDialog.setCanceledOnTouchOutside(true);
        mDialog.setContentView(R.layout.volume_dialog);
        mDialog.setOnShowListener(dialog -> {
            mDialogView.setTranslationX(mDialogView.getWidth() / 2);
@@ -199,8 +209,8 @@ public class VolumeDialogImpl implements VolumeDialog {
            rescheduleTimeoutH();
            return true;
        });
        VolumeUiLayout hardwareLayout = VolumeUiLayout.get(mDialogView);
        hardwareLayout.setOutsideTouchListener(view -> dismiss(DISMISS_REASON_TOUCH_OUTSIDE));
        VolumeUiLayout uiLayout = VolumeUiLayout.get(mDialogView);
        uiLayout.updateRotation();

        mDialogRowsView = mDialog.findViewById(R.id.volume_dialog_rows);
        mFooter = mDialog.findViewById(R.id.footer);
@@ -1014,16 +1024,22 @@ public class VolumeDialogImpl implements VolumeDialog {
            mHandler.sendEmptyMessage(H.RECHECK_ALL);
        }

        @Override
        public boolean onTouchEvent(MotionEvent event) {
            if (isShowing()) {
                if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {
                    dismissH(Events.DISMISS_REASON_TOUCH_OUTSIDE);
                    return true;
                }
            }
            return false;
        }

        @Override
        public boolean dispatchPopulateAccessibilityEvent(@NonNull AccessibilityEvent event) {
            event.setClassName(getClass().getSuperclass().getName());
            event.setPackageName(mContext.getPackageName());

            ViewGroup.LayoutParams params = getWindow().getAttributes();
            boolean isFullScreen = (params.width == ViewGroup.LayoutParams.MATCH_PARENT) &&
                    (params.height == ViewGroup.LayoutParams.MATCH_PARENT);
            event.setFullScreen(isFullScreen);

            if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {
                if (mShowing) {
                    event.getText().add(mContext.getString(
+6 −56
Original line number Diff line number Diff line
@@ -37,10 +37,6 @@ import com.android.systemui.util.leak.RotationUtils;
public class VolumeUiLayout extends FrameLayout  {

    private View mChild;
    private int mOldHeight;
    private boolean mAnimating;
    private AnimatorSet mAnimation;
    private boolean mHasOutsideTouch;
    private int mRotation = ROTATION_NONE;
    @Nullable
    private DisplayCutout mDisplayCutout;
@@ -52,13 +48,11 @@ public class VolumeUiLayout extends FrameLayout {
    @Override
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();
        getViewTreeObserver().addOnComputeInternalInsetsListener(mInsetsListener);
    }

    @Override
    protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        getViewTreeObserver().removeOnComputeInternalInsetsListener(mInsetsListener);
        mDisplayCutout = null;
    }

@@ -68,16 +62,11 @@ public class VolumeUiLayout extends FrameLayout {
        if (mChild == null) {
            if (getChildCount() != 0) {
                mChild = getChildAt(0);
                mOldHeight = mChild.getMeasuredHeight();
                updateRotation();
            } else {
                return;
            }
        }
        int newHeight = mChild.getMeasuredHeight();
        if (newHeight != mOldHeight) {
            animateChild(mOldHeight, newHeight);
        }
    }

    @Override
@@ -95,8 +84,13 @@ public class VolumeUiLayout extends FrameLayout {
        }
    }

    private void updateRotation() {
    public void updateRotation() {
        setDisplayCutout();
        if (mChild == null) {
            if (getChildCount() != 0) {
                mChild = getChildAt(0);
            }
        }
        int rotation = RotationUtils.getRotation(getContext());
        if (rotation != mRotation) {
            updateSafeInsets(rotation);
@@ -144,43 +138,11 @@ public class VolumeUiLayout extends FrameLayout {
        return r.bottom - r.top;
    }


    private void animateChild(int oldHeight, int newHeight) {
        if (true) return;
        if (mAnimating) {
            mAnimation.cancel();
        }
        mAnimating = true;
        mAnimation = new AnimatorSet();
        mAnimation.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
                mAnimating = false;
            }
        });
        int fromTop = mChild.getTop();
        int fromBottom = mChild.getBottom();
        int toTop = fromTop - ((newHeight - oldHeight) / 2);
        int toBottom = fromBottom + ((newHeight - oldHeight) / 2);
        ObjectAnimator top = ObjectAnimator.ofInt(mChild, "top", fromTop, toTop);
        mAnimation.playTogether(top,
                ObjectAnimator.ofInt(mChild, "bottom", fromBottom, toBottom));
    }


    @Override
    public ViewOutlineProvider getOutlineProvider() {
        return super.getOutlineProvider();
    }

    public void setOutsideTouchListener(OnClickListener onClickListener) {
        mHasOutsideTouch = true;
        requestLayout();
        setOnClickListener(onClickListener);
        setClickable(true);
        setFocusable(true);
    }

    public static VolumeUiLayout get(View v) {
        if (v instanceof VolumeUiLayout) return (VolumeUiLayout) v;
        if (v.getParent() instanceof View) {
@@ -188,16 +150,4 @@ public class VolumeUiLayout extends FrameLayout {
        }
        return null;
    }

    private final ViewTreeObserver.OnComputeInternalInsetsListener mInsetsListener = inoutInfo -> {
        if (mHasOutsideTouch || (mChild == null)) {
            inoutInfo.setTouchableInsets(
                    ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_FRAME);
            return;
        }
        inoutInfo.setTouchableInsets(
                ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_CONTENT);
        inoutInfo.contentInsets.set(mChild.getLeft(), mChild.getTop(),
                0, getBottom() - mChild.getBottom());
    };
}