From c14762f82e2f40a5c576753f51e669075a275290 Mon Sep 17 00:00:00 2001 From: callebtc <93376500+callebtc@users.noreply.github.com> Date: Sat, 30 Aug 2025 15:00:20 +0200 Subject: [PATCH] animation --- .../bitchat/android/nostr/NostrProtocol.kt | 34 ++++++++++++------- .../android/nostr/PoWPreferenceManager.kt | 25 ++++++++++++++ .../bitchat/android/ui/PoWStatusIndicator.kt | 2 +- 3 files changed, 47 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/com/bitchat/android/nostr/NostrProtocol.kt b/app/src/main/java/com/bitchat/android/nostr/NostrProtocol.kt index d5f26a60..26f3c241 100644 --- a/app/src/main/java/com/bitchat/android/nostr/NostrProtocol.kt +++ b/app/src/main/java/com/bitchat/android/nostr/NostrProtocol.kt @@ -126,19 +126,27 @@ object NostrProtocol { if (powSettings.enabled && powSettings.difficulty > 0) { Log.d(TAG, "PoW enabled for geohash event: difficulty=${powSettings.difficulty}") - // Mine the event before signing - val minedEvent = NostrProofOfWork.mineEvent( - event = event, - targetDifficulty = powSettings.difficulty, - maxIterations = 2_000_000 // Allow up to 2M iterations for reasonable mining time - ) - - if (minedEvent != null) { - event = minedEvent - val actualDifficulty = NostrProofOfWork.calculateDifficulty(event.id) - Log.d(TAG, "✅ PoW mining successful: target=${powSettings.difficulty}, actual=$actualDifficulty, nonce=${NostrProofOfWork.getNonce(event)}") - } else { - Log.w(TAG, "❌ PoW mining failed, proceeding without PoW") + try { + // Start mining state for animated indicators + PoWPreferenceManager.startMining() + + // Mine the event before signing + val minedEvent = NostrProofOfWork.mineEvent( + event = event, + targetDifficulty = powSettings.difficulty, + maxIterations = 2_000_000 // Allow up to 2M iterations for reasonable mining time + ) + + if (minedEvent != null) { + event = minedEvent + val actualDifficulty = NostrProofOfWork.calculateDifficulty(event.id) + Log.d(TAG, "✅ PoW mining successful: target=${powSettings.difficulty}, actual=$actualDifficulty, nonce=${NostrProofOfWork.getNonce(event)}") + } else { + Log.w(TAG, "❌ PoW mining failed, proceeding without PoW") + } + } finally { + // Always stop mining state when done (success or failure) + PoWPreferenceManager.stopMining() } } diff --git a/app/src/main/java/com/bitchat/android/nostr/PoWPreferenceManager.kt b/app/src/main/java/com/bitchat/android/nostr/PoWPreferenceManager.kt index 53992a3f..1bb3ff8a 100644 --- a/app/src/main/java/com/bitchat/android/nostr/PoWPreferenceManager.kt +++ b/app/src/main/java/com/bitchat/android/nostr/PoWPreferenceManager.kt @@ -26,6 +26,10 @@ object PoWPreferenceManager { private val _powDifficulty = MutableStateFlow(DEFAULT_POW_DIFFICULTY) val powDifficulty: StateFlow = _powDifficulty.asStateFlow() + // Mining state for animated indicators + private val _isMining = MutableStateFlow(false) + val isMining: StateFlow = _isMining.asStateFlow() + private lateinit var sharedPrefs: SharedPreferences private var isInitialized = false @@ -121,4 +125,25 @@ object PoWPreferenceManager { 32 to "Maximum (~8h)" ) } + + /** + * Get current mining state + */ + fun isMining(): Boolean { + return _isMining.value + } + + /** + * Start mining state - triggers animated indicators + */ + fun startMining() { + _isMining.value = true + } + + /** + * Stop mining state - stops animated indicators + */ + fun stopMining() { + _isMining.value = false + } } diff --git a/app/src/main/java/com/bitchat/android/ui/PoWStatusIndicator.kt b/app/src/main/java/com/bitchat/android/ui/PoWStatusIndicator.kt index 9f3e1d1f..cfc9d55f 100644 --- a/app/src/main/java/com/bitchat/android/ui/PoWStatusIndicator.kt +++ b/app/src/main/java/com/bitchat/android/ui/PoWStatusIndicator.kt @@ -23,11 +23,11 @@ import com.bitchat.android.nostr.PoWPreferenceManager @Composable fun PoWStatusIndicator( modifier: Modifier = Modifier, - isMining: Boolean = false, style: PoWIndicatorStyle = PoWIndicatorStyle.COMPACT ) { val powEnabled by PoWPreferenceManager.powEnabled.collectAsState() val powDifficulty by PoWPreferenceManager.powDifficulty.collectAsState() + val isMining by PoWPreferenceManager.isMining.collectAsState() val colorScheme = MaterialTheme.colorScheme val isDark = colorScheme.background.red + colorScheme.background.green + colorScheme.background.blue < 1.5f