diff --git a/app/src/main/java/org/thoughtcrime/securesms/ContactSelectionListFragment.java b/app/src/main/java/org/thoughtcrime/securesms/ContactSelectionListFragment.java index 4acd5d6e06..eb66a21606 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/ContactSelectionListFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/ContactSelectionListFragment.java @@ -251,7 +251,11 @@ public final class ContactSelectionListFragment extends Fragment RecyclerViewConcatenateAdapterStickyHeader concatenateAdapter = new RecyclerViewConcatenateAdapterStickyHeader(); if (listCallback != null && FeatureFlags.newGroupUI()) { - headerAdapter = new FixedViewsAdapter(createNewGroupItem(listCallback)); + if (FeatureFlags.groupsV2create() && FeatureFlags.groupsV2internalTest()) { + headerAdapter = new FixedViewsAdapter(createNewGroupItem(listCallback), createNewGroupsV1GroupItem(listCallback)); + } else { + headerAdapter = new FixedViewsAdapter(createNewGroupItem(listCallback)); + } headerAdapter.hide(); concatenateAdapter.addAdapter(headerAdapter); } @@ -288,7 +292,14 @@ public final class ContactSelectionListFragment extends Fragment 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()); + view.setOnClickListener(v -> listCallback.onNewGroup(false)); + return view; + } + + private View createNewGroupsV1GroupItem(@NonNull ListCallback listCallback) { + View view = LayoutInflater.from(requireContext()) + .inflate(R.layout.contact_selection_new_group_v1_item, (ViewGroup) requireView(), false); + view.setOnClickListener(v -> listCallback.onNewGroup(true)); return view; } @@ -592,7 +603,7 @@ public final class ContactSelectionListFragment extends Fragment public interface ListCallback { void onInvite(); - void onNewGroup(); + void onNewGroup(boolean forceV1); } public interface ScrollCallback { diff --git a/app/src/main/java/org/thoughtcrime/securesms/MainNavigator.java b/app/src/main/java/org/thoughtcrime/securesms/MainNavigator.java index 8742d30e63..0306b27240 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/MainNavigator.java +++ b/app/src/main/java/org/thoughtcrime/securesms/MainNavigator.java @@ -78,7 +78,7 @@ public class MainNavigator { } public void goToGroupCreation() { - activity.startActivity(CreateGroupActivity.newIntent(activity)); + activity.startActivity(CreateGroupActivity.newIntent(activity, true)); } public void goToInvite() { diff --git a/app/src/main/java/org/thoughtcrime/securesms/NewConversationActivity.java b/app/src/main/java/org/thoughtcrime/securesms/NewConversationActivity.java index e268aeb963..5124a2b8b9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/NewConversationActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/NewConversationActivity.java @@ -83,10 +83,10 @@ public class NewConversationActivity extends ContactSelectionActivity super.onOptionsItemSelected(item); switch (item.getItemId()) { - case android.R.id.home: super.onBackPressed(); return true; - case R.id.menu_refresh: handleManualRefresh(); return true; - case R.id.menu_new_group: handleCreateGroup(); return true; - case R.id.menu_invite: handleInvite(); return true; + case android.R.id.home: super.onBackPressed(); return true; + case R.id.menu_refresh: handleManualRefresh(); return true; + case R.id.menu_new_group: handleCreateGroup(true); return true; + case R.id.menu_invite: handleInvite(); return true; } return false; @@ -97,8 +97,8 @@ public class NewConversationActivity extends ContactSelectionActivity onRefresh(); } - private void handleCreateGroup() { - startActivity(CreateGroupActivity.newIntent(this)); + private void handleCreateGroup(boolean forceV1) { + startActivity(CreateGroupActivity.newIntent(this, forceV1)); } private void handleInvite() { @@ -121,8 +121,8 @@ public class NewConversationActivity extends ContactSelectionActivity } @Override - public void onNewGroup() { - handleCreateGroup(); + public void onNewGroup(boolean forceV1) { + handleCreateGroup(forceV1); finish(); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/CreateGroupActivity.java b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/CreateGroupActivity.java index 0a6c62c538..a3e1167ce7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/CreateGroupActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/CreateGroupActivity.java @@ -29,8 +29,8 @@ public class CreateGroupActivity extends ContactSelectionActivity { private View next; - public static Intent newIntent(@NonNull Context context) { - if (!FeatureFlags.newGroupUI() || !FeatureFlags.groupsV2create()) { + public static Intent newIntent(@NonNull Context context, boolean forceV1) { + if (forceV1 || !FeatureFlags.newGroupUI() || !FeatureFlags.groupsV2create()) { return new Intent(context, GroupCreateActivity.class); } 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 f206cc93fa..c598a8796d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/FeatureFlags.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/FeatureFlags.java @@ -66,6 +66,7 @@ public final class FeatureFlags { private static final String GROUPS_V2 = "android.groupsv2"; private static final String GROUPS_V2_CREATE = "android.groupsv2.create"; private static final String GROUPS_V2_CAPACITY = "android.groupsv2.capacity"; + private static final String GROUPS_V2_INTERNAL_TEST = "android.groupsv2.internalTest"; /** * We will only store remote values for flags in this set. If you want a flag to be controllable @@ -89,7 +90,8 @@ public final class FeatureFlags { GROUPS_V2, GROUPS_V2_CREATE, GROUPS_V2_CAPACITY, - NEW_GROUP_UI + NEW_GROUP_UI, + GROUPS_V2_INTERNAL_TEST ); /** @@ -292,6 +294,11 @@ public final class FeatureFlags { return getInteger(GROUPS_V2_CAPACITY, 100); } + /** Groups v2 UI for internal testing. */ + public static boolean groupsV2internalTest() { + return groupsV2() && getBoolean(GROUPS_V2_INTERNAL_TEST, false); + } + /** Only for rendering debug info. */ public static synchronized @NonNull Map getMemoryValues() { return new TreeMap<>(REMOTE_VALUES); diff --git a/app/src/main/res/layout/contact_selection_new_group_v1_item.xml b/app/src/main/res/layout/contact_selection_new_group_v1_item.xml new file mode 100644 index 0000000000..ef31959b25 --- /dev/null +++ b/app/src/main/res/layout/contact_selection_new_group_v1_item.xml @@ -0,0 +1,18 @@ + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 99c4fdb9e1..cf1ea31ee9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1353,6 +1353,8 @@ Enter name or number Invite to Signal New group + + New old style group (GV1) Clear entered text