Loading packages/SystemUI/shared/src/com/android/systemui/navigationbar/buttons/KeyButtonRipple.java +10 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; } Loading packages/SystemUI/shared/src/com/android/systemui/shared/rotation/FloatingRotationButton.java +89 −35 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; /** Loading @@ -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; Loading @@ -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, Loading @@ -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)); } Loading Loading @@ -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 */); final LayoutParams layoutParams = adjustViewPositionAndCreateLayoutParams(); mWindowManager.addView(mKeyButtonContainer, layoutParams); 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(); Loading Loading @@ -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(); Loading packages/SystemUI/shared/src/com/android/systemui/shared/rotation/FloatingRotationButtonView.java +16 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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); Loading @@ -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)); Loading packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java +3 −1 Original line number Diff line number Diff line Loading @@ -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(); Loading Loading
packages/SystemUI/shared/src/com/android/systemui/navigationbar/buttons/KeyButtonRipple.java +10 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; } Loading
packages/SystemUI/shared/src/com/android/systemui/shared/rotation/FloatingRotationButton.java +89 −35 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; /** Loading @@ -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; Loading @@ -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, Loading @@ -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)); } Loading Loading @@ -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 */); final LayoutParams layoutParams = adjustViewPositionAndCreateLayoutParams(); mWindowManager.addView(mKeyButtonContainer, layoutParams); 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(); Loading Loading @@ -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(); Loading
packages/SystemUI/shared/src/com/android/systemui/shared/rotation/FloatingRotationButtonView.java +16 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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); Loading @@ -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)); Loading
packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java +3 −1 Original line number Diff line number Diff line Loading @@ -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(); Loading