diff --git a/res/drawable-mdpi/reaction_scrubber_angry_48.webp b/res/drawable-mdpi/reaction_scrubber_angry_48.webp new file mode 100644 index 0000000000..a3982e3b0f Binary files /dev/null and b/res/drawable-mdpi/reaction_scrubber_angry_48.webp differ diff --git a/res/drawable-mdpi/reaction_scrubber_dislike_48.webp b/res/drawable-mdpi/reaction_scrubber_dislike_48.webp new file mode 100644 index 0000000000..9874306653 Binary files /dev/null and b/res/drawable-mdpi/reaction_scrubber_dislike_48.webp differ diff --git a/res/drawable-mdpi/reaction_scrubber_haha_48.webp b/res/drawable-mdpi/reaction_scrubber_haha_48.webp new file mode 100644 index 0000000000..b935b7a1ab Binary files /dev/null and b/res/drawable-mdpi/reaction_scrubber_haha_48.webp differ diff --git a/res/drawable-mdpi/reaction_scrubber_like_48.webp b/res/drawable-mdpi/reaction_scrubber_like_48.webp new file mode 100644 index 0000000000..31ce2ae4f1 Binary files /dev/null and b/res/drawable-mdpi/reaction_scrubber_like_48.webp differ diff --git a/res/drawable-mdpi/reaction_scrubber_love_48.webp b/res/drawable-mdpi/reaction_scrubber_love_48.webp new file mode 100644 index 0000000000..8711d7628a Binary files /dev/null and b/res/drawable-mdpi/reaction_scrubber_love_48.webp differ diff --git a/res/drawable-mdpi/reaction_scrubber_sad_48.webp b/res/drawable-mdpi/reaction_scrubber_sad_48.webp new file mode 100644 index 0000000000..a259b431aa Binary files /dev/null and b/res/drawable-mdpi/reaction_scrubber_sad_48.webp differ diff --git a/res/drawable-mdpi/reaction_scrubber_wow_48.webp b/res/drawable-mdpi/reaction_scrubber_wow_48.webp new file mode 100644 index 0000000000..f2a5e54b60 Binary files /dev/null and b/res/drawable-mdpi/reaction_scrubber_wow_48.webp differ diff --git a/res/drawable-xhdpi/reaction_scrubber_angry_48.webp b/res/drawable-xhdpi/reaction_scrubber_angry_48.webp new file mode 100644 index 0000000000..6040982388 Binary files /dev/null and b/res/drawable-xhdpi/reaction_scrubber_angry_48.webp differ diff --git a/res/drawable-xhdpi/reaction_scrubber_dislike_48.webp b/res/drawable-xhdpi/reaction_scrubber_dislike_48.webp new file mode 100644 index 0000000000..989dceb244 Binary files /dev/null and b/res/drawable-xhdpi/reaction_scrubber_dislike_48.webp differ diff --git a/res/drawable-xhdpi/reaction_scrubber_haha_48.webp b/res/drawable-xhdpi/reaction_scrubber_haha_48.webp new file mode 100644 index 0000000000..d6021256b1 Binary files /dev/null and b/res/drawable-xhdpi/reaction_scrubber_haha_48.webp differ diff --git a/res/drawable-xhdpi/reaction_scrubber_like_48.webp b/res/drawable-xhdpi/reaction_scrubber_like_48.webp new file mode 100644 index 0000000000..75eadbcecc Binary files /dev/null and b/res/drawable-xhdpi/reaction_scrubber_like_48.webp differ diff --git a/res/drawable-xhdpi/reaction_scrubber_love_48.webp b/res/drawable-xhdpi/reaction_scrubber_love_48.webp new file mode 100644 index 0000000000..bfe2f6dfbb Binary files /dev/null and b/res/drawable-xhdpi/reaction_scrubber_love_48.webp differ diff --git a/res/drawable-xhdpi/reaction_scrubber_sad_48.webp b/res/drawable-xhdpi/reaction_scrubber_sad_48.webp new file mode 100644 index 0000000000..249ff57626 Binary files /dev/null and b/res/drawable-xhdpi/reaction_scrubber_sad_48.webp differ diff --git a/res/drawable-xhdpi/reaction_scrubber_wow_48.webp b/res/drawable-xhdpi/reaction_scrubber_wow_48.webp new file mode 100644 index 0000000000..d0f49e0aac Binary files /dev/null and b/res/drawable-xhdpi/reaction_scrubber_wow_48.webp differ diff --git a/res/drawable-xxhdpi/reaction_scrubber_angry_48.webp b/res/drawable-xxhdpi/reaction_scrubber_angry_48.webp new file mode 100644 index 0000000000..849a3fa39a Binary files /dev/null and b/res/drawable-xxhdpi/reaction_scrubber_angry_48.webp differ diff --git a/res/drawable-xxhdpi/reaction_scrubber_dislike_48.webp b/res/drawable-xxhdpi/reaction_scrubber_dislike_48.webp new file mode 100644 index 0000000000..2eac134d20 Binary files /dev/null and b/res/drawable-xxhdpi/reaction_scrubber_dislike_48.webp differ diff --git a/res/drawable-xxhdpi/reaction_scrubber_haha_48.webp b/res/drawable-xxhdpi/reaction_scrubber_haha_48.webp new file mode 100644 index 0000000000..1c084eb9e4 Binary files /dev/null and b/res/drawable-xxhdpi/reaction_scrubber_haha_48.webp differ diff --git a/res/drawable-xxhdpi/reaction_scrubber_like_48.webp b/res/drawable-xxhdpi/reaction_scrubber_like_48.webp new file mode 100644 index 0000000000..4883a86302 Binary files /dev/null and b/res/drawable-xxhdpi/reaction_scrubber_like_48.webp differ diff --git a/res/drawable-xxhdpi/reaction_scrubber_love_48.webp b/res/drawable-xxhdpi/reaction_scrubber_love_48.webp new file mode 100644 index 0000000000..5b7f268f0a Binary files /dev/null and b/res/drawable-xxhdpi/reaction_scrubber_love_48.webp differ diff --git a/res/drawable-xxhdpi/reaction_scrubber_sad_48.webp b/res/drawable-xxhdpi/reaction_scrubber_sad_48.webp new file mode 100644 index 0000000000..af7e6f6dfe Binary files /dev/null and b/res/drawable-xxhdpi/reaction_scrubber_sad_48.webp differ diff --git a/res/drawable-xxhdpi/reaction_scrubber_wow_48.webp b/res/drawable-xxhdpi/reaction_scrubber_wow_48.webp new file mode 100644 index 0000000000..a994666ca2 Binary files /dev/null and b/res/drawable-xxhdpi/reaction_scrubber_wow_48.webp differ diff --git a/res/drawable-xxxhdpi/reaction_scrubber_angry_48.webp b/res/drawable-xxxhdpi/reaction_scrubber_angry_48.webp new file mode 100644 index 0000000000..d57b985f33 Binary files /dev/null and b/res/drawable-xxxhdpi/reaction_scrubber_angry_48.webp differ diff --git a/res/drawable-xxxhdpi/reaction_scrubber_dislike_48.webp b/res/drawable-xxxhdpi/reaction_scrubber_dislike_48.webp new file mode 100644 index 0000000000..10510812ec Binary files /dev/null and b/res/drawable-xxxhdpi/reaction_scrubber_dislike_48.webp differ diff --git a/res/drawable-xxxhdpi/reaction_scrubber_haha_48.webp b/res/drawable-xxxhdpi/reaction_scrubber_haha_48.webp new file mode 100644 index 0000000000..b2d7dcc15f Binary files /dev/null and b/res/drawable-xxxhdpi/reaction_scrubber_haha_48.webp differ diff --git a/res/drawable-xxxhdpi/reaction_scrubber_like_48.webp b/res/drawable-xxxhdpi/reaction_scrubber_like_48.webp new file mode 100644 index 0000000000..e5898a40eb Binary files /dev/null and b/res/drawable-xxxhdpi/reaction_scrubber_like_48.webp differ diff --git a/res/drawable-xxxhdpi/reaction_scrubber_love_48.webp b/res/drawable-xxxhdpi/reaction_scrubber_love_48.webp new file mode 100644 index 0000000000..89b950eab6 Binary files /dev/null and b/res/drawable-xxxhdpi/reaction_scrubber_love_48.webp differ diff --git a/res/drawable-xxxhdpi/reaction_scrubber_sad_48.webp b/res/drawable-xxxhdpi/reaction_scrubber_sad_48.webp new file mode 100644 index 0000000000..927773e9b7 Binary files /dev/null and b/res/drawable-xxxhdpi/reaction_scrubber_sad_48.webp differ diff --git a/res/drawable-xxxhdpi/reaction_scrubber_wow_48.webp b/res/drawable-xxxhdpi/reaction_scrubber_wow_48.webp new file mode 100644 index 0000000000..7e0f196ec6 Binary files /dev/null and b/res/drawable-xxxhdpi/reaction_scrubber_wow_48.webp differ diff --git a/res/layout/conversation_reaction_scrubber.xml b/res/layout/conversation_reaction_scrubber.xml index c51790b39c..0ff109e562 100644 --- a/res/layout/conversation_reaction_scrubber.xml +++ b/res/layout/conversation_reaction_scrubber.xml @@ -1,6 +1,5 @@ - @@ -49,103 +49,103 @@ app:layout_constraintRight_toRightOf="@id/reaction_3" app:layout_constraintTop_toTopOf="parent" /> - + app:layout_constraintTop_toTopOf="parent" + tools:alpha="1" + tools:translationY="0dp" /> - + app:layout_constraintTop_toTopOf="parent" + tools:alpha="1" + tools:translationY="0dp" /> - + app:layout_constraintTop_toTopOf="parent" + tools:alpha="1" + tools:translationY="0dp" /> - + app:layout_constraintTop_toTopOf="parent" + tools:alpha="1" + tools:translationY="0dp" /> - + app:layout_constraintTop_toTopOf="parent" + tools:alpha="1" + tools:translationY="0dp" /> - + app:layout_constraintTop_toTopOf="parent" + tools:alpha="1" + tools:translationY="0dp" /> - + app:layout_constraintTop_toTopOf="parent" + tools:alpha="1" + tools:translationY="0dp" /> \ No newline at end of file diff --git a/res/values-v21/themes.xml b/res/values-v21/themes.xml index f518104d93..8d88bda096 100644 --- a/res/values-v21/themes.xml +++ b/res/values-v21/themes.xml @@ -35,4 +35,15 @@ @color/media_preview_bar_background + + + + diff --git a/res/values-v23/themes.xml b/res/values-v23/themes.xml index 786e49e3f5..a709ccac0f 100644 --- a/res/values-v23/themes.xml +++ b/res/values-v23/themes.xml @@ -33,4 +33,18 @@ false @color/core_grey_95 + + + + + diff --git a/res/values-v27/themes.xml b/res/values-v27/themes.xml index ccd08f8b31..649e743ebb 100644 --- a/res/values-v27/themes.xml +++ b/res/values-v27/themes.xml @@ -42,4 +42,20 @@ @color/core_grey_95 false + + + + diff --git a/res/values/dimens.xml b/res/values/dimens.xml index be8511ab2a..e4d7a4d05d 100644 --- a/res/values/dimens.xml +++ b/res/values/dimens.xml @@ -70,10 +70,9 @@ 8dp 1dp - 28dp - 25dp 0dp + 320dp 20dp 28dp diff --git a/res/values/themes.xml b/res/values/themes.xml index 640bf789cf..4ff503e925 100644 --- a/res/values/themes.xml +++ b/res/values/themes.xml @@ -689,4 +689,12 @@ false + + + + diff --git a/src/org/thoughtcrime/securesms/conversation/ConversationReactionOverlay.java b/src/org/thoughtcrime/securesms/conversation/ConversationReactionOverlay.java index 504e7ceb6b..6a85d8821e 100644 --- a/src/org/thoughtcrime/securesms/conversation/ConversationReactionOverlay.java +++ b/src/org/thoughtcrime/securesms/conversation/ConversationReactionOverlay.java @@ -7,7 +7,10 @@ import android.content.Context; import android.graphics.PointF; import android.graphics.Rect; import android.os.Build; +import android.os.VibrationEffect; +import android.os.Vibrator; import android.util.AttributeSet; +import android.view.HapticFeedbackConstants; import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; @@ -36,6 +39,8 @@ import org.thoughtcrime.securesms.database.model.MessageRecord; import org.thoughtcrime.securesms.database.model.ReactionRecord; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.util.MessageRecordUtil; +import org.thoughtcrime.securesms.util.ServiceUtil; +import org.thoughtcrime.securesms.util.TextSecurePreferences; import org.thoughtcrime.securesms.util.ThemeUtil; import org.thoughtcrime.securesms.util.Util; import org.thoughtcrime.securesms.util.ViewUtil; @@ -77,6 +82,7 @@ public final class ConversationReactionOverlay extends RelativeLayout { private float distanceFromTouchDownPointToBottomOfScrubberDeadZone; private int scrubberDistanceFromTouchDown; private int scrubberHeight; + private int scrubberWidth; private int halfActionBarHeight; private int selectedVerticalTranslation; private int scrubberHorizontalMargin; @@ -111,11 +117,8 @@ public final class ConversationReactionOverlay extends RelativeLayout { toolbar.setNavigationOnClickListener(view -> hide()); emojiViews = Stream.of(ReactionEmoji.values()) - .map(e -> { - EmojiTextView view = findViewById(e.viewId); - view.setText(e.emoji); - return view; - }).toArray(View[]::new); + .map(e -> findViewById(e.viewId)) + .toArray(View[]::new); distanceFromTouchDownPointToTopOfScrubberDeadZone = getResources().getDimensionPixelSize(R.dimen.conversation_reaction_scrub_deadzone_distance_from_touch_top); distanceFromTouchDownPointToBottomOfScrubberDeadZone = getResources().getDimensionPixelSize(R.dimen.conversation_reaction_scrub_deadzone_distance_from_touch_bottom); @@ -124,6 +127,7 @@ public final class ConversationReactionOverlay extends RelativeLayout { 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); halfActionBarHeight = (int) ThemeUtil.getThemedDimen(getContext(), R.attr.actionBarSize) / 2; selectedVerticalTranslation = getResources().getDimensionPixelOffset(R.dimen.conversation_reaction_scrub_vertical_translation); scrubberHorizontalMargin = getResources().getDimensionPixelOffset(R.dimen.conversation_reaction_scrub_horizontal_margin); @@ -149,7 +153,7 @@ public final class ConversationReactionOverlay extends RelativeLayout { final float scrubberTranslationY = Math.max(-scrubberDistanceFromTouchDown + halfActionBarHeight, lastSeenDownPoint.y - scrubberHeight - scrubberDistanceFromTouchDown); - final float halfWidth = foregroundView.getWidth() / 2f + scrubberHorizontalMargin; + final float halfWidth = scrubberWidth / 2f + scrubberHorizontalMargin; final float screenWidth = getResources().getDisplayMetrics().widthPixels; final float scrubberTranslationX = Util.clamp(lastSeenDownPoint.x - halfWidth, scrubberHorizontalMargin, @@ -202,6 +206,19 @@ public final class ConversationReactionOverlay extends RelativeLayout { return messageRecord; } + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + super.onLayout(changed, l, t, r, b); + + backgroundView.getGlobalVisibleRect(emojiStripViewBounds); + emojiViews[0].getGlobalVisibleRect(emojiViewGlobalRect); + emojiStripViewBounds.left = emojiViewGlobalRect.left; + emojiViews[emojiViews.length - 1].getGlobalVisibleRect(emojiViewGlobalRect); + emojiStripViewBounds.right = emojiViewGlobalRect.right; + + segmentSize = emojiStripViewBounds.width() / (float) emojiViews.length; + } + public boolean applyTouchEvent(@NonNull MotionEvent motionEvent) { if (!isShowing()) { if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) { @@ -215,14 +232,6 @@ public final class ConversationReactionOverlay extends RelativeLayout { } if (overlayState == OverlayState.UNINITAILIZED) { - backgroundView.getGlobalVisibleRect(emojiStripViewBounds); - emojiViews[0].getGlobalVisibleRect(emojiViewGlobalRect); - emojiStripViewBounds.left = emojiViewGlobalRect.left; - emojiViews[emojiViews.length - 1].getGlobalVisibleRect(emojiViewGlobalRect); - emojiStripViewBounds.right = emojiViewGlobalRect.right; - - segmentSize = emojiStripViewBounds.width() / (float) emojiViews.length; - downIsOurs = false; deadzoneTouchPoint.set(motionEvent.getRawX(), motionEvent.getRawY()); @@ -345,6 +354,7 @@ public final class ConversationReactionOverlay extends RelativeLayout { } private void growView(@NonNull View view) { + view.performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP); view.animate() .scaleY(1.5f) .scaleX(1.5f) @@ -486,7 +496,7 @@ public final class ConversationReactionOverlay extends RelativeLayout { hideAnimatorSet.addListener(new AnimationCompleteListener() { @Override public void onAnimationEnd(Animator animation) { - setVisibility(View.INVISIBLE); + setVisibility(View.GONE); } }); diff --git a/src/org/thoughtcrime/securesms/jobs/ReactionSendJob.java b/src/org/thoughtcrime/securesms/jobs/ReactionSendJob.java index a2baa39492..e986da9ac3 100644 --- a/src/org/thoughtcrime/securesms/jobs/ReactionSendJob.java +++ b/src/org/thoughtcrime/securesms/jobs/ReactionSendJob.java @@ -11,17 +11,12 @@ import org.thoughtcrime.securesms.crypto.UnidentifiedAccessUtil; import org.thoughtcrime.securesms.database.DatabaseFactory; import org.thoughtcrime.securesms.database.MessagingDatabase; import org.thoughtcrime.securesms.database.NoSuchMessageException; -import org.thoughtcrime.securesms.database.ThreadDatabase; import org.thoughtcrime.securesms.database.model.MessageRecord; -import org.thoughtcrime.securesms.database.model.MmsMessageRecord; import org.thoughtcrime.securesms.database.model.ReactionRecord; -import org.thoughtcrime.securesms.database.model.SmsMessageRecord; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; import org.thoughtcrime.securesms.jobmanager.Data; import org.thoughtcrime.securesms.jobmanager.Job; -import org.thoughtcrime.securesms.jobmanager.JobManager; import org.thoughtcrime.securesms.logging.Log; -import org.thoughtcrime.securesms.mms.OutgoingMediaMessage; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.recipients.RecipientUtil; @@ -37,8 +32,6 @@ import org.whispersystems.signalservice.api.messages.SignalServiceGroup; import org.whispersystems.signalservice.api.push.SignalServiceAddress; import java.io.IOException; -import java.util.Arrays; -import java.util.Collections; import java.util.List; import java.util.concurrent.TimeUnit; @@ -84,7 +77,7 @@ public class ReactionSendJob extends BaseJob { } List recipients = conversationRecipient.isGroup() ? Stream.of(conversationRecipient.getParticipants()).map(Recipient::getId).toList() - : Arrays.asList(conversationRecipient.getId()); + : Stream.of(conversationRecipient.getId()).toList(); recipients.remove(Recipient.self().getId()); diff --git a/src/org/thoughtcrime/securesms/reactions/ReactionsBottomSheetDialogFragment.java b/src/org/thoughtcrime/securesms/reactions/ReactionsBottomSheetDialogFragment.java index 61d8b1bdb9..4314e69e9c 100644 --- a/src/org/thoughtcrime/securesms/reactions/ReactionsBottomSheetDialogFragment.java +++ b/src/org/thoughtcrime/securesms/reactions/ReactionsBottomSheetDialogFragment.java @@ -15,6 +15,7 @@ import androidx.recyclerview.widget.RecyclerView; import com.google.android.material.bottomsheet.BottomSheetDialogFragment; import org.thoughtcrime.securesms.R; +import org.thoughtcrime.securesms.util.ThemeUtil; public final class ReactionsBottomSheetDialogFragment extends BottomSheetDialogFragment { @@ -41,6 +42,18 @@ public final class ReactionsBottomSheetDialogFragment extends BottomSheetDialogF return fragment; } + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + + if (ThemeUtil.isDarkTheme(requireContext())) { + setStyle(DialogFragment.STYLE_NORMAL, R.style.Theme_Design_BottomSheetDialog_Fixed); + } else { + setStyle(DialogFragment.STYLE_NORMAL, R.style.Theme_Design_Light_BottomSheetDialog_Fixed); + } + + super.onCreate(savedInstanceState); + } + @Override public @Nullable View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,