Skip to content

Commit d5d2d27

Browse files
committed
help me
1 parent 7809f2e commit d5d2d27

31 files changed

+516
-226
lines changed

.idea/vcs.xml

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ dependencies {
6464
implementation "com.google.code.gson:gson:2.10.1"
6565
implementation "com.squareup.retrofit2:converter-gson:2.9.0"
6666
implementation "io.socket:socket.io-client:2.0.0"
67+
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4"
6768
implementation "com.google.android.gms:play-services-awareness:19.0.1"
6869
implementation 'androidx.annotation:annotation:1.6.0'
6970
testImplementation "junit:junit:4.13.2"

app/src/main/AndroidManifest.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@
1616
android:theme="@style/Theme.PrivateUploader"
1717
android:usesCleartextTraffic="true"
1818
tools:targetApi="31">
19+
<activity
20+
android:name=".Chat"
21+
android:exported="false" />
1922
<activity
2023
android:name=".ui.login.LoginActivity"
2124
android:exported="false"

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import androidx.navigation.ui.setupWithNavController
1515
import com.troplo.privateuploader.api.SocketHandler
1616
import com.troplo.privateuploader.api.TpuApi
1717
import com.troplo.privateuploader.api.TpuConfig
18-
import com.troplo.privateuploader.api.User
18+
import com.troplo.privateuploader.data.model.User
1919
import com.troplo.privateuploader.databinding.ActivityMainBinding
2020
import com.troplo.privateuploader.ui.login.LoginActivity
2121
import io.socket.client.Socket
@@ -32,16 +32,16 @@ class MainActivity : AppCompatActivity() {
3232
TpuApi.retrofitService.getUser(config.token!!).enqueue(object : retrofit2.Callback<User> {
3333
override fun onResponse(call: retrofit2.Call<User>, response: retrofit2.Response<User>) {
3434
if (response.body()?.username != null) {
35-
println("User is logged in")
35+
println("com.troplo.privateuploader.data.model.User is logged in")
3636
setContentView(R.layout.activity_main)
3737
} else {
38-
println("User is not logged in")
38+
println("com.troplo.privateuploader.data.model.User is not logged in")
3939
val intent = Intent(this@MainActivity, LoginActivity::class.java)
4040
startActivity(intent)
4141
}
4242
}
4343
override fun onFailure(call: retrofit2.Call<User>, t: Throwable) {
44-
println("User is not logged in")
44+
println("com.troplo.privateuploader.data.model.User is not logged in")
4545
val intent = Intent(this@MainActivity, LoginActivity::class.java)
4646
startActivity(intent)
4747
}
@@ -61,7 +61,7 @@ class MainActivity : AppCompatActivity() {
6161
tpuSocket.on(Socket.EVENT_DISCONNECT) {
6262
println("Disconnected from TPU Server")
6363
}
64-
tpuSocket.emit("echo", "Message from TPUKt")
64+
tpuSocket.emit("echo", "com.troplo.privateuploader.data.model.Message from TPUKt")
6565
println("Sent message to TPU Server")
6666
SocketHandler.listeners()
6767

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

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

3-
import com.squareup.moshi.Json
4-
import com.squareup.moshi.JsonClass
5-
import com.squareup.moshi.Moshi
6-
import kotlinx.coroutines.Deferred
3+
import com.troplo.privateuploader.data.model.Chat
4+
import com.troplo.privateuploader.data.model.LoginRequest
5+
import com.troplo.privateuploader.data.model.LoginResponse
6+
import com.troplo.privateuploader.data.model.User
77
import okhttp3.OkHttpClient
88
import okhttp3.logging.HttpLoggingInterceptor
99
import retrofit2.Call
@@ -12,103 +12,16 @@ import retrofit2.converter.gson.GsonConverterFactory
1212
import retrofit2.http.Body
1313
import retrofit2.http.GET
1414
import retrofit2.http.Header
15-
import retrofit2.http.Headers
1615
import retrofit2.http.POST
1716

18-
data class User(
19-
@field:Json(name = "id") val id: String,
20-
@field:Json(name = "username") val username: String,
21-
@field:Json(name = "avatar") val avatar: String
22-
)
23-
24-
@JsonClass(generateAdapter = true)
25-
data class Message(
26-
@field:Json(name = "id") val id: Int,
27-
@field:Json(name = "chatId") val chatId: Int,
28-
@field:Json(name = "userId") val userId: Int,
29-
@field:Json(name = "content") val content: String,
30-
@field:Json(name = "type") val type: String,
31-
@field:Json(name = "embeds") val embeds: List<Any>,
32-
@field:Json(name = "edited") val edited: Boolean,
33-
@field:Json(name = "editedAt") val editedAt: String?,
34-
@field:Json(name = "replyId") val replyId: Int?,
35-
@field:Json(name = "legacyUserId") val legacyUserId: Int?,
36-
@field:Json(name = "tpuUser") val tpuUser: User?,
37-
@field:Json(name = "reply") val reply: Message?,
38-
@field:Json(name = "legacyUser") val legacyUser: User?,
39-
@field:Json(name = "user") val user: User?,
40-
@field:Json(name = "pending") val pending: Boolean?,
41-
@field:Json(name = "error") val error: Boolean?,
42-
@field:Json(name = "createdAt") val createdAt: String?,
43-
@field:Json(name = "updatedAt") val updatedAt: String?,
44-
@field:Json(name = "pinned") val pinned: Boolean?,
45-
@field:Json(name = "readReceipts") val readReceipts: List<ChatAssociation>
46-
)
47-
48-
@JsonClass(generateAdapter = true)
49-
data class ChatAssociation(
50-
@field:Json(name = "id") val id: Int,
51-
@field:Json(name = "chatId") val chatId: Int,
52-
@field:Json(name = "userId") val userId: Int,
53-
@field:Json(name = "rank") val rank: String,
54-
@field:Json(name = "lastRead") val lastRead: Int,
55-
@field:Json(name = "notifications") val notifications: String,
56-
@field:Json(name = "legacyUserId") val legacyUserId: Int,
57-
@field:Json(name = "tpuUser") val tpuUser: User?,
58-
@field:Json(name = "legacyUser") val legacyUser: User?,
59-
@field:Json(name = "user") val user: User
60-
)
61-
62-
@JsonClass(generateAdapter = true)
63-
data class Typing(
64-
@field:Json(name = "chatId") val chatId: Int,
65-
@field:Json(name = "userId") val userId: Int,
66-
@field:Json(name = "user") val user: User,
67-
@field:Json(name = "expires") val expires: String
68-
)
69-
70-
@JsonClass(generateAdapter = true)
71-
data class Chat(
72-
@field:Json(name = "id") val id: String,
73-
@field:Json(name = "name") val name: String,
74-
@field:Json(name = "users") val users: List<User>,
75-
@field:Json(name = "recipient") val recipient: User?,
76-
@field:Json(name = "icon") val icon: String?,
77-
@field:Json(name = "type") val type: String?,
78-
@field:Json(name = "createdAt") val createdAt: String?,
79-
@field:Json(name = "updatedAt") val updatedAt: String?,
80-
@field:Json(name = "legacyUserId") val legacyUserId: String?,
81-
@field:Json(name = "user") val user: User?,
82-
@field:Json(name = "legacyUser") val legacyUser: User?,
83-
@field:Json(name = "association") val association: ChatAssociation?,
84-
@field:Json(name = "messages") val messages: List<Message>?,
85-
@field:Json(name = "unread") val unread: String?,
86-
@field:Json(name = "typers") val typers: List<Typing>?
87-
)
88-
89-
90-
@JsonClass(generateAdapter = true)
91-
data class LoginRequest(
92-
@field:Json(name = "username") val username: String,
93-
@field:Json(name = "password") val password: String,
94-
@field:Json(name = "code") val code: String
95-
)
96-
97-
@JsonClass(generateAdapter = true)
98-
data class LoginResponse(
99-
@field:Json(name = "token") val token: String,
100-
@field:Json(name = "user") val user: User
101-
)
102-
10317
private const val BASE_URL = "http://192.168.0.12:34582/api/v3/"
10418
val client = OkHttpClient.Builder()
10519
.addInterceptor(HttpLoggingInterceptor().apply {
106-
// add Authorization header
10720
level = HttpLoggingInterceptor.Level.BODY
108-
10921
})
11022
.build()
11123

24+
11225
val retrofit: Retrofit = Retrofit.Builder()
11326
.baseUrl(BASE_URL)
11427
.client(client)
@@ -125,6 +38,7 @@ interface TpuApiService {
12538
@POST("auth/login")
12639
fun login(@Body request: LoginRequest): Call<LoginResponse>
12740

41+
12842
@GET("user")
12943
fun getUser(
13044
@Header("Authorization") token: String
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package com.troplo.privateuploader.api
2+
3+
import android.content.Context
4+
import android.widget.Toast
5+
import okhttp3.Interceptor
6+
import okhttp3.OkHttpClient
7+
import okhttp3.Response
8+
import org.json.JSONObject
9+
10+
class RetrofitErrorHandler(private val context: Context) {
11+
12+
private val httpClient: OkHttpClient
13+
14+
init {
15+
// Create an OkHttpClient with the interceptor
16+
httpClient = OkHttpClient.Builder()
17+
.addInterceptor(ErrorInterceptor())
18+
.build()
19+
}
20+
21+
fun getHttpClient(): OkHttpClient {
22+
return httpClient
23+
}
24+
25+
inner class ErrorInterceptor : Interceptor {
26+
override fun intercept(chain: Interceptor.Chain): Response {
27+
val request = chain.request()
28+
val response = chain.proceed(request)
29+
30+
if (!response.isSuccessful) {
31+
// Handle error response
32+
val errorBody = response.body?.string()
33+
val errorMessage = extractErrorMessage(errorBody)
34+
showToast(errorMessage)
35+
throw Throwable(errorMessage)
36+
}
37+
38+
return response
39+
}
40+
}
41+
42+
fun extractErrorMessage(errorBody: String?): String {
43+
// Parse the error body and extract the error message
44+
// Adjust this logic based on the response structure of your API
45+
errorBody?.let {
46+
// Assuming the error response is in JSON format
47+
val errorJson = JSONObject(it)
48+
val errorsArray = errorJson.getJSONArray("errors")
49+
if (errorsArray.length() > 0) {
50+
val firstError = errorsArray.getJSONObject(0)
51+
return firstError.getString("message")
52+
}
53+
}
54+
55+
return "Unknown Error"
56+
}
57+
58+
private fun showToast(message: String) {
59+
Toast.makeText(context, message, Toast.LENGTH_SHORT).show()
60+
}
61+
}

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

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

3+
import com.troplo.privateuploader.data.model.Chat
4+
import com.troplo.privateuploader.data.model.User
5+
36
object TpuFunctions {
47
fun image(link: String?, recipient: User?): String? {
58
if(recipient?.avatar != null) {
@@ -20,7 +23,7 @@ object TpuFunctions {
2023
return "Communications"
2124
}
2225
return if(chat.type == "direct") {
23-
chat.recipient?.username ?: "Deleted User"
26+
chat.recipient?.username ?: "Deleted com.troplo.privateuploader.data.model.User"
2427
} else {
2528
chat.name
2629
}

app/src/main/java/com/troplo/privateuploader/data/LoginDataSource.kt

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

3-
import com.troplo.privateuploader.api.LoginRequest
4-
import com.troplo.privateuploader.api.LoginResponse
5-
import com.troplo.privateuploader.api.SessionManager
63
import com.troplo.privateuploader.api.TpuApi
7-
import com.troplo.privateuploader.api.User
8-
import com.troplo.privateuploader.data.model.LoggedInUser
4+
import com.troplo.privateuploader.data.model.LoginRequest
5+
import com.troplo.privateuploader.data.model.LoginResponse
96
import java.io.IOException
107

118
/**

app/src/main/java/com/troplo/privateuploader/data/LoginRepository.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
package com.troplo.privateuploader.data
22

3-
import com.troplo.privateuploader.api.LoginResponse
4-
import com.troplo.privateuploader.api.User
3+
import com.troplo.privateuploader.data.model.LoginResponse
4+
import com.troplo.privateuploader.data.model.User
5+
56

67
/**
78
* Class that requests authentication and user information from the remote data source and
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.troplo.privateuploader.data.model
2+
3+
import com.squareup.moshi.Json
4+
import com.squareup.moshi.JsonClass
5+
6+
@JsonClass(generateAdapter = true)
7+
data class Chat(
8+
@field:Json(name = "id") val id: String,
9+
@field:Json(name = "name") val name: String,
10+
@field:Json(name = "users") val users: List<User>,
11+
@field:Json(name = "recipient") val recipient: User?,
12+
@field:Json(name = "icon") val icon: String?,
13+
@field:Json(name = "type") val type: String?,
14+
@field:Json(name = "createdAt") val createdAt: String?,
15+
@field:Json(name = "updatedAt") val updatedAt: String?,
16+
@field:Json(name = "legacyUserId") val legacyUserId: String?,
17+
@field:Json(name = "user") val user: User?,
18+
@field:Json(name = "legacyUser") val legacyUser: User?,
19+
@field:Json(name = "association") val association: ChatAssociation?,
20+
@field:Json(name = "messages") val messages: List<Message>?,
21+
@field:Json(name = "unread") val unread: String?,
22+
@field:Json(name = "typers") val typers: List<Typing>?
23+
)

0 commit comments

Comments
 (0)