Skip to content

Commit 6521af5

Browse files
author
Jeff Yanta
committed
Merge branch 'develop'
2 parents e961279 + 9726bc0 commit 6521af5

14 files changed

Lines changed: 114 additions & 183 deletions

File tree

api/src/main/java/com/getcode/analytics/AnalyticsManager.kt

Lines changed: 32 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,19 @@ import timber.log.Timber
1717
import javax.inject.Inject
1818
import javax.inject.Singleton
1919

20+
enum class Action(val value: String) {
21+
CreateAccount("Action: Create Account"),
22+
EnterPhone("Action: Enter Phone"),
23+
VerifyPhone("Action: Verify Phone"),
24+
ConfirmAccessKey("Action: Confirm Access Key"),
25+
CompletedOnboarding("Action: Completed Onboarding"),
26+
}
27+
28+
enum class ActionSource(val value: String) {
29+
AccessKeySaved("Saved to Photos"),
30+
AccessKeyWroteDown("Wrote it Down")
31+
}
32+
2033
@Singleton
2134
class AnalyticsManager @Inject constructor(
2235
private val mixpanelAPI: MixpanelAPI
@@ -40,10 +53,6 @@ class AnalyticsManager @Inject constructor(
4053
Timber.i("App init time: " + (System.currentTimeMillis() - (timeAppInit ?: 0)))
4154
}
4255

43-
override fun open(screen: Screen) {
44-
track(Name.Open, Pair(Property.Screen, screen.value))
45-
}
46-
4756
override fun logout() {
4857
track(Name.Logout)
4958
}
@@ -265,23 +274,35 @@ class AnalyticsManager @Inject constructor(
265274
)
266275
}
267276

277+
override fun action(action: Action, source: ActionSource?) {
278+
track(
279+
action = action,
280+
properties = source?.let { arrayOf(Property.Source to it.value) }.orEmpty()
281+
)
282+
}
283+
268284
private fun track(event: Name, vararg properties: Pair<Property, String>) {
285+
track(name = event.value, properties = properties)
286+
}
287+
288+
private fun track(action: Action, vararg properties: Pair<Property, String>) {
289+
track(name = action.value, properties = properties)
290+
}
291+
292+
private fun track(name: String, vararg properties: Pair<Property, String>) {
269293
if (BuildConfig.DEBUG) {
270-
Timber.d("debug track $event, ${properties.map { "${it.first.name}, ${it.second}" }}")
294+
Timber.d("debug track $name, ${properties.map { "${it.first.name}, ${it.second}" }}")
271295
return
272296
} //no logging in debug
273297

274298
val jsonObject = JSONObject()
275299
properties.forEach { property ->
276300
jsonObject.put(property.first.value, property.second)
277301
}
278-
mixpanelAPI.track(event.value, jsonObject)
302+
mixpanelAPI.track(name, jsonObject)
279303
}
280304

281305
enum class Name(val value: String) {
282-
//Open
283-
Open("Open"),
284-
285306
//Account
286307
Logout("Logout"),
287308
Login("Login"),
@@ -312,7 +333,7 @@ class AnalyticsManager @Inject constructor(
312333
Recompute("Recompute"),
313334

314335
// App Settings
315-
AutoStartCamera("Auto Start Camera"),
336+
AutoStartCamera("Camera Auto Start"),
316337
RequireBiometrics("Require Biometrics")
317338
}
318339

@@ -350,25 +371,8 @@ class AnalyticsManager @Inject constructor(
350371
VoidingSend("Voiding Send"),
351372

352373
PercentDelta("Percent Delta"),
353-
}
354374

355-
enum class Screen(val value: String) {
356-
GetKin("Get Kin Screen"),
357-
GiveKin("Give Kin Screen"),
358-
RequestKin("Request Kin Screen"),
359-
Balance("Balance Screen"),
360-
Faq("FAQ Screen"),
361-
Settings("Settings Screen"),
362-
BuyAndSellKin("Buy and Sell Kin Screen"),
363-
Deposit("Deposit Screen"),
364-
Backup("Backup Screen"),
365-
Withdraw("Withdraw Screen"),
366-
Debug("Debug Screen"),
367-
Share("Share Screen"),
368-
AppSettings("App Settings"),
369-
ForceUpgrade("Force Upgrade"),
370-
BuyMoreKin("Buy More Kin Screen"),
371-
SendKin("Send Kin Screen"),
375+
Source("Source"),
372376
}
373377

374378
enum class BillPresentationStyle(val value: String) {
@@ -385,5 +389,4 @@ class AnalyticsManager @Inject constructor(
385389
Hidden("Hidden"),
386390
TimedOut("Timed Out"),
387391
}
388-
389392
}

api/src/main/java/com/getcode/analytics/AnalyticsService.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import com.getcode.solana.keys.PublicKey
99
interface AnalyticsService {
1010
fun onAppStart()
1111
fun onAppStarted()
12-
fun open(screen: AnalyticsManager.Screen)
1312
fun login(ownerPublicKey: String, autoCompleteCount: Int, inputChangeCount: Int)
1413
fun logout()
1514
fun createAccount(isSuccessful: Boolean, ownerPublicKey: String?)
@@ -50,12 +49,13 @@ interface AnalyticsService {
5049
fun unintentionalLogout()
5150

5251
fun appSettingToggled(setting: AppSetting, value: Boolean)
52+
53+
fun action(action: Action, source: ActionSource? = null)
5354
}
5455

5556
class AnalyticsServiceNull : AnalyticsService {
5657
override fun onAppStart() = Unit
5758
override fun onAppStarted() = Unit
58-
override fun open(screen: AnalyticsManager.Screen) = Unit
5959
override fun login(ownerPublicKey: String, autoCompleteCount: Int, inputChangeCount: Int) = Unit
6060
override fun logout() = Unit
6161
override fun createAccount(isSuccessful: Boolean, ownerPublicKey: String?) = Unit
@@ -94,4 +94,5 @@ class AnalyticsServiceNull : AnalyticsService {
9494
override fun backgroundSwapInitiated() = Unit
9595
override fun unintentionalLogout() = Unit
9696
override fun appSettingToggled(setting: AppSetting, value: Boolean) = Unit
97+
override fun action(action: Action, source: ActionSource?) = Unit
9798
}

app/src/main/java/com/getcode/analytics/AnalyticsScreenWatcher.kt

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

app/src/main/java/com/getcode/manager/AuthManager.kt

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,36 @@ class AuthManager @Inject constructor(
8686
return login(entropyB64, isSoftLogin = true)
8787
}
8888

89+
fun createAccount(
90+
entropyB64: String,
91+
rollbackOnError: Boolean = false,
92+
): Completable {
93+
if (entropyB64.isEmpty()) {
94+
taggedTrace("provided entropy was empty", type = TraceType.Error)
95+
sessionManager.clear()
96+
return Completable.complete()
97+
}
98+
99+
return Single.create {
100+
softLoginDisabled = true
101+
102+
if (!Database.isOpen()) {
103+
Database.init(context, entropyB64)
104+
}
105+
106+
val originalSessionState = SessionManager.authState.value
107+
sessionManager.set(entropyB64)
108+
109+
it.onSuccess(originalSessionState)
110+
}.flatMapCompletable {
111+
fetchAdditionalAccountData(context, entropyB64,
112+
isSoftLogin = false,
113+
rollbackOnError = rollbackOnError,
114+
originalSessionState = it
115+
)
116+
}.doOnError { softLoginDisabled = false }
117+
}
118+
89119
fun login(
90120
entropyB64: String,
91121
isSoftLogin: Boolean = false,

app/src/main/java/com/getcode/navigation/screens/ChatScreens.kt

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,8 @@ import coil3.request.ImageRequest
3434
import coil3.request.error
3535
import com.getcode.R
3636
import com.getcode.analytics.AnalyticsManager
37-
import com.getcode.analytics.AnalyticsScreenWatcher
3837
import com.getcode.model.ID
3938
import com.getcode.navigation.core.LocalCodeNavigator
40-
import com.getcode.theme.BrandLight
4139
import com.getcode.theme.CodeTheme
4240
import com.getcode.ui.components.SheetTitleDefaults
4341
import com.getcode.ui.components.SheetTitleText
@@ -126,11 +124,6 @@ data object BalanceModal : ChatGraph, ModalRoot {
126124
BalanceScreen(state = state, dispatch = viewModel::dispatchEvent)
127125
}
128126

129-
AnalyticsScreenWatcher(
130-
lifecycleOwner = LocalLifecycleOwner.current,
131-
event = AnalyticsManager.Screen.Balance
132-
)
133-
134127
LifecycleEffect(
135128
onDisposed = {
136129
val disposedScreen = navigator.lastItem

app/src/main/java/com/getcode/navigation/screens/LoginScreens.kt

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@ import androidx.compose.ui.res.stringResource
77
import cafe.adriel.voyager.core.screen.ScreenKey
88
import cafe.adriel.voyager.core.screen.uniqueScreenKey
99
import cafe.adriel.voyager.hilt.getViewModel
10+
import com.getcode.LocalAnalytics
1011
import com.getcode.R
12+
import com.getcode.analytics.Action
13+
import com.getcode.analytics.AnalyticsManager
1114
import com.getcode.navigation.core.LocalCodeNavigator
1215
import com.getcode.ui.utils.getStackScopedViewModel
1316
import com.getcode.view.login.AccessKey
@@ -35,11 +38,14 @@ data class LoginScreen(val seed: String? = null) : LoginGraph {
3538
@Composable
3639
override fun Content() {
3740
val navigator = LocalCodeNavigator.current
41+
val analytics = LocalAnalytics.current
42+
3843
if (seed != null) {
3944
SeedDeepLink(getViewModel(), seed)
4045
} else {
4146
LoginHome(
4247
createAccount = {
48+
analytics.action(Action.CreateAccount)
4349
navigator.push(LoginPhoneVerificationScreen(isNewAccount = true))
4450
},
4551
login = {
@@ -165,7 +171,7 @@ sealed interface CodeLoginPermission: Parcelable {
165171
}
166172

167173
@Parcelize
168-
data class PermissionRequestScreen(val permission: CodeLoginPermission) : LoginGraph {
174+
data class PermissionRequestScreen(val permission: CodeLoginPermission, val fromOnboarding: Boolean = false) : LoginGraph {
169175

170176
@IgnoredOnParcel
171177
override val key: ScreenKey = uniqueScreenKey
@@ -174,11 +180,11 @@ data class PermissionRequestScreen(val permission: CodeLoginPermission) : LoginG
174180
override fun Content() {
175181
when (permission) {
176182
CodeLoginPermission.Camera -> {
177-
CameraPermission()
183+
CameraPermission(fromOnboarding = fromOnboarding)
178184
}
179185

180186
CodeLoginPermission.Notifications -> {
181-
NotificationPermission()
187+
NotificationPermission(fromOnboarding = fromOnboarding)
182188
}
183189
}
184190

app/src/main/java/com/getcode/navigation/screens/MainScreens.kt

Lines changed: 0 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1,60 +1,18 @@
11
package com.getcode.navigation.screens
22

3-
import androidx.compose.foundation.Image
4-
import androidx.compose.foundation.layout.Arrangement
5-
import androidx.compose.foundation.layout.Box
6-
import androidx.compose.foundation.layout.Column
7-
import androidx.compose.foundation.layout.Spacer
8-
import androidx.compose.foundation.layout.WindowInsets
9-
import androidx.compose.foundation.layout.fillMaxSize
10-
import androidx.compose.foundation.layout.fillMaxWidth
11-
import androidx.compose.foundation.layout.navigationBars
12-
import androidx.compose.foundation.layout.padding
13-
import androidx.compose.foundation.layout.windowInsetsPadding
14-
import androidx.compose.material.Text
153
import androidx.compose.runtime.Composable
16-
import androidx.compose.runtime.getValue
17-
import androidx.compose.runtime.mutableStateOf
18-
import androidx.compose.runtime.remember
19-
import androidx.compose.runtime.setValue
20-
import androidx.compose.ui.Alignment
21-
import androidx.compose.ui.Modifier
22-
import androidx.compose.ui.draw.alpha
23-
import androidx.compose.ui.geometry.Rect
24-
import androidx.compose.ui.layout.boundsInParent
25-
import androidx.compose.ui.layout.boundsInWindow
26-
import androidx.compose.ui.layout.onPlaced
27-
import androidx.compose.ui.platform.LocalContext
284
import androidx.compose.ui.platform.LocalLifecycleOwner
29-
import androidx.compose.ui.platform.LocalTextToolbar
30-
import androidx.compose.ui.platform.TextToolbar
31-
import androidx.compose.ui.res.painterResource
325
import androidx.compose.ui.res.stringResource
33-
import androidx.compose.ui.text.style.TextAlign
346
import androidx.lifecycle.Lifecycle
357
import cafe.adriel.voyager.core.screen.ScreenKey
368
import cafe.adriel.voyager.core.screen.uniqueScreenKey
379
import cafe.adriel.voyager.hilt.getViewModel
38-
import com.getcode.LocalDownloadQrCode
3910
import com.getcode.R
4011
import com.getcode.analytics.AnalyticsManager
41-
import com.getcode.analytics.AnalyticsScreenWatcher
4212
import com.getcode.model.KinAmount
4313
import com.getcode.navigation.core.LocalCodeNavigator
44-
import com.getcode.theme.CodeTheme
45-
import com.getcode.ui.components.ButtonState
46-
import com.getcode.ui.components.Cloudy
47-
import com.getcode.ui.components.CodeButton
48-
import com.getcode.ui.components.CodeCircularProgressIndicator
49-
import com.getcode.ui.components.Row
50-
import com.getcode.ui.components.SelectionContainer
51-
import com.getcode.ui.components.rememberSelectionState
5214
import com.getcode.ui.utils.RepeatOnLifecycle
5315
import com.getcode.ui.utils.getActivityScopedViewModel
54-
import com.getcode.ui.utils.rememberedLongClickable
55-
import com.getcode.ui.utils.swallowClicks
56-
import com.getcode.util.shareDownloadLink
57-
import com.getcode.util.vibration.LocalVibrator
5816
import com.getcode.utils.trace
5917
import com.getcode.view.download.ShareDownloadScreen
6018
import com.getcode.view.main.account.AccountHome
@@ -138,11 +96,6 @@ data object GiveKinModal : AppScreen(), MainGraph, ModalRoot {
13896
) {
13997
GiveKinScreen(getViewModel())
14098
}
141-
142-
AnalyticsScreenWatcher(
143-
lifecycleOwner = LocalLifecycleOwner.current,
144-
event = AnalyticsManager.Screen.GiveKin
145-
)
14699
}
147100
}
148101

@@ -190,11 +143,6 @@ data class RequestKinModal(
190143
content()
191144
}
192145
}
193-
194-
AnalyticsScreenWatcher(
195-
lifecycleOwner = LocalLifecycleOwner.current,
196-
event = AnalyticsManager.Screen.RequestKin
197-
)
198146
}
199147
}
200148

@@ -220,11 +168,6 @@ data object AccountModal : MainGraph, ModalRoot {
220168
) {
221169
AccountHome(viewModel)
222170
}
223-
224-
AnalyticsScreenWatcher(
225-
lifecycleOwner = LocalLifecycleOwner.current,
226-
event = AnalyticsManager.Screen.Settings
227-
)
228171
}
229172
}
230173

@@ -240,11 +183,6 @@ data object ShareDownloadLinkModal : MainGraph, ModalRoot {
240183
) {
241184
ShareDownloadScreen()
242185
}
243-
244-
AnalyticsScreenWatcher(
245-
lifecycleOwner = LocalLifecycleOwner.current,
246-
event = AnalyticsManager.Screen.Share
247-
)
248186
}
249187
}
250188

0 commit comments

Comments
 (0)