Merge "Handle configuration changes in floating rotation button" into sc-v2-dev am: 294c3c12fc am: 7fe996963f
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/16343965 Change-Id: Ia4b740900f7ab1c1b1c842ae7886befbfc83a5c0
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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));
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user