Skip to content

Commit f731b94

Browse files
committed
Before cleanup
1 parent 94b3fad commit f731b94

File tree

25 files changed

+1140
-181
lines changed

25 files changed

+1140
-181
lines changed

app/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@ dependencies {
6969
implementation("com.google.firebase:firebase-analytics-ktx:21.3.0")
7070

7171
// TPU
72+
implementation("com.google.accompanist:accompanist-permissions:0.31.4-beta")
73+
implementation("io.mhssn:colorpicker:1.0.0")
7274
implementation("com.google.accompanist:accompanist-insets:0.22.0-rc")
7375
implementation("io.noties.markwon:core:4.6.2")
7476
implementation("io.noties.markwon:ext-strikethrough:4.6.2")

app/release/app-release.apk

0 Bytes
Binary file not shown.

app/src/main/AndroidManifest.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@
44
<uses-permission android:name="android.permission.INTERNET" />
55
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
66
<uses-permission android:name="android.permission.WAKE_LOCK" />
7+
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
8+
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
9+
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
10+
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
711
<application
812
android:allowBackup="true"
913
android:dataExtractionRules="@xml/data_extraction_rules"

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

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,16 +53,22 @@ class MainActivity : ComponentActivity() {
5353
}
5454
if (token != null) {
5555
setContent {
56-
PrivateUploaderTheme {
57-
MainScreen()
58-
}
56+
PrivateUploaderTheme(
57+
selected = SessionManager(this).theme,
58+
content = {
59+
MainScreen()
60+
}
61+
)
5962
}
6063
} else {
6164
TpuApi.init("", this)
6265
setContent {
63-
PrivateUploaderTheme {
64-
MainScreen()
65-
}
66+
PrivateUploaderTheme(
67+
selected = SessionManager(this).theme,
68+
content = {
69+
MainScreen()
70+
}
71+
)
6672
}
6773
}
6874
super.onCreate(savedInstanceState)

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,10 @@ import com.troplo.privateuploader.data.model.MessageSearchResponse
2020
import com.troplo.privateuploader.data.model.PatchUser
2121
import com.troplo.privateuploader.data.model.StarResponse
2222
import com.troplo.privateuploader.data.model.State
23+
import com.troplo.privateuploader.data.model.UploadResponse
2324
import com.troplo.privateuploader.data.model.User
2425
import okhttp3.Interceptor
26+
import okhttp3.MultipartBody
2527
import okhttp3.OkHttpClient
2628
import okhttp3.Protocol
2729
import okhttp3.Response
@@ -35,9 +37,11 @@ import retrofit2.converter.gson.GsonConverterFactory
3537
import retrofit2.http.Body
3638
import retrofit2.http.DELETE
3739
import retrofit2.http.GET
40+
import retrofit2.http.Multipart
3841
import retrofit2.http.PATCH
3942
import retrofit2.http.POST
4043
import retrofit2.http.PUT
44+
import retrofit2.http.Part
4145
import retrofit2.http.Path
4246
import retrofit2.http.Query
4347
import java.io.IOException
@@ -258,6 +262,12 @@ object TpuApi {
258262
fun updateUser(
259263
@Body user: PatchUser
260264
): Call<Unit>
265+
266+
@Multipart
267+
@POST("gallery")
268+
fun uploadFile(
269+
@Part attachment: MultipartBody.Part
270+
): Call<UploadResponse>
261271
}
262272

263273
val retrofitService: TpuApiService by lazy {

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

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
11
package com.troplo.privateuploader.api
22

3+
import android.content.Context
4+
import android.net.Uri
35
import android.util.Log
46
import com.troplo.privateuploader.data.model.Chat
57
import com.troplo.privateuploader.data.model.User
8+
import java.io.File
9+
import java.io.FileInputStream
10+
import java.io.FileOutputStream
611
import java.text.DateFormat
712
import java.text.SimpleDateFormat
813
import java.time.Instant
@@ -108,4 +113,21 @@ object TpuFunctions {
108113
null
109114
}
110115
}
116+
117+
fun uriToFile(uri: Uri, context: Context, filename: String): File {
118+
val parcelFileDescriptor = context.contentResolver.openFileDescriptor(
119+
uri,
120+
"r",
121+
null
122+
)
123+
val file = File(
124+
context.cacheDir,
125+
filename
126+
)
127+
val inputStream = FileInputStream(parcelFileDescriptor?.fileDescriptor)
128+
val outputStream = FileOutputStream(file)
129+
inputStream.copyTo(outputStream)
130+
parcelFileDescriptor?.close()
131+
return file
132+
}
111133
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package com.troplo.privateuploader.api
2+
3+
import android.content.ContentResolver
4+
import android.content.Context
5+
import android.net.Uri
6+
import android.os.Handler
7+
import android.os.Looper
8+
import android.util.Log
9+
import okhttp3.MediaType
10+
import okhttp3.MediaType.Companion.toMediaTypeOrNull
11+
import okhttp3.RequestBody
12+
import okio.BufferedSink
13+
import java.io.File
14+
import java.io.FileInputStream
15+
import java.io.IOException
16+
import java.io.InputStream
17+
import java.lang.ref.WeakReference
18+
19+
20+
class RequestBodyWithProgress(
21+
private val file: File,
22+
private val contentType: ContentType,
23+
private val progressCallback:((progress: Float)->Unit)?
24+
) : RequestBody() {
25+
26+
override fun contentType(): MediaType? = contentType.description.toMediaTypeOrNull()
27+
28+
override fun contentLength(): Long = file.length()
29+
30+
override fun writeTo(sink: BufferedSink) {
31+
val fileLength = contentLength()
32+
val buffer = ByteArray(DEFAULT_BUFFER_SIZE)
33+
val inSt = FileInputStream(file)
34+
var uploaded = 0L
35+
inSt.use {
36+
var read: Int = inSt.read(buffer)
37+
val handler = Handler(Looper.getMainLooper())
38+
while (read != -1) {
39+
progressCallback?.let {
40+
uploaded += read
41+
val progress = (uploaded.toDouble() / fileLength.toDouble()).toFloat()
42+
handler.post { it(progress) }
43+
44+
sink.write(buffer, 0, read)
45+
}
46+
read = inSt.read(buffer)
47+
}
48+
}
49+
}
50+
51+
enum class ContentType(val description: String) {
52+
PNG_IMAGE("image/png"),
53+
JPG_IMAGE("image/jpg"),
54+
IMAGE("image/*")
55+
}
56+
}

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

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,18 @@ import com.google.gson.Gson
66
import com.troplo.privateuploader.BuildConfig
77
import com.troplo.privateuploader.R
88
import com.troplo.privateuploader.data.model.User
9+
import kotlinx.coroutines.flow.MutableStateFlow
10+
11+
enum class ThemeOption {
12+
Dark, Light, System, AMOLED
13+
}
914

1015
class SessionManager(context: Context) {
1116
private var prefs: SharedPreferences =
1217
context.getSharedPreferences(context.getString(R.string.app_name), Context.MODE_PRIVATE)
1318

19+
val theme = MutableStateFlow(getTheme())
20+
1421
companion object {
1522
const val USER_TOKEN = "token"
1623
}
@@ -86,4 +93,30 @@ class SessionManager(context: Context) {
8693
editor.putBoolean("debugMode", debug)
8794
editor.apply()
8895
}
96+
97+
fun getTheme(): ThemeOption {
98+
val theme = prefs.getString("theme", ThemeOption.System.name)
99+
return if(theme == null) {
100+
ThemeOption.System
101+
} else {
102+
ThemeOption.valueOf(theme)
103+
}
104+
}
105+
106+
fun setTheme(theme: ThemeOption) {
107+
val editor = prefs.edit()
108+
editor.putString("theme", theme.name)
109+
editor.apply()
110+
this.theme.value = theme
111+
}
112+
113+
fun setColor(color: String) {
114+
val editor = prefs.edit()
115+
editor.putString("color", color)
116+
editor.apply()
117+
}
118+
119+
fun getColor(): String? {
120+
return prefs.getString("color", null)
121+
}
89122
}

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

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

33
import android.content.Context
4+
import android.net.Uri
45
import android.util.Log
6+
import androidx.compose.runtime.mutableStateListOf
57
import com.troplo.privateuploader.data.model.Chat
68
import com.troplo.privateuploader.data.model.SettingsPayload
79
import com.troplo.privateuploader.data.model.Typing
10+
import com.troplo.privateuploader.data.model.UploadTarget
811
import io.socket.client.Socket
912
import kotlinx.coroutines.CoroutineScope
1013
import kotlinx.coroutines.Dispatchers
@@ -20,6 +23,8 @@ object ChatStore {
2023
var associationId = MutableStateFlow(0)
2124
var typers = MutableStateFlow(emptyList<Typing>())
2225
var jumpToMessage = MutableStateFlow(0)
26+
// To upload to TPU, uses URI Android system
27+
var attachmentsToUpload = mutableStateListOf<UploadTarget>()
2328

2429
val chats: StateFlow<List<Chat>>
2530
get() = _chats

0 commit comments

Comments
 (0)