diff --git a/README.md b/README.md index 4cd2e194..0c961d8d 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,8 @@ ## Easy and secure Brainwallet is a easy and fun way to use your crypto (Litecoin) and memorize your seed words + +### Release notes + +- v4.5.4 + - Added new MP Buy UI diff --git a/app/build.gradle.kts b/app/build.gradle.kts index a68ebc9c..253c6aca 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -21,8 +21,8 @@ android { applicationId = "ltd.grunt.brainwallet" minSdk = 29 targetSdk = 36 - versionCode = 202506273 - versionName = "v4.7.1" + versionCode = 202506295 + versionName = "v4.7.2" multiDexEnabled = true base.archivesName.set("${defaultConfig.versionName}(${defaultConfig.versionCode})") diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 7ab25998..44883644 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -40,7 +40,7 @@ -dontwarn org.slf4j.impl.StaticLoggerBinder -dontwarn org.slf4j.impl.StaticMDCBinder -dontwarn org.slf4j.impl.StaticMarkerBinder - +-dontwarn java.lang.reflect.AnnotatedType -keepclasseswithmembernames class * { native ; diff --git a/app/src/main/java/com/brainwallet/data/model/Fee.kt b/app/src/main/java/com/brainwallet/data/model/Fee.kt index b1d086ae..28413fd9 100644 --- a/app/src/main/java/com/brainwallet/data/model/Fee.kt +++ b/app/src/main/java/com/brainwallet/data/model/Fee.kt @@ -91,4 +91,4 @@ fun FeeOption.getFiatFormatted(currencyEntity: CurrencyEntity): String { fun List.getSelectedIndex(selectedFeeType: String): Int { return indexOfFirst { it.type == selectedFeeType }.takeIf { it >= 0 } ?: 2 //2 -> index of top, since we have [low,medium,top] -} \ No newline at end of file +} diff --git a/app/src/main/java/com/brainwallet/navigation/LegacyNavigation.kt b/app/src/main/java/com/brainwallet/navigation/LegacyNavigation.kt index 10503556..a46e3261 100644 --- a/app/src/main/java/com/brainwallet/navigation/LegacyNavigation.kt +++ b/app/src/main/java/com/brainwallet/navigation/LegacyNavigation.kt @@ -18,6 +18,7 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import timber.log.Timber +import com.google.firebase.analytics.FirebaseAnalytics //provide old navigation using intent activity @@ -35,6 +36,7 @@ object LegacyNavigation { auth: Boolean ) { Timber.i("timber: startBreadActivity: %s", from.javaClass.name) + val intent = if (auth) BrainwalletActivity.createIntent(from, Route.UnLock()) else Intent(from, BreadActivity::class.java) intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK) diff --git a/app/src/main/java/com/brainwallet/ui/BrainwalletActivity.kt b/app/src/main/java/com/brainwallet/ui/BrainwalletActivity.kt index 8ef9dfda..ed8b27d9 100644 --- a/app/src/main/java/com/brainwallet/ui/BrainwalletActivity.kt +++ b/app/src/main/java/com/brainwallet/ui/BrainwalletActivity.kt @@ -32,6 +32,7 @@ import com.brainwallet.ui.screens.inputwords.InputWordsViewModel.Companion.LEGAC import com.brainwallet.ui.screens.inputwords.InputWordsViewModel.Companion.LEGACY_DIALOG_WIPE_ALERT import com.brainwallet.ui.screens.inputwords.InputWordsViewModel.Companion.LEGACY_EFFECT_RESET_PIN import com.brainwallet.ui.screens.yourseedproveit.YourSeedProveItViewModel.Companion.LEGACY_EFFECT_ON_PAPERKEY_PROVED +import com.brainwallet.ui.screens.yourseedproveit.YourSeedProveItViewModel.Companion.LEGACY_NAVIGATE_TO_HOME import com.brainwallet.ui.theme.BrainwalletAppTheme import com.brainwallet.util.EventBus import com.brainwallet.wallet.BRWalletManager @@ -115,6 +116,9 @@ class BrainwalletActivity : BRActivity() { LEGACY_EFFECT_ON_PAPERKEY_PROVED -> { BRSharedPrefs.putPhraseWroteDown(this@BrainwalletActivity, true) + } + + LEGACY_NAVIGATE_TO_HOME -> { LegacyNavigation.startBreadActivity( this@BrainwalletActivity, false diff --git a/app/src/main/java/com/brainwallet/ui/screens/buylitecoin/BuyLitecoinScreen.kt b/app/src/main/java/com/brainwallet/ui/screens/buylitecoin/BuyLitecoinScreen.kt index 89fd9473..ad6b3cf5 100644 --- a/app/src/main/java/com/brainwallet/ui/screens/buylitecoin/BuyLitecoinScreen.kt +++ b/app/src/main/java/com/brainwallet/ui/screens/buylitecoin/BuyLitecoinScreen.kt @@ -47,7 +47,6 @@ fun BuyLitecoinScreen( val loadingState by viewModel.loadingState.collectAsState() val appSetting by viewModel.appSetting.collectAsState() val context = LocalContext.current - LaunchedEffect(Unit) { viewModel.onEvent(BuyLitecoinEvent.OnLoad(context)) viewModel.uiEffect.collect { effect -> diff --git a/app/src/main/java/com/brainwallet/ui/screens/home/SettingsEvent.kt b/app/src/main/java/com/brainwallet/ui/screens/home/SettingsEvent.kt index 61a8ced4..cf6b1d31 100644 --- a/app/src/main/java/com/brainwallet/ui/screens/home/SettingsEvent.kt +++ b/app/src/main/java/com/brainwallet/ui/screens/home/SettingsEvent.kt @@ -8,7 +8,6 @@ sealed class SettingsEvent { val shareAnalyticsDataEnabled: Boolean = false, val lastSyncMetadata: String? = null, ) : SettingsEvent() - object OnSecurityUpdatePinClick : SettingsEvent() object OnSecuritySeedPhraseClick : SettingsEvent() object OnSecurityShareAnalyticsDataClick : SettingsEvent() diff --git a/app/src/main/java/com/brainwallet/ui/screens/home/composable/settingsrows/LitecoinBlockchainDetail.kt b/app/src/main/java/com/brainwallet/ui/screens/home/composable/settingsrows/LitecoinBlockchainDetail.kt index f964e418..1c3e6ef8 100644 --- a/app/src/main/java/com/brainwallet/ui/screens/home/composable/settingsrows/LitecoinBlockchainDetail.kt +++ b/app/src/main/java/com/brainwallet/ui/screens/home/composable/settingsrows/LitecoinBlockchainDetail.kt @@ -14,6 +14,10 @@ import androidx.compose.material3.SegmentedButtonDefaults import androidx.compose.material3.SingleChoiceSegmentedButtonRow import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource diff --git a/app/src/main/java/com/brainwallet/ui/screens/home/receive/ReceiveDialog.kt b/app/src/main/java/com/brainwallet/ui/screens/home/receive/ReceiveDialog.kt index 8292904c..e96a1f2a 100644 --- a/app/src/main/java/com/brainwallet/ui/screens/home/receive/ReceiveDialog.kt +++ b/app/src/main/java/com/brainwallet/ui/screens/home/receive/ReceiveDialog.kt @@ -90,7 +90,6 @@ fun ReceiveDialog( val appSetting by viewModel.appSetting.collectAsState() val context = LocalContext.current val wheelPickerFiatCurrencyState = rememberWheelPickerState(0) - LaunchedEffect(Unit) { viewModel.onEvent(ReceiveDialogEvent.OnLoad(context)) viewModel.uiEffect.collect { effect -> diff --git a/app/src/main/java/com/brainwallet/ui/screens/topup/TopUpScreen.kt b/app/src/main/java/com/brainwallet/ui/screens/topup/TopUpScreen.kt index 22f5722d..7ef16b33 100644 --- a/app/src/main/java/com/brainwallet/ui/screens/topup/TopUpScreen.kt +++ b/app/src/main/java/com/brainwallet/ui/screens/topup/TopUpScreen.kt @@ -30,6 +30,7 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.lifecycle.viewmodel.compose.viewModel import com.brainwallet.R +import com.brainwallet.navigation.LegacyNavigation import com.brainwallet.navigation.OnNavigate import com.brainwallet.navigation.Route import com.brainwallet.navigation.UiEffect diff --git a/app/src/main/java/com/brainwallet/ui/screens/welcome/WelcomeScreen.kt b/app/src/main/java/com/brainwallet/ui/screens/welcome/WelcomeScreen.kt index cec6d05a..d5a1fd2b 100644 --- a/app/src/main/java/com/brainwallet/ui/screens/welcome/WelcomeScreen.kt +++ b/app/src/main/java/com/brainwallet/ui/screens/welcome/WelcomeScreen.kt @@ -13,6 +13,7 @@ import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.systemBars import androidx.compose.foundation.layout.width diff --git a/app/src/main/java/com/brainwallet/ui/screens/yourseedproveit/YourSeedProveItEvent.kt b/app/src/main/java/com/brainwallet/ui/screens/yourseedproveit/YourSeedProveItEvent.kt index 68816d6a..b315d980 100644 --- a/app/src/main/java/com/brainwallet/ui/screens/yourseedproveit/YourSeedProveItEvent.kt +++ b/app/src/main/java/com/brainwallet/ui/screens/yourseedproveit/YourSeedProveItEvent.kt @@ -13,5 +13,7 @@ sealed class YourSeedProveItEvent { object OnGameAndSync : YourSeedProveItEvent() + object OnCompletedPaperKey : YourSeedProveItEvent() + object OnClear : YourSeedProveItEvent() } \ No newline at end of file diff --git a/app/src/main/java/com/brainwallet/ui/screens/yourseedproveit/YourSeedProveItScreen.kt b/app/src/main/java/com/brainwallet/ui/screens/yourseedproveit/YourSeedProveItScreen.kt index 71d1c56e..e505438c 100644 --- a/app/src/main/java/com/brainwallet/ui/screens/yourseedproveit/YourSeedProveItScreen.kt +++ b/app/src/main/java/com/brainwallet/ui/screens/yourseedproveit/YourSeedProveItScreen.kt @@ -53,6 +53,8 @@ import com.brainwallet.R import com.brainwallet.navigation.OnNavigate import com.brainwallet.navigation.Route import com.brainwallet.navigation.UiEffect +import com.brainwallet.tools.manager.AnalyticsManager +import com.brainwallet.tools.util.BRConstants import com.brainwallet.ui.composable.BrainwalletScaffold import com.brainwallet.ui.composable.BrainwalletTopAppBar import com.brainwallet.ui.composable.LargeButton @@ -86,6 +88,8 @@ fun YourSeedProveItScreen( LaunchedEffect(state.orderCorrected) { if (state.orderCorrected) { coinAudioPlayer.start() + viewModel.onEvent(YourSeedProveItEvent.OnCompletedPaperKey) + AnalyticsManager.logCustomEvent(BRConstants._20250303_DSTU) } } diff --git a/app/src/main/java/com/brainwallet/ui/screens/yourseedproveit/YourSeedProveItViewModel.kt b/app/src/main/java/com/brainwallet/ui/screens/yourseedproveit/YourSeedProveItViewModel.kt index e54f745f..75f68797 100644 --- a/app/src/main/java/com/brainwallet/ui/screens/yourseedproveit/YourSeedProveItViewModel.kt +++ b/app/src/main/java/com/brainwallet/ui/screens/yourseedproveit/YourSeedProveItViewModel.kt @@ -51,6 +51,10 @@ class YourSeedProveItViewModel : BrainwalletViewModel() { } YourSeedProveItEvent.OnGameAndSync -> viewModelScope.launch { + EventBus.emit(EventBus.Event.Message(LEGACY_NAVIGATE_TO_HOME)) + } + + YourSeedProveItEvent.OnCompletedPaperKey -> viewModelScope.launch { EventBus.emit(EventBus.Event.Message(LEGACY_EFFECT_ON_PAPERKEY_PROVED)) } } @@ -58,5 +62,6 @@ class YourSeedProveItViewModel : BrainwalletViewModel() { companion object { const val LEGACY_EFFECT_ON_PAPERKEY_PROVED = "onPaperKeyProved" + const val LEGACY_NAVIGATE_TO_HOME = "navigateToHome" } } \ No newline at end of file diff --git a/app/src/test/java/com/brainwallet/tools/util/BRConstantsTest.kt b/app/src/test/java/com/brainwallet/tools/util/BRConstantsTest.kt index 5779b8df..1f6fee1b 100644 --- a/app/src/test/java/com/brainwallet/tools/util/BRConstantsTest.kt +++ b/app/src/test/java/com/brainwallet/tools/util/BRConstantsTest.kt @@ -16,12 +16,12 @@ class BRConstantsTest { @Test fun `validate App external URL constant`(){ - assertSame(BRConstants.TWITTER_LINK,"https://twitter.com/Brainwallet_App"); - assertSame(BRConstants.INSTAGRAM_LINK,"https://www.instagram.com/brainwalletapp"); - assertSame(BRConstants.WEB_LINK,"https://brainwallet.co"); - assertSame(BRConstants.TOS_LINK,"https://brainwallet.co/privacy-policy.html"); - assertSame(BRConstants.MOBILE_MP_LINK,"https://brainwallet.co/mobile-top-up.html"); - assertSame(BRConstants.BITREFILL_AFFILIATE_LINK,"https://www.bitrefill.com/"); + assertSame(BRConstants.TWITTER_LINK,"https://twitter.com/Brainwallet_App") + assertSame(BRConstants.INSTAGRAM_LINK,"https://www.instagram.com/brainwalletapp") + assertSame(BRConstants.WEB_LINK,"https://brainwallet.co") + assertSame(BRConstants.TOS_LINK,"https://brainwallet.co/privacy-policy.html") + assertSame(BRConstants.MOBILE_MP_LINK,"https://brainwallet.co/mobile-top-up.html") + assertSame(BRConstants.BITREFILL_AFFILIATE_LINK,"https://www.bitrefill.com/") } @Test @@ -89,7 +89,7 @@ class BRConstantsTest { // public ActivityScenarioRule mActivityRule = new ActivityScenarioRule<>(IntroActivity.class); // @Before // public void setUp() { -// Log.e(TAG, "setUp: "); +// Log.e(TAG, "setUp: ") // } // // @After @@ -97,16 +97,16 @@ class BRConstantsTest { // } // @Test // public void testLitecoinSymbolConstants() { -// Assert.assertSame(BRConstants.litecoinLowercase,"ł"); -// Assert.assertSame(BRConstants.litecoinUppercase,"Ł"); +// Assert.assertSame(BRConstants.litecoinLowercase,"ł") +// Assert.assertSame(BRConstants.litecoinUppercase,"Ł") // } // @Test // public void testAppExternalURLConstants() { -// Assert.assertSame(BRConstants.TWITTER_LINK,"https://twitter.com/Brainwallet_App"); -// Assert.assertSame(BRConstants.WEB_LINK,"https://brainwallet.co"); -// Assert.assertSame(BRConstants.TOS_LINK,"https://brainwallet.co/privacy"); -// Assert.assertSame(BRConstants.CUSTOMER_SUPPORT_LINK,"https://support.brainwallet.co/hc/en-us/requests/new"); -// Assert.assertSame(BRConstants.BITREFILL_AFFILIATE_LINK,"https://www.bitrefill.com/"); +// Assert.assertSame(BRConstants.TWITTER_LINK,"https://twitter.com/Brainwallet_App") +// Assert.assertSame(BRConstants.WEB_LINK,"https://brainwallet.co") +// Assert.assertSame(BRConstants.TOS_LINK,"https://brainwallet.co/privacy") +// Assert.assertSame(BRConstants.CUSTOMER_SUPPORT_LINK,"https://support.brainwallet.co/hc/en-us/requests/new") +// Assert.assertSame(BRConstants.BITREFILL_AFFILIATE_LINK,"https://www.bitrefill.com/") // } // @Test // public void testFirebaseAnalyticsConstants() { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index c234152d..f1ff0cc4 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,6 +1,6 @@ [versions] kotlin = "2.0.0" -agp = "8.5.1" +agp = "8.7.3" androidx-core-ktx = "1.12.0" androidx-appcompat = "1.6.1" androidx-legacy-support = "1.0.0" diff --git a/modules/games b/modules/games index a5f408cc..b2cc09df 160000 --- a/modules/games +++ b/modules/games @@ -1 +1 @@ -Subproject commit a5f408cc093f729b32f351e29d010a31242eef8e +Subproject commit b2cc09df06d90baa9836b8789c38de569e2e8f8f