diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/Amber.kt b/app/src/main/java/com/greenart7c3/nostrsigner/Amber.kt index 34fde604..b8823797 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/Amber.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/Amber.kt @@ -24,7 +24,6 @@ import com.greenart7c3.nostrsigner.models.AmberSettings import com.greenart7c3.nostrsigner.models.FeedbackType import com.greenart7c3.nostrsigner.okhttp.HttpClientManager import com.greenart7c3.nostrsigner.okhttp.OkHttpWebSocket -import com.greenart7c3.nostrsigner.relays.AmberListenerSingleton import com.greenart7c3.nostrsigner.relays.AmberRelayStats import com.greenart7c3.nostrsigner.relays.NostrClientLoggerListener import com.greenart7c3.nostrsigner.service.ClearLogsWorker @@ -45,6 +44,12 @@ import com.vitorpamplona.quartz.nip01Core.tags.people.PTag import com.vitorpamplona.quartz.nip34Git.issue.GitIssueEvent import com.vitorpamplona.quartz.nip34Git.repository.GitRepositoryEvent import com.vitorpamplona.quartz.utils.TimeUtils +import java.lang.ref.WeakReference +import java.net.InetSocketAddress +import java.net.Socket +import java.util.concurrent.ConcurrentHashMap +import java.util.concurrent.TimeUnit +import kotlin.coroutines.cancellation.CancellationException import kotlinx.coroutines.CoroutineExceptionHandler import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -53,12 +58,6 @@ import kotlinx.coroutines.cancel import kotlinx.coroutines.delay import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.launch -import java.lang.ref.WeakReference -import java.net.InetSocketAddress -import java.net.Socket -import java.util.concurrent.ConcurrentHashMap -import java.util.concurrent.TimeUnit -import kotlin.coroutines.cancellation.CancellationException class Amber : Application(), @@ -120,6 +119,7 @@ class Amber : val isOnWifiDataState = mutableStateOf(false) val isOnOfflineState = mutableStateOf(false) private val isStartingApp = MutableStateFlow(false) + @Volatile var intentionalDisconnectTime = 0L val isStartingAppState = isStartingApp val notificationCache = LruCache(10) diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/SecureCryptoHelper.kt b/app/src/main/java/com/greenart7c3/nostrsigner/SecureCryptoHelper.kt index 608e98c0..44160345 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/SecureCryptoHelper.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/SecureCryptoHelper.kt @@ -99,6 +99,7 @@ fun Context.hasStrongBox(): Boolean { Build.BOARD.lowercase().contains("mt") || (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S && Build.SOC_MANUFACTURER.lowercase().contains("mediatek")) // usually mediatek contains broken strongbox support - return !isMediaTek && Build.VERSION.SDK_INT >= Build.VERSION_CODES.P && + return !isMediaTek && + Build.VERSION.SDK_INT >= Build.VERSION_CODES.P && packageManager.hasSystemFeature(PackageManager.FEATURE_STRONGBOX_KEYSTORE) } diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/SignerActivity.kt b/app/src/main/java/com/greenart7c3/nostrsigner/SignerActivity.kt index 769bb303..863f4090 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/SignerActivity.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/SignerActivity.kt @@ -100,7 +100,7 @@ class SignerActivity : AppCompatActivity() { sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true), containerColor = MaterialTheme.colorScheme.background, scrimColor = Color.Transparent, - dragHandle = { BottomSheetDefaults.DragHandle() } + dragHandle = { BottomSheetDefaults.DragHandle() }, ) { Surface( modifier = Modifier.fillMaxWidth(), @@ -157,7 +157,7 @@ class SignerActivity : AppCompatActivity() { mainViewModel = mainViewModel, bunkerRequests = bunkerRequests.value, navController = navController, - isExternalRequest = true + isExternalRequest = true, ) } } diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/relays/NostrClientLoggerListener.kt b/app/src/main/java/com/greenart7c3/nostrsigner/relays/NostrClientLoggerListener.kt index f93f3cf9..4c8b81ce 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/relays/NostrClientLoggerListener.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/relays/NostrClientLoggerListener.kt @@ -2,7 +2,9 @@ package com.greenart7c3.nostrsigner.relays import android.app.NotificationManager import android.content.Context +import android.util.Log import com.greenart7c3.nostrsigner.Amber +import com.greenart7c3.nostrsigner.BuildConfig import com.greenart7c3.nostrsigner.BuildFlavorChecker import com.greenart7c3.nostrsigner.LocalPreferences import com.greenart7c3.nostrsigner.database.LogEntity @@ -13,8 +15,6 @@ import com.vitorpamplona.quartz.nip01Core.relay.client.single.IRelayClient import com.vitorpamplona.quartz.nip01Core.relay.commands.toClient.Message import com.vitorpamplona.quartz.nip01Core.relay.commands.toClient.OkMessage import com.vitorpamplona.quartz.nip01Core.relay.commands.toRelay.Command -import android.util.Log -import com.greenart7c3.nostrsigner.BuildConfig import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Job import kotlinx.coroutines.delay diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/service/BootReceiver.kt b/app/src/main/java/com/greenart7c3/nostrsigner/service/BootReceiver.kt index 6242229a..78d1e1df 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/service/BootReceiver.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/service/BootReceiver.kt @@ -16,7 +16,8 @@ class BootReceiver : BroadcastReceiver() { when (intent.action) { Intent.ACTION_MY_PACKAGE_REPLACED, - Intent.ACTION_BOOT_COMPLETED -> { + Intent.ACTION_BOOT_COMPLETED, + -> { Log.d(Amber.TAG, "Received ${intent.action}") Amber.instance.applicationIOScope.launch { Amber.instance.isStartingAppState.first { !it } diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/ui/LoginScreen.kt b/app/src/main/java/com/greenart7c3/nostrsigner/ui/LoginScreen.kt index 82665a42..425932c4 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/ui/LoginScreen.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/ui/LoginScreen.kt @@ -968,7 +968,6 @@ fun LoginPage( isLoading = false } } - } }, ), @@ -1053,7 +1052,6 @@ fun LoginPage( isLoading = false } } - } }, ), diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/ui/MainScreen.kt b/app/src/main/java/com/greenart7c3/nostrsigner/ui/MainScreen.kt index c53c7be7..56ee6c4b 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/ui/MainScreen.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/ui/MainScreen.kt @@ -215,7 +215,7 @@ fun MainScreen( Route.IncomingRequest.route } else { route.value ?: if (intents.isEmpty() && bunkerRequests.isEmpty()) Route.Applications.route else Route.IncomingRequest.route - } + }, ) } LaunchedEffect(Unit, route.value, intents, bunkerRequests, isExternalRequest) { @@ -792,7 +792,7 @@ fun MainScreen( .padding(top = verticalPadding * 1.5f), onBack = { navController.popBackStack() - } + }, ) }, ) diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/ui/SeeDetailsScreen.kt b/app/src/main/java/com/greenart7c3/nostrsigner/ui/SeeDetailsScreen.kt index 2e0c8d4b..7ad7f4b8 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/ui/SeeDetailsScreen.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/ui/SeeDetailsScreen.kt @@ -44,7 +44,7 @@ import com.vitorpamplona.quartz.nip46RemoteSigner.BunkerRequestSign @Composable fun SeeDetailsScreen( modifier: Modifier = Modifier, - onBack: () -> Unit + onBack: () -> Unit, ) { val context = LocalContext.current Column( @@ -54,7 +54,7 @@ fun SeeDetailsScreen( Column( Modifier .weight(1f) - .verticalScroll(rememberScrollState()) + .verticalScroll(rememberScrollState()), ) { var rememberType by remember { mutableStateOf(MultiEventScreenIntents.intents.firstOrNull()?.rememberType?.value ?: MultiEventScreenIntents.bunkerRequests.first().rememberType.value) } val type = if (MultiEventScreenIntents.intents.isNotEmpty()) { @@ -240,7 +240,7 @@ fun SeeDetailsScreen( .fillMaxWidth() .padding(vertical = 16.dp), text = stringResource(R.string.go_back), - onClick = onBack + onClick = onBack, ) } } diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/ui/actions/EditRelaysDialog.kt b/app/src/main/java/com/greenart7c3/nostrsigner/ui/actions/EditRelaysDialog.kt index 3fcdcb48..7defe116 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/ui/actions/EditRelaysDialog.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/ui/actions/EditRelaysDialog.kt @@ -58,8 +58,8 @@ import com.greenart7c3.nostrsigner.models.defaultAppRelays import com.greenart7c3.nostrsigner.relays.AmberListenerSingleton import com.greenart7c3.nostrsigner.service.TrustScoreService import com.greenart7c3.nostrsigner.ui.CenterCircularProgressIndicator -import com.greenart7c3.nostrsigner.ui.ToastManager import com.greenart7c3.nostrsigner.ui.RelayCard +import com.greenart7c3.nostrsigner.ui.ToastManager import com.greenart7c3.nostrsigner.ui.components.AmberButton import com.greenart7c3.nostrsigner.ui.components.TrustScoreBadge import com.vitorpamplona.quartz.nip01Core.core.Event diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/AmberTopAppBar.kt b/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/AmberTopAppBar.kt index b97f9772..9f7c3f99 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/AmberTopAppBar.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/AmberTopAppBar.kt @@ -47,10 +47,10 @@ import com.greenart7c3.nostrsigner.service.toShortenHex import com.greenart7c3.nostrsigner.ui.navigation.Route import com.greenart7c3.nostrsigner.ui.navigation.routes import com.vitorpamplona.quartz.nip46RemoteSigner.BunkerRequestConnect +import java.util.Base64 import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch -import java.util.Base64 @OptIn(ExperimentalMaterial3Api::class) @Composable diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/BunkerMultiEventHomeScreen.kt b/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/BunkerMultiEventHomeScreen.kt index 44d0c0a5..80b8965c 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/BunkerMultiEventHomeScreen.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/BunkerMultiEventHomeScreen.kt @@ -8,7 +8,6 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material3.ButtonDefaults -import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/SigningAs.kt b/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/SigningAs.kt index 6a8e88c2..025d6a20 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/SigningAs.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/SigningAs.kt @@ -37,16 +37,16 @@ fun SigningAs(account: Account, modifier: Modifier = Modifier) { modifier = modifier .fillMaxWidth() .padding(vertical = 8.dp), - horizontalAlignment = Alignment.CenterHorizontally + horizontalAlignment = Alignment.CenterHorizontally, ) { Text( text = stringResource(R.string.signing_as), style = MaterialTheme.typography.bodyMedium, - color = MaterialTheme.colorScheme.onSurfaceVariant + color = MaterialTheme.colorScheme.onSurfaceVariant, ) Row( modifier = Modifier.padding(top = 4.dp), - verticalAlignment = Alignment.CenterVertically + verticalAlignment = Alignment.CenterVertically, ) { val profileUrl by account.picture.collectAsStateWithLifecycle() if (profileUrl.isNotBlank() && !BuildFlavorChecker.isOfflineFlavor()) { @@ -68,7 +68,7 @@ fun SigningAs(account: Account, modifier: Modifier = Modifier) { CircleShape, ) .height(30.dp) - .width(30.dp) + .width(30.dp), ) }, ) @@ -83,7 +83,7 @@ fun SigningAs(account: Account, modifier: Modifier = Modifier) { CircleShape, ) .height(30.dp) - .width(30.dp) + .width(30.dp), ) } @@ -92,7 +92,7 @@ fun SigningAs(account: Account, modifier: Modifier = Modifier) { modifier = Modifier.padding(start = 8.dp), text = name.ifBlank { account.npub.toShortenHex() }, fontWeight = FontWeight.Bold, - style = MaterialTheme.typography.bodyMedium + style = MaterialTheme.typography.bodyMedium, ) } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 106d3e16..f635dc8e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -20,8 +20,8 @@ zxingAndroidEmbedded = "4.3.0" okhttp = "5.3.2" kotlin = "2.3.10" workRuntimeKtx = "2.11.1" -agp = "9.0.1" -ktlint = "14.0.1" +agp = "9.1.0" +ktlint = "14.1.0" ksp = "2.3.5" coil = "3.4.0" storage = "2.2.0" @@ -29,8 +29,8 @@ jna = "5.18.1" materialIconsExtended = "1.7.8" collections = "0.4.0" pagingCommon = "3.4.1" -mockk = "1.13.12" -coroutinesTest = "1.10.1" +mockk = "1.14.9" +coroutinesTest = "1.10.2" [libraries] datastore-preferences = { module = "androidx.datastore:datastore-preferences", version.ref = "datastorePreferences" } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 8a848873..41465649 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionSha256Sum=72f44c9f8ebcb1af43838f45ee5c4aa9c5444898b3468ab3f4af7b6076c5bc3f -distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip +distributionSha256Sum=b266d5ff6b90eada6dc3b20cb090e3731302e553a27c5d3e4df1f0d76beaff06 +distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME