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

Commit 7fe99696 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Handle configuration changes in floating rotation button" into sc-v2-dev am: 294c3c12

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/16343965

Change-Id: I02a4056792e208f1374fadf90b444d3661ac01ec
parents 4e0592da 294c3c12
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -51,6 +51,9 @@ public class KeyButtonRipple extends Drawable {
    private static final Interpolator ALPHA_OUT_INTERPOLATOR =
            new PathInterpolator(0f, 0f, 0.8f, 1f);

    @DimenRes
    private final int mMaxWidthResource;

    private Paint mRipplePaint;
    private CanvasProperty<Float> mLeftProp;
    private CanvasProperty<Float> mTopProp;
@@ -90,10 +93,17 @@ public class KeyButtonRipple extends Drawable {
    private Type mType = Type.ROUNDED_RECT;

    public KeyButtonRipple(Context ctx, View targetView, @DimenRes int maxWidthResource) {
        mMaxWidthResource = maxWidthResource;
        mMaxWidth = ctx.getResources().getDimensionPixelSize(maxWidthResource);
        mTargetView = targetView;
    }

    public void updateResources() {
        mMaxWidth = mTargetView.getContext().getResources()
                .getDimensionPixelSize(mMaxWidthResource);
        invalidateSelf();
    }

    public void setDarkIntensity(float darkIntensity) {
        mDark = darkIntensity >= 0.5f;
    }
+89 −35
Original line number Diff line number Diff line
@@ -21,6 +21,8 @@ import android.annotation.IdRes;
import android.annotation.LayoutRes;
import android.annotation.StringRes;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.content.pm.ActivityInfo.Config;
import android.content.res.Resources;
import android.graphics.PixelFormat;
import android.graphics.drawable.AnimatedVectorDrawable;
@@ -29,12 +31,12 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.widget.FrameLayout;

import androidx.core.view.OneShotPreDrawListener;

import com.android.systemui.shared.R;
import com.android.systemui.shared.rotation.FloatingRotationButtonPositionCalculator.Position;

/**
@@ -48,7 +50,21 @@ public class FloatingRotationButton implements RotationButton {
    private final ViewGroup mKeyButtonContainer;
    private final FloatingRotationButtonView mKeyButtonView;

    private final int mContainerSize;
    private int mContainerSize;
    private final Context mContext;

    @StringRes
    private final int mContentDescriptionResource;
    @DimenRes
    private final int mMinMarginResource;
    @DimenRes
    private final int mRoundedContentPaddingResource;
    @DimenRes
    private final int mTaskbarLeftMarginResource;
    @DimenRes
    private final int mTaskbarBottomMarginResource;
    @DimenRes
    private final int mButtonDiameterResource;

    private AnimatedVectorDrawable mAnimatedDrawable;
    private boolean mIsShowing;
@@ -58,13 +74,13 @@ public class FloatingRotationButton implements RotationButton {
    private boolean mIsTaskbarVisible = false;
    private boolean mIsTaskbarStashed = false;

    private final FloatingRotationButtonPositionCalculator mPositionCalculator;
    private FloatingRotationButtonPositionCalculator mPositionCalculator;

    private RotationButtonController mRotationButtonController;
    private RotationButtonUpdatesCallback mUpdatesCallback;
    private Position mPosition;

    public FloatingRotationButton(Context context, @StringRes int contentDescription,
    public FloatingRotationButton(Context context, @StringRes int contentDescriptionResource,
            @LayoutRes int layout, @IdRes int keyButtonId, @DimenRes int minMargin,
            @DimenRes int roundedContentPadding, @DimenRes int taskbarLeftMargin,
            @DimenRes int taskbarBottomMargin, @DimenRes int buttonDiameter,
@@ -73,24 +89,37 @@ public class FloatingRotationButton implements RotationButton {
        mKeyButtonContainer = (ViewGroup) LayoutInflater.from(context).inflate(layout, null);
        mKeyButtonView = mKeyButtonContainer.findViewById(keyButtonId);
        mKeyButtonView.setVisibility(View.VISIBLE);
        mKeyButtonView.setContentDescription(context.getString(contentDescription));
        mKeyButtonView.setContentDescription(context.getString(contentDescriptionResource));
        mKeyButtonView.setRipple(rippleMaxWidth);

        Resources res = context.getResources();
        mContext = context;

        mContentDescriptionResource = contentDescriptionResource;
        mMinMarginResource = minMargin;
        mRoundedContentPaddingResource = roundedContentPadding;
        mTaskbarLeftMarginResource = taskbarLeftMargin;
        mTaskbarBottomMarginResource = taskbarBottomMargin;
        mButtonDiameterResource = buttonDiameter;

        updateDimensionResources();
    }

    private void updateDimensionResources() {
        Resources res = mContext.getResources();

        int defaultMargin = Math.max(
                res.getDimensionPixelSize(minMargin),
                res.getDimensionPixelSize(roundedContentPadding));
                res.getDimensionPixelSize(mMinMarginResource),
                res.getDimensionPixelSize(mRoundedContentPaddingResource));

        int taskbarMarginLeft =
                res.getDimensionPixelSize(taskbarLeftMargin);
                res.getDimensionPixelSize(mTaskbarLeftMarginResource);
        int taskbarMarginBottom =
                res.getDimensionPixelSize(taskbarBottomMargin);
                res.getDimensionPixelSize(mTaskbarBottomMarginResource);

        mPositionCalculator = new FloatingRotationButtonPositionCalculator(defaultMargin,
                taskbarMarginLeft, taskbarMarginBottom);

        final int diameter = res.getDimensionPixelSize(buttonDiameter);
        final int diameter = res.getDimensionPixelSize(mButtonDiameterResource);
        mContainerSize = diameter + Math.max(defaultMargin, Math.max(taskbarMarginLeft,
                taskbarMarginBottom));
    }
@@ -119,32 +148,10 @@ public class FloatingRotationButton implements RotationButton {
        }

        mIsShowing = true;
        int flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;

        // TODO(b/200103245): add new window type that has z-index above
        //  TYPE_NAVIGATION_BAR_PANEL as currently it could be below the taskbar which has
        //  the same window type
        final WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
                mContainerSize,
                mContainerSize,
                0, 0, WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL, flags,
                PixelFormat.TRANSLUCENT);

        lp.privateFlags |= WindowManager.LayoutParams.SYSTEM_FLAG_SHOW_FOR_ALL_USERS;
        lp.setTitle("FloatingRotationButton");
        lp.setFitInsetsTypes(0 /*types */);
        final LayoutParams layoutParams = adjustViewPositionAndCreateLayoutParams();
        mWindowManager.addView(mKeyButtonContainer, layoutParams);

        mDisplayRotation = mWindowManager.getDefaultDisplay().getRotation();
        mPosition = mPositionCalculator
                .calculatePosition(mDisplayRotation, mIsTaskbarVisible, mIsTaskbarStashed);

        lp.gravity = mPosition.getGravity();
        ((FrameLayout.LayoutParams) mKeyButtonView.getLayoutParams()).gravity =
                mPosition.getGravity();

        updateTranslation(mPosition, /* animate */ false);

        mWindowManager.addView(mKeyButtonContainer, lp);
        if (mAnimatedDrawable != null) {
            mAnimatedDrawable.reset();
            mAnimatedDrawable.start();
@@ -232,6 +239,53 @@ public class FloatingRotationButton implements RotationButton {
        }
    }

    /**
     * Updates resources that could be changed in runtime, should be called on configuration
     * change with changes diff integer mask
     * @param configurationChanges - configuration changes with flags from ActivityInfo e.g.
     * {@link android.content.pm.ActivityInfo#CONFIG_DENSITY}
     */
    public void onConfigurationChanged(@Config int configurationChanges) {
        if ((configurationChanges & ActivityInfo.CONFIG_DENSITY) != 0
                || (configurationChanges & ActivityInfo.CONFIG_SCREEN_SIZE) != 0) {
            updateDimensionResources();

            if (mIsShowing) {
                final LayoutParams layoutParams = adjustViewPositionAndCreateLayoutParams();
                mWindowManager.updateViewLayout(mKeyButtonContainer, layoutParams);
            }
        }

        if ((configurationChanges & ActivityInfo.CONFIG_LOCALE) != 0) {
            mKeyButtonView.setContentDescription(mContext.getString(mContentDescriptionResource));
        }
    }

    private LayoutParams adjustViewPositionAndCreateLayoutParams() {
        final LayoutParams lp = new LayoutParams(
                mContainerSize,
                mContainerSize,
                /* xpos */ 0, /* ypos */ 0, LayoutParams.TYPE_NAVIGATION_BAR_PANEL,
                LayoutParams.FLAG_NOT_FOCUSABLE,
                PixelFormat.TRANSLUCENT);

        lp.privateFlags |= LayoutParams.SYSTEM_FLAG_SHOW_FOR_ALL_USERS;
        lp.setTitle("FloatingRotationButton");
        lp.setFitInsetsTypes(/* types */ 0);

        mDisplayRotation = mWindowManager.getDefaultDisplay().getRotation();
        mPosition = mPositionCalculator
                .calculatePosition(mDisplayRotation, mIsTaskbarVisible, mIsTaskbarStashed);

        lp.gravity = mPosition.getGravity();
        ((FrameLayout.LayoutParams) mKeyButtonView.getLayoutParams()).gravity =
                mPosition.getGravity();

        updateTranslation(mPosition, /* animate */ false);

        return lp;
    }

    private void updateTranslation(Position position, boolean animate) {
        final int translationX = position.getTranslationX();
        final int translationY = position.getTranslationY();
+16 −0
Original line number Diff line number Diff line
@@ -17,6 +17,8 @@
package com.android.systemui.shared.rotation;

import android.content.Context;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
@@ -37,12 +39,15 @@ public class FloatingRotationButtonView extends ImageView {
    private KeyButtonRipple mRipple;
    private final Paint mOvalBgPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG);

    private final Configuration mLastConfiguration;

    public FloatingRotationButtonView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public FloatingRotationButtonView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        mLastConfiguration = getResources().getConfiguration();

        setClickable(true);

@@ -63,6 +68,17 @@ public class FloatingRotationButtonView extends ImageView {
        }
    }

    @Override
    protected void onConfigurationChanged(Configuration newConfig) {
        final int changes = mLastConfiguration.updateFrom(newConfig);
        if ((changes & ActivityInfo.CONFIG_SCREEN_SIZE) != 0
                || ((changes & ActivityInfo.CONFIG_DENSITY) != 0)) {
            if (mRipple != null) {
                mRipple.updateResources();
            }
        }
    }

    public void setColors(int lightColor, int darkColor) {
        getDrawable().setColorFilter(new PorterDuffColorFilter(lightColor, PorterDuff.Mode.SRC_IN));

+3 −1
Original line number Diff line number Diff line
@@ -1212,7 +1212,9 @@ public class NavigationBarView extends FrameLayout implements
    protected void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        mTmpLastConfiguration.updateFrom(mConfiguration);
        mConfiguration.updateFrom(newConfig);
        final int changes = mConfiguration.updateFrom(newConfig);
        mFloatingRotationButton.onConfigurationChanged(changes);

        boolean uiCarModeChanged = updateCarMode();
        updateIcons(mTmpLastConfiguration);
        updateRecentsIcon();