From 424979d91f7c86182c98deb6c0d75eb2dd646938 Mon Sep 17 00:00:00 2001 From: Fumiaki Yoshimatsu Date: Sun, 7 Feb 2021 13:33:58 -0500 Subject: [PATCH] Fix reaction overlay not showing on first try in RTL mode. Moved the code that does some layouts according to the view's layout direction to the place where we can safely use the value from getLayoutDirection(). This fixes the issue reported in [the beta 5.3 forum](https://community.signalusers.org/t/beta-feedback-for-the-upcoming-android-5-3-release/25088/315). --- .../ConversationReactionOverlay.java | 57 ++++++++++++------- 1 file changed, 36 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationReactionOverlay.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationReactionOverlay.java index 66c6154eb7..b9191e27ea 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationReactionOverlay.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationReactionOverlay.java @@ -144,6 +144,41 @@ public final class ConversationReactionOverlay extends RelativeLayout { maskView.setTargetParentTranslationY(translationY); } + private OnLayoutChangeListener createUpdateViewPositionsOnLayoutChangeListener(@NonNull View maskTarget, + int maskPaddingBottom, + @NonNull PointF lastSeenDownPoint) + { + return new OnLayoutChangeListener() { + @Override + public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { + + final float scrubberTranslationY = Math.max(-scrubberDistanceFromTouchDown + actionBarHeight, + lastSeenDownPoint.y - scrubberHeight - scrubberDistanceFromTouchDown - statusBarHeight); + + final float halfWidth = scrubberWidth / 2f + scrubberHorizontalMargin; + final float screenWidth = getResources().getDisplayMetrics().widthPixels; + final float downX = ViewUtil.isLtr(ConversationReactionOverlay.this) ? lastSeenDownPoint.x : screenWidth - lastSeenDownPoint.x; + final float scrubberTranslationX = Util.clamp(downX - halfWidth, + scrubberHorizontalMargin, + screenWidth + scrubberHorizontalMargin - halfWidth * 2) * (ViewUtil.isLtr(ConversationReactionOverlay.this) ? 1 : -1); + + backgroundView.setTranslationX(scrubberTranslationX); + backgroundView.setTranslationY(scrubberTranslationY); + + foregroundView.setTranslationX(scrubberTranslationX); + foregroundView.setTranslationY(scrubberTranslationY); + + verticalScrubBoundary.update(lastSeenDownPoint.y - distanceFromTouchDownPointToTopOfScrubberDeadZone, + lastSeenDownPoint.y + distanceFromTouchDownPointToBottomOfScrubberDeadZone); + + maskView.setPadding(0, 0, 0, maskPaddingBottom); + maskView.setTarget(maskTarget); + + removeOnLayoutChangeListener(this); + } + }; + } + public void show(@NonNull Activity activity, @NonNull View maskTarget, @NonNull Recipient conversationRecipient, @@ -171,27 +206,7 @@ public final class ConversationReactionOverlay extends RelativeLayout { statusBarHeight = ViewUtil.getStatusBarHeight(this); } - final float scrubberTranslationY = Math.max(-scrubberDistanceFromTouchDown + actionBarHeight, - lastSeenDownPoint.y - scrubberHeight - scrubberDistanceFromTouchDown - statusBarHeight); - - final float halfWidth = scrubberWidth / 2f + scrubberHorizontalMargin; - final float screenWidth = getResources().getDisplayMetrics().widthPixels; - final float downX = ViewUtil.isLtr(this) ? lastSeenDownPoint.x : screenWidth - lastSeenDownPoint.x; - final float scrubberTranslationX = Util.clamp(downX - halfWidth, - scrubberHorizontalMargin, - screenWidth + scrubberHorizontalMargin - halfWidth * 2) * (ViewUtil.isLtr(this) ? 1 : -1); - - backgroundView.setTranslationX(scrubberTranslationX); - backgroundView.setTranslationY(scrubberTranslationY); - - foregroundView.setTranslationX(scrubberTranslationX); - foregroundView.setTranslationY(scrubberTranslationY); - - verticalScrubBoundary.update(lastSeenDownPoint.y - distanceFromTouchDownPointToTopOfScrubberDeadZone, - lastSeenDownPoint.y + distanceFromTouchDownPointToBottomOfScrubberDeadZone); - - maskView.setPadding(0, 0, 0, maskPaddingBottom); - maskView.setTarget(maskTarget); + addOnLayoutChangeListener(createUpdateViewPositionsOnLayoutChangeListener(maskTarget, maskPaddingBottom, lastSeenDownPoint)); hideAnimatorSet.end(); toolbar.setVisibility(VISIBLE);