Skip to content

Commit

Permalink
MBL-1232: Unify and verify sign up/log in buttons (#1961)
Browse files Browse the repository at this point in the history
  • Loading branch information
Arkariang committed Feb 29, 2024
1 parent 925af00 commit 216632b
Show file tree
Hide file tree
Showing 8 changed files with 197 additions and 127 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,13 @@ import com.kickstarter.ui.IntentKey
import com.kickstarter.ui.activities.CommentsActivity
import com.kickstarter.ui.activities.CreatorBioActivity
import com.kickstarter.ui.activities.LoginActivity
import com.kickstarter.ui.activities.OAuthActivity
import com.kickstarter.ui.activities.PaymentMethodsSettingsActivity
import com.kickstarter.ui.activities.PreLaunchProjectPageActivity
import com.kickstarter.ui.activities.ProjectPageActivity
import com.kickstarter.ui.activities.ProjectUpdatesActivity
import com.kickstarter.ui.activities.ReportProjectActivity
import com.kickstarter.ui.activities.ResetPasswordActivity
import com.kickstarter.ui.activities.SetPasswordActivity
import com.kickstarter.ui.activities.SignupActivity
import com.kickstarter.ui.activities.UpdateActivity
import com.kickstarter.ui.activities.VideoActivity
import com.kickstarter.ui.data.LoginReason
Expand All @@ -34,20 +32,6 @@ fun Intent.getPreLaunchProjectActivity(context: Context, slug: String?, project:
return intent
}

fun Intent.getStartLoginIntent(isOAuthEnabled: Boolean, context: Context): Intent {
return if (isOAuthEnabled) {
this.setClass(context, OAuthActivity::class.java)
} else
this.setClass(context, LoginActivity::class.java)
}

fun Intent.getSignupIntent(isOAuthEnabled: Boolean, context: Context): Intent {
return if (isOAuthEnabled) {
this.setClass(context, OAuthActivity::class.java)
} else
this.setClass(context, SignupActivity::class.java)
}

/**
* Retruns the Intent for start the PaymentMethodsSettigns activity
* @param context
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ import com.kickstarter.ui.data.ActivityResult.Companion.create
import com.kickstarter.ui.data.LoginReason
import com.kickstarter.ui.extensions.startDisclaimerChromeTab
import com.kickstarter.ui.extensions.startLogin
import com.kickstarter.ui.extensions.startOauthActivity
import com.kickstarter.ui.extensions.startSignup
import com.kickstarter.viewmodels.LoginToutViewModel
import io.reactivex.Observable
Expand All @@ -54,6 +55,7 @@ class LoginToutActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
var darkModeEnabled = false
var oauthFlagEnabled = false
this.getEnvironment()?.let { env ->
environment = env
viewModelFactory = LoginToutViewModel.Factory(env)
Expand All @@ -63,6 +65,7 @@ class LoginToutActivity : ComponentActivity() {
theme = env.sharedPreferences()
?.getInt(SharedPreferenceKey.APP_THEME, AppThemes.MATCH_SYSTEM.ordinal)
?: AppThemes.MATCH_SYSTEM.ordinal
oauthFlagEnabled = env.featureFlagClient()?.getBoolean(FlagKey.ANDROID_OAUTH) ?: false
}

setContent {
Expand Down Expand Up @@ -93,6 +96,10 @@ class LoginToutActivity : ComponentActivity() {
onCookiePolicyClicked = { viewModel.inputs.disclaimerItemClicked(DisclaimerItems.COOKIES) },
onHelpClicked = {
viewModel.inputs.disclaimerItemClicked(DisclaimerItems.HELP)
},
featureFlagState = oauthFlagEnabled,
onSignUpOrLogInClicked = {
this@LoginToutActivity.startOauthActivity()
}
)
}
Expand All @@ -116,14 +123,14 @@ class LoginToutActivity : ComponentActivity() {
viewModel.outputs.startLoginActivity()
.observeOn(AndroidSchedulers.mainThread())
.subscribe {
this.startLogin(it)
this.startLogin()
}
.addToDisposable(disposables)

viewModel.outputs.startSignupActivity()
.observeOn(AndroidSchedulers.mainThread())
.subscribe {
this.startSignup(it)
this.startSignup()
}
.addToDisposable(disposables)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,8 @@ fun LoginToutScreenPreview() {
{},
{},
{},
false,
{}
)
}
}
Expand All @@ -68,7 +70,8 @@ enum class LoginToutTestTag {
FACEBOOK_DISCLAIMER,
EMAIL_LOG_IN_BUTTON,
EMAIL_SIGN_UP_BUTTON,
TOU_PP_COOKIE_DISCLAIMER
TOU_PP_COOKIE_DISCLAIMER,
LOG_IN_OR_SIGN_UP
}

@Composable
Expand All @@ -80,7 +83,9 @@ fun LoginToutScreen(
onTermsOfUseClicked: () -> Unit,
onPrivacyPolicyClicked: () -> Unit,
onCookiePolicyClicked: () -> Unit,
onHelpClicked: () -> Unit
onHelpClicked: () -> Unit,
featureFlagState: Boolean = false,
onSignUpOrLogInClicked: () -> Unit
) {
var expanded by remember { mutableStateOf(false) }
Scaffold(
Expand Down Expand Up @@ -172,22 +177,30 @@ fun LoginToutScreen(

Spacer(modifier = Modifier.height(dimensions.paddingMedium))

KSPrimaryGreenButton(
modifier = Modifier.testTag(LoginToutTestTag.EMAIL_LOG_IN_BUTTON.name),
onClickAction = onEmailLoginClicked,
text = stringResource(id = R.string.login_buttons_log_in_email),
isEnabled = true
)

Spacer(modifier = Modifier.height(dimensions.paddingMedium))

KSSecondaryGreyButton(
modifier = Modifier.testTag(LoginToutTestTag.EMAIL_SIGN_UP_BUTTON.name),
onClickAction = onEmailSignupClicked,
text = stringResource(id = R.string.signup_button_email),
isEnabled = true
)

if (featureFlagState) {
KSPrimaryGreenButton(
modifier = Modifier.testTag(LoginToutTestTag.LOG_IN_OR_SIGN_UP.name),
onClickAction = onSignUpOrLogInClicked,
text = stringResource(id = R.string.discovery_onboarding_buttons_signup_or_login),
isEnabled = true
)
} else {
KSPrimaryGreenButton(
modifier = Modifier.testTag(LoginToutTestTag.EMAIL_LOG_IN_BUTTON.name),
onClickAction = onEmailLoginClicked,
text = stringResource(id = R.string.login_buttons_log_in_email),
isEnabled = true
)

Spacer(modifier = Modifier.height(dimensions.paddingMedium))

KSSecondaryGreyButton(
modifier = Modifier.testTag(LoginToutTestTag.EMAIL_SIGN_UP_BUTTON.name),
onClickAction = onEmailSignupClicked,
text = stringResource(id = R.string.signup_button_email),
isEnabled = true
)
}
Spacer(modifier = Modifier.height(dimensions.paddingMedium))

LogInSignUpClickableDisclaimerText(
Expand Down
19 changes: 13 additions & 6 deletions app/src/main/java/com/kickstarter/ui/extensions/ActivityExt.kt
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,11 @@ import com.kickstarter.libs.utils.Secrets
import com.kickstarter.libs.utils.TransitionUtils
import com.kickstarter.libs.utils.UrlUtils
import com.kickstarter.libs.utils.extensions.getCreatorBioWebViewActivityIntent
import com.kickstarter.libs.utils.extensions.getLoginActivityIntent
import com.kickstarter.libs.utils.extensions.getPreLaunchProjectActivity
import com.kickstarter.libs.utils.extensions.getProjectUpdatesActivityIntent
import com.kickstarter.libs.utils.extensions.getReportProjectActivityIntent
import com.kickstarter.libs.utils.extensions.getRootCommentsActivityIntent
import com.kickstarter.libs.utils.extensions.getSignupIntent
import com.kickstarter.libs.utils.extensions.getStartLoginIntent
import com.kickstarter.libs.utils.extensions.getUpdatesActivityIntent
import com.kickstarter.libs.utils.extensions.getVideoActivityIntent
import com.kickstarter.libs.utils.extensions.reduceToPreLaunchProject
Expand All @@ -37,6 +36,8 @@ import com.kickstarter.ui.IntentKey
import com.kickstarter.ui.activities.DisclaimerItems
import com.kickstarter.ui.activities.HelpActivity
import com.kickstarter.ui.activities.LoginToutActivity
import com.kickstarter.ui.activities.OAuthActivity
import com.kickstarter.ui.activities.SignupActivity
import com.kickstarter.ui.data.PledgeData
import com.kickstarter.ui.data.PledgeReason
import com.kickstarter.ui.data.ProjectData
Expand Down Expand Up @@ -233,14 +234,20 @@ fun Activity.startPreLaunchProjectActivity(project: Project, previousScreen: Str
TransitionUtils.transition(this, TransitionUtils.slideInFromRight())
}

fun Activity.startLogin(isOauthPathEnabled: Boolean) {
val intent = Intent().getStartLoginIntent(isOauthPathEnabled, this)
fun Activity.startOauthActivity() {
val intent = Intent().setClass(this, OAuthActivity::class.java)
startActivityForResult(intent, ActivityRequestCodes.LOGIN_FLOW)
TransitionUtils.transition(this, TransitionUtils.slideInFromRight())
}

fun Activity.startSignup(isOauthPathEnabled: Boolean) {
val intent = Intent().getSignupIntent(isOauthPathEnabled, this)
fun Activity.startLogin() {
val intent = Intent().getLoginActivityIntent(this)
startActivityForResult(intent, ActivityRequestCodes.LOGIN_FLOW)
TransitionUtils.transition(this, TransitionUtils.slideInFromRight())
}

fun Activity.startSignup() {
val intent = Intent().setClass(this, SignupActivity::class.java)
startActivityForResult(intent, ActivityRequestCodes.LOGIN_FLOW)
TransitionUtils.transition(this, TransitionUtils.slideInFromRight())
}
Expand Down
22 changes: 11 additions & 11 deletions app/src/main/java/com/kickstarter/viewmodels/LoginToutViewModel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -79,10 +79,10 @@ interface LoginToutViewModel {
fun startFacebookConfirmationActivity(): Observable<Pair<ErrorEnvelope.FacebookUser, String>>

/** Emits when the login activity should be started. */
fun startLoginActivity(): Observable<Boolean>
fun startLoginActivity(): Observable<Unit>

/** Emits when the signup activity should be started. */
fun startSignupActivity(): Observable<Boolean>
fun startSignupActivity(): Observable<Unit>

/** Emits when a user has successfully logged in using Facebook, but has require two-factor authentication enabled. */
fun startTwoFactorChallenge(): Observable<Unit>
Expand Down Expand Up @@ -143,14 +143,14 @@ interface LoginToutViewModel {
@VisibleForTesting
val facebookAccessToken = PublishSubject.create<String>()
private val facebookLoginClick = PublishSubject.create<List<String>>()
private val loginClick = PublishSubject.create<Boolean>()
private val loginClick = PublishSubject.create<Unit>()
private val onResetPasswordFacebookErrorDialogClicked = PublishSubject.create<Unit>()
private val onLoginFacebookErrorDialogClicked = PublishSubject.create<Unit>()

@VisibleForTesting
val loginError = PublishSubject.create<ErrorEnvelope?>()
private val loginReason = PublishSubject.create<LoginReason>()
private val signupClick = PublishSubject.create<Boolean>()
private val signupClick = PublishSubject.create<Unit>()
private val disclaimerItemClicked = PublishSubject.create<DisclaimerItems>()

@VisibleForTesting
Expand All @@ -159,8 +159,8 @@ interface LoginToutViewModel {
private val showFacebookErrorDialog = BehaviorSubject.create<Unit>()
private val startResetPasswordActivity = BehaviorSubject.create<Unit>()
private val startFacebookConfirmationActivity: Observable<Pair<ErrorEnvelope.FacebookUser, String>>
private val startLoginActivity: Observable<Boolean>
private val startSignupActivity: Observable<Boolean>
private val startLoginActivity: Observable<Unit>
private val startSignupActivity: Observable<Unit>
private val showDisclaimerActivity: Observable<DisclaimerItems>

private val finishOauthWithSuccessfulResult = BehaviorSubject.create<Unit>()
Expand Down Expand Up @@ -191,11 +191,11 @@ interface LoginToutViewModel {
}

override fun loginClick() {
loginClick.onNext(environment.featureFlagClient()?.getBoolean(FlagKey.ANDROID_OAUTH) ?: false)
loginClick.onNext(Unit)
}

override fun signupClick() {
signupClick.onNext(environment.featureFlagClient()?.getBoolean(FlagKey.ANDROID_OAUTH) ?: false)
signupClick.onNext(Unit)
}

override fun disclaimerItemClicked(disclaimerItem: DisclaimerItems) {
Expand Down Expand Up @@ -240,11 +240,11 @@ interface LoginToutViewModel {
return startFacebookConfirmationActivity
}

override fun startLoginActivity(): Observable<Boolean> {
override fun startLoginActivity(): Observable<Unit> {
return startLoginActivity
}

override fun startSignupActivity(): Observable<Boolean> {
override fun startSignupActivity(): Observable<Unit> {
return startSignupActivity
}

Expand Down Expand Up @@ -345,7 +345,7 @@ interface LoginToutViewModel {

onLoginFacebookErrorDialogClicked
.subscribe {
startLoginActivity.onNext((environment.featureFlagClient()?.getBoolean(FlagKey.ANDROID_OAUTH) ?: false))
startLoginActivity.onNext(Unit)
}
.addToDisposable(disposables)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -133,28 +133,4 @@ class IntentExtTest : KSRobolectricTestCase() {
assertEquals(intent.component?.className, "com.kickstarter.ui.activities.SetPasswordActivity")
assertEquals(intent.extras?.get(IntentKey.EMAIL), "test@kickstarter.com")
}

@Test
fun testStartLoginIntent() {

// - Simulates feature flag off
val intentOldFlow = Intent().getStartLoginIntent(isOAuthEnabled = false, context())
assertEquals(intentOldFlow.component?.className, "com.kickstarter.ui.activities.LoginActivity")

// - Simulates feature flag on
val intentNewFlow = Intent().getStartLoginIntent(isOAuthEnabled = true, context())
assertEquals(intentNewFlow.component?.className, "com.kickstarter.ui.activities.OAuthActivity")
}

@Test
fun testStartSignupIntent() {

// - Simulates feature flag off
val intentOldFlow = Intent().getSignupIntent(isOAuthEnabled = false, context())
assertEquals(intentOldFlow.component?.className, "com.kickstarter.ui.activities.SignupActivity")

// - Simulates feature flag on
val intentNewFlow = Intent().getSignupIntent(isOAuthEnabled = true, context())
assertEquals(intentNewFlow.component?.className, "com.kickstarter.ui.activities.OAuthActivity")
}
}

0 comments on commit 216632b

Please sign in to comment.