Skip to content

Commit 1b03dd1

Browse files
committed
Split developer settings into 2 screens to be able to access global settings when no logged in.
1 parent b6188a7 commit 1b03dd1

26 files changed

+923
-446
lines changed

features/login/impl/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ setupDependencyInjection()
5555
dependencies {
5656
implementation(projects.appconfig)
5757
implementation(projects.features.enterprise.api)
58+
implementation(projects.features.preferences.api)
5859
implementation(projects.features.rageshake.api)
5960
implementation(projects.libraries.core)
6061
implementation(projects.libraries.androidutils)

features/login/impl/src/main/kotlin/io/element/android/features/login/impl/LoginFlowNode.kt

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ import io.element.android.features.login.impl.screens.createaccount.CreateAccoun
4141
import io.element.android.features.login.impl.screens.loginpassword.LoginPasswordNode
4242
import io.element.android.features.login.impl.screens.onboarding.OnBoardingNode
4343
import io.element.android.features.login.impl.screens.searchaccountprovider.SearchAccountProviderNode
44+
import io.element.android.features.preferences.api.PreferencesEntryPoint
4445
import io.element.android.libraries.androidutils.browser.openUrlInChromeCustomTab
4546
import io.element.android.libraries.architecture.BackstackView
4647
import io.element.android.libraries.architecture.BaseFlowNode
@@ -67,6 +68,7 @@ class LoginFlowNode(
6768
@AppCoroutineScope
6869
private val appCoroutineScope: CoroutineScope,
6970
private val elementClassicConnection: ElementClassicConnection,
71+
private val preferencesEntryPoint: PreferencesEntryPoint,
7072
) : BaseFlowNode<LoginFlowNode.NavTarget>(
7173
backstack = BackStack(
7274
initialElement = NavTarget.CheckClassicFlow,
@@ -117,6 +119,9 @@ class LoginFlowNode(
117119
@Parcelize
118120
data object QrCode : NavTarget
119121

122+
@Parcelize
123+
data object AppDeveloperSettings : NavTarget
124+
120125
@Parcelize
121126
data class ConfirmAccountProvider(
122127
val isAccountCreation: Boolean,
@@ -200,6 +205,10 @@ class LoginFlowNode(
200205
backstack.push(NavTarget.CreateAccount(url))
201206
}
202207

208+
override fun navigateToDeveloperSettings() {
209+
backstack.push(NavTarget.AppDeveloperSettings)
210+
}
211+
203212
override fun navigateToLoginPassword() {
204213
backstack.push(NavTarget.LoginPassword())
205214
}
@@ -220,6 +229,18 @@ class LoginFlowNode(
220229
)
221230
createNode<OnBoardingNode>(buildContext, listOf(callback, inputs))
222231
}
232+
NavTarget.AppDeveloperSettings -> {
233+
val callback = object : PreferencesEntryPoint.DeveloperSettingsCallback {
234+
override fun onDone() {
235+
backstack.pop()
236+
}
237+
}
238+
preferencesEntryPoint.createAppDeveloperSettingsNode(
239+
parentNode = this,
240+
buildContext = buildContext,
241+
callback = callback,
242+
)
243+
}
223244
NavTarget.ChooseAccountProvider -> {
224245
val callback = object : ChooseAccountProviderNode.Callback {
225246
override fun navigateToOidc(oidcDetails: OidcDetails) {

features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingNode.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ class OnBoardingNode(
4242
fun navigateToLoginPassword()
4343
fun navigateToOidc(oidcDetails: OidcDetails)
4444
fun navigateToCreateAccount(url: String)
45+
fun navigateToDeveloperSettings()
4546
fun onDone()
4647
}
4748

@@ -75,6 +76,7 @@ class OnBoardingNode(
7576
onLearnMoreClick = { openLearnMorePage(context) },
7677
onCreateAccountContinue = callback::navigateToCreateAccount,
7778
onBackClick = callback::onDone,
79+
onDeveloperSettingsClick = callback::navigateToDeveloperSettings,
7880
)
7981
}
8082
}

features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingPresenter.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import io.element.android.features.login.impl.login.LoginHelper
2929
import io.element.android.features.rageshake.api.RageshakeFeatureAvailability
3030
import io.element.android.libraries.architecture.Presenter
3131
import io.element.android.libraries.core.meta.BuildMeta
32+
import io.element.android.libraries.core.meta.BuildType
3233
import io.element.android.libraries.sessionstorage.api.SessionStore
3334
import io.element.android.libraries.ui.utils.MultipleTapToUnlock
3435
import kotlinx.coroutines.launch
@@ -125,6 +126,7 @@ class OnBoardingPresenter(
125126
return OnBoardingState(
126127
isAddingAccount = isAddingAccount,
127128
showBackButton = params.showBackButton,
129+
showDeveloperSettings = buildMeta.buildType != BuildType.RELEASE,
128130
productionApplicationName = buildMeta.productionApplicationName,
129131
defaultAccountProvider = defaultAccountProvider,
130132
mustChooseAccountProvider = mustChooseAccountProvider,

features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingState.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import io.element.android.libraries.architecture.AsyncData
1515
data class OnBoardingState(
1616
val isAddingAccount: Boolean,
1717
val showBackButton: Boolean,
18+
val showDeveloperSettings: Boolean,
1819
val productionApplicationName: String,
1920
val defaultAccountProvider: String?,
2021
val mustChooseAccountProvider: Boolean,

features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingStateProvider.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,15 @@ open class OnBoardingStateProvider : PreviewParameterProvider<OnBoardingState> {
3131
),
3232
anOnBoardingState(
3333
showBackButton = true,
34+
showDeveloperSettings = true,
3435
),
3536
)
3637
}
3738

3839
fun anOnBoardingState(
3940
isAddingAccount: Boolean = false,
4041
showBackButton: Boolean = false,
42+
showDeveloperSettings: Boolean = false,
4143
productionApplicationName: String = "Element",
4244
defaultAccountProvider: String? = null,
4345
mustChooseAccountProvider: Boolean = false,
@@ -52,6 +54,7 @@ fun anOnBoardingState(
5254
) = OnBoardingState(
5355
isAddingAccount = isAddingAccount,
5456
showBackButton = showBackButton,
57+
showDeveloperSettings = showDeveloperSettings,
5558
productionApplicationName = productionApplicationName,
5659
defaultAccountProvider = defaultAccountProvider,
5760
mustChooseAccountProvider = mustChooseAccountProvider,

features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/onboarding/OnBoardingView.kt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ import io.element.android.libraries.ui.strings.CommonStrings
6464
fun OnBoardingView(
6565
state: OnBoardingState,
6666
onBackClick: () -> Unit,
67+
onDeveloperSettingsClick: () -> Unit,
6768
onSignInWithQrCode: () -> Unit,
6869
onSignIn: (mustChooseAccountProvider: Boolean) -> Unit,
6970
onCreateAccount: () -> Unit,
@@ -110,6 +111,7 @@ fun OnBoardingView(
110111
loginView = loginView,
111112
buttons = buttons,
112113
onBackClick = onBackClick,
114+
onDeveloperSettingsClick = onDeveloperSettingsClick,
113115
)
114116
}
115117
}
@@ -120,6 +122,7 @@ private fun AddFirstAccountScaffold(
120122
loginView: @Composable () -> Unit,
121123
buttons: @Composable () -> Unit,
122124
onBackClick: () -> Unit,
125+
onDeveloperSettingsClick: () -> Unit,
123126
modifier: Modifier = Modifier,
124127
) {
125128
OnBoardingPage(
@@ -136,6 +139,18 @@ private fun AddFirstAccountScaffold(
136139
} else {
137140
OnBoardingContent(state = state)
138141
}
142+
if (state.showDeveloperSettings) {
143+
IconButton(
144+
onClick = onDeveloperSettingsClick,
145+
modifier = Modifier
146+
.align(Alignment.TopStart),
147+
) {
148+
Icon(
149+
imageVector = CompoundIcons.SettingsSolid(),
150+
contentDescription = stringResource(CommonStrings.common_developer_options),
151+
)
152+
}
153+
}
139154
if (state.showBackButton) {
140155
// Add icon button to "navigate back"
141156
IconButton(
@@ -334,6 +349,7 @@ internal fun OnBoardingViewPreview(
334349
OnBoardingView(
335350
state = state,
336351
onBackClick = {},
352+
onDeveloperSettingsClick = {},
337353
onSignInWithQrCode = {},
338354
onSignIn = {},
339355
onCreateAccount = {},

features/preferences/api/src/main/kotlin/io/element/android/features/preferences/api/PreferencesEntryPoint.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,4 +50,14 @@ interface PreferencesEntryPoint : FeatureEntryPoint {
5050
fun navigateToRoomNotificationSettings(roomId: RoomId)
5151
fun navigateToEvent(roomId: RoomId, eventId: EventId)
5252
}
53+
54+
fun createAppDeveloperSettingsNode(
55+
parentNode: Node,
56+
buildContext: BuildContext,
57+
callback: DeveloperSettingsCallback,
58+
): Node
59+
60+
interface DeveloperSettingsCallback : Plugin {
61+
fun onDone()
62+
}
5363
}

features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/DefaultPreferencesEntryPoint.kt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import com.bumble.appyx.core.node.Node
1313
import dev.zacsweers.metro.AppScope
1414
import dev.zacsweers.metro.ContributesBinding
1515
import io.element.android.features.preferences.api.PreferencesEntryPoint
16+
import io.element.android.features.preferences.impl.developer.appsettings.AppDeveloperSettingsNode
1617
import io.element.android.libraries.architecture.createNode
1718

1819
@ContributesBinding(AppScope::class)
@@ -28,6 +29,17 @@ class DefaultPreferencesEntryPoint : PreferencesEntryPoint {
2829
plugins = listOf(params, callback)
2930
)
3031
}
32+
33+
override fun createAppDeveloperSettingsNode(
34+
parentNode: Node,
35+
buildContext: BuildContext,
36+
callback: PreferencesEntryPoint.DeveloperSettingsCallback,
37+
): Node {
38+
return parentNode.createNode<AppDeveloperSettingsNode>(
39+
buildContext = buildContext,
40+
plugins = listOf(callback),
41+
)
42+
}
3143
}
3244

3345
internal fun PreferencesEntryPoint.InitialTarget.toNavTarget() = when (this) {

features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsEvents.kt

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,8 @@
99
package io.element.android.features.preferences.impl.developer
1010

1111
import androidx.compose.ui.graphics.Color
12-
import io.element.android.features.preferences.impl.developer.tracing.LogLevelItem
13-
import io.element.android.libraries.featureflag.ui.model.FeatureUiModel
14-
import io.element.android.libraries.matrix.api.tracing.TraceLogPack
1512

1613
sealed interface DeveloperSettingsEvents {
17-
data class UpdateEnabledFeature(val feature: FeatureUiModel, val isEnabled: Boolean) : DeveloperSettingsEvents
18-
data class SetCustomElementCallBaseUrl(val baseUrl: String?) : DeveloperSettingsEvents
19-
data class SetTracingLogLevel(val logLevel: LogLevelItem) : DeveloperSettingsEvents
20-
data class ToggleTracingLogPack(val logPack: TraceLogPack, val enabled: Boolean) : DeveloperSettingsEvents
2114
data class SetShowColorPicker(val show: Boolean) : DeveloperSettingsEvents
2215
data class ChangeBrandColor(val color: Color?) : DeveloperSettingsEvents
2316
data object ClearCache : DeveloperSettingsEvents

0 commit comments

Comments
 (0)