Skip to content

Commit b73dd38

Browse files
committed
1.0.12
- Fix user status not updating - Fix current user status not being registered - Fix crash when chats are updated - Fix images not loading sometimes - Fix user status appearing on group chats that share the username of a friend - Fix crash when backing out of the file manager with no files selected on gallery upload
1 parent ce499f1 commit b73dd38

File tree

10 files changed

+122
-87
lines changed

10 files changed

+122
-87
lines changed

app/build.gradle.kts

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ android {
3131
applicationId = "com.troplo.privateuploader"
3232
minSdk = 28
3333
targetSdk = 34
34-
versionCode = 11
35-
versionName = "1.0.11"
34+
versionCode = 12
35+
versionName = "1.0.12"
3636
multiDexEnabled = true
3737
buildConfigField("String", "SERVER_URL", "\"https://privateuploader.com\"")
3838
buildConfigField("String", "BUILD_TIME", "\"${DateFormat.getDateTimeInstance().format(System.currentTimeMillis())}\"")
@@ -87,6 +87,7 @@ android {
8787
}
8888

8989
dependencies {
90+
implementation("com.github.skydoves:landscapist-glide:2.2.13-SNAPSHOT")
9091
implementation("com.apollographql.apollo3:apollo-runtime:3.8.2")
9192
// Firebase
9293
implementation(platform("com.google.firebase:firebase-bom:32.1.1"))
@@ -108,18 +109,18 @@ dependencies {
108109
implementation("io.sentry:sentry-android:6.23.0")
109110
implementation("io.sentry:sentry-compose-android:6.23.0")
110111
implementation("androidx.compose.runtime:runtime-tracing:1.0.0-alpha03")
111-
implementation("io.coil-kt:coil-gif:2.4.0")
112-
implementation("io.coil-kt:coil-compose:2.4.0")
113112
implementation("com.github.X1nto:OverlappingPanelsCompose:1.2.0")
114-
implementation("io.coil-kt:coil:2.3.0")
115113
implementation("com.github.jeziellago:compose-markdown:0.3.3")
116-
implementation("com.github.bumptech.glide:compose:1.0.0-alpha.1")
114+
implementation("com.github.bumptech.glide:compose:1.0.0-beta01")
117115
implementation("com.squareup.retrofit2:retrofit:2.10.0-SNAPSHOT")
118116
implementation("com.squareup.retrofit2:converter-moshi:2.10.0-SNAPSHOT")
119117
implementation("com.squareup.moshi:moshi:1.12.0")
120118
implementation("com.squareup.moshi:moshi-kotlin:1.12.0")
121-
implementation("com.github.bumptech.glide:glide:4.16.0-SNAPSHOT")
119+
implementation("com.github.bumptech.glide:glide:5.0.0-rc01")
122120
implementation("com.squareup.okhttp3:logging-interceptor:4.9.1")
121+
implementation("io.coil-kt:coil:2.3.0")
122+
implementation("io.coil-kt:coil-compose:2.4.0")
123+
implementation("io.coil-kt:coil-gif:2.4.0")
123124
implementation("androidx.core:core-ktx:1.10.1")
124125
implementation("com.google.code.gson:gson:2.10.1")
125126
implementation("com.squareup.retrofit2:converter-gson:2.10.0-SNAPSHOT")

app/src/main/java/com/troplo/privateuploader/MainActivity.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,11 @@ class MainActivity : ComponentActivity() {
156156

157157
public fun upload(files: List<UploadTarget>, deleteOnceFinished: Boolean = true, context: Context = this) {
158158
Log.d("TPU.Upload", "Uploading ${files.size} files")
159+
160+
if(!files.any()) {
161+
return
162+
}
163+
159164
if(deleteOnceFinished) {
160165
UploadStore.uploads = files.toMutableStateList()
161166
}

app/src/main/java/com/troplo/privateuploader/api/SocketHandler.kt

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ object SocketHandler {
2626

2727
private var chatSocket: Socket? = null
2828
private var gallerySocket: Socket? = null
29+
private var userSocket: Socket? = null
30+
private var friendsSocket: Socket? = null
31+
private var trackedUsersSocket: Socket? = null
2932

3033
private var manager: Manager? = null
3134
val gson = Gson()
@@ -47,9 +50,15 @@ object SocketHandler {
4750
manager = Manager(URI(baseUrl), options)
4851
chatSocket = manager!!.socket("/chat", options)
4952
gallerySocket = manager!!.socket("/gallery", options)
50-
if(gallerySocket != null) {
51-
gallerySocket?.open()
52-
}
53+
userSocket = manager!!.socket("/user", options)
54+
friendsSocket = manager!!.socket("/friends", options)
55+
trackedUsersSocket = manager!!.socket("/trackedUsers", options)
56+
57+
gallerySocket?.open()
58+
userSocket?.open()
59+
friendsSocket?.open()
60+
trackedUsersSocket?.open()
61+
5362
if (chatSocket != null) {
5463
chatSocket?.open()
5564
if (platform !== "android_kotlin_background_service") {
@@ -101,9 +110,14 @@ object SocketHandler {
101110
}
102111
Log.d("MessageStore", "Unread; $unread, Chat: $chat")
103112
if(chat != null) {
104-
val index = ChatStore.chats.indexOfFirst { it.id == chat.id }
105-
ChatStore.chats.removeAt(index)
106-
ChatStore.chats.add(0, chat.copy(unread = unread))
113+
val modifiedChats = ChatStore.chats.toMutableList()
114+
val index = modifiedChats.indexOfFirst { it.id == chat.id }
115+
if (index != -1) {
116+
modifiedChats.removeAt(index)
117+
modifiedChats.add(0, chat.copy(unread = unread))
118+
ChatStore.chats.clear()
119+
ChatStore.chats.addAll(modifiedChats)
120+
}
107121
}
108122
}
109123
chatSocket?.on("typing") { it ->
@@ -156,6 +170,18 @@ object SocketHandler {
156170
return gallerySocket
157171
}
158172

173+
fun getUserSocket(): Socket? {
174+
return userSocket
175+
}
176+
177+
fun getFriendsSocket(): Socket? {
178+
return friendsSocket
179+
}
180+
181+
fun getTrackedUsersSocket(): Socket? {
182+
return trackedUsersSocket
183+
}
184+
159185
fun closeSocket() {
160186
chatSocket?.disconnect()
161187
chatSocket = null

app/src/main/java/com/troplo/privateuploader/api/stores/FriendStore.kt

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,9 @@ object FriendStore {
1919

2020
fun initializeFriends() {
2121
try {
22-
val socket = SocketHandler.getSocket()
23-
socket?.off("userStatus")
22+
val socket = SocketHandler.getFriendsSocket();
23+
val tracked = SocketHandler.getTrackedUsersSocket()
24+
tracked?.off("userStatus")
2425
socket?.off("friendRequest")
2526

2627
CoroutineScope(
@@ -32,26 +33,32 @@ object FriendStore {
3233
}
3334
}
3435

36+
Log.d("FriendStore", "initialized")
3537

36-
socket?.on("userStatus") { it ->
38+
tracked?.on("userStatus") { it ->
3739
val jsonArray = it[0] as JSONObject
3840
val payload = jsonArray.toString()
39-
Log.d("TPU.Untagged", payload)
41+
Log.d("FriendStore.UserStatus", payload)
4042
val status = SocketHandler.gson.fromJson(payload, StatusPayload::class.java)
4143
val friend = friends.value.find { it.otherUser?.id == status.id }
4244

45+
Log.d("FriendStore.UserStatus", "friend: $friend")
46+
4347
if (friend != null) {
4448
friends.value = friends.value.minus(friend).plus(
4549
friend.copy(
4650
otherUser = friend.otherUser?.copy(
47-
status = status.status ?: "offline",
51+
status = status.status?.lowercase() ?: "offline",
4852
platforms = status.platforms
4953
)
5054
)
5155
)
5256
} else if (status.id == UserStore.user.value?.id) {
57+
Log.d("FriendStore.UserStatus", "updating current user status")
5358
UserStore.user.value = UserStore.user.value?.copy(
54-
status = status.status ?: "offline",
59+
status = status.status?.lowercase() ?: "offline",
60+
storedStatus = if (status.status?.lowercase() === "offline") "invisible" else status.status?.lowercase()
61+
?: "offline",
5562
platforms = status.platforms
5663
)
5764
}
@@ -87,7 +94,13 @@ object FriendStore {
8794
fun updateFriendNickname(name: String, userId: Int) {
8895
friends.value = friends.value.map {
8996
if (it.otherUser?.id == userId) {
90-
it.copy(otherUser = it.otherUser?.copy(nickname = it.otherUser?.nickname?.copy(nickname = name)))
97+
it.copy(
98+
otherUser = it.otherUser?.copy(
99+
nickname = it.otherUser?.nickname?.copy(
100+
nickname = name
101+
)
102+
)
103+
)
91104
} else {
92105
it
93106
}

app/src/main/java/com/troplo/privateuploader/components/chat/ChatItem.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,8 @@ fun ChatItem(
8383
icon = {
8484
UserAvatar(
8585
avatar = chat.icon ?: chat.recipient?.avatar,
86-
username = chatName
86+
username = chat.recipient?.username ?: chatName,
87+
showStatus = chat.recipient != null
8788
)
8889
}
8990
)

app/src/main/java/com/troplo/privateuploader/components/chat/Embed.kt

Lines changed: 17 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,12 @@ package com.troplo.privateuploader.components.chat
22

33
import android.content.Intent
44
import android.net.Uri
5-
import androidx.compose.foundation.Image
65
import androidx.compose.foundation.clickable
76
import androidx.compose.foundation.layout.Box
87
import androidx.compose.foundation.layout.Column
98
import androidx.compose.foundation.layout.Row
109
import androidx.compose.foundation.layout.Spacer
1110
import androidx.compose.foundation.layout.fillMaxSize
12-
import androidx.compose.foundation.layout.fillMaxWidth
1311
import androidx.compose.foundation.layout.height
1412
import androidx.compose.foundation.layout.heightIn
1513
import androidx.compose.foundation.layout.padding
@@ -29,18 +27,16 @@ import androidx.compose.runtime.remember
2927
import androidx.compose.ui.Alignment
3028
import androidx.compose.ui.Modifier
3129
import androidx.compose.ui.graphics.Color
30+
import androidx.compose.ui.layout.ContentScale
3231
import androidx.compose.ui.platform.LocalContext
3332
import androidx.compose.ui.unit.dp
34-
import coil.compose.rememberAsyncImagePainter
35-
import coil.request.ImageRequest
36-
import coil.size.Size
3733
import com.bumptech.glide.integration.compose.ExperimentalGlideComposeApi
34+
import com.skydoves.landscapist.ImageOptions
35+
import com.skydoves.landscapist.glide.GlideImage
3836
import com.troplo.privateuploader.api.TpuFunctions
39-
import com.troplo.privateuploader.api.imageLoader
4037
import com.troplo.privateuploader.api.stores.UserStore
4138
import com.troplo.privateuploader.components.chat.dialogs.ImageDialog
4239
import com.troplo.privateuploader.data.model.Embed
43-
import kotlinx.coroutines.Dispatchers
4440

4541
@OptIn(ExperimentalGlideComposeApi::class)
4642
@Composable
@@ -76,22 +72,18 @@ fun Embed(embed: Embed) {
7672
if (expand.value) {
7773
ImageDialog(url ?: "", embed.data.upload?.name ?: "unknown.png", expand)
7874
}
79-
Image(
80-
contentDescription = "Embed image (no alt text)",
81-
painter = rememberAsyncImagePainter(
82-
ImageRequest.Builder(LocalContext.current)
83-
.dispatcher(Dispatchers.IO)
84-
.data(data = url)
85-
.apply(block = fun ImageRequest.Builder.() {
86-
size(Size.ORIGINAL)
87-
}).build(), imageLoader = imageLoader(LocalContext.current, false)
88-
),
75+
76+
GlideImage(
77+
imageModel = { url },
8978
modifier = Modifier
90-
.fillMaxWidth()
79+
.fillMaxSize()
9180
.height(if (embed.data.height!! > 300) 300.dp else embed.data.height.dp)
9281
.clickable {
9382
expand.value = true
94-
}
83+
},
84+
imageOptions = ImageOptions(
85+
contentScale = ContentScale.FillWidth
86+
)
9587
)
9688

9789
}
@@ -149,7 +141,9 @@ fun Embed(embed: Embed) {
149141

150142
else -> {
151143
Card(
152-
modifier = Modifier.width(300.dp).heightIn(0.dp, 200.dp)
144+
modifier = Modifier
145+
.width(300.dp)
146+
.heightIn(0.dp, 200.dp)
153147
) {
154148
Text(
155149
text = "The version of TPUvNATIVE you are using does not yet support the embed type ${embed.type}!",
@@ -160,7 +154,9 @@ fun Embed(embed: Embed) {
160154
}
161155
} else {
162156
Card(
163-
modifier = Modifier.width(300.dp).heightIn(0.dp, 200.dp)
157+
modifier = Modifier
158+
.width(300.dp)
159+
.heightIn(0.dp, 200.dp)
164160
) {
165161
Box(
166162
modifier = Modifier.fillMaxSize(),

app/src/main/java/com/troplo/privateuploader/components/chat/dialogs/ImageDialog.kt

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,16 @@ import androidx.compose.runtime.Composable
1515
import androidx.compose.runtime.MutableState
1616
import androidx.compose.ui.Modifier
1717
import androidx.compose.ui.graphics.graphicsLayer
18+
import androidx.compose.ui.layout.ContentScale
1819
import androidx.compose.ui.platform.LocalContext
1920
import androidx.core.net.toUri
2021
import coil.compose.rememberAsyncImagePainter
2122
import coil.request.ImageRequest
2223
import coil.size.Size
24+
import com.bumptech.glide.load.engine.DiskCacheStrategy
25+
import com.bumptech.glide.request.RequestOptions
26+
import com.skydoves.landscapist.ImageOptions
27+
import com.skydoves.landscapist.glide.GlideImage
2328
import com.troplo.privateuploader.api.imageLoader
2429
import com.troplo.privateuploader.components.core.InteractionDialog
2530
import com.troplo.privateuploader.components.core.ZoomableBox
@@ -34,24 +39,17 @@ fun ImageDialog(url: String, name: String, open: MutableState<Boolean>) {
3439
open = open,
3540
content = {
3641
ZoomableBox {
37-
Image(
38-
painter = rememberAsyncImagePainter(
39-
ImageRequest.Builder(LocalContext.current)
40-
.dispatcher(Dispatchers.IO)
41-
.data(data = url)
42-
.apply(block = fun ImageRequest.Builder.() {
43-
size(Size.ORIGINAL)
44-
}).build(), imageLoader = imageLoader(LocalContext.current, false)
42+
GlideImage(
43+
imageModel = { url },
44+
imageOptions = ImageOptions(
45+
contentScale = ContentScale.FillWidth
46+
),
47+
modifier = Modifier.fillMaxSize().graphicsLayer(
48+
scaleX = scale,
49+
scaleY = scale,
50+
translationX = offsetX,
51+
translationY = offsetY
4552
),
46-
contentDescription = name,
47-
modifier = Modifier
48-
.fillMaxSize()
49-
.graphicsLayer(
50-
scaleX = scale,
51-
scaleY = scale,
52-
translationX = offsetX,
53-
translationY = offsetY
54-
)
5553
)
5654
}
5755
},

app/src/main/java/com/troplo/privateuploader/components/core/UserAvatar.kt

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.troplo.privateuploader.components.core
22

3+
import android.util.Log
34
import androidx.compose.foundation.Image
45
import androidx.compose.foundation.background
56
import androidx.compose.foundation.border
@@ -32,6 +33,9 @@ import androidx.compose.ui.unit.dp
3233
import coil.compose.rememberAsyncImagePainter
3334
import coil.request.ImageRequest
3435
import coil.size.Size
36+
import com.bumptech.glide.load.engine.DiskCacheStrategy
37+
import com.bumptech.glide.request.RequestOptions
38+
import com.skydoves.landscapist.glide.GlideImage
3539
import com.troplo.privateuploader.api.TpuFunctions
3640
import com.troplo.privateuploader.api.imageLoader
3741
import com.troplo.privateuploader.api.stores.FriendStore
@@ -94,19 +98,15 @@ fun UserAvatar(
9498
}
9599
if(fakeStatus != null) friend?.otherUser?.status = fakeStatus
96100
if (avatar != null) {
97-
Image(
98-
contentDescription = "User profile picture",
99-
painter = rememberAsyncImagePainter(
100-
ImageRequest.Builder(LocalContext.current)
101-
.dispatcher(Dispatchers.IO)
102-
.data(data = TpuFunctions.image(avatar, null, 512, 512))
103-
.apply {
104-
size(Size.ORIGINAL)
105-
}
106-
.build(),
107-
imageLoader = imageLoader(LocalContext.current),
108-
contentScale = ContentScale.FillWidth
109-
),
101+
Log.d("UserAvatar", "avatar: ${ TpuFunctions.image(avatar, null, 512, 512)}")
102+
GlideImage(
103+
imageModel = { TpuFunctions.image(avatar, null, 512, 512) },
104+
requestOptions = {
105+
RequestOptions()
106+
.override(512, 512)
107+
.diskCacheStrategy(DiskCacheStrategy.ALL)
108+
.centerCrop()
109+
},
110110
modifier = Modifier
111111
.clip(CircleShape)
112112
.background(if (fake) MaterialTheme.colorScheme.surface else Color.Transparent)

0 commit comments

Comments
 (0)