Skip to content

Commit b7df6ad

Browse files
committed
Multi accounts - update first view when adding an account.
1 parent a07efbe commit b7df6ad

File tree

5 files changed

+109
-38
lines changed

5 files changed

+109
-38
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ class OnBoardingNode(
9797
onNeedLoginPassword = ::onLoginPasswordNeeded,
9898
onLearnMoreClick = { openLearnMorePage(context) },
9999
onCreateAccountContinue = ::onCreateAccountContinue,
100+
onBackPressed = ::navigateUp,
100101
)
101102
}
102103
}

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import io.element.android.features.login.impl.login.LoginHelper
2727
import io.element.android.features.rageshake.api.RageshakeFeatureAvailability
2828
import io.element.android.libraries.architecture.Presenter
2929
import io.element.android.libraries.core.meta.BuildMeta
30+
import io.element.android.libraries.sessionstorage.api.SessionStore
3031
import io.element.android.libraries.ui.utils.MultipleTapToUnlock
3132

3233
@Inject
@@ -38,6 +39,7 @@ class OnBoardingPresenter(
3839
private val rageshakeFeatureAvailability: RageshakeFeatureAvailability,
3940
private val loginHelper: LoginHelper,
4041
private val onBoardingLogoResIdProvider: OnBoardingLogoResIdProvider,
42+
private val sessionStore: SessionStore,
4143
) : Presenter<OnBoardingState> {
4244
@AssistedFactory
4345
interface Factory {
@@ -86,6 +88,10 @@ class OnBoardingPresenter(
8688
val onBoardingLogoResId = remember {
8789
onBoardingLogoResIdProvider.get()
8890
}
91+
val isAddingAccount by produceState(initialValue = false) {
92+
// We are adding an account if there is at least one session already stored
93+
value = sessionStore.getAllSessions().isNotEmpty()
94+
}
8995

9096
val loginMode by loginHelper.collectLoginMode()
9197

@@ -109,6 +115,7 @@ class OnBoardingPresenter(
109115
}
110116

111117
return OnBoardingState(
118+
isAddingAccount = isAddingAccount,
112119
productionApplicationName = buildMeta.productionApplicationName,
113120
defaultAccountProvider = defaultAccountProvider,
114121
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
@@ -12,6 +12,7 @@ import io.element.android.features.login.impl.login.LoginMode
1212
import io.element.android.libraries.architecture.AsyncData
1313

1414
data class OnBoardingState(
15+
val isAddingAccount: Boolean,
1516
val productionApplicationName: String,
1617
val defaultAccountProvider: String?,
1718
val mustChooseAccountProvider: Boolean,

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,16 @@ open class OnBoardingStateProvider : PreviewParameterProvider<OnBoardingState> {
2323
anOnBoardingState(canLoginWithQrCode = true, canCreateAccount = true, canReportBug = true),
2424
anOnBoardingState(defaultAccountProvider = "element.io", canCreateAccount = false, canReportBug = true),
2525
anOnBoardingState(customLogoResId = R.drawable.sample_background),
26+
anOnBoardingState(
27+
isAddingAccount = true,
28+
canLoginWithQrCode = true,
29+
canCreateAccount = true,
30+
),
2631
)
2732
}
2833

2934
fun anOnBoardingState(
35+
isAddingAccount: Boolean = false,
3036
productionApplicationName: String = "Element",
3137
defaultAccountProvider: String? = null,
3238
mustChooseAccountProvider: Boolean = false,
@@ -39,6 +45,7 @@ fun anOnBoardingState(
3945
loginMode: AsyncData<LoginMode> = AsyncData.Uninitialized,
4046
eventSink: (OnBoardingEvents) -> Unit = {},
4147
) = OnBoardingState(
48+
isAddingAccount = isAddingAccount,
4249
productionApplicationName = productionApplicationName,
4350
defaultAccountProvider = defaultAccountProvider,
4451
mustChooseAccountProvider = mustChooseAccountProvider,

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

Lines changed: 93 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,9 @@ import io.element.android.libraries.architecture.AsyncData
3838
import io.element.android.libraries.designsystem.atomic.atoms.ElementLogoAtom
3939
import io.element.android.libraries.designsystem.atomic.atoms.ElementLogoAtomSize
4040
import io.element.android.libraries.designsystem.atomic.molecules.ButtonColumnMolecule
41+
import io.element.android.libraries.designsystem.atomic.pages.FlowStepPage
4142
import io.element.android.libraries.designsystem.atomic.pages.OnBoardingPage
43+
import io.element.android.libraries.designsystem.components.BigIcon
4244
import io.element.android.libraries.designsystem.preview.ElementPreview
4345
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
4446
import io.element.android.libraries.designsystem.theme.components.Button
@@ -58,6 +60,7 @@ import io.element.android.libraries.ui.strings.CommonStrings
5860
@Composable
5961
fun OnBoardingView(
6062
state: OnBoardingState,
63+
onBackPressed: () -> Unit,
6164
onSignInWithQrCode: () -> Unit,
6265
onSignIn: (mustChooseAccountProvider: Boolean) -> Unit,
6366
onCreateAccount: () -> Unit,
@@ -67,6 +70,52 @@ fun OnBoardingView(
6770
onCreateAccountContinue: (url: String) -> Unit,
6871
onReportProblem: () -> Unit,
6972
modifier: Modifier = Modifier,
73+
) {
74+
val loginView = @Composable {
75+
LoginModeView(
76+
loginMode = state.loginMode,
77+
onClearError = {
78+
state.eventSink(OnBoardingEvents.ClearError)
79+
},
80+
onLearnMoreClick = onLearnMoreClick,
81+
onOidcDetails = onOidcDetails,
82+
onNeedLoginPassword = onNeedLoginPassword,
83+
onCreateAccountContinue = onCreateAccountContinue,
84+
)
85+
}
86+
val buttons = @Composable {
87+
OnBoardingButtons(
88+
state = state,
89+
onSignInWithQrCode = onSignInWithQrCode,
90+
onSignIn = onSignIn,
91+
onCreateAccount = onCreateAccount,
92+
onReportProblem = onReportProblem,
93+
)
94+
}
95+
96+
if (state.isAddingAccount) {
97+
AddOtherAccountScaffold(
98+
modifier = modifier,
99+
loginView = loginView,
100+
buttons = buttons,
101+
onBackPressed = onBackPressed,
102+
)
103+
} else {
104+
AddFirstAccountScaffold(
105+
modifier = modifier,
106+
state = state,
107+
loginView = loginView,
108+
buttons = buttons,
109+
)
110+
}
111+
}
112+
113+
@Composable
114+
private fun AddFirstAccountScaffold(
115+
state: OnBoardingState,
116+
loginView: @Composable () -> Unit,
117+
buttons: @Composable () -> Unit,
118+
modifier: Modifier = Modifier,
70119
) {
71120
OnBoardingPage(
72121
modifier = modifier,
@@ -79,29 +128,32 @@ fun OnBoardingView(
79128
} else {
80129
OnBoardingContent(state = state)
81130
}
82-
LoginModeView(
83-
loginMode = state.loginMode,
84-
onClearError = {
85-
state.eventSink(OnBoardingEvents.ClearError)
86-
},
87-
onLearnMoreClick = onLearnMoreClick,
88-
onOidcDetails = onOidcDetails,
89-
onNeedLoginPassword = onNeedLoginPassword,
90-
onCreateAccountContinue = onCreateAccountContinue,
91-
)
131+
loginView()
92132
},
93133
footer = {
94-
OnBoardingButtons(
95-
state = state,
96-
onSignInWithQrCode = onSignInWithQrCode,
97-
onSignIn = onSignIn,
98-
onCreateAccount = onCreateAccount,
99-
onReportProblem = onReportProblem,
100-
)
134+
buttons()
101135
}
102136
)
103137
}
104138

139+
@Composable
140+
private fun AddOtherAccountScaffold(
141+
loginView: @Composable () -> Unit,
142+
buttons: @Composable () -> Unit,
143+
onBackPressed: () -> Unit,
144+
modifier: Modifier = Modifier,
145+
) {
146+
FlowStepPage(
147+
modifier = modifier,
148+
// TODO i18n
149+
title = "Add account",
150+
iconStyle = BigIcon.Style.Default(CompoundIcons.HomeSolid()),
151+
buttons = { buttons() },
152+
content = loginView,
153+
onBackClick = onBackPressed,
154+
)
155+
}
156+
105157
@Composable
106158
private fun OnBoardingContent(state: OnBoardingState) {
107159
Box(
@@ -226,27 +278,29 @@ private fun OnBoardingButtons(
226278
.fillMaxWidth()
227279
)
228280
}
229-
if (state.canReportBug) {
230-
// Add a report problem text button. Use a Text since we need a special theme here.
231-
Text(
232-
modifier = Modifier
233-
.clickable(onClick = onReportProblem)
234-
.padding(16.dp),
235-
text = stringResource(id = CommonStrings.common_report_a_problem),
236-
style = ElementTheme.typography.fontBodySmRegular,
237-
color = ElementTheme.colors.textSecondary,
238-
)
239-
} else {
240-
Text(
241-
modifier = Modifier
242-
.clickable {
243-
state.eventSink(OnBoardingEvents.OnVersionClick)
244-
}
245-
.padding(16.dp),
246-
text = stringResource(id = R.string.screen_onboarding_app_version, state.version),
247-
style = ElementTheme.typography.fontBodySmRegular,
248-
color = ElementTheme.colors.textSecondary,
249-
)
281+
if (state.isAddingAccount.not()) {
282+
if (state.canReportBug) {
283+
// Add a report problem text button. Use a Text since we need a special theme here.
284+
Text(
285+
modifier = Modifier
286+
.clickable(onClick = onReportProblem)
287+
.padding(16.dp),
288+
text = stringResource(id = CommonStrings.common_report_a_problem),
289+
style = ElementTheme.typography.fontBodySmRegular,
290+
color = ElementTheme.colors.textSecondary,
291+
)
292+
} else {
293+
Text(
294+
modifier = Modifier
295+
.clickable {
296+
state.eventSink(OnBoardingEvents.OnVersionClick)
297+
}
298+
.padding(16.dp),
299+
text = stringResource(id = R.string.screen_onboarding_app_version, state.version),
300+
style = ElementTheme.typography.fontBodySmRegular,
301+
color = ElementTheme.colors.textSecondary,
302+
)
303+
}
250304
}
251305
}
252306
}
@@ -258,6 +312,7 @@ internal fun OnBoardingViewPreview(
258312
) = ElementPreview {
259313
OnBoardingView(
260314
state = state,
315+
onBackPressed = {},
261316
onSignInWithQrCode = {},
262317
onSignIn = {},
263318
onCreateAccount = {},

0 commit comments

Comments
 (0)