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

Commit d8b49d39 authored by Julia Reynolds's avatar Julia Reynolds Committed by Android (Google) Code Review
Browse files

Merge "Volume dialog redesign"

parents 4ba2c3f4 0a22856a
Loading
Loading
Loading
Loading
+46 −100
Original line number Diff line number Diff line
@@ -17,91 +17,46 @@
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/transparent"
    android:theme="@style/qs_theme"
    android:clipChildren="false" >
    <RelativeLayout
    <LinearLayout
        android:id="@+id/volume_dialog"
        android:layout_width="match_parent"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingTop="@dimen/volume_row_padding_bottom"
        android:background="@drawable/rounded_full_bg_bottom"
        android:layout_gravity="center_vertical|end"
        android:minWidth="@dimen/volume_dialog_panel_width"
        android:background="@android:color/transparent"
        android:layout_margin="12dp"
        android:translationZ="8dp"
        android:orientation="vertical"
        android:clipChildren="false" >

        <LinearLayout
            android:id="@+id/volume_dialog_content"
            android:layout_width="match_parent"
            android:id="@+id/volume_dialog_rows"
            android:layout_width="@dimen/volume_dialog_panel_width"
            android:layout_height="wrap_content"
            android:layout_toStartOf="@id/expand"
            android:clipChildren="false"
            android:clipToPadding="false"
            android:orientation="vertical" >

            <LinearLayout
                android:id="@+id/volume_dialog_rows"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical" >
            android:paddingTop="12dp"
            android:paddingBottom="12dp"
            android:background="@drawable/rounded_bg_full"
            android:orientation="horizontal" >
                <!-- volume rows added and removed here! :-) -->
        </LinearLayout>


        </LinearLayout>
        <LinearLayout
            android:id="@+id/expand"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:layout_alignParentEnd="true"
            android:layout_alignParentTop="true"
            android:layout_marginEnd="@dimen/volume_expander_margin_end" >
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:ellipsize="end"
                android:maxLines="1"
                android:textAppearance="@style/TextAppearance.Volume.Header" />
            <com.android.keyguard.AlphaOptimizedImageButton
                xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:tools="http://schemas.android.com/tools"
                android:id="@+id/volume_expand_button"
                style="@style/VolumeButtons"
                android:layout_width="@dimen/volume_button_size"
                android:layout_height="@dimen/volume_button_size"
                android:clickable="true"
                android:soundEffectsEnabled="false"
                android:src="@drawable/ic_volume_expand_animation"
                android:background="@drawable/ripple_drawable"
                tools:ignore="RtlHardcoded" />
        </LinearLayout>
        <RelativeLayout
            android:id="@+id/footer"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_width="@dimen/volume_dialog_panel_width"
            android:layout_height="@dimen/volume_dialog_panel_width"
            android:clipChildren="false"
            android:clipToPadding="false"
            android:layout_below="@id/volume_dialog_content"
            android:layout_margin="10dp">
            <!-- special row for ringer mode -->
            <RelativeLayout
                android:id="@+id/ringer_mode"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
            android:layout_marginTop="6dp"
            android:layout_marginBottom="6dp"
            android:layout_below="@id/volume_dialog_rows"
            android:background="@drawable/rounded_bg_full"
                android:clipChildren="false"
                android:clipToPadding="false"
                android:layout_toStartOf="@id/output_chooser"
                android:layout_margin="10dp">

                <com.android.keyguard.AlphaOptimizedImageButton
                    android:id="@+id/ringer_icon"
                    style="@style/VolumeButtons"
                    android:background="?android:selectableItemBackgroundBorderless"
                    android:layout_width="@dimen/volume_button_size"
                    android:layout_height="@dimen/volume_button_size"
                    android:layout_alignParentStart="true"
                    android:layout_centerVertical="true"
                    android:soundEffectsEnabled="false" />
            android:gravity="center"
            android:orientation="vertical" >

            <TextView
                android:id="@+id/ringer_title"
@@ -110,37 +65,28 @@
                android:layout_height="wrap_content"
                android:ellipsize="end"
                android:maxLines="1"
                    android:layout_alignParentStart="true"
                android:layout_centerVertical="true"
                    android:layout_toEndOf="@+id/ringer_icon"
                    android:layout_marginStart="64dp"
                android:textColor="?android:attr/colorControlNormal"
                    android:textAppearance="?android:attr/textAppearanceSmall"
                    android:paddingStart="@dimen/volume_row_header_padding_start" />
                android:textAppearance="?android:attr/textAppearanceSmall" />

            <com.android.keyguard.AlphaOptimizedImageButton
                android:id="@+id/ringer_icon"
                style="@style/VolumeButtons"
                android:background="?android:selectableItemBackgroundBorderless"
                android:layout_width="@dimen/volume_button_size"
                android:layout_height="@dimen/volume_button_size"
                android:tint="?android:attr/colorAccent"
                android:soundEffectsEnabled="false" />

            <TextView
                android:id="@+id/ringer_status"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:ellipsize="end"
                    android:layout_alignParentEnd="true"
                    android:layout_centerVertical="true"
                    android:layout_marginEnd="14dp"
                android:maxLines="1"
                android:textColor="?android:attr/colorControlNormal"
                android:textAppearance="?android:attr/textAppearanceSmall" />

            </RelativeLayout>
            <com.android.keyguard.AlphaOptimizedImageButton
                android:id="@+id/output_chooser"
                style="@style/VolumeButtons"
                android:background="?android:selectableItemBackgroundBorderless"
                android:layout_width="@dimen/volume_button_size"
                android:layout_height="@dimen/volume_button_size"
                android:layout_alignParentEnd="true"
                android:layout_centerVertical="true"
                android:src="@drawable/ic_settings_bluetooth"
                android:soundEffectsEnabled="false" />
        </RelativeLayout>
    </RelativeLayout>
        </LinearLayout>
    </LinearLayout>
</com.android.systemui.volume.VolumeUiLayout>
 No newline at end of file
+57 −35
Original line number Diff line number Diff line
@@ -15,13 +15,21 @@
-->
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="@dimen/volume_row_height"
    android:clipChildren="false"
    android:clipToPadding="false"
    android:tag="row"
    android:layout_height="wrap_content"
    android:layout_width="@dimen/volume_dialog_panel_width"
    android:clipChildren="true"
    android:clipToPadding="true"
    android:theme="@style/qs_theme"
    android:gravity="center"
    android:orientation="vertical" >

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:padding="10dp">
        <TextView
            android:id="@+id/volume_row_header"
            android:layout_width="wrap_content"
@@ -29,34 +37,48 @@
            android:ellipsize="end"
            android:maxLines="1"
            android:textColor="?android:attr/colorControlNormal"
        android:textAppearance="?android:attr/textAppearanceSmall"
        android:paddingStart="@dimen/volume_row_header_padding_start" />

    <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="@dimen/volume_row_slider_height"
            android:orientation="horizontal"
            android:paddingStart="@dimen/volume_row_padding_start" >
            android:textAppearance="?android:attr/textAppearanceSmall" />
        <TextView
            android:id="@+id/volume_row_connected_device"
            android:visibility="gone"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:ellipsize="end"
            android:maxLines="1"
            android:textAppearance="@style/TextAppearance.QS.DetailItemSecondary" />
        <com.android.keyguard.AlphaOptimizedImageButton
                android:id="@+id/volume_row_icon"
            android:id="@+id/output_chooser"
            style="@style/VolumeButtons"
            android:background="?android:selectableItemBackgroundBorderless"
            android:layout_width="@dimen/volume_button_size"
                android:layout_height="@dimen/volume_button_size"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:src="@drawable/ic_volume_expand_animation"
            android:soundEffectsEnabled="false" />

    </LinearLayout>
    <FrameLayout
        android:id="@+id/volume_row_slider_frame"
        android:padding="10dp"
        android:layout_width="@dimen/volume_dialog_panel_width"
        android:layout_height="150dp">
        <SeekBar
            android:id="@+id/volume_row_slider"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_alignWithParentIfMissing="true"
            android:padding="0dp"
            android:layout_margin="0dp"
            android:layout_width="150dp"
            android:layout_height="@dimen/volume_dialog_panel_width"
            android:layout_gravity="center"
            android:focusable="true"
            android:focusableInTouchMode="true"
                android:paddingStart="@dimen/volume_row_slider_padding_start"/>
    </LinearLayout>
            android:rotation="270" />
    </FrameLayout>

    <Space
        android:id="@+id/spacer"
        android:layout_width="match_parent"
        android:layout_height="@dimen/volume_row_padding_bottom"/>
    <com.android.keyguard.AlphaOptimizedImageButton
        android:id="@+id/volume_row_icon"
        style="@style/VolumeButtons"
        android:padding="10dp"
        android:layout_width="@dimen/volume_button_size"
        android:layout_height="@dimen/volume_button_size"
        android:soundEffectsEnabled="false" />

</LinearLayout>
 No newline at end of file
+1 −1
Original line number Diff line number Diff line
@@ -264,7 +264,7 @@
    <!-- The width of the panel that holds the quick settings. -->
    <dimen name="qs_panel_width">@dimen/notification_panel_width</dimen>

    <dimen name="volume_dialog_panel_width">315dp</dimen>
    <dimen name="volume_dialog_panel_width">120dp</dimen>

    <!-- Gravity for the notification panel -->
    <integer name="notification_panel_layout_gravity">0x31</integer><!-- center_horizontal|top -->
+1 −1
Original line number Diff line number Diff line
@@ -52,7 +52,7 @@ public class VolumeDialogComponent implements VolumeComponent, TunerService.Tuna
    public static final String VOLUME_UP_SILENT = "sysui_volume_up_silent";
    public static final String VOLUME_SILENT_DO_NOT_DISTURB = "sysui_do_not_disturb";

    public static final boolean DEFAULT_VOLUME_DOWN_TO_ENTER_SILENT = true;
    public static final boolean DEFAULT_VOLUME_DOWN_TO_ENTER_SILENT = false;
    public static final boolean DEFAULT_VOLUME_UP_TO_EXIT_SILENT = true;
    public static final boolean DEFAULT_DO_NOT_DISTURB_WHEN_SILENT = true;

+23 −104
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import static android.accessibilityservice.AccessibilityServiceInfo.FEEDBACK_ALL
import static android.accessibilityservice.AccessibilityServiceInfo.FEEDBACK_GENERIC;

import static com.android.systemui.volume.Events.DISMISS_REASON_OUTPUT_CHOOSER;
import static com.android.systemui.volume.Events.DISMISS_REASON_SETTINGS_CLICKED;
import static com.android.systemui.volume.Events.DISMISS_REASON_TOUCH_OUTSIDE;

import android.accessibilityservice.AccessibilityServiceInfo;
@@ -30,14 +31,13 @@ import android.app.Dialog;
import android.app.KeyguardManager;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.res.ColorStateList;
import android.content.res.Resources;
import android.graphics.Color;
import android.graphics.Rect;
import android.graphics.drawable.AnimatedVectorDrawable;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.media.AudioManager;
import android.media.AudioSystem;
import android.os.Debug;
@@ -45,9 +45,8 @@ import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.os.SystemClock;
import android.provider.Settings;
import android.provider.Settings.Global;
import android.transition.AutoTransition;
import android.transition.TransitionManager;
import android.util.Log;
import android.util.Slog;
import android.util.SparseBooleanArray;
@@ -72,7 +71,6 @@ import android.widget.TextView;

import com.android.settingslib.Utils;
import com.android.systemui.Dependency;
import com.android.systemui.Interpolators;
import com.android.systemui.R;
import com.android.systemui.plugins.VolumeDialog;
import com.android.systemui.plugins.VolumeDialogController;
@@ -104,7 +102,6 @@ public class VolumeDialogImpl implements VolumeDialog {
    private CustomDialog mDialog;
    private ViewGroup mDialogView;
    private ViewGroup mDialogRowsView;
    private ImageButton mExpandButton;
    private ImageButton mRingerIcon;
    private ImageButton mOutputChooser;
    private TextView mRingerStatus;
@@ -120,8 +117,6 @@ public class VolumeDialogImpl implements VolumeDialog {
    private final ColorStateList mInactiveSliderTint;

    private boolean mShowing;
    private boolean mExpanded;
    private boolean mExpandButtonAnimationRunning;
    private boolean mShowA11yStream;

    private int mActiveStream;
@@ -182,11 +177,11 @@ public class VolumeDialogImpl implements VolumeDialog {

        mDialog.setContentView(R.layout.volume_dialog);
        mDialog.setOnShowListener(dialog -> {
            mDialogView.setTranslationY(-mDialogView.getHeight());
            mDialogView.setTranslationX(mDialogView.getWidth() / 2);
            mDialogView.setAlpha(0);
            mDialogView.animate()
                    .alpha(1)
                    .translationY(0)
                    .translationX(0)
                    .setDuration(300)
                    .setInterpolator(new SystemUIInterpolators.LogDecelerateInterpolator())
                    .withEndAction(() -> {
@@ -205,20 +200,10 @@ public class VolumeDialogImpl implements VolumeDialog {
        VolumeUiLayout hardwareLayout = VolumeUiLayout.get(mDialogView);
        hardwareLayout.setOutsideTouchListener(view -> dismiss(DISMISS_REASON_TOUCH_OUTSIDE));

        ViewGroup dialogContentView = mDialog.findViewById(R.id.volume_dialog_content);
        mDialogRowsView = dialogContentView.findViewById(R.id.volume_dialog_rows);
        mDialogRowsView = mDialog.findViewById(R.id.volume_dialog_rows);
        mRingerIcon = mDialog.findViewById(R.id.ringer_icon);
        mRingerStatus = mDialog.findViewById(R.id.ringer_status);

        mExpanded = false;
        mExpandButton = mDialogView.findViewById(R.id.volume_expand_button);
        mExpandButton.setOnClickListener(mClickExpand);
        mExpandButton.setVisibility(
                AudioSystem.isSingleVolume(mContext) ? View.GONE : View.VISIBLE);

        mOutputChooser = mDialogView.findViewById(R.id.output_chooser);
        mOutputChooser.setOnClickListener(mClickOutputChooser);

        if (mRows.isEmpty()) {
            addRow(AudioManager.STREAM_MUSIC,
                    R.drawable.ic_volume_media, R.drawable.ic_volume_media_mute, true, true);
@@ -239,6 +224,10 @@ public class VolumeDialogImpl implements VolumeDialog {
        } else {
            addExistingRows();
        }

        mOutputChooser = mDialogView.findViewById(R.id.output_chooser);
        mOutputChooser.setOnClickListener(mClickOutputChooser);

        updateRowsH(getActiveRow());
        initRingerH();
    }
@@ -273,11 +262,9 @@ public class VolumeDialogImpl implements VolumeDialog {
        VolumeRow row = new VolumeRow();
        initRow(row, stream, iconRes, iconMuteRes, important, defaultStream);
        int rowSize;
        int viewSize;
        if (mShowA11yStream && dynamic && (rowSize = mRows.size()) > 1
                && (viewSize = mDialogRowsView.getChildCount()) > 1) {
            // A11y Stream should be the last in the list
            mDialogRowsView.addView(row.view, viewSize - 2);
        if (mShowA11yStream && dynamic && (rowSize = mRows.size()) > 1) {
            // A11y Stream should be the first in the list, so it's shown to start of other rows
            mDialogRowsView.addView(row.view, 0);
            mRows.add(rowSize - 2, row);
        } else {
            mDialogRowsView.addView(row.view);
@@ -315,7 +302,6 @@ public class VolumeDialogImpl implements VolumeDialog {
    public void dump(PrintWriter writer) {
        writer.println(VolumeDialogImpl.class.getSimpleName() + " state:");
        writer.print("  mShowing: "); writer.println(mShowing);
        writer.print("  mExpanded: "); writer.println(mExpanded);
        writer.print("  mActiveStream: "); writer.println(mActiveStream);
        writer.print("  mDynamic: "); writer.println(mDynamic);
        writer.print("  mAutomute: "); writer.println(mAutomute);
@@ -432,6 +418,13 @@ public class VolumeDialogImpl implements VolumeDialog {
            }
            updateRingerH();
        });
        mRingerIcon.setOnLongClickListener(v -> {
            Intent intent = new Intent(Settings.ACTION_SOUND_SETTINGS);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            dismissH(DISMISS_REASON_SETTINGS_CLICKED);
            mContext.startActivity(intent);
            return true;
        });
        updateRingerH();
    }

@@ -468,7 +461,6 @@ public class VolumeDialogImpl implements VolumeDialog {
    private int computeTimeoutH() {
        if (mAccessibility.mFeedbackEnabled) return 20000;
        if (mHovering) return 16000;
        if (mExpanded) return 5000;
        if (mSafetyWarning != null) return 5000;
        return 3000;
    }
@@ -480,13 +472,11 @@ public class VolumeDialogImpl implements VolumeDialog {
        mDialogView.animate().cancel();
        mShowing = false;

        updateExpandedH(false /* expanding */, true /* dismissing */);

        mDialogView.setTranslationY(0);
        mDialogView.setTranslationX(0);
        mDialogView.setAlpha(1);
        mDialogView.animate()
                .alpha(0)
                .translationY(-mDialogView.getHeight())
                .translationX(mDialogView.getWidth() / 2)
                .setDuration(250)
                .setInterpolator(new SystemUIInterpolators.LogAccelerateInterpolator())
                .withEndAction(() -> mHandler.postDelayed(() -> {
@@ -514,67 +504,6 @@ public class VolumeDialogImpl implements VolumeDialog {
        }
    }

    private void updateExpandedH(final boolean expanded, final boolean dismissing) {
        if (D.BUG) Log.d(TAG, "updateExpandedH " + expanded);

        if (mExpanded == expanded) return;
        mExpanded = expanded;
        mExpandButtonAnimationRunning = isAttached();
        updateExpandButtonH();
        TransitionManager.endTransitions(mDialogView);
        final VolumeRow activeRow = getActiveRow();
        if (!dismissing) {
            mWindow.setLayout(mWindow.getAttributes().width, ViewGroup.LayoutParams.MATCH_PARENT);
            TransitionManager.beginDelayedTransition(mDialogView, getTransition());
        }
        updateRowsH(activeRow);
        rescheduleTimeoutH();
    }

    private AutoTransition getTransition() {
        AutoTransition transition = new AutoTransition();
        transition.setDuration(300);
        transition.setInterpolator(Interpolators.LINEAR_OUT_SLOW_IN);
        return transition;
    }

    private void updateExpandButtonH() {
        if (D.BUG) Log.d(TAG, "updateExpandButtonH");

        mExpandButton.setClickable(!mExpandButtonAnimationRunning);
        if (!(mExpandButtonAnimationRunning && isAttached())) {
            final int res = mExpanded ? R.drawable.ic_volume_collapse_animation
                    : R.drawable.ic_volume_expand_animation;
            if (hasTouchFeature()) {
                mExpandButton.setImageResource(res);
            } else {
                // if there is no touch feature, show the volume ringer instead
                mExpandButton.setImageResource(R.drawable.ic_volume_ringer);
                mExpandButton.setBackgroundResource(0);  // remove gray background emphasis
            }
            mExpandButton.setContentDescription(mContext.getString(mExpanded ?
                    R.string.accessibility_volume_collapse : R.string.accessibility_volume_expand));
        }
        if (mExpandButtonAnimationRunning) {
            final Drawable d = mExpandButton.getDrawable();
            if (d instanceof AnimatedVectorDrawable) {
                // workaround to reset drawable
                final AnimatedVectorDrawable avd = (AnimatedVectorDrawable) d.getConstantState()
                        .newDrawable();
                mExpandButton.setImageDrawable(avd);
                avd.start();
                mHandler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        mExpandButtonAnimationRunning = false;
                        updateExpandButtonH();
                        rescheduleTimeoutH();
                    }
                }, 300);
            }
        }
    }

    private boolean isAttached() {
        return mDialogView != null && mDialogView.isAttachedToWindow();
    }
@@ -597,7 +526,7 @@ public class VolumeDialogImpl implements VolumeDialog {
            return true;
        }

        return row.defaultStream || isActive || (mExpanded && row.important);
        return row.defaultStream || isActive;
    }

    private void updateRowsH(final VolumeRow activeRow) {
@@ -954,16 +883,6 @@ public class VolumeDialogImpl implements VolumeDialog {
        }
    }

    private final OnClickListener mClickExpand = new OnClickListener() {
        @Override
        public void onClick(View v) {
            mExpandButton.animate().cancel();
            final boolean newExpand = !mExpanded;
            Events.writeEvent(mContext, Events.EVENT_EXPAND, newExpand);
            updateExpandedH(newExpand, false /* dismissing */);
        }
    };

    private final OnClickListener mClickOutputChooser = new OnClickListener() {
        @Override
        public void onClick(View v) {
Loading