Legacy group learn more badge and info bottom sheet.

master
Alan Evans 2020-07-21 06:05:16 -03:00 committed by GitHub
parent 93f587b851
commit 96ce42ae91
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
14 changed files with 273 additions and 12 deletions

View File

@ -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);

View File

@ -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<CollapseState> memberListCollapseState = new DefaultValueLiveData<>(CollapseState.COLLAPSED);
private final LiveData<Boolean> canLeaveGroup;
private final LiveData<Boolean> canBlockGroup;
private final LiveData<Boolean> 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<Recipient> getGroupRecipient() {
LiveData<Boolean> getShowLegacyIndicator() {
return showLegacyIndicator;
}
LiveData<Recipient> getGroupRecipient() {
return groupRecipient;
}

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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();
}
}

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="4dp" />
<solid android:color="@color/core_grey_90" />
</shape>

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="4dp" />
<solid android:color="@color/core_grey_02" />
</shape>

View File

@ -53,6 +53,25 @@
android:textAppearance="@style/Signal.Text.Body"
android:textColor="?title_text_color_secondary"
tools:text="12 members (4 invited)" />
<org.thoughtcrime.securesms.util.views.LearnMoreTextView
android:id="@+id/manage_group_group_v1_indicator"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="12dp"
android:layout_marginEnd="8dp"
android:background="?secondary_background_bubble"
android:paddingStart="12dp"
android:paddingTop="10dp"
android:paddingEnd="12dp"
android:paddingBottom="10dp"
android:text="@string/ManageGroupActivity_legacy_group_learn_more"
android:textAppearance="@style/TextAppearance.Signal.Caption"
android:textColor="?title_text_color_secondary"
android:visibility="gone"
tools:visibility="visible" />
</LinearLayout>
<androidx.appcompat.widget.Toolbar

View File

@ -0,0 +1,119 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:theme="@style/Theme.Signal.RoundedBottomSheet.Light">
<TextView
android:id="@+id/lbs_title"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:layout_marginTop="24dp"
android:layout_marginEnd="20dp"
android:text="@string/GroupsLearnMore_legacy_vs_new_groups"
android:textAppearance="@style/TextAppearance.Signal.Title2"
android:textColor="?title_text_color_primary"
app:layout_constraintBottom_toTopOf="@+id/lbs_paragraph_1_header"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/lbs_paragraph_1_header"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:layout_marginTop="24dp"
android:layout_marginEnd="20dp"
android:text="@string/GroupsLearnMore_what_are_legacy_groups"
android:textAppearance="@style/TextAppearance.Signal.Body2.Bold"
android:textColor="?title_text_color_primary"
app:layout_constraintBottom_toTopOf="@+id/lbs_paragraph_1"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/lbs_title" />
<TextView
android:id="@+id/lbs_paragraph_1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:layout_marginTop="4dp"
android:layout_marginEnd="20dp"
android:text="@string/GroupsLearnMore_paragraph_1"
android:textAppearance="@style/TextAppearance.Signal.Body2"
android:textColor="?title_text_color_secondary"
app:layout_constraintBottom_toTopOf="@+id/lbs_paragraph_2_header"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/lbs_paragraph_1_header" />
<TextView
android:id="@+id/lbs_paragraph_2_header"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:layout_marginTop="24dp"
android:layout_marginEnd="20dp"
android:text="@string/GroupsLearnMore_how_do_i_use_new_groups"
android:textAppearance="@style/TextAppearance.Signal.Body2.Bold"
android:textColor="?title_text_color_primary"
app:layout_constraintBottom_toTopOf="@+id/lbs_paragraph_2_a"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/lbs_paragraph_1" />
<TextView
android:id="@+id/lbs_paragraph_2_a"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:layout_marginTop="4dp"
android:layout_marginEnd="20dp"
android:text="@string/GroupsLearnMore_paragraph_2"
android:textAppearance="@style/TextAppearance.Signal.Body2"
android:textColor="?title_text_color_secondary"
app:layout_constraintBottom_toTopOf="@+id/lbs_paragraph_2_b"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/lbs_paragraph_2_header" />
<TextView
android:id="@+id/lbs_paragraph_2_b"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:layout_marginTop="20dp"
android:layout_marginEnd="20dp"
android:text="@string/GroupsLearnMore_paragraph_3"
android:textAppearance="@style/TextAppearance.Signal.Body2.Bold"
android:textColor="?title_text_color_secondary"
app:layout_constraintBottom_toTopOf="@+id/lbs_paragraph_1"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/lbs_paragraph_2_a" />
<Button
android:id="@+id/lbs_ok_button"
style="@style/Button.Primary"
android:layout_width="match_parent"
android:layout_height="64dp"
android:layout_marginStart="32dp"
android:layout_marginTop="48dp"
android:layout_marginEnd="32dp"
android:layout_marginBottom="20dp"
android:text="@android:string/ok"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@+id/lbs_paragraph_2_b"
app:layout_constraintVertical_bias="0" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -4,7 +4,7 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:theme="@style/Theme.Signal.RecipientBottomSheet.Light">
tools:theme="@style/Theme.Signal.RoundedBottomSheet.Light">
<org.thoughtcrime.securesms.components.AvatarImageView
android:id="@+id/rbs_recipient_avatar"

View File

@ -18,6 +18,7 @@
<attr name="attachment_keyboard_button_foreground" format="color" />
<attr name="secondary_background" format="reference" />
<attr name="secondary_background_bubble" format="reference" />
<attr name="conversation_list_item_background" format="reference"/>
<attr name="conversation_list_item_contact_color" format="reference|color"/>

View File

@ -557,6 +557,8 @@
<string name="ManageGroupActivity_failed_to_update_the_group_due_to_a_network_error_please_retry_later">Failed to update the group due to a network error, please retry later</string>
<string name="ManageGroupActivity_edit_name_and_picture">Edit name and picture</string>
<string name="ManageGroupActivity_legacy_group">Legacy Group</string>
<string name="ManageGroupActivity_legacy_group_learn_more">This is a Legacy Group. To access features like group admins, create a New Group.</string>
<string name="GroupManagement_choose_who_can_add_or_invite_new_members">Choose who can add or invite new members</string>
<string name="GroupManagement_choose_who_can_change_the_group_name_and_photo">Choose who can change the group name and photo</string>
@ -2427,6 +2429,15 @@
<string name="GroupRecipientListItem_admin">Admin</string>
<!-- GroupsLearnMoreBottomSheetDialogFragment -->
<string name="GroupsLearnMore_legacy_vs_new_groups">Legacy vs. New Groups</string>
<string name="GroupsLearnMore_what_are_legacy_groups">What are Legacy Groups?</string>
<string name="GroupsLearnMore_paragraph_1">Legacy Groups are groups that are not compatible with New Group features like admins and more descriptive group updates.</string>
<string name="GroupsLearnMore_how_do_i_use_new_groups">How do I use New Groups?</string>
<string name="GroupsLearnMore_paragraph_2">Legacy Groups cant be converted into New Groups, but you can create a New Group with the same members.</string>
<string name="GroupsLearnMore_paragraph_3">To create a New Group, all members should update to the latest version of Signal.</string>
<!-- EOF -->
</resources>

View File

@ -107,6 +107,10 @@
<item name="fontFamily">sans-serif</item>
</style>
<style name="TextAppearance.Signal.Body2.Bold">
<item name="android:textStyle">bold</item>
</style>
<style name="TextAppearance.Signal.Body1.Bold">
<item name="fontFamily">sans-serif-medium</item>
</style>

View File

@ -190,6 +190,7 @@
<item name="android:windowBackground">@color/white</item>
<item name="android:windowContentOverlay">@null</item>
<item name="secondary_background">@color/core_grey_02</item>
<item name="secondary_background_bubble">@drawable/round_background_light</item>
<item name="alertDialogTheme">@style/AppCompatAlertDialogStyleLight</item>
<item name="android:alertDialogTheme">@style/AppCompatDialogStyleLight</item>
<item name="homeAsUpIndicator">@drawable/ic_arrow_left_24</item>
@ -495,6 +496,7 @@
<item name="android:windowBackground">@color/core_grey_95</item>
<item name="android:windowContentOverlay">@null</item>
<item name="secondary_background">@color/core_grey_90</item>
<item name="secondary_background_bubble">@drawable/round_background_dark</item>
<item name="alertDialogTheme">@style/AppCompatAlertDialogStyleDark</item>
<item name="android:alertDialogTheme">@style/AppCompatDialogStyleDark</item>
<item name="homeAsUpIndicator">@drawable/ic_arrow_left_24</item>
@ -882,7 +884,7 @@
<item name="backgroundTint">@color/white</item>
</style>
<style name="Theme.Signal.RecipientBottomSheet.Light">
<style name="Theme.Signal.RoundedBottomSheet.Light">
<item name="bottomSheetStyle">@style/Widget.Signal.BottomSheet.Rounded.Light</item>
<item name="icon_tint">@color/core_grey_75</item>
@ -890,6 +892,8 @@
<item name="title_text_color_primary">@color/core_grey_90</item>
<item name="title_text_color_secondary">@color/core_grey_60</item>
<item name="colorAccent">@color/core_ultramarine</item>
<item name="android:navigationBarColor" tools:ignore="NewApi">@color/white</item>
<item name="android:windowLightNavigationBar" tools:ignore="NewApi">true</item>
@ -902,7 +906,7 @@
<item name="recipient_remove_icon">@drawable/ic_leave_tinted_24</item>
</style>
<style name="Theme.Signal.RecipientBottomSheet" parent="Theme.MaterialComponents.BottomSheetDialog">
<style name="Theme.Signal.RoundedBottomSheet" parent="Theme.MaterialComponents.BottomSheetDialog">
<item name="android:windowIsFloating">false</item>
<item name="bottomSheetStyle">@style/Widget.Signal.BottomSheet.Rounded</item>
<item name="icon_tint">@color/core_grey_15</item>
@ -911,6 +915,8 @@
<item name="title_text_color_primary">@color/core_grey_05</item>
<item name="title_text_color_secondary">@color/core_grey_25</item>
<item name="colorAccent">@color/core_ultramarine_light</item>
<item name="android:navigationBarColor" tools:ignore="NewApi">@color/core_grey_75</item>
<item name="android:windowLightNavigationBar" tools:ignore="NewApi">false</item>
<item name="android:statusBarColor" tools:ignore="NewApi">@color/transparent</item>