diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/GroupDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/GroupDatabase.java index 82bca9494..172ab8f0f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/GroupDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/GroupDatabase.java @@ -251,6 +251,20 @@ public final class GroupDatabase extends Database { return new Reader(cursor); } + public int getActiveGroupCount() { + SQLiteDatabase db = databaseHelper.getReadableDatabase(); + String[] cols = { "COUNT(*)" }; + String query = ACTIVE + " = 1"; + + try (Cursor cursor = db.query(TABLE_NAME, cols, query, null, null, null, null)) { + if (cursor != null && cursor.moveToFirst()) { + return cursor.getInt(0); + } + } + + return 0; + } + @WorkerThread public @NonNull List getGroupMembers(@NonNull GroupId groupId, @NonNull MemberSet memberSet) { if (groupId.isV2()) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/bottomsheet/RecipientBottomSheetDialogFragment.java b/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/bottomsheet/RecipientBottomSheetDialogFragment.java index f922dd4d4..ddc0cbd92 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/bottomsheet/RecipientBottomSheetDialogFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/bottomsheet/RecipientBottomSheetDialogFragment.java @@ -29,7 +29,6 @@ import org.thoughtcrime.securesms.groups.GroupId; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientExporter; import org.thoughtcrime.securesms.recipients.RecipientId; -import org.thoughtcrime.securesms.util.CommunicationActions; import org.thoughtcrime.securesms.util.ServiceUtil; import org.thoughtcrime.securesms.util.ThemeUtil; import org.thoughtcrime.securesms.util.Util; @@ -179,9 +178,11 @@ public final class RecipientBottomSheetDialogFragment extends BottomSheetDialogF startActivityForResult(RecipientExporter.export(recipient).asAddContactIntent(), REQUEST_CODE_ADD_CONTACT); }); } + }); + viewModel.getCanAddToAGroup().observe(getViewLifecycleOwner(), canAdd -> { addToGroupButton.setText(groupId == null ? R.string.RecipientBottomSheet_add_to_a_group : R.string.RecipientBottomSheet_add_to_another_group); - addToGroupButton.setVisibility(recipient.isRegistered() && !recipient.isGroup() && !recipient.isLocalNumber() ? View.VISIBLE : View.GONE); + addToGroupButton.setVisibility(canAdd ? View.VISIBLE : View.GONE); }); viewModel.getAdminActionStatus().observe(getViewLifecycleOwner(), adminStatus -> { diff --git a/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/bottomsheet/RecipientDialogRepository.java b/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/bottomsheet/RecipientDialogRepository.java index 96377e0aa..f0e180a55 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/bottomsheet/RecipientDialogRepository.java +++ b/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/bottomsheet/RecipientDialogRepository.java @@ -135,6 +135,10 @@ final class RecipientDialogRepository { onComplete::accept); } + public void getActiveGroupCount(@NonNull Consumer onComplete) { + SignalExecutors.BOUNDED.execute(() -> onComplete.accept(DatabaseFactory.getGroupDatabase(context).getActiveGroupCount())); + } + interface RecipientCallback { void onRecipient(@NonNull Recipient recipient); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/bottomsheet/RecipientDialogViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/bottomsheet/RecipientDialogViewModel.java index 3b99be723..66a1e989e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/bottomsheet/RecipientDialogViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/bottomsheet/RecipientDialogViewModel.java @@ -40,6 +40,7 @@ final class RecipientDialogViewModel extends ViewModel { private final LiveData recipient; private final MutableLiveData identity; private final LiveData adminActionStatus; + private final LiveData canAddToAGroup; private final MutableLiveData adminActionBusy; private RecipientDialogViewModel(@NonNull Context context, @@ -73,12 +74,23 @@ final class RecipientDialogViewModel extends ViewModel { if (!isSelf) { recipientDialogRepository.getIdentity(identity::postValue); } + + MutableLiveData localGroupCount = new MutableLiveData<>(0); + + canAddToAGroup = LiveDataUtil.combineLatest(recipient, localGroupCount, + (r, count) -> count > 0 && r.isRegistered() && !r.isGroup() && !r.isLocalNumber()); + + recipientDialogRepository.getActiveGroupCount(localGroupCount::postValue); } LiveData getRecipient() { return recipient; } + public LiveData getCanAddToAGroup() { + return canAddToAGroup; + } + LiveData getAdminActionStatus() { return adminActionStatus; } diff --git a/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/managerecipient/ManageRecipientFragment.java b/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/managerecipient/ManageRecipientFragment.java index de04e33af..2d0135888 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/managerecipient/ManageRecipientFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/managerecipient/ManageRecipientFragment.java @@ -202,6 +202,7 @@ public class ManageRecipientFragment extends LoggingFragment { viewModel.getRecipient().observe(getViewLifecycleOwner(), this::presentRecipient); viewModel.getMediaCursor().observe(getViewLifecycleOwner(), this::presentMediaCursor); viewModel.getMuteState().observe(getViewLifecycleOwner(), this::presentMuteState); + viewModel.getCanAddToAGroup().observe(getViewLifecycleOwner(), canAdd -> addToAGroup.setVisibility(canAdd ? View.VISIBLE : View.GONE)); disappearingMessagesRow.setOnClickListener(v -> viewModel.handleExpirationSelection(requireContext())); block.setOnClickListener(v -> viewModel.onBlockClicked(requireActivity())); diff --git a/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/managerecipient/ManageRecipientRepository.java b/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/managerecipient/ManageRecipientRepository.java index 73fae6eff..fe0b4f6a4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/managerecipient/ManageRecipientRepository.java +++ b/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/managerecipient/ManageRecipientRepository.java @@ -105,4 +105,8 @@ final class ManageRecipientRepository { .sortBy(gr -> gr.getDisplayName(context)) .toList(); } + + void getActiveGroupCount(@NonNull Consumer onComplete) { + SignalExecutors.BOUNDED.execute(() -> onComplete.accept(DatabaseFactory.getGroupDatabase(context).getActiveGroupCount())); + } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/managerecipient/ManageRecipientViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/managerecipient/ManageRecipientViewModel.java index e91a31c99..5b228b6c9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/managerecipient/ManageRecipientViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/managerecipient/ManageRecipientViewModel.java @@ -58,6 +58,7 @@ public final class ManageRecipientViewModel extends ViewModel { private final LiveData canBlock; private final LiveData> visibleSharedGroups; private final LiveData sharedGroupsCountSummary; + private final LiveData canAddToAGroup; private ManageRecipientViewModel(@NonNull Context context, @NonNull ManageRecipientRepository manageRecipientRepository) { this.context = context; @@ -95,6 +96,13 @@ public final class ManageRecipientViewModel extends ViewModel { if (!isSelf) { manageRecipientRepository.getIdentity(identity::postValue); } + + MutableLiveData localGroupCount = new MutableLiveData<>(0); + + canAddToAGroup = LiveDataUtil.combineLatest(recipient, localGroupCount, + (r, count) -> count > 0 && r.isRegistered() && !r.isGroup() && !r.isLocalNumber()); + + manageRecipientRepository.getActiveGroupCount(localGroupCount::postValue); } private static @NonNull String getDisplayTitle(@NonNull Recipient recipient, @NonNull Context context) { @@ -132,6 +140,10 @@ public final class ManageRecipientViewModel extends ViewModel { return recipient; } + LiveData getCanAddToAGroup() { + return canAddToAGroup; + } + LiveData getMediaCursor() { return mediaCursor; }