diff --git a/app/src/main/java/org/thoughtcrime/securesms/MainActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/MainActivity.kt index a987c4627f..d3f762af1b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/MainActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/MainActivity.kt @@ -240,7 +240,7 @@ class MainActivity : PassphraseRequiredActivity(), VoiceNoteMediaControllerOwner LaunchedEffect(detailLocation) { if (detailLocation is MainNavigationDetailLocation.Conversation) { - if (RemoteConfig.largeScreenUi) { + if (SignalStore.internal.largeScreenUi) { scaffoldNavigator.navigateTo(ThreePaneScaffoldRole.Primary, detailLocation) } else { startActivity((detailLocation as MainNavigationDetailLocation.Conversation).intent) 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 76c83644fc..e340a3a283 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 @@ -163,6 +163,17 @@ class InternalSettingsFragment : DSLSettingsFragment(R.string.preferences__inter ) dividerPref() + sectionHeaderPref(DSLSettingsText.from("App UI")) + + switchPref( + title = DSLSettingsText.from("Enable new split pane UI."), + summary = DSLSettingsText.from("Warning: Some bugs and non functional buttons are expected."), + isChecked = state.largeScreenUi, + onClick = { + viewModel.setUseLargeScreenUi(!state.largeScreenUi) + } + ) + sectionHeaderPref(DSLSettingsText.from("Playgrounds")) clickPref( 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 58b7a20c7f..c923829fa9 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 @@ -25,5 +25,6 @@ data class InternalSettingsState( val useConversationItemV2ForMedia: Boolean, val hasPendingOneTimeDonation: Boolean, val hevcEncoding: Boolean, - val newCallingUi: Boolean + val newCallingUi: Boolean, + val largeScreenUi: 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 5116ba6322..cc45321104 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 @@ -166,7 +166,8 @@ class InternalSettingsViewModel(private val repository: InternalSettingsReposito useConversationItemV2ForMedia = SignalStore.internal.useConversationItemV2Media, hasPendingOneTimeDonation = SignalStore.inAppPayments.getPendingOneTimeDonation() != null, hevcEncoding = SignalStore.internal.hevcEncoding, - newCallingUi = SignalStore.internal.newCallingUi + newCallingUi = SignalStore.internal.newCallingUi, + largeScreenUi = SignalStore.internal.largeScreenUi ) fun onClearOnboardingState() { @@ -182,6 +183,11 @@ class InternalSettingsViewModel(private val repository: InternalSettingsReposito refresh() } + fun setUseLargeScreenUi(largeScreenUi: Boolean) { + SignalStore.internal.largeScreenUi = largeScreenUi + refresh() + } + class Factory(private val repository: InternalSettingsRepository) : ViewModelProvider.Factory { override fun create(modelClass: Class): T { return requireNotNull(modelClass.cast(InternalSettingsViewModel(repository))) diff --git a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/InternalValues.kt b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/InternalValues.kt index 2ab6473b6b..bd1d379a39 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/InternalValues.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/InternalValues.kt @@ -28,12 +28,18 @@ class InternalValues internal constructor(store: KeyValueStore) : SignalStoreVal const val WEB_SOCKET_SHADOWING_STATS: String = "internal.web_socket_shadowing_stats" const val ENCODE_HEVC: String = "internal.hevc_encoding" const val NEW_CALL_UI: String = "internal.new.call.ui" + const val LARGE_SCREEN_UI: String = "internal.large.screen.ui" } public override fun onFirstEverAppLaunch() = Unit public override fun getKeysToIncludeInBackup(): List = emptyList() + /** + * Enable or disable the large screen UI. + */ + var largeScreenUi by booleanValue(LARGE_SCREEN_UI, false).defaultForExternalUsers() + /** * Members will not be added directly to a GV2 even if they could be. */ diff --git a/app/src/main/java/org/thoughtcrime/securesms/window/AppScaffold.kt b/app/src/main/java/org/thoughtcrime/securesms/window/AppScaffold.kt index ac7c59bd52..c20e688b9e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/window/AppScaffold.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/window/AppScaffold.kt @@ -32,6 +32,7 @@ import androidx.window.core.ExperimentalWindowCoreApi import androidx.window.core.layout.WindowHeightSizeClass import androidx.window.core.layout.WindowWidthSizeClass import org.signal.core.ui.compose.Previews +import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.main.MainNavigationBar import org.thoughtcrime.securesms.main.MainNavigationRail import org.thoughtcrime.securesms.main.MainNavigationState @@ -72,7 +73,7 @@ enum class WindowSizeClass( fun Resources.getWindowSizeClass(): WindowSizeClass { val orientation = configuration.orientation - if (!RemoteConfig.largeScreenUi) { + if (isForcedCompact()) { return getCompactSizeClassForOrientation(orientation) } @@ -86,7 +87,7 @@ enum class WindowSizeClass( } fun isForcedCompact(): Boolean { - return !RemoteConfig.largeScreenUi + return !SignalStore.internal.largeScreenUi } @Composable