Skip to content

Commit 9149ee8

Browse files
authored
Merge pull request #400 from code-payments/chore/convert-startuplog-to-trace
chore: convert startup log to trace
2 parents 6a178f3 + d4d11a3 commit 9149ee8

File tree

14 files changed

+118
-74
lines changed

14 files changed

+118
-74
lines changed

api/src/main/java/com/getcode/db/AppDatabase.kt

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,9 @@ import androidx.room.Room
88
import androidx.room.RoomDatabase
99
import androidx.room.TypeConverters
1010
import androidx.room.migration.AutoMigrationSpec
11-
import androidx.room.migration.Migration
12-
import androidx.sqlite.db.SupportSQLiteDatabase
1311
import com.getcode.model.*
1412
import com.getcode.network.repository.decodeBase64
15-
import com.getcode.utils.startupLog
13+
import com.getcode.utils.trace
1614
import com.getcode.vendor.Base58
1715
import io.reactivex.rxjava3.core.BackpressureStrategy
1816
import io.reactivex.rxjava3.subjects.BehaviorSubject
@@ -73,7 +71,7 @@ object Database {
7371
fun requireInstance() = instance!!
7472

7573
fun init(context: Context, entropyB64: String) {
76-
startupLog("database init start")
74+
trace("database init start")
7775
instance?.close()
7876
val dbUniqueName = Base58.encode(entropyB64.toByteArray().subByteArray(0, 3))
7977
dbName = "$dbNamePrefix-$dbUniqueName$dbNameSuffix"
@@ -89,7 +87,7 @@ object Database {
8987
instance?.conversationMessageRemoteKeyDao()?.clearRemoteKeys()
9088

9189
isInitSubject.onNext(true)
92-
startupLog("database init end")
90+
trace("database init end")
9391
}
9492

9593
fun close() {

api/src/main/java/com/getcode/network/BalanceController.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import com.getcode.solana.organizer.Organizer
1616
import com.getcode.solana.organizer.Tray
1717
import com.getcode.utils.FormatUtils
1818
import com.getcode.utils.network.NetworkConnectivityListener
19-
import com.getcode.utils.startupLog
19+
import com.getcode.utils.trace
2020
import dagger.hilt.android.qualifiers.ApplicationContext
2121
import io.reactivex.rxjava3.core.Completable
2222
import kotlinx.coroutines.CoroutineScope
@@ -125,7 +125,7 @@ open class BalanceController @Inject constructor(
125125
}
126126

127127
fun fetchBalance(): Completable {
128-
startupLog("fetchBalance")
128+
trace("fetchBalance")
129129
if (SessionManager.isAuthenticated() != true) {
130130
Timber.d("FetchBalance - Not authenticated")
131131
return Completable.complete()

api/src/main/java/com/getcode/network/client/TransactionReceiver.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package com.getcode.network.client
22

33
import android.content.Context
44
import com.getcode.model.Kin
5-
import com.getcode.model.intents.IntentDeposit
65
import com.getcode.model.intents.IntentPublicTransfer
76
import com.getcode.model.intents.IntentReceive
87
import com.getcode.model.intents.IntentRemoteReceive
@@ -12,7 +11,7 @@ import com.getcode.solana.organizer.GiftCardAccount
1211
import com.getcode.solana.organizer.Organizer
1312
import com.getcode.solana.organizer.Tray
1413
import com.getcode.utils.ErrorUtils
15-
import com.getcode.utils.startupLog
14+
import com.getcode.utils.trace
1615
import dagger.hilt.android.qualifiers.ApplicationContext
1716
import io.reactivex.rxjava3.core.Completable
1817
import timber.log.Timber
@@ -122,7 +121,7 @@ class TransactionReceiver @Inject constructor(
122121
}
123122

124123
fun receiveFromIncoming(amount: Kin, organizer: Organizer): Completable {
125-
startupLog("receiveFromIncoming $amount")
124+
trace("receiveFromIncoming $amount")
126125
return transactionRepository.receiveFromIncoming(
127126
context, amount, organizer
128127
).map {

api/src/main/java/com/getcode/network/repository/AccountRepository.kt

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,13 @@
11
package com.getcode.network.repository
22

3-
import android.content.Context
43
import com.codeinc.gen.account.v1.AccountService
5-
import com.codeinc.gen.chat.v1.ChatService
64
import com.codeinc.gen.common.v1.Model
75
import com.getcode.ed25519.Ed25519
8-
import com.getcode.ed25519.Ed25519.KeyPair
96
import com.getcode.model.*
107
import com.getcode.network.api.AccountApi
118
import com.getcode.solana.keys.PublicKey
12-
import com.getcode.utils.startupLog
13-
import com.google.firebase.messaging.Constants.ScionAnalytics.MessageType
14-
import com.google.protobuf.GeneratedMessageLite
15-
import dagger.hilt.android.qualifiers.ApplicationContext
169
import io.reactivex.rxjava3.core.Single
17-
import kotlinx.coroutines.flow.first
18-
import kotlinx.coroutines.flow.map
1910
import timber.log.Timber
20-
import java.io.ByteArrayOutputStream
2111
import javax.inject.Inject
2212

2313
private const val TAG = "AccountRepository"

api/src/main/java/com/getcode/utils/Logging.kt

Lines changed: 71 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,84 @@
11
package com.getcode.utils
22

3+
import android.annotation.SuppressLint
4+
import com.bugsnag.android.BreadcrumbType
35
import com.bugsnag.android.Bugsnag
46
import timber.log.Timber
57

8+
sealed interface TraceType {
9+
/**
10+
* An error was sent to Bugsnag (internal use only)
11+
*/
612

7-
fun startupLog(message: String, error: Throwable? = null) {
8-
val tag = "app-startup"
13+
data object Error : TraceType
914

10-
Timber.tag(tag).let {
11-
if (error != null) {
12-
it.e(error, message)
13-
} else {
14-
it.d(message)
15-
}
15+
/**
16+
* A log message
17+
*/
18+
data object Log : TraceType
19+
20+
/**
21+
* A navigation event, such as a window opening or closing
22+
*/
23+
data object Navigation : TraceType
24+
25+
/**
26+
* A background process such as a database query
27+
*/
28+
data object Process : TraceType
29+
30+
/**
31+
* A network request
32+
*/
33+
data object Network : TraceType
34+
35+
/**
36+
* A change in application state, such as launch or memory warning
37+
*/
38+
data object StateChange : TraceType
39+
40+
/**
41+
* A user action, such as tapping a button
42+
*/
43+
data object User : TraceType
44+
}
45+
46+
private fun TraceType.toBugsnagBreadcrumbType(): BreadcrumbType {
47+
return when (this) {
48+
TraceType.Error -> BreadcrumbType.ERROR
49+
TraceType.Log -> BreadcrumbType.LOG
50+
TraceType.Navigation -> BreadcrumbType.NAVIGATION
51+
TraceType.Network -> BreadcrumbType.REQUEST
52+
TraceType.Process -> BreadcrumbType.PROCESS
53+
TraceType.StateChange -> BreadcrumbType.STATE
54+
TraceType.User -> BreadcrumbType.USER
1655
}
56+
}
57+
58+
@SuppressLint("TimberExceptionLogging")
59+
fun trace(
60+
message: String,
61+
tag: String? = null,
62+
type: TraceType = TraceType.Log,
63+
error: Throwable? = null
64+
) {
65+
val tree = if (tag == null) Timber else Timber.tag(tag)
66+
val traceMessage = if (tag == null) message else "trace : $message"
67+
68+
tree.d(traceMessage)
1769

1870
if (Bugsnag.isStarted()) {
19-
Bugsnag.leaveBreadcrumb("$tag | $message")
71+
val breadcrumb = if (tag != null) {
72+
"$tag | $traceMessage"
73+
} else {
74+
traceMessage
75+
}
76+
77+
Bugsnag.leaveBreadcrumb(
78+
breadcrumb,
79+
emptyMap(),
80+
type.toBugsnagBreadcrumbType()
81+
)
2082
}
2183

2284
error?.let(ErrorUtils::handleError)

app/src/main/java/com/getcode/App.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import com.bugsnag.android.Bugsnag
66
import com.getcode.manager.AuthManager
77
import com.getcode.network.integrity.DeviceCheck
88
import com.getcode.utils.ErrorUtils
9-
import com.getcode.utils.startupLog
9+
import com.getcode.utils.trace
1010
import com.getcode.view.main.bill.CashBillAssets
1111
import com.google.firebase.Firebase
1212
import com.google.firebase.initialize
@@ -62,6 +62,6 @@ class App : Application() {
6262
} else {
6363
Bugsnag.start(this)
6464
}
65-
startupLog("app onCreate end")
65+
trace("app onCreate end")
6666
}
6767
}

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import com.getcode.network.repository.isMock
2626
import com.getcode.util.AccountUtils
2727
import com.getcode.utils.ErrorUtils
2828
import com.getcode.utils.installationId
29-
import com.getcode.utils.startupLog
29+
import com.getcode.utils.trace
3030
import com.getcode.utils.token
3131
import com.google.firebase.Firebase
3232
import com.google.firebase.installations.installations
@@ -83,7 +83,7 @@ class AuthManager @Inject constructor(
8383
isSoftLogin: Boolean = false,
8484
rollbackOnError: Boolean = false
8585
): Completable {
86-
startupLog("Login: isSoftLogin: $isSoftLogin, rollbackOnError: $rollbackOnError")
86+
trace("Login: isSoftLogin: $isSoftLogin, rollbackOnError: $rollbackOnError")
8787

8888
if (entropyB64.isEmpty()) {
8989
sessionManager.clear()
@@ -194,7 +194,7 @@ class AuthManager @Inject constructor(
194194
private fun fetchData(context: Context, entropyB64: String):
195195
Single<Pair<PhoneRepository.GetAssociatedPhoneNumberResponse, IdentityRepository.GetUserResponse>> {
196196

197-
startupLog("fetching account data")
197+
trace("fetching account data")
198198

199199
var owner = SessionManager.authState.value.keyPair
200200
if (owner == null || SessionManager.authState.value.entropyB64 != entropyB64) {
@@ -226,7 +226,7 @@ class AuthManager @Inject constructor(
226226
.toSingleDefault(Pair(phone!!, user!!))
227227
}
228228
.doOnSuccess {
229-
startupLog("account data fetched successfully")
229+
trace("account data fetched successfully")
230230
launch { savePrefs(phone!!, user!!) }
231231
launch { exchange.fetchRatesIfNeeded() }
232232
launch { historyController.fetchChats() }
@@ -240,7 +240,7 @@ class AuthManager @Inject constructor(
240240

241241
private fun loginAnalytics(entropyB64: String) {
242242
val owner = mnemonicManager.getKeyPair(entropyB64)
243-
startupLog("analytics login event")
243+
trace("analytics login event")
244244
analytics.login(
245245
ownerPublicKey = owner.getPublicKeyBase58(),
246246
autoCompleteCount = 0,

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import com.getcode.model.KinAmount
1414
import com.getcode.navigation.core.LocalCodeNavigator
1515
import com.getcode.ui.utils.RepeatOnLifecycle
1616
import com.getcode.ui.utils.getActivityScopedViewModel
17-
import com.getcode.utils.startupLog
17+
import com.getcode.utils.trace
1818
import com.getcode.view.main.account.AccountHome
1919
import com.getcode.view.main.account.AccountSheetViewModel
2020
import com.getcode.view.main.giveKin.GiveKinScreen
@@ -48,7 +48,7 @@ data class HomeScreen(
4848
override fun Content() {
4949
val vm = getViewModel<HomeViewModel>()
5050

51-
startupLog("home rendered")
51+
trace("home rendered")
5252
HomeScreen(vm, cashLink, requestPayload)
5353

5454
OnScreenResult<HomeResult> { result ->

app/src/main/java/com/getcode/ui/components/AuthCheck.kt

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import androidx.compose.runtime.remember
1010
import androidx.compose.runtime.setValue
1111
import androidx.compose.ui.platform.LocalContext
1212
import cafe.adriel.voyager.core.screen.Screen
13-
import com.bugsnag.android.Bugsnag
1413
import com.getcode.LocalDeeplinks
1514
import com.getcode.R
1615
import com.getcode.manager.BottomBarManager
@@ -23,7 +22,7 @@ import com.getcode.navigation.screens.LoginScreen
2322
import com.getcode.util.DeeplinkHandler
2423
import com.getcode.util.DeeplinkResult
2524
import com.getcode.ui.utils.getActivity
26-
import com.getcode.utils.startupLog
25+
import com.getcode.utils.trace
2726
import kotlinx.coroutines.CoroutineScope
2827
import kotlinx.coroutines.delay
2928
import kotlinx.coroutines.flow.Flow
@@ -36,7 +35,6 @@ import kotlinx.coroutines.flow.map
3635
import kotlinx.coroutines.flow.mapNotNull
3736
import kotlinx.coroutines.flow.onEach
3837
import kotlinx.coroutines.launch
39-
import timber.log.Timber
4038

4139
private typealias DeeplinkFlowState = Pair<DeeplinkResult, SessionManager.SessionState>
4240

@@ -57,23 +55,23 @@ fun AuthCheck(
5755
}
5856

5957
LaunchedEffect(isAuthenticated) {
60-
startupLog("isauth=$isAuthenticated")
58+
trace("isauth=$isAuthenticated")
6159
isAuthenticated?.let { authenticated ->
6260
if (!deeplinkRouted) {
6361
// Allow the seed input screen to complete and avoid
6462
// premature navigation
6563
if (currentRoute is AccessKeyLoginScreen) {
66-
startupLog("No navigation within seed input")
64+
trace("No navigation within seed input")
6765
return@LaunchedEffect
6866
}
6967
if (currentRoute is LoginGraph) {
70-
startupLog("No navigation within account creation and onboarding")
68+
trace("No navigation within account creation and onboarding")
7169
} else {
7270
if (authenticated) {
73-
startupLog("Navigating to home")
71+
trace("Navigating to home")
7472
onNavigate(listOf(HomeScreen()))
7573
} else {
76-
startupLog("Navigating to login")
74+
trace("Navigating to login")
7775
onNavigate(listOf(LoginScreen()))
7876
}
7977
}
@@ -93,9 +91,9 @@ fun AuthCheck(
9391
.filter { (result, authState) ->
9492
if (result == null) return@filter false
9593
// wait for authentication
96-
startupLog("checking auth state=${authState.isAuthenticated}")
94+
trace("checking auth state=${authState.isAuthenticated}")
9795
if( authState.isAuthenticated == null) {
98-
startupLog("awaiting auth state confirmation")
96+
trace("awaiting auth state confirmation")
9997
return@filter false
10098
}
10199
return@filter true
@@ -123,7 +121,7 @@ fun AuthCheck(
123121
.map { it.first }
124122
.onEach { (_, screens) ->
125123
deeplinkRouted = true
126-
startupLog("navigating from deep link")
124+
trace("navigating from deep link")
127125
onNavigate(screens)
128126
deeplinkHandler.debounceIntent = null
129127
context.getActivity()?.intent = null
@@ -145,10 +143,10 @@ fun AuthCheck(
145143

146144
private fun Flow<DeeplinkFlowState>.mapSeedToHome(): Flow<DeeplinkFlowState> =
147145
map { (data, auth) ->
148-
startupLog("checking type")
146+
trace("checking type")
149147
val (type, screens) = data
150148
if (type is DeeplinkHandler.Type.Login && auth.isAuthenticated == true) {
151-
startupLog("mapping entropy to home screen")
149+
trace("mapping entropy to home screen")
152150
// send the user to home screen
153151
val entropy = (screens.first() as? LoginScreen)?.seed
154152
val updatedData = data.copy(stack = listOf(HomeScreen(seed = entropy)))
@@ -168,7 +166,7 @@ private fun Flow<DeeplinkResult>.showLogoutConfirmationIfNeeded(
168166
if (type is DeeplinkHandler.Type.Login) {
169167
val entropy = (screens.first() as? HomeScreen)?.seed
170168
if (entropy != null) {
171-
startupLog("showing logout confirm")
169+
trace("showing logout confirm")
172170
showLogoutMessage(
173171
context = context,
174172
entropyB64 = entropy,

app/src/main/java/com/getcode/ui/components/BottomBarView.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import com.getcode.theme.BrandLight
2222
import com.getcode.theme.CodeTheme
2323
import com.getcode.theme.White
2424
import com.getcode.ui.utils.rememberedClickable
25-
import com.getcode.utils.startupLog
25+
import com.getcode.utils.trace
2626

2727
@Composable
2828
fun BottomBarView(
@@ -33,7 +33,7 @@ fun BottomBarView(
3333
bottomBarMessage ?: return
3434

3535
LaunchedEffect(bottomBarMessage) {
36-
startupLog("bottom bar message shown=${bottomBarMessage.title}")
36+
trace("bottom bar message shown=${bottomBarMessage.title}")
3737
}
3838
BackHandler {
3939
onBackPressed()

0 commit comments

Comments
 (0)