mirror of
https://github.com/vitorpamplona/amethyst.git
synced 2025-09-27 08:07:34 +02:00
Support for Gifs and SVGs
This commit is contained in:
@@ -11,10 +11,13 @@ Amethyst brings the best social network to your Android phone. Just insert your
|
|||||||
- [x] Notifications Feed
|
- [x] Notifications Feed
|
||||||
- [x] Global Feed
|
- [x] Global Feed
|
||||||
- [x] Reactions (like, boost, reply)
|
- [x] Reactions (like, boost, reply)
|
||||||
- [x] Image Preview
|
- [x] Image Preview (gifs, svgs)
|
||||||
- [x] Url Preview
|
- [x] Url Preview
|
||||||
- [x] View Threads
|
- [x] View Threads
|
||||||
- [ ] Private Messages
|
- [x] Private Messages
|
||||||
|
- [x] User Profiles (follow/unfollow)
|
||||||
|
- [ ] Notification Bubbles
|
||||||
|
- [ ] Dropdown to Link Users/Posts when writting
|
||||||
- [ ] Communities
|
- [ ] Communities
|
||||||
- [ ] Profile Edit
|
- [ ] Profile Edit
|
||||||
- [ ] Relay Edit
|
- [ ] Relay Edit
|
||||||
|
@@ -99,9 +99,14 @@ dependencies {
|
|||||||
// view videos
|
// view videos
|
||||||
implementation 'com.google.android.exoplayer:exoplayer:2.18.2'
|
implementation 'com.google.android.exoplayer:exoplayer:2.18.2'
|
||||||
|
|
||||||
|
// view gifs
|
||||||
|
implementation "io.coil-kt:coil-gif:2.2.2"
|
||||||
|
// view svgs
|
||||||
|
implementation("io.coil-kt:coil-svg:2.2.2")
|
||||||
|
|
||||||
// tabs for user profiles
|
// tabs for user profiles
|
||||||
implementation "com.google.accompanist:accompanist-pager:$accompanist_version" // Pager
|
implementation "com.google.accompanist:accompanist-pager:$accompanist_version" // Pager
|
||||||
implementation "com.google.accompanist:accompanist-pager-indicators:$accompanist_version" // Pager Indicators
|
implementation "com.google.accompanist:accompanist-pager-indicators:$accompanist_version"
|
||||||
|
|
||||||
testImplementation 'junit:junit:4.13.2'
|
testImplementation 'junit:junit:4.13.2'
|
||||||
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
|
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
package com.vitorpamplona.amethyst.ui
|
package com.vitorpamplona.amethyst.ui
|
||||||
|
|
||||||
|
import android.os.Build.VERSION.SDK_INT
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import androidx.activity.ComponentActivity
|
import androidx.activity.ComponentActivity
|
||||||
import androidx.activity.compose.setContent
|
import androidx.activity.compose.setContent
|
||||||
@@ -8,6 +9,11 @@ import androidx.compose.material.MaterialTheme
|
|||||||
import androidx.compose.material.Surface
|
import androidx.compose.material.Surface
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.lifecycle.viewmodel.compose.viewModel
|
import androidx.lifecycle.viewmodel.compose.viewModel
|
||||||
|
import coil.Coil
|
||||||
|
import coil.ImageLoader
|
||||||
|
import coil.decode.GifDecoder
|
||||||
|
import coil.decode.ImageDecoderDecoder
|
||||||
|
import coil.decode.SvgDecoder
|
||||||
import com.vitorpamplona.amethyst.KeyStorage
|
import com.vitorpamplona.amethyst.KeyStorage
|
||||||
import com.vitorpamplona.amethyst.service.NostrAccountDataSource
|
import com.vitorpamplona.amethyst.service.NostrAccountDataSource
|
||||||
import com.vitorpamplona.amethyst.service.NostrChatroomListDataSource
|
import com.vitorpamplona.amethyst.service.NostrChatroomListDataSource
|
||||||
@@ -29,6 +35,17 @@ class MainActivity : ComponentActivity() {
|
|||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
|
|
||||||
|
Coil.setImageLoader {
|
||||||
|
ImageLoader.Builder(this).components {
|
||||||
|
if (SDK_INT >= 28) {
|
||||||
|
add(ImageDecoderDecoder.Factory())
|
||||||
|
} else {
|
||||||
|
add(GifDecoder.Factory())
|
||||||
|
}
|
||||||
|
add(SvgDecoder.Factory())
|
||||||
|
}.build()
|
||||||
|
}
|
||||||
|
|
||||||
setContent {
|
setContent {
|
||||||
AmethystTheme {
|
AmethystTheme {
|
||||||
// A surface container using the 'background' color from the theme
|
// A surface container using the 'background' color from the theme
|
||||||
|
@@ -19,7 +19,7 @@ import java.net.URISyntaxException
|
|||||||
import java.net.URL
|
import java.net.URL
|
||||||
import java.util.regex.Pattern
|
import java.util.regex.Pattern
|
||||||
|
|
||||||
val imageExtension = Pattern.compile("(.*/)*.+\\.(png|jpg|gif|bmp|jpeg|webp)$")
|
val imageExtension = Pattern.compile("(.*/)*.+\\.(png|jpg|gif|bmp|jpeg|webp|svg)$")
|
||||||
val videoExtension = Pattern.compile("(.*/)*.+\\.(mp4|avi|wmv|mpg|amv|webm)$")
|
val videoExtension = Pattern.compile("(.*/)*.+\\.(mp4|avi|wmv|mpg|amv|webm)$")
|
||||||
val noProtocolUrlValidator = Pattern.compile("^[-a-zA-Z0-9@:%._\\+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b(?:[-a-zA-Z0-9()@:%_\\+.~#?&//=]*)$")
|
val noProtocolUrlValidator = Pattern.compile("^[-a-zA-Z0-9@:%._\\+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b(?:[-a-zA-Z0-9()@:%_\\+.~#?&//=]*)$")
|
||||||
val tagIndex = Pattern.compile(".*\\#\\[([0-9]+)\\].*")
|
val tagIndex = Pattern.compile(".*\\#\\[([0-9]+)\\].*")
|
||||||
@@ -54,7 +54,7 @@ fun RichTextViewer(content: String, tags: List<List<String>>?, note: Note, accou
|
|||||||
} else if (isValidURL(word)) {
|
} else if (isValidURL(word)) {
|
||||||
val removedParamsFromUrl = word.split("?")[0].toLowerCase()
|
val removedParamsFromUrl = word.split("?")[0].toLowerCase()
|
||||||
if (imageExtension.matcher(removedParamsFromUrl).matches()) {
|
if (imageExtension.matcher(removedParamsFromUrl).matches()) {
|
||||||
ExtendedImageView(word)
|
ZoomableImageView(word)
|
||||||
} else if (videoExtension.matcher(removedParamsFromUrl).matches()) {
|
} else if (videoExtension.matcher(removedParamsFromUrl).matches()) {
|
||||||
VideoView(word)
|
VideoView(word)
|
||||||
} else {
|
} else {
|
||||||
|
@@ -29,7 +29,7 @@ import com.vitorpamplona.amethyst.ui.actions.CloseButton
|
|||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
@OptIn(ExperimentalComposeUiApi::class)
|
@OptIn(ExperimentalComposeUiApi::class)
|
||||||
fun ExtendedImageView(word: String) {
|
fun ZoomableImageView(word: String) {
|
||||||
// store the dialog open or close state
|
// store the dialog open or close state
|
||||||
var dialogOpen by remember {
|
var dialogOpen by remember {
|
||||||
mutableStateOf(false)
|
mutableStateOf(false)
|
||||||
|
Reference in New Issue
Block a user