diff --git a/.idea/dictionaries/project.xml b/.idea/dictionaries/project.xml new file mode 100644 index 00000000..558059d9 --- /dev/null +++ b/.idea/dictionaries/project.xml @@ -0,0 +1,8 @@ + + + + kjbook + unreads + + + \ No newline at end of file diff --git a/app/src/main/java/chat/revolt/RevoltApplication.kt b/app/src/main/java/chat/revolt/RevoltApplication.kt index e0999f8e..0e7b1254 100644 --- a/app/src/main/java/chat/revolt/RevoltApplication.kt +++ b/app/src/main/java/chat/revolt/RevoltApplication.kt @@ -1,6 +1,8 @@ package chat.revolt import android.app.Application +import chat.revolt.api.RevoltHttp +import chat.revolt.persistence.KVStorage import com.google.android.material.color.DynamicColors import dagger.hilt.android.HiltAndroidApp import logcat.AndroidLogcatLogger @@ -15,6 +17,7 @@ class RevoltApplication : Application() { override fun onCreate() { super.onCreate() AndroidLogcatLogger.installOnDebuggableApp(this, minPriority = LogPriority.VERBOSE) + RevoltHttp // Trigger initialization } init { @@ -22,3 +25,11 @@ class RevoltApplication : Application() { DynamicColors.applyToActivitiesIfAvailable(this) } } + +/** + * Extension function to get KVStorage instance. + * @return KVStorage instance + */ +fun RevoltApplication.getKVStorage(): KVStorage { + return KVStorage(this) +} diff --git a/app/src/main/java/chat/revolt/activities/InviteActivity.kt b/app/src/main/java/chat/revolt/activities/InviteActivity.kt index a0ebfb26..05be1435 100644 --- a/app/src/main/java/chat/revolt/activities/InviteActivity.kt +++ b/app/src/main/java/chat/revolt/activities/InviteActivity.kt @@ -47,7 +47,7 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewmodel.compose.viewModel import chat.revolt.R -import chat.revolt.api.REVOLT_FILES +import chat.revolt.api.RevoltAPI import chat.revolt.api.RevoltError import chat.revolt.api.routes.invites.fetchInviteByCode import chat.revolt.api.routes.invites.joinInviteByCode @@ -180,7 +180,7 @@ fun InviteScreen( contentAlignment = Alignment.Center ) { GlideImage( - model = "$REVOLT_FILES/banners/${invite?.serverBanner?.id}/${invite?.serverBanner?.filename}", + model = "${RevoltAPI.getCurrentFilesUrl()}/banners/${invite?.serverBanner?.id}/${invite?.serverBanner?.filename}", contentScale = ContentScale.Crop, contentDescription = null, modifier = Modifier @@ -205,7 +205,7 @@ fun InviteScreen( ) { if (invite?.serverIcon != null) { RemoteImage( - url = "$REVOLT_FILES/icons/${invite.serverIcon.id}/${invite.serverIcon.filename}", + url = "${RevoltAPI.getCurrentFilesUrl()}/icons/${invite.serverIcon.id}/${invite.serverIcon.filename}", allowAnimation = false, description = viewModel.inviteResult?.value?.serverName ?: stringResource(id = R.string.unknown), diff --git a/app/src/main/java/chat/revolt/activities/media/ImageViewActivity.kt b/app/src/main/java/chat/revolt/activities/media/ImageViewActivity.kt index 2ca46ff0..c339271b 100644 --- a/app/src/main/java/chat/revolt/activities/media/ImageViewActivity.kt +++ b/app/src/main/java/chat/revolt/activities/media/ImageViewActivity.kt @@ -41,7 +41,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow import androidx.core.view.WindowCompat import chat.revolt.R -import chat.revolt.api.REVOLT_FILES +import chat.revolt.api.RevoltAPI import chat.revolt.api.RevoltHttp import chat.revolt.api.schemas.AutumnResource import chat.revolt.api.settings.LoadedSettings @@ -85,7 +85,7 @@ class ImageViewActivity : ComponentActivity() { @OptIn(ExperimentalMaterial3Api::class) @Composable fun ImageViewScreen(resource: AutumnResource, onClose: () -> Unit = {}) { - val resourceUrl = "$REVOLT_FILES/attachments/${resource.id}/${resource.filename}" + val resourceUrl = "${RevoltAPI.getCurrentFilesUrl()}/attachments/${resource.id}/${resource.filename}" val context = LocalContext.current diff --git a/app/src/main/java/chat/revolt/activities/media/VideoViewActivity.kt b/app/src/main/java/chat/revolt/activities/media/VideoViewActivity.kt index 4fcdd970..d4ca85cd 100644 --- a/app/src/main/java/chat/revolt/activities/media/VideoViewActivity.kt +++ b/app/src/main/java/chat/revolt/activities/media/VideoViewActivity.kt @@ -19,7 +19,7 @@ import androidx.lifecycle.lifecycleScope import androidx.media3.common.MediaItem import androidx.media3.exoplayer.ExoPlayer import chat.revolt.R -import chat.revolt.api.REVOLT_FILES +import chat.revolt.api.RevoltAPI import chat.revolt.api.RevoltHttp import chat.revolt.api.schemas.AutumnResource import chat.revolt.databinding.ActivityVideoplayerBinding @@ -54,7 +54,7 @@ class VideoViewActivity : FragmentActivity() { } val resourceUrl = - "$REVOLT_FILES/attachments/${autumnResource.id}/${autumnResource.filename}" + "${RevoltAPI.getCurrentFilesUrl()}/attachments/${autumnResource.id}/${autumnResource.filename}" WindowCompat.setDecorFitsSystemWindows(window, false) diff --git a/app/src/main/java/chat/revolt/api/RevoltAPI.kt b/app/src/main/java/chat/revolt/api/RevoltAPI.kt index a5c7c77e..fa1f3718 100644 --- a/app/src/main/java/chat/revolt/api/RevoltAPI.kt +++ b/app/src/main/java/chat/revolt/api/RevoltAPI.kt @@ -18,6 +18,7 @@ import chat.revolt.api.schemas.Message import chat.revolt.api.schemas.Server import chat.revolt.api.schemas.User import chat.revolt.api.unreads.Unreads +import chat.revolt.getKVStorage import chat.revolt.persistence.Database import chat.revolt.persistence.SqlStorage import com.chuckerteam.chucker.api.ChuckerCollector @@ -53,24 +54,70 @@ import kotlinx.serialization.json.Json import java.net.SocketException import chat.revolt.api.schemas.Channel as ChannelSchema -private const val USE_ALPHA_API = false +/** + * Enum representing available platforms in the application. + */ +enum class ApplicationPlatform(val baseUrl: String) { + REVOLT("https://api.revolt.chat"), + PEP("https://peptide.chat/api") +} -val REVOLT_BASE = - if (USE_ALPHA_API) "https://alpha.revolt.chat/api" else "https://api.revolt.chat/0.8" -const val REVOLT_SUPPORT = "https://support.revolt.chat" -const val REVOLT_MARKETING = "https://revolt.chat" -val REVOLT_FILES = - if (USE_ALPHA_API) "https://alpha.revolt.chat/autumn" else "https://cdn.revoltusercontent.com" -val REVOLT_JANUARY = - if (USE_ALPHA_API) "https://alpha.revolt.chat/january" else "https://jan.revolt.chat" -const val REVOLT_APP = "https://app.revolt.chat" -const val REVOLT_INVITES = "https://rvlt.gg" -val REVOLT_WEBSOCKET = - if (USE_ALPHA_API) "wss://alpha.revolt.chat/ws" else "wss://ws.revolt.chat" -const val REVOLT_KJBOOK = "https://revoltchat.github.io/android" +/** + * Platform URL configuration + */ +data class PlatformUrls( + val base: String, + val marketing: String, + val files: String, + val january: String, + val app: String, + val invites: String, + val websocket: String, + val autumn: String, + val kjbook: String +) + +// Platform URL configurations +private val PLATFORM_URLS = mapOf( + ApplicationPlatform.REVOLT to PlatformUrls( + base = "https://api.revolt.chat/0.8", + marketing = "https://revolt.chat", + files = "https://cdn.revoltusercontent.com", + january = "https://jan.revolt.chat", + app = "https://app.revolt.chat", + invites = "https://rvlt.gg", + websocket = "wss://ws.revolt.chat", + autumn = "https://autumn.revolt.chat", + kjbook = "https://revoltchat.github.io/android" + ), + ApplicationPlatform.PEP to PlatformUrls( + base = "https://a-pep.peptide.chat/api", + marketing = "https://peptide.chat", + files = "https://cdn.pepusercontent.com", + january = "https://a-pep.peptide.chat/january", + app = "https://peptide.chat", + invites = "https://pep.gg", + websocket = "wss://a-pep.peptide.chat/ws", + autumn = "https://a-pep.peptide.chat/autumn", + // TODO: Replace with correct URL + kjbook = "https://revoltchat.github.io/android" + // TODO: Replace with correct URL + ) +) + +object UrlsStorageKeys { + const val PLATFORM = "platform_key" +} fun String.api(): String { - return "$REVOLT_BASE$this" + return "${RevoltAPI.getCurrentBaseUrl()}$this" +} + +/** + * Helper functions to get URLs for a specific platform + */ +private fun getUrlForPlatform(platform: ApplicationPlatform, urlSelector: (PlatformUrls) -> String): String { + return urlSelector(PLATFORM_URLS[platform]!!) } fun buildUserAgent(accessMethod: String = "Ktor"): String { @@ -90,58 +137,60 @@ val RevoltCbor = Cbor { ignoreUnknownKeys = true } -val RevoltHttp = HttpClient(OkHttp) { - install(DefaultRequest) - install(ContentNegotiation) { - json(RevoltJson) - } - - install(WebSockets) - - install(HttpRequestRetry) { - retryOnServerErrors(maxRetries = 5) - retryOnException(maxRetries = 5) - - modifyRequest { request -> - request.headers.append("x-retry-count", retryCount.toString()) +val RevoltHttp by lazy { + HttpClient(OkHttp) { + install(DefaultRequest) + install(ContentNegotiation) { + json(RevoltJson) } - exponentialDelay() - } + install(WebSockets) - install(Logging) { level = LogLevel.INFO } + install(HttpRequestRetry) { + retryOnServerErrors(maxRetries = 5) + retryOnException(maxRetries = 5) - val chuckerCollector = ChuckerCollector( - context = RevoltApplication.instance, - showNotification = true, - retentionPeriod = RetentionManager.Period.ONE_DAY - ) + modifyRequest { request -> + request.headers.append("x-retry-count", retryCount.toString()) + } - val chuckerInterceptor = ChuckerInterceptor.Builder(RevoltApplication.instance) - .collector(chuckerCollector) - .maxContentLength(250_000L) - .redactHeaders(RevoltAPI.TOKEN_HEADER_NAME) - .alwaysReadResponseBody(true) - .createShortcut(false) - .build() + exponentialDelay() + } - engine { - addInterceptor { chain -> - val request = chain.request().newBuilder() - .apply { - if (chain.request().headers[RevoltAPI.TOKEN_HEADER_NAME] == null) { - header(RevoltAPI.TOKEN_HEADER_NAME, RevoltAPI.sessionToken) + install(Logging) { level = LogLevel.INFO } + + val chuckerCollector = ChuckerCollector( + context = RevoltApplication.instance, + showNotification = true, + retentionPeriod = RetentionManager.Period.ONE_DAY + ) + + val chuckerInterceptor = ChuckerInterceptor.Builder(RevoltApplication.instance) + .collector(chuckerCollector) + .maxContentLength(250_000L) + .redactHeaders(RevoltAPI.TOKEN_HEADER_NAME) + .alwaysReadResponseBody(true) + .createShortcut(false) + .build() + + engine { + addInterceptor { chain -> + val request = chain.request().newBuilder() + .apply { + if (chain.request().headers[RevoltAPI.TOKEN_HEADER_NAME] == null) { + header(RevoltAPI.TOKEN_HEADER_NAME, RevoltAPI.sessionToken) + } } - } - .build() - chain.proceed(request) + .build() + chain.proceed(request) + } + addInterceptor(chuckerInterceptor) } - addInterceptor(chuckerInterceptor) - } - defaultRequest { - url(REVOLT_BASE) - header("User-Agent", buildUserAgent()) + defaultRequest { + url(RevoltAPI.getCurrentBaseUrl()) + header("User-Agent", buildUserAgent()) + } } } @@ -167,6 +216,56 @@ object RevoltAPI { var sessionId: String = "" private set + /** + * The currently selected platform. + * Default is REVOLT. + */ + var selectedApplicationPlatform: ApplicationPlatform = ApplicationPlatform.REVOLT + private set + + /** + * Sets the current platform and saves it to persistent storage. + * @param applicationPlatform The platform to set + */ + fun setPlatform(applicationPlatform: ApplicationPlatform) { + selectedApplicationPlatform = applicationPlatform + CoroutineScope(Dispatchers.IO).launch { + savePlatformSelection() + } + } + + /** + * Saves the current platform selection to persistent storage. + */ + private suspend fun savePlatformSelection() { + val kvStorage = RevoltApplication.instance.getKVStorage() + kvStorage.set(UrlsStorageKeys.PLATFORM, selectedApplicationPlatform.name) + } + + /** + * Loads the platform selection from persistent storage. + */ + suspend fun loadPlatformSelection() { + val kvStorage = RevoltApplication.instance.getKVStorage() + val applicationPlatformName = kvStorage.get(UrlsStorageKeys.PLATFORM) ?: ApplicationPlatform.REVOLT.name + selectedApplicationPlatform = try { + ApplicationPlatform.valueOf(applicationPlatformName) + } catch (_: IllegalArgumentException) { + ApplicationPlatform.REVOLT + } + } + + // URL getter functions + fun getCurrentBaseUrl(): String = getUrlForPlatform(selectedApplicationPlatform) { it.base } + fun getCurrentMarketingUrl(): String = getUrlForPlatform(selectedApplicationPlatform) { it.marketing } + fun getCurrentFilesUrl(): String = getUrlForPlatform(selectedApplicationPlatform) { it.files } + fun getCurrentJanuaryUrl(): String = getUrlForPlatform(selectedApplicationPlatform) { it.january } + fun getCurrentAppUrl(): String = getUrlForPlatform(selectedApplicationPlatform) { it.app } + fun getCurrentInvitesUrl(): String = getUrlForPlatform(selectedApplicationPlatform) { it.invites } + fun getCurrentWebSocketUrl(): String = getUrlForPlatform(selectedApplicationPlatform) { it.websocket } + fun getCurrentAutumnUrl(): String = getUrlForPlatform(selectedApplicationPlatform) { it.autumn } + fun getCurrentKjBookUrl(): String = getUrlForPlatform(selectedApplicationPlatform) { it.kjbook } + @OptIn(DelicateCoroutinesApi::class, ExperimentalCoroutinesApi::class) val realtimeContext = newSingleThreadContext("RealtimeContext") val wsFrameChannel = Channel(Channel.UNLIMITED) @@ -191,7 +290,7 @@ object RevoltAPI { } @OptIn(ExperimentalCoroutinesApi::class) - suspend fun connectWS() { + fun connectWS() { socketCoroutine = CoroutineScope(Dispatchers.IO).launch { try { withContext(realtimeContext) { @@ -220,7 +319,7 @@ object RevoltAPI { } } - private suspend fun startSocketOps() { + private fun startSocketOps() { connectWS() // Send a ping every roughly 30 seconds else the socket dies @@ -237,6 +336,7 @@ object RevoltAPI { } suspend fun initialize() { + loadPlatformSelection() if (sessionToken != "") { fetchSelf() } @@ -281,7 +381,7 @@ object RevoltAPI { setSessionHeader(token) fetchSelf() true - } catch (e: Exception) { + } catch (_: Exception) { false } } @@ -304,7 +404,7 @@ object RevoltAPI { id = it.id, channelType = try { ChannelType.valueOf(it.channelType) - } catch (e: Exception) { + } catch (_: Exception) { null }, user = it.userId, diff --git a/app/src/main/java/chat/revolt/api/internals/ResourceLocations.kt b/app/src/main/java/chat/revolt/api/internals/ResourceLocations.kt index 1f399cba..69dbf3f4 100644 --- a/app/src/main/java/chat/revolt/api/internals/ResourceLocations.kt +++ b/app/src/main/java/chat/revolt/api/internals/ResourceLocations.kt @@ -1,13 +1,13 @@ package chat.revolt.api.internals -import chat.revolt.api.REVOLT_FILES +import chat.revolt.api.RevoltAPI import chat.revolt.api.api import chat.revolt.api.schemas.User object ResourceLocations { fun userAvatarUrl(user: User?): String { if (user?.avatar != null) { - return "$REVOLT_FILES/avatars/${user.avatar.id}" + return "${RevoltAPI.getCurrentFilesUrl()}/avatars/${user.avatar.id}" } return "/users/${(user?.id ?: "").ifBlank { "0".repeat(26) }}/default_avatar".api() } diff --git a/app/src/main/java/chat/revolt/api/realtime/RealtimeSocket.kt b/app/src/main/java/chat/revolt/api/realtime/RealtimeSocket.kt index 3c1f8894..096643e1 100644 --- a/app/src/main/java/chat/revolt/api/realtime/RealtimeSocket.kt +++ b/app/src/main/java/chat/revolt/api/realtime/RealtimeSocket.kt @@ -3,7 +3,6 @@ package chat.revolt.api.realtime import android.util.Log import androidx.compose.runtime.mutableStateOf import chat.revolt.RevoltApplication -import chat.revolt.api.REVOLT_WEBSOCKET import chat.revolt.api.RevoltAPI import chat.revolt.api.RevoltHttp import chat.revolt.api.RevoltJson @@ -88,7 +87,7 @@ object RealtimeSocket { socket?.close(CloseReason(CloseReason.Codes.NORMAL, "Reconnecting to websocket.")) - RevoltHttp.ws(REVOLT_WEBSOCKET) { + RevoltHttp.ws(RevoltAPI.getCurrentWebSocketUrl()) { socket = this Log.d("RealtimeSocket", "Connected to websocket.") diff --git a/app/src/main/java/chat/revolt/api/routes/microservices/autumn/Autumn.kt b/app/src/main/java/chat/revolt/api/routes/microservices/autumn/Autumn.kt index 3011ec53..0159c07b 100644 --- a/app/src/main/java/chat/revolt/api/routes/microservices/autumn/Autumn.kt +++ b/app/src/main/java/chat/revolt/api/routes/microservices/autumn/Autumn.kt @@ -1,7 +1,6 @@ package chat.revolt.api.routes.microservices.autumn import chat.revolt.api.HitRateLimitException -import chat.revolt.api.REVOLT_FILES import chat.revolt.api.RevoltAPI import chat.revolt.api.RevoltHttp import chat.revolt.api.RevoltJson @@ -37,7 +36,7 @@ suspend fun uploadToAutumn( contentType: ContentType, onProgress: (Long, Long) -> Unit = { _, _ -> } ): String { - val uploadUrl = "$REVOLT_FILES/$tag" + val uploadUrl = "${RevoltAPI.getCurrentFilesUrl()}/$tag" val response = RevoltHttp.post(uploadUrl) { setBody( diff --git a/app/src/main/java/chat/revolt/api/routes/microservices/january/January.kt b/app/src/main/java/chat/revolt/api/routes/microservices/january/January.kt index e3c30f9d..1280269a 100644 --- a/app/src/main/java/chat/revolt/api/routes/microservices/january/January.kt +++ b/app/src/main/java/chat/revolt/api/routes/microservices/january/January.kt @@ -1,8 +1,8 @@ package chat.revolt.api.routes.microservices.january -import chat.revolt.api.REVOLT_JANUARY +import chat.revolt.api.RevoltAPI import java.net.URLEncoder fun asJanuaryProxyUrl(url: String): String { - return "$REVOLT_JANUARY/proxy?url=${URLEncoder.encode(url, "utf-8")}" + return "${RevoltAPI.getCurrentJanuaryUrl()}/proxy?url=${URLEncoder.encode(url, "utf-8")}" } diff --git a/app/src/main/java/chat/revolt/api/schemas/Invites.kt b/app/src/main/java/chat/revolt/api/schemas/Invites.kt index 7ab6b281..bf841fbd 100644 --- a/app/src/main/java/chat/revolt/api/schemas/Invites.kt +++ b/app/src/main/java/chat/revolt/api/schemas/Invites.kt @@ -2,8 +2,7 @@ package chat.revolt.api.schemas import android.net.Uri import androidx.core.net.toUri -import chat.revolt.api.REVOLT_APP -import chat.revolt.api.REVOLT_INVITES +import chat.revolt.api.RevoltAPI import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -52,8 +51,8 @@ data class InviteJoined( fun Uri.isInviteUri(): Boolean { val firstPathSegmentIsInvite = this.pathSegments.firstOrNull() == "invite" - val isAppRevoltChat = this.host == REVOLT_APP.toUri().host - val matchRvltGG = this.host == REVOLT_INVITES.toUri().host + val isAppRevoltChat = this.host == RevoltAPI.getCurrentAppUrl().toUri().host + val matchRvltGG = this.host == RevoltAPI.getCurrentInvitesUrl().toUri().host val matchApp = isAppRevoltChat && firstPathSegmentIsInvite diff --git a/app/src/main/java/chat/revolt/c2dm/HandlerService.kt b/app/src/main/java/chat/revolt/c2dm/HandlerService.kt index a08561fe..ff21cb7a 100644 --- a/app/src/main/java/chat/revolt/c2dm/HandlerService.kt +++ b/app/src/main/java/chat/revolt/c2dm/HandlerService.kt @@ -12,7 +12,7 @@ import androidx.core.app.RemoteInput import androidx.core.graphics.drawable.IconCompat import chat.revolt.R import chat.revolt.activities.MainActivity -import chat.revolt.api.REVOLT_BASE +import chat.revolt.api.RevoltAPI import chat.revolt.api.RevoltJson import chat.revolt.api.internals.ULID import chat.revolt.api.routes.push.subscribePush @@ -78,7 +78,7 @@ class HandlerService : FirebaseMessagingService() { if (authorIcon == null) { authorIcon = - "$REVOLT_BASE/users/${message.author?.ifBlank { "0".repeat(26) }}/default_avatar" + "${RevoltAPI.getCurrentBaseUrl()}/users/${message.author?.ifBlank { "0".repeat(26) }}/default_avatar" } val db = Database(SqlStorage.driver) diff --git a/app/src/main/java/chat/revolt/composables/chat/MemberListItem.kt b/app/src/main/java/chat/revolt/composables/chat/MemberListItem.kt index 521409e9..775ed1dc 100644 --- a/app/src/main/java/chat/revolt/composables/chat/MemberListItem.kt +++ b/app/src/main/java/chat/revolt/composables/chat/MemberListItem.kt @@ -8,7 +8,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Brush import androidx.compose.ui.text.style.TextOverflow -import chat.revolt.api.REVOLT_FILES +import chat.revolt.api.RevoltAPI import chat.revolt.api.internals.BrushCompat import chat.revolt.api.internals.Roles import chat.revolt.api.internals.solidColor @@ -74,7 +74,7 @@ fun MemberListItem( ?: user?.id ?: userId, avatar = user?.avatar, - rawUrl = member?.avatar?.let { "$REVOLT_FILES/avatars/${it.id}" }, + rawUrl = member?.avatar?.let { "${RevoltAPI.getCurrentFilesUrl()}/avatars/${it.id}" }, userId = userId, presence = presenceFromStatus( user?.status?.presence, diff --git a/app/src/main/java/chat/revolt/composables/chat/Message.kt b/app/src/main/java/chat/revolt/composables/chat/Message.kt index 4e68651d..50fba1c1 100644 --- a/app/src/main/java/chat/revolt/composables/chat/Message.kt +++ b/app/src/main/java/chat/revolt/composables/chat/Message.kt @@ -62,7 +62,6 @@ import androidx.compose.ui.unit.sp import chat.revolt.R import chat.revolt.activities.media.ImageViewActivity import chat.revolt.activities.media.VideoViewActivity -import chat.revolt.api.REVOLT_FILES import chat.revolt.api.RevoltAPI import chat.revolt.api.internals.BrushCompat import chat.revolt.api.internals.MessageFlag @@ -142,7 +141,7 @@ fun authorAvatarUrl(message: MessageSchema): String? { val member = message.author?.let { RevoltAPI.members.getMember(serverId, it) } ?: return null - return member.avatar?.let { "$REVOLT_FILES/avatars/${it.id}" } + return member.avatar?.let { "${RevoltAPI.getCurrentFilesUrl()}/avatars/${it.id}" } } fun viewUrlInBrowser(ctx: android.content.Context, url: String) { @@ -153,7 +152,7 @@ fun viewUrlInBrowser(ctx: android.content.Context, url: String) { } fun viewAttachmentInBrowser(ctx: android.content.Context, attachment: AutumnResource) { - val url = "$REVOLT_FILES/attachments/${attachment.id}/${attachment.filename}" + val url = "${RevoltAPI.getCurrentFilesUrl()}/attachments/${attachment.id}/${attachment.filename}" viewUrlInBrowser(ctx, url) } diff --git a/app/src/main/java/chat/revolt/composables/chat/MessageAttachment.kt b/app/src/main/java/chat/revolt/composables/chat/MessageAttachment.kt index a10fa65c..f737cb1e 100644 --- a/app/src/main/java/chat/revolt/composables/chat/MessageAttachment.kt +++ b/app/src/main/java/chat/revolt/composables/chat/MessageAttachment.kt @@ -33,7 +33,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import chat.revolt.R -import chat.revolt.api.REVOLT_FILES +import chat.revolt.api.RevoltAPI import chat.revolt.api.schemas.AutumnResource import chat.revolt.composables.generic.RemoteImage import chat.revolt.composables.media.AudioPlayer @@ -83,7 +83,7 @@ fun FileAttachment(attachment: AutumnResource) { @SuppressLint("UnusedBoxWithConstraintsScope") @Composable fun ImageAttachment(attachment: AutumnResource) { - val url = "$REVOLT_FILES/attachments/${attachment.id}/${attachment.filename}" + val url = "${RevoltAPI.getCurrentFilesUrl()}/attachments/${attachment.id}/${attachment.filename}" var spoilerShown by remember { mutableStateOf(false) } val hazeState = if (attachment.filename?.startsWith("SPOILER_") == true) rememberHazeState() else null @@ -149,7 +149,7 @@ fun VideoPlayButton() { @SuppressLint("UnusedBoxWithConstraintsScope") @Composable fun VideoAttachment(attachment: AutumnResource) { - val url = "$REVOLT_FILES/attachments/${attachment.id}/${attachment.filename}" + val url = "${RevoltAPI.getCurrentFilesUrl()}/attachments/${attachment.id}/${attachment.filename}" BoxWithConstraints { Box( @@ -179,7 +179,7 @@ fun VideoAttachment(attachment: AutumnResource) { @Composable fun AudioAttachment(attachment: AutumnResource) { - val url = "$REVOLT_FILES/attachments/${attachment.id}/${attachment.filename}" + val url = "${RevoltAPI.getCurrentFilesUrl()}/attachments/${attachment.id}/${attachment.filename}" AudioPlayer( url = url, filename = attachment.filename ?: "Audio", diff --git a/app/src/main/java/chat/revolt/composables/chat/MessageField.kt b/app/src/main/java/chat/revolt/composables/chat/MessageField.kt index 1036ff6f..3a327122 100644 --- a/app/src/main/java/chat/revolt/composables/chat/MessageField.kt +++ b/app/src/main/java/chat/revolt/composables/chat/MessageField.kt @@ -82,7 +82,7 @@ import androidx.compose.ui.unit.dp import chat.revolt.R import chat.revolt.activities.RevoltTweenFloat import chat.revolt.activities.RevoltTweenInt -import chat.revolt.api.REVOLT_FILES +import chat.revolt.api.RevoltAPI import chat.revolt.api.internals.BrushCompat import chat.revolt.api.schemas.ChannelType import chat.revolt.api.schemas.Member @@ -318,7 +318,7 @@ fun MessageField( userId = item.user.id ?: "", avatar = item.user.avatar, rawUrl = item.member?.avatar?.id?.let { - "$REVOLT_FILES/avatars/$it" + "${RevoltAPI.getCurrentFilesUrl()}/avatars/$it" }, size = SuggestionChipDefaults.IconSize, ) @@ -444,7 +444,7 @@ fun MessageField( ) } else { RemoteImage( - url = "$REVOLT_FILES/emojis/${item.custom?.id}", + url = "${RevoltAPI.getCurrentFilesUrl()}/emojis/${item.custom?.id}", description = null, contentScale = ContentScale.Fit, modifier = Modifier diff --git a/app/src/main/java/chat/revolt/composables/chat/Reaction.kt b/app/src/main/java/chat/revolt/composables/chat/Reaction.kt index 52fff161..e28f48b6 100644 --- a/app/src/main/java/chat/revolt/composables/chat/Reaction.kt +++ b/app/src/main/java/chat/revolt/composables/chat/Reaction.kt @@ -28,7 +28,6 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import chat.revolt.api.REVOLT_FILES import chat.revolt.api.RevoltAPI import chat.revolt.api.internals.isUlid import chat.revolt.composables.generic.RemoteImage @@ -74,7 +73,7 @@ fun Reaction( CompositionLocalProvider(LocalContentColor provides foreground) { if (emoji.isUlid()) { RemoteImage( - url = "$REVOLT_FILES/emojis/${emoji}", + url = "${RevoltAPI.getCurrentFilesUrl()}/emojis/${emoji}", description = null, modifier = Modifier.size(16.dp) ) diff --git a/app/src/main/java/chat/revolt/composables/emoji/EmojiPicker.kt b/app/src/main/java/chat/revolt/composables/emoji/EmojiPicker.kt index 81cb153f..026814f2 100644 --- a/app/src/main/java/chat/revolt/composables/emoji/EmojiPicker.kt +++ b/app/src/main/java/chat/revolt/composables/emoji/EmojiPicker.kt @@ -62,7 +62,7 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import chat.revolt.R import chat.revolt.activities.RevoltTweenFloat -import chat.revolt.api.REVOLT_FILES +import chat.revolt.api.RevoltAPI import chat.revolt.callbacks.Action import chat.revolt.callbacks.ActionChannel import chat.revolt.composables.generic.IconPlaceholder @@ -401,7 +401,7 @@ fun EmojiPicker( ) } else { RemoteImage( - url = "$REVOLT_FILES/icons/${server.icon.id}", + url = "${RevoltAPI.getCurrentFilesUrl()}/icons/${server.icon.id}", allowAnimation = false, description = server.name, modifier = Modifier @@ -619,7 +619,7 @@ fun ColumnScope.PickerItem( verticalArrangement = Arrangement.Center ) { RemoteImage( - url = "$REVOLT_FILES/emojis/${item.emote.id}", + url = "${RevoltAPI.getCurrentFilesUrl()}/emojis/${item.emote.id}", description = item.emote.name, contentScale = ContentScale.Fit, modifier = Modifier diff --git a/app/src/main/java/chat/revolt/composables/generic/DefaultButtonStyle.kt b/app/src/main/java/chat/revolt/composables/generic/DefaultButtonStyle.kt deleted file mode 100644 index f52b17ca..00000000 --- a/app/src/main/java/chat/revolt/composables/generic/DefaultButtonStyle.kt +++ /dev/null @@ -1,4 +0,0 @@ -package chat.revolt.composables.generic - -class DefaultButtonStyle { -} \ No newline at end of file diff --git a/app/src/main/java/chat/revolt/composables/generic/UserAvatar.kt b/app/src/main/java/chat/revolt/composables/generic/UserAvatar.kt index 22f0a58a..ad321892 100644 --- a/app/src/main/java/chat/revolt/composables/generic/UserAvatar.kt +++ b/app/src/main/java/chat/revolt/composables/generic/UserAvatar.kt @@ -1,5 +1,7 @@ package chat.revolt.composables.generic +import android.graphics.Bitmap +import android.graphics.drawable.BitmapDrawable import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.background import androidx.compose.foundation.border @@ -23,8 +25,7 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import chat.revolt.R -import chat.revolt.api.REVOLT_BASE -import chat.revolt.api.REVOLT_FILES +import chat.revolt.api.RevoltAPI import chat.revolt.api.schemas.AutumnResource import chat.revolt.api.settings.LoadedSettings @@ -102,7 +103,7 @@ fun UserAvatar( ) { if (avatar != null) { RemoteImage( - url = rawUrl ?: "$REVOLT_FILES/avatars/${avatar.id}", + url = rawUrl ?: "${RevoltAPI.getCurrentFilesUrl()}/avatars/${avatar.id}", contentScale = ContentScale.Crop, description = stringResource(id = R.string.avatar_alt, username), allowAnimation = allowAnimation, @@ -123,7 +124,7 @@ fun UserAvatar( ) } else { RemoteImage( - url = "$REVOLT_BASE/users/${userId.ifBlank { "0".repeat(26) }}/default_avatar", + url = "${RevoltAPI.getCurrentBaseUrl()}/users/${userId.ifBlank { "0".repeat(26) }}/default_avatar", description = stringResource(id = R.string.avatar_alt, username), allowAnimation = allowAnimation, modifier = Modifier @@ -167,7 +168,7 @@ fun GroupIcon( ) { if (icon?.id != null) { RemoteImage( - url = rawUrl ?: "$REVOLT_FILES/icons/${icon.id}", + url = rawUrl ?: "${RevoltAPI.getCurrentFilesUrl()}/icons/${icon.id}", allowAnimation = false, contentScale = ContentScale.Crop, description = stringResource(id = R.string.avatar_alt, name), diff --git a/app/src/main/java/chat/revolt/composables/markdown/MarkdownText.kt b/app/src/main/java/chat/revolt/composables/markdown/MarkdownText.kt index 7978ce9f..5c70613b 100644 --- a/app/src/main/java/chat/revolt/composables/markdown/MarkdownText.kt +++ b/app/src/main/java/chat/revolt/composables/markdown/MarkdownText.kt @@ -35,7 +35,6 @@ import androidx.compose.ui.text.font.FontWeight import androidx.core.net.toUri import chat.revolt.R import chat.revolt.activities.InviteActivity -import chat.revolt.api.REVOLT_FILES import chat.revolt.api.RevoltAPI import chat.revolt.api.routes.custom.fetchEmoji import chat.revolt.api.schemas.isInviteUri @@ -434,7 +433,7 @@ fun MarkdownText(textNode: AstNode, modifier: Modifier = Modifier) { } else { with(LocalDensity.current) { RemoteImage( - url = "$REVOLT_FILES/emojis/${id}", + url = "${RevoltAPI.getCurrentFilesUrl()}/emojis/${id}", description = emote.name, contentScale = ContentScale.Fit, modifier = Modifier diff --git a/app/src/main/java/chat/revolt/composables/screens/chat/ChannelSheetHeader.kt b/app/src/main/java/chat/revolt/composables/screens/chat/ChannelSheetHeader.kt index 8a5fe7a6..0ee6371c 100644 --- a/app/src/main/java/chat/revolt/composables/screens/chat/ChannelSheetHeader.kt +++ b/app/src/main/java/chat/revolt/composables/screens/chat/ChannelSheetHeader.kt @@ -26,7 +26,7 @@ import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp -import chat.revolt.api.REVOLT_FILES +import chat.revolt.api.RevoltAPI import chat.revolt.api.schemas.AutumnResource import chat.revolt.api.schemas.ChannelType import chat.revolt.api.schemas.User @@ -66,7 +66,7 @@ fun ChannelSheetHeader( ) { if (channelIcon != null) { RemoteImage( - url = "$REVOLT_FILES/icons/${channelIcon.id ?: ""}", + url = "${RevoltAPI.getCurrentFilesUrl()}/icons/${channelIcon.id ?: ""}", description = null, // decorative contentScale = ContentScale.Crop, height = 48, diff --git a/app/src/main/java/chat/revolt/composables/screens/chat/TypingIndicator.kt b/app/src/main/java/chat/revolt/composables/screens/chat/TypingIndicator.kt index 17fa440d..a8443e3f 100644 --- a/app/src/main/java/chat/revolt/composables/screens/chat/TypingIndicator.kt +++ b/app/src/main/java/chat/revolt/composables/screens/chat/TypingIndicator.kt @@ -24,7 +24,6 @@ import androidx.compose.ui.unit.sp import chat.revolt.R import chat.revolt.activities.RevoltTweenFloat import chat.revolt.activities.RevoltTweenInt -import chat.revolt.api.REVOLT_FILES import chat.revolt.api.RevoltAPI import chat.revolt.api.schemas.User import chat.revolt.composables.generic.UserAvatar @@ -50,7 +49,7 @@ fun StackedUserAvatars( userId = userId, username = user?.let { User.resolveDefaultName(it) } ?: stringResource(id = R.string.unknown), - rawUrl = maybeMember?.avatar?.let { "$REVOLT_FILES/avatars/${it.id}" }, + rawUrl = maybeMember?.avatar?.let { "${RevoltAPI.getCurrentFilesUrl()}/avatars/${it.id}" }, size = size, modifier = Modifier .offset( diff --git a/app/src/main/java/chat/revolt/composables/screens/chat/drawer/ChannelSideDrawer.kt b/app/src/main/java/chat/revolt/composables/screens/chat/drawer/ChannelSideDrawer.kt index dabeaf3f..d2ce8bac 100644 --- a/app/src/main/java/chat/revolt/composables/screens/chat/drawer/ChannelSideDrawer.kt +++ b/app/src/main/java/chat/revolt/composables/screens/chat/drawer/ChannelSideDrawer.kt @@ -72,7 +72,6 @@ import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import chat.revolt.R -import chat.revolt.api.REVOLT_FILES import chat.revolt.api.RevoltAPI import chat.revolt.api.internals.CategorisedChannelList import chat.revolt.api.internals.ChannelUtils @@ -353,7 +352,7 @@ fun ChannelSideDrawer( serverInList.id?.let { srvId -> navigateToServer(srvId) } }) { val icon = serverInList.icon?.id?.let { iconId -> - "$REVOLT_FILES/icons/$iconId" + "${RevoltAPI.getCurrentFilesUrl()}/icons/$iconId" } if (icon != null) { RemoteImage( @@ -466,7 +465,7 @@ fun ChannelSideDrawer( ) { if (server?.banner != null) { RemoteImage( - url = "$REVOLT_FILES/banners/${server.banner.id}", + url = "${RevoltAPI.getCurrentFilesUrl()}/banners/${server.banner.id}", description = null, contentScale = ContentScale.Crop, modifier = Modifier diff --git a/app/src/main/java/chat/revolt/composables/screens/services/DiscoverView.kt b/app/src/main/java/chat/revolt/composables/screens/services/DiscoverView.kt index 056a524c..80a4df91 100644 --- a/app/src/main/java/chat/revolt/composables/screens/services/DiscoverView.kt +++ b/app/src/main/java/chat/revolt/composables/screens/services/DiscoverView.kt @@ -23,7 +23,7 @@ import androidx.compose.ui.draw.alpha import androidx.compose.ui.unit.dp import androidx.compose.ui.viewinterop.AndroidView import chat.revolt.activities.InviteActivity -import chat.revolt.api.REVOLT_APP +import chat.revolt.api.RevoltAPI import chat.revolt.api.RevoltJson import chat.revolt.api.buildUserAgent import chat.revolt.api.internals.ThemeCompat @@ -101,7 +101,7 @@ fun ColumnScope.DiscoverView() { view: WebView?, request: WebResourceRequest? ): Boolean { - if (request?.url?.host.equals(Uri.parse(REVOLT_APP).host)) { + if (request?.url?.host.equals(Uri.parse(RevoltAPI.getCurrentAppUrl()).host)) { val intent = Intent( context, InviteActivity::class.java diff --git a/app/src/main/java/chat/revolt/composables/screens/settings/ServerOverview.kt b/app/src/main/java/chat/revolt/composables/screens/settings/ServerOverview.kt index 1ca0ff57..693db19c 100644 --- a/app/src/main/java/chat/revolt/composables/screens/settings/ServerOverview.kt +++ b/app/src/main/java/chat/revolt/composables/screens/settings/ServerOverview.kt @@ -27,7 +27,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import chat.revolt.R -import chat.revolt.api.REVOLT_FILES +import chat.revolt.api.RevoltAPI import chat.revolt.api.schemas.Server import chat.revolt.api.schemas.ServerFlags import chat.revolt.api.schemas.has @@ -51,7 +51,7 @@ fun ServerOverview(server: Server) { ) RemoteImage( - url = "$REVOLT_FILES/banners/${it.id}/${it.filename}", + url = "${RevoltAPI.getCurrentFilesUrl()}/banners/${it.id}/${it.filename}", description = null, modifier = Modifier .height(166.dp) @@ -80,7 +80,7 @@ fun ServerOverview(server: Server) { ) { server.icon?.let { RemoteImage( - url = "$REVOLT_FILES/icons/${it.id}", + url = "${RevoltAPI.getCurrentFilesUrl()}/icons/${it.id}", description = null, allowAnimation = false, modifier = Modifier diff --git a/app/src/main/java/chat/revolt/composables/screens/settings/UserOverview.kt b/app/src/main/java/chat/revolt/composables/screens/settings/UserOverview.kt index ba9af129..fc91a77c 100644 --- a/app/src/main/java/chat/revolt/composables/screens/settings/UserOverview.kt +++ b/app/src/main/java/chat/revolt/composables/screens/settings/UserOverview.kt @@ -31,7 +31,6 @@ import androidx.compose.ui.text.SpanStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import chat.revolt.R -import chat.revolt.api.REVOLT_FILES import chat.revolt.api.RevoltAPI import chat.revolt.api.internals.SpecialUsers import chat.revolt.api.internals.ULID @@ -116,7 +115,7 @@ fun RawUserOverview( if (background != null) { RemoteImage( url = backgroundUrl - ?: "$REVOLT_FILES/backgrounds/${if (background is AutumnResource) background.id else null}/${if (background is AutumnResource) background.filename else background}", + ?: "${RevoltAPI.getCurrentFilesUrl()}/backgrounds/${if (background is AutumnResource) background.id else null}/${if (background is AutumnResource) background.filename else background}", description = null, modifier = Modifier .height(128.dp) diff --git a/app/src/main/java/chat/revolt/fragments/ChangelogBottomSheetFragment.kt b/app/src/main/java/chat/revolt/fragments/ChangelogBottomSheetFragment.kt index fabad61f..e3231ad5 100644 --- a/app/src/main/java/chat/revolt/fragments/ChangelogBottomSheetFragment.kt +++ b/app/src/main/java/chat/revolt/fragments/ChangelogBottomSheetFragment.kt @@ -21,7 +21,7 @@ import androidx.core.content.res.ResourcesCompat import androidx.webkit.WebViewAssetLoader import chat.revolt.R import chat.revolt.activities.InviteActivity -import chat.revolt.api.REVOLT_APP +import chat.revolt.api.RevoltAPI import chat.revolt.databinding.SheetChangelogBinding import com.google.android.material.bottomsheet.BottomSheetDialogFragment import com.google.android.material.color.MaterialColors @@ -62,7 +62,7 @@ class ChangelogBottomSheetFragment( binding.wvChangelog.apply { val assetLoader = WebViewAssetLoader.Builder() - .setDomain(Uri.parse(REVOLT_APP).host!!) + .setDomain(Uri.parse(RevoltAPI.getCurrentAppUrl()).host!!) .addPathHandler( "/_android_assets/", WebViewAssetLoader.AssetsPathHandler(context) @@ -127,7 +127,7 @@ class ChangelogBottomSheetFragment( } loadUrl( - "$REVOLT_APP/_android_assets/changelogs/renderer.html" + "${RevoltAPI.getCurrentAppUrl()}/_android_assets/changelogs/renderer.html" ) settings.apply { diff --git a/app/src/main/java/chat/revolt/internals/Changelogs.kt b/app/src/main/java/chat/revolt/internals/Changelogs.kt index 1841e0ba..c168a036 100644 --- a/app/src/main/java/chat/revolt/internals/Changelogs.kt +++ b/app/src/main/java/chat/revolt/internals/Changelogs.kt @@ -1,7 +1,7 @@ package chat.revolt.internals import android.content.Context -import chat.revolt.api.REVOLT_KJBOOK +import chat.revolt.api.RevoltAPI import chat.revolt.api.RevoltHttp import chat.revolt.api.RevoltJson import chat.revolt.internals.IndexHolder.cachedIndex @@ -55,7 +55,7 @@ class Changelogs(val context: Context, val kvStorage: KVStorage? = null) { } try { - val response = RevoltHttp.get("$REVOLT_KJBOOK/changelogs.json") + val response = RevoltHttp.get("${RevoltAPI.getCurrentKjBookUrl()}/changelogs.json") cachedIndex = RevoltJson.decodeFromString(ChangelogIndex.serializer(), response.bodyAsText()) return cachedIndex as ChangelogIndex @@ -66,7 +66,7 @@ class Changelogs(val context: Context, val kvStorage: KVStorage? = null) { suspend fun fetchChangelogByVersionCode(versionCode: Long): Changelog { try { - val response = RevoltHttp.get("$REVOLT_KJBOOK/changelogs/$versionCode.json") + val response = RevoltHttp.get("${RevoltAPI.getCurrentKjBookUrl()}/changelogs/$versionCode.json") return RevoltJson.decodeFromString(Changelog.serializer(), response.bodyAsText()) } catch (e: Error) { return Changelog( diff --git a/app/src/main/java/chat/revolt/markdown/jbm/FallbackRenderer.kt b/app/src/main/java/chat/revolt/markdown/jbm/FallbackRenderer.kt index 5d0e287a..0e58e3bd 100644 --- a/app/src/main/java/chat/revolt/markdown/jbm/FallbackRenderer.kt +++ b/app/src/main/java/chat/revolt/markdown/jbm/FallbackRenderer.kt @@ -17,8 +17,6 @@ import androidx.compose.ui.graphics.toArgb import androidx.compose.ui.viewinterop.AndroidView import androidx.webkit.WebViewAssetLoader import chat.revolt.activities.InviteActivity -import chat.revolt.api.REVOLT_APP -import chat.revolt.api.REVOLT_FILES import chat.revolt.api.RevoltAPI import chat.revolt.api.internals.ResourceLocations import chat.revolt.markdown.jbm.LocalJBMarkdownTreeState @@ -36,7 +34,7 @@ fun FallbackRenderer(content: String, modifier: Modifier = Modifier) { factory = { context -> WebView(context).apply { val assetLoader = WebViewAssetLoader.Builder() - .setDomain(Uri.parse(REVOLT_APP).host!!) + .setDomain(Uri.parse(RevoltAPI.getCurrentAppUrl()).host!!) .addPathHandler( "/_android_assets/", WebViewAssetLoader.AssetsPathHandler(context) @@ -128,7 +126,7 @@ fun FallbackRenderer(content: String, modifier: Modifier = Modifier) { @JavascriptInterface fun getCustomEmoteUrl(emoteId: String): String { - return "$REVOLT_FILES/emojis/$emoteId/original" + return "${RevoltAPI.getCurrentFilesUrl()}/emojis/$emoteId/original" } @JavascriptInterface @@ -151,7 +149,7 @@ fun FallbackRenderer(content: String, modifier: Modifier = Modifier) { setBackgroundColor(android.graphics.Color.TRANSPARENT) loadUrl( - "$REVOLT_APP/_android_assets/markdown/markdown.html" + "${RevoltAPI.getCurrentAppUrl()}/_android_assets/markdown/markdown.html" ) } } diff --git a/app/src/main/java/chat/revolt/markdown/jbm/JBMRenderer.kt b/app/src/main/java/chat/revolt/markdown/jbm/JBMRenderer.kt index ca8abc97..3155a2c4 100644 --- a/app/src/main/java/chat/revolt/markdown/jbm/JBMRenderer.kt +++ b/app/src/main/java/chat/revolt/markdown/jbm/JBMRenderer.kt @@ -73,7 +73,6 @@ import androidx.compose.ui.unit.sp import androidx.core.net.toUri import chat.revolt.R import chat.revolt.activities.InviteActivity -import chat.revolt.api.REVOLT_FILES import chat.revolt.api.RevoltAPI import chat.revolt.api.internals.BrushCompat import chat.revolt.api.internals.InstancedBrushCompat @@ -762,7 +761,7 @@ private fun JBMText(node: ASTNode, modifier: Modifier) { } else { with(LocalDensity.current) { RemoteImage( - url = "$REVOLT_FILES/emojis/${id}", + url = "${RevoltAPI.getCurrentFilesUrl()}/emojis/${id}", description = emote.name, contentScale = ContentScale.Fit, modifier = Modifier diff --git a/app/src/main/java/chat/revolt/markdown/jbm/KatexRenderer.kt b/app/src/main/java/chat/revolt/markdown/jbm/KatexRenderer.kt index 76bf46e1..fc934268 100644 --- a/app/src/main/java/chat/revolt/markdown/jbm/KatexRenderer.kt +++ b/app/src/main/java/chat/revolt/markdown/jbm/KatexRenderer.kt @@ -20,7 +20,7 @@ import androidx.compose.ui.graphics.toArgb import androidx.compose.ui.viewinterop.AndroidView import androidx.webkit.WebViewAssetLoader import chat.revolt.activities.InviteActivity -import chat.revolt.api.REVOLT_APP +import chat.revolt.api.RevoltAPI internal fun Color.asHexString(includeAlphaComponent: Boolean = true): String { val argb = toArgb() @@ -46,7 +46,7 @@ fun KatexRenderer(content: String, modifier: Modifier = Modifier) { factory = { context -> WebView(context).apply { val assetLoader = WebViewAssetLoader.Builder() - .setDomain(Uri.parse(REVOLT_APP).host!!) + .setDomain(Uri.parse(RevoltAPI.getCurrentAppUrl()).host!!) .addPathHandler( "/_android_assets/", WebViewAssetLoader.AssetsPathHandler(context) @@ -131,7 +131,7 @@ fun KatexRenderer(content: String, modifier: Modifier = Modifier) { setBackgroundColor(android.graphics.Color.TRANSPARENT) loadUrl( - "$REVOLT_APP/_android_assets/katex/katex.html" + "${RevoltAPI.getCurrentAppUrl()}/_android_assets/katex/katex.html" ) } } diff --git a/app/src/main/java/chat/revolt/screens/about/AboutScreen.kt b/app/src/main/java/chat/revolt/screens/about/AboutScreen.kt index c21c60d9..89454eb0 100644 --- a/app/src/main/java/chat/revolt/screens/about/AboutScreen.kt +++ b/app/src/main/java/chat/revolt/screens/about/AboutScreen.kt @@ -53,7 +53,7 @@ import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavController import chat.revolt.BuildConfig import chat.revolt.R -import chat.revolt.api.REVOLT_BASE +import chat.revolt.api.RevoltAPI import chat.revolt.api.RevoltJson import chat.revolt.api.routes.misc.Root import chat.revolt.api.routes.misc.getRootRoute @@ -72,7 +72,7 @@ class AboutViewModel : ViewModel() { "App ID" to BuildConfig.APPLICATION_ID, "App Version" to BuildConfig.VERSION_NAME, "App Type" to BuildConfig.FLAVOUR_ID, - "API Host" to URI(REVOLT_BASE).host, + "API Host" to URI(RevoltAPI.getCurrentBaseUrl()).host, "API Version" to (root?.revolt ?: "Unknown"), "Runtime SDK" to Build.VERSION.SDK_INT.toString(), "Model" to "${Build.MANUFACTURER} ${ diff --git a/app/src/main/java/chat/revolt/screens/chat/dialogs/InviteDialog.kt b/app/src/main/java/chat/revolt/screens/chat/dialogs/InviteDialog.kt index d2183896..a99e8598 100644 --- a/app/src/main/java/chat/revolt/screens/chat/dialogs/InviteDialog.kt +++ b/app/src/main/java/chat/revolt/screens/chat/dialogs/InviteDialog.kt @@ -42,7 +42,6 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import chat.revolt.R -import chat.revolt.api.REVOLT_INVITES import chat.revolt.api.RevoltAPI import chat.revolt.api.routes.channel.createInvite import chat.revolt.internals.Platform @@ -120,6 +119,9 @@ fun InviteDialog(channelId: String, onDismissRequest: () -> Unit) { } BoxWithConstraints { + val maxWidth = this.maxWidth + val maxHeight = this.maxHeight + Column( modifier = Modifier .clip(MaterialTheme.shapes.large) @@ -139,7 +141,7 @@ fun InviteDialog(channelId: String, onDismissRequest: () -> Unit) { Spacer(Modifier.height(16.dp)) Text( - (Uri.parse(REVOLT_INVITES).host ?: "rvlt.gg") + "/", + (Uri.parse(RevoltAPI.getCurrentInvitesUrl()).host ?: "rvlt.gg") + "/", style = MaterialTheme.typography.bodySmall, textAlign = TextAlign.Center, modifier = Modifier @@ -202,7 +204,7 @@ fun InviteDialog(channelId: String, onDismissRequest: () -> Unit) { Spacer(Modifier.width(8.dp)) Button(onClick = { clipboardManager.setText(AnnotatedString.Builder().apply { - append(REVOLT_INVITES) + append(RevoltAPI.getCurrentInvitesUrl()) append("/") append(inviteCode) }.toAnnotatedString()) diff --git a/app/src/main/java/chat/revolt/screens/chooseplatform/ChoosePlatformScreen.kt b/app/src/main/java/chat/revolt/screens/chooseplatform/ChoosePlatformScreen.kt index 833b89a5..8bd08a39 100644 --- a/app/src/main/java/chat/revolt/screens/chooseplatform/ChoosePlatformScreen.kt +++ b/app/src/main/java/chat/revolt/screens/chooseplatform/ChoosePlatformScreen.kt @@ -35,6 +35,8 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.navigation.NavController import chat.revolt.R +import chat.revolt.api.ApplicationPlatform +import chat.revolt.api.RevoltAPI @Composable fun ChoosePlatformScreen(navController: NavController) { @@ -108,7 +110,7 @@ fun ChoosePlatformScreen(navController: NavController) { .padding(bottom = 8.dp) .size(72.dp) .clickable { - apiUrlValue.value = "https://api.revolt.chat" + apiUrlValue.value = "https://peptide.chat/api" }, ) { Box( @@ -117,7 +119,7 @@ fun ChoosePlatformScreen(navController: NavController) { ) { Image( painter = painterResource(id = R.drawable.ic_launcher_foreground), - contentDescription = "Discord Logo" + contentDescription = "PEP Logo" ) } } @@ -151,7 +153,7 @@ fun ChoosePlatformScreen(navController: NavController) { ) { Image( painter = painterResource(id = R.drawable.ic_revolt_r), - contentDescription = "Discord Logo" + contentDescription = "Revolt Logo" ) } } @@ -190,7 +192,20 @@ fun ChoosePlatformScreen(navController: NavController) { .padding(vertical = 8.dp) ) Button( - onClick = { navController.navigate("login/greeting") }, + onClick = { + if(apiUrlValue.value.isNotEmpty()){ + when(apiUrlValue.value){ + ApplicationPlatform.PEP.baseUrl -> RevoltAPI.setPlatform( + ApplicationPlatform.PEP + ) + ApplicationPlatform.REVOLT.baseUrl -> RevoltAPI.setPlatform( + ApplicationPlatform.REVOLT + ) + else -> return@Button + } + } + navController.navigate("login/greeting") + }, modifier = Modifier .padding(top = 32.dp, bottom = 16.dp) .fillMaxWidth() diff --git a/app/src/main/java/chat/revolt/screens/login/LoginScreen.kt b/app/src/main/java/chat/revolt/screens/login/LoginScreen.kt index 8d2ff063..1d7aedc9 100644 --- a/app/src/main/java/chat/revolt/screens/login/LoginScreen.kt +++ b/app/src/main/java/chat/revolt/screens/login/LoginScreen.kt @@ -53,7 +53,6 @@ import androidx.lifecycle.viewModelScope import androidx.navigation.NavController import chat.revolt.R import chat.revolt.RevoltApplication -import chat.revolt.api.REVOLT_APP import chat.revolt.api.RevoltAPI import chat.revolt.api.routes.account.EmailPasswordAssessment import chat.revolt.api.routes.account.negotiateAuthentication @@ -333,7 +332,7 @@ fun LoginScreen(navController: NavController, viewModel: LoginViewModel = hiltVi ) Weblink( text = stringResource(R.string.password_forgot), - url = "$REVOLT_APP/login/reset", + url = "${RevoltAPI.getCurrentAppUrl()}/login/reset", modifier = Modifier.padding(vertical = 12.dp) ) Spacer(modifier = Modifier.height(32.dp)) diff --git a/app/src/main/java/chat/revolt/screens/login2/InitScreen.kt b/app/src/main/java/chat/revolt/screens/login2/InitScreen.kt index 99f3fd94..7090add8 100644 --- a/app/src/main/java/chat/revolt/screens/login2/InitScreen.kt +++ b/app/src/main/java/chat/revolt/screens/login2/InitScreen.kt @@ -1,5 +1,7 @@ package chat.revolt.screens.login2 +import android.content.Intent +import android.net.Uri import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box @@ -33,7 +35,7 @@ import androidx.compose.ui.unit.sp import androidx.navigation.NavController import chat.revolt.BuildConfig import chat.revolt.R -import chat.revolt.api.REVOLT_MARKETING +import chat.revolt.api.RevoltAPI import chat.revolt.api.settings.LoadedSettings import chat.revolt.composables.generic.AnyLink import chat.revolt.composables.generic.Weblink @@ -156,15 +158,15 @@ private fun LinkPart(windowSizeClass: WindowSizeClass) { Weblink( text = stringResource(R.string.terms_of_service), - url = "$REVOLT_MARKETING/terms" + url = "${RevoltAPI.getCurrentMarketingUrl()}/terms" ) Weblink( text = stringResource(R.string.privacy_policy), - url = "$REVOLT_MARKETING/privacy" + url = "${RevoltAPI.getCurrentMarketingUrl()}/privacy" ) Weblink( text = stringResource(R.string.community_guidelines), - url = "$REVOLT_MARKETING/aup" + url = "${RevoltAPI.getCurrentMarketingUrl()}/aup" ) if (BuildConfig.DEBUG) { diff --git a/app/src/main/java/chat/revolt/screens/register/OnboardingScreen.kt b/app/src/main/java/chat/revolt/screens/register/OnboardingScreen.kt index 3e47e96a..719454b8 100644 --- a/app/src/main/java/chat/revolt/screens/register/OnboardingScreen.kt +++ b/app/src/main/java/chat/revolt/screens/register/OnboardingScreen.kt @@ -8,13 +8,11 @@ import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.imeNestedScroll +import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.safeDrawingPadding import androidx.compose.foundation.layout.size -import androidx.compose.foundation.layout.sizeIn import androidx.compose.material3.Button -import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -28,15 +26,14 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import androidx.compose.ui.tooling.preview.Preview import androidx.navigation.NavController import androidx.navigation.compose.rememberNavController import chat.revolt.R import chat.revolt.api.routes.onboard.OnboardingCompletionBody import chat.revolt.api.routes.onboard.completeOnboarding -import chat.revolt.composables.generic.DefaultButtonStyle import chat.revolt.composables.generic.FormTextField import chat.revolt.persistence.KVStorage import kotlinx.coroutines.launch diff --git a/app/src/main/java/chat/revolt/screens/settings/ProfileSettngsScreen.kt b/app/src/main/java/chat/revolt/screens/settings/ProfileSettngsScreen.kt index d5cf2815..55e2d90e 100644 --- a/app/src/main/java/chat/revolt/screens/settings/ProfileSettngsScreen.kt +++ b/app/src/main/java/chat/revolt/screens/settings/ProfileSettngsScreen.kt @@ -18,8 +18,6 @@ import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Check import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon @@ -79,12 +77,12 @@ class ProfileSettingsScreenViewModel @Inject constructor(@ApplicationContext val init { RevoltAPI.selfId?.let { self -> RevoltAPI.userCache[self]?.avatar?.id?.let { - pfpModel = "https://autumn.revolt.chat/avatars/${it}" + pfpModel = "${RevoltAPI.getCurrentAutumnUrl()}/avatars/${it}" } viewModelScope.launch { currentProfile = fetchUserProfile(self) currentProfile!!.background?.id?.let { - backgroundModel = "https://autumn.revolt.chat/backgrounds/${it}" + backgroundModel = "${RevoltAPI.getCurrentAutumnUrl()}/backgrounds/${it}" } pendingProfile = currentProfile!!.copy() @@ -139,7 +137,7 @@ class ProfileSettingsScreenViewModel @Inject constructor(@ApplicationContext val } pfpModel = RevoltAPI.userCache[RevoltAPI.selfId]?.avatar?.id?.let { - "https://autumn.revolt.chat/avatars/${it}" + "${RevoltAPI.getCurrentAutumnUrl()}/avatars/${it}" } uploadProgress = 0f @@ -194,8 +192,8 @@ class ProfileSettingsScreenViewModel @Inject constructor(@ApplicationContext val currentProfile = profile pendingProfile = profile - profile.background?.id?.let { - "https://autumn.revolt.chat/backgrounds/${it}" + profile.background?.id?.let { id -> + "${RevoltAPI.getCurrentAutumnUrl()}/backgrounds/${id}" } } diff --git a/app/src/main/java/chat/revolt/screens/settings/SettingsScreen.kt b/app/src/main/java/chat/revolt/screens/settings/SettingsScreen.kt index 877eefa5..5e8e51c9 100644 --- a/app/src/main/java/chat/revolt/screens/settings/SettingsScreen.kt +++ b/app/src/main/java/chat/revolt/screens/settings/SettingsScreen.kt @@ -8,11 +8,8 @@ import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.automirrored.filled.ArrowBack import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton import androidx.compose.material3.LargeTopAppBar import androidx.compose.material3.ListItem import androidx.compose.material3.LocalContentColor @@ -380,10 +377,11 @@ fun SettingsScreen( } }, modifier = Modifier + .padding(bottom =92.dp) .testTag("settings_view_logout") .clickable { viewModel.logout() - navController.navigate("login/greeting") { + navController.navigate("choose-platform") { popUpTo("chat") { inclusive = true } diff --git a/app/src/main/java/chat/revolt/screens/settings/channel/ChannelSettingsOverview.kt b/app/src/main/java/chat/revolt/screens/settings/channel/ChannelSettingsOverview.kt index ae583738..4b643868 100644 --- a/app/src/main/java/chat/revolt/screens/settings/channel/ChannelSettingsOverview.kt +++ b/app/src/main/java/chat/revolt/screens/settings/channel/ChannelSettingsOverview.kt @@ -2,6 +2,7 @@ package chat.revolt.screens.settings.channel import android.content.Context import android.net.Uri +import android.util.Log import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.animateContentSize import androidx.compose.animation.scaleIn @@ -44,6 +45,7 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.input.nestedscroll.nestedScroll +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight @@ -56,7 +58,6 @@ import androidx.lifecycle.viewModelScope import androidx.navigation.NavController import chat.revolt.R import chat.revolt.activities.RevoltTweenFloat -import chat.revolt.api.REVOLT_FILES import chat.revolt.api.RevoltAPI import chat.revolt.api.routes.channel.patchChannel import chat.revolt.api.routes.microservices.autumn.uploadToAutumn @@ -93,7 +94,7 @@ class ChannelSettingsOverviewViewModel @Inject constructor(@ApplicationContext v channel?.let { channelName = it.name ?: "" channelDescription = it.description ?: "" - iconModel = it.icon?.let { icon -> "$REVOLT_FILES/icons/${icon.id}" } + iconModel = it.icon?.let { icon -> "${RevoltAPI.getCurrentFilesUrl()}/icons/${icon.id}" } } } diff --git a/app/src/main/java/chat/revolt/sheets/AddServerSheet.kt b/app/src/main/java/chat/revolt/sheets/AddServerSheet.kt index f207933c..a879b031 100644 --- a/app/src/main/java/chat/revolt/sheets/AddServerSheet.kt +++ b/app/src/main/java/chat/revolt/sheets/AddServerSheet.kt @@ -54,7 +54,7 @@ import androidx.compose.ui.unit.dp import androidx.core.net.toUri import chat.revolt.R import chat.revolt.activities.InviteActivity -import chat.revolt.api.REVOLT_APP +import chat.revolt.api.RevoltAPI import chat.revolt.api.routes.server.createServer import chat.revolt.callbacks.Action import chat.revolt.callbacks.ActionChannel @@ -122,368 +122,368 @@ fun AddServerSheet(onDismiss: () -> Unit) { Box( modifier = Modifier.padding(16.dp) ) { - if (step == AddServerSheetStep.Initial) { - Column( - verticalArrangement = Arrangement.spacedBy(16.dp), - horizontalAlignment = Alignment.CenterHorizontally, - ) { - Image( - imageVector = NewServer, - contentDescription = null, - modifier = Modifier - .fillMaxWidth(0.5f) - ) - - Text( - text = stringResource(id = R.string.add_server_sheet_step_0_title), - style = MaterialTheme.typography.titleLarge, - textAlign = TextAlign.Center, - modifier = Modifier.fillMaxWidth() - ) - - Text( - text = stringResource(id = R.string.add_server_sheet_step_0_description), - style = MaterialTheme.typography.bodyMedium, - color = LocalContentColor.current.copy(alpha = 0.7f), - textAlign = TextAlign.Center, - modifier = Modifier.fillMaxWidth() - ) - - SheetSelection( - icon = { - Image( - imageVector = JoinServer, - contentDescription = null, - modifier = Modifier - .size(48.dp) - ) - }, - title = { - Text( - text = stringResource(id = R.string.add_server_sheet_step_0_join) - ) - }, - description = { - Text( - text = stringResource(id = R.string.add_server_sheet_step_0_join_description) - ) - }, - ) { - currentStep = AddServerSheetStep.JoinFromInvite - } - - SheetSelection( - icon = { - Image( - imageVector = CreateServer, - contentDescription = null, - modifier = Modifier - .size(48.dp) - ) - }, - title = { - Text( - text = stringResource(id = R.string.add_server_sheet_step_0_create) - ) - }, - description = { - Text( - text = stringResource(id = R.string.add_server_sheet_step_0_create_description) - ) - }, - ) { - currentStep = AddServerSheetStep.CreateServer - } - } - } else if (step == AddServerSheetStep.JoinFromInvite) { - val inviteState = rememberTextFieldState() - - Column( - verticalArrangement = Arrangement.spacedBy(16.dp), - horizontalAlignment = Alignment.CenterHorizontally, - ) { - Box( - contentAlignment = Alignment.CenterStart, - modifier = Modifier.fillMaxWidth() - ) { - Text( - text = stringResource(id = R.string.add_server_sheet_step_1j_title), - style = MaterialTheme.typography.titleMedium, - textAlign = TextAlign.Center, - modifier = Modifier.fillMaxWidth() - ) - IconButton( - onClick = { - currentStep = AddServerSheetStep.Initial - } - ) { - Icon( - painter = painterResource(R.drawable.icn_arrow_back_24dp), - contentDescription = stringResource(id = R.string.back), - ) - } - } - - Text( - text = stringResource(id = R.string.add_server_sheet_step_1j_description), - style = MaterialTheme.typography.bodyMedium, - color = LocalContentColor.current.copy(alpha = 0.7f), - textAlign = TextAlign.Center, - modifier = Modifier.fillMaxWidth() - ) - - - Text( - text = stringResource(id = R.string.add_server_sheet_step_1j_examples_heading), - style = MaterialTheme.typography.bodyMedium, - color = MaterialTheme.colorScheme.outline, - textAlign = TextAlign.Center, - modifier = Modifier.fillMaxWidth() - ) - - Column( - verticalArrangement = Arrangement.spacedBy(4.dp), - horizontalAlignment = Alignment.CenterHorizontally - ) { - Text( - text = stringResource(id = R.string.add_server_sheet_step_1j_example_1), - style = MaterialTheme.typography.bodyMedium, - textAlign = TextAlign.Center, - fontFamily = FragmentMono, - modifier = Modifier - .clip( - MaterialTheme.shapes.small.copy( - topStart = MaterialTheme.shapes.large.topStart, - topEnd = MaterialTheme.shapes.large.topEnd, - ) - ) - .background(MaterialTheme.colorScheme.surfaceContainerHighest) - .padding(16.dp) - .fillMaxWidth() - ) - Text( - text = stringResource(id = R.string.add_server_sheet_step_1j_example_2), - style = MaterialTheme.typography.bodyMedium, - textAlign = TextAlign.Center, - fontFamily = FragmentMono, - modifier = Modifier - .clip( - MaterialTheme.shapes.small - ) - .background(MaterialTheme.colorScheme.surfaceContainerHighest) - .padding(16.dp) - .fillMaxWidth() - ) - Text( - text = stringResource(id = R.string.add_server_sheet_step_1j_example_3), - style = MaterialTheme.typography.bodyMedium, - textAlign = TextAlign.Center, - fontFamily = FragmentMono, - modifier = Modifier - .clip( - MaterialTheme.shapes.small.copy( - bottomStart = MaterialTheme.shapes.large.bottomStart, - bottomEnd = MaterialTheme.shapes.large.bottomEnd, - ) - ) - .background(MaterialTheme.colorScheme.surfaceContainerHighest) - .padding(16.dp) - .fillMaxWidth() - ) - } - - Spacer(modifier = Modifier.height(8.dp)) - - TextField( - state = inviteState, - label = { - Text(stringResource(R.string.add_server_sheet_step_1j_label)) - }, - lineLimits = TextFieldLineLimits.SingleLine, - modifier = Modifier - .fillMaxWidth() - .padding(vertical = 16.dp, horizontal = 8.dp) - ) - - Button( - onClick = { - val intent = Intent(context, InviteActivity::class.java) - intent.data = if (inviteState.text.startsWith("https://")) { - try { - inviteState.text.toString().toUri() - } catch (e: Exception) { - Log.e( - "AddServerSheet", - "Invalid URL: ${inviteState.text}", - e - ) - return@Button - } - } else { - "https://$REVOLT_APP/invite/${inviteState.text}".toUri() - } - context.startActivity(intent) - - onDismiss() - }, - modifier = Modifier - .fillMaxWidth() - ) { - Text( - text = stringResource(id = R.string.add_server_sheet_step_1j_join) - ) - } - } - } else if (step == AddServerSheetStep.CreateServer) { - val serverNameState = rememberTextFieldState() - val serverNameIsBlank = remember(serverNameState.text) { - serverNameState.text.isBlank() - } - - var serverNameRangeError by remember { mutableStateOf(false) } - var serverCreationError by remember { mutableStateOf(false) } - - LaunchedEffect(serverNameState.text) { - if (serverNameState.text.length > 32) { - serverNameRangeError = true - } else { - serverNameRangeError = false - } - } - - Column( - verticalArrangement = Arrangement.spacedBy(16.dp), - horizontalAlignment = Alignment.CenterHorizontally, - ) { - Box( - contentAlignment = Alignment.CenterStart, - modifier = Modifier.fillMaxWidth() - ) { - Text( - text = stringResource(id = R.string.add_server_sheet_step_1c_title), - style = MaterialTheme.typography.titleMedium, - textAlign = TextAlign.Center, - modifier = Modifier.fillMaxWidth() - ) - IconButton( - onClick = { - currentStep = AddServerSheetStep.Initial - } - ) { - Icon( - painter = painterResource(R.drawable.icn_arrow_back_24dp), - contentDescription = stringResource(id = R.string.back), - ) - } - } - - Text( - text = stringResource(id = R.string.add_server_sheet_step_1c_description), - style = MaterialTheme.typography.bodyMedium, - color = LocalContentColor.current.copy(alpha = 0.7f), - textAlign = TextAlign.Center, - modifier = Modifier.fillMaxWidth() - ) - - val outline = MaterialTheme.colorScheme.outline + when (step) { + AddServerSheetStep.Initial -> { Column( verticalArrangement = Arrangement.spacedBy(16.dp), - horizontalAlignment = Alignment.CenterHorizontally + horizontalAlignment = Alignment.CenterHorizontally, ) { - Canvas(Modifier.size(80.dp)) { - val stroke = Stroke( - width = 4.dp.toPx(), - pathEffect = PathEffect.dashPathEffect( - floatArrayOf(30f, 40f), - 0f - ) - ) + Image( + imageVector = NewServer, + contentDescription = null, + modifier = Modifier + .fillMaxWidth(0.5f) + ) - drawCircle( - color = outline, - style = stroke, - radius = size.minDimension / 2 - stroke.width / 2 - ) - } Text( - text = when { - serverNameIsBlank -> stringResource(R.string.add_server_sheet_step_1c_name_placeholder) - else -> serverNameState.text.toString() - }, - style = MaterialTheme.typography.bodyLarge, - color = LocalContentColor.current.copy( - alpha = when { - serverNameIsBlank -> 0.5f - else -> 1f - } - ), - fontWeight = when { - serverNameIsBlank -> FontWeight.Medium - else -> FontWeight.Bold - }, + text = stringResource(id = R.string.add_server_sheet_step_0_title), + style = MaterialTheme.typography.titleLarge, textAlign = TextAlign.Center, - maxLines = 1, - overflow = TextOverflow.Ellipsis, modifier = Modifier.fillMaxWidth() ) + + Text( + text = stringResource(id = R.string.add_server_sheet_step_0_description), + style = MaterialTheme.typography.bodyMedium, + color = LocalContentColor.current.copy(alpha = 0.7f), + textAlign = TextAlign.Center, + modifier = Modifier.fillMaxWidth() + ) + + SheetSelection( + icon = { + Image( + imageVector = JoinServer, + contentDescription = null, + modifier = Modifier + .size(48.dp) + ) + }, + title = { + Text( + text = stringResource(id = R.string.add_server_sheet_step_0_join) + ) + }, + description = { + Text( + text = stringResource(id = R.string.add_server_sheet_step_0_join_description) + ) + }, + ) { + currentStep = AddServerSheetStep.JoinFromInvite + } + + SheetSelection( + icon = { + Image( + imageVector = CreateServer, + contentDescription = null, + modifier = Modifier + .size(48.dp) + ) + }, + title = { + Text( + text = stringResource(id = R.string.add_server_sheet_step_0_create) + ) + }, + description = { + Text( + text = stringResource(id = R.string.add_server_sheet_step_0_create_description) + ) + }, + ) { + currentStep = AddServerSheetStep.CreateServer + } + } + } + AddServerSheetStep.JoinFromInvite -> { + val inviteState = rememberTextFieldState() + + Column( + verticalArrangement = Arrangement.spacedBy(16.dp), + horizontalAlignment = Alignment.CenterHorizontally, + ) { + Box( + contentAlignment = Alignment.CenterStart, + modifier = Modifier.fillMaxWidth() + ) { + Text( + text = stringResource(id = R.string.add_server_sheet_step_1j_title), + style = MaterialTheme.typography.titleMedium, + textAlign = TextAlign.Center, + modifier = Modifier.fillMaxWidth() + ) + IconButton( + onClick = { + currentStep = AddServerSheetStep.Initial + } + ) { + Icon( + painter = painterResource(R.drawable.icn_arrow_back_24dp), + contentDescription = stringResource(id = R.string.back), + ) + } + } + + Text( + text = stringResource(id = R.string.add_server_sheet_step_1j_description), + style = MaterialTheme.typography.bodyMedium, + color = LocalContentColor.current.copy(alpha = 0.7f), + textAlign = TextAlign.Center, + modifier = Modifier.fillMaxWidth() + ) + + + Text( + text = stringResource(id = R.string.add_server_sheet_step_1j_examples_heading), + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.outline, + textAlign = TextAlign.Center, + modifier = Modifier.fillMaxWidth() + ) + + Column( + verticalArrangement = Arrangement.spacedBy(4.dp), + horizontalAlignment = Alignment.CenterHorizontally + ) { + Text( + text = stringResource(id = R.string.add_server_sheet_step_1j_example_1), + style = MaterialTheme.typography.bodyMedium, + textAlign = TextAlign.Center, + fontFamily = FragmentMono, + modifier = Modifier + .clip( + MaterialTheme.shapes.small.copy( + topStart = MaterialTheme.shapes.large.topStart, + topEnd = MaterialTheme.shapes.large.topEnd, + ) + ) + .background(MaterialTheme.colorScheme.surfaceContainerHighest) + .padding(16.dp) + .fillMaxWidth() + ) + Text( + text = stringResource(id = R.string.add_server_sheet_step_1j_example_2), + style = MaterialTheme.typography.bodyMedium, + textAlign = TextAlign.Center, + fontFamily = FragmentMono, + modifier = Modifier + .clip( + MaterialTheme.shapes.small + ) + .background(MaterialTheme.colorScheme.surfaceContainerHighest) + .padding(16.dp) + .fillMaxWidth() + ) + Text( + text = stringResource(id = R.string.add_server_sheet_step_1j_example_3), + style = MaterialTheme.typography.bodyMedium, + textAlign = TextAlign.Center, + fontFamily = FragmentMono, + modifier = Modifier + .clip( + MaterialTheme.shapes.small.copy( + bottomStart = MaterialTheme.shapes.large.bottomStart, + bottomEnd = MaterialTheme.shapes.large.bottomEnd, + ) + ) + .background(MaterialTheme.colorScheme.surfaceContainerHighest) + .padding(16.dp) + .fillMaxWidth() + ) + } + + Spacer(modifier = Modifier.height(8.dp)) + + TextField( + state = inviteState, + label = { + Text(stringResource(R.string.add_server_sheet_step_1j_label)) + }, + lineLimits = TextFieldLineLimits.SingleLine, + modifier = Modifier + .fillMaxWidth() + .padding(vertical = 16.dp, horizontal = 8.dp) + ) + + Button( + onClick = { + val intent = Intent(context, InviteActivity::class.java) + intent.data = if (inviteState.text.startsWith("https://")) { + try { + inviteState.text.toString().toUri() + } catch (e: Exception) { + Log.e( + "AddServerSheet", + "Invalid URL: ${inviteState.text}", + e + ) + return@Button + } + } else { + "https://${RevoltAPI.getCurrentAppUrl()}/invite/${inviteState.text}".toUri() + } + context.startActivity(intent) + + onDismiss() + }, + modifier = Modifier + .fillMaxWidth() + ) { + Text( + text = stringResource(id = R.string.add_server_sheet_step_1j_join) + ) + } + } + } + AddServerSheetStep.CreateServer -> { + val serverNameState = rememberTextFieldState() + val serverNameIsBlank = remember(serverNameState.text) { + serverNameState.text.isBlank() } - TextField( - state = serverNameState, - label = { - Text(stringResource(R.string.add_server_sheet_step_1c_name)) - }, - lineLimits = TextFieldLineLimits.SingleLine, - supportingText = { - Text( - when { - serverCreationError -> stringResource(R.string.add_server_sheet_step_1c_error) - serverNameRangeError -> stringResource( - R.string.add_server_sheet_step_1c_name_error_range, - 32 - ) + var serverNameRangeError by remember { mutableStateOf(false) } + var serverCreationError by remember { mutableStateOf(false) } - else -> "" - } - ) - }, - isError = serverNameRangeError || serverCreationError, - modifier = Modifier - .fillMaxWidth() - .padding(vertical = 16.dp, horizontal = 8.dp) - ) + LaunchedEffect(serverNameState.text) { + serverNameRangeError = serverNameState.text.length > 32 + } - Button( - onClick = { - serverCreationError = false - - scope.launch { - try { - val server = createServer(serverNameState.text.toString()) - - // Backend should've already created a channel for us to go to - server.channels?.first()?.id?.let { - ActionChannel.send( - Action.ChatNavigate( - ChatRouterDestination.Channel(it) - ) - ) - } - - onDismiss() - } catch (e: Exception) { - serverCreationError = true - logcat { "Error creating server: ${e.asLog()}" } - } - } - }, - enabled = !serverNameIsBlank && !serverNameRangeError, - modifier = Modifier - .fillMaxWidth() + Column( + verticalArrangement = Arrangement.spacedBy(16.dp), + horizontalAlignment = Alignment.CenterHorizontally, ) { + Box( + contentAlignment = Alignment.CenterStart, + modifier = Modifier.fillMaxWidth() + ) { + Text( + text = stringResource(id = R.string.add_server_sheet_step_1c_title), + style = MaterialTheme.typography.titleMedium, + textAlign = TextAlign.Center, + modifier = Modifier.fillMaxWidth() + ) + IconButton( + onClick = { + currentStep = AddServerSheetStep.Initial + } + ) { + Icon( + painter = painterResource(R.drawable.icn_arrow_back_24dp), + contentDescription = stringResource(id = R.string.back), + ) + } + } + Text( - text = stringResource(id = R.string.add_server_sheet_step_1c_create) + text = stringResource(id = R.string.add_server_sheet_step_1c_description), + style = MaterialTheme.typography.bodyMedium, + color = LocalContentColor.current.copy(alpha = 0.7f), + textAlign = TextAlign.Center, + modifier = Modifier.fillMaxWidth() ) + + val outline = MaterialTheme.colorScheme.outline + Column( + verticalArrangement = Arrangement.spacedBy(16.dp), + horizontalAlignment = Alignment.CenterHorizontally + ) { + Canvas(Modifier.size(80.dp)) { + val stroke = Stroke( + width = 4.dp.toPx(), + pathEffect = PathEffect.dashPathEffect( + floatArrayOf(30f, 40f), + 0f + ) + ) + + drawCircle( + color = outline, + style = stroke, + radius = size.minDimension / 2 - stroke.width / 2 + ) + } + Text( + text = when { + serverNameIsBlank -> stringResource(R.string.add_server_sheet_step_1c_name_placeholder) + else -> serverNameState.text.toString() + }, + style = MaterialTheme.typography.bodyLarge, + color = LocalContentColor.current.copy( + alpha = when { + serverNameIsBlank -> 0.5f + else -> 1f + } + ), + fontWeight = when { + serverNameIsBlank -> FontWeight.Medium + else -> FontWeight.Bold + }, + textAlign = TextAlign.Center, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + modifier = Modifier.fillMaxWidth() + ) + } + + TextField( + state = serverNameState, + label = { + Text(stringResource(R.string.add_server_sheet_step_1c_name)) + }, + lineLimits = TextFieldLineLimits.SingleLine, + supportingText = { + Text( + when { + serverCreationError -> stringResource(R.string.add_server_sheet_step_1c_error) + serverNameRangeError -> stringResource( + R.string.add_server_sheet_step_1c_name_error_range, + 32 + ) + + else -> "" + } + ) + }, + isError = serverNameRangeError || serverCreationError, + modifier = Modifier + .fillMaxWidth() + .padding(vertical = 16.dp, horizontal = 8.dp) + ) + + Button( + onClick = { + serverCreationError = false + + scope.launch { + try { + val server = createServer(serverNameState.text.toString()) + + // Backend should've already created a channel for us to go to + server.channels?.first()?.id?.let { + ActionChannel.send( + Action.ChatNavigate( + ChatRouterDestination.Channel(it) + ) + ) + } + + onDismiss() + } catch (e: Exception) { + serverCreationError = true + logcat { "Error creating server: ${e.asLog()}" } + } + } + }, + enabled = !serverNameIsBlank && !serverNameRangeError, + modifier = Modifier + .fillMaxWidth() + ) { + Text( + text = stringResource(id = R.string.add_server_sheet_step_1c_create) + ) + } } } } diff --git a/app/src/main/java/chat/revolt/sheets/EmoteInfoSheet.kt b/app/src/main/java/chat/revolt/sheets/EmoteInfoSheet.kt index 80c36386..bb70f794 100644 --- a/app/src/main/java/chat/revolt/sheets/EmoteInfoSheet.kt +++ b/app/src/main/java/chat/revolt/sheets/EmoteInfoSheet.kt @@ -31,7 +31,6 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import chat.revolt.R -import chat.revolt.api.REVOLT_FILES import chat.revolt.api.RevoltAPI import chat.revolt.api.routes.custom.fetchEmoji import chat.revolt.api.schemas.Emoji @@ -65,7 +64,7 @@ fun EmoteInfoSheet(id: String, onDismiss: () -> Unit) { verticalAlignment = Alignment.CenterVertically ) { RemoteImage( - url = "$REVOLT_FILES/emojis/$id", + url = "${RevoltAPI.getCurrentFilesUrl()}/emojis/$id", description = emoteInfo?.name, contentScale = ContentScale.Fit, modifier = Modifier diff --git a/app/src/main/java/chat/revolt/sheets/MessageContextSheet.kt b/app/src/main/java/chat/revolt/sheets/MessageContextSheet.kt index 89608dbc..3e103127 100644 --- a/app/src/main/java/chat/revolt/sheets/MessageContextSheet.kt +++ b/app/src/main/java/chat/revolt/sheets/MessageContextSheet.kt @@ -35,7 +35,6 @@ import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.unit.dp import chat.revolt.BuildConfig import chat.revolt.R -import chat.revolt.api.REVOLT_APP import chat.revolt.api.RevoltAPI import chat.revolt.api.internals.PermissionBit import chat.revolt.api.internals.Roles @@ -176,7 +175,7 @@ fun MessageContextSheet( server.channels?.contains(message.channel) ?: false } val messageLink = - "$REVOLT_APP/server/${server?.id}/channel/${message.channel}/${message.id}" + "${RevoltAPI.getCurrentAppUrl()}/server/${server?.id}/channel/${message.channel}/${message.id}" clipboardManager.setText(AnnotatedString(messageLink)) if (Platform.needsShowClipboardNotification()) { diff --git a/app/src/main/java/chat/revolt/sheets/ReactionInfoSheet.kt b/app/src/main/java/chat/revolt/sheets/ReactionInfoSheet.kt index f5c4d7a3..f71d4fdb 100644 --- a/app/src/main/java/chat/revolt/sheets/ReactionInfoSheet.kt +++ b/app/src/main/java/chat/revolt/sheets/ReactionInfoSheet.kt @@ -44,7 +44,6 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import chat.revolt.R -import chat.revolt.api.REVOLT_FILES import chat.revolt.api.RevoltAPI import chat.revolt.api.internals.isUlid import chat.revolt.api.routes.custom.fetchEmoji @@ -119,7 +118,7 @@ fun ReactionInfoSheet(messageId: String, emoji: String, onDismiss: () -> Unit) { if (emoji.isUlid()) { Row(verticalAlignment = Alignment.CenterVertically) { RemoteImage( - url = "$REVOLT_FILES/emojis/${emoji}", + url = "${RevoltAPI.getCurrentFilesUrl()}/emojis/${emoji}", description = null, modifier = Modifier.size(16.dp) ) @@ -229,7 +228,7 @@ fun ReactionInfoSheet(messageId: String, emoji: String, onDismiss: () -> Unit) { if (current.isUlid()) { val cached = extendedEmojiInfo.find { it.id == current } RemoteImage( - url = "$REVOLT_FILES/emojis/$current", + url = "${RevoltAPI.getCurrentFilesUrl()}/emojis/$current", description = cached?.name, contentScale = ContentScale.Fit, modifier = Modifier diff --git a/app/src/main/java/chat/revolt/sheets/ServerContextSheet.kt b/app/src/main/java/chat/revolt/sheets/ServerContextSheet.kt index 62625b70..98403d24 100644 --- a/app/src/main/java/chat/revolt/sheets/ServerContextSheet.kt +++ b/app/src/main/java/chat/revolt/sheets/ServerContextSheet.kt @@ -41,7 +41,6 @@ import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.unit.dp import androidx.core.net.toUri import chat.revolt.R -import chat.revolt.api.REVOLT_APP import chat.revolt.api.RevoltAPI import chat.revolt.api.routes.server.leaveOrDeleteServer import chat.revolt.composables.generic.SheetButton @@ -194,7 +193,7 @@ fun ServerContextSheet( context.startActivity( Intent( Intent.ACTION_VIEW, - "$REVOLT_APP/server/${server.id}/settings".toUri() + "${RevoltAPI.getCurrentAppUrl()}/server/${server.id}/settings".toUri() ) ) }