diff --git a/src/org/thoughtcrime/securesms/components/MaskView.java b/src/org/thoughtcrime/securesms/components/MaskView.java index a2b38040b9..56f3ec60fc 100644 --- a/src/org/thoughtcrime/securesms/components/MaskView.java +++ b/src/org/thoughtcrime/securesms/components/MaskView.java @@ -6,21 +6,21 @@ import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; +import android.graphics.Rect; import android.util.AttributeSet; import android.view.View; +import android.view.ViewGroup; import android.view.ViewTreeObserver; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import org.thoughtcrime.securesms.util.ViewUtil; - public class MaskView extends View { - private View target; - private int[] targetLocation = new int[2]; - private int statusBarHeight; - private Paint maskPaint; + private View target; + private ViewGroup activityContentView; + private Paint maskPaint; + private Rect drawingRect = new Rect(); private final ViewTreeObserver.OnDrawListener onDrawListener = this::invalidate; @@ -41,8 +41,12 @@ public class MaskView extends View { setLayerType(LAYER_TYPE_HARDWARE, maskPaint); maskPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT)); + } - statusBarHeight = ViewUtil.getStatusBarHeight(this); + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + activityContentView = getRootView().findViewById(android.R.id.content); } public void setTarget(@Nullable View target) { @@ -67,14 +71,15 @@ public class MaskView extends View { return; } - target.getLocationInWindow(targetLocation); + target.getDrawingRect(drawingRect); + activityContentView.offsetDescendantRectToMyCoords(target, drawingRect); Bitmap mask = Bitmap.createBitmap(target.getWidth(), target.getHeight(), Bitmap.Config.ARGB_8888); Canvas maskCanvas = new Canvas(mask); target.draw(maskCanvas); - canvas.drawBitmap(mask, 0, targetLocation[1] - statusBarHeight, maskPaint); + canvas.drawBitmap(mask, 0, drawingRect.top, maskPaint); mask.recycle(); } diff --git a/src/org/thoughtcrime/securesms/conversation/ConversationReactionOverlay.java b/src/org/thoughtcrime/securesms/conversation/ConversationReactionOverlay.java index 6a85d8821e..457b9adc62 100644 --- a/src/org/thoughtcrime/securesms/conversation/ConversationReactionOverlay.java +++ b/src/org/thoughtcrime/securesms/conversation/ConversationReactionOverlay.java @@ -76,7 +76,6 @@ public final class ConversationReactionOverlay extends RelativeLayout { private MaskView maskView; private Toolbar toolbar; - private int statusBarHeight; private float touchDownDeadZoneSize; private float distanceFromTouchDownPointToTopOfScrubberDeadZone; private float distanceFromTouchDownPointToBottomOfScrubberDeadZone; @@ -87,6 +86,7 @@ public final class ConversationReactionOverlay extends RelativeLayout { private int selectedVerticalTranslation; private int scrubberHorizontalMargin; private int animationEmojiStartDelayFactor; + private int statusBarHeight; private OnReactionSelectedListener onReactionSelectedListener; private Toolbar.OnMenuItemClickListener onToolbarItemClickedListener; @@ -124,7 +124,6 @@ public final class ConversationReactionOverlay extends RelativeLayout { distanceFromTouchDownPointToBottomOfScrubberDeadZone = getResources().getDimensionPixelSize(R.dimen.conversation_reaction_scrub_deadzone_distance_from_touch_bottom); touchDownDeadZoneSize = getResources().getDimensionPixelSize(R.dimen.conversation_reaction_touch_deadzone_size); - statusBarHeight = ViewUtil.getStatusBarHeight(this); scrubberDistanceFromTouchDown = getResources().getDimensionPixelOffset(R.dimen.conversation_reaction_scrubber_distance); scrubberHeight = getResources().getDimensionPixelOffset(R.dimen.conversation_reaction_scrubber_height); scrubberWidth = getResources().getDimensionPixelOffset(R.dimen.reaction_scrubber_width); @@ -150,8 +149,15 @@ public final class ConversationReactionOverlay extends RelativeLayout { setupToolbarMenuItems(); setupSelectedEmojiBackground(); + if (Build.VERSION.SDK_INT >= 21) { + View statusBarBackground = activity.findViewById(android.R.id.statusBarBackground); + statusBarHeight = statusBarBackground == null ? 0 : statusBarBackground.getHeight(); + } else { + statusBarHeight = ViewUtil.getStatusBarHeight(this); + } + final float scrubberTranslationY = Math.max(-scrubberDistanceFromTouchDown + halfActionBarHeight, - lastSeenDownPoint.y - scrubberHeight - scrubberDistanceFromTouchDown); + lastSeenDownPoint.y - scrubberHeight - scrubberDistanceFromTouchDown - statusBarHeight); final float halfWidth = scrubberWidth / 2f + scrubberHorizontalMargin; final float screenWidth = getResources().getDisplayMetrics().widthPixels; @@ -222,7 +228,7 @@ public final class ConversationReactionOverlay extends RelativeLayout { public boolean applyTouchEvent(@NonNull MotionEvent motionEvent) { if (!isShowing()) { if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) { - lastSeenDownPoint.set(motionEvent.getRawX(), motionEvent.getRawY()); + lastSeenDownPoint.set(motionEvent.getX(), motionEvent.getY()); } return false; } @@ -234,14 +240,14 @@ public final class ConversationReactionOverlay extends RelativeLayout { if (overlayState == OverlayState.UNINITAILIZED) { downIsOurs = false; - deadzoneTouchPoint.set(motionEvent.getRawX(), motionEvent.getRawY()); + deadzoneTouchPoint.set(motionEvent.getX(), motionEvent.getY()); overlayState = OverlayState.DEADZONE; } if (overlayState == OverlayState.DEADZONE) { - float deltaX = Math.abs(deadzoneTouchPoint.x - motionEvent.getRawX()); - float deltaY = Math.abs(deadzoneTouchPoint.y - motionEvent.getRawY()); + float deltaX = Math.abs(deadzoneTouchPoint.x - motionEvent.getX()); + float deltaY = Math.abs(deadzoneTouchPoint.y - motionEvent.getY()); if (deltaX > touchDownDeadZoneSize || deltaY > touchDownDeadZoneSize) { overlayState = OverlayState.SCRUB; @@ -277,7 +283,7 @@ public final class ConversationReactionOverlay extends RelativeLayout { } } - deadzoneTouchPoint.set(motionEvent.getRawX(), motionEvent.getRawY()); + deadzoneTouchPoint.set(motionEvent.getX(), motionEvent.getY()); overlayState = OverlayState.DEADZONE; downIsOurs = true; return true; @@ -337,7 +343,7 @@ public final class ConversationReactionOverlay extends RelativeLayout { final float emojiLeft = (segmentSize * i) + emojiStripViewBounds.left; horizontalEmojiBoundary.update(emojiLeft, emojiLeft + segmentSize); - if (horizontalEmojiBoundary.contains(motionEvent.getRawX()) && boundary.contains(motionEvent.getRawY())) { + if (horizontalEmojiBoundary.contains(motionEvent.getX()) && boundary.contains(motionEvent.getY())) { selected = i; } }