diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/reminder/BubbleOptOutReminder.kt b/app/src/main/java/org/thoughtcrime/securesms/components/reminder/BubbleOptOutReminder.kt new file mode 100644 index 000000000..75492a2e0 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/components/reminder/BubbleOptOutReminder.kt @@ -0,0 +1,16 @@ +package org.thoughtcrime.securesms.components.reminder + +import android.content.Context +import org.thoughtcrime.securesms.R + +class BubbleOptOutReminder(context: Context) : Reminder(null, context.getString(R.string.BubbleOptOutTooltip__description)) { + + init { + addAction(Action(context.getString(R.string.BubbleOptOutTooltip__turn_off), R.id.reminder_action_turn_off)) + addAction(Action(context.getString(R.string.BubbleOptOutTooltip__not_now), R.id.reminder_action_not_now)) + } + + override fun isDismissable(): Boolean { + return false + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/reminder/ReminderActionsAdapter.java b/app/src/main/java/org/thoughtcrime/securesms/components/reminder/ReminderActionsAdapter.java index 64afd9f80..d4fd5b0bc 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/reminder/ReminderActionsAdapter.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/reminder/ReminderActionsAdapter.java @@ -1,11 +1,14 @@ package org.thoughtcrime.securesms.components.reminder; +import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; +import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.core.content.ContextCompat; import androidx.recyclerview.widget.RecyclerView; import org.thoughtcrime.securesms.R; @@ -15,10 +18,12 @@ import java.util.List; final class ReminderActionsAdapter extends RecyclerView.Adapter { + private final Reminder.Importance importance; private final List actions; private final ReminderView.OnActionClickListener actionClickListener; - ReminderActionsAdapter(List actions, ReminderView.OnActionClickListener actionClickListener) { + ReminderActionsAdapter(Reminder.Importance importance, List actions, ReminderView.OnActionClickListener actionClickListener) { + this.importance = importance; this.actions = Collections.unmodifiableList(actions); this.actionClickListener = actionClickListener; } @@ -26,7 +31,14 @@ final class ReminderActionsAdapter extends RecyclerView.Adapter actions = reminder.getActions(); if (actions.isEmpty()) { + text.setPadding(0, 0, 0, ((int) DimensionUnit.DP.toPixels(16f))); actionsRecycler.setVisibility(GONE); } else { + text.setPadding(0, 0, 0, 0); actionsRecycler.setVisibility(VISIBLE); - actionsRecycler.setAdapter(new ReminderActionsAdapter(actions, this::handleActionClicked)); + actionsRecycler.setAdapter(new ReminderActionsAdapter(reminder.getImportance(), actions, this::handleActionClicked)); } container.setVisibility(View.VISIBLE); diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.java index 9adc00f7f..4c5bb917b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.java @@ -38,6 +38,7 @@ import android.os.Bundle; import android.os.Vibrator; import android.provider.Browser; import android.provider.ContactsContract; +import android.provider.Settings; import android.text.Editable; import android.text.Spannable; import android.text.SpannableString; @@ -124,6 +125,7 @@ import org.thoughtcrime.securesms.components.emoji.MediaKeyboard; import org.thoughtcrime.securesms.components.identity.UnverifiedBannerView; import org.thoughtcrime.securesms.components.location.SignalPlace; import org.thoughtcrime.securesms.components.mention.MentionAnnotation; +import org.thoughtcrime.securesms.components.reminder.BubbleOptOutReminder; import org.thoughtcrime.securesms.components.reminder.ExpiredBuildReminder; import org.thoughtcrime.securesms.components.reminder.GroupsV1MigrationSuggestionsReminder; import org.thoughtcrime.securesms.components.reminder.PendingGroupJoinRequestsReminder; @@ -1874,6 +1876,19 @@ public class ConversationActivity extends PassphraseRequiredActivity }); reminderView.get().setOnDismissListener(() -> { }); + } else if (isInBubble() && !SignalStore.tooltips().hasSeenBubbleOptOutTooltip() && Build.VERSION.SDK_INT > 29) { + reminderView.get().showReminder(new BubbleOptOutReminder(this)); + reminderView.get().setOnActionClickListener(actionId -> { + SignalStore.tooltips().markBubbleOptOutTooltipSeen(); + reminderView.get().hide(); + + if (actionId == R.id.reminder_action_turn_off) { + Intent intent = new Intent(Settings.ACTION_APP_NOTIFICATION_BUBBLE_SETTINGS) + .putExtra(Settings.EXTRA_APP_PACKAGE, getPackageName()) + .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(intent); + } + }); } else if (reminderView.resolved()) { reminderView.get().hide(); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/TooltipValues.java b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/TooltipValues.java index 190a034be..ce4bc3d3d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/TooltipValues.java +++ b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/TooltipValues.java @@ -13,6 +13,7 @@ public class TooltipValues extends SignalStoreValues { private static final String GROUP_CALL_SPEAKER_VIEW = "tooltip.group_call_speaker_view"; private static final String GROUP_CALL_TOOLTIP_DISPLAY_COUNT = "tooltip.group_call_tooltip_display_count"; private static final String MULTI_FORWARD_DIALOG = "tooltip.multi.forward.dialog"; + private static final String BUBBLE_OPT_OUT = "tooltip.bubble.opt.out"; TooltipValues(@NonNull KeyValueStore store) { @@ -64,4 +65,12 @@ public class TooltipValues extends SignalStoreValues { public void markMultiForwardDialogSeen() { putBoolean(MULTI_FORWARD_DIALOG, false); } + + public boolean hasSeenBubbleOptOutTooltip() { + return getBoolean(BUBBLE_OPT_OUT, false); + } + + public void markBubbleOptOutTooltipSeen() { + putBoolean(BUBBLE_OPT_OUT, true); + } } diff --git a/app/src/main/res/drawable/reminder_background_normal.xml b/app/src/main/res/drawable/reminder_background_normal.xml index 45628500e..cf5277770 100644 --- a/app/src/main/res/drawable/reminder_background_normal.xml +++ b/app/src/main/res/drawable/reminder_background_normal.xml @@ -1,6 +1,6 @@ - - - + + + diff --git a/app/src/main/res/layout/conversation_activity.xml b/app/src/main/res/layout/conversation_activity.xml index a063dbe2e..5295155fb 100644 --- a/app/src/main/res/layout/conversation_activity.xml +++ b/app/src/main/res/layout/conversation_activity.xml @@ -239,7 +239,6 @@ android:inflatedId="@+id/review_banner" android:layout="@layout/review_banner_view" /> - + + + + diff --git a/app/src/main/res/values/ids.xml b/app/src/main/res/values/ids.xml index dbaec8e41..c49ce9301 100644 --- a/app/src/main/res/values/ids.xml +++ b/app/src/main/res/values/ids.xml @@ -12,6 +12,9 @@ + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c0df406c3..f45a44e76 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -2024,6 +2024,14 @@ Scroll to the bottom + + + Bubbles are an Android feature that you can turn off for Signal chats. + + Not now + + Turn off + Safety Number Changes Accept