diff --git a/res/values/strings.xml b/res/values/strings.xml
index 77c678e1d6..07ddf4f4a3 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -566,6 +566,7 @@
- You can\'t share more than %d items.
Select recipients
+ Tap here to make this message disappear after it is viewed.
All media
diff --git a/src/org/thoughtcrime/securesms/components/TooltipPopup.java b/src/org/thoughtcrime/securesms/components/TooltipPopup.java
index 1f7b532457..1a83dc6708 100644
--- a/src/org/thoughtcrime/securesms/components/TooltipPopup.java
+++ b/src/org/thoughtcrime/securesms/components/TooltipPopup.java
@@ -196,12 +196,12 @@ public class TooltipPopup extends PopupWindow {
this.anchor = anchor;
}
- public Builder setBackgroundTint(int color) {
+ public Builder setBackgroundTint(@ColorInt int color) {
this.backgroundTint = color;
return this;
}
- public Builder setTextColor(int color) {
+ public Builder setTextColor(@ColorInt int color) {
this.textColor = color;
return this;
}
diff --git a/src/org/thoughtcrime/securesms/mediasend/MediaSendActivity.java b/src/org/thoughtcrime/securesms/mediasend/MediaSendActivity.java
index 850831aff4..372744e71c 100644
--- a/src/org/thoughtcrime/securesms/mediasend/MediaSendActivity.java
+++ b/src/org/thoughtcrime/securesms/mediasend/MediaSendActivity.java
@@ -610,7 +610,7 @@ public class MediaSendActivity extends PassphraseRequiredActionBarActivity imple
countButton.setVisibility(View.GONE);
continueButton.setVisibility(View.VISIBLE);
- if (!TextSecurePreferences.hasSeendCameraFirstTooltip(this)) {
+ if (!TextSecurePreferences.hasSeenCameraFirstTooltip(this)) {
TooltipPopup.forTarget(continueButton)
.setText(R.string.MediaSendActivity_select_recipients)
.show(TooltipPopup.POSITION_ABOVE);
@@ -697,6 +697,17 @@ public class MediaSendActivity extends PassphraseRequiredActionBarActivity imple
break;
}
});
+
+ viewModel.getEvents().observe(this, event -> {
+ if (event == MediaSendViewModel.Event.VIEW_ONCE_TOOLTIP) {
+ TooltipPopup.forTarget(revealButton)
+ .setText(R.string.MediaSendActivity_tap_here_to_make_this_message_disappear_after_it_is_viewed)
+ .setBackgroundTint(getResources().getColor(R.color.core_blue))
+ .setTextColor(getResources().getColor(R.color.core_white))
+ .setOnDismissListener(() -> TextSecurePreferences.setHasSeenViewOnceTooltip(this, true))
+ .show(TooltipPopup.POSITION_ABOVE);
+ }
+ });
}
private void presentRecipient(@Nullable Recipient recipient) {
diff --git a/src/org/thoughtcrime/securesms/mediasend/MediaSendViewModel.java b/src/org/thoughtcrime/securesms/mediasend/MediaSendViewModel.java
index e3206efc63..968087e910 100644
--- a/src/org/thoughtcrime/securesms/mediasend/MediaSendViewModel.java
+++ b/src/org/thoughtcrime/securesms/mediasend/MediaSendViewModel.java
@@ -19,7 +19,6 @@ import org.thoughtcrime.securesms.logging.Log;
import org.thoughtcrime.securesms.mms.MediaConstraints;
import org.thoughtcrime.securesms.providers.BlobProvider;
import org.thoughtcrime.securesms.recipients.Recipient;
-import org.thoughtcrime.securesms.util.FeatureFlags;
import org.thoughtcrime.securesms.util.MediaUtil;
import org.thoughtcrime.securesms.util.SingleLiveEvent;
import org.thoughtcrime.securesms.util.TextSecurePreferences;
@@ -52,6 +51,7 @@ class MediaSendViewModel extends ViewModel {
private final MutableLiveData> folders;
private final MutableLiveData hudState;
private final SingleLiveEvent error;
+ private final SingleLiveEvent event;
private final Map savedDrawState;
private MediaConstraints mediaConstraints;
@@ -82,6 +82,7 @@ class MediaSendViewModel extends ViewModel {
this.folders = new MutableLiveData<>();
this.hudState = new MutableLiveData<>();
this.error = new SingleLiveEvent<>();
+ this.event = new SingleLiveEvent<>();
this.savedDrawState = new HashMap<>();
this.lastCameraCapture = Optional.absent();
this.body = "";
@@ -193,7 +194,8 @@ class MediaSendViewModel extends ViewModel {
buttonState = (recipient != null) ? ButtonState.SEND : ButtonState.CONTINUE;
if (viewOnceState == ViewOnceState.GONE && viewOnceSupported()) {
- viewOnceState = TextSecurePreferences.isRevealableMessageEnabled(application) ? ViewOnceState.ENABLED : ViewOnceState.DISABLED;
+ viewOnceState = TextSecurePreferences.isViewOnceMessageEnabled(application) ? ViewOnceState.ENABLED : ViewOnceState.DISABLED;
+ showViewOnceTooltipIfNecessary(viewOnceState);
} else if (!viewOnceSupported()) {
viewOnceState = ViewOnceState.GONE;
}
@@ -271,7 +273,7 @@ class MediaSendViewModel extends ViewModel {
selectedMedia.setValue(uncaptioned);
- TextSecurePreferences.setIsRevealableMessageEnabled(application, viewOnceState == ViewOnceState.ENABLED);
+ TextSecurePreferences.setIsViewOnceMessageEnabled(application, viewOnceState == ViewOnceState.ENABLED);
hudState.setValue(buildHudState());
}
@@ -445,6 +447,10 @@ class MediaSendViewModel extends ViewModel {
return error;
}
+ @NonNull LiveData getEvents() {
+ return event;
+ }
+
@NonNull LiveData getHudState() {
return hudState;
}
@@ -503,6 +509,12 @@ class MediaSendViewModel extends ViewModel {
return MediaUtil.isImageOrVideoType(media.get(0).getMimeType());
}
+ private void showViewOnceTooltipIfNecessary(@NonNull ViewOnceState viewOnceState) {
+ if (viewOnceState == ViewOnceState.DISABLED && !TextSecurePreferences.hasSeenViewOnceTooltip(application)) {
+ event.postValue(Event.VIEW_ONCE_TOOLTIP);
+ }
+ }
+
@Override
protected void onCleared() {
if (!sentMedia) {
@@ -514,6 +526,10 @@ class MediaSendViewModel extends ViewModel {
ITEM_TOO_LARGE, TOO_MANY_ITEMS, NO_ITEMS
}
+ enum Event {
+ VIEW_ONCE_TOOLTIP
+ }
+
enum Page {
CAMERA, ITEM_PICKER, FOLDER_PICKER, EDITOR, CONTACT_SELECT, UNKNOWN
}
diff --git a/src/org/thoughtcrime/securesms/util/TextSecurePreferences.java b/src/org/thoughtcrime/securesms/util/TextSecurePreferences.java
index bc210882c7..5f283ab344 100644
--- a/src/org/thoughtcrime/securesms/util/TextSecurePreferences.java
+++ b/src/org/thoughtcrime/securesms/util/TextSecurePreferences.java
@@ -13,6 +13,7 @@ import androidx.annotation.ArrayRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.app.NotificationCompat;
+import androidx.core.content.ContextCompat;
import org.greenrobot.eventbus.EventBus;
import org.thoughtcrime.securesms.R;
@@ -199,7 +200,8 @@ public class TextSecurePreferences {
private static final String MEDIA_KEYBOARD_MODE = "pref_media_keyboard_mode";
- private static final String VIEW_ONCE_DEFAULT = "pref_revealable_message_default";
+ private static final String VIEW_ONCE_DEFAULT = "pref_revealable_message_default";
+ private static final String VIEW_ONCE_TOOLTIP_SEEN = "pref_revealable_message_tooltip_seen";
private static final String SEEN_CAMERA_FIRST_TOOLTIP = "pref_seen_camera_first_tooltip";
@@ -1274,19 +1276,27 @@ public class TextSecurePreferences {
return MediaKeyboardMode.valueOf(name);
}
- public static void setIsRevealableMessageEnabled(Context context, boolean value) {
+ public static void setIsViewOnceMessageEnabled(Context context, boolean value) {
setBooleanPreference(context, VIEW_ONCE_DEFAULT, value);
}
- public static boolean isRevealableMessageEnabled(Context context) {
+ public static boolean isViewOnceMessageEnabled(Context context) {
return getBooleanPreference(context, VIEW_ONCE_DEFAULT, false);
}
+ public static void setHasSeenViewOnceTooltip(Context context, boolean value) {
+ setBooleanPreference(context, VIEW_ONCE_TOOLTIP_SEEN, value);
+ }
+
+ public static boolean hasSeenViewOnceTooltip(Context context) {
+ return getBooleanPreference(context, VIEW_ONCE_TOOLTIP_SEEN, false);
+ }
+
public static void setHasSeenCameraFirstTooltip(Context context, boolean value) {
setBooleanPreference(context, SEEN_CAMERA_FIRST_TOOLTIP, value);
}
- public static boolean hasSeendCameraFirstTooltip(Context context) {
+ public static boolean hasSeenCameraFirstTooltip(Context context) {
return getBooleanPreference(context, SEEN_CAMERA_FIRST_TOOLTIP, false);
}