From 1f2bfe8245176df8c04182bbbf46a14aa291979f Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Thu, 31 Aug 2023 16:50:05 -0300 Subject: [PATCH] Replace internal setting for CIV2 TextOnly with a FeatureFlag. --- .../app/internal/InternalSettingsFragment.kt | 8 -------- .../settings/app/internal/InternalSettingsState.kt | 1 - .../app/internal/InternalSettingsViewModel.kt | 6 ------ .../mutiselect/MultiselectItemDecoration.kt | 8 ++++---- .../conversation/v2/ConversationAdapterV2.kt | 3 ++- .../items/V2ConversationItemTextOnlyViewHolder.kt | 2 +- .../conversationlist/ConversationListFragment.java | 3 +-- .../securesms/keyvalue/InternalValues.java | 9 --------- .../thoughtcrime/securesms/util/FeatureFlags.java | 13 ++++++++++++- 9 files changed, 20 insertions(+), 33 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsFragment.kt index 765bac7dc4..5cd1ca5e44 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsFragment.kt @@ -616,14 +616,6 @@ class InternalSettingsFragment : DSLSettingsFragment(R.string.preferences__inter } ) - switchPref( - title = DSLSettingsText.from("Use V2 ConversationItem"), - isChecked = state.useConversationItemV2, - onClick = { - viewModel.setUseConversationItemV2(!state.useConversationItemV2) - } - ) - switchPref( title = DSLSettingsText.from("Use V2 ConversationItem for Media"), isChecked = state.useConversationItemV2ForMedia, diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsState.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsState.kt index 256dae0c09..699acb2ba2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsState.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsState.kt @@ -22,6 +22,5 @@ data class InternalSettingsState( val disableStorageService: Boolean, val canClearOnboardingState: Boolean, val pnpInitialized: Boolean, - val useConversationItemV2: Boolean, val useConversationItemV2ForMedia: Boolean ) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsViewModel.kt index 60fbb77850..835168e70e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsViewModel.kt @@ -104,11 +104,6 @@ class InternalSettingsViewModel(private val repository: InternalSettingsReposito refresh() } - fun setUseConversationItemV2(enabled: Boolean) { - SignalStore.internalValues().setUseConversationItemV2(enabled) - refresh() - } - fun setUseConversationItemV2Media(enabled: Boolean) { SignalStore.internalValues().setUseConversationItemV2Media(enabled) refresh() @@ -141,7 +136,6 @@ class InternalSettingsViewModel(private val repository: InternalSettingsReposito disableStorageService = SignalStore.internalValues().storageServiceDisabled(), canClearOnboardingState = SignalStore.storyValues().hasDownloadedOnboardingStory && Stories.isFeatureEnabled(), pnpInitialized = SignalStore.misc().hasPniInitializedDevices(), - useConversationItemV2 = SignalStore.internalValues().useConversationItemV2(), useConversationItemV2ForMedia = SignalStore.internalValues().useConversationItemV2Media() ) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration.kt index 5827405b8f..ea8ac5d31c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration.kt @@ -35,7 +35,7 @@ import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.conversation.ConversationAdapterBridge import org.thoughtcrime.securesms.conversation.ConversationAdapterBridge.PulseRequest import org.thoughtcrime.securesms.conversation.v2.items.InteractiveConversationElement -import org.thoughtcrime.securesms.keyvalue.SignalStore +import org.thoughtcrime.securesms.util.FeatureFlags import org.thoughtcrime.securesms.util.ThemeUtil import org.thoughtcrime.securesms.util.ViewUtil import org.thoughtcrime.securesms.wallpaper.ChatWallpaper @@ -558,7 +558,7 @@ class MultiselectItemDecoration( } private fun RecyclerView.getMultiselectableChildren(): Sequence { - return if (SignalStore.internalValues().useConversationItemV2()) { + return if (FeatureFlags.useTextOnlyConversationItemV2()) { children.map { getChildViewHolder(it) }.filterIsInstance() } else { children.filterIsInstance() @@ -566,7 +566,7 @@ class MultiselectItemDecoration( } private fun RecyclerView.getInteractableChildren(): Sequence { - return if (SignalStore.internalValues().useConversationItemV2()) { + return if (FeatureFlags.useTextOnlyConversationItemV2()) { children.map { getChildViewHolder(it) }.filterIsInstance() } else { children.filterIsInstance() @@ -574,7 +574,7 @@ class MultiselectItemDecoration( } private fun resolveMultiselectable(parent: RecyclerView, child: View): Multiselectable? { - return if (SignalStore.internalValues().useConversationItemV2()) { + return if (FeatureFlags.useTextOnlyConversationItemV2()) { parent.getChildViewHolder(child) as? Multiselectable } else { child as? Multiselectable diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2.kt index aa0374a717..eb3eb2b023 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2.kt @@ -53,6 +53,7 @@ import org.thoughtcrime.securesms.mms.GlideRequests import org.thoughtcrime.securesms.phonenumbers.PhoneNumberFormatter import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.util.CachedInflater +import org.thoughtcrime.securesms.util.FeatureFlags import org.thoughtcrime.securesms.util.HtmlUtil import org.thoughtcrime.securesms.util.Projection import org.thoughtcrime.securesms.util.ProjectionList @@ -119,7 +120,7 @@ class ConversationAdapterV2( } } - if (SignalStore.internalValues().useConversationItemV2()) { + if (FeatureFlags.useTextOnlyConversationItemV2()) { registerFactory(OutgoingTextOnly::class.java) { parent -> val view = CachedInflater.from(parent.context).inflate(R.layout.v2_conversation_item_text_only_outgoing, parent, false) V2ConversationItemTextOnlyViewHolder(V2ConversationItemTextOnlyOutgoingBinding.bind(view).bridge(), this) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder.kt index 84a16d7704..ae652450ff 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder.kt @@ -164,7 +164,7 @@ open class V2ConversationItemTextOnlyViewHolder>( var hasProcessedSupportedPayload = false if (ConversationAdapterBridge.PAYLOAD_TIMESTAMP in payload) { - presentDate(shape) + presentDate() hasProcessedSupportedPayload = true } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java index c6c65106e3..135768e9fb 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java @@ -175,7 +175,6 @@ import org.thoughtcrime.securesms.util.SignalLocalMetrics; import org.thoughtcrime.securesms.util.SignalProxyUtil; import org.thoughtcrime.securesms.util.SnapToTopDataObserver; import org.thoughtcrime.securesms.util.TextSecurePreferences; -import org.thoughtcrime.securesms.util.Util; import org.thoughtcrime.securesms.util.ViewUtil; import org.thoughtcrime.securesms.util.WindowUtil; import org.thoughtcrime.securesms.util.adapter.mapping.PagingMappingAdapter; @@ -984,7 +983,7 @@ public class ConversationListFragment extends MainFragment implements ActionMode FrameLayout parent = new FrameLayout(context); parent.setLayoutParams(new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.WRAP_CONTENT)); - if (SignalStore.internalValues().useConversationItemV2()) { + if (FeatureFlags.useTextOnlyConversationItemV2()) { CachedInflater.from(context).cacheUntilLimit(R.layout.v2_conversation_item_text_only_incoming, parent, 25); CachedInflater.from(context).cacheUntilLimit(R.layout.v2_conversation_item_text_only_outgoing, parent, 25); } else { diff --git a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/InternalValues.java b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/InternalValues.java index 6cb3ba9bce..884fef1f8b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/InternalValues.java +++ b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/InternalValues.java @@ -29,7 +29,6 @@ public final class InternalValues extends SignalStoreValues { public static final String DISABLE_STORAGE_SERVICE = "internal.disable_storage_service"; public static final String FORCE_WEBSOCKET_MODE = "internal.force_websocket_mode"; public static final String LAST_SCROLL_POSITION = "internal.last_scroll_position"; - public static final String CONVERSATION_ITEM_V2 = "internal.conversation_item_v2"; public static final String CONVERSATION_ITEM_V2_MEDIA = "internal.conversation_item_v2_media"; InternalValues(KeyValueStore store) { @@ -192,14 +191,6 @@ public final class InternalValues extends SignalStoreValues { return getInteger(LAST_SCROLL_POSITION, 0); } - public void setUseConversationItemV2(boolean useConversationFragmentV2) { - putBoolean(CONVERSATION_ITEM_V2, useConversationFragmentV2); - } - - public boolean useConversationItemV2() { - return FeatureFlags.internalUser() && getBoolean(CONVERSATION_ITEM_V2, false); - } - public void setUseConversationItemV2Media(boolean useConversationFragmentV2Media) { putBoolean(CONVERSATION_ITEM_V2_MEDIA, useConversationFragmentV2Media); } 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 679e66f0f4..9a286275e6 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/FeatureFlags.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/FeatureFlags.java @@ -114,6 +114,7 @@ public final class FeatureFlags { public static final String PROMPT_BATTERY_SAVER = "android.promptBatterySaver"; public static final String USERNAMES = "android.usernames"; public static final String INSTANT_VIDEO_PLAYBACK = "android.instantVideoPlayback"; + private static final String CONVERSATION_ITEM_V2_TEXT = "android.conversationItemV2.text"; /** * We will only store remote values for flags in this set. If you want a flag to be controllable @@ -179,7 +180,8 @@ public final class FeatureFlags { PROMPT_FOR_NOTIFICATION_CONFIG, PROMPT_BATTERY_SAVER, USERNAMES, - INSTANT_VIDEO_PLAYBACK + INSTANT_VIDEO_PLAYBACK, + CONVERSATION_ITEM_V2_TEXT ); @VisibleForTesting @@ -639,6 +641,15 @@ public final class FeatureFlags { return getBoolean(INSTANT_VIDEO_PLAYBACK, false); } + /** + * Note: this setting is currently + * + * @return Whether to use TextOnly V2 Conversation Items. + */ + public static boolean useTextOnlyConversationItemV2() { + return getBoolean(CONVERSATION_ITEM_V2_TEXT, false); + } + public static String promptForDelayedNotificationLogs() { return getString(PROMPT_FOR_NOTIFICATION_LOGS, "*"); }