Skip to content

Commit a80c009

Browse files
committed
Before Material partial removal
1 parent d131017 commit a80c009

34 files changed

+909
-314
lines changed

app/build.gradle.kts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ android {
1818
multiDexEnabled = true
1919
buildConfigField("String", "SERVER_URL", "\"https://privateuploader.com\"")
2020
buildConfigField("String", "BUILD_TIME", "\"${System.currentTimeMillis()}\"")
21-
buildConfigField("Integer", "BETA_VERSION", "2")
21+
buildConfigField("Integer", "BETA_VERSION", "3")
2222

2323
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
2424
vectorDrawables {
@@ -63,6 +63,7 @@ android {
6363

6464
dependencies {
6565
// TPU
66+
implementation("com.google.accompanist:accompanist-insets:0.22.0-rc")
6667
implementation("io.noties.markwon:core:4.6.2")
6768
implementation("io.noties.markwon:ext-strikethrough:4.6.2")
6869
implementation("io.noties.markwon:ext-tables:4.6.2")

app/release/app-release.apk

196 KB
Binary file not shown.

app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
android:supportsRtl="true"
1515
android:theme="@style/Theme.PrivateUploader"
1616
android:usesCleartextTraffic="true"
17+
android:windowSoftInputMode="adjustResize"
1718
tools:targetApi="31">
1819
<service android:name=".ChatService"
1920
android:exported="true"
@@ -48,7 +49,6 @@
4849
<activity
4950
android:name=".MainActivity"
5051
android:exported="true"
51-
android:label="@string/app_name"
5252
android:windowSoftInputMode="adjustResize"
5353
android:theme="@style/Theme.PrivateUploader">
5454
<intent-filter>

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

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import android.graphics.RectF
1616
import android.graphics.Shader
1717
import android.graphics.drawable.BitmapDrawable
1818
import android.os.IBinder
19+
import android.util.Log
1920
import androidx.core.app.ActivityCompat
2021
import androidx.core.app.NotificationCompat
2122
import androidx.core.app.NotificationManagerCompat
@@ -46,7 +47,7 @@ class ChatService : Service() {
4647
override fun onCreate() {
4748
super.onCreate()
4849
try {
49-
println("[ChatService] Started")
50+
Log.d("TPU.Untagged", "[ChatService] Started")
5051
if(socket == null || !socket!!.connected()) {
5152
val token = SessionManager(this).getAuthToken()
5253
if(!token.isNullOrBlank()) {
@@ -68,14 +69,14 @@ class ChatService : Service() {
6869

6970
override fun onDestroy() {
7071
super.onDestroy()
71-
println("[ChatService] Stopped")
72+
Log.d("TPU.Untagged", "[ChatService] Stopped")
7273
socket?.disconnect()
7374
socket?.off("message", onNewMessage)
7475
}
7576

7677
private val onNewMessage: Emitter.Listener = object : Emitter.Listener {
7778
override fun call(vararg args: Any?) {
78-
println("[ChatService] Message received")
79+
Log.d("TPU.Untagged", "[ChatService] Message received")
7980

8081
// Process the new message
8182
val jsonArray = args[0] as JSONObject
@@ -90,7 +91,7 @@ class ChatService : Service() {
9091
}
9192

9293
private fun sendNotification(message: Message?) {
93-
println("[ChatService] Sending notification, ${message == null || message.userId == UserStore.getUser()?.id}")
94+
Log.d("TPU.Untagged", "[ChatService] Sending notification, ${message == null || message.userId == UserStore.getUser()?.id}")
9495
if(message == null) return
9596

9697
// Add any additional configuration to the notification builder as needed
@@ -99,7 +100,7 @@ class ChatService : Service() {
99100
Manifest.permission.POST_NOTIFICATIONS
100101
) != PackageManager.PERMISSION_GRANTED
101102
) {
102-
println("[ChatService] No permission to post notifications")
103+
Log.d("TPU.Untagged", "[ChatService] No permission to post notifications")
103104
// TODO: Consider calling
104105
// ActivityCompat#requestPermissions
105106
// here to request the missing permissions, and then overriding
@@ -111,7 +112,7 @@ class ChatService : Service() {
111112
}
112113
asyncLoadIcon(message.user?.avatar, this) {
113114
try {
114-
println("[ChatService] Loaded icon")
115+
Log.d("TPU.Untagged", "[ChatService] Loaded icon")
115116
val chatPartner = Person.Builder().apply {
116117
setName(message.user?.username)
117118
setKey(message.user?.id.toString())
@@ -168,9 +169,9 @@ class ChatService : Service() {
168169
.setWhen(TpuFunctions.getDate(message.createdAt)?.time ?: 0)
169170
.addAction(replyAction)
170171
val res = notificationManager.notify(message.chatId, builder.build())
171-
println("[ChatService] Notification sent, $res")
172+
Log.d("TPU.Untagged", "[ChatService] Notification sent, $res")
172173
} catch (e: Exception) {
173-
println("[ChatService] Error sending notification, ${e.printStackTrace()}")
174+
Log.d("TPU.Untagged", "[ChatService] Error sending notification, ${e.printStackTrace()}")
174175
}
175176
}
176177
}
@@ -199,7 +200,7 @@ fun asyncLoadIcon(avatar: String?, context: Context, setIcon: (IconCompat?) -> U
199200

200201
setIcon(roundedIcon)
201202
} catch (e: Exception) {
202-
println(e)
203+
Log.d("TPU.Untagged", e.toString())
203204
setIcon(null)
204205
}
205206
}

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import android.content.BroadcastReceiver
55
import android.content.Context
66
import android.content.Intent
77
import android.os.Build
8+
import android.util.Log
89
import androidx.core.app.NotificationCompat
910
import androidx.core.app.Person
1011
import androidx.core.app.RemoteInput
@@ -20,7 +21,7 @@ import java.io.Serializable
2021

2122
class InlineNotificationActivity: BroadcastReceiver() {
2223
override fun onReceive(context: Context, intent: Intent) {
23-
println("[ChatService] InlineNotificationActivity onCreate, intent: $intent, extras: ${intent.extras}")
24+
Log.d("TPU.Untagged", "[ChatService] InlineNotificationActivity onCreate, intent: $intent, extras: ${intent.extras}")
2425

2526
val chatId = intent.getIntExtra("chatId", 0)
2627
val remoteInput = RemoteInput.getResultsFromIntent(intent)
@@ -31,7 +32,7 @@ class InlineNotificationActivity: BroadcastReceiver() {
3132

3233
private fun sendReply(chatId: Int, content: String?, context: Context) {
3334
if(chatId == 0) return
34-
println("Sending reply to chatId: $chatId")
35+
Log.d("TPU.Untagged", "Sending reply to chatId: $chatId")
3536
CoroutineScope(Dispatchers.IO).launch {
3637
val response = TpuApi.retrofitService.sendMessage(id = chatId, messageRequest = MessageRequest(
3738
content = content ?: ""

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@ package com.troplo.privateuploader
22

33
import android.content.Intent
44
import android.os.Bundle
5+
import android.util.Log
56
import androidx.activity.ComponentActivity
67
import androidx.activity.compose.setContent
78
import com.troplo.privateuploader.api.SessionManager
89
import com.troplo.privateuploader.api.SocketHandler
10+
import com.troplo.privateuploader.api.SocketHandlerService
911
import com.troplo.privateuploader.api.TpuApi
1012
import com.troplo.privateuploader.api.stores.UserStore
1113
import com.troplo.privateuploader.ui.theme.PrivateUploaderTheme
@@ -28,6 +30,10 @@ class MainActivity : ComponentActivity() {
2830

2931
override fun onCreate(savedInstanceState: Bundle?) {
3032
// if(BuildConfig.DEBUG) StrictMode.enableDefaults();
33+
Log.d("MainActivity.Instance", SessionManager(this).getInstanceURL())
34+
TpuApi.instance = SessionManager(this).getInstanceURL()
35+
SocketHandler.baseUrl = SessionManager(this).getInstanceURL()
36+
SocketHandlerService.baseUrl = SessionManager(this).getInstanceURL()
3137
val token = SessionManager(this).getAuthToken()
3238
TpuApi.init(token ?: "", this)
3339
if (token != null) {

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

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ import androidx.compose.ui.platform.LocalContext
2424
import androidx.compose.ui.unit.dp
2525
import androidx.navigation.compose.rememberNavController
2626
import com.troplo.privateuploader.api.ChatStore
27-
import com.troplo.privateuploader.api.SessionManager
2827
import com.troplo.privateuploader.api.SocketHandler
2928
import com.troplo.privateuploader.api.stores.UserStore
3029
import com.troplo.privateuploader.components.chat.MemberSidebar
@@ -36,13 +35,13 @@ import com.troplo.privateuploader.components.core.OverlappingPanels
3635
import com.troplo.privateuploader.components.core.PanelSurface
3736
import com.troplo.privateuploader.components.core.TopBarNav
3837
import com.troplo.privateuploader.components.core.rememberOverlappingPanelsState
39-
import com.troplo.privateuploader.data.model.User
4038
import com.troplo.privateuploader.screens.HomeScreen
4139
import io.sentry.compose.SentryTraced
4240

4341
@OptIn(ExperimentalMaterial3Api::class, ExperimentalMaterialApi::class,
4442
ExperimentalComposeUiApi::class
4543
)
44+
4645
@Composable
4746
fun MainScreen() {
4847
SentryTraced("main") {
@@ -51,24 +50,42 @@ fun MainScreen() {
5150
val navController = rememberNavController()
5251
val panelState = rememberOverlappingPanelsState()
5352
var closePanels by remember { mutableStateOf(false) }
53+
var openPanel by remember { mutableStateOf(false) }
54+
5455
val closePanelsFunc = {
5556
closePanels = true
5657
}
58+
59+
val openPanelFunc = {
60+
openPanel = true
61+
}
62+
5763
if (closePanels) {
5864
LaunchedEffect(Unit) {
5965
panelState.closePanels()
6066
closePanels = false
6167
}
6268
}
69+
70+
if (openPanel) {
71+
LaunchedEffect(Unit) {
72+
if(!panelState.isPanelsClosed) {
73+
panelState.closePanels()
74+
} else {
75+
panelState.openStartPanel()
76+
}
77+
openPanel = false
78+
}
79+
}
80+
6381
Scaffold(
6482
topBar = {
6583
if (!SocketHandler.connected.value && user.value != null) {
6684
ConnectingBanner()
6785
} else {
6886
TopBarNav(
6987
navController = navController,
70-
user = user.value,
71-
panelState = panelState
88+
openPanelFunc
7289
)
7390
}
7491
},
@@ -83,7 +100,7 @@ fun MainScreen() {
83100
OverlappingPanels(
84101
modifier = Modifier.fillMaxSize(),
85102
panelsState = panelState,
86-
gesturesEnabled = navController.currentDestination?.route?.startsWith("chat/") == true,
103+
gesturesEnabled = navController.currentDestination?.route?.startsWith("chat/") == true || !panelState.isPanelsClosed,
87104
panelStart = {
88105
PanelSurface {
89106
ModalDrawerSheet(

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

Lines changed: 45 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import android.os.Handler
55
import android.os.Looper
66
import android.widget.Toast
77
import com.troplo.privateuploader.BuildConfig
8+
import com.troplo.privateuploader.api.stores.UserStore
89
import com.troplo.privateuploader.data.model.Chat
910
import com.troplo.privateuploader.data.model.ChatCreateRequest
1011
import com.troplo.privateuploader.data.model.EditRequest
@@ -16,6 +17,7 @@ import com.troplo.privateuploader.data.model.Message
1617
import com.troplo.privateuploader.data.model.MessageRequest
1718
import com.troplo.privateuploader.data.model.MessageSearchResponse
1819
import com.troplo.privateuploader.data.model.StarResponse
20+
import com.troplo.privateuploader.data.model.State
1921
import com.troplo.privateuploader.data.model.User
2022
import okhttp3.Interceptor
2123
import okhttp3.OkHttpClient
@@ -37,14 +39,15 @@ import retrofit2.http.Path
3739
import retrofit2.http.Query
3840
import java.io.IOException
3941
import java.net.SocketTimeoutException
42+
import java.net.URL
4043
import java.net.UnknownHostException
4144

42-
private const val BASE_URL = "${BuildConfig.SERVER_URL}/api/v3/"
43-
4445
object TpuApi {
4546
private lateinit var token: String
4647
private lateinit var client: OkHttpClient
4748
private lateinit var retrofit: Retrofit
49+
private var baseUrl = "${BuildConfig.SERVER_URL}/api/v3/"
50+
var instance = BuildConfig.SERVER_URL
4851

4952
fun init(token: String, context: Context) {
5053
this.token = token
@@ -54,15 +57,35 @@ object TpuApi {
5457
level = HttpLoggingInterceptor.Level.BODY
5558
})
5659
.addInterceptor(AuthorizationInterceptor())
60+
.addInterceptor(hostInterceptor)
5761
.build()
5862

5963
retrofit = Retrofit.Builder()
60-
.baseUrl(BASE_URL)
64+
.baseUrl(baseUrl)
6165
.client(client)
6266
.addConverterFactory(GsonConverterFactory.create())
6367
.build()
6468
}
6569

70+
// replace BuildConfig.SERVER_URL with baseUrl for multiple TPU instances
71+
private val hostInterceptor = Interceptor { chain ->
72+
val url = URL(instance)
73+
val port = if(url.port == -1) url.defaultPort else url.port
74+
val scheme = url.protocol
75+
val host = url.host
76+
77+
val request = chain.request()
78+
val newUrl = request.url.newBuilder()
79+
.host(host)
80+
.scheme(scheme)
81+
.port(port)
82+
.build()
83+
val newRequest = request.newBuilder()
84+
.url(newUrl)
85+
.build()
86+
chain.proceed(newRequest)
87+
}
88+
6689

6790
private class ErrorHandlingInterceptor(private val context: Context) : Interceptor {
6891
override fun intercept(chain: Interceptor.Chain): Response {
@@ -72,9 +95,16 @@ object TpuApi {
7295

7396
if (!response.isSuccessful) {
7497
val error: JSONObject = JSONObject(response.body?.string() ?: "{}")
75-
val errorMessage =
76-
error.getJSONArray("errors").getJSONObject(0).getString("message")
77-
showToast(errorMessage)
98+
val errorType = error.getJSONArray("errors").getJSONObject(0).getString("name")
99+
if(errorType == "INVALID_TOKEN") {
100+
UserStore.resetUser()
101+
SessionManager(context).setUserCache(null)
102+
SessionManager(context).saveAuthToken(null)
103+
} else {
104+
val errorMessage =
105+
error.getJSONArray("errors").getJSONObject(0).getString("message")
106+
showToast(errorMessage)
107+
}
78108
return Response.Builder()
79109
.request(request)
80110
.protocol(Protocol.HTTP_2)
@@ -208,6 +238,15 @@ object TpuApi {
208238
fun createChat(
209239
@Body members: ChatCreateRequest
210240
): Call<Chat>
241+
242+
@GET("/api/v3/core")
243+
fun getInstanceInfo(): Call<State>
244+
245+
@POST("user/friends/username/{username}/{type}")
246+
fun addFriend(
247+
@Path("username") username: String,
248+
@Path("type") type: String
249+
): Call<Unit>
211250
}
212251

213252
val retrofitService: TpuApiService by lazy {

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

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

3+
import android.util.Log
34
import com.troplo.privateuploader.data.model.Chat
45
import com.troplo.privateuploader.data.model.User
56
import java.text.DateFormat
@@ -56,7 +57,7 @@ object TpuFunctions {
5657

5758
return localDateTime.format(formatter)
5859
} catch (e: Exception) {
59-
println("Error formatting date (FD): $e")
60+
Log.d("TPU.Untagged", "Error formatting date (FD): $e")
6061
return "Check logcat"
6162
}
6263
}
@@ -70,7 +71,7 @@ object TpuFunctions {
7071

7172
return localDateTime.format(formatter)
7273
} catch (e: Exception) {
73-
println("Error formatting date (FDD): $e")
74+
Log.d("TPU.Untagged", "Error formatting date (FDD): $e")
7475
return "Check logcat"
7576
}
7677
}
@@ -103,7 +104,7 @@ object TpuFunctions {
103104
val df1: DateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ")
104105
df1.parse(date)
105106
} catch (e: Exception) {
106-
println("Error formatting date (GD): $e")
107+
Log.d("TPU.Untagged", "Error formatting date (GD): $e")
107108
null
108109
}
109110
}

0 commit comments

Comments
 (0)