From ca442970a3df9e70a0c3efee33635aec2f9b1d3b Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Fri, 18 Sep 2020 17:32:56 -0400 Subject: [PATCH] Add Research Megaphone. --- .../components/FullScreenDialogFragment.java | 51 +++++++++++ .../ui/mentions/MentionsPickerViewModel.java | 12 +-- .../ConversationListFragment.java | 6 ++ .../megaphone/BasicMegaphoneView.java | 48 ++++++---- .../securesms/megaphone/Megaphone.java | 46 +++++++--- .../megaphone/MegaphoneActionController.java | 6 ++ .../megaphone/MegaphoneRepository.java | 3 +- .../securesms/megaphone/Megaphones.java | 41 +++++---- .../megaphone/ResearchMegaphoneDialog.java | 47 ++++++++++ .../megaphone/ShowForDurationSchedule.java | 25 ++++++ .../securesms/util/BucketingUtil.java | 49 ++++++++++ .../securesms/util/FeatureFlags.java | 15 +++- .../securesms/util/ResearchMegaphone.java | 73 +++++++++++++++ .../org/thoughtcrime/securesms/util/Util.java | 8 ++ .../res/drawable-hdpi/signal_research.webp | Bin 0 -> 8870 bytes .../res/drawable-mdpi/signal_research.webp | Bin 0 -> 5482 bytes .../res/drawable-xhdpi/signal_research.webp | Bin 0 -> 12690 bytes .../res/drawable-xxhdpi/signal_research.webp | Bin 0 -> 21098 bytes .../res/drawable-xxxhdpi/signal_research.webp | Bin 0 -> 29866 bytes .../res/drawable/ic_research_megaphone.xml | 30 +++++++ .../main/res/layout/basic_megaphone_view.xml | 6 +- .../layout/full_screen_dialog_fragment.xml | 22 +++++ .../res/layout/research_megaphone_dialog.xml | 67 ++++++++++++++ app/src/main/res/values/strings.xml | 14 ++- app/src/main/res/values/styles.xml | 13 +++ .../securesms/util/BucketingUtilTest.java | 26 ++++++ ...chMegaphoneTest_determineCountEnabled.java | 85 ++++++++++++++++++ ...earchMegaphoneTest_parseCountryCounts.java | 59 ++++++++++++ 28 files changed, 685 insertions(+), 67 deletions(-) create mode 100644 app/src/main/java/org/thoughtcrime/securesms/components/FullScreenDialogFragment.java create mode 100644 app/src/main/java/org/thoughtcrime/securesms/megaphone/ResearchMegaphoneDialog.java create mode 100644 app/src/main/java/org/thoughtcrime/securesms/megaphone/ShowForDurationSchedule.java create mode 100644 app/src/main/java/org/thoughtcrime/securesms/util/BucketingUtil.java create mode 100644 app/src/main/java/org/thoughtcrime/securesms/util/ResearchMegaphone.java create mode 100644 app/src/main/res/drawable-hdpi/signal_research.webp create mode 100644 app/src/main/res/drawable-mdpi/signal_research.webp create mode 100644 app/src/main/res/drawable-xhdpi/signal_research.webp create mode 100644 app/src/main/res/drawable-xxhdpi/signal_research.webp create mode 100644 app/src/main/res/drawable-xxxhdpi/signal_research.webp create mode 100644 app/src/main/res/drawable/ic_research_megaphone.xml create mode 100644 app/src/main/res/layout/full_screen_dialog_fragment.xml create mode 100644 app/src/main/res/layout/research_megaphone_dialog.xml create mode 100644 app/src/test/java/org/thoughtcrime/securesms/util/BucketingUtilTest.java create mode 100644 app/src/test/java/org/thoughtcrime/securesms/util/ResearchMegaphoneTest_determineCountEnabled.java create mode 100644 app/src/test/java/org/thoughtcrime/securesms/util/ResearchMegaphoneTest_parseCountryCounts.java diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/FullScreenDialogFragment.java b/app/src/main/java/org/thoughtcrime/securesms/components/FullScreenDialogFragment.java new file mode 100644 index 000000000..a2e68a4c8 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/components/FullScreenDialogFragment.java @@ -0,0 +1,51 @@ +package org.thoughtcrime.securesms.components; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.LayoutRes; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.StringRes; +import androidx.appcompat.widget.Toolbar; +import androidx.fragment.app.DialogFragment; + +import org.thoughtcrime.securesms.R; +import org.thoughtcrime.securesms.util.ThemeUtil; + +/** + * Base dialog fragment for rendering as a full screen dialog with animation + * transitions. + */ +public abstract class FullScreenDialogFragment extends DialogFragment { + + protected Toolbar toolbar; + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + setStyle(STYLE_NO_FRAME, ThemeUtil.isDarkTheme(requireActivity()) ? R.style.TextSecure_DarkTheme_FullScreenDialog + : R.style.TextSecure_LightTheme_FullScreenDialog); + } + + @Override + public @NonNull View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.full_screen_dialog_fragment, container, false); + inflater.inflate(getDialogLayoutResource(), view.findViewById(R.id.full_screen_dialog_content), true); + toolbar = view.findViewById(R.id.full_screen_dialog_toolbar); + toolbar.setTitle(getTitle()); + toolbar.setNavigationOnClickListener(v -> onNavigateUp()); + return view; + } + + protected void onNavigateUp() { + dismissAllowingStateLoss(); + } + + protected abstract @StringRes int getTitle(); + + protected abstract @LayoutRes int getDialogLayoutResource(); +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/mentions/MentionsPickerViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/mentions/MentionsPickerViewModel.java index 34d60392f..861f54053 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/mentions/MentionsPickerViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/mentions/MentionsPickerViewModel.java @@ -12,8 +12,6 @@ import com.annimon.stream.Stream; import org.thoughtcrime.securesms.conversation.ui.mentions.MentionsPickerRepository.MentionQuery; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; -import org.thoughtcrime.securesms.megaphone.MegaphoneRepository; -import org.thoughtcrime.securesms.megaphone.Megaphones; import org.thoughtcrime.securesms.recipients.LiveRecipient; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; @@ -31,12 +29,8 @@ public class MentionsPickerViewModel extends ViewModel { private final MutableLiveData liveRecipient; private final MutableLiveData liveQuery; private final MutableLiveData isShowing; - private final MegaphoneRepository megaphoneRepository; - MentionsPickerViewModel(@NonNull MentionsPickerRepository mentionsPickerRepository, - @NonNull MegaphoneRepository megaphoneRepository) - { - this.megaphoneRepository = megaphoneRepository; + MentionsPickerViewModel(@NonNull MentionsPickerRepository mentionsPickerRepository) { this.liveRecipient = new MutableLiveData<>(); this.liveQuery = new MutableLiveData<>(); this.selectedRecipient = new SingleLiveEvent<>(); @@ -56,7 +50,6 @@ public class MentionsPickerViewModel extends ViewModel { void onSelectionChange(@NonNull Recipient recipient) { selectedRecipient.setValue(recipient); - megaphoneRepository.markFinished(Megaphones.Event.MENTIONS); } void setIsShowing(boolean isShowing) { @@ -119,8 +112,7 @@ public class MentionsPickerViewModel extends ViewModel { @Override public @NonNull T create(@NonNull Class modelClass) { //noinspection ConstantConditions - return modelClass.cast(new MentionsPickerViewModel(new MentionsPickerRepository(ApplicationDependencies.getApplication()), - ApplicationDependencies.getMegaphoneRepository())); + return modelClass.cast(new MentionsPickerViewModel(new MentionsPickerRepository(ApplicationDependencies.getApplication()))); } } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java index 55eb5b100..4d8ef1d44 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java @@ -55,6 +55,7 @@ import androidx.appcompat.widget.Toolbar; import androidx.appcompat.widget.TooltipCompat; import androidx.core.content.res.ResourcesCompat; import androidx.core.view.ViewCompat; +import androidx.fragment.app.DialogFragment; import androidx.lifecycle.DefaultLifecycleObserver; import androidx.lifecycle.LifecycleObserver; import androidx.lifecycle.LifecycleOwner; @@ -423,6 +424,11 @@ public class ConversationListFragment extends MainFragment implements ActionMode viewModel.onMegaphoneCompleted(event); } + @Override + public void onMegaphoneDialogFragmentRequested(@NonNull DialogFragment dialogFragment) { + dialogFragment.show(getChildFragmentManager(), "megaphone_dialog"); + } + private void onReminderAction(@IdRes int reminderActionId) { if (reminderActionId == R.id.reminder_action_update_now) { PlayStoreUtil.openPlayStoreOrOurApkDownloadPage(requireContext()); diff --git a/app/src/main/java/org/thoughtcrime/securesms/megaphone/BasicMegaphoneView.java b/app/src/main/java/org/thoughtcrime/securesms/megaphone/BasicMegaphoneView.java index ba13b7098..0de9510e6 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/megaphone/BasicMegaphoneView.java +++ b/app/src/main/java/org/thoughtcrime/securesms/megaphone/BasicMegaphoneView.java @@ -14,11 +14,11 @@ import org.thoughtcrime.securesms.R; public class BasicMegaphoneView extends FrameLayout { - private ImageView image; - private TextView titleText; - private TextView bodyText; - private Button actionButton; - private Button snoozeButton; + private ImageView image; + private TextView titleText; + private TextView bodyText; + private Button actionButton; + private Button secondaryButton; private Megaphone megaphone; private MegaphoneActionController megaphoneListener; @@ -36,11 +36,11 @@ public class BasicMegaphoneView extends FrameLayout { private void init(@NonNull Context context) { inflate(context, R.layout.basic_megaphone_view, this); - this.image = findViewById(R.id.basic_megaphone_image); - this.titleText = findViewById(R.id.basic_megaphone_title); - this.bodyText = findViewById(R.id.basic_megaphone_body); - this.actionButton = findViewById(R.id.basic_megaphone_action); - this.snoozeButton = findViewById(R.id.basic_megaphone_snooze); + this.image = findViewById(R.id.basic_megaphone_image); + this.titleText = findViewById(R.id.basic_megaphone_title); + this.bodyText = findViewById(R.id.basic_megaphone_body); + this.actionButton = findViewById(R.id.basic_megaphone_action); + this.secondaryButton = findViewById(R.id.basic_megaphone_secondary); } @Override @@ -89,17 +89,27 @@ public class BasicMegaphoneView extends FrameLayout { actionButton.setVisibility(GONE); } - if (megaphone.canSnooze()) { - snoozeButton.setVisibility(VISIBLE); - snoozeButton.setOnClickListener(v -> { - megaphoneListener.onMegaphoneSnooze(megaphone.getEvent()); + if (megaphone.canSnooze() || megaphone.hasSecondaryButton()) { + secondaryButton.setVisibility(VISIBLE); - if (megaphone.getSnoozeListener() != null) { - megaphone.getSnoozeListener().onEvent(megaphone, megaphoneListener); - } - }); + if (megaphone.canSnooze()) { + secondaryButton.setOnClickListener(v -> { + megaphoneListener.onMegaphoneSnooze(megaphone.getEvent()); + + if (megaphone.getSnoozeListener() != null) { + megaphone.getSnoozeListener().onEvent(megaphone, megaphoneListener); + } + }); + } else { + secondaryButton.setText(megaphone.getSecondaryButtonText()); + secondaryButton.setOnClickListener(v -> { + if (megaphone.getSecondaryButtonClickListener() != null) { + megaphone.getSecondaryButtonClickListener().onEvent(megaphone, megaphoneListener); + } + }); + } } else { - snoozeButton.setVisibility(GONE); + secondaryButton.setVisibility(GONE); } } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/megaphone/Megaphone.java b/app/src/main/java/org/thoughtcrime/securesms/megaphone/Megaphone.java index a001cb3e3..da90fd9e9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/megaphone/Megaphone.java +++ b/app/src/main/java/org/thoughtcrime/securesms/megaphone/Megaphone.java @@ -28,20 +28,24 @@ public class Megaphone { private final int buttonTextRes; private final EventListener buttonListener; private final EventListener snoozeListener; + private final int secondaryButtonTextRes; + private final EventListener secondaryButtonListener; private final EventListener onVisibleListener; private Megaphone(@NonNull Builder builder) { - this.event = builder.event; - this.style = builder.style; - this.priority = builder.priority; - this.canSnooze = builder.canSnooze; - this.titleRes = builder.titleRes; - this.bodyRes = builder.bodyRes; - this.imageRequest = builder.imageRequest; - this.buttonTextRes = builder.buttonTextRes; - this.buttonListener = builder.buttonListener; - this.snoozeListener = builder.snoozeListener; - this.onVisibleListener = builder.onVisibleListener; + this.event = builder.event; + this.style = builder.style; + this.priority = builder.priority; + this.canSnooze = builder.canSnooze; + this.titleRes = builder.titleRes; + this.bodyRes = builder.bodyRes; + this.imageRequest = builder.imageRequest; + this.buttonTextRes = builder.buttonTextRes; + this.buttonListener = builder.buttonListener; + this.snoozeListener = builder.snoozeListener; + this.secondaryButtonTextRes = builder.secondaryButtonTextRes; + this.secondaryButtonListener = builder.secondaryButtonListener; + this.onVisibleListener = builder.onVisibleListener; } public @NonNull Event getEvent() { @@ -88,6 +92,18 @@ public class Megaphone { return snoozeListener; } + public @StringRes int getSecondaryButtonText() { + return secondaryButtonTextRes; + } + + public boolean hasSecondaryButton() { + return secondaryButtonTextRes != 0; + } + + public @Nullable EventListener getSecondaryButtonClickListener() { + return secondaryButtonListener; + } + public @Nullable EventListener getOnVisibleListener() { return onVisibleListener; } @@ -105,6 +121,8 @@ public class Megaphone { private int buttonTextRes; private EventListener buttonListener; private EventListener snoozeListener; + private int secondaryButtonTextRes; + private EventListener secondaryButtonListener; private EventListener onVisibleListener; @@ -159,6 +177,12 @@ public class Megaphone { return this; } + public @NonNull Builder setSecondaryButton(@StringRes int secondaryButtonTextRes, @NonNull EventListener listener) { + this.secondaryButtonTextRes = secondaryButtonTextRes; + this.secondaryButtonListener = listener; + return this; + } + public @NonNull Builder setOnVisibleListener(@Nullable EventListener listener) { this.onVisibleListener = listener; return this; diff --git a/app/src/main/java/org/thoughtcrime/securesms/megaphone/MegaphoneActionController.java b/app/src/main/java/org/thoughtcrime/securesms/megaphone/MegaphoneActionController.java index 6aea1a9cb..66fdb31fc 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/megaphone/MegaphoneActionController.java +++ b/app/src/main/java/org/thoughtcrime/securesms/megaphone/MegaphoneActionController.java @@ -5,6 +5,7 @@ import android.content.Intent; import androidx.annotation.NonNull; import androidx.annotation.StringRes; +import androidx.fragment.app.DialogFragment; public interface MegaphoneActionController { /** @@ -36,4 +37,9 @@ public interface MegaphoneActionController { * Called when a megaphone completed its goal. */ void onMegaphoneCompleted(@NonNull Megaphones.Event event); + + /** + * When a megaphone wnats to show a dialog fragment. + */ + void onMegaphoneDialogFragmentRequested(@NonNull DialogFragment dialogFragment); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/megaphone/MegaphoneRepository.java b/app/src/main/java/org/thoughtcrime/securesms/megaphone/MegaphoneRepository.java index a0d4c73c8..4e76f25c0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/megaphone/MegaphoneRepository.java +++ b/app/src/main/java/org/thoughtcrime/securesms/megaphone/MegaphoneRepository.java @@ -3,7 +3,6 @@ package org.thoughtcrime.securesms.megaphone; import android.content.Context; import androidx.annotation.AnyThread; -import androidx.annotation.MainThread; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.WorkerThread; @@ -53,7 +52,7 @@ public class MegaphoneRepository { executor.execute(() -> { database.markFinished(Event.REACTIONS); database.markFinished(Event.MESSAGE_REQUESTS); - database.markFinished(Event.MENTIONS); + database.markFinished(Event.RESEARCH); resetDatabaseCache(); }); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/megaphone/Megaphones.java b/app/src/main/java/org/thoughtcrime/securesms/megaphone/Megaphones.java index e792b5a34..e9c0fc832 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/megaphone/Megaphones.java +++ b/app/src/main/java/org/thoughtcrime/securesms/megaphone/Megaphones.java @@ -23,6 +23,7 @@ import org.thoughtcrime.securesms.messagerequests.MessageRequestMegaphoneActivit import org.thoughtcrime.securesms.profiles.ProfileName; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.util.FeatureFlags; +import org.thoughtcrime.securesms.util.ResearchMegaphone; import org.thoughtcrime.securesms.util.TextSecurePreferences; import java.util.LinkedHashMap; @@ -85,9 +86,9 @@ public final class Megaphones { put(Event.PINS_FOR_ALL, new PinsForAllSchedule()); put(Event.PIN_REMINDER, new SignalPinReminderSchedule()); put(Event.MESSAGE_REQUESTS, shouldShowMessageRequestsMegaphone() ? ALWAYS : NEVER); - put(Event.MENTIONS, shouldShowMentionsMegaphone() ? ALWAYS : NEVER); put(Event.LINK_PREVIEWS, shouldShowLinkPreviewsMegaphone(context) ? ALWAYS : NEVER); put(Event.CLIENT_DEPRECATED, SignalStore.misc().isClientDeprecated() ? ALWAYS : NEVER); + put(Event.RESEARCH, shouldShowResearchMegaphone() ? ShowForDurationSchedule.showForDays(7) : NEVER); }}; } @@ -101,12 +102,12 @@ public final class Megaphones { return buildPinReminderMegaphone(context); case MESSAGE_REQUESTS: return buildMessageRequestsMegaphone(context); - case MENTIONS: - return buildMentionsMegaphone(); case LINK_PREVIEWS: return buildLinkPreviewsMegaphone(); case CLIENT_DEPRECATED: return buildClientDeprecatedMegaphone(context); + case RESEARCH: + return buildResearchMegaphone(context); default: throw new IllegalArgumentException("Event not handled!"); } @@ -189,14 +190,6 @@ public final class Megaphones { .build(); } - private static Megaphone buildMentionsMegaphone() { - return new Megaphone.Builder(Event.MENTIONS, Megaphone.Style.POPUP) - .setTitle(R.string.MentionsMegaphone__introducing_mentions) - .setBody(R.string.MentionsMegaphone__get_someones_attention_in_a_group_by_typing) - .setImage(R.drawable.mention_megaphone) - .build(); - } - private static @NonNull Megaphone buildLinkPreviewsMegaphone() { return new Megaphone.Builder(Event.LINK_PREVIEWS, Megaphone.Style.LINK_PREVIEWS) .setPriority(Megaphone.Priority.HIGH) @@ -207,9 +200,22 @@ public final class Megaphones { return new Megaphone.Builder(Event.CLIENT_DEPRECATED, Megaphone.Style.FULLSCREEN) .disableSnooze() .setPriority(Megaphone.Priority.HIGH) - .setOnVisibleListener((megaphone, listener) -> { - listener.onMegaphoneNavigationRequested(new Intent(context, ClientDeprecatedActivity.class)); + .setOnVisibleListener((megaphone, listener) -> listener.onMegaphoneNavigationRequested(new Intent(context, ClientDeprecatedActivity.class))) + .build(); + } + + private static @NonNull Megaphone buildResearchMegaphone(@NonNull Context context) { + return new Megaphone.Builder(Event.RESEARCH, Megaphone.Style.BASIC) + .disableSnooze() + .setTitle(R.string.ResearchMegaphone_tell_signal_what_you_think) + .setBody(R.string.ResearchMegaphone_to_make_signal_the_best_messaging_app_on_the_planet) + .setImage(R.drawable.ic_research_megaphone) + .setActionButton(R.string.ResearchMegaphone_learn_more, (megaphone, controller) -> { + controller.onMegaphoneCompleted(megaphone.getEvent()); + controller.onMegaphoneDialogFragmentRequested(new ResearchMegaphoneDialog()); }) + .setSecondaryButton(R.string.ResearchMegaphone_dismiss, (megaphone, controller) -> controller.onMegaphoneCompleted(megaphone.getEvent())) + .setPriority(Megaphone.Priority.DEFAULT) .build(); } @@ -217,9 +223,8 @@ public final class Megaphones { return Recipient.self().getProfileName() == ProfileName.EMPTY; } - private static boolean shouldShowMentionsMegaphone() { - return false; -// return FeatureFlags.mentions(); + private static boolean shouldShowResearchMegaphone() { + return ResearchMegaphone.isInResearchMegaphone(); } private static boolean shouldShowLinkPreviewsMegaphone(@NonNull Context context) { @@ -231,9 +236,9 @@ public final class Megaphones { PINS_FOR_ALL("pins_for_all"), PIN_REMINDER("pin_reminder"), MESSAGE_REQUESTS("message_requests"), - MENTIONS("mentions"), LINK_PREVIEWS("link_previews"), - CLIENT_DEPRECATED("client_deprecated"); + CLIENT_DEPRECATED("client_deprecated"), + RESEARCH("research"); private final String key; diff --git a/app/src/main/java/org/thoughtcrime/securesms/megaphone/ResearchMegaphoneDialog.java b/app/src/main/java/org/thoughtcrime/securesms/megaphone/ResearchMegaphoneDialog.java new file mode 100644 index 000000000..4b190deb8 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/megaphone/ResearchMegaphoneDialog.java @@ -0,0 +1,47 @@ +package org.thoughtcrime.securesms.megaphone; + +import android.os.Bundle; +import android.text.Html; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.StringRes; + +import org.thoughtcrime.securesms.R; +import org.thoughtcrime.securesms.components.FullScreenDialogFragment; +import org.thoughtcrime.securesms.util.CommunicationActions; + +public class ResearchMegaphoneDialog extends FullScreenDialogFragment { + + private static final String SURVEY_URL = "https://surveys.signalusers.org/s3"; + + @Override + public @NonNull View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = super.onCreateView(inflater, container, savedInstanceState); + + TextView content = view.findViewById(R.id.research_megaphone_content); + content.setText(Html.fromHtml(requireContext().getString(R.string.ResearchMegaphoneDialog_we_believe_in_privacy))); + + view.findViewById(R.id.research_megaphone_dialog_take_the_survey) + .setOnClickListener(v -> CommunicationActions.openBrowserLink(requireContext(), SURVEY_URL)); + + view.findViewById(R.id.research_megaphone_dialog_no_thanks) + .setOnClickListener(v -> dismissAllowingStateLoss()); + + return view; + } + + @Override + protected @StringRes int getTitle() { + return R.string.ResearchMegaphoneDialog_signal_research; + } + + @Override + protected int getDialogLayoutResource() { + return R.layout.research_megaphone_dialog; + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/megaphone/ShowForDurationSchedule.java b/app/src/main/java/org/thoughtcrime/securesms/megaphone/ShowForDurationSchedule.java new file mode 100644 index 000000000..baf5114c6 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/megaphone/ShowForDurationSchedule.java @@ -0,0 +1,25 @@ +package org.thoughtcrime.securesms.megaphone; + +import java.util.concurrent.TimeUnit; + +/** + * Megaphone schedule that will always show for some duration after the first + * time the user sees it. + */ +public class ShowForDurationSchedule implements MegaphoneSchedule { + + private final long duration; + + public static MegaphoneSchedule showForDays(int days) { + return new ShowForDurationSchedule(TimeUnit.DAYS.toMillis(days)); + } + + public ShowForDurationSchedule(long duration) { + this.duration = duration; + } + + @Override + public boolean shouldDisplay(int seenCount, long lastSeen, long firstVisible, long currentTime) { + return firstVisible == 0 || currentTime < firstVisible + duration; + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/BucketingUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/BucketingUtil.java new file mode 100644 index 000000000..661d502a8 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/util/BucketingUtil.java @@ -0,0 +1,49 @@ +package org.thoughtcrime.securesms.util; + +import androidx.annotation.NonNull; + +import org.thoughtcrime.securesms.recipients.Recipient; + +import java.math.BigInteger; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.Arrays; +import java.util.UUID; + +/** + * Logic to bucket a user for a given feature flag based on their UUID. + */ +public final class BucketingUtil { + + private BucketingUtil() {} + + /** + * Calculate a user bucket for a given feature flag, uuid, and part per modulus. + * + * @param key Feature flag key (e.g., "research.megaphone.1") + * @param uuid Current user's UUID (see {@link Recipient#getUuid()}) + * @param modulus Drives the bucketing parts per N (e.g., passing 1,000,000 indicates bucketing into parts per million) + */ + public static long bucket(@NonNull String key, @NonNull UUID uuid, long modulus) { + MessageDigest digest; + try { + digest = MessageDigest.getInstance("SHA-256"); + } catch (NoSuchAlgorithmException e) { + throw new AssertionError(e); + } + + digest.update(key.getBytes()); + digest.update(".".getBytes()); + + ByteBuffer byteBuffer = ByteBuffer.wrap(new byte[16]); + byteBuffer.order(ByteOrder.BIG_ENDIAN); + byteBuffer.putLong(uuid.getMostSignificantBits()); + byteBuffer.putLong(uuid.getLeastSignificantBits()); + + digest.update(byteBuffer.array()); + + return new BigInteger(Arrays.copyOfRange(digest.digest(), 0, 8)).mod(BigInteger.valueOf(modulus)).longValue(); + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/FeatureFlags.java b/app/src/main/java/org/thoughtcrime/securesms/util/FeatureFlags.java index 7fd824a72..0103cf224 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/FeatureFlags.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/FeatureFlags.java @@ -7,6 +7,9 @@ import androidx.annotation.VisibleForTesting; import com.annimon.stream.Stream; import com.google.android.collect.Sets; +import com.google.i18n.phonenumbers.NumberParseException; +import com.google.i18n.phonenumbers.PhoneNumberUtil; +import com.google.i18n.phonenumbers.Phonenumber; import org.json.JSONException; import org.json.JSONObject; @@ -17,7 +20,10 @@ import org.thoughtcrime.securesms.jobs.RefreshOwnProfileJob; import org.thoughtcrime.securesms.jobs.RemoteConfigRefreshJob; import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.logging.Log; +import org.thoughtcrime.securesms.recipients.Recipient; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; @@ -65,6 +71,7 @@ public final class FeatureFlags { private static final String VERIFY_V2 = "android.verifyV2"; private static final String PHONE_NUMBER_PRIVACY_VERSION = "android.phoneNumberPrivacyVersion"; private static final String CLIENT_EXPIRATION = "android.clientExpiration"; + public static final String RESEARCH_MEGAPHONE_1 = "research.megaphone.1"; /** * We will only store remote values for flags in this set. If you want a flag to be controllable @@ -83,7 +90,8 @@ public final class FeatureFlags { USERNAMES, MENTIONS, VERIFY_V2, - CLIENT_EXPIRATION + CLIENT_EXPIRATION, + RESEARCH_MEGAPHONE_1 ); /** @@ -283,6 +291,11 @@ public final class FeatureFlags { return getString(CLIENT_EXPIRATION, null); } + /** The raw research megaphone CSV string */ + public static String researchMegaphone() { + return getString(RESEARCH_MEGAPHONE_1, ""); + } + /** * Whether the user can choose phone number privacy settings, and; * Whether to fetch and store the secondary certificate diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/ResearchMegaphone.java b/app/src/main/java/org/thoughtcrime/securesms/util/ResearchMegaphone.java new file mode 100644 index 000000000..ac071918c --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/util/ResearchMegaphone.java @@ -0,0 +1,73 @@ +package org.thoughtcrime.securesms.util; + +import androidx.annotation.NonNull; +import androidx.annotation.VisibleForTesting; + +import com.google.i18n.phonenumbers.NumberParseException; +import com.google.i18n.phonenumbers.PhoneNumberUtil; + +import org.thoughtcrime.securesms.logging.Log; +import org.thoughtcrime.securesms.recipients.Recipient; + +import java.util.HashMap; +import java.util.Map; + +/** + * Parses a comma-separated list of country codes colon-separated from how many buckets out of 1 million + * should be enabled to see this megaphone in that country code. At the end of the list, an optional + * element saying how many buckets out of a million should be enabled for all countries not listed previously + * in the list. For example, "1:20000,*:40000" would mean 2% of the NANPA phone numbers and 4% of the rest of + * the world should see the megaphone. + */ +public final class ResearchMegaphone { + + private static final String TAG = Log.tag(ResearchMegaphone.class); + + private static final String COUNTRY_WILDCARD = "*"; + + /** + * In research megaphone group for given country code + */ + public static boolean isInResearchMegaphone() { + Map countryCountEnabled = parseCountryCounts(FeatureFlags.researchMegaphone()); + Recipient self = Recipient.self(); + + if (countryCountEnabled.isEmpty() || !self.getE164().isPresent() || !self.getUuid().isPresent()) { + return false; + } + + long countEnabled = determineCountEnabled(countryCountEnabled, self.getE164().or("")); + long currentUserBucket = BucketingUtil.bucket(FeatureFlags.RESEARCH_MEGAPHONE_1, self.requireUuid(), 1_000_000); + + return countEnabled > currentUserBucket; + } + + @VisibleForTesting + static @NonNull Map parseCountryCounts(@NonNull String buckets) { + Map countryCountEnabled = new HashMap<>(); + + for (String bucket : buckets.split(",")) { + String[] parts = bucket.split(":"); + if (parts.length == 2 && !parts[0].isEmpty()) { + countryCountEnabled.put(parts[0], Util.parseInt(parts[1], 0)); + } + } + return countryCountEnabled; + } + + @VisibleForTesting + static long determineCountEnabled(@NonNull Map countryCountEnabled, @NonNull String e164) { + Integer countEnabled = countryCountEnabled.get(COUNTRY_WILDCARD); + try { + String countryCode = String.valueOf(PhoneNumberUtil.getInstance().parse(e164, "").getCountryCode()); + if (countryCountEnabled.containsKey(countryCode)) { + countEnabled = countryCountEnabled.get(countryCode); + } + } catch (NumberParseException e) { + Log.d(TAG, "Unable to determine country code for bucketing."); + return 0; + } + + return countEnabled != null ? countEnabled : 0; + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/Util.java b/app/src/main/java/org/thoughtcrime/securesms/util/Util.java index cec591636..86b0b444d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/Util.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/Util.java @@ -664,6 +664,14 @@ public class Util { } } + public static int parseInt(String integer, int defaultValue) { + try { + return Integer.parseInt(integer); + } catch (NumberFormatException e) { + return defaultValue; + } + } + /** * Appends the stack trace of the provided throwable onto the provided primary exception. This is * useful for when exceptions are thrown inside of asynchronous systems (like runnables in an diff --git a/app/src/main/res/drawable-hdpi/signal_research.webp b/app/src/main/res/drawable-hdpi/signal_research.webp new file mode 100644 index 0000000000000000000000000000000000000000..6a0648ac6d3a22528ff49138d1dbaf87d16a9647 GIT binary patch literal 8870 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 G75^V#URY58 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/signal_research.webp b/app/src/main/res/drawable-mdpi/signal_research.webp new file mode 100644 index 0000000000000000000000000000000000000000..f0b6a30dba623a65f0d63a24a8cea87e08824931 GIT binary patch literal 5482 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/signal_research.webp b/app/src/main/res/drawable-xhdpi/signal_research.webp new file mode 100644 index 0000000000000000000000000000000000000000..797342d232b5c134eb60294ef6c33782e9d1d601 GIT binary patch literal 12690 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/signal_research.webp b/app/src/main/res/drawable-xxhdpi/signal_research.webp new file mode 100644 index 0000000000000000000000000000000000000000..319a3d14cfe13ff557f855cf23cc18419fbf1300 GIT binary patch literal 21098 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/signal_research.webp b/app/src/main/res/drawable-xxxhdpi/signal_research.webp new file mode 100644 index 0000000000000000000000000000000000000000..6dadb13ff9adee9724e8396881ce7bf7899d9b43 GIT binary patch literal 29866 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 + + + + + + + + + + diff --git a/app/src/main/res/layout/basic_megaphone_view.xml b/app/src/main/res/layout/basic_megaphone_view.xml index d9d535c47..2d5b86f60 100644 --- a/app/src/main/res/layout/basic_megaphone_view.xml +++ b/app/src/main/res/layout/basic_megaphone_view.xml @@ -23,7 +23,7 @@ android:scaleType="centerInside" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" - tools:src="@drawable/profile_splash"/> + tools:src="@tools:sample/avatars"/>