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

Commit c1cc759a authored by Lucas Dupin's avatar Lucas Dupin
Browse files

Color extraction under Power and Volume menus

Bug: 37013646
Test: visual
Change-Id: I29a1734d49e8225f49133424841dfcbfbff59516
parent b2d50b4f
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -147,7 +147,7 @@ public class GradientDrawable extends Drawable {

    @Override
    public int getOpacity() {
        return mAlpha == 255 ? PixelFormat.OPAQUE : PixelFormat.TRANSLUCENT;
        return PixelFormat.TRANSLUCENT;
    }

    public void setScreenSize(int width, int height) {
+2 −0
Original line number Diff line number Diff line
@@ -307,6 +307,8 @@

    <style name="Theme.SystemUI.Dialog.Alert" parent="@*android:style/Theme.DeviceDefault.Light.Dialog.Alert" />

    <style name="Theme.SystemUI.Dialog.GlobalActions" parent="@android:style/Theme.DeviceDefault.Light.NoActionBar.Fullscreen" />

    <style name="QSBorderlessButton">
        <item name="android:padding">12dp</item>
        <item name="android:background">@drawable/qs_btn_borderless_rect</item>
+76 −7
Original line number Diff line number Diff line
@@ -14,6 +14,8 @@

package com.android.systemui.globalactions;

import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;

import com.android.internal.R;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
@@ -21,13 +23,17 @@ import com.android.internal.util.EmergencyAffordanceManager;
import com.android.internal.telephony.TelephonyIntents;
import com.android.internal.telephony.TelephonyProperties;
import com.android.internal.widget.LockPatternUtils;
import com.android.systemui.Dependency;
import com.android.systemui.HardwareUiLayout;
import com.android.systemui.plugins.GlobalActions.GlobalActionsManager;
import com.android.systemui.statusbar.phone.ScrimController;
import com.android.systemui.volume.VolumeDialogImpl;
import com.android.systemui.volume.VolumeDialogMotion.LogAccelerateInterpolator;
import com.android.systemui.volume.VolumeDialogMotion.LogDecelerateInterpolator;

import android.app.ActivityManager;
import android.app.Dialog;
import android.app.WallpaperManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
@@ -37,6 +43,8 @@ import android.content.pm.UserInfo;
import android.database.ContentObserver;
import android.database.DataSetObserver;
import android.graphics.Color;
import android.graphics.PixelFormat;
import android.graphics.Point;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.media.AudioManager;
@@ -59,9 +67,12 @@ import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.util.ArraySet;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewPropertyAnimator;
import android.view.Window;
import android.view.WindowManager;
import android.view.WindowManagerGlobal;
import android.view.accessibility.AccessibilityEvent;
@@ -73,6 +84,10 @@ import android.widget.ImageView.ScaleType;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.google.android.colorextraction.ColorExtractor;
import com.google.android.colorextraction.ColorExtractor.GradientColors;
import com.google.android.colorextraction.drawable.GradientDrawable;

import java.util.ArrayList;
import java.util.List;

@@ -208,8 +223,6 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener, DialogIn
            mDialog.getWindow().setAttributes(attrs);
            mDialog.show();
            mWindowManagerFuncs.onGlobalActionsShown();
            mDialog.getWindow().getDecorView().setSystemUiVisibility(
                    View.STATUS_BAR_DISABLE_EXPAND);
        }
    }

@@ -332,7 +345,7 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener, DialogIn
        };
        ActionsDialog dialog = new ActionsDialog(mContext, this, mAdapter, onItemLongClickListener);
        dialog.setCanceledOnTouchOutside(false); // Handled by the custom class.
        dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
        dialog.setKeyguardShowing(mKeyguardShowing);

        dialog.setOnDismissListener(this);

@@ -637,7 +650,6 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener, DialogIn
        refreshSilentMode();
        mAirplaneModeOn.updateState(mAirplaneState);
        mAdapter.notifyDataSetChanged();
        mDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
        if (mShowSilentToggle) {
            IntentFilter filter = new IntentFilter(AudioManager.RINGER_MODE_CHANGED_ACTION);
            mContext.registerReceiver(mRingerModeReceiver, filter);
@@ -1194,7 +1206,8 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener, DialogIn
        }
    }

    private static final class ActionsDialog extends Dialog implements DialogInterface {
    private static final class ActionsDialog extends Dialog implements DialogInterface,
            ColorExtractor.OnColorsChangedListener {

        private final Context mContext;
        private final MyAdapter mAdapter;
@@ -1202,16 +1215,35 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener, DialogIn
        private final HardwareUiLayout mHardwareLayout;
        private final OnClickListener mClickListener;
        private final OnItemLongClickListener mLongClickListener;
        private final GradientDrawable mGradientDrawable;
        private final ColorExtractor mColorExtractor;
        private boolean mKeyguardShowing;

        public ActionsDialog(Context context, OnClickListener clickListener, MyAdapter adapter,
                OnItemLongClickListener longClickListener) {
            super(context, android.R.style.Theme_DeviceDefault_Light_NoActionBar_Fullscreen);
            super(context, com.android.systemui.R.style.Theme_SystemUI_Dialog_GlobalActions);
            mContext = getContext();
            mAdapter = adapter;
            mClickListener = clickListener;
            mLongClickListener = longClickListener;
            mGradientDrawable = new GradientDrawable(mContext);
            mColorExtractor = Dependency.get(ColorExtractor.class);

            // Window initialization
            Window window = getWindow();
            window.requestFeature(Window.FEATURE_NO_TITLE);
            window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND
                    | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR);
            window.addFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                    | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
                    | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
                    | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                    | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
                    | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
            window.setBackgroundDrawable(mGradientDrawable);
            window.setType(WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY);

            setContentView(com.android.systemui.R.layout.global_actions_wrapped);
            getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
            mListView = findViewById(android.R.id.list);
            mHardwareLayout = HardwareUiLayout.get(mListView);
            mHardwareLayout.setOutsideTouchListener(view -> dismiss());
@@ -1234,16 +1266,26 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener, DialogIn
            super.setCanceledOnTouchOutside(true);
            super.onStart();
            updateList();

            Point displaySize = new Point();
            mContext.getDisplay().getRealSize(displaySize);
            mColorExtractor.addOnColorsChangedListener(this);
            mGradientDrawable.setScreenSize(displaySize.x, displaySize.y);
            GradientColors colors = mColorExtractor.getColors(mKeyguardShowing ?
                    WallpaperManager.FLAG_LOCK : WallpaperManager.FLAG_SYSTEM);
            mGradientDrawable.setColors(colors, false);
        }

        @Override
        protected void onStop() {
            super.onStop();
            mColorExtractor.removeOnColorsChangedListener(this);
        }

        @Override
        public void show() {
            super.show();
            mGradientDrawable.setAlpha(0);
            mHardwareLayout.setTranslationX(getAnimTranslation());
            mHardwareLayout.setAlpha(0);
            mHardwareLayout.animate()
@@ -1251,6 +1293,11 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener, DialogIn
                    .translationX(0)
                    .setDuration(300)
                    .setInterpolator(new LogDecelerateInterpolator())
                    .setUpdateListener(animation -> {
                        int alpha = (int) ((Float) animation.getAnimatedValue()
                                * ScrimController.GRADIENT_SCRIM_ALPHA * 255);
                        mGradientDrawable.setAlpha(alpha);
                    })
                    .start();
        }

@@ -1264,6 +1311,11 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener, DialogIn
                    .setDuration(300)
                    .withEndAction(() -> super.dismiss())
                    .setInterpolator(new LogAccelerateInterpolator())
                    .setUpdateListener(animation -> {
                        int alpha = (int) ((1f - (Float) animation.getAnimatedValue())
                                * ScrimController.GRADIENT_SCRIM_ALPHA * 255);
                        mGradientDrawable.setAlpha(alpha);
                    })
                    .start();
        }

@@ -1285,5 +1337,22 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener, DialogIn
            }
            return super.dispatchPopulateAccessibilityEvent(event);
        }

        @Override
        public void onColorsChanged(GradientColors colors, int which) {
            if (mKeyguardShowing) {
                if ((WallpaperManager.FLAG_LOCK & which) != 0) {
                    mGradientDrawable.setColors(colors);
                }
            } else {
                if ((WallpaperManager.FLAG_SYSTEM & which) != 0) {
                    mGradientDrawable.setColors(colors);
                }
            }
        }

        public void setKeyguardShowing(boolean keyguardShowing) {
            mKeyguardShowing = keyguardShowing;
        }
    }
}
+3 −2
Original line number Diff line number Diff line
@@ -57,10 +57,11 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener,
            = new PathInterpolator(0f, 0, 0.7f, 1f);
    public static final Interpolator KEYGUARD_FADE_OUT_INTERPOLATOR_LOCKED
            = new PathInterpolator(0.3f, 0f, 0.8f, 1f);
    public static final float GRADIENT_SCRIM_ALPHA = 0.75f;
    protected static final float SCRIM_BEHIND_ALPHA_KEYGUARD = 0.45f;
    protected static final float SCRIM_BEHIND_ALPHA_UNLOCKING = 0.2f;
    private static final float SCRIM_IN_FRONT_ALPHA = 0.75f;
    private static final float SCRIM_IN_FRONT_ALPHA_LOCKED = 0.85f;
    private static final float SCRIM_IN_FRONT_ALPHA = GRADIENT_SCRIM_ALPHA;
    private static final float SCRIM_IN_FRONT_ALPHA_LOCKED = GRADIENT_SCRIM_ALPHA;
    private static final int TAG_KEY_ANIM = R.id.scrim;
    private static final int TAG_KEY_ANIM_TARGET = R.id.scrim_target;
    private static final int TAG_START_ALPHA = R.id.scrim_alpha_start;
+39 −3
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ import android.annotation.NonNull;
import android.annotation.SuppressLint;
import android.app.Dialog;
import android.app.KeyguardManager;
import android.app.WallpaperManager;
import android.content.Context;
import android.content.pm.PackageManager;
import android.content.res.ColorStateList;
@@ -33,6 +34,7 @@ import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.Color;
import android.graphics.PixelFormat;
import android.graphics.Point;
import android.graphics.Rect;
import android.graphics.drawable.AnimatedVectorDrawable;
import android.graphics.drawable.ColorDrawable;
@@ -82,10 +84,14 @@ import com.android.systemui.plugins.VolumeDialogController;
import com.android.systemui.plugins.VolumeDialogController.State;
import com.android.systemui.plugins.VolumeDialogController.StreamState;
import com.android.systemui.plugins.VolumeDialog;
import com.android.systemui.statusbar.phone.ScrimController;
import com.android.systemui.statusbar.policy.ZenModeController;
import com.android.systemui.tuner.TunerService;
import com.android.systemui.tuner.TunerZenModePanel;

import com.google.android.colorextraction.ColorExtractor;
import com.google.android.colorextraction.drawable.GradientDrawable;

import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
@@ -97,7 +103,8 @@ import java.util.List;
 *
 * Methods ending in "H" must be called on the (ui) handler.
 */
public class VolumeDialogImpl implements VolumeDialog, TunerService.Tunable {
public class VolumeDialogImpl implements VolumeDialog, TunerService.Tunable,
        ColorExtractor.OnColorsChangedListener {
    private static final String TAG = Util.logTag(VolumeDialogImpl.class);

    public static final String SHOW_FULL_ZEN = "sysui_show_full_zen";
@@ -107,6 +114,8 @@ public class VolumeDialogImpl implements VolumeDialog, TunerService.Tunable {

    private final Context mContext;
    private final H mHandler = new H();
    private final GradientDrawable mGradientDrawable;
    private final ColorExtractor mColorExtractor;
    private VolumeDialogController mController;

    private Window mWindow;
@@ -161,6 +170,9 @@ public class VolumeDialogImpl implements VolumeDialog, TunerService.Tunable {
                (AccessibilityManager) mContext.getSystemService(Context.ACCESSIBILITY_SERVICE);
        mActiveSliderTint = ColorStateList.valueOf(Utils.getColorAccent(mContext));
        mInactiveSliderTint = loadColorStateList(R.color.volume_slider_inactive);
        mGradientDrawable = new GradientDrawable(mContext);
        mGradientDrawable.setAlpha((int) (ScrimController.GRADIENT_SCRIM_ALPHA * 255));
        mColorExtractor = Dependency.get(ColorExtractor.class);
    }

    public void init(int windowType, Callback callback) {
@@ -182,6 +194,7 @@ public class VolumeDialogImpl implements VolumeDialog, TunerService.Tunable {
    @Override
    public void destroy() {
        mController.removeCallback(mControllerCallbackH);
        mColorExtractor.removeOnColorsChangedListener(this);
    }

    private void initDialog() {
@@ -192,7 +205,7 @@ public class VolumeDialogImpl implements VolumeDialog, TunerService.Tunable {
        mShowing = false;
        mWindow = mDialog.getWindow();
        mWindow.requestFeature(Window.FEATURE_NO_TITLE);
        mWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
        mWindow.setBackgroundDrawable(mGradientDrawable);
        mWindow.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
        mWindow.addFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
@@ -200,6 +213,8 @@ public class VolumeDialogImpl implements VolumeDialog, TunerService.Tunable {
                | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
                | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
        Point displaySize = new Point();
        mContext.getDisplay().getRealSize(displaySize);
        mDialog.setCanceledOnTouchOutside(true);
        final Resources res = mContext.getResources();
        mWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);
@@ -213,6 +228,14 @@ public class VolumeDialogImpl implements VolumeDialog, TunerService.Tunable {
            rescheduleTimeoutH();
            return true;
        });

        mColorExtractor.addOnColorsChangedListener(this);
        mGradientDrawable.setScreenSize(displaySize.x, displaySize.y);
        ColorExtractor.GradientColors colors = mColorExtractor.getColors(
                mKeyguard.isKeyguardLocked() ? WallpaperManager.FLAG_LOCK
                        : WallpaperManager.FLAG_SYSTEM);
        mGradientDrawable.setColors(colors, false);

        mDialogContentView = mDialog.findViewById(R.id.volume_dialog_content);
        mDialogRowsView = mDialogContentView.findViewById(R.id.volume_dialog_rows);
        mExpanded = false;
@@ -224,7 +247,7 @@ public class VolumeDialogImpl implements VolumeDialog, TunerService.Tunable {
        updateExpandButtonH();

        mMotion = new VolumeDialogMotion(mDialog, (View) mDialogView.getParent(),
                mDialogContentView, mExpandButton, animating -> {
                mDialogContentView, mExpandButton, mGradientDrawable, animating -> {
                    if (animating) return;
                    if (mPendingStateChanged) {
                        mHandler.sendEmptyMessage(H.STATE_CHANGED);
@@ -1075,6 +1098,19 @@ public class VolumeDialogImpl implements VolumeDialog, TunerService.Tunable {
        }
    };

    @Override
    public void onColorsChanged(ColorExtractor.GradientColors colors, int which) {
        if (mKeyguard.isKeyguardLocked()) {
            if ((WallpaperManager.FLAG_LOCK & which) != 0) {
                mGradientDrawable.setColors(colors);
            }
        } else {
            if ((WallpaperManager.FLAG_SYSTEM & which) != 0) {
                mGradientDrawable.setColors(colors);
            }
        }
    }

    private final class H extends Handler {
        private static final int SHOW = 1;
        private static final int DISMISS = 2;
Loading