Merge "Handle configuration changes in floating rotation button" into sc-v2-dev am: 294c3c12fc
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/16343965 Change-Id: I02a4056792e208f1374fadf90b444d3661ac01ec
This commit is contained in:
@@ -51,6 +51,9 @@ public class KeyButtonRipple extends Drawable {
|
|||||||
private static final Interpolator ALPHA_OUT_INTERPOLATOR =
|
private static final Interpolator ALPHA_OUT_INTERPOLATOR =
|
||||||
new PathInterpolator(0f, 0f, 0.8f, 1f);
|
new PathInterpolator(0f, 0f, 0.8f, 1f);
|
||||||
|
|
||||||
|
@DimenRes
|
||||||
|
private final int mMaxWidthResource;
|
||||||
|
|
||||||
private Paint mRipplePaint;
|
private Paint mRipplePaint;
|
||||||
private CanvasProperty<Float> mLeftProp;
|
private CanvasProperty<Float> mLeftProp;
|
||||||
private CanvasProperty<Float> mTopProp;
|
private CanvasProperty<Float> mTopProp;
|
||||||
@@ -90,10 +93,17 @@ public class KeyButtonRipple extends Drawable {
|
|||||||
private Type mType = Type.ROUNDED_RECT;
|
private Type mType = Type.ROUNDED_RECT;
|
||||||
|
|
||||||
public KeyButtonRipple(Context ctx, View targetView, @DimenRes int maxWidthResource) {
|
public KeyButtonRipple(Context ctx, View targetView, @DimenRes int maxWidthResource) {
|
||||||
|
mMaxWidthResource = maxWidthResource;
|
||||||
mMaxWidth = ctx.getResources().getDimensionPixelSize(maxWidthResource);
|
mMaxWidth = ctx.getResources().getDimensionPixelSize(maxWidthResource);
|
||||||
mTargetView = targetView;
|
mTargetView = targetView;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void updateResources() {
|
||||||
|
mMaxWidth = mTargetView.getContext().getResources()
|
||||||
|
.getDimensionPixelSize(mMaxWidthResource);
|
||||||
|
invalidateSelf();
|
||||||
|
}
|
||||||
|
|
||||||
public void setDarkIntensity(float darkIntensity) {
|
public void setDarkIntensity(float darkIntensity) {
|
||||||
mDark = darkIntensity >= 0.5f;
|
mDark = darkIntensity >= 0.5f;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,6 +21,8 @@ import android.annotation.IdRes;
|
|||||||
import android.annotation.LayoutRes;
|
import android.annotation.LayoutRes;
|
||||||
import android.annotation.StringRes;
|
import android.annotation.StringRes;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.content.pm.ActivityInfo;
|
||||||
|
import android.content.pm.ActivityInfo.Config;
|
||||||
import android.content.res.Resources;
|
import android.content.res.Resources;
|
||||||
import android.graphics.PixelFormat;
|
import android.graphics.PixelFormat;
|
||||||
import android.graphics.drawable.AnimatedVectorDrawable;
|
import android.graphics.drawable.AnimatedVectorDrawable;
|
||||||
@@ -29,12 +31,12 @@ import android.view.LayoutInflater;
|
|||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.view.WindowManager;
|
import android.view.WindowManager;
|
||||||
|
import android.view.WindowManager.LayoutParams;
|
||||||
import android.view.animation.AccelerateDecelerateInterpolator;
|
import android.view.animation.AccelerateDecelerateInterpolator;
|
||||||
import android.widget.FrameLayout;
|
import android.widget.FrameLayout;
|
||||||
|
|
||||||
import androidx.core.view.OneShotPreDrawListener;
|
import androidx.core.view.OneShotPreDrawListener;
|
||||||
|
|
||||||
import com.android.systemui.shared.R;
|
|
||||||
import com.android.systemui.shared.rotation.FloatingRotationButtonPositionCalculator.Position;
|
import com.android.systemui.shared.rotation.FloatingRotationButtonPositionCalculator.Position;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -48,7 +50,21 @@ public class FloatingRotationButton implements RotationButton {
|
|||||||
private final ViewGroup mKeyButtonContainer;
|
private final ViewGroup mKeyButtonContainer;
|
||||||
private final FloatingRotationButtonView mKeyButtonView;
|
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 AnimatedVectorDrawable mAnimatedDrawable;
|
||||||
private boolean mIsShowing;
|
private boolean mIsShowing;
|
||||||
@@ -58,13 +74,13 @@ public class FloatingRotationButton implements RotationButton {
|
|||||||
private boolean mIsTaskbarVisible = false;
|
private boolean mIsTaskbarVisible = false;
|
||||||
private boolean mIsTaskbarStashed = false;
|
private boolean mIsTaskbarStashed = false;
|
||||||
|
|
||||||
private final FloatingRotationButtonPositionCalculator mPositionCalculator;
|
private FloatingRotationButtonPositionCalculator mPositionCalculator;
|
||||||
|
|
||||||
private RotationButtonController mRotationButtonController;
|
private RotationButtonController mRotationButtonController;
|
||||||
private RotationButtonUpdatesCallback mUpdatesCallback;
|
private RotationButtonUpdatesCallback mUpdatesCallback;
|
||||||
private Position mPosition;
|
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,
|
@LayoutRes int layout, @IdRes int keyButtonId, @DimenRes int minMargin,
|
||||||
@DimenRes int roundedContentPadding, @DimenRes int taskbarLeftMargin,
|
@DimenRes int roundedContentPadding, @DimenRes int taskbarLeftMargin,
|
||||||
@DimenRes int taskbarBottomMargin, @DimenRes int buttonDiameter,
|
@DimenRes int taskbarBottomMargin, @DimenRes int buttonDiameter,
|
||||||
@@ -73,24 +89,37 @@ public class FloatingRotationButton implements RotationButton {
|
|||||||
mKeyButtonContainer = (ViewGroup) LayoutInflater.from(context).inflate(layout, null);
|
mKeyButtonContainer = (ViewGroup) LayoutInflater.from(context).inflate(layout, null);
|
||||||
mKeyButtonView = mKeyButtonContainer.findViewById(keyButtonId);
|
mKeyButtonView = mKeyButtonContainer.findViewById(keyButtonId);
|
||||||
mKeyButtonView.setVisibility(View.VISIBLE);
|
mKeyButtonView.setVisibility(View.VISIBLE);
|
||||||
mKeyButtonView.setContentDescription(context.getString(contentDescription));
|
mKeyButtonView.setContentDescription(context.getString(contentDescriptionResource));
|
||||||
mKeyButtonView.setRipple(rippleMaxWidth);
|
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(
|
int defaultMargin = Math.max(
|
||||||
res.getDimensionPixelSize(minMargin),
|
res.getDimensionPixelSize(mMinMarginResource),
|
||||||
res.getDimensionPixelSize(roundedContentPadding));
|
res.getDimensionPixelSize(mRoundedContentPaddingResource));
|
||||||
|
|
||||||
int taskbarMarginLeft =
|
int taskbarMarginLeft =
|
||||||
res.getDimensionPixelSize(taskbarLeftMargin);
|
res.getDimensionPixelSize(mTaskbarLeftMarginResource);
|
||||||
int taskbarMarginBottom =
|
int taskbarMarginBottom =
|
||||||
res.getDimensionPixelSize(taskbarBottomMargin);
|
res.getDimensionPixelSize(mTaskbarBottomMarginResource);
|
||||||
|
|
||||||
mPositionCalculator = new FloatingRotationButtonPositionCalculator(defaultMargin,
|
mPositionCalculator = new FloatingRotationButtonPositionCalculator(defaultMargin,
|
||||||
taskbarMarginLeft, taskbarMarginBottom);
|
taskbarMarginLeft, taskbarMarginBottom);
|
||||||
|
|
||||||
final int diameter = res.getDimensionPixelSize(buttonDiameter);
|
final int diameter = res.getDimensionPixelSize(mButtonDiameterResource);
|
||||||
mContainerSize = diameter + Math.max(defaultMargin, Math.max(taskbarMarginLeft,
|
mContainerSize = diameter + Math.max(defaultMargin, Math.max(taskbarMarginLeft,
|
||||||
taskbarMarginBottom));
|
taskbarMarginBottom));
|
||||||
}
|
}
|
||||||
@@ -119,32 +148,10 @@ public class FloatingRotationButton implements RotationButton {
|
|||||||
}
|
}
|
||||||
|
|
||||||
mIsShowing = true;
|
mIsShowing = true;
|
||||||
int flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
|
|
||||||
|
|
||||||
// TODO(b/200103245): add new window type that has z-index above
|
final LayoutParams layoutParams = adjustViewPositionAndCreateLayoutParams();
|
||||||
// TYPE_NAVIGATION_BAR_PANEL as currently it could be below the taskbar which has
|
mWindowManager.addView(mKeyButtonContainer, layoutParams);
|
||||||
// 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 */);
|
|
||||||
|
|
||||||
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) {
|
if (mAnimatedDrawable != null) {
|
||||||
mAnimatedDrawable.reset();
|
mAnimatedDrawable.reset();
|
||||||
mAnimatedDrawable.start();
|
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) {
|
private void updateTranslation(Position position, boolean animate) {
|
||||||
final int translationX = position.getTranslationX();
|
final int translationX = position.getTranslationX();
|
||||||
final int translationY = position.getTranslationY();
|
final int translationY = position.getTranslationY();
|
||||||
|
|||||||
@@ -17,6 +17,8 @@
|
|||||||
package com.android.systemui.shared.rotation;
|
package com.android.systemui.shared.rotation;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.content.pm.ActivityInfo;
|
||||||
|
import android.content.res.Configuration;
|
||||||
import android.graphics.Canvas;
|
import android.graphics.Canvas;
|
||||||
import android.graphics.Color;
|
import android.graphics.Color;
|
||||||
import android.graphics.Paint;
|
import android.graphics.Paint;
|
||||||
@@ -37,12 +39,15 @@ public class FloatingRotationButtonView extends ImageView {
|
|||||||
private KeyButtonRipple mRipple;
|
private KeyButtonRipple mRipple;
|
||||||
private final Paint mOvalBgPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG);
|
private final Paint mOvalBgPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG);
|
||||||
|
|
||||||
|
private final Configuration mLastConfiguration;
|
||||||
|
|
||||||
public FloatingRotationButtonView(Context context, AttributeSet attrs) {
|
public FloatingRotationButtonView(Context context, AttributeSet attrs) {
|
||||||
this(context, attrs, 0);
|
this(context, attrs, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public FloatingRotationButtonView(Context context, AttributeSet attrs, int defStyle) {
|
public FloatingRotationButtonView(Context context, AttributeSet attrs, int defStyle) {
|
||||||
super(context, attrs, defStyle);
|
super(context, attrs, defStyle);
|
||||||
|
mLastConfiguration = getResources().getConfiguration();
|
||||||
|
|
||||||
setClickable(true);
|
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) {
|
public void setColors(int lightColor, int darkColor) {
|
||||||
getDrawable().setColorFilter(new PorterDuffColorFilter(lightColor, PorterDuff.Mode.SRC_IN));
|
getDrawable().setColorFilter(new PorterDuffColorFilter(lightColor, PorterDuff.Mode.SRC_IN));
|
||||||
|
|
||||||
|
|||||||
@@ -1212,7 +1212,9 @@ public class NavigationBarView extends FrameLayout implements
|
|||||||
protected void onConfigurationChanged(Configuration newConfig) {
|
protected void onConfigurationChanged(Configuration newConfig) {
|
||||||
super.onConfigurationChanged(newConfig);
|
super.onConfigurationChanged(newConfig);
|
||||||
mTmpLastConfiguration.updateFrom(mConfiguration);
|
mTmpLastConfiguration.updateFrom(mConfiguration);
|
||||||
mConfiguration.updateFrom(newConfig);
|
final int changes = mConfiguration.updateFrom(newConfig);
|
||||||
|
mFloatingRotationButton.onConfigurationChanged(changes);
|
||||||
|
|
||||||
boolean uiCarModeChanged = updateCarMode();
|
boolean uiCarModeChanged = updateCarMode();
|
||||||
updateIcons(mTmpLastConfiguration);
|
updateIcons(mTmpLastConfiguration);
|
||||||
updateRecentsIcon();
|
updateRecentsIcon();
|
||||||
|
|||||||
Reference in New Issue
Block a user