Skip to content

Commit f8407ee

Browse files
committed
update
1 parent c713c1b commit f8407ee

31 files changed

+1366
-94
lines changed

.idea/vcs.xml

+6
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/build.gradle.kts

+6-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ android {
1414
targetSdk = 33
1515
versionCode = 1
1616
versionName = "1.0"
17+
multiDexEnabled = true
1718

1819
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
1920
vectorDrawables {
@@ -52,6 +53,8 @@ android {
5253

5354
dependencies {
5455
// TPU
56+
implementation("io.coil-kt:coil:2.3.0")
57+
implementation("com.github.jeziellago:compose-markdown:0.3.3")
5558
implementation("com.github.bumptech.glide:compose:1.0.0-alpha.1")
5659
implementation("com.squareup.retrofit2:retrofit:2.9.0")
5760
implementation("com.squareup.retrofit2:converter-moshi:2.9.0")
@@ -62,7 +65,9 @@ dependencies {
6265
implementation("androidx.core:core-ktx:1.10.1")
6366
implementation("com.google.code.gson:gson:2.10.1")
6467
implementation("com.squareup.retrofit2:converter-gson:2.9.0")
65-
implementation("io.socket:socket.io-client:2.0.0")
68+
implementation("io.socket:socket.io-client:2.1.0") {
69+
exclude("org.json", "json")
70+
}
6671
// Android
6772

6873
implementation("androidx.navigation:navigation-compose:2.6.0")

app/src/main/AndroidManifest.xml

+1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
android:name=".MainActivity"
1919
android:exported="true"
2020
android:label="@string/app_name"
21+
android:windowSoftInputMode="adjustResize"
2122
android:theme="@style/Theme.PrivateUploader">
2223
<intent-filter>
2324
<action android:name="android.intent.action.MAIN" />

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

+34-14
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,20 @@
11
package com.troplo.privateuploader
22

3+
import android.app.Activity
4+
import android.content.Intent
35
import android.os.Bundle
46
import androidx.activity.ComponentActivity
57
import androidx.activity.compose.setContent
6-
import androidx.compose.foundation.layout.fillMaxSize
7-
import androidx.compose.material3.MaterialTheme
8-
import androidx.compose.material3.Surface
9-
import androidx.compose.material3.Text
10-
import androidx.compose.runtime.Composable
11-
import androidx.compose.ui.Modifier
8+
import androidx.activity.result.contract.ActivityResultContracts
9+
import androidx.core.app.ActivityCompat
1210
import com.troplo.privateuploader.api.SessionManager
11+
import com.troplo.privateuploader.api.SocketHandler
1312
import com.troplo.privateuploader.api.TpuApi
1413
import com.troplo.privateuploader.data.model.User
1514
import com.troplo.privateuploader.ui.theme.PrivateUploaderTheme
15+
import io.socket.client.IO
16+
import kotlinx.coroutines.Dispatchers
17+
import java.util.Collections
1618

1719
class MainActivity : ComponentActivity() {
1820
override fun onCreate(savedInstanceState: Bundle?) {
@@ -54,14 +56,32 @@ class MainActivity : ComponentActivity() {
5456
}
5557
}
5658
super.onCreate(savedInstanceState)
57-
}
58-
}
59+
/*
60+
fun requestPermissions() {
61+
val permissions = arrayOf(
62+
android.Manifest.permission.READ_EXTERNAL_STORAGE,
63+
android.Manifest.permission.WRITE_EXTERNAL_STORAGE,
64+
android.Manifest.permission.CAMERA
65+
)
66+
ActivityCompat.requestPermissions(this, permissions, 0)
67+
}
5968
60-
@Composable
61-
fun Greeting(name: String, modifier: Modifier = Modifier) {
62-
Text(
63-
text = "Hello $name!",
64-
modifier = modifier
65-
)
69+
val resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
70+
if (result.resultCode == Activity.RESULT_OK) {
71+
// There are no request codes
72+
val data: Intent? = result.data
73+
val folder = data?.getStringExtra("folder")
74+
if(folder != null) {
75+
SessionManager(this).setFolder(folder)
76+
}
77+
}
78+
}
79+
fun requestFolder() {
80+
requestPermissions()
81+
val intent = Intent(this, MainActivity::class.java)
82+
resultLauncher.launch(intent)
83+
}
84+
requestFolder()*/
85+
}
6686
}
6787

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

+17
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,37 @@ import androidx.compose.material3.ExperimentalMaterial3Api
55
import androidx.compose.material3.Scaffold
66
import androidx.compose.runtime.Composable
77
import androidx.compose.ui.Modifier
8+
import androidx.compose.ui.platform.LocalContext
89
import androidx.navigation.compose.rememberNavController
10+
import com.troplo.privateuploader.api.SessionManager
11+
import com.troplo.privateuploader.api.SocketHandler
12+
import com.troplo.privateuploader.api.UserHandler
913
import com.troplo.privateuploader.components.core.BottomBarNav
1014
import com.troplo.privateuploader.components.core.NavGraph
15+
import com.troplo.privateuploader.components.core.TopBarNav
1116
import com.troplo.privateuploader.data.model.User
17+
import io.socket.client.IO
18+
import io.socket.engineio.client.Socket
19+
import kotlinx.coroutines.Dispatchers
20+
import java.util.Collections
1221

1322
@OptIn(ExperimentalMaterial3Api::class)
1423
@Composable
1524
fun MainScreen(user: User?) {
25+
val context = LocalContext.current
26+
val token = SessionManager(context).fetchAuthToken()
27+
if (token != null) {
28+
SocketHandler.initializeSocket(token)
29+
UserHandler.initializeUser(token)
30+
}
1631
val navController = rememberNavController()
1732
Scaffold(
33+
topBar = { TopBarNav(navController = navController, user = user) },
1834
bottomBar = { BottomBarNav(navController = navController) }
1935
) { paddingValues ->
2036
NavGraph(
2137
modifier = Modifier.padding(
38+
top = paddingValues.calculateTopPadding(),
2239
bottom = paddingValues.calculateBottomPadding()),
2340
navController = navController,
2441
user = user

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

+16
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import com.troplo.privateuploader.data.model.Chat
44
import com.troplo.privateuploader.data.model.Gallery
55
import com.troplo.privateuploader.data.model.LoginRequest
66
import com.troplo.privateuploader.data.model.LoginResponse
7+
import com.troplo.privateuploader.data.model.Message
8+
import com.troplo.privateuploader.data.model.MessageRequest
79
import com.troplo.privateuploader.data.model.User
810
import okhttp3.OkHttpClient
911
import okhttp3.logging.HttpLoggingInterceptor
@@ -14,6 +16,7 @@ import retrofit2.http.Body
1416
import retrofit2.http.GET
1517
import retrofit2.http.Header
1618
import retrofit2.http.POST
19+
import retrofit2.http.Path
1720
import retrofit2.http.Query
1821

1922
private const val BASE_URL = "http://192.168.0.12:34582/api/v3/"
@@ -55,6 +58,19 @@ interface TpuApiService {
5558
@Query("filter") filter: String = "all",
5659
@Query("sort") sort: String = "\"newest\""
5760
): Call<Gallery>
61+
62+
@GET("chats/{id}/messages")
63+
fun getMessages(
64+
@Header("Authorization") token: String,
65+
@Path("id") id: Int
66+
): Call<List<Message>>
67+
68+
@POST("chats/{id}/message")
69+
fun sendMessage(
70+
@Header("Authorization") token: String,
71+
@Path("id") id: Int,
72+
@Body messageRequest: MessageRequest
73+
): Call<Message>
5874
}
5975

6076
object TpuApi {

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

+6
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package com.troplo.privateuploader.api
22

3+
import android.text.format.DateFormat
34
import com.troplo.privateuploader.data.model.Chat
45
import com.troplo.privateuploader.data.model.User
6+
import java.util.Date
57

68
object TpuFunctions {
79
fun image(link: String?, recipient: User?): String? {
@@ -28,4 +30,8 @@ object TpuFunctions {
2830
chat.name
2931
}
3032
}
33+
34+
fun formatDate(date: Date?): CharSequence? {
35+
return DateFormat.format("dd MMMM yyyy, h:mm a", date)
36+
}
3137
}

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

+6
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,10 @@ class SessionManager (context: Context) {
2020
fun fetchAuthToken(): String? {
2121
return prefs.getString(USER_TOKEN, null)
2222
}
23+
24+
fun setFolder(folder: String) {
25+
val editor = prefs.edit()
26+
editor.putString("folder", folder)
27+
editor.apply()
28+
}
2329
}
Original file line numberDiff line numberDiff line change
@@ -1,69 +1,56 @@
11
package com.troplo.privateuploader.api
22

3-
import android.app.NotificationManager
4-
import android.content.Context.NOTIFICATION_SERVICE
5-
import android.content.SharedPreferences
6-
import android.preference.PreferenceManager
7-
import androidx.core.app.NotificationCompat
8-
import androidx.core.content.ContextCompat.getSystemService
9-
import com.troplo.privateuploader.R
3+
import android.content.Context
104
import io.socket.client.IO
5+
import io.socket.client.Manager
116
import io.socket.client.Socket
12-
import io.socket.emitter.Emitter
7+
import java.net.URI
138
import java.net.URISyntaxException
14-
import java.util.Collections.singletonMap
9+
import java.util.Collections
1510

1611

1712
object SocketHandler {
18-
lateinit var tpuSocket: Socket
13+
private const val SERVER_URL = "http://192.168.0.12:34582" // Replace with your Socket.io server URL
1914

20-
@Synchronized
21-
fun setSocket(token: String?) {
15+
private var socket: Socket? = null
16+
17+
fun initializeSocket(token: String) {
2218
try {
23-
val options = IO.Options.builder()
24-
.setAuth(singletonMap("token", token))
25-
.build()
26-
tpuSocket = IO.socket("http://192.168.0.12:34582", options)
27-
println("Socket set")
19+
val options = IO.Options()
20+
options.forceNew = true
21+
options.reconnection = true
22+
options.auth = Collections.singletonMap("token", token)
23+
socket = IO.socket(SERVER_URL, options)
24+
if(socket != null) {
25+
socket?.open()
26+
socket?.on(Socket.EVENT_CONNECT) {
27+
println("Socket connected ${socket?.isActive}")
28+
}
29+
socket?.on(Socket.EVENT_DISCONNECT) {
30+
println("Socket disconnected ${socket?.isActive}")
31+
}
32+
socket?.on(Socket.EVENT_CONNECT_ERROR) {
33+
println("Socket connect error ${socket?.isActive}")
34+
}
35+
// socket on any other events
36+
socket?.on("message") {
37+
println("Socket $it")
38+
}
39+
println("Socket connected ${socket?.isActive}")
40+
} else {
41+
println("Socket is null")
42+
}
2843
} catch (e: URISyntaxException) {
2944
e.printStackTrace()
3045
}
3146
}
3247

33-
@Synchronized
34-
fun getSocket(): Socket {
35-
return tpuSocket
36-
}
37-
38-
@Synchronized
39-
fun establishConnection() {
40-
tpuSocket.connect()
41-
}
42-
43-
@Synchronized
44-
fun closeConnection() {
45-
tpuSocket.disconnect()
48+
fun getSocket(): Socket? {
49+
return socket
4650
}
4751

48-
@Synchronized
49-
fun listeners() {
50-
tpuSocket.on("message", Emitter.Listener { args->
51-
/*NotificationCompat.Builder(this, "communications")
52-
.setStyle(NotificationCompat.MessagingStyle("Me")
53-
.setConversationTitle(TpuFunctions.getChatName(args[0].chat as Chat?))
54-
.build()
55-
)*/
56-
println(args)
57-
})
58-
59-
tpuSocket.on(Socket.EVENT_CONNECT) {
60-
println("Connected to TPU Server")
61-
}
62-
tpuSocket.on(Socket.EVENT_DISCONNECT) {
63-
println("Disconnected from TPU Server")
64-
}
65-
tpuSocket.on("echo") { args ->
66-
println(args[0])
67-
}
52+
fun closeSocket() {
53+
socket?.disconnect()
54+
socket = null
6855
}
6956
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package com.troplo.privateuploader.api
2+
3+
import android.content.Context
4+
import com.troplo.privateuploader.data.model.User
5+
import io.socket.client.IO
6+
import io.socket.client.Manager
7+
import io.socket.client.Socket
8+
import kotlinx.coroutines.CoroutineScope
9+
import kotlinx.coroutines.Dispatchers
10+
import kotlinx.coroutines.launch
11+
import java.net.URI
12+
import java.net.URISyntaxException
13+
import java.util.Collections
14+
15+
16+
object UserHandler {
17+
private var user: User? = null
18+
19+
fun initializeUser(token: String) {
20+
try {
21+
CoroutineScope(
22+
Dispatchers.IO
23+
).launch {
24+
user = TpuApi.retrofitService.getUser(token).execute().body()
25+
}
26+
} catch (e: URISyntaxException) {
27+
e.printStackTrace()
28+
}
29+
}
30+
31+
fun getUser(): User? {
32+
return user
33+
}
34+
35+
fun resetUser() {
36+
user = null
37+
}
38+
}

0 commit comments

Comments
 (0)