From 96ce42ae91517cfffafbde301db6cb111b3d368f Mon Sep 17 00:00:00 2001 From: Alan Evans Date: Tue, 21 Jul 2020 06:05:16 -0300 Subject: [PATCH] Legacy group learn more badge and info bottom sheet. --- .../ui/managegroup/ManageGroupFragment.java | 8 ++ .../ui/managegroup/ManageGroupViewModel.java | 17 ++- ...upsLearnMoreBottomSheetDialogFragment.java | 47 +++++++ .../RecipientBottomSheetDialogFragment.java | 10 +- .../securesms/util/BottomSheetUtil.java | 27 ++++ .../res/drawable/round_background_dark.xml | 5 + .../res/drawable/round_background_light.xml | 5 + .../main/res/layout/group_manage_fragment.xml | 19 +++ .../layout/groups_learn_more_bottom_sheet.xml | 119 ++++++++++++++++++ .../res/layout/recipient_bottom_sheet.xml | 2 +- app/src/main/res/values/attrs.xml | 1 + app/src/main/res/values/strings.xml | 11 ++ app/src/main/res/values/text_styles.xml | 4 + app/src/main/res/values/themes.xml | 10 +- 14 files changed, 273 insertions(+), 12 deletions(-) create mode 100644 app/src/main/java/org/thoughtcrime/securesms/groups/ui/managegroup/dialogs/GroupsLearnMoreBottomSheetDialogFragment.java create mode 100644 app/src/main/java/org/thoughtcrime/securesms/util/BottomSheetUtil.java create mode 100644 app/src/main/res/drawable/round_background_dark.xml create mode 100644 app/src/main/res/drawable/round_background_light.xml create mode 100644 app/src/main/res/layout/groups_learn_more_bottom_sheet.xml diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/managegroup/ManageGroupFragment.java b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/managegroup/ManageGroupFragment.java index 57a0feb7d0..923a87e44c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/managegroup/ManageGroupFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/managegroup/ManageGroupFragment.java @@ -39,6 +39,7 @@ import org.thoughtcrime.securesms.groups.ui.GroupMemberListView; import org.thoughtcrime.securesms.groups.ui.LeaveGroupDialog; import org.thoughtcrime.securesms.groups.ui.managegroup.dialogs.GroupInviteSentDialog; import org.thoughtcrime.securesms.groups.ui.managegroup.dialogs.GroupRightsDialog; +import org.thoughtcrime.securesms.groups.ui.managegroup.dialogs.GroupsLearnMoreBottomSheetDialogFragment; import org.thoughtcrime.securesms.groups.ui.pendingmemberinvites.PendingMemberInvitesActivity; import org.thoughtcrime.securesms.logging.Log; import org.thoughtcrime.securesms.mediaoverview.MediaOverviewActivity; @@ -51,6 +52,7 @@ import org.thoughtcrime.securesms.recipients.ui.bottomsheet.RecipientBottomSheet import org.thoughtcrime.securesms.recipients.ui.notifications.CustomNotificationsDialogFragment; import org.thoughtcrime.securesms.util.DateUtils; import org.thoughtcrime.securesms.util.LifecycleCursorWrapper; +import org.thoughtcrime.securesms.util.views.LearnMoreTextView; import java.util.List; import java.util.Locale; @@ -70,6 +72,7 @@ public class ManageGroupFragment extends LoggingFragment { private TextView pendingMembersCount; private Toolbar toolbar; private TextView groupName; + private LearnMoreTextView groupV1Indicator; private TextView memberCountUnderAvatar; private TextView memberCountAboveList; private AvatarImageView avatar; @@ -125,6 +128,7 @@ public class ManageGroupFragment extends LoggingFragment { avatar = view.findViewById(R.id.group_avatar); toolbar = view.findViewById(R.id.toolbar); groupName = view.findViewById(R.id.name); + groupV1Indicator = view.findViewById(R.id.manage_group_group_v1_indicator); memberCountUnderAvatar = view.findViewById(R.id.member_count); memberCountAboveList = view.findViewById(R.id.member_count_2); groupMemberList = view.findViewById(R.id.group_members); @@ -154,6 +158,9 @@ public class ManageGroupFragment extends LoggingFragment { customNotificationsRow = view.findViewById(R.id.group_custom_notifications_row); toggleAllMembers = view.findViewById(R.id.toggle_all_members); + groupV1Indicator.setOnLinkClickListener(v -> GroupsLearnMoreBottomSheetDialogFragment.show(requireFragmentManager())); + groupV1Indicator.setLearnMoreVisible(true); + return view; } @@ -208,6 +215,7 @@ public class ManageGroupFragment extends LoggingFragment { viewModel.getTitle().observe(getViewLifecycleOwner(), groupName::setText); viewModel.getMemberCountSummary().observe(getViewLifecycleOwner(), memberCountUnderAvatar::setText); + viewModel.getShowLegacyIndicator().observe(getViewLifecycleOwner(), showLegacyIndicators -> groupV1Indicator.setVisibility(showLegacyIndicators ? View.VISIBLE : View.GONE)); viewModel.getFullMemberCountSummary().observe(getViewLifecycleOwner(), memberCountAboveList::setText); viewModel.getGroupRecipient().observe(getViewLifecycleOwner(), groupRecipient -> { avatar.setRecipient(groupRecipient); diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/managegroup/ManageGroupViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/managegroup/ManageGroupViewModel.java index c0e1b0aade..1c7610d736 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/managegroup/ManageGroupViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/managegroup/ManageGroupViewModel.java @@ -37,6 +37,7 @@ import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.recipients.RecipientUtil; import org.thoughtcrime.securesms.util.DefaultValueLiveData; import org.thoughtcrime.securesms.util.ExpirationUtil; +import org.thoughtcrime.securesms.util.FeatureFlags; import org.thoughtcrime.securesms.util.SingleLiveEvent; import org.thoughtcrime.securesms.util.Util; import org.thoughtcrime.securesms.util.livedata.LiveDataUtil; @@ -72,6 +73,7 @@ public class ManageGroupViewModel extends ViewModel { private final DefaultValueLiveData memberListCollapseState = new DefaultValueLiveData<>(CollapseState.COLLAPSED); private final LiveData canLeaveGroup; private final LiveData canBlockGroup; + private final LiveData showLegacyIndicator; private ManageGroupViewModel(@NonNull Context context, @NonNull ManageGroupRepository manageGroupRepository) { this.context = context; @@ -79,7 +81,8 @@ public class ManageGroupViewModel extends ViewModel { manageGroupRepository.getGroupState(this::groupStateLoaded); - LiveGroup liveGroup = new LiveGroup(manageGroupRepository.getGroupId()); + GroupId groupId = manageGroupRepository.getGroupId(); + LiveGroup liveGroup = new LiveGroup(groupId); this.title = Transformations.map(liveGroup.getTitle(), title -> TextUtils.isEmpty(title) ? context.getString(R.string.Recipient_unknown) @@ -92,7 +95,11 @@ public class ManageGroupViewModel extends ViewModel { memberListCollapseState, ManageGroupViewModel::filterMemberList); this.pendingMemberCount = liveGroup.getPendingMemberCount(); - this.memberCountSummary = liveGroup.getMembershipCountDescription(context.getResources()); + this.showLegacyIndicator = new MutableLiveData<>(groupId.isV1() && FeatureFlags.groupsV2create()); + this.memberCountSummary = LiveDataUtil.combineLatest(liveGroup.getMembershipCountDescription(context.getResources()), + this.showLegacyIndicator, + (description, legacy) -> legacy ? String.format("%s · %s", description, context.getString(R.string.ManageGroupActivity_legacy_group)) + : description); this.fullMemberCountSummary = liveGroup.getFullMembershipCountDescription(context.getResources()); this.editMembershipRights = liveGroup.getMembershipAdditionAccessControl(); this.editGroupAttributesRights = liveGroup.getAttributesAccessControl(); @@ -131,7 +138,11 @@ public class ManageGroupViewModel extends ViewModel { return fullMemberCountSummary; } - public LiveData getGroupRecipient() { + LiveData getShowLegacyIndicator() { + return showLegacyIndicator; + } + + LiveData getGroupRecipient() { return groupRecipient; } diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/managegroup/dialogs/GroupsLearnMoreBottomSheetDialogFragment.java b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/managegroup/dialogs/GroupsLearnMoreBottomSheetDialogFragment.java new file mode 100644 index 0000000000..6dee7385a5 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/managegroup/dialogs/GroupsLearnMoreBottomSheetDialogFragment.java @@ -0,0 +1,47 @@ +package org.thoughtcrime.securesms.groups.ui.managegroup.dialogs; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.DialogFragment; +import androidx.fragment.app.FragmentManager; + +import com.google.android.material.bottomsheet.BottomSheetDialogFragment; + +import org.thoughtcrime.securesms.R; +import org.thoughtcrime.securesms.util.BottomSheetUtil; +import org.thoughtcrime.securesms.util.ThemeUtil; + +public final class GroupsLearnMoreBottomSheetDialogFragment extends BottomSheetDialogFragment { + + public static void show(@NonNull FragmentManager manager) { + new GroupsLearnMoreBottomSheetDialogFragment().show(manager, BottomSheetUtil.STANDARD_BOTTOM_SHEET_FRAGMENT_TAG); + } + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + setStyle(DialogFragment.STYLE_NORMAL, + ThemeUtil.isDarkTheme(requireContext()) ? R.style.Theme_Signal_RoundedBottomSheet + : R.style.Theme_Signal_RoundedBottomSheet_Light); + + super.onCreate(savedInstanceState); + } + + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.groups_learn_more_bottom_sheet, container, false); + + view.findViewById(R.id.lbs_ok_button).setOnClickListener(v -> dismiss()); + + return view; + } + + @Override + public void show(@NonNull FragmentManager manager, @Nullable String tag) { + BottomSheetUtil.show(manager, tag, this); + } +} 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 368f119f06..8188da50d0 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 @@ -19,7 +19,6 @@ import androidx.core.content.ContextCompat; import androidx.core.widget.TextViewCompat; import androidx.fragment.app.DialogFragment; import androidx.fragment.app.FragmentManager; -import androidx.fragment.app.FragmentTransaction; import androidx.lifecycle.ViewModelProviders; import com.google.android.material.bottomsheet.BottomSheetDialogFragment; @@ -32,6 +31,7 @@ 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.BottomSheetUtil; import org.thoughtcrime.securesms.util.ServiceUtil; import org.thoughtcrime.securesms.util.ThemeUtil; import org.thoughtcrime.securesms.util.Util; @@ -88,8 +88,8 @@ public final class RecipientBottomSheetDialogFragment extends BottomSheetDialogF @Override public void onCreate(@Nullable Bundle savedInstanceState) { setStyle(DialogFragment.STYLE_NORMAL, - ThemeUtil.isDarkTheme(requireContext()) ? R.style.Theme_Signal_RecipientBottomSheet - : R.style.Theme_Signal_RecipientBottomSheet_Light); + ThemeUtil.isDarkTheme(requireContext()) ? R.style.Theme_Signal_RoundedBottomSheet + : R.style.Theme_Signal_RoundedBottomSheet_Light); super.onCreate(savedInstanceState); } @@ -256,8 +256,6 @@ public final class RecipientBottomSheetDialogFragment extends BottomSheetDialogF @Override public void show(@NonNull FragmentManager manager, @Nullable String tag) { - FragmentTransaction transaction = manager.beginTransaction(); - transaction.add(this, tag); - transaction.commitAllowingStateLoss(); + BottomSheetUtil.show(manager, tag, this); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/BottomSheetUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/BottomSheetUtil.java new file mode 100644 index 0000000000..ee37b334f7 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/util/BottomSheetUtil.java @@ -0,0 +1,27 @@ +package org.thoughtcrime.securesms.util; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentTransaction; + +import com.google.android.material.bottomsheet.BottomSheetDialogFragment; + +public final class BottomSheetUtil { + + public static final String STANDARD_BOTTOM_SHEET_FRAGMENT_TAG = "BOTTOM"; + + private BottomSheetUtil() {} + + /** + * Show preventing a possible IllegalStateException. + */ + public static void show(@NonNull FragmentManager manager, + @Nullable String tag, + @NonNull BottomSheetDialogFragment dialog) + { + FragmentTransaction transaction = manager.beginTransaction(); + transaction.add(dialog, tag); + transaction.commitAllowingStateLoss(); + } +} diff --git a/app/src/main/res/drawable/round_background_dark.xml b/app/src/main/res/drawable/round_background_dark.xml new file mode 100644 index 0000000000..4dc33b3c13 --- /dev/null +++ b/app/src/main/res/drawable/round_background_dark.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/round_background_light.xml b/app/src/main/res/drawable/round_background_light.xml new file mode 100644 index 0000000000..da9df74bdc --- /dev/null +++ b/app/src/main/res/drawable/round_background_light.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/group_manage_fragment.xml b/app/src/main/res/layout/group_manage_fragment.xml index 8b5b25e237..aac685ba24 100644 --- a/app/src/main/res/layout/group_manage_fragment.xml +++ b/app/src/main/res/layout/group_manage_fragment.xml @@ -53,6 +53,25 @@ android:textAppearance="@style/Signal.Text.Body" android:textColor="?title_text_color_secondary" tools:text="12 members (4 invited)" /> + + + + + + + + + + + + + + + + + +