Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(RC): SSO email login #1906

Merged
merged 13 commits into from
Jul 7, 2023
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -96,3 +96,4 @@ lint/tmp/

# Autogenerated file with git hash information.
app/src/main/assets/version.txt
/intellij.gdsl
Original file line number Diff line number Diff line change
Expand Up @@ -51,4 +51,6 @@ class AuthServerConfigProvider @Inject constructor() {
fun updateAuthServer(serverConfig: ServerConfig) {
_authServer.value = serverConfig.links
}

fun defaultServerLinks() = defaultBackendConfigs
}
9 changes: 0 additions & 9 deletions app/src/main/kotlin/com/wire/android/di/CoreLogicModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,6 @@ import com.wire.kalium.logic.feature.asset.GetMessageAssetUseCase
import com.wire.kalium.logic.feature.asset.ScheduleNewAssetMessageUseCase
import com.wire.kalium.logic.feature.auth.AddAuthenticatedUserUseCase
import com.wire.kalium.logic.feature.auth.LogoutUseCase
import com.wire.kalium.logic.feature.auth.autoVersioningAuth.AutoVersionAuthScopeUseCase
import com.wire.kalium.logic.feature.call.usecase.EndCallUseCase
import com.wire.kalium.logic.feature.call.usecase.FlipToBackCameraUseCase
import com.wire.kalium.logic.feature.call.usecase.FlipToFrontCameraUseCase
Expand Down Expand Up @@ -926,14 +925,6 @@ class UseCaseModule {
): ObserveSecurityClassificationLabelUseCase =
coreLogic.getSessionScope(currentAccount).observeSecurityClassificationLabel

@ViewModelScoped
@Provides
fun provideAutoVersionAuthScopeUseCase(
@KaliumCoreLogic coreLogic: CoreLogic,
authServerConfigProvider: AuthServerConfigProvider
): AutoVersionAuthScopeUseCase =
coreLogic.versionedAuthenticationScope(authServerConfigProvider.authServer.value)

@ViewModelScoped
@Provides
fun provideIsCallRunningUseCase(@KaliumCoreLogic coreLogic: CoreLogic, @CurrentAccount currentAccount: UserId) =
Expand Down
17 changes: 12 additions & 5 deletions app/src/main/kotlin/com/wire/android/ui/WireActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ import com.wire.android.ui.calling.ProximitySensorManager
import com.wire.android.ui.common.WireDialog
import com.wire.android.ui.common.WireDialogButtonProperties
import com.wire.android.ui.common.WireDialogButtonType
import com.wire.android.ui.common.dialogs.CustomBEDeeplinkDialog
import com.wire.android.ui.common.dialogs.CustomServerDialog
import com.wire.android.ui.common.topappbar.CommonTopAppBar
import com.wire.android.ui.common.topappbar.CommonTopAppBarViewModel
import com.wire.android.ui.common.wireDialogPropertiesBuilder
Expand Down Expand Up @@ -214,7 +214,7 @@ class WireActivity : AppCompatActivity() {
private fun handleDialogs() {
updateAppDialog({ updateTheApp() }, viewModel.globalAppState.updateAppDialog)
joinConversationDialog(viewModel.globalAppState.conversationJoinedDialog)
customBackendDialog(viewModel.globalAppState.customBackendDialog.shouldShowDialog)
customBackendDialog()
maxAccountDialog(viewModel::openProfile, viewModel::dismissMaxAccountDialog, viewModel.globalAppState.maxAccountDialog)
accountLoggedOutDialog(viewModel.globalAppState.blockUserUI)
newClientDialog(
Expand Down Expand Up @@ -266,9 +266,16 @@ class WireActivity : AppCompatActivity() {
}

@Composable
private fun customBackendDialog(shouldShow: Boolean) {
if (shouldShow) {
CustomBEDeeplinkDialog(viewModel)
private fun customBackendDialog() {
with(viewModel) {
if (globalAppState.customBackendDialog != null) {
CustomServerDialog(
serverLinksTitle = globalAppState.customBackendDialog!!.serverLinks.title,
serverLinksApi = globalAppState.customBackendDialog!!.serverLinks.api,
onDismiss = this::dismissCustomBackendDialog,
onConfirm = this::customBackendDialogProceedButtonClicked
)
}
}
}

Expand Down
27 changes: 14 additions & 13 deletions app/src/main/kotlin/com/wire/android/ui/WireActivityViewModel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ import com.wire.android.navigation.NavigationItem
import com.wire.android.navigation.NavigationManager
import com.wire.android.services.ServicesManager
import com.wire.android.ui.authentication.devices.model.displayName
import com.wire.android.ui.common.dialogs.CustomBEDeeplinkDialogState
import com.wire.android.ui.common.dialogs.CustomServerDialogState
import com.wire.android.ui.joinConversation.JoinConversationViaCodeState
import com.wire.android.util.CurrentScreen
import com.wire.android.util.CurrentScreenManager
Expand Down Expand Up @@ -275,17 +275,19 @@ class WireActivityViewModel @Inject constructor(
}

fun dismissCustomBackendDialog() {
globalAppState = globalAppState.copy(customBackendDialog = CustomBEDeeplinkDialogState(shouldShowDialog = false))
globalAppState = globalAppState.copy(customBackendDialog = null)
}

fun customBackendDialogProceedButtonClicked(serverLinks: ServerConfig.Links) {
viewModelScope.launch {
dismissCustomBackendDialog()
authServerConfigProvider.updateAuthServer(serverLinks)
if (checkNumberOfSessions() == BuildConfig.MAX_ACCOUNTS) {
globalAppState = globalAppState.copy(maxAccountDialog = true)
} else {
navigateTo(NavigationCommand(NavigationItem.Welcome.getRouteWithArgs()))
fun customBackendDialogProceedButtonClicked() {
if (globalAppState.customBackendDialog != null) {
viewModelScope.launch {
authServerConfigProvider.updateAuthServer(globalAppState.customBackendDialog!!.serverLinks)
dismissCustomBackendDialog()
if (checkNumberOfSessions() == BuildConfig.MAX_ACCOUNTS) {
globalAppState = globalAppState.copy(maxAccountDialog = true)
} else {
navigateTo(NavigationCommand(NavigationItem.Welcome.getRouteWithArgs()))
}
}
}
}
Expand Down Expand Up @@ -364,8 +366,7 @@ class WireActivityViewModel @Inject constructor(
private suspend fun onCustomServerConfig(result: DeepLinkResult.CustomServerConfig) {
loadServerConfig(result.url)?.let { serverLinks ->
globalAppState = globalAppState.copy(
customBackendDialog = CustomBEDeeplinkDialogState(
shouldShowDialog = true,
customBackendDialog = CustomServerDialogState(
serverLinks = serverLinks
)
)
Expand Down Expand Up @@ -527,7 +528,7 @@ sealed class NewClientData(open val date: String, open val deviceInfo: UIText) {
}

data class GlobalAppState(
val customBackendDialog: CustomBEDeeplinkDialogState = CustomBEDeeplinkDialogState(),
val customBackendDialog: CustomServerDialogState? = null,
val maxAccountDialog: Boolean = false,
val blockUserUI: CurrentSessionErrorState? = null,
val updateAppDialog: Boolean = false,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.wire.android.di.AuthServerConfigProvider
import com.wire.android.di.ClientScopeProvider
import com.wire.android.di.KaliumCoreLogic
import com.wire.android.navigation.BackStackMode
import com.wire.android.navigation.NavigationCommand
import com.wire.android.navigation.NavigationItem
Expand All @@ -42,6 +43,7 @@ import com.wire.android.ui.authentication.create.email.CreateAccountEmailViewSta
import com.wire.android.ui.authentication.create.overview.CreateAccountOverviewViewModel
import com.wire.android.ui.common.textfield.CodeFieldValue
import com.wire.android.util.WillNeverOccurError
import com.wire.kalium.logic.CoreLogic
import com.wire.kalium.logic.configuration.server.ServerConfig
import com.wire.kalium.logic.data.user.UserId
import com.wire.kalium.logic.feature.auth.AddAuthenticatedUserUseCase
Expand All @@ -64,7 +66,7 @@ abstract class CreateAccountBaseViewModel(
private val navigationManager: NavigationManager,
private val validateEmailUseCase: ValidateEmailUseCase,
private val validatePasswordUseCase: ValidatePasswordUseCase,
private val authScope: AutoVersionAuthScopeUseCase,
@KaliumCoreLogic private val coreLogic: CoreLogic,
private val addAuthenticatedUser: AddAuthenticatedUserUseCase,
private val clientScopeProviderFactory: ClientScopeProvider.Factory,
private val authServerConfigProvider: AuthServerConfigProvider,
Expand Down Expand Up @@ -129,10 +131,12 @@ abstract class CreateAccountBaseViewModel(
emailState = emailState.copy(showServerVersionNotSupportedDialog = true)
return@launch
}

is FetchApiVersionResult.Failure.TooNewVersion -> {
emailState = emailState.copy(showClientUpdateDialog = true)
return@launch
}

is FetchApiVersionResult.Failure.Generic -> {
return@launch
}
Expand All @@ -157,18 +161,20 @@ abstract class CreateAccountBaseViewModel(
final override fun onTermsAccept() {
emailState = emailState.copy(loading = true, continueEnabled = false, termsDialogVisible = false, termsAccepted = true)
viewModelScope.launch {
val authScope = authScope().let {
val authScope = coreLogic.versionedAuthenticationScope(serverConfig)().let {
when (it) {
is AutoVersionAuthScopeUseCase.Result.Success -> it.authenticationScope

is AutoVersionAuthScopeUseCase.Result.Failure.UnknownServerVersion -> {
// TODO: show dialog
return@launch
}

is AutoVersionAuthScopeUseCase.Result.Failure.TooNewVersion -> {
// TODO: show dialog
return@launch
}

is AutoVersionAuthScopeUseCase.Result.Failure.Generic -> {
return@launch
}
Expand Down Expand Up @@ -223,8 +229,10 @@ abstract class CreateAccountBaseViewModel(
val detailsError = when {
!validatePasswordUseCase(detailsState.password.text) ->
CreateAccountDetailsViewState.DetailsError.TextFieldError.InvalidPasswordError

detailsState.password.text != detailsState.confirmPassword.text ->
CreateAccountDetailsViewState.DetailsError.TextFieldError.PasswordsNotMatchingError

else -> CreateAccountDetailsViewState.DetailsError.None
}
detailsState = detailsState.copy(
Expand All @@ -251,18 +259,20 @@ abstract class CreateAccountBaseViewModel(
final override fun resendCode() {
codeState = codeState.copy(loading = true)
viewModelScope.launch {
val authScope = authScope().let {
val authScope = coreLogic.versionedAuthenticationScope(serverConfig)().let {
when (it) {
is AutoVersionAuthScopeUseCase.Result.Success -> it.authenticationScope

is AutoVersionAuthScopeUseCase.Result.Failure.UnknownServerVersion -> {
// TODO: show dialog
return@launch
}

is AutoVersionAuthScopeUseCase.Result.Failure.TooNewVersion -> {
// TODO: show dialog
return@launch
}

is AutoVersionAuthScopeUseCase.Result.Failure.Generic -> {
return@launch
}
Expand All @@ -278,18 +288,20 @@ abstract class CreateAccountBaseViewModel(
private fun onCodeContinue() {
codeState = codeState.copy(loading = true)
viewModelScope.launch {
val authScope = authScope().let {
val authScope = coreLogic.versionedAuthenticationScope(serverConfig)().let {
when (it) {
is AutoVersionAuthScopeUseCase.Result.Success -> it.authenticationScope

is AutoVersionAuthScopeUseCase.Result.Failure.UnknownServerVersion -> {
// TODO: show dialog
return@launch
}

is AutoVersionAuthScopeUseCase.Result.Failure.TooNewVersion -> {
// TODO: show dialog
return@launch
}

is AutoVersionAuthScopeUseCase.Result.Failure.Generic -> {
return@launch
}
Expand All @@ -304,6 +316,7 @@ abstract class CreateAccountBaseViewModel(
updateCodeErrorState(it.toCodeError())
return@launch
}

is RegisterResult.Success -> it
}
}
Expand All @@ -319,6 +332,7 @@ abstract class CreateAccountBaseViewModel(
updateCodeErrorState(it.toCodeError())
return@launch
}

is AddAuthenticatedUserUseCase.Result.Success -> it.userId
}
}
Expand All @@ -328,6 +342,7 @@ abstract class CreateAccountBaseViewModel(
updateCodeErrorState(it.toCodeError())
return@launch
}

is RegisterClientResult.Success -> {
onCodeSuccess()
}
Expand All @@ -345,6 +360,7 @@ abstract class CreateAccountBaseViewModel(
email = emailState.email.text.trim().lowercase(),
emailActivationCode = codeState.code.text.text
)

CreateAccountFlowType.CreateTeam ->
RegisterParam.Team(
firstName = detailsState.firstName.text.trim(),
Expand All @@ -360,7 +376,6 @@ abstract class CreateAccountBaseViewModel(
private fun updateCodeErrorState(codeError: CreateAccountCodeViewState.CodeError) {
codeState = if (codeError is CreateAccountCodeViewState.CodeError.None) {
codeState.copy(error = codeError)

} else {
codeState.copy(loading = false, error = codeError)
}
Expand Down Expand Up @@ -421,6 +436,7 @@ private fun RegisterClientResult.Failure.toCodeError() = when (this) {
is RegisterClientResult.Failure.Generic -> CreateAccountCodeViewState.CodeError.DialogError.GenericError(this.genericFailure)
is RegisterClientResult.Failure.InvalidCredentials ->
throw WillNeverOccurError("RegisterClient: wrong password when register client after creating a new account")

is RegisterClientResult.Failure.PasswordAuthRequired ->
throw WillNeverOccurError("RegisterClient: password required to register client after creating new account with email")
}
Expand All @@ -439,5 +455,6 @@ private fun RegisterResult.Failure.toCodeError() = when (this) {
private fun AddAuthenticatedUserUseCase.Result.Failure.toCodeError() = when (this) {
is AddAuthenticatedUserUseCase.Result.Failure.Generic ->
CreateAccountCodeViewState.CodeError.DialogError.GenericError(this.genericFailure)

AddAuthenticatedUserUseCase.Result.Failure.UserAlreadyExists -> CreateAccountCodeViewState.CodeError.DialogError.UserAlreadyExists
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,16 +24,17 @@ import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.viewModelScope
import com.wire.android.di.AuthServerConfigProvider
import com.wire.android.di.ClientScopeProvider
import com.wire.android.di.KaliumCoreLogic
import com.wire.android.navigation.BackStackMode
import com.wire.android.navigation.NavigationCommand
import com.wire.android.navigation.NavigationItem
import com.wire.android.navigation.NavigationManager
import com.wire.android.ui.authentication.create.common.CreateAccountBaseViewModel
import com.wire.android.ui.authentication.create.common.CreateAccountFlowType
import com.wire.kalium.logic.CoreLogic
import com.wire.kalium.logic.feature.auth.AddAuthenticatedUserUseCase
import com.wire.kalium.logic.feature.auth.ValidateEmailUseCase
import com.wire.kalium.logic.feature.auth.ValidatePasswordUseCase
import com.wire.kalium.logic.feature.auth.autoVersioningAuth.AutoVersionAuthScopeUseCase
import com.wire.kalium.logic.feature.server.FetchApiVersionUseCase
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.MutableSharedFlow
Expand All @@ -47,7 +48,7 @@ class CreatePersonalAccountViewModel @Inject constructor(
private val navigationManager: NavigationManager,
validateEmailUseCase: ValidateEmailUseCase,
validatePasswordUseCase: ValidatePasswordUseCase,
authScope: AutoVersionAuthScopeUseCase,
@KaliumCoreLogic coreLogic: CoreLogic,
addAuthenticatedUserUseCase: AddAuthenticatedUserUseCase,
clientScopeProviderFactory: ClientScopeProvider.Factory,
authServerConfigProvider: AuthServerConfigProvider,
Expand All @@ -58,7 +59,7 @@ class CreatePersonalAccountViewModel @Inject constructor(
navigationManager,
validateEmailUseCase,
validatePasswordUseCase,
authScope,
coreLogic,
addAuthenticatedUserUseCase,
clientScopeProviderFactory,
authServerConfigProvider,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,16 +24,17 @@ import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.viewModelScope
import com.wire.android.di.AuthServerConfigProvider
import com.wire.android.di.ClientScopeProvider
import com.wire.android.di.KaliumCoreLogic
import com.wire.android.navigation.BackStackMode
import com.wire.android.navigation.NavigationCommand
import com.wire.android.navigation.NavigationItem
import com.wire.android.navigation.NavigationManager
import com.wire.android.ui.authentication.create.common.CreateAccountBaseViewModel
import com.wire.android.ui.authentication.create.common.CreateAccountFlowType
import com.wire.kalium.logic.CoreLogic
import com.wire.kalium.logic.feature.auth.AddAuthenticatedUserUseCase
import com.wire.kalium.logic.feature.auth.ValidateEmailUseCase
import com.wire.kalium.logic.feature.auth.ValidatePasswordUseCase
import com.wire.kalium.logic.feature.auth.autoVersioningAuth.AutoVersionAuthScopeUseCase
import com.wire.kalium.logic.feature.server.FetchApiVersionUseCase
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.MutableSharedFlow
Expand All @@ -47,7 +48,7 @@ class CreateTeamViewModel @Inject constructor(
private val navigationManager: NavigationManager,
validateEmailUseCase: ValidateEmailUseCase,
validatePasswordUseCase: ValidatePasswordUseCase,
authScope: AutoVersionAuthScopeUseCase,
@KaliumCoreLogic coreLogic: CoreLogic,
addAuthenticatedUserUseCase: AddAuthenticatedUserUseCase,
clientScopeProviderFactory: ClientScopeProvider.Factory,
authServerConfigProvider: AuthServerConfigProvider,
Expand All @@ -58,7 +59,7 @@ class CreateTeamViewModel @Inject constructor(
navigationManager,
validateEmailUseCase,
validatePasswordUseCase,
authScope,
coreLogic,
addAuthenticatedUserUseCase,
clientScopeProviderFactory,
authServerConfigProvider,
Expand Down
Loading