Merge "Handle configuration changes in floating rotation button" into sc-v2-dev

This commit is contained in:
TreeHugger Robot
2021-11-29 19:41:19 +00:00
committed by Android (Google) Code Review
4 changed files with 118 additions and 36 deletions

View File

@@ -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;
}

View File

@@ -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);
final LayoutParams layoutParams = adjustViewPositionAndCreateLayoutParams();
mWindowManager.addView(mKeyButtonContainer, layoutParams);
lp.privateFlags |= WindowManager.LayoutParams.SYSTEM_FLAG_SHOW_FOR_ALL_USERS;
lp.setTitle("FloatingRotationButton");
lp.setFitInsetsTypes(0 /*types */);
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();

View File

@@ -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));

View File

@@ -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();