From 8e0fba79921a5edb4deada5d6b73e5d45051a5df Mon Sep 17 00:00:00 2001 From: Alan Evans Date: Fri, 24 Apr 2020 10:13:07 -0300 Subject: [PATCH] New group button behind new Group UI feature flag. --- .../ContactSelectionListFragment.java | 37 +++++++++++++++---- .../securesms/NewConversationActivity.java | 24 ++++-------- .../securesms/util/FeatureFlags.java | 5 +++ .../ic_group_outline_ultramarine_28.xml | 9 +++++ ...e_circle.xml => ic_invite_circle_dark.xml} | 4 +- .../res/drawable/ic_invite_circle_light.xml | 14 +++++++ ..._28dp.xml => ic_invite_ultramarine_28.xml} | 8 ++-- .../res/drawable/ic_new_group_circle_dark.xml | 14 +++++++ .../drawable/ic_new_group_circle_light.xml | 14 +++++++ .../contact_selection_invite_action_item.xml | 3 +- .../contact_selection_new_group_item.xml | 18 +++++++++ app/src/main/res/values/attrs.xml | 2 + app/src/main/res/values/strings.xml | 1 + app/src/main/res/values/themes.xml | 6 +++ 14 files changed, 128 insertions(+), 31 deletions(-) create mode 100644 app/src/main/res/drawable/ic_group_outline_ultramarine_28.xml rename app/src/main/res/drawable/{ic_invite_circle.xml => ic_invite_circle_dark.xml} (73%) create mode 100644 app/src/main/res/drawable/ic_invite_circle_light.xml rename app/src/main/res/drawable/{ic_invite_28dp.xml => ic_invite_ultramarine_28.xml} (84%) create mode 100644 app/src/main/res/drawable/ic_new_group_circle_dark.xml create mode 100644 app/src/main/res/drawable/ic_new_group_circle_light.xml create mode 100644 app/src/main/res/layout/contact_selection_new_group_item.xml diff --git a/app/src/main/java/org/thoughtcrime/securesms/ContactSelectionListFragment.java b/app/src/main/java/org/thoughtcrime/securesms/ContactSelectionListFragment.java index 5a8d597bd..c1229c576 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/ContactSelectionListFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/ContactSelectionListFragment.java @@ -55,6 +55,7 @@ import org.thoughtcrime.securesms.permissions.Permissions; import org.thoughtcrime.securesms.contacts.sync.DirectoryHelper; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; +import org.thoughtcrime.securesms.util.FeatureFlags; import org.thoughtcrime.securesms.util.StickyHeaderDecoration; import org.thoughtcrime.securesms.util.TextSecurePreferences; import org.thoughtcrime.securesms.util.UsernameUtil; @@ -100,15 +101,16 @@ public final class ContactSelectionListFragment extends Fragment private RecyclerViewFastScroller fastScroller; private ContactSelectionListAdapter cursorRecyclerViewAdapter; + @Nullable private FixedViewsAdapter headerAdapter; @Nullable private FixedViewsAdapter footerAdapter; - @Nullable private InviteCallback inviteCallback; + @Nullable private ListCallback listCallback; @Override public void onAttach(@NonNull Context context) { super.onAttach(context); - if (context instanceof InviteCallback) { - inviteCallback = (InviteCallback) context; + if (context instanceof ListCallback) { + listCallback = (ListCallback) context; } } @@ -192,9 +194,16 @@ public final class ContactSelectionListFragment extends Fragment RecyclerViewConcatenateAdapterStickyHeader concatenateAdapter = new RecyclerViewConcatenateAdapterStickyHeader(); + if (listCallback != null && FeatureFlags.newGroupUI()) { + headerAdapter = new FixedViewsAdapter(createNewGroupItem(listCallback)); + headerAdapter.hide(); + concatenateAdapter.addAdapter(headerAdapter); + } + concatenateAdapter.addAdapter(cursorRecyclerViewAdapter); - if (inviteCallback != null) { - footerAdapter = new FixedViewsAdapter(createInviteActionView(inviteCallback)); + + if (listCallback != null) { + footerAdapter = new FixedViewsAdapter(createInviteActionView(listCallback)); footerAdapter.hide(); concatenateAdapter.addAdapter(footerAdapter); } @@ -203,10 +212,17 @@ public final class ContactSelectionListFragment extends Fragment recyclerView.addItemDecoration(new StickyHeaderDecoration(concatenateAdapter, true, true)); } - private View createInviteActionView(@NonNull InviteCallback inviteCallback) { + private View createInviteActionView(@NonNull ListCallback listCallback) { View view = LayoutInflater.from(requireContext()) .inflate(R.layout.contact_selection_invite_action_item, (ViewGroup) requireView(), false); - view.setOnClickListener(v -> inviteCallback.onInvite()); + view.setOnClickListener(v -> listCallback.onInvite()); + return view; + } + + private View createNewGroupItem(@NonNull ListCallback listCallback) { + View view = LayoutInflater.from(requireContext()) + .inflate(R.layout.contact_selection_new_group_item, (ViewGroup) requireView(), false); + view.setOnClickListener(v -> listCallback.onNewGroup()); return view; } @@ -272,6 +288,10 @@ public final class ContactSelectionListFragment extends Fragment footerAdapter.show(); } + if (headerAdapter != null) { + headerAdapter.show(); + } + emptyText.setText(R.string.contact_selection_group_activity__no_contacts); boolean useFastScroller = data != null && data.getCount() > 20; recyclerView.setVerticalScrollBarEnabled(!useFastScroller); @@ -392,7 +412,8 @@ public final class ContactSelectionListFragment extends Fragment void onContactDeselected(Optional recipientId, String number); } - public interface InviteCallback { + public interface ListCallback { void onInvite(); + void onNewGroup(); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/NewConversationActivity.java b/app/src/main/java/org/thoughtcrime/securesms/NewConversationActivity.java index 0b135cf94..5e462bf7c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/NewConversationActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/NewConversationActivity.java @@ -22,29 +22,14 @@ import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; -import android.widget.Toast; import org.thoughtcrime.securesms.conversation.ConversationActivity; -import org.thoughtcrime.securesms.crypto.UnidentifiedAccessUtil; import org.thoughtcrime.securesms.database.DatabaseFactory; import org.thoughtcrime.securesms.database.ThreadDatabase; import org.thoughtcrime.securesms.logging.Log; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; import org.whispersystems.libsignal.util.guava.Optional; -import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; -import org.thoughtcrime.securesms.logging.Log; -import org.thoughtcrime.securesms.recipients.Recipient; -import org.thoughtcrime.securesms.util.FeatureFlags; -import org.thoughtcrime.securesms.util.UsernameUtil; -import org.thoughtcrime.securesms.util.concurrent.SignalExecutors; -import org.thoughtcrime.securesms.util.concurrent.SimpleTask; -import org.whispersystems.libsignal.util.guava.Optional; -import org.whispersystems.signalservice.api.profiles.SignalServiceProfile; -import org.whispersystems.signalservice.api.util.UuidUtil; - -import java.io.IOException; -import java.util.UUID; /** * Activity container for starting a new conversation. @@ -53,7 +38,7 @@ import java.util.UUID; * */ public class NewConversationActivity extends ContactSelectionActivity - implements ContactSelectionListFragment.InviteCallback + implements ContactSelectionListFragment.ListCallback { @SuppressWarnings("unused") @@ -131,5 +116,12 @@ public class NewConversationActivity extends ContactSelectionActivity @Override public void onInvite() { handleInvite(); + finish(); + } + + @Override + public void onNewGroup() { + handleCreateGroup(); + finish(); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/FeatureFlags.java b/app/src/main/java/org/thoughtcrime/securesms/util/FeatureFlags.java index ab455a366..3c524e91a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/FeatureFlags.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/FeatureFlags.java @@ -242,6 +242,11 @@ public final class FeatureFlags { return getValue(CALLING_PIP, false); } + /** New group UI elements. */ + public static boolean newGroupUI() { + return getValue(NEW_GROUP_UI, false); + } + /** Only for rendering debug info. */ public static synchronized @NonNull Map getMemoryValues() { return new TreeMap<>(REMOTE_VALUES); diff --git a/app/src/main/res/drawable/ic_group_outline_ultramarine_28.xml b/app/src/main/res/drawable/ic_group_outline_ultramarine_28.xml new file mode 100644 index 000000000..0b5cdec3d --- /dev/null +++ b/app/src/main/res/drawable/ic_group_outline_ultramarine_28.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_invite_circle.xml b/app/src/main/res/drawable/ic_invite_circle_dark.xml similarity index 73% rename from app/src/main/res/drawable/ic_invite_circle.xml rename to app/src/main/res/drawable/ic_invite_circle_dark.xml index bf11042bc..7ad05907a 100644 --- a/app/src/main/res/drawable/ic_invite_circle.xml +++ b/app/src/main/res/drawable/ic_invite_circle_dark.xml @@ -2,12 +2,12 @@ - + diff --git a/app/src/main/res/drawable/ic_invite_circle_light.xml b/app/src/main/res/drawable/ic_invite_circle_light.xml new file mode 100644 index 000000000..d29426cf9 --- /dev/null +++ b/app/src/main/res/drawable/ic_invite_circle_light.xml @@ -0,0 +1,14 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_invite_28dp.xml b/app/src/main/res/drawable/ic_invite_ultramarine_28.xml similarity index 84% rename from app/src/main/res/drawable/ic_invite_28dp.xml rename to app/src/main/res/drawable/ic_invite_ultramarine_28.xml index 267b9ead8..d37fce441 100644 --- a/app/src/main/res/drawable/ic_invite_28dp.xml +++ b/app/src/main/res/drawable/ic_invite_ultramarine_28.xml @@ -4,19 +4,19 @@ android:viewportWidth="28" android:viewportHeight="28"> diff --git a/app/src/main/res/drawable/ic_new_group_circle_dark.xml b/app/src/main/res/drawable/ic_new_group_circle_dark.xml new file mode 100644 index 000000000..e15266121 --- /dev/null +++ b/app/src/main/res/drawable/ic_new_group_circle_dark.xml @@ -0,0 +1,14 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_new_group_circle_light.xml b/app/src/main/res/drawable/ic_new_group_circle_light.xml new file mode 100644 index 000000000..a55c57956 --- /dev/null +++ b/app/src/main/res/drawable/ic_new_group_circle_light.xml @@ -0,0 +1,14 @@ + + + + + + + + + diff --git a/app/src/main/res/layout/contact_selection_invite_action_item.xml b/app/src/main/res/layout/contact_selection_invite_action_item.xml index e8cfd20df..2e4556930 100644 --- a/app/src/main/res/layout/contact_selection_invite_action_item.xml +++ b/app/src/main/res/layout/contact_selection_invite_action_item.xml @@ -1,10 +1,10 @@ diff --git a/app/src/main/res/layout/contact_selection_new_group_item.xml b/app/src/main/res/layout/contact_selection_new_group_item.xml new file mode 100644 index 000000000..91492623e --- /dev/null +++ b/app/src/main/res/layout/contact_selection_new_group_item.xml @@ -0,0 +1,18 @@ + + diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index 901002990..ef731ba15 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -150,6 +150,8 @@ + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d741550e4..38c6493ed 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1266,6 +1266,7 @@ Enter name or number Invite to Signal + New group Clear entered text diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 1cfc9d740..710ab58cc 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -418,6 +418,9 @@ @color/core_grey_02 @color/core_grey_60 + @drawable/ic_new_group_circle_light + @drawable/ic_invite_circle_light + @color/core_grey_90 @@ -693,6 +696,9 @@ @color/core_grey_80 @color/core_grey_25 + @drawable/ic_new_group_circle_dark + @drawable/ic_invite_circle_dark + @color/core_white