add url preview settings

This commit is contained in:
greenart7c3
2023-07-07 06:39:28 -03:00
parent 38bb9f457d
commit 66952c9212
11 changed files with 98 additions and 46 deletions
@@ -72,6 +72,7 @@ private object PrefKeys {
const val AUTOMATICALLY_START_PLAYBACK = "automatically_start_playback"
const val THEME = "theme"
const val PREFERRED_LANGUAGE = "preferred_Language"
const val AUTOMATICALLY_LOAD_URL_PREVIEW = "automatically_load_url_preview"
val LAST_READ: (String) -> String = { route -> "last_read_route_$route" }
}
@@ -255,6 +256,11 @@ object LocalPreferences {
} else {
putBoolean(PrefKeys.AUTOMATICALLY_START_PLAYBACK, account.settings.automaticallyStartPlayback!!)
}
if (account.settings.automaticallyShowUrlPreview == null) {
remove(PrefKeys.AUTOMATICALLY_LOAD_URL_PREVIEW)
} else {
putBoolean(PrefKeys.AUTOMATICALLY_LOAD_URL_PREVIEW, account.settings.automaticallyShowUrlPreview!!)
}
putString(PrefKeys.PREFERRED_LANGUAGE, account.settings.preferredLanguage ?: "")
}.apply()
}
@@ -396,6 +402,11 @@ object LocalPreferences {
} else {
null
}
settings.automaticallyShowUrlPreview = if (contains(PrefKeys.AUTOMATICALLY_LOAD_URL_PREVIEW)) {
getBoolean(PrefKeys.AUTOMATICALLY_LOAD_URL_PREVIEW, false)
} else {
null
}
settings.preferredLanguage = getString(PrefKeys.PREFERRED_LANGUAGE, "")
}
@@ -86,9 +86,14 @@ class Account(
var userProfileCache: User? = null
fun updateGlobalSettings(automaticallyShowImages: Boolean?, automaticallyStartPlayback: Boolean?) {
fun updateGlobalSettings(
automaticallyShowImages: Boolean?,
automaticallyStartPlayback: Boolean?,
automaticallyShowUrlPreview: Boolean?
) {
settings.automaticallyStartPlayback = automaticallyStartPlayback
settings.automaticallyShowImages = automaticallyShowImages
settings.automaticallyShowUrlPreview = automaticallyShowUrlPreview
live.invalidateData()
saveable.invalidateData()
}
@@ -6,5 +6,6 @@ import androidx.compose.runtime.Stable
class Settings(
var automaticallyShowImages: Boolean? = null,
var automaticallyStartPlayback: Boolean? = null,
var preferredLanguage: String? = null
var preferredLanguage: String? = null,
var automaticallyShowUrlPreview: Boolean? = null
)
@@ -332,7 +332,7 @@ fun NewPostView(onClose: () -> Unit, baseReplyTo: Note? = null, quote: Note? = n
} else if (videoExtensions.any { removedParamsFromUrl.endsWith(it) }) {
VideoView(myUrlPreview, automaticallyStartPlayback = remember { mutableStateOf(true) })
} else {
UrlPreview(myUrlPreview, myUrlPreview)
UrlPreview(myUrlPreview, myUrlPreview, remember { mutableStateOf(true) })
}
} else if (startsWithNIP19Scheme(myUrlPreview)) {
val bgColor = MaterialTheme.colors.background
@@ -348,7 +348,7 @@ fun NewPostView(onClose: () -> Unit, baseReplyTo: Note? = null, quote: Note? = n
nav
)
} else if (noProtocolUrlValidator.matcher(myUrlPreview).matches()) {
UrlPreview("https://$myUrlPreview", myUrlPreview)
UrlPreview("https://$myUrlPreview", myUrlPreview, remember { mutableStateOf(true) })
}
}
}
@@ -68,6 +68,16 @@ fun ExpandableRichTextViewer(
)
}
val automaticallyShowUrlPreview = remember {
mutableStateOf(
when (settings?.automaticallyShowUrlPreview) {
true -> !isMobile
false -> false
else -> true
}
)
}
var showFullText by remember { mutableStateOf(false) }
val whereToCut = remember(content) {
@@ -98,6 +108,7 @@ fun ExpandableRichTextViewer(
accountViewModel,
showImage,
automaticallyStartPlayback,
automaticallyShowUrlPreview,
nav
)
@@ -110,13 +110,14 @@ fun RichTextViewer(
accountViewModel: AccountViewModel,
showImage: MutableState<Boolean>,
automaticallyStartPlayback: MutableState<Boolean>,
automaticallyShowUrlPreview: MutableState<Boolean>,
nav: (String) -> Unit
) {
Column(modifier = modifier) {
if (remember(content) { isMarkdown(content) }) {
RenderContentAsMarkdown(content, tags, nav)
} else {
RenderRegular(content, tags, canPreview, backgroundColor, accountViewModel, showImage, automaticallyStartPlayback, nav)
RenderRegular(content, tags, canPreview, backgroundColor, accountViewModel, showImage, automaticallyStartPlayback, automaticallyShowUrlPreview, nav)
}
}
}
@@ -131,6 +132,7 @@ private fun RenderRegular(
accountViewModel: AccountViewModel,
showImage: MutableState<Boolean>,
automaticallyStartPlayback: MutableState<Boolean>,
automaticallyShowUrlPreview: MutableState<Boolean>,
nav: (String) -> Unit
) {
val state by remember(content) {
@@ -162,6 +164,7 @@ private fun RenderRegular(
accountViewModel,
showImage,
automaticallyStartPlayback,
automaticallyShowUrlPreview,
nav
)
}
@@ -243,11 +246,12 @@ private fun RenderWordWithPreview(
accountViewModel: AccountViewModel,
showImage: MutableState<Boolean>,
automaticallyStartPlayback: MutableState<Boolean>,
automaticallyShowUrlPreview: MutableState<Boolean>,
nav: (String) -> Unit
) {
when (word) {
is ImageSegment -> ZoomableContentView(word.segmentText, state, showImage, automaticallyStartPlayback)
is LinkSegment -> UrlPreview(word.segmentText, word.segmentText)
is LinkSegment -> UrlPreview(word.segmentText, word.segmentText, automaticallyShowUrlPreview)
is EmojiSegment -> RenderCustomEmoji(word.segmentText, state)
is InvoiceSegment -> MayBeInvoicePreview(word.segmentText)
is WithdrawSegment -> MayBeWithdrawal(word.segmentText)
@@ -4,6 +4,7 @@ import androidx.compose.animation.Crossfade
import androidx.compose.animation.core.tween
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.MutableState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
@@ -13,33 +14,41 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
@Composable
fun UrlPreview(url: String, urlText: String) {
var urlPreviewState by remember(url) {
mutableStateOf(
UrlCachedPreviewer.cache.get(url)?.let { it } ?: UrlPreviewState.Loading
)
}
fun UrlPreview(url: String, urlText: String, automaticallyShowUrlPreview: MutableState<Boolean>) {
if (!automaticallyShowUrlPreview.value) {
ClickableUrl(urlText, url)
} else {
var urlPreviewState by remember(url) {
mutableStateOf(
UrlCachedPreviewer.cache.get(url)?.let { it } ?: UrlPreviewState.Loading
)
}
// Doesn't use a viewModel because of viewModel reusing issues (too many UrlPreview are created).
if (urlPreviewState == UrlPreviewState.Loading) {
LaunchedEffect(url) {
launch(Dispatchers.IO) {
UrlCachedPreviewer.previewInfo(url) {
launch(Dispatchers.Main) {
urlPreviewState = it
// Doesn't use a viewModel because of viewModel reusing issues (too many UrlPreview are created).
if (urlPreviewState == UrlPreviewState.Loading) {
LaunchedEffect(url) {
launch(Dispatchers.IO) {
UrlCachedPreviewer.previewInfo(url) {
launch(Dispatchers.Main) {
urlPreviewState = it
}
}
}
}
}
}
Crossfade(targetState = urlPreviewState, animationSpec = tween(durationMillis = 100)) { state ->
when (state) {
is UrlPreviewState.Loaded -> {
UrlPreviewCard(url, state.previewInfo)
}
else -> {
ClickableUrl(urlText, url)
Crossfade(
targetState = urlPreviewState,
animationSpec = tween(durationMillis = 100)
) { state ->
when (state) {
is UrlPreviewState.Loaded -> {
UrlPreviewCard(url, state.previewInfo, automaticallyShowUrlPreview)
}
else -> {
ClickableUrl(urlText, url)
}
}
}
}
@@ -9,6 +9,7 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.MutableState
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
@@ -26,8 +27,12 @@ import com.vitorpamplona.amethyst.ui.theme.subtleBorder
@Composable
fun UrlPreviewCard(
url: String,
previewInfo: UrlInfoItem
previewInfo: UrlInfoItem,
automaticallyShowUrlPreview: MutableState<Boolean>
) {
if (!automaticallyShowUrlPreview.value) {
return ClickableUrl(url, url)
}
val uri = LocalUriHandler.current
Row(
@@ -49,8 +49,12 @@ class AccountViewModel(val account: Account, private val themeViewModel: ThemeVi
return themeViewModel.theme.value ?: "System"
}
fun updateGlobalSettings(automaticallyShowImages: Boolean?, automaticallyStartPlayback: Boolean?) {
account.updateGlobalSettings(automaticallyShowImages, automaticallyStartPlayback)
fun updateGlobalSettings(
automaticallyShowImages: Boolean?,
automaticallyStartPlayback: Boolean?,
automaticallyShowUrlPreview: Boolean?
) {
account.updateGlobalSettings(automaticallyShowImages, automaticallyStartPlayback, automaticallyShowUrlPreview)
}
fun isWriteable(): Boolean {
@@ -57,7 +57,6 @@ import com.vitorpamplona.amethyst.model.LocalCache
import com.vitorpamplona.amethyst.model.Note
import com.vitorpamplona.amethyst.model.User
import com.vitorpamplona.amethyst.service.NostrUserProfileDataSource
import com.vitorpamplona.amethyst.service.connectivitystatus.ConnectivityStatus
import com.vitorpamplona.amethyst.service.model.AppDefinitionEvent
import com.vitorpamplona.amethyst.service.model.BadgeDefinitionEvent
import com.vitorpamplona.amethyst.service.model.BadgeProfilesEvent
@@ -599,20 +598,6 @@ private fun ProfileHeader(
var popupExpanded by remember { mutableStateOf(false) }
var zoomImageDialogOpen by remember { mutableStateOf(false) }
val accountState by accountViewModel.accountLiveData.observeAsState()
val settings = accountState?.account?.settings
val isMobile = ConnectivityStatus.isOnMobileData.value
val showImage = remember {
mutableStateOf(
when (settings?.automaticallyShowImages) {
true -> !isMobile
false -> false
else -> true
}
)
}
Box {
DrawBanner(baseUser)
@@ -116,6 +116,12 @@ fun SettingsScreen(
val selectedVideoItem = remember {
mutableStateOf(selectedItens[videoIndex])
}
val linkIndex = if (settings.automaticallyShowUrlPreview == null) { 0 } else {
if (settings.automaticallyShowUrlPreview == true) 1 else 2
}
val selectedLinkItem = remember {
mutableStateOf(selectedItens[linkIndex])
}
val themeItens = arrayOf("System", "Light", "Dark")
val themeIndex = themeItens.indexOf(accountViewModel.currentTheme())
@@ -216,6 +222,12 @@ fun SettingsScreen(
title = "Automatically play videos"
)
DropDownSettings(
selectedItem = selectedLinkItem,
listItems = selectedItens,
title = "Automatically show url preview"
)
Row(
Modifier.fillMaxWidth(),
Arrangement.Center
@@ -232,10 +244,15 @@ fun SettingsScreen(
2 -> false
else -> null
}
val automaticallyShowUrlPreview = when (selectedItens.indexOf(selectedLinkItem.value)) {
1 -> true
2 -> false
else -> null
}
accountViewModel.changeTheme(selectedTheme.value)
scope.launch(Dispatchers.IO) {
accountViewModel.updateGlobalSettings(automaticallyShowImages, automaticallyStartPlayback)
accountViewModel.updateGlobalSettings(automaticallyShowImages, automaticallyStartPlayback, automaticallyShowUrlPreview)
LocalPreferences.saveToEncryptedStorage(accountViewModel.account)
LocalPreferences.updateTheme(selectedTheme.value)
ServiceManager.pause()