Loading libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/DismissView.kt +27 −12 Original line number Diff line number Diff line Loading @@ -28,37 +28,40 @@ import androidx.dynamicanimation.animation.SpringForce.STIFFNESS_LOW import com.android.wm.shell.R import com.android.wm.shell.animation.PhysicsAnimator import com.android.wm.shell.common.DismissCircleView import android.view.WindowInsets import android.view.WindowManager /* * View that handles interactions between DismissCircleView and BubbleStackView. */ class DismissView(context: Context) : FrameLayout(context) { var circle = DismissCircleView(context).apply { val targetSize: Int = context.resources.getDimensionPixelSize(R.dimen.dismiss_circle_size) val newParams = LayoutParams(targetSize, targetSize) newParams.gravity = Gravity.BOTTOM or Gravity.CENTER_HORIZONTAL setLayoutParams(newParams) setTranslationY( resources.getDimensionPixelSize(R.dimen.floating_dismiss_gradient_height).toFloat()) } var circle = DismissCircleView(context) var isShowing = false private val animator = PhysicsAnimator.getInstance(circle) private val spring = PhysicsAnimator.SpringConfig(STIFFNESS_LOW, DAMPING_RATIO_LOW_BOUNCY) private val DISMISS_SCRIM_FADE_MS = 200 private var wm: WindowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager init { setLayoutParams(LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, resources.getDimensionPixelSize(R.dimen.floating_dismiss_gradient_height), Gravity.BOTTOM)) setPadding(0, 0, 0, resources.getDimensionPixelSize(R.dimen.floating_dismiss_bottom_margin)) updatePadding() setClipToPadding(false) setClipChildren(false) setVisibility(View.INVISIBLE) setBackgroundResource( R.drawable.floating_dismiss_gradient_transition) addView(circle) val targetSize: Int = resources.getDimensionPixelSize(R.dimen.dismiss_circle_size) addView(circle, LayoutParams(targetSize, targetSize, Gravity.BOTTOM or Gravity.CENTER_HORIZONTAL)) // start with circle offscreen so it's animated up circle.setTranslationY(resources.getDimensionPixelSize( R.dimen.floating_dismiss_gradient_height).toFloat()) } /** Loading Loading @@ -91,9 +94,21 @@ class DismissView(context: Context) : FrameLayout(context) { } fun updateResources() { val targetSize: Int = context.resources.getDimensionPixelSize(R.dimen.dismiss_circle_size) updatePadding() layoutParams.height = resources.getDimensionPixelSize( R.dimen.floating_dismiss_gradient_height) val targetSize: Int = resources.getDimensionPixelSize(R.dimen.dismiss_circle_size) circle.layoutParams.width = targetSize circle.layoutParams.height = targetSize circle.requestLayout() } private fun updatePadding() { val insets: WindowInsets = wm.getCurrentWindowMetrics().getWindowInsets() val navInset = insets.getInsetsIgnoringVisibility( WindowInsets.Type.navigationBars()) setPadding(0, 0, 0, navInset.bottom + resources.getDimensionPixelSize(R.dimen.floating_dismiss_bottom_margin)) } } No newline at end of file libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipDismissTargetHandler.java +14 −1 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_M import android.content.Context; import android.content.res.Resources; import android.graphics.Insets; import android.graphics.PixelFormat; import android.graphics.Point; import android.graphics.Rect; Loading @@ -30,6 +31,7 @@ import android.view.SurfaceControl; import android.view.View; import android.view.ViewGroup; import android.view.ViewTreeObserver; import android.view.WindowInsets; import android.view.WindowManager; import android.widget.FrameLayout; Loading Loading @@ -93,6 +95,7 @@ public class PipDismissTargetHandler implements ViewTreeObserver.OnPreDrawListen private int mTargetSize; private int mDismissAreaHeight; private float mMagneticFieldRadiusPercent = 1f; private WindowInsets mWindowInsets; private SurfaceControl mTaskLeash; private boolean mHasDismissTargetSurface; Loading Loading @@ -123,6 +126,13 @@ public class PipDismissTargetHandler implements ViewTreeObserver.OnPreDrawListen mContext.getDrawable(R.drawable.floating_dismiss_gradient_transition)); mTargetViewContainer.setClipChildren(false); mTargetViewContainer.addView(mTargetView); mTargetViewContainer.setOnApplyWindowInsetsListener((view, windowInsets) -> { if (!windowInsets.equals(mWindowInsets)) { mWindowInsets = windowInsets; updateMagneticTargetSize(); } return windowInsets; }); mMagnetizedPip = mMotionHelper.getMagnetizedPip(); mMagneticTarget = mMagnetizedPip.addTarget(mTargetView, 0); Loading Loading @@ -201,10 +211,13 @@ public class PipDismissTargetHandler implements ViewTreeObserver.OnPreDrawListen final Resources res = mContext.getResources(); mTargetSize = res.getDimensionPixelSize(R.dimen.dismiss_circle_size); mDismissAreaHeight = res.getDimensionPixelSize(R.dimen.floating_dismiss_gradient_height); final WindowInsets insets = mWindowManager.getCurrentWindowMetrics().getWindowInsets(); final Insets navInset = insets.getInsetsIgnoringVisibility( WindowInsets.Type.navigationBars()); final FrameLayout.LayoutParams newParams = new FrameLayout.LayoutParams(mTargetSize, mTargetSize); newParams.gravity = Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM; newParams.bottomMargin = mContext.getResources().getDimensionPixelSize( newParams.bottomMargin = navInset.bottom + mContext.getResources().getDimensionPixelSize( R.dimen.floating_dismiss_bottom_margin); mTargetView.setLayoutParams(newParams); Loading Loading
libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/DismissView.kt +27 −12 Original line number Diff line number Diff line Loading @@ -28,37 +28,40 @@ import androidx.dynamicanimation.animation.SpringForce.STIFFNESS_LOW import com.android.wm.shell.R import com.android.wm.shell.animation.PhysicsAnimator import com.android.wm.shell.common.DismissCircleView import android.view.WindowInsets import android.view.WindowManager /* * View that handles interactions between DismissCircleView and BubbleStackView. */ class DismissView(context: Context) : FrameLayout(context) { var circle = DismissCircleView(context).apply { val targetSize: Int = context.resources.getDimensionPixelSize(R.dimen.dismiss_circle_size) val newParams = LayoutParams(targetSize, targetSize) newParams.gravity = Gravity.BOTTOM or Gravity.CENTER_HORIZONTAL setLayoutParams(newParams) setTranslationY( resources.getDimensionPixelSize(R.dimen.floating_dismiss_gradient_height).toFloat()) } var circle = DismissCircleView(context) var isShowing = false private val animator = PhysicsAnimator.getInstance(circle) private val spring = PhysicsAnimator.SpringConfig(STIFFNESS_LOW, DAMPING_RATIO_LOW_BOUNCY) private val DISMISS_SCRIM_FADE_MS = 200 private var wm: WindowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager init { setLayoutParams(LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, resources.getDimensionPixelSize(R.dimen.floating_dismiss_gradient_height), Gravity.BOTTOM)) setPadding(0, 0, 0, resources.getDimensionPixelSize(R.dimen.floating_dismiss_bottom_margin)) updatePadding() setClipToPadding(false) setClipChildren(false) setVisibility(View.INVISIBLE) setBackgroundResource( R.drawable.floating_dismiss_gradient_transition) addView(circle) val targetSize: Int = resources.getDimensionPixelSize(R.dimen.dismiss_circle_size) addView(circle, LayoutParams(targetSize, targetSize, Gravity.BOTTOM or Gravity.CENTER_HORIZONTAL)) // start with circle offscreen so it's animated up circle.setTranslationY(resources.getDimensionPixelSize( R.dimen.floating_dismiss_gradient_height).toFloat()) } /** Loading Loading @@ -91,9 +94,21 @@ class DismissView(context: Context) : FrameLayout(context) { } fun updateResources() { val targetSize: Int = context.resources.getDimensionPixelSize(R.dimen.dismiss_circle_size) updatePadding() layoutParams.height = resources.getDimensionPixelSize( R.dimen.floating_dismiss_gradient_height) val targetSize: Int = resources.getDimensionPixelSize(R.dimen.dismiss_circle_size) circle.layoutParams.width = targetSize circle.layoutParams.height = targetSize circle.requestLayout() } private fun updatePadding() { val insets: WindowInsets = wm.getCurrentWindowMetrics().getWindowInsets() val navInset = insets.getInsetsIgnoringVisibility( WindowInsets.Type.navigationBars()) setPadding(0, 0, 0, navInset.bottom + resources.getDimensionPixelSize(R.dimen.floating_dismiss_bottom_margin)) } } No newline at end of file
libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipDismissTargetHandler.java +14 −1 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_M import android.content.Context; import android.content.res.Resources; import android.graphics.Insets; import android.graphics.PixelFormat; import android.graphics.Point; import android.graphics.Rect; Loading @@ -30,6 +31,7 @@ import android.view.SurfaceControl; import android.view.View; import android.view.ViewGroup; import android.view.ViewTreeObserver; import android.view.WindowInsets; import android.view.WindowManager; import android.widget.FrameLayout; Loading Loading @@ -93,6 +95,7 @@ public class PipDismissTargetHandler implements ViewTreeObserver.OnPreDrawListen private int mTargetSize; private int mDismissAreaHeight; private float mMagneticFieldRadiusPercent = 1f; private WindowInsets mWindowInsets; private SurfaceControl mTaskLeash; private boolean mHasDismissTargetSurface; Loading Loading @@ -123,6 +126,13 @@ public class PipDismissTargetHandler implements ViewTreeObserver.OnPreDrawListen mContext.getDrawable(R.drawable.floating_dismiss_gradient_transition)); mTargetViewContainer.setClipChildren(false); mTargetViewContainer.addView(mTargetView); mTargetViewContainer.setOnApplyWindowInsetsListener((view, windowInsets) -> { if (!windowInsets.equals(mWindowInsets)) { mWindowInsets = windowInsets; updateMagneticTargetSize(); } return windowInsets; }); mMagnetizedPip = mMotionHelper.getMagnetizedPip(); mMagneticTarget = mMagnetizedPip.addTarget(mTargetView, 0); Loading Loading @@ -201,10 +211,13 @@ public class PipDismissTargetHandler implements ViewTreeObserver.OnPreDrawListen final Resources res = mContext.getResources(); mTargetSize = res.getDimensionPixelSize(R.dimen.dismiss_circle_size); mDismissAreaHeight = res.getDimensionPixelSize(R.dimen.floating_dismiss_gradient_height); final WindowInsets insets = mWindowManager.getCurrentWindowMetrics().getWindowInsets(); final Insets navInset = insets.getInsetsIgnoringVisibility( WindowInsets.Type.navigationBars()); final FrameLayout.LayoutParams newParams = new FrameLayout.LayoutParams(mTargetSize, mTargetSize); newParams.gravity = Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM; newParams.bottomMargin = mContext.getResources().getDimensionPixelSize( newParams.bottomMargin = navInset.bottom + mContext.getResources().getDimensionPixelSize( R.dimen.floating_dismiss_bottom_margin); mTargetView.setLayoutParams(newParams); Loading