summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/SystemUI/shared/src/com/android/systemui/navigationbar/buttons/KeyButtonRipple.java10
-rw-r--r--packages/SystemUI/shared/src/com/android/systemui/shared/rotation/FloatingRotationButton.java124
-rw-r--r--packages/SystemUI/shared/src/com/android/systemui/shared/rotation/FloatingRotationButtonView.java16
-rw-r--r--packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java4
4 files changed, 118 insertions, 36 deletions
diff --git a/packages/SystemUI/shared/src/com/android/systemui/navigationbar/buttons/KeyButtonRipple.java b/packages/SystemUI/shared/src/com/android/systemui/navigationbar/buttons/KeyButtonRipple.java
index 07ad0c8a5120..8aa3abac831f 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/navigationbar/buttons/KeyButtonRipple.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/navigationbar/buttons/KeyButtonRipple.java
@@ -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;
}
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/rotation/FloatingRotationButton.java b/packages/SystemUI/shared/src/com/android/systemui/shared/rotation/FloatingRotationButton.java
index cbf739732361..857cc4620ebd 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/rotation/FloatingRotationButton.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/rotation/FloatingRotationButton.java
@@ -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 */);
-
- mDisplayRotation = mWindowManager.getDefaultDisplay().getRotation();
- mPosition = mPositionCalculator
- .calculatePosition(mDisplayRotation, mIsTaskbarVisible, mIsTaskbarStashed);
- lp.gravity = mPosition.getGravity();
- ((FrameLayout.LayoutParams) mKeyButtonView.getLayoutParams()).gravity =
- mPosition.getGravity();
+ final LayoutParams layoutParams = adjustViewPositionAndCreateLayoutParams();
+ mWindowManager.addView(mKeyButtonContainer, layoutParams);
- 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();
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/rotation/FloatingRotationButtonView.java b/packages/SystemUI/shared/src/com/android/systemui/shared/rotation/FloatingRotationButtonView.java
index c5f8fc15b3b7..a4b6451caaea 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/rotation/FloatingRotationButtonView.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/rotation/FloatingRotationButtonView.java
@@ -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));
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java
index 364a8aea7ee4..7c8c3e0dce44 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java
@@ -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();