Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion api/src/main/java/com/getcode/model/PrefBool.kt
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ data class PrefBool(
sealed interface InternalRouting
sealed interface AppSetting
sealed interface BetaFlag
sealed interface DevSetting


sealed class PrefsBool(val value: String) {
Expand All @@ -31,6 +32,9 @@ sealed class PrefsBool(val value: String) {
data object CAMERA_START_BY_DEFAULT: PrefsBool("camera_start_default"), AppSetting
data object REQUIRE_BIOMETRICS: PrefsBool("require_biometrics"), AppSetting

// dev settings
data object ESTABLISH_CODE_RELATIONSHIP : PrefsBool("establish_code_relationship_enabled"), DevSetting

// beta flags
data object BUCKET_DEBUGGER_ENABLED: PrefsBool("debug_buckets"), BetaFlag
data object VIBRATE_ON_SCAN: PrefsBool("vibrate_on_scan"), BetaFlag
Expand All @@ -40,7 +44,7 @@ sealed class PrefsBool(val value: String) {
data object GIVE_REQUESTS_ENABLED: PrefsBool("give_requests_enabled"), BetaFlag
data object BUY_MODULE_ENABLED : PrefsBool("buy_kin_enabled"), BetaFlag

data object ESTABLISH_CODE_RELATIONSHIP : PrefsBool("establish_code_relationship_enabled"), BetaFlag

data object CHAT_UNSUB_ENABLED: PrefsBool("chat_unsub_enabled"), BetaFlag
data object TIPS_ENABLED : PrefsBool("tips_enabled"), BetaFlag
data object TIPS_CHAT_ENABLED: PrefsBool("tips_chat_enabled"), BetaFlag
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ data class BetaOptions(
val displayErrors: Boolean,
val giveRequestsEnabled: Boolean,
val buyModuleEnabled: Boolean,
val establishCodeRelationship: Boolean,
val chatUnsubEnabled: Boolean,
val tipsEnabled: Boolean,
val tipsChatEnabled: Boolean,
Expand All @@ -30,7 +29,6 @@ data class BetaOptions(
displayErrors = false,
giveRequestsEnabled = false,
buyModuleEnabled = true,
establishCodeRelationship = false,
chatUnsubEnabled = false,
tipsEnabled = false,
tipsChatEnabled = false,
Expand All @@ -43,6 +41,8 @@ data class BetaOptions(
class BetaFlagsRepository @Inject constructor(
private val prefRepository: PrefRepository,
) {
suspend fun isEnabled() = prefRepository.get(PrefsBool.IS_DEBUG_ALLOWED, false)

fun enableBeta(allowed: Boolean) {
prefRepository.set(
PrefsBool.IS_DEBUG_ALLOWED,
Expand All @@ -62,7 +62,6 @@ class BetaFlagsRepository @Inject constructor(
observeBetaFlag(PrefsBool.LOG_SCAN_TIMES, default = defaults.debugScanTimesEnabled),
observeBetaFlag(PrefsBool.GIVE_REQUESTS_ENABLED, default = defaults.giveRequestsEnabled),
observeBetaFlag(PrefsBool.BUY_MODULE_ENABLED, default = defaults.buyModuleEnabled),
observeBetaFlag(PrefsBool.ESTABLISH_CODE_RELATIONSHIP, default = defaults.establishCodeRelationship),
observeBetaFlag(PrefsBool.CHAT_UNSUB_ENABLED, default = defaults.chatUnsubEnabled),
observeBetaFlag(PrefsBool.TIPS_ENABLED, default = defaults.tipsEnabled),
observeBetaFlag(PrefsBool.TIPS_CHAT_ENABLED, default = defaults.tipsChatEnabled),
Expand All @@ -77,13 +76,12 @@ class BetaFlagsRepository @Inject constructor(
debugScanTimesEnabled = it[3],
giveRequestsEnabled = it[4],
buyModuleEnabled = it[5],
establishCodeRelationship = it[6],
chatUnsubEnabled = it[7],
tipsEnabled = it[8],
tipsChatEnabled = it[9],
tipsChatCashEnabled = it[10],
balanceCurrencySelectionEnabled = it[11],
displayErrors = it[12],
chatUnsubEnabled = it[6],
tipsEnabled = it[7],
tipsChatEnabled = it[8],
tipsChatCashEnabled = it[9],
balanceCurrencySelectionEnabled = it[10],
displayErrors = it[11],
)
}
}
Expand Down
6 changes: 6 additions & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,7 @@ dependencies {

//hilt dependency injection
implementation(Libs.hilt)
implementation("androidx.webkit:webkit:1.11.0")
kapt(Libs.hilt_android_compiler)
kapt(Libs.hilt_compiler)
androidTestImplementation(Libs.hilt)
Expand Down Expand Up @@ -159,6 +160,7 @@ dependencies {
implementation(Libs.compose_voyager_navigation_transitions)
implementation(Libs.compose_voyager_navigation_bottomsheet)
implementation(Libs.compose_voyager_navigation_hilt)
implementation(Libs.compose_webview)

implementation(Libs.androidx_biometrics)

Expand Down Expand Up @@ -192,6 +194,10 @@ dependencies {
implementation(Libs.zxing)
implementation(Libs.mixpanel)

implementation(Libs.retrofit)
implementation(Libs.retrofit_converter)
implementation(Libs.okhttp_logging_interceptor)

implementation(Libs.cloudy)

androidTestImplementation(Libs.androidx_test_runner)
Expand Down
9 changes: 9 additions & 0 deletions app/proguard-rules.pro
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,15 @@
-keep class org.json.** { *; }
-keepclassmembers class org.json.** { *; }

# Keep generic signature of Call, Response (R8 full mode strips signatures from non-kept items).
-keep,allowobfuscation,allowshrinking interface retrofit2.Call
-keep,allowobfuscation,allowshrinking class retrofit2.Response

# With R8 full mode generic signatures are stripped for classes that are not
# kept. Suspend functions are wrapped in continuations where the type argument
# is used.
-keep,allowobfuscation,allowshrinking class kotlin.coroutines.Continuation

# libsodium
-keep class com.ionspin.kotlin.crypto.** { *; }
-keep class com.sun.jna.** { *; }
Expand Down
3 changes: 0 additions & 3 deletions app/src/main/java/com/getcode/CodeAppState.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,9 @@ package com.getcode
import androidx.compose.material.ScaffoldState
import androidx.compose.material.rememberScaffoldState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.MutableState
import androidx.compose.runtime.Stable
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.lifecycle.MutableLiveData
import com.getcode.manager.BottomBarManager
import com.getcode.manager.TopBarManager
import com.getcode.navigation.core.CodeNavigator
Expand Down Expand Up @@ -87,7 +85,6 @@ class CodeAppState(
val topBarMessage = MutableStateFlow<TopBarManager.TopBarMessage?>(null)
val bottomBarMessage = MutableStateFlow<BottomBarManager.BottomBarMessage?>(null)


fun upPress() {
if (navigator.pop().not()) {
navigator.hide()
Expand Down
12 changes: 12 additions & 0 deletions app/src/main/java/com/getcode/api/KadoApi.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.getcode.api

import com.google.gson.JsonObject
import okhttp3.ResponseBody
import retrofit2.Response
import retrofit2.http.GET
import retrofit2.http.Path

interface KadoApi {
@GET("v2/public/orders/{orderId}")
suspend fun getOrderStatus(@Path("orderId") orderId: String): Response<ResponseBody>
}
38 changes: 38 additions & 0 deletions app/src/main/java/com/getcode/inject/ApiModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import com.getcode.BuildConfig
import com.getcode.R
import com.getcode.analytics.AnalyticsService
import com.getcode.annotations.DevManagedChannel
import com.getcode.api.KadoApi
import com.getcode.manager.MnemonicManager
import com.getcode.model.CurrencyCode
import com.getcode.model.PrefsString
Expand Down Expand Up @@ -44,8 +45,14 @@ import io.grpc.android.AndroidChannelBuilder
import io.reactivex.rxjava3.core.Scheduler
import io.reactivex.rxjava3.disposables.CompositeDisposable
import io.reactivex.rxjava3.schedulers.Schedulers
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import org.kin.sdk.base.network.api.agora.OkHttpChannelBuilderForcedTls12
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import retrofit2.create
import java.util.concurrent.TimeUnit
import javax.inject.Named
import javax.inject.Singleton

@Module
Expand Down Expand Up @@ -109,6 +116,37 @@ object ApiModule {
return MixpanelAPI.getInstance(context, BuildConfig.MIXPANEL_API_KEY)
}

@Singleton
@Provides
fun providesHttpLoggingInterceptor() = HttpLoggingInterceptor()
.apply {
level = HttpLoggingInterceptor.Level.BODY
}

@Singleton
@Provides
fun providesOkHttpClient(httpLoggingInterceptor: HttpLoggingInterceptor): OkHttpClient =
OkHttpClient
.Builder()
.addInterceptor(httpLoggingInterceptor)
.build()

@Singleton
@Provides
@Named("kado-retrofit")
fun provideKadoRetrofit(okHttpClient: OkHttpClient): Retrofit = Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.baseUrl("https://api.kado.money/")
.client(okHttpClient)
.build()

@Singleton
@Provides
fun providesKadoApi(
@Named("kado-retrofit")
retrofit: Retrofit
): KadoApi = retrofit.create(KadoApi::class.java)

@Singleton
@Provides
fun provideBalanceRepository(
Expand Down
4 changes: 2 additions & 2 deletions app/src/main/java/com/getcode/mapper/AppSettingsMapper.kt
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ import javax.inject.Inject

class AppSettingsMapper @Inject constructor(
private val biometricManager: BiometricManager,
): Mapper<AppSettings, List<SettingItem>> {
override fun map(from: AppSettings): List<SettingItem> {
): SuspendMapper<AppSettings, List<SettingItem>> {
override suspend fun map(from: AppSettings): List<SettingItem> {

return APP_SETTINGS.map { setting ->
when (setting) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,12 @@
package com.getcode.navigation.screens

import androidx.compose.runtime.Composable
import androidx.compose.ui.platform.LocalLifecycleOwner
import androidx.compose.ui.res.stringResource
import androidx.lifecycle.Lifecycle
import cafe.adriel.voyager.core.screen.ScreenKey
import cafe.adriel.voyager.core.screen.uniqueScreenKey
import cafe.adriel.voyager.hilt.getViewModel
import com.getcode.R
import com.getcode.analytics.AnalyticsManager
import com.getcode.model.KinAmount
import com.getcode.navigation.core.LocalCodeNavigator
import com.getcode.ui.utils.RepeatOnLifecycle
Expand Down Expand Up @@ -186,6 +184,7 @@ data object ShareDownloadLinkModal : MainGraph, ModalRoot {
}
}


@Composable
fun <T> AppScreen.OnScreenResult(block: (T) -> Unit) {
RepeatOnLifecycle(
Expand Down
67 changes: 60 additions & 7 deletions app/src/main/java/com/getcode/navigation/screens/ModalScreens.kt
Original file line number Diff line number Diff line change
@@ -1,15 +1,26 @@
package com.getcode.navigation.screens

import android.webkit.JavascriptInterface
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.imePadding
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.stringResource
import cafe.adriel.voyager.core.screen.ScreenKey
import cafe.adriel.voyager.core.screen.uniqueScreenKey
import cafe.adriel.voyager.hilt.getViewModel
import com.getcode.R
import com.getcode.navigation.core.LocalCodeNavigator
import com.getcode.theme.CodeTheme
import com.getcode.ui.components.CodeCircularProgressIndicator
import com.getcode.ui.components.SheetTitleDefaults
import com.getcode.ui.utils.getActivityScopedViewModel
import com.getcode.ui.utils.getStackScopedViewModel
import com.getcode.ui.utils.toAGColor
import com.getcode.view.login.PhoneConfirm
import com.getcode.view.login.PhoneVerify
import com.getcode.view.login.PhoneVerifyViewModel
Expand All @@ -29,10 +40,15 @@ import com.getcode.view.main.getKin.BuyAndSellKin
import com.getcode.view.main.getKin.BuyKinScreen
import com.getcode.view.main.getKin.GetKinSheet
import com.getcode.view.main.getKin.GetKinSheetViewModel
import com.getcode.view.main.getKin.KadoWebScreen
import com.getcode.view.main.tip.ConnectAccountScreen
import com.getcode.view.main.tip.EnterTipScreen
import com.getcode.view.main.tip.IdentityConnectionReason
import com.getcode.view.main.tip.ConnectAccountScreen
import com.getcode.view.main.tip.TipConnectViewModel
import com.kevinnzou.web.LoadingState
import com.kevinnzou.web.WebView
import com.kevinnzou.web.rememberWebViewNavigator
import com.kevinnzou.web.rememberWebViewState
import kotlinx.parcelize.IgnoredOnParcel
import kotlinx.parcelize.Parcelize

Expand Down Expand Up @@ -261,7 +277,8 @@ data object DeleteConfirmationScreen : MainGraph, ModalContent {
}

@Parcelize
data class CurrencySelectionModal(val kind: CurrencySelectKind = CurrencySelectKind.Entry) : MainGraph, ModalContent {
data class CurrencySelectionModal(val kind: CurrencySelectKind = CurrencySelectKind.Entry) :
MainGraph, ModalContent {
@IgnoredOnParcel
override val key: ScreenKey = uniqueScreenKey

Expand Down Expand Up @@ -309,11 +326,7 @@ data class BuyMoreKinModal(
BuyKinScreen(
viewModel = getViewModel(),
onRedirected = {
if (showClose) {
navigator.hide()
} else {
navigator.popAll()
}
navigator.hide()
}
)
}
Expand Down Expand Up @@ -346,6 +359,46 @@ data class BuyMoreKinModal(
}
}

@Parcelize
data class KadoWebScreen(val url: String) : MainGraph, ModalContent {

@IgnoredOnParcel
override val key: ScreenKey = uniqueScreenKey

override val name: String
@Composable get() = stringResource(id = R.string.action_buyMoreKin)

@Composable
override fun Content() {
val state = rememberWebViewState(url = url)
val navigator = LocalCodeNavigator.current
val webNavigator = rememberWebViewNavigator()
ModalContainer(
modalColor = if (isSystemInDarkTheme()) {
Color(0xFF0A121F)
} else {
CodeTheme.colors.background
},
backButtonEnabled = { true },
backButton = { SheetTitleDefaults.CloseButton() },
onBackClicked = { navigator.hide() },
closeButtonEnabled = { true },
closeButton = { SheetTitleDefaults.RefreshButton() },
onCloseClicked = { webNavigator.reload() }
) {
KadoWebScreen(viewModel = getViewModel(), state = state, webNavigator = webNavigator)
}
}

class BuyKinWebInterface {

@JavascriptInterface
fun handleMessage(message: String) {
println("KADO BUY KIN MESSAGE :: $message")
}
}
}

@Parcelize
data class EnterTipModal(val isInChat: Boolean = false) : MainGraph, ModalRoot {

Expand Down
Loading