Skip to content

Commit e6876be

Browse files
authored
Social signup (#208)
* feat: social auth buttons on sign up * refactor: decrease subscriptions count in signup * feat: social sign up * refactor: after merge * fix: tests * fix: tests * fix: addressed PR comments * fix: added different resources for sign up
1 parent a4854e3 commit e6876be

File tree

24 files changed

+1245
-886
lines changed

24 files changed

+1245
-886
lines changed

app/src/main/java/org/openedx/app/MainFragment.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,10 @@ class MainFragment : Fragment(R.layout.fragment_main) {
8282
}
8383

8484
requireArguments().apply {
85-
this.getString(ARG_COURSE_ID, null)?.apply {
86-
router.navigateToCourseDetail(parentFragmentManager, this)
85+
this.getString(ARG_COURSE_ID, null)?.let {
86+
if (it.isNotBlank()) {
87+
router.navigateToCourseDetail(parentFragmentManager, it)
88+
}
8789
}
8890
this.putString(ARG_COURSE_ID, null)
8991
}

app/src/main/java/org/openedx/app/di/AppModule.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import org.openedx.auth.presentation.AuthRouter
2323
import org.openedx.auth.presentation.sso.FacebookAuthHelper
2424
import org.openedx.auth.presentation.sso.GoogleAuthHelper
2525
import org.openedx.auth.presentation.sso.MicrosoftAuthHelper
26+
import org.openedx.auth.presentation.sso.OAuthHelper
2627
import org.openedx.core.config.Config
2728
import org.openedx.core.data.storage.CorePreferences
2829
import org.openedx.core.data.storage.InAppReviewPreferences
@@ -157,6 +158,7 @@ val appModule = module {
157158
factory { FacebookAuthHelper() }
158159
factory { GoogleAuthHelper(get()) }
159160
factory { MicrosoftAuthHelper() }
161+
factory { OAuthHelper(get(), get(), get()) }
160162

161163
factory<EnrollInCourseInteractor> { CourseInteractor(get()) }
162164
}

app/src/main/java/org/openedx/app/di/ScreenModule.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,13 +74,11 @@ val screenModule = module {
7474
get(),
7575
get(),
7676
get(),
77-
get(),
78-
get(),
7977
courseId,
8078
)
8179
}
8280
viewModel { (courseId: String?) ->
83-
SignUpViewModel(get(), get(), get(), get(), get(), courseId)
81+
SignUpViewModel(get(), get(), get(), get(), get(), get(), get(), courseId)
8482
}
8583
viewModel { RestorePasswordViewModel(get(), get(), get(), get()) }
8684

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package org.openedx.auth.domain.model
2+
3+
import org.openedx.auth.data.model.AuthType
4+
5+
data class SocialAuthResponse(
6+
var accessToken: String = "",
7+
var name: String = "",
8+
var email: String = "",
9+
var authType: AuthType = AuthType.PASSWORD,
10+
)

auth/src/main/java/org/openedx/auth/presentation/signin/SignInFragment.kt

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import androidx.fragment.app.Fragment
1414
import org.koin.android.ext.android.inject
1515
import org.koin.androidx.viewmodel.ext.android.viewModel
1616
import org.koin.core.parameter.parametersOf
17+
import org.openedx.auth.data.model.AuthType
1718
import org.openedx.auth.presentation.AuthRouter
1819
import org.openedx.auth.presentation.signin.compose.LoginScreen
1920
import org.openedx.core.AppUpdateState
@@ -51,14 +52,10 @@ class SignInFragment : Fragment() {
5152
onEvent = { event ->
5253
when (event) {
5354
is AuthEvent.SignIn -> viewModel.login(event.login, event.password)
54-
AuthEvent.SignInGoogle -> viewModel.signInGoogle(requireActivity())
55-
AuthEvent.SignInFacebook -> {
56-
viewModel.signInFacebook(this@SignInFragment)
57-
}
58-
59-
AuthEvent.SignInMicrosoft -> {
60-
viewModel.signInMicrosoft(requireActivity())
61-
}
55+
is AuthEvent.SocialSignIn -> viewModel.socialAuth(
56+
this@SignInFragment,
57+
event.authType
58+
)
6259

6360
AuthEvent.ForgotPasswordClick -> {
6461
viewModel.forgotPasswordClickedEvent()
@@ -114,9 +111,7 @@ class SignInFragment : Fragment() {
114111

115112
internal sealed interface AuthEvent {
116113
data class SignIn(val login: String, val password: String) : AuthEvent
117-
object SignInGoogle : AuthEvent
118-
object SignInFacebook : AuthEvent
119-
object SignInMicrosoft : AuthEvent
114+
data class SocialSignIn(val authType: AuthType) : AuthEvent
120115
object RegisterClick : AuthEvent
121116
object ForgotPasswordClick : AuthEvent
122117
object BackClick : AuthEvent

auth/src/main/java/org/openedx/auth/presentation/signin/SignInViewModel.kt

Lines changed: 10 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package org.openedx.auth.presentation.signin
22

3-
import android.app.Activity
43
import androidx.fragment.app.Fragment
54
import androidx.lifecycle.LiveData
65
import androidx.lifecycle.MutableLiveData
@@ -14,10 +13,9 @@ import kotlinx.coroutines.withContext
1413
import org.openedx.auth.R
1514
import org.openedx.auth.data.model.AuthType
1615
import org.openedx.auth.domain.interactor.AuthInteractor
16+
import org.openedx.auth.domain.model.SocialAuthResponse
1717
import org.openedx.auth.presentation.AuthAnalytics
18-
import org.openedx.auth.presentation.sso.FacebookAuthHelper
19-
import org.openedx.auth.presentation.sso.GoogleAuthHelper
20-
import org.openedx.auth.presentation.sso.MicrosoftAuthHelper
18+
import org.openedx.auth.presentation.sso.OAuthHelper
2119
import org.openedx.core.BaseViewModel
2220
import org.openedx.core.SingleEventLiveData
2321
import org.openedx.core.UIMessage
@@ -39,10 +37,8 @@ class SignInViewModel(
3937
private val validator: Validator,
4038
private val appUpgradeNotifier: AppUpgradeNotifier,
4139
private val analytics: AuthAnalytics,
42-
private val facebookAuthHelper: FacebookAuthHelper,
43-
private val googleAuthHelper: GoogleAuthHelper,
44-
private val microsoftAuthHelper: MicrosoftAuthHelper,
45-
val config: Config,
40+
private val oAuthHelper: OAuthHelper,
41+
config: Config,
4642
val courseId: String?,
4743
) : BaseViewModel() {
4844

@@ -114,44 +110,16 @@ class SignInViewModel(
114110
}
115111
}
116112

117-
fun signInGoogle(activityContext: Activity) {
113+
fun socialAuth(fragment: Fragment, authType: AuthType) {
118114
_uiState.update { it.copy(showProgress = true) }
119115
viewModelScope.launch {
120116
withContext(Dispatchers.IO) {
121117
runCatching {
122-
googleAuthHelper.signIn(activityContext)
118+
oAuthHelper.socialAuth(fragment, authType)
123119
}
124120
}
125121
.getOrNull()
126-
.checkToken(AuthType.GOOGLE)
127-
}
128-
}
129-
130-
fun signInFacebook(fragment: Fragment) {
131-
_uiState.update { it.copy(showProgress = true) }
132-
viewModelScope.launch {
133-
runCatching {
134-
facebookAuthHelper.signIn(fragment)
135-
}.onFailure {
136-
logger.e { "Facebook auth error: $it" }
137-
}
138-
.getOrNull()
139-
.checkToken(AuthType.FACEBOOK)
140-
}
141-
}
142-
143-
fun signInMicrosoft(activityContext: Activity) {
144-
_uiState.update { it.copy(showProgress = true) }
145-
viewModelScope.launch {
146-
withContext(Dispatchers.IO) {
147-
runCatching {
148-
microsoftAuthHelper.signIn(activityContext)
149-
}
150-
}.onFailure {
151-
logger.e { "Microsoft auth error: $it" }
152-
}
153-
.getOrNull()
154-
.checkToken(AuthType.MICROSOFT)
122+
.checkToken()
155123
}
156124
}
157125

@@ -165,7 +133,7 @@ class SignInViewModel(
165133

166134
override fun onCleared() {
167135
super.onCleared()
168-
facebookAuthHelper.clear()
136+
oAuthHelper.clear()
169137
}
170138

171139
private suspend fun exchangeToken(token: String, authType: AuthType) {
@@ -199,8 +167,8 @@ class SignInViewModel(
199167
}
200168
}
201169

202-
private suspend fun String?.checkToken(authType: AuthType) {
203-
this?.let { token ->
170+
private suspend fun SocialAuthResponse?.checkToken() {
171+
this?.accessToken?.let { token ->
204172
if (token.isNotEmpty()) {
205173
exchangeToken(token, authType)
206174
} else {

auth/src/main/java/org/openedx/auth/presentation/signin/compose/SignInView.kt

Lines changed: 9 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ import androidx.compose.foundation.text.KeyboardActions
2121
import androidx.compose.foundation.text.KeyboardOptions
2222
import androidx.compose.foundation.verticalScroll
2323
import androidx.compose.material.CircularProgressIndicator
24-
import androidx.compose.material.Icon
2524
import androidx.compose.material.MaterialTheme
2625
import androidx.compose.material.OutlinedTextField
2726
import androidx.compose.material.Scaffold
@@ -58,11 +57,11 @@ import org.openedx.auth.R
5857
import org.openedx.auth.presentation.signin.AuthEvent
5958
import org.openedx.auth.presentation.signin.SignInUIState
6059
import org.openedx.auth.presentation.ui.LoginTextField
60+
import org.openedx.auth.presentation.ui.SocialAuthView
6161
import org.openedx.core.UIMessage
6262
import org.openedx.core.ui.BackBtn
6363
import org.openedx.core.ui.HandleUIMessage
6464
import org.openedx.core.ui.OpenEdXButton
65-
import org.openedx.core.ui.OpenEdXOutlinedButton
6665
import org.openedx.core.ui.WindowSize
6766
import org.openedx.core.ui.WindowType
6867
import org.openedx.core.ui.displayCutoutForLandscape
@@ -266,95 +265,14 @@ private fun AuthForm(
266265
)
267266
}
268267
if (state.isSocialAuthEnabled) {
269-
SocialLoginView(state = state, buttonWidth = buttonWidth, onEvent = onEvent)
270-
}
271-
}
272-
}
273-
274-
@Composable
275-
private fun SocialLoginView(
276-
buttonWidth: Modifier,
277-
state: SignInUIState,
278-
onEvent: (AuthEvent) -> Unit,
279-
) {
280-
if (state.isGoogleAuthEnabled) {
281-
OpenEdXOutlinedButton(
282-
modifier = buttonWidth
283-
.testTag("btn_google_auth")
284-
.padding(top = 24.dp),
285-
backgroundColor = MaterialTheme.appColors.background,
286-
borderColor = MaterialTheme.appColors.primary,
287-
textColor = Color.Unspecified,
288-
onClick = {
289-
onEvent(AuthEvent.SignInGoogle)
290-
}
291-
) {
292-
Row(verticalAlignment = Alignment.CenterVertically) {
293-
Icon(
294-
painter = painterResource(id = R.drawable.ic_auth_google),
295-
contentDescription = null,
296-
tint = Color.Unspecified,
297-
)
298-
Text(
299-
modifier = Modifier
300-
.testTag("txt_google_auth")
301-
.padding(start = 10.dp),
302-
text = stringResource(id = R.string.auth_google)
303-
)
304-
}
305-
}
306-
}
307-
if (state.isFacebookAuthEnabled) {
308-
OpenEdXButton(
309-
width = buttonWidth
310-
.testTag("btn_facebook_auth")
311-
.padding(top = 12.dp),
312-
text = stringResource(id = R.string.auth_facebook),
313-
backgroundColor = MaterialTheme.appColors.authFacebookButtonBackground,
314-
onClick = {
315-
onEvent(AuthEvent.SignInFacebook)
316-
}
317-
) {
318-
Row(verticalAlignment = Alignment.CenterVertically) {
319-
Icon(
320-
painter = painterResource(id = R.drawable.ic_auth_facebook),
321-
contentDescription = null,
322-
tint = MaterialTheme.appColors.buttonText,
323-
)
324-
Text(
325-
modifier = Modifier
326-
.testTag("txt_facebook_auth")
327-
.padding(start = 10.dp),
328-
color = MaterialTheme.appColors.buttonText,
329-
text = stringResource(id = R.string.auth_facebook)
330-
)
331-
}
332-
}
333-
}
334-
if (state.isMicrosoftAuthEnabled) {
335-
OpenEdXButton(
336-
width = buttonWidth
337-
.testTag("btn_microsoft_auth")
338-
.padding(top = 12.dp),
339-
text = stringResource(id = R.string.auth_microsoft),
340-
backgroundColor = MaterialTheme.appColors.authMicrosoftButtonBackground,
341-
onClick = {
342-
onEvent(AuthEvent.SignInMicrosoft)
343-
}
344-
) {
345-
Row(verticalAlignment = Alignment.CenterVertically) {
346-
Icon(
347-
painter = painterResource(id = R.drawable.ic_auth_microsoft),
348-
contentDescription = null,
349-
tint = Color.Unspecified,
350-
)
351-
Text(
352-
modifier = Modifier
353-
.testTag("txt_microsoft_auth")
354-
.padding(start = 10.dp),
355-
color = MaterialTheme.appColors.buttonText,
356-
text = stringResource(id = R.string.auth_microsoft)
357-
)
268+
SocialAuthView(
269+
modifier = buttonWidth,
270+
isGoogleAuthEnabled = state.isGoogleAuthEnabled,
271+
isFacebookAuthEnabled = state.isFacebookAuthEnabled,
272+
isMicrosoftAuthEnabled = state.isMicrosoftAuthEnabled,
273+
isSignIn = true,
274+
) {
275+
onEvent(AuthEvent.SocialSignIn(it))
358276
}
359277
}
360278
}

0 commit comments

Comments
 (0)