Merge "Ensure bubbles + pip dismiss view is above navbar" into sc-v2-dev
This commit is contained in:
@@ -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())
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -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))
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
@@ -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);
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user