diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostViewModel.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostViewModel.kt index 51c20e8ae..997c3140d 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostViewModel.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostViewModel.kt @@ -981,6 +981,10 @@ open class NewPostViewModel : ViewModel() { draftTextChanges.trySend("") } + open fun addToMessage(it: String) { + updateMessage(TextFieldValue(message.text + " " + it)) + } + open fun updateMessage(it: TextFieldValue) { message = it urlPreview = findUrlInMessage() diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppNavigation.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppNavigation.kt index 50dd3e058..7d27bfc5f 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppNavigation.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppNavigation.kt @@ -293,7 +293,7 @@ fun AppNavigation( popEnterTransition = { scaleIn }, popExitTransition = { slideOutVerticallyToBottom }, ) { - val draftMessage = it.message() + val draftMessage = it.arguments?.getString("message")?.ifBlank { null } val attachment = it.arguments?.getString("attachment")?.ifBlank { null }?.let { Uri.parse(it) @@ -304,6 +304,7 @@ fun AppNavigation( val version = it.arguments?.getString("version") val draft = it.arguments?.getString("draft") val enableMessageInterface = it.arguments?.getBoolean("enableMessageInterface") ?: false + NewPostScreen( message = draftMessage, attachment = attachment, @@ -333,9 +334,12 @@ private fun NavigateIfIntentRequested( accountStateViewModel: AccountStateViewModel, ) { val activity = LocalContext.current.getActivity() - var newAccount by remember { mutableStateOf(null) } if (activity.intent.action == Intent.ACTION_SEND) { + // avoids restarting the new Post screen when the intent is for the screen. + // Microsoft's swift key sends Gifs as new actions + if (isBaseRoute(nav.controller, Route.NewPost.base)) return + // saves the intent to avoid processing again var message by remember { mutableStateOf( @@ -356,6 +360,8 @@ private fun NavigateIfIntentRequested( media = null message = null } else { + var newAccount by remember { mutableStateOf(null) } + var currentIntentNextPage by remember { mutableStateOf( activity.intent @@ -404,12 +410,16 @@ private fun NavigateIfIntentRequested( val consumer = Consumer { intent -> if (intent.action == Intent.ACTION_SEND) { - intent.getStringExtra(Intent.EXTRA_TEXT)?.let { - nav.newStack(buildNewPostRoute(draftMessage = it)) - } + // avoids restarting the new Post screen when the intent is for the screen. + // Microsoft's swift key sends Gifs as new actions + if (!isBaseRoute(nav.controller, Route.NewPost.base)) { + intent.getStringExtra(Intent.EXTRA_TEXT)?.let { + nav.newStack(buildNewPostRoute(draftMessage = it)) + } - (intent.getParcelableExtra(Intent.EXTRA_STREAM) as? Uri)?.let { - nav.newStack(buildNewPostRoute(attachment = it)) + (intent.getParcelableExtra(Intent.EXTRA_STREAM) as? Uri)?.let { + nav.newStack(buildNewPostRoute(attachment = it)) + } } } else { val uri = intent.data?.toString() diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/navigation/Routes.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/navigation/Routes.kt index ab0ad7103..9cb92b8bf 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/navigation/Routes.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/navigation/Routes.kt @@ -248,6 +248,15 @@ sealed class Route( ) } +fun isBaseRoute( + navController: NavHostController, + startsWith: String, +): Boolean = + navController.currentBackStackEntry + ?.destination + ?.route + ?.startsWith(startsWith) ?: false + fun getRouteWithArguments(navController: NavHostController): String? { val currentEntry = navController.currentBackStackEntry ?: return null return getRouteWithArguments(currentEntry.destination, currentEntry.arguments) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/ReactionsRow.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/ReactionsRow.kt index 9a9fd900d..3857ae8db 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/ReactionsRow.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/ReactionsRow.kt @@ -48,7 +48,6 @@ import androidx.compose.foundation.layout.ExperimentalLayoutApi import androidx.compose.foundation.layout.FlowRow import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size @@ -81,6 +80,7 @@ import androidx.compose.ui.Alignment.Companion.CenterStart import androidx.compose.ui.Alignment.Companion.CenterVertically import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.StrokeCap import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.semantics.Role @@ -116,10 +116,11 @@ import com.vitorpamplona.amethyst.ui.note.types.RenderReaction import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel import com.vitorpamplona.amethyst.ui.stringRes import com.vitorpamplona.amethyst.ui.theme.ButtonBorder -import com.vitorpamplona.amethyst.ui.theme.DarkerGreen import com.vitorpamplona.amethyst.ui.theme.Font14SP import com.vitorpamplona.amethyst.ui.theme.HalfDoubleVertSpacer import com.vitorpamplona.amethyst.ui.theme.HalfPadding +import com.vitorpamplona.amethyst.ui.theme.Height24dpFilledModifier +import com.vitorpamplona.amethyst.ui.theme.Height4dpFilledModifier import com.vitorpamplona.amethyst.ui.theme.ModifierWidth3dp import com.vitorpamplona.amethyst.ui.theme.NoSoTinyBorders import com.vitorpamplona.amethyst.ui.theme.ReactionRowExpandButton @@ -141,7 +142,7 @@ import com.vitorpamplona.amethyst.ui.theme.TinyBorders import com.vitorpamplona.amethyst.ui.theme.defaultTweenDuration import com.vitorpamplona.amethyst.ui.theme.defaultTweenFloatSpec import com.vitorpamplona.amethyst.ui.theme.defaultTweenIntOffsetSpec -import com.vitorpamplona.amethyst.ui.theme.mediumImportanceLink +import com.vitorpamplona.amethyst.ui.theme.fundraiserProgressColor import com.vitorpamplona.amethyst.ui.theme.placeholderText import com.vitorpamplona.amethyst.ui.theme.reactionBox import com.vitorpamplona.amethyst.ui.theme.ripple24dp @@ -348,22 +349,13 @@ fun RenderZapRaiser( } } - val color = - if (zapraiserStatus.progress > 0.99) { - DarkerGreen - } else { - MaterialTheme.colorScheme.mediumImportanceLink - } - LinearProgressIndicator( - modifier = - remember(details) { - Modifier - .fillMaxWidth() - .height(if (details) 24.dp else 4.dp) - }, - color = color, + modifier = if (details) Height24dpFilledModifier else Height4dpFilledModifier, + color = MaterialTheme.colorScheme.fundraiserProgressColor, progress = { zapraiserStatus.progress }, + gapSize = 0.dp, + strokeCap = StrokeCap.Square, + drawStopIndicator = {}, ) if (details) { @@ -380,7 +372,7 @@ fun RenderZapRaiser( text = stringRes(id = R.string.sats_to_complete, totalPercentage, zapraiserStatus.left), modifier = NoSoTinyBorders, - color = MaterialTheme.colorScheme.placeholderText, + // color = MaterialTheme.colorScheme.placeholderText, fontSize = Font14SP, maxLines = 1, ) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/NewPostScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/NewPostScreen.kt index 9554e2e25..7dff3251e 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/NewPostScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/NewPostScreen.kt @@ -21,9 +21,11 @@ package com.vitorpamplona.amethyst.ui.screen.loggedIn import android.Manifest +import android.content.Intent import android.graphics.Bitmap import android.net.Uri import android.os.Build +import android.os.Parcelable import android.util.Log import android.util.Size import android.widget.Toast @@ -119,6 +121,7 @@ import androidx.compose.ui.text.style.TextDirection import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import androidx.core.util.Consumer import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.viewmodel.compose.viewModel import coil.compose.AsyncImage @@ -146,7 +149,8 @@ import com.vitorpamplona.amethyst.ui.components.InvoiceRequest import com.vitorpamplona.amethyst.ui.components.LoadUrlPreview import com.vitorpamplona.amethyst.ui.components.VideoView import com.vitorpamplona.amethyst.ui.components.ZapRaiserRequest -import com.vitorpamplona.amethyst.ui.navigation.INav +import com.vitorpamplona.amethyst.ui.navigation.Nav +import com.vitorpamplona.amethyst.ui.navigation.getActivity import com.vitorpamplona.amethyst.ui.note.BaseUserPicture import com.vitorpamplona.amethyst.ui.note.CancelIcon import com.vitorpamplona.amethyst.ui.note.CloseIcon @@ -203,12 +207,13 @@ fun NewPostScreen( draft: Note? = null, enableMessageInterface: Boolean = false, accountViewModel: AccountViewModel, - nav: INav, + nav: Nav, ) { val postViewModel: NewPostViewModel = viewModel() postViewModel.wantsDirectMessage = enableMessageInterface val context = LocalContext.current + val activity = context.getActivity() val scrollState = rememberScrollState() val scope = rememberCoroutineScope() @@ -250,6 +255,27 @@ fun NewPostScreen( NostrSearchEventOrUserDataSource.stop() } } + + DisposableEffect(nav, activity) { + // Microsoft's swift key sends Gifs as new actions + + val consumer = + Consumer { intent -> + if (intent.action == Intent.ACTION_SEND) { + intent.getStringExtra(Intent.EXTRA_TEXT)?.ifBlank { null }?.let { + postViewModel.addToMessage(it) + } + + (intent.getParcelableExtra(Intent.EXTRA_STREAM) as? Uri)?.let { + postViewModel.selectImage(it) + } + } + } + + activity.addOnNewIntentListener(consumer) + onDispose { activity.removeOnNewIntentListener(consumer) } + } + Scaffold( topBar = { TopAppBar( diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/theme/Color.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/theme/Color.kt index 44eef1170..fc301a81d 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/theme/Color.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/theme/Color.kt @@ -53,3 +53,6 @@ val DarkWarningColor = Color(0xFFF8DE22) val LightAllGoodColor = Color(0xFF339900) val DarkAllGoodColor = Color(0xFF99cc33) + +val LightFundraiserProgressColor = Color(0xFF3DB601) +val DarkFundraiserProgressColor = Color(0xFF61A229) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/theme/Shape.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/theme/Shape.kt index 0bec3e967..cc5693357 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/theme/Shape.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/theme/Shape.kt @@ -178,6 +178,9 @@ val UserNameMaxRowHeight = Modifier.fillMaxWidth() val Height24dpModifier = Modifier.height(24.dp) val Height4dpModifier = Modifier.height(4.dp) +val Height24dpFilledModifier = Modifier.fillMaxWidth().height(24.dp) +val Height4dpFilledModifier = Modifier.fillMaxWidth().height(4.dp) + val AccountPictureModifier = Modifier.size(55.dp).clip(shape = CircleShape) val HeaderPictureModifier = Modifier.size(34.dp).clip(shape = CircleShape) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/theme/Theme.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/theme/Theme.kt index d5ec9cbf9..be46269fc 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/theme/Theme.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/theme/Theme.kt @@ -397,6 +397,9 @@ val ColorScheme.warningColor: Color val ColorScheme.allGoodColor: Color get() = if (isLight) LightAllGoodColor else DarkAllGoodColor +val ColorScheme.fundraiserProgressColor: Color + get() = if (isLight) LightFundraiserProgressColor else DarkFundraiserProgressColor + val ColorScheme.markdownStyle: RichTextStyle get() = if (isLight) MarkDownStyleOnLight else MarkDownStyleOnDark