diff options
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(); |