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

Commit 5076c061 authored by Jesse Chan's avatar Jesse Chan Committed by Bruno Martins
Browse files

VolumeDialog: Implement expand/collapse animation



Change-Id: Ic226d3d22fc434df7cd265c77fb99c33664e974b
Signed-off-by: default avatarJesse Chan <jc@lineageos.org>
parent c052d65a
Loading
Loading
Loading
Loading
+60 −13
Original line number Diff line number Diff line
@@ -35,7 +35,10 @@ import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
import static com.android.settingslib.media.MediaOutputSliceConstants.ACTION_MEDIA_OUTPUT;
import static com.android.systemui.volume.Events.DISMISS_REASON_SETTINGS_CLICKED;

import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.annotation.SuppressLint;
import android.app.ActivityManager;
import android.app.Dialog;
@@ -267,6 +270,8 @@ public class VolumeDialogImpl implements VolumeDialog,

        mDialogView = mDialog.findViewById(R.id.volume_dialog);
        mDialogView.setAlpha(0);
        mDialogView.setLayoutDirection(mVolumePanelOnLeft ?
                View.LAYOUT_DIRECTION_LTR : View.LAYOUT_DIRECTION_RTL);

        mDialogView.setOnHoverListener((v, event) -> {
            int action = event.getActionMasked();
@@ -448,7 +453,7 @@ public class VolumeDialogImpl implements VolumeDialog,
        if (D.BUG) Slog.d(TAG, "Adding row for stream " + stream);
        VolumeRow row = new VolumeRow();
        initRow(row, stream, iconRes, iconMuteRes, important, defaultStream);
        mDialogRowsView.addView(row.view, mVolumePanelOnLeft ? -1 : 0);
        mDialogRowsView.addView(row.view);
        mRows.add(row);
    }

@@ -458,7 +463,7 @@ public class VolumeDialogImpl implements VolumeDialog,
            final VolumeRow row = mRows.get(i);
            initRow(row, row.stream, row.iconRes, row.iconMuteRes, row.important,
                    row.defaultStream);
            mDialogRowsView.addView(row.view, mVolumePanelOnLeft ? -1 : 0);
            mDialogRowsView.addView(row.view);
            updateVolumeRowH(row);
        }
    }
@@ -552,6 +557,55 @@ public class VolumeDialogImpl implements VolumeDialog,
                == BluetoothProfile.STATE_CONNECTED;
    }

    private void updateExpandedRows(boolean expand) {
        if (!expand) mController.setActiveStream(mAllyStream);
        if (mMusicHidden) {
            Util.setVisOrGone(findRow(AudioManager.STREAM_MUSIC).view, expand);
        }
        Util.setVisOrGone(findRow(AudioManager.STREAM_RING).view, expand);
        Util.setVisOrGone(findRow(STREAM_ALARM).view, expand);
        if (!isNotificationVolumeLinked()) {
            Util.setVisOrGone(
                    findRow(AudioManager.STREAM_NOTIFICATION).view, expand);
        }
    }

    private void animateExpandedRowsChange(boolean expand) {
        final int startWidth = mDialogRowsView.getLayoutParams().width;
        final int targetWidth;

        if (expand) {
            updateExpandedRows(expand);
            mDialogRowsView.measure(WRAP_CONTENT, WRAP_CONTENT);
            targetWidth = mDialogRowsView.getMeasuredWidth();
        } else {
            targetWidth = mContext.getResources().getDimensionPixelSize(
                    R.dimen.volume_dialog_panel_width);
        }

        ValueAnimator animator = ValueAnimator.ofInt(startWidth, targetWidth);
        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator valueAnimator) {
                mDialogRowsView.getLayoutParams().width =
                        (Integer) valueAnimator.getAnimatedValue();
                mDialogRowsView.requestLayout();
            }
        });
        animator.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
                if (!expand) {
                    updateExpandedRows(expand);
                }
            }
        });
        animator.setInterpolator(expand ? new SystemUIInterpolators.LogDecelerateInterpolator()
                : new SystemUIInterpolators.LogAccelerateInterpolator());
        animator.setDuration(UPDATE_ANIMATION_DURATION);
        animator.start();
    }

    public void updateMediaOutputH() {
        if (mMediaOutputView != null) {
            mMediaOutputView.setVisibility(
@@ -586,18 +640,8 @@ public class VolumeDialogImpl implements VolumeDialog,
        if (mExpandRows != null) {
            mExpandRows.setOnClickListener(v -> {
                rescheduleTimeoutH();
                if (mMusicHidden) {
                    Util.setVisOrGone(findRow(AudioManager.STREAM_MUSIC).view,
                            !mExpanded);
                }
                Util.setVisOrGone(findRow(AudioManager.STREAM_RING).view, !mExpanded);
                Util.setVisOrGone(findRow(STREAM_ALARM).view, !mExpanded);
                if (!isNotificationVolumeLinked()) {
                    Util.setVisOrGone(
                            findRow(AudioManager.STREAM_NOTIFICATION).view, !mExpanded);
                }
                animateExpandedRowsChange(!mExpanded);

                if (mExpanded) mController.setActiveStream(mAllyStream);
                mExpandRows.setExpanded(!mExpanded);
                mExpanded = !mExpanded;

@@ -916,6 +960,9 @@ public class VolumeDialogImpl implements VolumeDialog,
                        mWindowManager.removeViewImmediate(mDialog);
                    }
                    mExpanded = false;
                    mDialogRowsView.getLayoutParams().width = mContext.getResources()
                            .getDimensionPixelSize(R.dimen.volume_dialog_panel_width);
                    updateExpandedRows(mExpanded);
                    mExpandRows.setExpanded(mExpanded);
                    mAllyStream = -1;
                    mMusicHidden = false;