Skip to content

Commit

Permalink
Add logout menu in Link wallet (#5470)
Browse files Browse the repository at this point in the history
* Add logout menu in Link wallet

* Add tests

* Update API

* Fix lint issue

* Fix rebase issue
  • Loading branch information
tillh-stripe committed Aug 29, 2022
1 parent d455d48 commit 435d2ba
Show file tree
Hide file tree
Showing 13 changed files with 281 additions and 32 deletions.
2 changes: 2 additions & 0 deletions link/api/link.api
Expand Up @@ -320,6 +320,7 @@ public final class com/stripe/android/link/ui/ComposableSingletons$LinkAppBarKt
public static field lambda-6 Lkotlin/jvm/functions/Function2;
public static field lambda-7 Lkotlin/jvm/functions/Function2;
public static field lambda-8 Lkotlin/jvm/functions/Function2;
public static field lambda-9 Lkotlin/jvm/functions/Function2;
public fun <init> ()V
public final fun getLambda-1$link_release ()Lkotlin/jvm/functions/Function2;
public final fun getLambda-2$link_release ()Lkotlin/jvm/functions/Function2;
Expand All @@ -329,6 +330,7 @@ public final class com/stripe/android/link/ui/ComposableSingletons$LinkAppBarKt
public final fun getLambda-6$link_release ()Lkotlin/jvm/functions/Function2;
public final fun getLambda-7$link_release ()Lkotlin/jvm/functions/Function2;
public final fun getLambda-8$link_release ()Lkotlin/jvm/functions/Function2;
public final fun getLambda-9$link_release ()Lkotlin/jvm/functions/Function2;
}

public final class com/stripe/android/link/ui/ComposableSingletons$PrimaryButtonKt {
Expand Down
2 changes: 2 additions & 0 deletions link/res/values/strings.xml
Expand Up @@ -2,13 +2,15 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
<string name="link">Link</string>
<string name="back">Back</string>
<string name="menu">Menu</string>

<string name="inline_sign_up_header">Save my info for secure 1-click checkout</string>

<string name="sign_up_header">Secure 1-click checkout</string>
<string name="sign_up_message">Pay faster at %1$s and thousands of merchants.</string>
<string name="sign_up_terms">By joining Link, you agree to the &lt;a href=\"https://link.co/terms\"&gt;Terms&lt;/a&gt; and &lt;a href=\"https://link.co/privacy\"&gt;Privacy Policy&lt;/a&gt;.</string>
<string name="sign_up">Join Link</string>
<string name="log_out">Log out of Link</string>

<string name="verification_header">Enter your verification code</string>
<string name="verification_message">Enter the code sent to %1$s to use Link to pay by default.</string>
Expand Down
Expand Up @@ -37,7 +37,8 @@ internal class LinkAppBarStateTest {

val expected = LinkAppBarState(
navigationIcon = R.drawable.ic_link_close,
hideHeader = false,
showHeader = true,
showOverflowMenu = false,
email = null
)

Expand All @@ -54,7 +55,8 @@ internal class LinkAppBarStateTest {

val expected = LinkAppBarState(
navigationIcon = R.drawable.ic_link_close,
hideHeader = false,
showHeader = true,
showOverflowMenu = false,
email = null
)

Expand All @@ -71,7 +73,8 @@ internal class LinkAppBarStateTest {

val expected = LinkAppBarState(
navigationIcon = R.drawable.ic_link_close,
hideHeader = false,
showHeader = true,
showOverflowMenu = false,
email = "someone@stripe.com"
)

Expand All @@ -88,7 +91,8 @@ internal class LinkAppBarStateTest {

val expected = LinkAppBarState(
navigationIcon = R.drawable.ic_link_close,
hideHeader = false,
showHeader = true,
showOverflowMenu = true,
email = "someone@stripe.com"
)

Expand All @@ -105,7 +109,8 @@ internal class LinkAppBarStateTest {

val expected = LinkAppBarState(
navigationIcon = R.drawable.ic_link_back,
hideHeader = true,
showHeader = false,
showOverflowMenu = false,
email = null
)

Expand All @@ -122,7 +127,8 @@ internal class LinkAppBarStateTest {

val expected = LinkAppBarState(
navigationIcon = R.drawable.ic_link_back,
hideHeader = true,
showHeader = false,
showOverflowMenu = false,
email = null
)

Expand All @@ -139,7 +145,8 @@ internal class LinkAppBarStateTest {

val expected = LinkAppBarState(
navigationIcon = R.drawable.ic_link_close,
hideHeader = false,
showHeader = true,
showOverflowMenu = false,
email = null
)

Expand Down
Expand Up @@ -27,26 +27,42 @@ internal class LinkAppBarTest {
}

@Test
fun on_button_click_button_callback_is_called() {
fun on_back_button_click_callback_is_called() {
var count = 0
setContent(onButtonClick = { count++ })
setContent(onBackPress = { count++ })

composeTestRule.onNodeWithContentDescription("Back").performClick()

assertThat(count).isEqualTo(1)
}

@Test
fun on_overflow_button_click_callback_is_called() {
var count = 0
setContent(showBottomSheetContent = { count++ })

composeTestRule.onNodeWithContentDescription("Menu").performClick()

assertThat(count).isEqualTo(1)
}

private fun setContent(
email: String? = null,
onButtonClick: () -> Unit = {}
onBackPress: () -> Unit = {},
onLogout: () -> Unit = {},
showBottomSheetContent: (BottomSheetContent?) -> Unit = {}
) = composeTestRule.setContent {
DefaultLinkTheme {
LinkAppBar(
state = LinkAppBarState(
navigationIcon = R.drawable.ic_link_close,
hideHeader = false,
showHeader = true,
showOverflowMenu = true,
email = email
),
onButtonClick = onButtonClick
onBackPress = onBackPress,
onLogout = onLogout,
showBottomSheetContent = showBottomSheetContent
)
}
}
Expand Down
@@ -0,0 +1,58 @@
package com.stripe.android.link.ui

import androidx.activity.ComponentActivity
import androidx.compose.ui.test.junit4.createAndroidComposeRule
import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performClick
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.google.common.truth.Truth.assertThat
import com.stripe.android.link.theme.DefaultLinkTheme
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith

@RunWith(AndroidJUnit4::class)
class LinkLogoutSheetTest {

@get:Rule
val composeTestRule = createAndroidComposeRule<ComponentActivity>()

@Test
fun on_logout_button_click_callback_is_called() {
val clickRecorder = MockClickRecorder()
setContent(clickRecorder)

composeTestRule.onNodeWithText("Log out of Link").performClick()

assertThat(clickRecorder).isEqualTo(MockClickRecorder(logoutClicked = true))
}

@Test
fun on_cancel_button_click_callback_is_called() {
val clickRecorder = MockClickRecorder()
setContent(clickRecorder)

composeTestRule.onNodeWithText("Cancel").performClick()

assertThat(clickRecorder).isEqualTo(MockClickRecorder(cancelClicked = true))
}

private fun setContent(
clickRecorder: MockClickRecorder
) = composeTestRule.setContent {
DefaultLinkTheme {
LinkLogoutSheet(
onLogoutClick = clickRecorder::onLogoutClicked,
onCancelClick = clickRecorder::onCancelClick
)
}
}

private data class MockClickRecorder(
var logoutClicked: Boolean = false,
var cancelClicked: Boolean = false
) {
fun onLogoutClicked() { logoutClicked = true }
fun onCancelClick() { cancelClicked = true }
}
}
13 changes: 12 additions & 1 deletion link/src/main/java/com/stripe/android/link/LinkActivity.kt
Expand Up @@ -125,7 +125,18 @@ internal class LinkActivity : ComponentActivity() {

LinkAppBar(
state = appBarState,
onButtonClick = { viewModel.navigator.onBack(userInitiated = true) }
onBackPressed = viewModel::onBackPressed,
onLogout = viewModel::logout,
showBottomSheetContent = {
if (it == null) {
coroutineScope.launch {
sheetState.hide()
bottomSheetContent = null
}
} else {
bottomSheetContent = it
}
}
)

NavHost(navController, LinkScreen.Loading.route) {
Expand Down
Expand Up @@ -49,6 +49,15 @@ internal class LinkActivityViewModel @Inject internal constructor(
confirmationManager.setupPaymentLauncher(activityResultCaller)
}

fun onBackPressed() {
navigator.onBack(userInitiated = true)
}

fun logout() {
navigator.dismiss()
linkAccountManager.logout()
}

fun unregisterFromActivity() {
confirmationManager.invalidatePaymentLauncher()
}
Expand Down

0 comments on commit 435d2ba

Please sign in to comment.