Skip to content

Commit 963e9fe

Browse files
authored
feat: add simplified alternatives to Contact permission screens (#1052)
Signed-off-by: Brandon McAnsh <git@bmcreations.dev>
1 parent 300464e commit 963e9fe

8 files changed

Lines changed: 218 additions & 81 deletions

File tree

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
2+
android:width="128dp"
3+
android:height="128dp"
4+
android:viewportWidth="128"
5+
android:viewportHeight="128">
6+
<path
7+
android:pathData="M54.34,60.26L99.71,35.02M64.33,101.05L104.62,32.29H26.04L53.11,60.94L64.33,101.05Z"
8+
android:strokeAlpha="0.5"
9+
android:strokeWidth="5.89366"
10+
android:fillColor="#00000000"
11+
android:strokeColor="#ffffff"
12+
android:fillAlpha="0.5"
13+
android:strokeLineCap="square"/>
14+
</vector>
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
2+
android:width="128dp"
3+
android:height="128dp"
4+
android:viewportWidth="128"
5+
android:viewportHeight="128">
6+
<path
7+
android:pathData="M64,53.27V71.22M64,82.39V82.43M64,24.11L21.38,95.89H106.61L64,24.11Z"
8+
android:strokeAlpha="0.4"
9+
android:strokeWidth="5"
10+
android:fillColor="#00000000"
11+
android:strokeColor="#ffffff"
12+
android:fillAlpha="0.4"
13+
android:strokeLineCap="square"/>
14+
</vector>

apps/flipcash/core/src/main/res/values/strings.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,12 @@
105105
<string name="error_title_ignoredContactPermissions">Are You Sure?</string>
106106
<string name="error_description_ignoredContactPermissions">You won\'t be able to send cash to your contacts</string>
107107

108+
<string name="permissions_title_contactsSimple">Send Money To Your Friends</string>
109+
<string name="permissions_description_contactsSimple">Sync your contacts to find, invite, and pay friends</string>
110+
108111
<string name="permissions_title_contactsRationale">Send Money to Your Friends</string>
112+
<string name="permissions_title_contactsRationaleSimple">Allow Contact Access</string>
113+
<string name="permissions_description_contactsRationaleSimple">Turn on contact access so you can find people, send cash, and message them</string>
109114
<string name="rationale_bullet_contactChoice">You decide which contacts to add</string>
110115
<string name="rationale_bullet_secure">Your information is always secure</string>
111116
<string name="rationale_bullet_changeAccess">Change contact access at any time</string>

apps/flipcash/features/direct-send/src/main/kotlin/com/flipcash/app/directsend/internal/screens/ContactsPermissionGateScreen.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import androidx.compose.runtime.Composable
66
import androidx.compose.runtime.LaunchedEffect
77
import androidx.compose.runtime.getValue
88
import androidx.compose.ui.Modifier
9+
import androidx.compose.ui.res.stringResource
910
import androidx.lifecycle.compose.collectAsStateWithLifecycle
1011
import com.flipcash.app.analytics.Button
1112
import com.flipcash.app.core.send.SendResult
@@ -16,6 +17,7 @@ import com.flipcash.app.permissions.ContactAccessResult
1617
import com.flipcash.app.permissions.internal.contacts.ContactRationaleContent
1718
import com.flipcash.app.permissions.internal.contacts.ContactScreenContent
1819
import com.flipcash.app.permissions.rememberContactAccessHandle
20+
import com.flipcash.features.directsend.R
1921
import com.getcode.libs.analytics.LocalAnalytics
2022
import com.getcode.navigation.flow.flowSharedViewModel
2123
import com.getcode.navigation.flow.rememberFlowNavigator
@@ -103,7 +105,7 @@ internal fun ContactsPermissionGateScreen() {
103105
CodeScaffold(
104106
topBar = {
105107
AppBarWithTitle(
106-
title = "",
108+
title = stringResource(R.string.title_send),
107109
endContent = {
108110
AppBarDefaults.Close { flowNavigator.exitCanceled() }
109111
},
@@ -112,10 +114,11 @@ internal fun ContactsPermissionGateScreen() {
112114
) { innerPadding ->
113115
Box(modifier = Modifier.padding(innerPadding)) {
114116
if (showRationale) {
115-
ContactRationaleContent()
117+
ContactRationaleContent(simplified = true)
116118
} else {
117119
ContactScreenContent(
118120
accessHandle = accessHandle,
121+
simplified = true,
119122
isLoading = state.contactSyncState.loading,
120123
isSuccess = state.contactSyncState.success,
121124
)

apps/flipcash/shared/permissions/src/main/kotlin/com/flipcash/app/permissions/ContactPermissionScreen.kt

Lines changed: 0 additions & 72 deletions
This file was deleted.

apps/flipcash/shared/permissions/src/main/kotlin/com/flipcash/app/permissions/internal/contacts/ContactPermissionScreenContent.kt

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.flipcash.app.permissions.internal.contacts
22

3+
import androidx.compose.foundation.Image
4+
import androidx.compose.foundation.layout.Arrangement
35
import androidx.compose.foundation.layout.Box
46
import androidx.compose.foundation.layout.Column
57
import androidx.compose.foundation.layout.fillMaxSize
@@ -10,6 +12,7 @@ import androidx.compose.runtime.Composable
1012
import androidx.compose.runtime.CompositionLocalProvider
1113
import androidx.compose.ui.Alignment
1214
import androidx.compose.ui.Modifier
15+
import androidx.compose.ui.res.painterResource
1316
import androidx.compose.ui.res.stringResource
1417
import androidx.compose.ui.text.style.TextAlign
1518
import androidx.compose.ui.tooling.preview.Preview
@@ -31,10 +34,21 @@ import com.getcode.util.permissions.rememberContactPermission
3134
@Composable
3235
fun ContactScreenContent(
3336
accessHandle: ContactAccessHandle,
37+
simplified: Boolean = false,
3438
onSkip: (() -> Unit)? = null,
3539
isLoading: Boolean = false,
3640
isSuccess: Boolean = false,
3741
) {
42+
if (simplified) {
43+
SimplifiedContactScreenContent(
44+
accessHandle = accessHandle,
45+
onSkip = onSkip,
46+
isLoading = isLoading,
47+
isSuccess = isSuccess,
48+
)
49+
return
50+
}
51+
3852
CodeScaffold(
3953
bottomBar = {
4054
ContactPermissionBottomBar(
@@ -76,6 +90,74 @@ fun ContactScreenContent(
7690
}
7791
}
7892

93+
@Composable
94+
private fun SimplifiedContactScreenContent(
95+
accessHandle: ContactAccessHandle,
96+
onSkip: (() -> Unit)? = null,
97+
isLoading: Boolean = false,
98+
isSuccess: Boolean = false,
99+
) {
100+
CodeScaffold(
101+
bottomBar = {
102+
ContactPermissionBottomBar(
103+
accessHandle = accessHandle,
104+
onSkip = onSkip,
105+
isLoading = isLoading,
106+
isSuccess = isSuccess,
107+
action = stringResource(R.string.action_continue),
108+
)
109+
}
110+
) { padding ->
111+
Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
112+
Column(
113+
modifier = Modifier.fillMaxWidth(),
114+
verticalArrangement = Arrangement.spacedBy(CodeTheme.dimens.grid.x6),
115+
horizontalAlignment = Alignment.CenterHorizontally,
116+
) {
117+
Image(
118+
painter = painterResource(R.drawable.ic_send_large),
119+
contentDescription = null,
120+
)
121+
Column(
122+
modifier = Modifier.fillMaxWidth(0.8f),
123+
verticalArrangement = Arrangement.spacedBy(CodeTheme.dimens.grid.x2),
124+
horizontalAlignment = Alignment.CenterHorizontally,
125+
) {
126+
Text(
127+
text = stringResource(R.string.permissions_title_contactsSimple),
128+
style = CodeTheme.typography.textLarge,
129+
color = CodeTheme.colors.textMain,
130+
)
131+
Text(
132+
modifier = Modifier.fillMaxWidth(),
133+
text = stringResource(R.string.permissions_description_contactsSimple),
134+
style = CodeTheme.typography.textSmall,
135+
color = CodeTheme.colors.textSecondary,
136+
textAlign = TextAlign.Center,
137+
)
138+
}
139+
Column(
140+
modifier = Modifier.fillMaxWidth(),
141+
verticalArrangement = Arrangement.spacedBy(CodeTheme.dimens.grid.x2),
142+
horizontalAlignment = Alignment.CenterHorizontally,
143+
144+
) {
145+
BulletRow(
146+
painter = painterResource(com.flipcash.core.R.drawable.ic_checklist),
147+
text = stringResource(com.flipcash.core.R.string.rationale_bullet_contactChoice),
148+
textColor = CodeTheme.colors.textMain,
149+
)
150+
BulletRow(
151+
painter = painterResource(com.flipcash.core.R.drawable.ic_people_gear),
152+
text = stringResource(com.flipcash.core.R.string.rationale_bullet_changeAccess),
153+
textColor = CodeTheme.colors.textMain,
154+
)
155+
}
156+
}
157+
}
158+
}
159+
}
160+
79161
@Composable
80162
@Preview
81163
@PreviewWrapper(FlipcashThemeWrapper::class)
@@ -86,4 +168,16 @@ private fun PreviewContactPermissionScreen() {
86168
ContactScreenContent(state.asContactAccessHandle(), onSkip = { })
87169
}
88170
}
171+
}
172+
173+
@Composable
174+
@Preview
175+
@PreviewWrapper(FlipcashThemeWrapper::class)
176+
private fun PreviewSimplifiedContactPermissionScreen() {
177+
CompositionLocalProvider(LocalAnalytics provides StubFlipcashAnalytics()) {
178+
ProvideTestPermissions(granted = emptySet()) {
179+
val state = rememberContactPermission()
180+
ContactScreenContent(state.asContactAccessHandle(), simplified = true)
181+
}
182+
}
89183
}

0 commit comments

Comments
 (0)