diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/MainActivity.kt b/app/src/main/java/com/greenart7c3/nostrsigner/MainActivity.kt index f86933f7..e2e84b7b 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/MainActivity.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/MainActivity.kt @@ -38,6 +38,7 @@ import com.vitorpamplona.quartz.nip19Bech32.toNpub import com.vitorpamplona.quartz.utils.Hex import java.time.Duration import java.time.Instant +import kotlinx.collections.immutable.persistentListOf import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -110,7 +111,7 @@ class MainActivity : AppCompatActivity() { CircularProgressIndicator() } } else { - val bunkerRequests = BunkerRequestUtils.state.collectAsStateWithLifecycle(emptyList()) + val bunkerRequests = BunkerRequestUtils.state.collectAsStateWithLifecycle(persistentListOf()) val npub = remember { mainViewModel.getAccount(intent?.getStringExtra("current_user")) } val accountStateViewModel: AccountStateViewModel = diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/MainViewModel.kt b/app/src/main/java/com/greenart7c3/nostrsigner/MainViewModel.kt index abc98996..a3d5d6f3 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/MainViewModel.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/MainViewModel.kt @@ -16,6 +16,9 @@ import com.vitorpamplona.quartz.nip19Bech32.Nip19Parser import com.vitorpamplona.quartz.nip19Bech32.entities.NPub import com.vitorpamplona.quartz.nip19Bech32.toNpub import com.vitorpamplona.quartz.utils.Hex +import kotlinx.collections.immutable.ImmutableList +import kotlinx.collections.immutable.persistentListOf +import kotlinx.collections.immutable.toPersistentList import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay import kotlinx.coroutines.flow.MutableStateFlow @@ -24,21 +27,21 @@ import kotlinx.coroutines.launch @SuppressLint("StaticFieldLeak") class MainViewModel(val context: Context) : ViewModel() { - private val _intents = MutableStateFlow>(listOf()) + private val _intents = MutableStateFlow>(persistentListOf()) val intents = _intents.asStateFlow() var navController: NavHostController? = null fun addAll(list: List) { val newList = list.filter { !intents.value.contains(it) } - _intents.value += newList + _intents.value = (_intents.value + newList).toPersistentList() } fun removeAll(intents: List) { - _intents.value -= intents.toSet() + _intents.value = (_intents.value - intents.toSet()).toPersistentList() } fun clear() { - _intents.value = emptyList() + _intents.value = persistentListOf() } fun getAccount(userFromIntent: String?): String? { diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/SignerActivity.kt b/app/src/main/java/com/greenart7c3/nostrsigner/SignerActivity.kt index 496483a3..70d73efd 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/SignerActivity.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/SignerActivity.kt @@ -43,6 +43,7 @@ import com.greenart7c3.nostrsigner.ui.navigation.Route import com.greenart7c3.nostrsigner.ui.theme.NostrSignerTheme import com.vitorpamplona.quartz.nip19Bech32.toNpub import com.vitorpamplona.quartz.utils.Hex +import kotlinx.collections.immutable.persistentListOf import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -126,7 +127,7 @@ class SignerActivity : AppCompatActivity() { CircularProgressIndicator() } } else { - val bunkerRequests = BunkerRequestUtils.state.collectAsStateWithLifecycle(emptyList()) + val bunkerRequests = BunkerRequestUtils.state.collectAsStateWithLifecycle(persistentListOf()) val npub = remember { mainViewModel.getAccount(intent?.getStringExtra("current_user")) } val accountStateViewModel: AccountStateViewModel = diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/service/BunkerRequestUtils.kt b/app/src/main/java/com/greenart7c3/nostrsigner/service/BunkerRequestUtils.kt index 85dd709a..16089ce0 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/service/BunkerRequestUtils.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/service/BunkerRequestUtils.kt @@ -28,25 +28,28 @@ import com.vitorpamplona.quartz.nip46RemoteSigner.BunkerResponse import com.vitorpamplona.quartz.nip46RemoteSigner.NostrConnectEvent import com.vitorpamplona.quartz.utils.TimeUtils import kotlin.collections.toSet +import kotlinx.collections.immutable.ImmutableList +import kotlinx.collections.immutable.persistentListOf +import kotlinx.collections.immutable.toPersistentList import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.launch object BunkerRequestUtils { - val state = MutableStateFlow(listOf()) + val state = MutableStateFlow>(persistentListOf()) fun addRequest(request: AmberBunkerRequest) { if (state.value.any { it.request.id == request.request.id }) return - state.tryEmit(state.value + request) + state.tryEmit((state.value + request).toPersistentList()) } fun clearRequests() { - state.tryEmit(emptyList()) + state.tryEmit(persistentListOf()) } fun remove(id: String) { - state.tryEmit(state.value.filter { it.request.id != id }) + state.tryEmit(state.value.filter { it.request.id != id }.toPersistentList()) } fun getBunkerRequests(): List = state.value diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/ui/AccountScreen.kt b/app/src/main/java/com/greenart7c3/nostrsigner/ui/AccountScreen.kt index c6bbd799..6c56b270 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/ui/AccountScreen.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/ui/AccountScreen.kt @@ -38,6 +38,8 @@ import com.greenart7c3.nostrsigner.models.AmberBunkerRequest import com.greenart7c3.nostrsigner.models.IntentResultType import com.greenart7c3.nostrsigner.service.IntentUtils import com.greenart7c3.nostrsigner.ui.navigation.Route +import kotlinx.collections.immutable.ImmutableList +import kotlinx.collections.immutable.persistentListOf @SuppressLint("StateFlowValueCalledInComposition", "UnrememberedMutableState") @Composable @@ -47,7 +49,7 @@ fun AccountScreen( packageName: String?, appName: String?, mainViewModel: MainViewModel, - bunkerRequests: List, + bunkerRequests: ImmutableList, navController: NavHostController, isExternalRequest: Boolean = false, ) { @@ -66,7 +68,7 @@ fun AccountScreen( MainLoginPage(accountStateViewModel, newNavController) } is AccountState.LoggedIn -> { - val intents by mainViewModel.intents.collectAsState(initial = emptyList()) + val intents by mainViewModel.intents.collectAsState(initial = persistentListOf()) LaunchedEffect(intent) { intent?.let { IntentUtils.getIntentData( diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/ui/IncomingRequestScreen.kt b/app/src/main/java/com/greenart7c3/nostrsigner/ui/IncomingRequestScreen.kt index 24a03491..185c7664 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/ui/IncomingRequestScreen.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/ui/IncomingRequestScreen.kt @@ -26,12 +26,13 @@ import com.greenart7c3.nostrsigner.models.IntentResultType import com.greenart7c3.nostrsigner.ui.components.BunkerSingleEventHomeScreen import com.greenart7c3.nostrsigner.ui.components.IntentSingleEventHomeScreen import com.greenart7c3.nostrsigner.ui.components.MultiEventHomeScreen +import kotlinx.collections.immutable.ImmutableList @Composable fun IncomingRequestScreen( modifier: Modifier, - intents: List, - bunkerRequests: List, + intents: ImmutableList, + bunkerRequests: ImmutableList, packageName: String?, applicationName: String?, account: Account, 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 9c040705..9382ae9c 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/ui/MainScreen.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/ui/MainScreen.kt @@ -81,6 +81,7 @@ import com.greenart7c3.nostrsigner.ui.components.AmberFloatingButton import com.greenart7c3.nostrsigner.ui.components.AmberTopAppBar import com.greenart7c3.nostrsigner.ui.navigation.Route import java.util.Base64 +import kotlinx.collections.immutable.ImmutableList import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -131,8 +132,8 @@ fun requestIgnoreBatteryOptimizations(context: Context) { fun MainScreen( account: Account, accountStateViewModel: AccountStateViewModel, - intents: List, - bunkerRequests: List, + intents: ImmutableList, + bunkerRequests: ImmutableList, packageName: String?, appName: String?, route: MutableState, 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 b7b47927..d00e4c16 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 @@ -50,6 +50,7 @@ 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.collections.immutable.ImmutableList import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -63,8 +64,8 @@ fun AmberTopAppBar( context: Context, navBackStackEntry: NavBackStackEntry?, account: Account, - intents: List, - bunkerRequests: List, + intents: ImmutableList, + bunkerRequests: ImmutableList, packageName: String?, ) { if (intents.isEmpty() || packageName == null || destinationRoute != Route.IncomingRequest.route) { 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 f5136f8c..71aaf994 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 @@ -64,19 +64,20 @@ import com.vitorpamplona.quartz.nip46RemoteSigner.BunkerResponse import com.vitorpamplona.quartz.utils.TimeUtils import kotlin.collections.forEach import kotlin.collections.set +import kotlinx.collections.immutable.ImmutableList import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @Composable fun BunkerMultiEventHomeScreen( modifier: Modifier, - bunkerRequests: List, + bunkerRequests: ImmutableList, packageName: String?, accountParam: Account, onLoading: (Boolean) -> Unit, ) { val context = LocalContext.current - val hasRelayAuthEvents = bunkerRequests.any { it.request is BunkerRequestSign && (it.request as BunkerRequestSign).event.kind == 22242 } + val hasRelayAuthEvents = bunkerRequests.any { it.request is BunkerRequestSign && it.request.event.kind == 22242 } var localAccount by remember { mutableStateOf("") } val key = bunkerRequests.first().localKey var rememberType by remember { mutableStateOf(RememberType.NEVER) } diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/BunkerPermissionCard.kt b/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/BunkerPermissionCard.kt index 680a0ec0..8390e30c 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/BunkerPermissionCard.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/BunkerPermissionCard.kt @@ -16,7 +16,6 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.MutableState -import com.greenart7c3.nostrsigner.service.MultiEventScreenIntents import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color @@ -39,6 +38,7 @@ import com.greenart7c3.nostrsigner.models.Permission import com.greenart7c3.nostrsigner.models.PrivateZapEncryptedDataKind import com.greenart7c3.nostrsigner.models.SignerType import com.greenart7c3.nostrsigner.models.TagArrayEncryptedDataKind +import com.greenart7c3.nostrsigner.service.MultiEventScreenIntents import kotlin.collections.forEach @Composable diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/IntentMultiEventHomeScreen.kt b/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/IntentMultiEventHomeScreen.kt index 2751b7b9..539fba95 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/IntentMultiEventHomeScreen.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/IntentMultiEventHomeScreen.kt @@ -64,13 +64,14 @@ import com.vitorpamplona.quartz.nip57Zaps.LnZapRequestEvent import com.vitorpamplona.quartz.utils.TimeUtils import kotlin.collections.forEach import kotlin.collections.set +import kotlinx.collections.immutable.ImmutableList import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @Composable fun IntentMultiEventHomeScreen( modifier: Modifier, - intents: List, + intents: ImmutableList, packageName: String?, accountParam: Account, onRemoveIntentData: (List, IntentResultType) -> Unit, diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/MultiEventHomeScreen.kt b/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/MultiEventHomeScreen.kt index 8e0934fd..347d52b8 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/MultiEventHomeScreen.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/MultiEventHomeScreen.kt @@ -6,12 +6,13 @@ import com.greenart7c3.nostrsigner.models.Account import com.greenart7c3.nostrsigner.models.AmberBunkerRequest import com.greenart7c3.nostrsigner.models.IntentData import com.greenart7c3.nostrsigner.models.IntentResultType +import kotlinx.collections.immutable.ImmutableList @Composable fun MultiEventHomeScreen( modifier: Modifier, - intents: List, - bunkerRequests: List, + intents: ImmutableList, + bunkerRequests: ImmutableList, packageName: String?, accountParam: Account, onRemoveIntentData: (List, IntentResultType) -> Unit, diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/PermissionCard.kt b/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/PermissionCard.kt index a12c7fa8..73dff192 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/PermissionCard.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/PermissionCard.kt @@ -16,7 +16,6 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.MutableState -import com.greenart7c3.nostrsigner.service.MultiEventScreenIntents import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color @@ -39,6 +38,7 @@ import com.greenart7c3.nostrsigner.models.Permission import com.greenart7c3.nostrsigner.models.PrivateZapEncryptedDataKind import com.greenart7c3.nostrsigner.models.SignerType import com.greenart7c3.nostrsigner.models.TagArrayEncryptedDataKind +import com.greenart7c3.nostrsigner.service.MultiEventScreenIntents import kotlin.collections.forEach @Composable