diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt index 58618e9558..59d5fdb170 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt @@ -280,6 +280,7 @@ import org.thoughtcrime.securesms.util.BottomSheetUtil import org.thoughtcrime.securesms.util.BubbleUtil import org.thoughtcrime.securesms.util.CommunicationActions import org.thoughtcrime.securesms.util.ContextUtil +import org.thoughtcrime.securesms.util.ConversationUtil import org.thoughtcrime.securesms.util.DateUtils import org.thoughtcrime.securesms.util.Debouncer import org.thoughtcrime.securesms.util.DeleteDialog @@ -602,6 +603,16 @@ class ConversationFragment : } viewModel.updateIdentityRecordsInBackground() + + if (args.isFirstTimeInSelfCreatedGroup) { + conversationGroupViewModel.checkJustSelfInGroup().subscribeBy( + onSuccess = { + GroupLinkInviteFriendsBottomSheetDialogFragment.show(childFragmentManager, it) + } + ).addTo(disposables) + } + + ConversationUtil.refreshRecipientShortcuts() } override fun onPause() { diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupViewModel.kt index 4682dbe272..376a9351e6 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupViewModel.kt @@ -3,11 +3,13 @@ package org.thoughtcrime.securesms.conversation.v2.groups import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers +import io.reactivex.rxjava3.core.Maybe import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.core.Single import io.reactivex.rxjava3.disposables.CompositeDisposable import io.reactivex.rxjava3.kotlin.addTo import io.reactivex.rxjava3.kotlin.plusAssign +import io.reactivex.rxjava3.schedulers.Schedulers import io.reactivex.rxjava3.subjects.BehaviorSubject import io.reactivex.rxjava3.subjects.Subject import org.signal.core.util.Result @@ -15,6 +17,7 @@ import org.signal.core.util.concurrent.subscribeWithSubject import org.thoughtcrime.securesms.conversation.v2.ConversationRecipientRepository import org.thoughtcrime.securesms.database.GroupTable import org.thoughtcrime.securesms.database.model.GroupRecord +import org.thoughtcrime.securesms.groups.GroupId import org.thoughtcrime.securesms.groups.ui.GroupChangeFailureReason import org.thoughtcrime.securesms.groups.v2.GroupBlockJoinRequestResult import org.thoughtcrime.securesms.groups.v2.GroupManagementRepository @@ -37,6 +40,8 @@ class ConversationGroupViewModel( private val _groupActiveState: Subject = BehaviorSubject.create() private val _memberLevel: BehaviorSubject = BehaviorSubject.create() + private var firstTimeInviteFriendsTriggered: Boolean = false + val groupRecordSnapshot: GroupRecord? get() = _groupRecord.value @@ -106,6 +111,27 @@ class ConversationGroupViewModel( .addTo(disposables) } + /** + * Emits the group id if we are the only member of the group. + */ + fun checkJustSelfInGroup(): Maybe { + if (firstTimeInviteFriendsTriggered) { + return Maybe.empty() + } + + firstTimeInviteFriendsTriggered = true + + return _groupRecord + .firstOrError() + .flatMapMaybe { groupRecord -> + groupManagementRepository.isJustSelf(groupRecord.id).flatMapMaybe { + if (it && groupRecord.id.isV2) Maybe.just(groupRecord.id.requireV2()) else Maybe.empty() + } + } + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + } + class Factory(private val threadId: Long, private val recipientRepository: ConversationRecipientRepository) : ViewModelProvider.Factory { override fun create(modelClass: Class): T { return modelClass.cast(ConversationGroupViewModel(threadId, recipientRepository = recipientRepository)) as T diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/v2/GroupManagementRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/groups/v2/GroupManagementRepository.kt index 44f09a9807..ba6fe6e1cc 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/v2/GroupManagementRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/v2/GroupManagementRepository.kt @@ -106,4 +106,10 @@ class GroupManagementRepository @JvmOverloads constructor(private val context: C SignalDatabase.groups.removeUnmigratedV1Members(groupId) }.subscribeOn(Schedulers.io()) } + + fun isJustSelf(groupId: GroupId): Single { + return Single.fromCallable { + SignalDatabase.groups.requireGroup(groupId).members == listOf(Recipient.self().id) + } + } }