kopia lustrzana https://github.com/ryukoposting/Signal-Android
Guard first time on add to my story.
rodzic
945c308cf5
commit
7edef20f4f
|
@ -35,8 +35,10 @@ import org.thoughtcrime.securesms.sharing.ShareSelectionAdapter
|
|||
import org.thoughtcrime.securesms.sharing.ShareSelectionMappingModel
|
||||
import org.thoughtcrime.securesms.stories.Stories
|
||||
import org.thoughtcrime.securesms.stories.Stories.getHeaderAction
|
||||
import org.thoughtcrime.securesms.stories.dialogs.StoryDialogs
|
||||
import org.thoughtcrime.securesms.stories.settings.create.CreateStoryFlowDialogFragment
|
||||
import org.thoughtcrime.securesms.stories.settings.create.CreateStoryWithViewersFragment
|
||||
import org.thoughtcrime.securesms.stories.settings.hide.HideStoryFromDialogFragment
|
||||
import org.thoughtcrime.securesms.util.BottomSheetUtil
|
||||
import org.thoughtcrime.securesms.util.FeatureFlags
|
||||
import org.thoughtcrime.securesms.util.LifecycleDisposable
|
||||
|
@ -105,7 +107,21 @@ class MultiselectForwardFragment :
|
|||
|
||||
sendButton.setOnClickListener {
|
||||
sendButton.isEnabled = false
|
||||
viewModel.send(addMessage.text.toString(), contactSearchMediator.getSelectedContacts())
|
||||
|
||||
StoryDialogs.guardWithAddToYourStoryDialog(
|
||||
requireContext(),
|
||||
contactSearchMediator.getSelectedContacts(),
|
||||
onAddToStory = {
|
||||
performSend()
|
||||
},
|
||||
onEditViewers = {
|
||||
sendButton.isEnabled = true
|
||||
HideStoryFromDialogFragment().show(childFragmentManager, null)
|
||||
},
|
||||
onCancel = {
|
||||
sendButton.isEnabled = true
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
shareSelectionRecycler.adapter = shareSelectionAdapter
|
||||
|
@ -211,6 +227,10 @@ class MultiselectForwardFragment :
|
|||
.show()
|
||||
}
|
||||
|
||||
private fun performSend() {
|
||||
viewModel.send(addMessage.text.toString(), contactSearchMediator.getSelectedContacts())
|
||||
}
|
||||
|
||||
private fun displaySafetyNumberConfirmation(identityRecords: List<IdentityRecord>) {
|
||||
SafetyNumberChangeDialog.show(childFragmentManager, identityRecords)
|
||||
}
|
||||
|
|
|
@ -24,5 +24,5 @@ internal class StoryValues(store: KeyValueStore) : SignalStoreValues(store) {
|
|||
|
||||
var lastFontVersionCheck: Long by longValue(LAST_FONT_VERSION_CHECK, 0)
|
||||
|
||||
var userHasAddedToAStory: Boolean by booleanValue(USER_HAS_ADDED_TO_A_STORY, false)
|
||||
var userHasBeenNotifiedAboutStories: Boolean by booleanValue(USER_HAS_ADDED_TO_A_STORY, false)
|
||||
}
|
||||
|
|
|
@ -46,7 +46,7 @@ class TextStoryPostSendFragment : Fragment(R.layout.stories_send_text_post_fragm
|
|||
|
||||
private val viewModel: TextStoryPostSendViewModel by viewModels(
|
||||
factoryProducer = {
|
||||
TextStoryPostSendViewModel.Factory(TextStoryPostSendRepository(requireContext()))
|
||||
TextStoryPostSendViewModel.Factory(TextStoryPostSendRepository())
|
||||
}
|
||||
)
|
||||
|
||||
|
@ -83,21 +83,19 @@ class TextStoryPostSendFragment : Fragment(R.layout.stories_send_text_post_fragm
|
|||
}
|
||||
|
||||
shareConfirmButton.setOnClickListener {
|
||||
if (viewModel.isFirstSendToAStory(contactSearchMediator.getSelectedContacts())) {
|
||||
StoryDialogs.guardWithAddToYourStoryDialog(
|
||||
context = requireContext(),
|
||||
onAddToStory = { send() },
|
||||
onEditViewers = {
|
||||
viewModel.onSendCancelled()
|
||||
HideStoryFromDialogFragment().show(childFragmentManager, null)
|
||||
},
|
||||
onCancel = {
|
||||
viewModel.onSendCancelled()
|
||||
}
|
||||
)
|
||||
} else {
|
||||
send()
|
||||
}
|
||||
viewModel.onSending()
|
||||
StoryDialogs.guardWithAddToYourStoryDialog(
|
||||
contacts = contactSearchMediator.getSelectedContacts(),
|
||||
context = requireContext(),
|
||||
onAddToStory = { send() },
|
||||
onEditViewers = {
|
||||
viewModel.onSendCancelled()
|
||||
HideStoryFromDialogFragment().show(childFragmentManager, null)
|
||||
},
|
||||
onCancel = {
|
||||
viewModel.onSendCancelled()
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
disposables += viewModel.untrustedIdentities.subscribe {
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
package org.thoughtcrime.securesms.mediasend.v2.text.send
|
||||
|
||||
import android.content.Context
|
||||
import io.reactivex.rxjava3.core.Completable
|
||||
import io.reactivex.rxjava3.core.Single
|
||||
import org.signal.core.util.ThreadUtil
|
||||
|
@ -11,7 +10,6 @@ import org.thoughtcrime.securesms.database.ThreadDatabase
|
|||
import org.thoughtcrime.securesms.database.model.StoryType
|
||||
import org.thoughtcrime.securesms.database.model.databaseprotos.StoryTextPost
|
||||
import org.thoughtcrime.securesms.fonts.TextFont
|
||||
import org.thoughtcrime.securesms.keyvalue.SignalStore
|
||||
import org.thoughtcrime.securesms.linkpreview.LinkPreview
|
||||
import org.thoughtcrime.securesms.mediasend.v2.UntrustedRecords
|
||||
import org.thoughtcrime.securesms.mediasend.v2.text.TextStoryPostCreationState
|
||||
|
@ -21,17 +19,7 @@ import org.thoughtcrime.securesms.recipients.Recipient
|
|||
import org.thoughtcrime.securesms.stories.Stories
|
||||
import org.thoughtcrime.securesms.util.Base64
|
||||
|
||||
class TextStoryPostSendRepository(context: Context) {
|
||||
|
||||
private val context = context.applicationContext
|
||||
|
||||
fun isFirstSendToStory(shareContacts: Set<ContactSearchKey>): Boolean {
|
||||
if (SignalStore.storyValues().userHasAddedToAStory) {
|
||||
return false
|
||||
}
|
||||
|
||||
return shareContacts.any { it is ContactSearchKey.Story }
|
||||
}
|
||||
class TextStoryPostSendRepository {
|
||||
|
||||
fun send(contactSearchKey: Set<ContactSearchKey>, textStoryPostCreationState: TextStoryPostCreationState, linkPreview: LinkPreview?): Single<TextStoryPostSendResult> {
|
||||
return UntrustedRecords
|
||||
|
|
|
@ -27,12 +27,10 @@ class TextStoryPostSendViewModel(private val repository: TextStoryPostSendReposi
|
|||
disposables.clear()
|
||||
}
|
||||
|
||||
fun isFirstSendToAStory(contactSearchKeys: Set<ContactSearchKey>): Boolean {
|
||||
fun onSending() {
|
||||
store.update {
|
||||
TextStoryPostSendState.SENDING
|
||||
}
|
||||
|
||||
return repository.isFirstSendToStory(contactSearchKeys)
|
||||
}
|
||||
|
||||
fun onSendCancelled() {
|
||||
|
|
|
@ -47,6 +47,7 @@ import org.thoughtcrime.securesms.PassphraseRequiredActivity;
|
|||
import org.thoughtcrime.securesms.R;
|
||||
import org.thoughtcrime.securesms.components.SearchToolbar;
|
||||
import org.thoughtcrime.securesms.contacts.ContactsCursorLoader.DisplayMode;
|
||||
import org.thoughtcrime.securesms.contacts.paged.ContactSearchKey;
|
||||
import org.thoughtcrime.securesms.conversation.ConversationIntents;
|
||||
import org.thoughtcrime.securesms.database.SignalDatabase;
|
||||
import org.thoughtcrime.securesms.database.ThreadDatabase;
|
||||
|
@ -56,6 +57,8 @@ import org.thoughtcrime.securesms.recipients.Recipient;
|
|||
import org.thoughtcrime.securesms.recipients.RecipientId;
|
||||
import org.thoughtcrime.securesms.sharing.interstitial.ShareInterstitialActivity;
|
||||
import org.thoughtcrime.securesms.stories.Stories;
|
||||
import org.thoughtcrime.securesms.stories.dialogs.StoryDialogs;
|
||||
import org.thoughtcrime.securesms.stories.settings.hide.HideStoryFromDialogFragment;
|
||||
import org.thoughtcrime.securesms.util.ConversationUtil;
|
||||
import org.thoughtcrime.securesms.util.DynamicLanguage;
|
||||
import org.thoughtcrime.securesms.util.DynamicNoActionBarTheme;
|
||||
|
@ -78,6 +81,7 @@ import java.util.concurrent.atomic.AtomicReference;
|
|||
|
||||
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
|
||||
import io.reactivex.rxjava3.schedulers.Schedulers;
|
||||
import kotlin.Unit;
|
||||
|
||||
/**
|
||||
* Entry point for sharing content into the app.
|
||||
|
@ -380,11 +384,30 @@ public class ShareActivity extends PassphraseRequiredActivity
|
|||
.commit();
|
||||
|
||||
shareConfirm.setOnClickListener(unused -> {
|
||||
shareConfirm.setEnabled(false);
|
||||
|
||||
Set<ShareContact> shareContacts = viewModel.getShareContacts();
|
||||
|
||||
if (shareContacts.isEmpty()) throw new AssertionError();
|
||||
else if (shareContacts.size() == 1) onConfirmSingleDestination(shareContacts.iterator().next());
|
||||
else onConfirmMultipleDestinations(shareContacts);
|
||||
StoryDialogs.INSTANCE.guardWithAddToYourStoryDialog(this,
|
||||
shareContacts.stream()
|
||||
.filter(contact -> contact.getRecipientId().isPresent())
|
||||
.map(contact -> Recipient.resolved(contact.getRecipientId().get()))
|
||||
.filter(Recipient::isMyStory)
|
||||
.map(myStory -> new ContactSearchKey.Story(myStory.getId()))
|
||||
.collect(java.util.stream.Collectors.toList()),
|
||||
() -> {
|
||||
performSend(shareContacts);
|
||||
return Unit.INSTANCE;
|
||||
},
|
||||
() -> {
|
||||
shareConfirm.setEnabled(true);
|
||||
new HideStoryFromDialogFragment().show(getSupportFragmentManager(), null);
|
||||
return Unit.INSTANCE;
|
||||
},
|
||||
() -> {
|
||||
shareConfirm.setEnabled(true);
|
||||
return Unit.INSTANCE;
|
||||
});
|
||||
});
|
||||
|
||||
viewModel.getSelectedContactModels().observe(this, models -> {
|
||||
|
@ -438,6 +461,12 @@ public class ShareActivity extends PassphraseRequiredActivity
|
|||
});
|
||||
}
|
||||
|
||||
private void performSend(Set<ShareContact> shareContacts) {
|
||||
if (shareContacts.isEmpty()) throw new AssertionError();
|
||||
else if (shareContacts.size() == 1) onConfirmSingleDestination(shareContacts.iterator().next());
|
||||
else onConfirmMultipleDestinations(shareContacts);
|
||||
}
|
||||
|
||||
private void initializeArgs() {
|
||||
this.args = ShareIntents.Args.from(getIntent());
|
||||
}
|
||||
|
|
|
@ -3,6 +3,9 @@ package org.thoughtcrime.securesms.stories.dialogs
|
|||
import android.content.Context
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import org.thoughtcrime.securesms.R
|
||||
import org.thoughtcrime.securesms.contacts.paged.ContactSearchKey
|
||||
import org.thoughtcrime.securesms.keyvalue.SignalStore
|
||||
import org.thoughtcrime.securesms.recipients.Recipient
|
||||
|
||||
object StoryDialogs {
|
||||
|
||||
|
@ -11,17 +14,33 @@ object StoryDialogs {
|
|||
*/
|
||||
fun guardWithAddToYourStoryDialog(
|
||||
context: Context,
|
||||
contacts: Collection<ContactSearchKey>,
|
||||
onAddToStory: () -> Unit,
|
||||
onEditViewers: () -> Unit,
|
||||
onCancel: () -> Unit = {}
|
||||
) {
|
||||
MaterialAlertDialogBuilder(context, R.style.Signal_ThemeOverlay_Dialog_Rounded)
|
||||
.setTitle(R.string.StoryDialogs__add_to_story_q)
|
||||
.setMessage(R.string.StoryDialogs__adding_content)
|
||||
.setPositiveButton(R.string.StoryDialogs__add_to_story) { _, _ -> onAddToStory.invoke() }
|
||||
.setNeutralButton(R.string.StoryDialogs__edit_viewers) { _, _ -> onEditViewers.invoke() }
|
||||
.setNegativeButton(android.R.string.cancel) { _, _ -> onCancel.invoke() }
|
||||
.setCancelable(false)
|
||||
.show()
|
||||
if (!isFirstSendToMyStory(contacts)) {
|
||||
onAddToStory()
|
||||
} else {
|
||||
SignalStore.storyValues().userHasBeenNotifiedAboutStories = true
|
||||
MaterialAlertDialogBuilder(context, R.style.Signal_ThemeOverlay_Dialog_Rounded)
|
||||
.setTitle(R.string.StoryDialogs__add_to_story_q)
|
||||
.setMessage(R.string.StoryDialogs__adding_content)
|
||||
.setPositiveButton(R.string.StoryDialogs__add_to_story) { _, _ ->
|
||||
onAddToStory.invoke()
|
||||
}
|
||||
.setNeutralButton(R.string.StoryDialogs__edit_viewers) { _, _ -> onEditViewers.invoke() }
|
||||
.setNegativeButton(android.R.string.cancel) { _, _ -> onCancel.invoke() }
|
||||
.setCancelable(false)
|
||||
.show()
|
||||
}
|
||||
}
|
||||
|
||||
private fun isFirstSendToMyStory(shareContacts: Collection<ContactSearchKey>): Boolean {
|
||||
if (SignalStore.storyValues().userHasBeenNotifiedAboutStories) {
|
||||
return false
|
||||
}
|
||||
|
||||
return shareContacts.any { it is ContactSearchKey.Story && Recipient.resolved(it.recipientId).isMyStory }
|
||||
}
|
||||
}
|
||||
|
|
Ładowanie…
Reference in New Issue