diff --git a/.github/workflows/triage_issue.yml b/.github/workflows/triage_issue.yml index ecc69f59..6784f429 100644 --- a/.github/workflows/triage_issue.yml +++ b/.github/workflows/triage_issue.yml @@ -14,7 +14,7 @@ jobs: run: | gh api graphql -f query=' query { - organization(login: "revoltchat"){ + organization(login: "peptidechat"){ projectV2(number: 3) { id fields(first:20) { diff --git a/.github/workflows/triage_pr.yml b/.github/workflows/triage_pr.yml index 3010d2e5..f8e94087 100644 --- a/.github/workflows/triage_pr.yml +++ b/.github/workflows/triage_pr.yml @@ -14,7 +14,7 @@ jobs: run: | gh api graphql -f query=' query { - organization(login: "revoltchat"){ + organization(login: "peptidechat"){ projectV2(number: 5) { id fields(first:20) { diff --git a/.gitignore b/.gitignore index 9b8fcf2f..96043124 100644 --- a/.gitignore +++ b/.gitignore @@ -15,8 +15,7 @@ .externalNativeBuild .cxx local.properties -revoltbuild.properties -sentry.properties +peptidebuild.properties /.kotlin/sessions app/src/main/assets/embedded pep-api-postman.json diff --git a/.idea/.name b/.idea/.name index 9ef16e6b..5b7ffa9e 100644 --- a/.idea/.name +++ b/.idea/.name @@ -1 +1 @@ -PEP \ No newline at end of file +PepChat \ No newline at end of file diff --git a/README.md b/README.md index 7dd0e77a..b588b09a 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,14 @@ -# Revolt on Android +# Peptide on Android ## Description -This is the official Android app for the [Revolt](https://revolt.chat) chat platform. -The codebase includes the app itself, as well as an internal library for interacting with the Revolt +This is the official Android app for the [Peptide](https://peptide.chat) chat platform. +The codebase includes the app itself, as well as an internal library for interacting with the Peptide API. | Module | Package | Description | |--------|---------------|----------------------| -| `:app` | `chat.revolt` | The main app module. | +| `:app` | `chat.peptide` | The main app module. | The API library is part of the `app` module, and is not intended to be used as a standalone library, as it makes liberal use of Android-specific APIs for reactivity. @@ -29,18 +29,18 @@ of the art for Android UI development. ## Resources -### Revolt on Android +### Peptide on Android -- [Revolt on Android Technical Documentation](https://revoltchat.github.io/android/) -- [Android-specific Contribution Guide](https://revoltchat.github.io/android/contributing/guidelines/) +- [Peptide on Android Technical Documentation](https://peptidechat.github.io/android/) +- [Android-specific Contribution Guide](https://peptidechat.github.io/android/contributing/guidelines/) —**read carefully before contributing!** -### Revolt +### Peptide -- [Revolt Project Board](https://github.com/revoltchat/revolt/discussions) (Submit feature requests +- [Peptide Project Board](https://github.com/peptidechat/peptide/discussions) (Submit feature requests here) -- [Revolt Testers Server](https://app.revolt.chat/invite/Testers) -- [General Revolt Contribution Guide](https://developers.revolt.chat/contributing) +- [Peptide Testers Server](https://app.peptide.chat/invite/Testers) +- [General Peptide Contribution Guide](https://developers.peptide.chat/contributing) ## Quick Start @@ -48,4 +48,4 @@ Open the project in Android Studio. You can then run the app on an emulator or a running the `app` module. In-depth setup instructions can be found -at [Setting up your Development Environment](https://revoltchat.github.io/android/contributing/setup/) \ No newline at end of file +at [Setting up your Development Environment](https://peptidechat.github.io/android/contributing/setup/) \ No newline at end of file diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 3cd01369..d8a6e111 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,5 +1,4 @@ import com.mikepenz.aboutlibraries.plugin.StrictMode -import io.sentry.android.gradle.instrumentation.logcat.LogcatLevel import java.io.FileInputStream import java.util.Properties @@ -12,7 +11,6 @@ plugins { id("com.google.dagger.hilt.android") id("com.google.devtools.ksp") id("org.jmailen.kotlinter") - id("io.sentry.android.gradle") version "4.12.0" id("app.cash.sqldelight") version "2.0.1" id("kotlin-kapt") id("kotlin-parcelize") @@ -21,7 +19,6 @@ plugins { val composeBomVersion = "2025.03.00" val accompanistVersion = "0.34.0" -val okhttpVersion = "4.12.0" val navVersion = "2.9.0" val hiltVersion = "2.52" val glideVersion = "4.16.0" @@ -30,11 +27,6 @@ val media3Version = "1.7.1" val material3Version = "1.4.0-alpha15" val androidXTestVersion = "1.6.1" -object LivekitVersion { - val core = "2.16.0" - val componentsCompose = "1.3.1" -} - fun property(fileName: String, propertyName: String, fallbackEnv: String? = null): String? { val propsFile = rootProject.file(fileName) if (propsFile.exists()) { @@ -68,16 +60,16 @@ fun property(fileName: String, propertyName: String, fallbackEnv: String? = null } } -// Calls property but with revoltbuild.properties as the first argument +// Calls property but with peptidebuild.properties as the first argument fun buildproperty(propertyName: String, fallbackEnv: String? = null): String? { - return property("revoltbuild.properties", propertyName, fallbackEnv) + return property("peptidebuild.properties", propertyName, fallbackEnv) } android { compileSdk = 35 defaultConfig { - applicationId = "chat.revolt" + applicationId = "chat.peptide" minSdk = 24 targetSdk = 35 versionCode = Integer.parseInt("001_003_106".replace("_", ""), 10) @@ -103,11 +95,6 @@ android { getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ) - buildConfigField( - "String", - "SENTRY_DSN", - "\"${buildproperty("sentry.dsn", "RVX_SENTRY_DSN")}\"" - ) buildConfigField( "String", "FLAVOUR_ID", @@ -126,11 +113,11 @@ android { buildproperty("build.debug.app_name", "RVX_DEBUG_APP_NAME")!! ) - buildConfigField( - "String", - "SENTRY_DSN", - "\"${buildproperty("sentry.dsn", "RVX_SENTRY_DSN")}\"" - ) +// buildConfigField( +// "String", +// "SENTRY_DSN", +// "\"${buildproperty("sentry.dsn", "RVX_SENTRY_DSN")}\"" +// ) buildConfigField( "String", "FLAVOUR_ID", @@ -159,7 +146,7 @@ android { androidResources { generateLocaleConfig = true } - namespace = "chat.revolt" + namespace = "chat.peptide" externalNativeBuild { cmake { path(file("src/main/cpp/CMakeLists.txt")) @@ -169,22 +156,24 @@ android { lint { abortOnError = false disable += "MissingTranslation" + disable += "NullSafeMutableLiveData" + checkReleaseBuilds = false } } -sentry { - autoUploadProguardMapping = - buildproperty("sentry.upload_mappings", "RVX_SENTRY_UPLOAD_MAPPINGS") == "true" - - tracingInstrumentation { - enabled = true - - logcat { - enabled = true - minLevel = LogcatLevel.WARNING - } - } -} +//sentry { +// autoUploadProguardMapping = +// buildproperty("sentry.upload_mappings", "RVX_SENTRY_UPLOAD_MAPPINGS") == "true" +// +// tracingInstrumentation { +// enabled = true +// +// logcat { +// enabled = true +// minLevel = LogcatLevel.WARNING +// } +// } +//} dependencies { // Android/Kotlin Core @@ -196,6 +185,10 @@ dependencies { implementation("org.jetbrains.kotlinx:kotlinx-serialization-cbor:1.6.1") implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.4.0") implementation("androidx.profileinstaller:profileinstaller:1.4.1") + implementation("androidx.camera:camera-core:1.4.2") + implementation("androidx.camera:camera-lifecycle:1.4.2") + implementation("androidx.camera:camera-camera2:1.4.2") + implementation("androidx.camera:camera-view:1.4.2") // Compose BOM val composeBom = platform("androidx.compose:compose-bom:$composeBomVersion") @@ -247,8 +240,8 @@ dependencies { implementation("com.mikepenz:aboutlibraries-core:11.3.0-rc02") // Sentry - crash reporting - implementation("io.sentry:sentry-android:8.13.2") - implementation("io.sentry:sentry-compose-android:8.13.2") +// implementation("io.sentry:sentry-android:8.19.1") +// implementation("io.sentry:sentry-compose-android:8.19.1") // Other AndroidX libraries implementation("androidx.documentfile:documentfile:1.1.0") @@ -343,7 +336,7 @@ aboutLibraries { sqldelight { databases { create("Database") { - packageName.set("chat.revolt.persistence") + packageName.set("chat.peptide.persistence") } } -} \ No newline at end of file +} diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 217b004e..472788cc 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -109,4 +109,4 @@ public ; } --keep class chat.revolt.ndk.AstNode { *; } \ No newline at end of file +-keep class chat.peptide.ndk.AstNode { *; } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index af21b348..8d2b2979 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -19,6 +19,9 @@ --> + + + @@ -31,8 +34,8 @@ android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" - android:name=".RevoltApplication" - android:theme="@style/Theme.Revolt" + android:name=".PeptideApplication" + android:theme="@style/Theme.Peptide" android:enableOnBackInvokedCallback="true" tools:targetApi="tiramisu"> - + + + + android:theme="@style/Theme.Peptide"> @@ -79,7 +82,7 @@ @@ -90,7 +93,7 @@ - + @@ -115,7 +118,7 @@ @@ -131,12 +134,12 @@ + android:theme="@style/Theme.Peptide" /> + android:theme="@style/Theme.Peptide" /> + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/assets/README_APP_LINKS.md b/app/src/main/assets/README_APP_LINKS.md new file mode 100644 index 00000000..12b3904d --- /dev/null +++ b/app/src/main/assets/README_APP_LINKS.md @@ -0,0 +1,71 @@ +# Android App Links Setup Instructions + +This document provides instructions for setting up Android App Links for the Peptide app. + +## What are Android App Links? + +Android App Links are HTTP URLs that bring users directly to specific content in your Android app. When a user clicks an App Link, the app opens immediately if it's installed, without showing the app chooser dialog. + +## Requirements + +1. Your app must have an intent filter that handles the specific URLs +2. Your website must have a Digital Asset Links JSON file that verifies the association with your app + +## Steps to Complete the Setup + +### 1. Get your app's signing certificate fingerprint + +Run the following command to get your app's signing certificate fingerprint: + +```bash +keytool -list -v -keystore your_keystore.jks -alias your_alias +``` + +Look for the SHA-256 fingerprint in the output. Remove all colons (:) from the fingerprint. + +### 2. Update the assetlinks.json file + +Open the `assetlinks.json` file in this directory and replace the placeholder with your actual SHA-256 fingerprint: + +```json +[{ + "relation": ["delegate_permission/common.handle_all_urls"], + "target": { + "namespace": "android_app", + "package_name": "chat.peptide", + "sha256_cert_fingerprints": [ + "YOUR_SHA256_FINGERPRINT_HERE" + ] + } +}] +``` + +### 3. Host the assetlinks.json file on your server + +Upload the `assetlinks.json` file to the following location on your server: + +``` +https://peptide.chat/.well-known/assetlinks.json +https://app.peptide.chat/.well-known/assetlinks.json +``` + +Make sure the file is accessible via HTTPS and returns with Content-Type: application/json. + +### 4. Test your App Links + +Use the Android Debug Bridge (ADB) to test your App Links: + +```bash +adb shell am start -a android.intent.action.VIEW -d "https://peptide.chat/channels/CHANNEL_ID" chat.peptide +``` + +## Troubleshooting + +If your App Links aren't working: + +1. Verify that the assetlinks.json file is accessible via HTTPS +2. Check that the SHA-256 fingerprint in the assetlinks.json file matches your app's signing certificate +3. Make sure your app is using the correct signing certificate +4. Use the App Links Assistant in Android Studio to verify your App Links setup + +For more information, see the [Android App Links documentation](https://developer.android.com/training/app-links). diff --git a/app/src/main/assets/assetlinks.json b/app/src/main/assets/assetlinks.json new file mode 100644 index 00000000..d80aa2a7 --- /dev/null +++ b/app/src/main/assets/assetlinks.json @@ -0,0 +1,10 @@ +[{ + "relation": ["delegate_permission/common.handle_all_urls"], + "target": { + "namespace": "android_app", + "package_name": "chat.peptide", + "sha256_cert_fingerprints": [ + "PUT_YOUR_APP_SIGNING_CERTIFICATE_SHA256_FINGERPRINT_HERE" + ] + } +}] diff --git a/app/src/main/cpp/CMakeLists.txt b/app/src/main/cpp/CMakeLists.txt index 97ae2e8f..ce7053df 100644 --- a/app/src/main/cpp/CMakeLists.txt +++ b/app/src/main/cpp/CMakeLists.txt @@ -10,7 +10,7 @@ cmake_minimum_required(VERSION 3.22.1) # Since this is the top level CMakeLists.txt, the project name is also accessible # with ${CMAKE_PROJECT_NAME} (both CMake variables are in-sync within the top level # build script scope). -project("revolt") +project("peptide") # Compile cmark in external/cmark add_subdirectory(external/cmark) diff --git a/app/src/main/cpp/stendal/stendal.cpp b/app/src/main/cpp/stendal/stendal.cpp index 8d033221..2e27c8c0 100644 --- a/app/src/main/cpp/stendal/stendal.cpp +++ b/app/src/main/cpp/stendal/stendal.cpp @@ -32,7 +32,7 @@ namespace Stendal { constructArrayListMethod = env->GetMethodID(localArrayListClass, "", "(I)V"); addArrayListMethod = env->GetMethodID(localArrayListClass, "add", "(Ljava/lang/Object;)Z"); - jclass localAstNodeClass = env->FindClass("chat/revolt/ndk/AstNode"); + jclass localAstNodeClass = env->FindClass("chat/peptide/ndk/AstNode"); astNodeClass = (jclass) env->NewGlobalRef(localAstNodeClass); astNodeConstructor = env->GetMethodID(localAstNodeClass, "", STENDAL_ASTNODE_CONSTRUCTOR_SIGNATURE); @@ -141,12 +141,12 @@ namespace Stendal { extern "C" JNIEXPORT void JNICALL -Java_chat_revolt_ndk_Stendal_init(JNIEnv *env, [[maybe_unused]] jobject thiz) { +Java_chat_peptide_ndk_Stendal_init(JNIEnv *env, [[maybe_unused]] jobject thiz) { Stendal::init(env); } extern "C" JNIEXPORT jobject JNICALL -Java_chat_revolt_ndk_Stendal_render(JNIEnv *env, [[maybe_unused]] jobject thiz, jstring input) { +Java_chat_peptide_ndk_Stendal_render(JNIEnv *env, [[maybe_unused]] jobject thiz, jstring input) { const char *inputStr = env->GetStringUTFChars(input, nullptr); cmark_node *doc = cmark_parse_document(inputStr, strlen(inputStr), CMARK_OPT_DEFAULT | CMARK_OPT_HARDBREAKS | diff --git a/app/src/main/java/chat/revolt/RevoltApplication.kt b/app/src/main/java/chat/peptide/PeptideApplication.kt similarity index 67% rename from app/src/main/java/chat/revolt/RevoltApplication.kt rename to app/src/main/java/chat/peptide/PeptideApplication.kt index 0e7b1254..b316c348 100644 --- a/app/src/main/java/chat/revolt/RevoltApplication.kt +++ b/app/src/main/java/chat/peptide/PeptideApplication.kt @@ -1,23 +1,23 @@ -package chat.revolt +package chat.peptide import android.app.Application -import chat.revolt.api.RevoltHttp -import chat.revolt.persistence.KVStorage +import chat.peptide.api.PeptideHttp +import chat.peptide.persistence.KVStorage import com.google.android.material.color.DynamicColors import dagger.hilt.android.HiltAndroidApp import logcat.AndroidLogcatLogger import logcat.LogPriority @HiltAndroidApp -class RevoltApplication : Application() { +class PeptideApplication : Application() { companion object { - lateinit var instance: RevoltApplication + lateinit var instance: PeptideApplication } override fun onCreate() { super.onCreate() AndroidLogcatLogger.installOnDebuggableApp(this, minPriority = LogPriority.VERBOSE) - RevoltHttp // Trigger initialization + PeptideHttp // Trigger initialization } init { @@ -30,6 +30,6 @@ class RevoltApplication : Application() { * Extension function to get KVStorage instance. * @return KVStorage instance */ -fun RevoltApplication.getKVStorage(): KVStorage { +fun PeptideApplication.getKVStorage(): KVStorage { return KVStorage(this) } diff --git a/app/src/main/java/chat/peptide/activities/DeepLinkActivity.kt b/app/src/main/java/chat/peptide/activities/DeepLinkActivity.kt new file mode 100644 index 00000000..c1dc1042 --- /dev/null +++ b/app/src/main/java/chat/peptide/activities/DeepLinkActivity.kt @@ -0,0 +1,166 @@ +package chat.peptide.activities + +import android.content.Intent +import android.net.Uri +import android.os.Bundle +import android.util.Log +import androidx.appcompat.app.AppCompatActivity +import androidx.lifecycle.lifecycleScope +import chat.peptide.persistence.KVStorage +import chat.peptide.utils.DeepLinkUtils +import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.launch +import javax.inject.Inject + +@AndroidEntryPoint +class DeepLinkActivity : AppCompatActivity() { + + @Inject + lateinit var kvStorage: KVStorage + + companion object { + private const val TAG = "DeepLinkActivity" + + // Constants for deep link paths + const val PATH_CHANNEL = "channel" + const val PATH_SERVER = "server" + const val PATH_USER = "user" + const val PATH_MESSAGE = "message" + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + // Handle the incoming intent + handleIntent(intent) + } + + override fun onNewIntent(intent: Intent) { + super.onNewIntent(intent) + + // Handle the new intent + handleIntent(intent) + } + + private fun handleIntent(intent: Intent) { + val appLinkAction = intent.action + val appLinkData: Uri? = intent.data + + if (Intent.ACTION_VIEW == appLinkAction && appLinkData != null) { + Log.d(TAG, "Deep link received: $appLinkData") + + // Check if this is a valid Peptide deep link + if (!DeepLinkUtils.isPeptideDeepLink(appLinkData)) { + Log.d(TAG, "Not a valid Peptide deep link: $appLinkData") + startMainActivity() + return + } + + // Check if user is logged in and handle deep link in a coroutine + lifecycleScope.launch { + val token = kvStorage.get("sessionToken") + if (token == null) { + // User is not logged in, redirect to login screen + Log.d(TAG, "User not logged in, redirecting to login screen") + startMainActivity("choose-platform") + return@launch + } + + // First, check for server/channel/message format + val serverChannelMessage = DeepLinkUtils.extractServerChannelMessage(appLinkData) + if (serverChannelMessage != null) { + Log.d(TAG, "Detected server/channel/message format: ${serverChannelMessage.serverId}/${serverChannelMessage.channelId}/${serverChannelMessage.messageId}") + + if (serverChannelMessage.messageId != null) { + // Navigate to the specific message in the channel + navigateToMessage(serverChannelMessage.messageId, serverChannelMessage.channelId) + } else { + // Navigate to the channel in the server + navigateToChannel(serverChannelMessage.channelId) + } + return@launch + } + + // Extract IDs from the URI using our utility class for other formats + val channelId = DeepLinkUtils.extractChannelId(appLinkData) + val serverId = DeepLinkUtils.extractServerId(appLinkData) + val userId = DeepLinkUtils.extractUserId(appLinkData) + val messageId = DeepLinkUtils.extractMessageId(appLinkData) + + when { + channelId != null -> { + Log.d(TAG, "Navigating to channel: $channelId") + navigateToChannel(channelId) + } + serverId != null -> { + Log.d(TAG, "Navigating to server: $serverId") + navigateToServer(serverId) + } + userId != null -> { + Log.d(TAG, "Navigating to user: $userId") + navigateToUser(userId) + } + messageId != null -> { + Log.d(TAG, "Navigating to message: $messageId") + val channelParam = appLinkData.getQueryParameter("channel") + navigateToMessage(messageId, channelParam) + } + else -> { + // Default case, just open the main activity + Log.d(TAG, "No specific path, opening main activity") + startMainActivity() + } + } + } + } else { + // Not a deep link, just open the main activity + Log.d(TAG, "Not a deep link, opening main activity") + startMainActivity() + } + } + + private fun navigateToChannel(channelId: String) { + Log.d(TAG, "Navigating to channel: $channelId") + + // Use our utility class to create the intent + val intent = DeepLinkUtils.createChannelIntent(this, channelId) + startActivity(intent) + finish() + } + + private fun navigateToServer(serverId: String) { + Log.d(TAG, "Navigating to server: $serverId") + + // Use our utility class to create the intent + val intent = DeepLinkUtils.createServerIntent(this, serverId) + startActivity(intent) + finish() + } + + private fun navigateToUser(userId: String) { + Log.d(TAG, "Navigating to user: $userId") + + // Use our utility class to create the intent + val intent = DeepLinkUtils.createUserIntent(this, userId) + startActivity(intent) + finish() + } + + private fun navigateToMessage(messageId: String, channelId: String?) { + Log.d(TAG, "Navigating to message: $messageId in channel: $channelId") + + // Use our utility class to create the intent + val intent = DeepLinkUtils.createMessageIntent(this, messageId, channelId) + startActivity(intent) + finish() + } + + private fun startMainActivity(destination: String? = null) { + val intent = Intent(this, MainActivity::class.java) + if (destination != null) { + intent.putExtra("next_destination", destination) + } + startActivity(intent) + finish() + } +} diff --git a/app/src/main/java/chat/revolt/activities/InviteActivity.kt b/app/src/main/java/chat/peptide/activities/InviteActivity.kt similarity index 88% rename from app/src/main/java/chat/revolt/activities/InviteActivity.kt rename to app/src/main/java/chat/peptide/activities/InviteActivity.kt index 05be1435..3de43204 100644 --- a/app/src/main/java/chat/revolt/activities/InviteActivity.kt +++ b/app/src/main/java/chat/peptide/activities/InviteActivity.kt @@ -1,4 +1,4 @@ -package chat.revolt.activities +package chat.peptide.activities import android.os.Bundle import androidx.activity.ComponentActivity @@ -17,13 +17,11 @@ import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.CircleShape import androidx.compose.material3.AlertDialog -import androidx.compose.material3.Button import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.material3.Text -import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue @@ -46,19 +44,21 @@ import androidx.core.view.WindowCompat import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewmodel.compose.viewModel -import chat.revolt.R -import chat.revolt.api.RevoltAPI -import chat.revolt.api.RevoltError -import chat.revolt.api.routes.invites.fetchInviteByCode -import chat.revolt.api.routes.invites.joinInviteByCode -import chat.revolt.api.schemas.Invite -import chat.revolt.api.schemas.InviteJoined -import chat.revolt.api.schemas.RsResult -import chat.revolt.api.settings.LoadedSettings -import chat.revolt.api.settings.SyncedSettings -import chat.revolt.composables.generic.IconPlaceholder -import chat.revolt.composables.generic.RemoteImage -import chat.revolt.ui.theme.RevoltTheme +import chat.peptide.R +import chat.peptide.api.PeptideAPI +import chat.peptide.api.PeptideError +import chat.peptide.api.routes.invites.fetchInviteByCode +import chat.peptide.api.routes.invites.joinInviteByCode +import chat.peptide.api.schemas.Invite +import chat.peptide.api.schemas.InviteJoined +import chat.peptide.api.schemas.RsResult +import chat.peptide.api.settings.LoadedSettings +import chat.peptide.api.settings.SyncedSettings +import chat.peptide.composables.generic.IconPlaceholder +import chat.peptide.composables.generic.PepTextButton +import chat.peptide.composables.generic.RemoteImage +import chat.peptide.composables.generic.SquareButton +import chat.peptide.ui.theme.PeptideTheme import com.bumptech.glide.integration.compose.ExperimentalGlideComposeApi import com.bumptech.glide.integration.compose.GlideImage import kotlinx.coroutines.launch @@ -90,19 +90,19 @@ class InviteViewModel : ViewModel() { _loadingFinished = loadingFinished } - private var _inviteResult by mutableStateOf?>(null) - val inviteResult: RsResult? + private var _inviteResult by mutableStateOf?>(null) + val inviteResult: RsResult? get() = _inviteResult - fun setInviteResult(inviteResult: RsResult?) { + fun setInviteResult(inviteResult: RsResult?) { _inviteResult = inviteResult } - private var _joinResult by mutableStateOf?>(null) - val joinResult: RsResult? + private var _joinResult by mutableStateOf?>(null) + val joinResult: RsResult? get() = _joinResult - fun setJoinResult(joinResult: RsResult?) { + fun setJoinResult(joinResult: RsResult?) { _joinResult = joinResult } @@ -144,7 +144,7 @@ fun InviteScreen( val inviteValid = if (viewModel.loadingFinished) (viewModel.inviteResult?.ok ?: false) else null val invite = viewModel.inviteResult?.value - RevoltTheme( + PeptideTheme( requestedTheme = LoadedSettings.theme, colourOverrides = SyncedSettings.android.colourOverrides ) { @@ -180,7 +180,7 @@ fun InviteScreen( contentAlignment = Alignment.Center ) { GlideImage( - model = "${RevoltAPI.getCurrentFilesUrl()}/banners/${invite?.serverBanner?.id}/${invite?.serverBanner?.filename}", + model = "${PeptideAPI.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 = "${RevoltAPI.getCurrentFilesUrl()}/icons/${invite.serverIcon.id}/${invite.serverIcon.filename}", + url = "${PeptideAPI.getCurrentFilesUrl()}/icons/${invite.serverIcon.id}/${invite.serverIcon.filename}", allowAnimation = false, description = viewModel.inviteResult?.value?.serverName ?: stringResource(id = R.string.unknown), @@ -245,7 +245,7 @@ fun InviteScreen( Spacer(modifier = Modifier.height(16.dp)) Row { - Button( + SquareButton( onClick = { viewModel.joinInvite(inviteCode) }, @@ -257,7 +257,7 @@ fun InviteScreen( Spacer(modifier = Modifier.width(8.dp)) - TextButton( + PepTextButton( onClick = onFinish, modifier = Modifier .testTag("decline_invite") @@ -274,7 +274,7 @@ fun InviteScreen( } @Composable -fun InvalidInviteError(error: RevoltError? = null, onDismissRequest: () -> Unit) { +fun InvalidInviteError(error: PeptideError? = null, onDismissRequest: () -> Unit) { AlertDialog( onDismissRequest = onDismissRequest, icon = { @@ -307,7 +307,7 @@ fun InvalidInviteError(error: RevoltError? = null, onDismissRequest: () -> Unit) } }, dismissButton = { - TextButton( + PepTextButton( onClick = { onDismissRequest() } @@ -347,7 +347,7 @@ fun NoInviteSpecifiedError(onDismissRequest: () -> Unit) { } }, dismissButton = { - TextButton( + PepTextButton( onClick = { onDismissRequest() } diff --git a/app/src/main/java/chat/revolt/activities/MainActivity.kt b/app/src/main/java/chat/peptide/activities/MainActivity.kt similarity index 78% rename from app/src/main/java/chat/revolt/activities/MainActivity.kt rename to app/src/main/java/chat/peptide/activities/MainActivity.kt index a41044ef..fa913400 100644 --- a/app/src/main/java/chat/revolt/activities/MainActivity.kt +++ b/app/src/main/java/chat/peptide/activities/MainActivity.kt @@ -1,7 +1,8 @@ -package chat.revolt.activities +package chat.peptide.activities import android.annotation.SuppressLint import android.content.Context +import android.content.Intent import android.net.ConnectivityManager import android.net.NetworkCapabilities import android.os.Bundle @@ -72,71 +73,73 @@ import androidx.lifecycle.viewModelScope import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController -import chat.revolt.BuildConfig -import chat.revolt.R -import chat.revolt.RevoltApplication -import chat.revolt.api.ApplicationPlatform -import chat.revolt.api.HitRateLimitException -import chat.revolt.api.RevoltAPI -import chat.revolt.api.RevoltAPI.setPlatform -import chat.revolt.api.RevoltHttp -import chat.revolt.api.UrlsStorageKeys -import chat.revolt.api.api -import chat.revolt.api.routes.microservices.geo.queryGeo -import chat.revolt.api.routes.microservices.health.healthCheck -import chat.revolt.api.routes.onboard.needsOnboarding -import chat.revolt.api.schemas.HealthNotice -import chat.revolt.api.settings.Experiments -import chat.revolt.api.settings.GeoStateProvider -import chat.revolt.api.settings.LoadedSettings -import chat.revolt.api.settings.SyncedSettings -import chat.revolt.composables.generic.HealthAlert -import chat.revolt.composables.voice.VoicePermissionSwitch -import chat.revolt.composables.voice.VoiceSheet -import chat.revolt.material.EasingTokens -import chat.revolt.ndk.NativeLibraries -import chat.revolt.persistence.KVStorage -import chat.revolt.screens.DefaultDestinationScreen -import chat.revolt.screens.about.AboutScreen -import chat.revolt.screens.about.AttributionScreen -import chat.revolt.screens.chat.ChatRouterScreen -import chat.revolt.screens.chat.views.channel.ChannelScreen -import chat.revolt.screens.chooseplatform.ChoosePlatformScreen -import chat.revolt.screens.create.CreateGroupScreen -import chat.revolt.screens.labs.LabsRootScreen -import chat.revolt.screens.login.LoginGreetingScreen -import chat.revolt.screens.login.LoginScreen -import chat.revolt.screens.login.MfaScreen -import chat.revolt.screens.login2.InitScreen -import chat.revolt.screens.main.MainScreen -import chat.revolt.screens.register.OnboardingScreen -import chat.revolt.screens.register.RegisterDetailsScreen -import chat.revolt.screens.register.RegisterGreetingScreen -import chat.revolt.screens.register.RegisterVerifyScreen -import chat.revolt.screens.services.DiscoverScreen -import chat.revolt.screens.settings.AppearanceSettingsScreen -import chat.revolt.screens.settings.ChangelogsSettingsScreen -import chat.revolt.screens.settings.ChatSettingsScreen -import chat.revolt.screens.settings.DebugSettingsScreen -import chat.revolt.screens.settings.ExperimentsSettingsScreen -import chat.revolt.screens.settings.LanguagePickerSettingsScreen -import chat.revolt.screens.settings.ProfileSettingsScreen -import chat.revolt.screens.settings.SessionSettingsScreen -import chat.revolt.screens.settings.SettingsScreen -import chat.revolt.screens.settings.channel.ChannelSettingsHome -import chat.revolt.screens.settings.channel.ChannelSettingsOverview -import chat.revolt.screens.settings.channel.ChannelSettingsPermissions -import chat.revolt.ui.theme.RevoltTheme +import chat.peptide.BuildConfig +import chat.peptide.R +import chat.peptide.PeptideApplication +import chat.peptide.api.ApplicationPlatform +import chat.peptide.api.HitRateLimitException +import chat.peptide.api.PeptideAPI +import chat.peptide.api.PeptideAPI.setPlatform +import chat.peptide.api.PeptideHttp +import chat.peptide.api.UrlsStorageKeys +import chat.peptide.api.api +import chat.peptide.api.routes.microservices.geo.queryGeo +import chat.peptide.api.routes.microservices.health.healthCheck +import chat.peptide.api.routes.onboard.needsOnboarding +import chat.peptide.api.schemas.HealthNotice +import chat.peptide.api.settings.Experiments +import chat.peptide.api.settings.GeoStateProvider +import chat.peptide.api.settings.LoadedSettings +import chat.peptide.api.settings.SyncedSettings +import chat.peptide.composables.generic.HealthAlert +import chat.peptide.composables.generic.PepTextButton +import chat.peptide.composables.voice.VoicePermissionSwitch +import chat.peptide.composables.voice.VoiceSheet +import chat.peptide.material.EasingTokens +import chat.peptide.ndk.NativeLibraries +import chat.peptide.persistence.KVStorage +import chat.peptide.screens.DefaultDestinationScreen +import chat.peptide.screens.about.AboutScreen +import chat.peptide.screens.about.AttributionScreen +import chat.peptide.screens.chat.ChatRouterScreen +import chat.peptide.screens.chat.views.channel.ChannelScreen +import chat.peptide.screens.chooseplatform.ChoosePlatformScreen +import chat.peptide.screens.create.CreateGroupScreen +import chat.peptide.screens.labs.LabsRootScreen +import chat.peptide.screens.login.LoginGreetingScreen +import chat.peptide.screens.login.LoginScreen +import chat.peptide.screens.login.MfaScreen +import chat.peptide.screens.login2.InitScreen +import chat.peptide.screens.main.MainScreen +import chat.peptide.screens.register.OnboardingScreen +import chat.peptide.screens.register.RegisterDetailsScreen +import chat.peptide.screens.register.RegisterGreetingScreen +import chat.peptide.screens.register.RegisterVerifyScreen +import chat.peptide.screens.services.DiscoverScreen +import chat.peptide.screens.settings.AppearanceSettingsScreen +import chat.peptide.screens.settings.ChangelogsSettingsScreen +import chat.peptide.screens.settings.ChatSettingsScreen +import chat.peptide.screens.settings.DebugSettingsScreen +import chat.peptide.screens.settings.ExperimentsSettingsScreen +import chat.peptide.screens.settings.LanguagePickerSettingsScreen +import chat.peptide.screens.settings.ProfileSettingsScreen +import chat.peptide.screens.settings.SessionSettingsScreen +import chat.peptide.screens.settings.SettingsScreen +import chat.peptide.screens.settings.channel.ChannelSettingsHome +import chat.peptide.screens.settings.channel.ChannelSettingsOverview +import chat.peptide.screens.settings.channel.ChannelSettingsPermissions +import chat.peptide.ui.theme.PeptideTheme +import chat.peptide.utils.DeepLinkHandler import com.google.android.material.color.DynamicColors import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.qualifiers.ApplicationContext import io.ktor.client.request.get -import io.sentry.android.core.SentryAndroid import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.launch import javax.inject.Inject + @HiltViewModel @SuppressLint("StaticFieldLeak") class MainActivityViewModel @Inject constructor( @@ -165,9 +168,9 @@ class MainActivityViewModel @Inject constructor( } } - private suspend fun canReachRevolt(): Boolean { + private suspend fun canReachPeptide(): Boolean { try { - val res = RevoltHttp.get("/".api()) + val res = PeptideHttp.get("/".api()) return res.status.value == 200 } catch (_: Exception) { return false @@ -197,7 +200,7 @@ class MainActivityViewModel @Inject constructor( /** * Sets the default platform on application creation. - * It retrieves the platform from key-value storage and sets it in the RevoltAPI. + * It retrieves the platform from key-value storage and sets it in the PeptideAPI. * If the platform is not found or invalid, it logs the user out. */ fun setDefaultPlatformOnCreate() { @@ -227,11 +230,11 @@ class MainActivityViewModel @Inject constructor( isConnected.emit(hasInternetConnection()) - Log.d("MainActivity", "Checking if we can reach Revolt") + Log.d("MainActivity", "Checking if we can reach Peptide") if (!isConnected.value) return@launch startWithoutDestination() - Log.d("MainActivity", "We can reach Revolt, checking if we're logged in") + Log.d("MainActivity", "We can reach Peptide, checking if we're logged in") val token = kvStorage.get("sessionToken") ?: return@launch startWithDestination("choose-platform") @@ -239,17 +242,17 @@ class MainActivityViewModel @Inject constructor( Log.d( "MainActivity", - "We have a session token, checking if it's valid and if we can still reach Revolt" + "We have a session token, checking if it's valid and if we can still reach Peptide" ) - val canReachRevolt = canReachRevolt() + val canReachPeptide = canReachPeptide() val valid = try { - RevoltAPI.checkSessionToken(token) + PeptideAPI.checkSessionToken(token) } catch (_: Throwable) { false } - if (canReachRevolt && !valid) { + if (canReachPeptide && !valid) { Log.d("MainActivity", "Session token is invalid, could not log in") couldNotLogIn.emit(true) } else { @@ -276,8 +279,8 @@ class MainActivityViewModel @Inject constructor( try { Log.d("MainActivity", "Onboarding state is complete, logging in") - RevoltAPI.loginAs(token) - RevoltAPI.setSessionId(id) + PeptideAPI.loginAs(token) + PeptideAPI.setSessionId(id) if (Experiments.usePolar.isEnabled) { startWithDestination("main") } else { @@ -352,7 +355,7 @@ class MainActivity : AppCompatActivity() { override fun onResume() { super.onResume() DynamicColors.applyToActivityIfAvailable(this) - DynamicColors.applyToActivitiesIfAvailable(RevoltApplication.instance) + DynamicColors.applyToActivitiesIfAvailable(PeptideApplication.instance) @Suppress("DEPRECATION") // We are fixing a bug in the splash screen window.statusBarColor = Color.Transparent.toArgb() } @@ -361,7 +364,7 @@ class MainActivity : AppCompatActivity() { override fun onConfigurationChanged(newConfig: android.content.res.Configuration) { super.onConfigurationChanged(newConfig) DynamicColors.applyToActivityIfAvailable(this) - DynamicColors.applyToActivitiesIfAvailable(RevoltApplication.instance) + DynamicColors.applyToActivitiesIfAvailable(PeptideApplication.instance) @Suppress("DEPRECATION") // We are fixing a bug in the splash screen window.statusBarColor = Color.Transparent.toArgb() } @@ -369,20 +372,32 @@ class MainActivity : AppCompatActivity() { @OptIn(ExperimentalMaterial3WindowSizeClassApi::class) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + // waiting for view to draw to better represent a captured error with a screenshot + findViewById(android.R.id.content).viewTreeObserver.addOnGlobalLayoutListener { + try { + throw Exception("This app uses Sentry! :)") + } catch (e: Exception) { +// Sentry.captureException(e) + } + } + // Set the default platform for the Platform API. viewModel.setDefaultPlatformOnCreate() - SentryAndroid.init(this) { options -> - options.dsn = BuildConfig.SENTRY_DSN - options.release = BuildConfig.VERSION_NAME - } +// SentryAndroid.init(this) { options -> +// options.dsn = BuildConfig.SENTRY_DSN +// options.release = BuildConfig.VERSION_NAME +// } @Suppress("DEPRECATION") // We are fixing a bug in the splash screen window.statusBarColor = Color.Transparent.toArgb() WindowCompat.setDecorFitsSystemWindows(window, false) - RevoltAPI.hydrateFromPersistentCache() + PeptideAPI.hydrateFromPersistentCache() + + // Handle deep link data if available + handleDeepLinkData(intent) setContent { val windowSizeClass = calculateWindowSizeClass(this) @@ -419,6 +434,70 @@ class MainActivity : AppCompatActivity() { ) } + override fun onNewIntent(intent: Intent) { + super.onNewIntent(intent) + handleDeepLinkData(intent) + } + + private fun handleDeepLinkData(intent: Intent) { + // Check for deep link data from DeepLinkActivity + val channelId = intent.getStringExtra(DeepLinkActivity.PATH_CHANNEL) + val serverId = intent.getStringExtra(DeepLinkActivity.PATH_SERVER) + val userId = intent.getStringExtra(DeepLinkActivity.PATH_USER) + val messageId = intent.getStringExtra(DeepLinkActivity.PATH_MESSAGE) + val nextDestination = intent.getStringExtra("next_destination") + + if (nextDestination != null) { + Log.d(TAG, "Setting next destination from deep link: $nextDestination") + viewModel.updateNextDestination(nextDestination) + return + } + + // Store deep link data in a static companion object for ChatRouterScreen to access + DeepLinkHandler.channelId = channelId + DeepLinkHandler.serverId = serverId + DeepLinkHandler.userId = userId + DeepLinkHandler.messageId = messageId + DeepLinkHandler.hasDeepLink = channelId != null || serverId != null || userId != null || messageId != null + + // Wait for the app to be ready before navigating to the deep link destination + viewModel.viewModelScope.launch { + viewModel.isReady.collect { isReady -> + if (isReady) { + when { + channelId != null -> { + Log.d(TAG, "Navigating to channel from deep link: $channelId") + // Check if Polar mode is enabled + if (Experiments.usePolar.isEnabled) { + viewModel.updateNextDestination("main/conversation/$channelId") + } else { + // For non-Polar mode, we'll use the DeepLinkHandler to communicate with ChatRouterScreen + viewModel.updateNextDestination("chat") + } + } + serverId != null -> { + Log.d(TAG, "Navigating to server from deep link: $serverId") + // Navigate to chat screen, the ChatRouterScreen will handle the server navigation + viewModel.updateNextDestination("chat") + } + userId != null -> { + Log.d(TAG, "Navigating to user from deep link: $userId") + // Navigate to chat screen, the ChatRouterScreen will handle the user navigation + viewModel.updateNextDestination("chat") + } + messageId != null -> { + Log.d(TAG, "Navigating to message from deep link: $messageId") + // Navigate to chat screen, the ChatRouterScreen will handle the message navigation + viewModel.updateNextDestination("chat") + } + } + // Only collect once + return@collect + } + } + } + } + override fun onProvideKeyboardShortcuts( data: MutableList?, menu: Menu?, @@ -444,15 +523,16 @@ class MainActivity : AppCompatActivity() { } companion object { + private const val TAG = "MainActivity" init { NativeLibraries.init() } } } -val RevoltTweenInt: FiniteAnimationSpec = tween(400, easing = EaseInOutExpo) -val RevoltTweenFloat: FiniteAnimationSpec = tween(400, easing = EaseInOutExpo) -val RevoltTweenDp: FiniteAnimationSpec = tween(400, easing = EaseInOutExpo) +val PeptideTweenInt: FiniteAnimationSpec = tween(400, easing = EaseInOutExpo) +val PeptideTweenFloat: FiniteAnimationSpec = tween(400, easing = EaseInOutExpo) +val PeptideTweenDp: FiniteAnimationSpec = tween(400, easing = EaseInOutExpo) val NavTweenInt: FiniteAnimationSpec = tween(350, easing = EaseInOutExpo) val NavTweenFloat: FiniteAnimationSpec = tween(350, easing = EaseInOutExpo) @@ -502,7 +582,7 @@ fun AppEntrypoint( val navController = rememberNavController() - RevoltTheme( + PeptideTheme( requestedTheme = LoadedSettings.theme, colourOverrides = SyncedSettings.android.colourOverrides, ) { @@ -536,7 +616,7 @@ fun AppEntrypoint( Text(stringResource(R.string.could_not_log_in_body)) }, confirmButton = { - TextButton( + PepTextButton( onClick = { onDismissLoginError() onRetryConnection() @@ -546,7 +626,7 @@ fun AppEntrypoint( } }, dismissButton = { - TextButton( + PepTextButton( onClick = { onDismissLoginError() onLogout() @@ -645,7 +725,7 @@ fun AppEntrypoint( easing = EasingTokens.EmphasizedDecelerate ), initialOffset = { it / 3 } - ) + fadeIn(animationSpec = RevoltTweenFloat) + ) + fadeIn(animationSpec = PeptideTweenFloat) } ) { ChatRouterScreen( @@ -678,7 +758,7 @@ fun AppEntrypoint( easing = EasingTokens.EmphasizedDecelerate ), initialOffset = { it / 3 } - ) + fadeIn(animationSpec = RevoltTweenFloat) + scaleIn( + ) + fadeIn(animationSpec = PeptideTweenFloat) + scaleIn( animationSpec = tween( 400, easing = EasingTokens.EmphasizedDecelerate @@ -700,7 +780,7 @@ fun AppEntrypoint( easing = EasingTokens.EmphasizedDecelerate ), initialOffset = { it } - ) + fadeIn(animationSpec = RevoltTweenFloat) + ) + fadeIn(animationSpec = PeptideTweenFloat) }, exitTransition = { slideOutOfContainer( @@ -710,7 +790,7 @@ fun AppEntrypoint( easing = EasingTokens.EmphasizedDecelerate ), targetOffset = { it } - ) + fadeOut(animationSpec = RevoltTweenFloat) + ) + fadeOut(animationSpec = PeptideTweenFloat) } ) { backStackEntry -> val channelId = backStackEntry.arguments?.getString("channelId") ?: "" diff --git a/app/src/main/java/chat/revolt/activities/ShareTargetActivity.kt b/app/src/main/java/chat/peptide/activities/ShareTargetActivity.kt similarity index 91% rename from app/src/main/java/chat/revolt/activities/ShareTargetActivity.kt rename to app/src/main/java/chat/peptide/activities/ShareTargetActivity.kt index e7d6e611..7fed102d 100644 --- a/app/src/main/java/chat/revolt/activities/ShareTargetActivity.kt +++ b/app/src/main/java/chat/peptide/activities/ShareTargetActivity.kt @@ -1,4 +1,4 @@ -package chat.revolt.activities +package chat.peptide.activities import android.content.Intent import android.net.Uri @@ -50,25 +50,25 @@ import androidx.documentfile.provider.DocumentFile import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import chat.revolt.R -import chat.revolt.api.RevoltAPI -import chat.revolt.api.internals.ChannelUtils -import chat.revolt.api.routes.channel.sendMessage -import chat.revolt.api.routes.microservices.autumn.FileArgs -import chat.revolt.api.routes.microservices.autumn.MAX_ATTACHMENTS_PER_MESSAGE -import chat.revolt.api.routes.microservices.autumn.uploadToAutumn -import chat.revolt.api.schemas.ChannelType -import chat.revolt.api.settings.LoadedSettings -import chat.revolt.api.settings.SyncedSettings -import chat.revolt.composables.chat.MessageField -import chat.revolt.composables.emoji.EmojiPicker -import chat.revolt.composables.screens.chat.AttachmentManager -import chat.revolt.composables.screens.chat.drawer.ChannelItem -import chat.revolt.composables.screens.chat.drawer.ChannelItemIconType -import chat.revolt.composables.screens.chat.drawer.DMOrGroupItem -import chat.revolt.persistence.KVStorage -import chat.revolt.screens.chat.views.channel.ChannelScreenActivePane -import chat.revolt.ui.theme.RevoltTheme +import chat.peptide.R +import chat.peptide.api.PeptideAPI +import chat.peptide.api.internals.ChannelUtils +import chat.peptide.api.routes.channel.sendMessage +import chat.peptide.api.routes.microservices.autumn.FileArgs +import chat.peptide.api.routes.microservices.autumn.MAX_ATTACHMENTS_PER_MESSAGE +import chat.peptide.api.routes.microservices.autumn.uploadToAutumn +import chat.peptide.api.schemas.ChannelType +import chat.peptide.api.settings.LoadedSettings +import chat.peptide.api.settings.SyncedSettings +import chat.peptide.composables.chat.MessageField +import chat.peptide.composables.emoji.EmojiPicker +import chat.peptide.composables.screens.chat.AttachmentManager +import chat.peptide.composables.screens.chat.drawer.ChannelItem +import chat.peptide.composables.screens.chat.drawer.ChannelItemIconType +import chat.peptide.composables.screens.chat.drawer.DMOrGroupItem +import chat.peptide.persistence.KVStorage +import chat.peptide.screens.chat.views.channel.ChannelScreenActivePane +import chat.peptide.ui.theme.PeptideTheme import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.lifecycle.HiltViewModel import io.ktor.http.ContentType @@ -180,10 +180,10 @@ class ShareTargetScreenViewModel @Inject constructor( } suspend fun initialiseAPI() { - if (!RevoltAPI.isLoggedIn()) { + if (!PeptideAPI.isLoggedIn()) { val token = kvStorage.get("sessionToken") ?: return - RevoltAPI.loginAs(token) - RevoltAPI.initialize() + PeptideAPI.loginAs(token) + PeptideAPI.initialize() } apiIsReady = true } @@ -207,7 +207,7 @@ class ShareTargetScreenViewModel @Inject constructor( } ) attachmentIds.add(id) - } catch (e: Exception) { + } catch (_: Exception) { return@launch } } @@ -277,7 +277,7 @@ fun ShareTargetScreen( var channelSearchContent by remember { mutableStateOf("") } var selectedChannel by rememberSaveable { mutableStateOf(null) } - RevoltTheme( + PeptideTheme( requestedTheme = LoadedSettings.theme, colourOverrides = SyncedSettings.android.colourOverrides ) { @@ -326,7 +326,7 @@ fun ShareTargetScreen( Box( modifier = Modifier.weight(1f) ) { - val filteredChannels = RevoltAPI.channelCache.values.asSequence().filter { + val filteredChannels = PeptideAPI.channelCache.values.asSequence().filter { it.name?.contains( channelSearchContent, ignoreCase = true @@ -346,12 +346,13 @@ fun ShareTargetScreen( ChannelType.Group, ChannelType.DirectMessage -> DMOrGroupItem( channel = channel, partner = ChannelUtils.resolveDMPartner(channel)?.let { u -> - RevoltAPI.userCache[u] + PeptideAPI.userCache[u] }, isCurrent = selectedChannel == channel.id, hasUnread = false, onDestinationChanged = { selectedChannel = channel.id }, - onOpenChannelContextSheet = {} + onOpenChannelContextSheet = {}, + onOpenUserInfoSheet = {_ ->} ) else -> ChannelItem( @@ -421,9 +422,9 @@ fun ShareTargetScreen( } } }, - channelType = RevoltAPI.channelCache[selectedChannel]?.channelType + channelType = PeptideAPI.channelCache[selectedChannel]?.channelType ?: ChannelType.TextChannel, - channelName = RevoltAPI.channelCache[selectedChannel]?.name ?: "", + channelName = PeptideAPI.channelCache[selectedChannel]?.name ?: "", ) AnimatedVisibility(viewModel.activeBottomPane is ChannelScreenActivePane.EmojiPicker) { diff --git a/app/src/main/java/chat/revolt/activities/media/ImageViewActivity.kt b/app/src/main/java/chat/peptide/activities/media/ImageViewActivity.kt similarity index 94% rename from app/src/main/java/chat/revolt/activities/media/ImageViewActivity.kt rename to app/src/main/java/chat/peptide/activities/media/ImageViewActivity.kt index c339271b..a2a84ba3 100644 --- a/app/src/main/java/chat/revolt/activities/media/ImageViewActivity.kt +++ b/app/src/main/java/chat/peptide/activities/media/ImageViewActivity.kt @@ -1,4 +1,4 @@ -package chat.revolt.activities.media +package chat.peptide.activities.media import android.content.ContentValues import android.content.Intent @@ -40,14 +40,14 @@ import androidx.compose.ui.res.painterResource 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.RevoltAPI -import chat.revolt.api.RevoltHttp -import chat.revolt.api.schemas.AutumnResource -import chat.revolt.api.settings.LoadedSettings -import chat.revolt.api.settings.SyncedSettings -import chat.revolt.providers.getAttachmentContentUri -import chat.revolt.ui.theme.RevoltTheme +import chat.peptide.R +import chat.peptide.api.PeptideAPI +import chat.peptide.api.PeptideHttp +import chat.peptide.api.schemas.AutumnResource +import chat.peptide.api.settings.LoadedSettings +import chat.peptide.api.settings.SyncedSettings +import chat.peptide.providers.getAttachmentContentUri +import chat.peptide.ui.theme.PeptideTheme import io.ktor.client.request.get import io.ktor.client.statement.readBytes import kotlinx.coroutines.launch @@ -85,7 +85,7 @@ class ImageViewActivity : ComponentActivity() { @OptIn(ExperimentalMaterial3Api::class) @Composable fun ImageViewScreen(resource: AutumnResource, onClose: () -> Unit = {}) { - val resourceUrl = "${RevoltAPI.getCurrentFilesUrl()}/attachments/${resource.id}/${resource.filename}" + val resourceUrl = "${PeptideAPI.getCurrentFilesUrl()}/attachments/${resource.id}/${resource.filename}" val context = LocalContext.current @@ -145,13 +145,13 @@ fun ImageViewScreen(resource: AutumnResource, onClose: () -> Unit = {}) { ContentValues().apply { put(MediaStore.Images.Media.DISPLAY_NAME, resource.filename) put(MediaStore.Images.Media.MIME_TYPE, resource.contentType) - put(MediaStore.Images.Media.RELATIVE_PATH, "Pictures/Revolt") + put(MediaStore.Images.Media.RELATIVE_PATH, "Pictures/Peptide") put(MediaStore.Images.Media.IS_PENDING, 1) } ) }?.let { uri -> context.contentResolver.openOutputStream(uri).use { stream -> - val image = RevoltHttp.get(resourceUrl).readBytes() + val image = PeptideHttp.get(resourceUrl).readBytes() stream?.write(image) context.applicationContext.let { @@ -182,7 +182,7 @@ fun ImageViewScreen(resource: AutumnResource, onClose: () -> Unit = {}) { } } - RevoltTheme( + PeptideTheme( requestedTheme = LoadedSettings.theme, colourOverrides = SyncedSettings.android.colourOverrides ) { diff --git a/app/src/main/java/chat/revolt/activities/media/VideoViewActivity.kt b/app/src/main/java/chat/peptide/activities/media/VideoViewActivity.kt similarity index 94% rename from app/src/main/java/chat/revolt/activities/media/VideoViewActivity.kt rename to app/src/main/java/chat/peptide/activities/media/VideoViewActivity.kt index d4ca85cd..1f07b445 100644 --- a/app/src/main/java/chat/revolt/activities/media/VideoViewActivity.kt +++ b/app/src/main/java/chat/peptide/activities/media/VideoViewActivity.kt @@ -1,4 +1,4 @@ -package chat.revolt.activities.media +package chat.peptide.activities.media import android.content.ContentValues import android.content.Intent @@ -18,12 +18,12 @@ import androidx.fragment.app.FragmentActivity import androidx.lifecycle.lifecycleScope import androidx.media3.common.MediaItem import androidx.media3.exoplayer.ExoPlayer -import chat.revolt.R -import chat.revolt.api.RevoltAPI -import chat.revolt.api.RevoltHttp -import chat.revolt.api.schemas.AutumnResource -import chat.revolt.databinding.ActivityVideoplayerBinding -import chat.revolt.providers.getAttachmentContentUri +import chat.peptide.R +import chat.peptide.api.PeptideAPI +import chat.peptide.api.PeptideHttp +import chat.peptide.api.schemas.AutumnResource +import chat.peptide.databinding.ActivityVideoplayerBinding +import chat.peptide.providers.getAttachmentContentUri import com.google.android.material.color.MaterialColors import com.google.android.material.snackbar.Snackbar import io.ktor.client.request.get @@ -54,7 +54,7 @@ class VideoViewActivity : FragmentActivity() { } val resourceUrl = - "${RevoltAPI.getCurrentFilesUrl()}/attachments/${autumnResource.id}/${autumnResource.filename}" + "${PeptideAPI.getCurrentFilesUrl()}/attachments/${autumnResource.id}/${autumnResource.filename}" WindowCompat.setDecorFitsSystemWindows(window, false) @@ -189,13 +189,13 @@ class VideoViewActivity : FragmentActivity() { ContentValues().apply { put(MediaStore.Video.Media.DISPLAY_NAME, resource.filename) put(MediaStore.Video.Media.MIME_TYPE, resource.contentType) - put(MediaStore.Video.Media.RELATIVE_PATH, "Movies/Revolt") + put(MediaStore.Video.Media.RELATIVE_PATH, "Movies/Peptide") put(MediaStore.Video.Media.IS_PENDING, 1) } ) }?.let { uri -> this@VideoViewActivity.contentResolver.openOutputStream(uri).use { stream -> - val video = RevoltHttp.get(resourceUrl).readBytes() + val video = PeptideHttp.get(resourceUrl).readBytes() stream?.write(video) this@VideoViewActivity.applicationContext.let { diff --git a/app/src/main/java/chat/revolt/api/RevoltAPI.kt b/app/src/main/java/chat/peptide/api/AppAPI.kt similarity index 85% rename from app/src/main/java/chat/revolt/api/RevoltAPI.kt rename to app/src/main/java/chat/peptide/api/AppAPI.kt index 1108362b..9d56b9d3 100644 --- a/app/src/main/java/chat/revolt/api/RevoltAPI.kt +++ b/app/src/main/java/chat/peptide/api/AppAPI.kt @@ -1,26 +1,26 @@ -package chat.revolt.api +package chat.peptide.api import android.os.Handler import android.os.Looper import android.util.Log import androidx.compose.runtime.mutableStateMapOf -import chat.revolt.BuildConfig -import chat.revolt.RevoltApplication -import chat.revolt.api.RevoltAPI.initialize -import chat.revolt.api.internals.Members -import chat.revolt.api.realtime.DisconnectionState -import chat.revolt.api.realtime.RealtimeSocket -import chat.revolt.api.routes.user.fetchSelf -import chat.revolt.api.schemas.AutumnResource -import chat.revolt.api.schemas.ChannelType -import chat.revolt.api.schemas.Emoji -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 chat.peptide.BuildConfig +import chat.peptide.PeptideApplication +import chat.peptide.api.PeptideAPI.initialize +import chat.peptide.api.internals.Members +import chat.peptide.api.realtime.DisconnectionState +import chat.peptide.api.realtime.RealtimeSocket +import chat.peptide.api.routes.user.fetchSelf +import chat.peptide.api.schemas.AutumnResource +import chat.peptide.api.schemas.ChannelType +import chat.peptide.api.schemas.Emoji +import chat.peptide.api.schemas.Message +import chat.peptide.api.schemas.Server +import chat.peptide.api.schemas.User +import chat.peptide.api.unreads.Unreads +import chat.peptide.getKVStorage +import chat.peptide.persistence.Database +import chat.peptide.persistence.SqlStorage import com.chuckerteam.chucker.api.ChuckerCollector import com.chuckerteam.chucker.api.ChuckerInterceptor import com.chuckerteam.chucker.api.RetentionManager @@ -35,7 +35,6 @@ import io.ktor.client.plugins.logging.Logging import io.ktor.client.plugins.websocket.WebSockets import io.ktor.client.request.header import io.ktor.serialization.kotlinx.json.json -import io.sentry.Sentry import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.DelicateCoroutinesApi import kotlinx.coroutines.Dispatchers @@ -52,13 +51,13 @@ import kotlinx.serialization.Serializable import kotlinx.serialization.cbor.Cbor import kotlinx.serialization.json.Json import java.net.SocketException -import chat.revolt.api.schemas.Channel as ChannelSchema +import chat.peptide.api.schemas.Channel as ChannelSchema /** * Enum representing available platforms in the application. */ enum class ApplicationPlatform(val baseUrl: String) { - REVOLT("https://api.revolt.chat"), + REVOLT("https://api.peptide.chat"), PEP("https://peptide.chat/api"); companion object { @@ -117,7 +116,7 @@ object UrlsStorageKeys { } fun String.api(): String { - return "${RevoltAPI.getCurrentBaseUrl()}$this" + return "${PeptideAPI.getCurrentBaseUrl()}$this" } /** @@ -128,27 +127,27 @@ private fun getUrlForPlatform(platform: ApplicationPlatform, urlSelector: (Platf } fun buildUserAgent(accessMethod: String = "Ktor"): String { - return "$accessMethod RevoltAndroid/${BuildConfig.VERSION_NAME} " + + return "$accessMethod PeptideAndroid/${BuildConfig.VERSION_NAME} " + "${BuildConfig.APPLICATION_ID} Android/${android.os.Build.VERSION.SDK_INT} " + "(${android.os.Build.MANUFACTURER} ${android.os.Build.DEVICE}) Kotlin/${KotlinVersion.CURRENT}" } @OptIn(ExperimentalSerializationApi::class) -val RevoltJson = Json { +val PeptideJson = Json { ignoreUnknownKeys = true explicitNulls = false } @OptIn(ExperimentalSerializationApi::class) -val RevoltCbor = Cbor { +val PeptideCbor = Cbor { ignoreUnknownKeys = true } -val RevoltHttp by lazy { +val PeptideHttp by lazy { HttpClient(OkHttp) { install(DefaultRequest) install(ContentNegotiation) { - json(RevoltJson) + json(PeptideJson) } install(WebSockets) @@ -167,15 +166,15 @@ val RevoltHttp by lazy { install(Logging) { level = LogLevel.INFO } val chuckerCollector = ChuckerCollector( - context = RevoltApplication.instance, + context = PeptideApplication.instance, showNotification = true, retentionPeriod = RetentionManager.Period.ONE_DAY ) - val chuckerInterceptor = ChuckerInterceptor.Builder(RevoltApplication.instance) + val chuckerInterceptor = ChuckerInterceptor.Builder(PeptideApplication.instance) .collector(chuckerCollector) .maxContentLength(250_000L) - .redactHeaders(RevoltAPI.TOKEN_HEADER_NAME) + .redactHeaders(PeptideAPI.TOKEN_HEADER_NAME) .alwaysReadResponseBody(true) .createShortcut(false) .build() @@ -184,8 +183,8 @@ val RevoltHttp by lazy { addInterceptor { chain -> val request = chain.request().newBuilder() .apply { - if (chain.request().headers[RevoltAPI.TOKEN_HEADER_NAME] == null) { - header(RevoltAPI.TOKEN_HEADER_NAME, RevoltAPI.sessionToken) + if (chain.request().headers[PeptideAPI.TOKEN_HEADER_NAME] == null) { + header(PeptideAPI.TOKEN_HEADER_NAME, PeptideAPI.sessionToken) } } .build() @@ -195,7 +194,7 @@ val RevoltHttp by lazy { } defaultRequest { - url(RevoltAPI.getCurrentBaseUrl()) + url(PeptideAPI.getCurrentBaseUrl()) header("User-Agent", buildUserAgent()) } } @@ -203,7 +202,7 @@ val RevoltHttp by lazy { val mainHandler = Handler(Looper.getMainLooper()) -object RevoltAPI { +object PeptideAPI { const val TOKEN_HEADER_NAME = "x-session-token" val userCache = mutableStateMapOf() @@ -245,7 +244,7 @@ object RevoltAPI { * Saves the current platform selection to persistent storage. */ private suspend fun savePlatformSelection() { - val kvStorage = RevoltApplication.instance.getKVStorage() + val kvStorage = PeptideApplication.instance.getKVStorage() kvStorage.set(UrlsStorageKeys.PLATFORM, selectedApplicationPlatform.name) } @@ -253,7 +252,7 @@ object RevoltAPI { * Loads the platform selection from persistent storage. */ suspend fun loadPlatformSelection() { - val kvStorage = RevoltApplication.instance.getKVStorage() + val kvStorage = PeptideApplication.instance.getKVStorage() val applicationPlatformName = kvStorage.get(UrlsStorageKeys.PLATFORM) ?: ApplicationPlatform.REVOLT.name selectedApplicationPlatform = try { ApplicationPlatform.valueOf(applicationPlatformName) @@ -304,23 +303,23 @@ object RevoltAPI { try { RealtimeSocket.connect(sessionToken) } catch (e: SocketException) { - Log.d("RevoltAPI", "Socket closed, probably no big deal /// " + e.message) + Log.d("PeptideAPI", "Socket closed, probably no big deal /// " + e.message) RealtimeSocket.updateDisconnectionState(DisconnectionState.Disconnected) } catch (e: Exception) { - Log.e("RevoltAPI", "WebSocket error", e) + Log.e("PeptideAPI", "WebSocket error", e) RealtimeSocket.updateDisconnectionState(DisconnectionState.Disconnected) } } } catch (e: Exception) { try { if (e is InterruptedException) { - Log.d("RevoltAPI", "Socket interrupted") + Log.d("PeptideAPI", "Socket interrupted") } else { - Log.e("RevoltAPI", "WebSocket error", e) + Log.e("PeptideAPI", "WebSocket error", e) } RealtimeSocket.updateDisconnectionState(DisconnectionState.Disconnected) } catch (e: Exception) { - Sentry.captureMessage("Error in socket error handling: $e") +// Sentry.captureMessage("Error in socket error handling: $e") } } } @@ -330,7 +329,7 @@ object RevoltAPI { connectWS() // Send a ping every roughly 30 seconds else the socket dies - // Same interval as the web clients (/revolt.js) + // Same interval as the web clients (/peptide.js) // Note: This will run even if the socket is closed (sendPing will just exit early) mainHandler.post(object : Runnable { override fun run() { @@ -398,9 +397,9 @@ object RevoltAPI { */ fun hydrateFromPersistentCache() { if (!openForLocalHydration) { - Log.w("RevoltAPI", "Hydration is closed, but was called") + Log.w("PeptideAPI", "Hydration is closed, but was called") // Stale data is worst case, let's track it even in prod - Sentry.captureMessage("Local hydration called twice or after real data was fetched") +// Sentry.captureMessage("Local hydration called twice or after real data was fetched") return } @@ -476,7 +475,7 @@ object RevoltAPI { } @Serializable -data class RevoltError(val type: String) +data class PeptideError(val type: String) @Serializable data class RateLimitResponse(@SerialName("retry_after") val retryAfter: Int) { diff --git a/app/src/main/java/chat/revolt/api/internals/BrushCompat.kt b/app/src/main/java/chat/peptide/api/internals/BrushCompat.kt similarity index 99% rename from app/src/main/java/chat/revolt/api/internals/BrushCompat.kt rename to app/src/main/java/chat/peptide/api/internals/BrushCompat.kt index 81944a4b..69e02d47 100644 --- a/app/src/main/java/chat/revolt/api/internals/BrushCompat.kt +++ b/app/src/main/java/chat/peptide/api/internals/BrushCompat.kt @@ -1,4 +1,4 @@ -package chat.revolt.api.internals +package chat.peptide.api.internals import android.util.Log import androidx.compose.material3.LocalContentColor @@ -9,7 +9,7 @@ import androidx.compose.ui.graphics.Brush.Companion.linearGradient import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.SolidColor import androidx.core.graphics.toColorInt -import chat.revolt.api.internals.colour.CSSColours +import chat.peptide.api.internals.colour.CSSColours fun Brush.Companion.solidColor(colour: Color) = SolidColor(colour) diff --git a/app/src/main/java/chat/revolt/api/internals/ChannelUtils.kt b/app/src/main/java/chat/peptide/api/internals/ChannelUtils.kt similarity index 70% rename from app/src/main/java/chat/revolt/api/internals/ChannelUtils.kt rename to app/src/main/java/chat/peptide/api/internals/ChannelUtils.kt index 0e59cacc..c3c78d0d 100644 --- a/app/src/main/java/chat/revolt/api/internals/ChannelUtils.kt +++ b/app/src/main/java/chat/peptide/api/internals/ChannelUtils.kt @@ -1,13 +1,13 @@ -package chat.revolt.api.internals +package chat.peptide.api.internals -import chat.revolt.api.RevoltAPI -import chat.revolt.api.schemas.Channel -import chat.revolt.api.schemas.Server -import chat.revolt.api.schemas.User +import chat.peptide.api.PeptideAPI +import chat.peptide.api.schemas.Channel +import chat.peptide.api.schemas.Server +import chat.peptide.api.schemas.User sealed class CategorisedChannelList { - data class Channel(val channel: chat.revolt.api.schemas.Channel) : CategorisedChannelList() - data class Category(val category: chat.revolt.api.schemas.Category) : CategorisedChannelList() + data class Channel(val channel: chat.peptide.api.schemas.Channel) : CategorisedChannelList() + data class Category(val category: chat.peptide.api.schemas.Category) : CategorisedChannelList() } object ChannelUtils { @@ -19,7 +19,7 @@ object ChannelUtils { */ fun resolveName(channel: Channel): String? { return channel.name - ?: RevoltAPI.userCache[channel.recipients?.first { u -> u != RevoltAPI.selfId }]?.let { + ?: PeptideAPI.userCache[channel.recipients?.first { u -> u != PeptideAPI.selfId }]?.let { User.resolveDefaultName( it ) @@ -27,7 +27,7 @@ object ChannelUtils { } fun resolveDMPartner(channel: Channel): String? { - return channel.recipients?.firstOrNull { u -> u != RevoltAPI.selfId } + return channel.recipients?.firstOrNull { u -> u != PeptideAPI.selfId } } fun categoriseServerFlat(server: Server): List { @@ -42,7 +42,7 @@ object ChannelUtils { } ?: true } ?.mapNotNull { - RevoltAPI.channelCache[it]?.let { it1 -> + PeptideAPI.channelCache[it]?.let { it1 -> CategorisedChannelList.Channel(it1) } } ?: emptyList() @@ -53,7 +53,7 @@ object ChannelUtils { categories.forEach { output.add(it) val channels = it.category.channels?.mapNotNull { c -> - RevoltAPI.channelCache[c]?.let { it1 -> + PeptideAPI.channelCache[c]?.let { it1 -> CategorisedChannelList.Channel(it1) } } ?: emptyList() diff --git a/app/src/main/java/chat/revolt/api/internals/DirectMessages.kt b/app/src/main/java/chat/peptide/api/internals/DirectMessages.kt similarity index 75% rename from app/src/main/java/chat/revolt/api/internals/DirectMessages.kt rename to app/src/main/java/chat/peptide/api/internals/DirectMessages.kt index a0d3009a..9b016dfc 100644 --- a/app/src/main/java/chat/revolt/api/internals/DirectMessages.kt +++ b/app/src/main/java/chat/peptide/api/internals/DirectMessages.kt @@ -1,13 +1,13 @@ -package chat.revolt.api.internals +package chat.peptide.api.internals -import chat.revolt.api.RevoltAPI -import chat.revolt.api.internals.SpecialUsers.PLATFORM_MODERATION_USER -import chat.revolt.api.schemas.Channel -import chat.revolt.api.schemas.ChannelType +import chat.peptide.api.PeptideAPI +import chat.peptide.api.internals.SpecialUsers.PLATFORM_MODERATION_USER +import chat.peptide.api.schemas.Channel +import chat.peptide.api.schemas.ChannelType object DirectMessages { fun unreadDMs(): List { - return RevoltAPI.channelCache.values + return PeptideAPI.channelCache.values .filter { it.channelType in listOf( ChannelType.DirectMessage, ChannelType.Group @@ -15,7 +15,7 @@ object DirectMessages { } .filter { it.id?.let { id -> - RevoltAPI.unreads.hasUnread( + PeptideAPI.unreads.hasUnread( id, it.lastMessageID!!, serverId = null diff --git a/app/src/main/java/chat/revolt/api/internals/Extensions.kt b/app/src/main/java/chat/peptide/api/internals/Extensions.kt similarity index 93% rename from app/src/main/java/chat/revolt/api/internals/Extensions.kt rename to app/src/main/java/chat/peptide/api/internals/Extensions.kt index d2034fb5..8a2ba9a4 100644 --- a/app/src/main/java/chat/revolt/api/internals/Extensions.kt +++ b/app/src/main/java/chat/peptide/api/internals/Extensions.kt @@ -1,4 +1,4 @@ -package chat.revolt.api.internals +package chat.peptide.api.internals import android.content.Context import android.content.ContextWrapper diff --git a/app/src/main/java/chat/revolt/api/internals/FriendRequests.kt b/app/src/main/java/chat/peptide/api/internals/FriendRequests.kt similarity index 60% rename from app/src/main/java/chat/revolt/api/internals/FriendRequests.kt rename to app/src/main/java/chat/peptide/api/internals/FriendRequests.kt index dadad4b3..b33ea787 100644 --- a/app/src/main/java/chat/revolt/api/internals/FriendRequests.kt +++ b/app/src/main/java/chat/peptide/api/internals/FriendRequests.kt @@ -1,35 +1,35 @@ -package chat.revolt.api.internals +package chat.peptide.api.internals -import chat.revolt.api.RevoltAPI -import chat.revolt.api.schemas.User +import chat.peptide.api.PeptideAPI +import chat.peptide.api.schemas.User object FriendRequests { fun getIncoming(): List { - return RevoltAPI.userCache.values.filter { user -> + return PeptideAPI.userCache.values.filter { user -> user.relationship == "Incoming" } } fun getOutgoing(): List { - return RevoltAPI.userCache.values.filter { user -> + return PeptideAPI.userCache.values.filter { user -> user.relationship == "Outgoing" } } fun getBlocked(): List { - return RevoltAPI.userCache.values.filter { user -> + return PeptideAPI.userCache.values.filter { user -> user.relationship == "Blocked" } } fun getOnlineFriends(): List { - return RevoltAPI.userCache.values.filter { user -> + return PeptideAPI.userCache.values.filter { user -> user.relationship == "Friend" && user.online == true } } fun getFriends(excludeOnline: Boolean = false): List { - return RevoltAPI.userCache.values.filter { user -> + return PeptideAPI.userCache.values.filter { user -> user.relationship == "Friend" && if (excludeOnline) user.online == false else true } } diff --git a/app/src/main/java/chat/revolt/api/internals/Members.kt b/app/src/main/java/chat/peptide/api/internals/Members.kt similarity index 94% rename from app/src/main/java/chat/revolt/api/internals/Members.kt rename to app/src/main/java/chat/peptide/api/internals/Members.kt index 35903094..a1204a91 100644 --- a/app/src/main/java/chat/revolt/api/internals/Members.kt +++ b/app/src/main/java/chat/peptide/api/internals/Members.kt @@ -1,6 +1,6 @@ -package chat.revolt.api.internals +package chat.peptide.api.internals -import chat.revolt.api.schemas.Member +import chat.peptide.api.schemas.Member class Members { // memberCache (mapping of serverId to userId to member) diff --git a/app/src/main/java/chat/revolt/api/internals/MessageFlag.kt b/app/src/main/java/chat/peptide/api/internals/MessageFlag.kt similarity index 87% rename from app/src/main/java/chat/revolt/api/internals/MessageFlag.kt rename to app/src/main/java/chat/peptide/api/internals/MessageFlag.kt index d4f04445..b2263285 100644 --- a/app/src/main/java/chat/revolt/api/internals/MessageFlag.kt +++ b/app/src/main/java/chat/peptide/api/internals/MessageFlag.kt @@ -1,9 +1,9 @@ -package chat.revolt.api.internals +package chat.peptide.api.internals /** * Flags for messages that can be set to modify their behavior. * - * See [Reference](https://docs.rs/revolt-models/latest/revolt_models/v0/enum.MessageFlags.html) for + * See [Reference](https://docs.rs/peptide-models/latest/peptide_models/v0/enum.MessageFlags.html) for * values * * `shl 0` is not used. diff --git a/app/src/main/java/chat/revolt/api/internals/Permissions.kt b/app/src/main/java/chat/peptide/api/internals/Permissions.kt similarity index 98% rename from app/src/main/java/chat/revolt/api/internals/Permissions.kt rename to app/src/main/java/chat/peptide/api/internals/Permissions.kt index 20ff4d08..704318d7 100644 --- a/app/src/main/java/chat/revolt/api/internals/Permissions.kt +++ b/app/src/main/java/chat/peptide/api/internals/Permissions.kt @@ -1,4 +1,4 @@ -package chat.revolt.api.internals +package chat.peptide.api.internals enum class PermissionBit(val value: Long) { // * Generic permissions diff --git a/app/src/main/java/chat/revolt/api/internals/ResourceLocations.kt b/app/src/main/java/chat/peptide/api/internals/ResourceLocations.kt similarity index 50% rename from app/src/main/java/chat/revolt/api/internals/ResourceLocations.kt rename to app/src/main/java/chat/peptide/api/internals/ResourceLocations.kt index 69dbf3f4..30c7c015 100644 --- a/app/src/main/java/chat/revolt/api/internals/ResourceLocations.kt +++ b/app/src/main/java/chat/peptide/api/internals/ResourceLocations.kt @@ -1,13 +1,13 @@ -package chat.revolt.api.internals +package chat.peptide.api.internals -import chat.revolt.api.RevoltAPI -import chat.revolt.api.api -import chat.revolt.api.schemas.User +import chat.peptide.api.PeptideAPI +import chat.peptide.api.api +import chat.peptide.api.schemas.User object ResourceLocations { fun userAvatarUrl(user: User?): String { if (user?.avatar != null) { - return "${RevoltAPI.getCurrentFilesUrl()}/avatars/${user.avatar.id}" + return "${PeptideAPI.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/internals/Roles.kt b/app/src/main/java/chat/peptide/api/internals/Roles.kt similarity index 79% rename from app/src/main/java/chat/revolt/api/internals/Roles.kt rename to app/src/main/java/chat/peptide/api/internals/Roles.kt index 4c9e5f2e..8ae10245 100644 --- a/app/src/main/java/chat/revolt/api/internals/Roles.kt +++ b/app/src/main/java/chat/peptide/api/internals/Roles.kt @@ -1,13 +1,13 @@ -package chat.revolt.api.internals +package chat.peptide.api.internals -import chat.revolt.api.RevoltAPI -import chat.revolt.api.schemas.Channel -import chat.revolt.api.schemas.ChannelType -import chat.revolt.api.schemas.Member -import chat.revolt.api.schemas.PermissionDescription -import chat.revolt.api.schemas.Role -import chat.revolt.api.schemas.Server -import chat.revolt.api.schemas.User +import chat.peptide.api.PeptideAPI +import chat.peptide.api.schemas.Channel +import chat.peptide.api.schemas.ChannelType +import chat.peptide.api.schemas.Member +import chat.peptide.api.schemas.PermissionDescription +import chat.peptide.api.schemas.Role +import chat.peptide.api.schemas.Server +import chat.peptide.api.schemas.User import kotlinx.datetime.Clock object Roles { @@ -27,8 +27,8 @@ object Roles { withColour: Boolean = false, hoisted: Boolean = false ): Role? { - val server = RevoltAPI.serverCache[serverId] ?: return null - val member = RevoltAPI.members.getMember(serverId, userId) ?: return null + val server = PeptideAPI.serverCache[serverId] ?: return null + val member = PeptideAPI.members.getMember(serverId, userId) ?: return null val roles = member.roles?.map { roleId -> server.roles?.get(roleId) @@ -43,13 +43,13 @@ object Roles { } fun inOrder(serverId: String, predicate: (Role) -> Boolean): List { - val server = RevoltAPI.serverCache[serverId] ?: return emptyList() + val server = PeptideAPI.serverCache[serverId] ?: return emptyList() return server.roles?.values?.filter(predicate)?.sortedBy { it.rank } ?: emptyList() } fun permissionFor(server: Server, member: Member): Long { - val user = RevoltAPI.userCache[member.id?.user] ?: return 0L + val user = PeptideAPI.userCache[member.id?.user] ?: return 0L if (user.privileged == true) return PermissionBit.GrantAllSafe.value if (server.owner == member.id?.user) return PermissionBit.GrantAllSafe.value @@ -71,7 +71,7 @@ object Roles { } // TODO may not be exactly accurate - // See https://github.com/revoltchat/revolt.js/blob/2ba023c879b2a53f9a3cc7042e6721c28dd970ba/src/permissions/calculator.ts#L80-L158 + // See https://github.com/peptidechat/peptide.js/blob/2ba023c879b2a53f9a3cc7042e6721c28dd970ba/src/permissions/calculator.ts#L80-L158 fun permissionFor(channel: Channel, user: User? = null, member: Member? = null): Long { return when (channel.channelType) { ChannelType.SavedMessages -> BitDefaults.SavedMessages @@ -80,13 +80,13 @@ object Roles { ChannelType.Group -> if (channel.owner == user?.id) PermissionBit.GrantAllSafe.value else BitDefaults.DirectMessages ChannelType.TextChannel, ChannelType.VoiceChannel -> { - val server = RevoltAPI.serverCache[channel.server] + val server = PeptideAPI.serverCache[channel.server] // FIXME this is a stupid patch to prevent it from showing "no permission" on a channel on launch ?: return PermissionBit.GrantAllSafe.value if (server.owner == user?.id) return PermissionBit.GrantAllSafe.value - val chMember = member ?: RevoltAPI.members.getMember( + val chMember = member ?: PeptideAPI.members.getMember( server.id ?: return 0L, user?.id ?: return 0L ) ?: return 0L diff --git a/app/src/main/java/chat/revolt/api/internals/SpecialUsers.kt b/app/src/main/java/chat/peptide/api/internals/SpecialUsers.kt similarity index 98% rename from app/src/main/java/chat/revolt/api/internals/SpecialUsers.kt rename to app/src/main/java/chat/peptide/api/internals/SpecialUsers.kt index 5ca9eb88..add1eb78 100644 --- a/app/src/main/java/chat/revolt/api/internals/SpecialUsers.kt +++ b/app/src/main/java/chat/peptide/api/internals/SpecialUsers.kt @@ -1,4 +1,4 @@ -package chat.revolt.api.internals +package chat.peptide.api.internals import android.content.Context import android.graphics.RuntimeShader diff --git a/app/src/main/java/chat/revolt/api/internals/TextViewCompat.kt b/app/src/main/java/chat/peptide/api/internals/TextViewCompat.kt similarity index 98% rename from app/src/main/java/chat/revolt/api/internals/TextViewCompat.kt rename to app/src/main/java/chat/peptide/api/internals/TextViewCompat.kt index 988f196a..f5265132 100644 --- a/app/src/main/java/chat/revolt/api/internals/TextViewCompat.kt +++ b/app/src/main/java/chat/peptide/api/internals/TextViewCompat.kt @@ -1,4 +1,4 @@ -package chat.revolt.api.internals +package chat.peptide.api.internals import android.graphics.LinearGradient import android.graphics.Shader @@ -6,7 +6,7 @@ import android.util.Log import android.widget.TextView import androidx.compose.ui.graphics.toArgb import androidx.core.graphics.toColorInt -import chat.revolt.api.internals.colour.CSSColours +import chat.peptide.api.internals.colour.CSSColours import com.google.android.material.color.MaterialColors import com.google.android.material.elevation.SurfaceColors diff --git a/app/src/main/java/chat/revolt/api/internals/ThemeCompat.kt b/app/src/main/java/chat/peptide/api/internals/ThemeCompat.kt similarity index 98% rename from app/src/main/java/chat/revolt/api/internals/ThemeCompat.kt rename to app/src/main/java/chat/peptide/api/internals/ThemeCompat.kt index 06107cff..d91226f9 100644 --- a/app/src/main/java/chat/revolt/api/internals/ThemeCompat.kt +++ b/app/src/main/java/chat/peptide/api/internals/ThemeCompat.kt @@ -1,4 +1,4 @@ -package chat.revolt.api.internals +package chat.peptide.api.internals import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable @@ -26,7 +26,7 @@ fun Color.asHexJsonPrimitiveString(): JsonPrimitive { object ThemeCompat { @Composable fun materialThemeAsDiscoverTheme(materialTheme: MaterialTheme): JsonObject { - // https://github.com/revoltchat/discover/blob/6effdf4a611e89b38b5e6bccefa1cd999e4b545f/styles/variables.scss + // https://github.com/peptidechat/discover/blob/6effdf4a611e89b38b5e6bccefa1cd999e4b545f/styles/variables.scss return JsonObject( mapOf( "accent" to materialTheme.colorScheme.primary.asHexJsonPrimitiveString(), diff --git a/app/src/main/java/chat/revolt/api/internals/ULID.kt b/app/src/main/java/chat/peptide/api/internals/ULID.kt similarity index 99% rename from app/src/main/java/chat/revolt/api/internals/ULID.kt rename to app/src/main/java/chat/peptide/api/internals/ULID.kt index af6bd303..42fed50d 100644 --- a/app/src/main/java/chat/revolt/api/internals/ULID.kt +++ b/app/src/main/java/chat/peptide/api/internals/ULID.kt @@ -1,4 +1,4 @@ -package chat.revolt.api.internals +package chat.peptide.api.internals import kotlin.experimental.and import kotlin.random.Random diff --git a/app/src/main/java/chat/revolt/api/internals/UserQR.kt b/app/src/main/java/chat/peptide/api/internals/UserQR.kt similarity index 84% rename from app/src/main/java/chat/revolt/api/internals/UserQR.kt rename to app/src/main/java/chat/peptide/api/internals/UserQR.kt index 9c3e21ce..dd473e6f 100644 --- a/app/src/main/java/chat/revolt/api/internals/UserQR.kt +++ b/app/src/main/java/chat/peptide/api/internals/UserQR.kt @@ -1,8 +1,8 @@ -package chat.revolt.api.internals +package chat.peptide.api.internals import androidx.core.net.toUri -import chat.revolt.api.RevoltCbor -import chat.revolt.api.schemas.User +import chat.peptide.api.PeptideCbor +import chat.peptide.api.schemas.User import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.Serializable import kotlin.io.encoding.Base64 @@ -21,8 +21,8 @@ data class UserQRContents( object UserQR { @OptIn(ExperimentalSerializationApi::class, ExperimentalEncodingApi::class) fun contents(user: User): String { - return "https://revolt.chat/qr?" + Base64.encode( - RevoltCbor.encodeToByteArray( + return "https://peptide.chat/qr?" + Base64.encode( + PeptideCbor.encodeToByteArray( UserQRContents.serializer(), UserQRContents( format = "rqr\$user\$0", @@ -45,7 +45,7 @@ object UserQR { val uri = uriString.toUri() val base64 = uri.query ?: return null val decodedBytes = Base64.decode(base64) - RevoltCbor.decodeFromByteArray(UserQRContents.serializer(), decodedBytes) + PeptideCbor.decodeFromByteArray(UserQRContents.serializer(), decodedBytes) } catch (e: Exception) { null } diff --git a/app/src/main/java/chat/revolt/api/internals/colour/CSSColours.kt b/app/src/main/java/chat/peptide/api/internals/colour/CSSColours.kt similarity index 99% rename from app/src/main/java/chat/revolt/api/internals/colour/CSSColours.kt rename to app/src/main/java/chat/peptide/api/internals/colour/CSSColours.kt index 67d3748c..bb18b47d 100644 --- a/app/src/main/java/chat/revolt/api/internals/colour/CSSColours.kt +++ b/app/src/main/java/chat/peptide/api/internals/colour/CSSColours.kt @@ -1,4 +1,4 @@ -package chat.revolt.api.internals.colour +package chat.peptide.api.internals.colour import androidx.compose.ui.graphics.Color diff --git a/app/src/main/java/chat/revolt/api/realtime/RealtimeSocket.kt b/app/src/main/java/chat/peptide/api/realtime/RealtimeSocket.kt similarity index 73% rename from app/src/main/java/chat/revolt/api/realtime/RealtimeSocket.kt rename to app/src/main/java/chat/peptide/api/realtime/RealtimeSocket.kt index 096643e1..828732be 100644 --- a/app/src/main/java/chat/revolt/api/realtime/RealtimeSocket.kt +++ b/app/src/main/java/chat/peptide/api/realtime/RealtimeSocket.kt @@ -1,48 +1,48 @@ -package chat.revolt.api.realtime +package chat.peptide.api.realtime import android.util.Log import androidx.compose.runtime.mutableStateOf -import chat.revolt.RevoltApplication -import chat.revolt.api.RevoltAPI -import chat.revolt.api.RevoltHttp -import chat.revolt.api.RevoltJson -import chat.revolt.api.realtime.frames.receivable.AnyFrame -import chat.revolt.api.realtime.frames.receivable.BulkFrame -import chat.revolt.api.realtime.frames.receivable.ChannelAckFrame -import chat.revolt.api.realtime.frames.receivable.ChannelDeleteFrame -import chat.revolt.api.realtime.frames.receivable.ChannelStartTypingFrame -import chat.revolt.api.realtime.frames.receivable.ChannelStopTypingFrame -import chat.revolt.api.realtime.frames.receivable.ChannelUpdateFrame -import chat.revolt.api.realtime.frames.receivable.MessageAppendFrame -import chat.revolt.api.realtime.frames.receivable.MessageDeleteFrame -import chat.revolt.api.realtime.frames.receivable.MessageFrame -import chat.revolt.api.realtime.frames.receivable.MessageReactFrame -import chat.revolt.api.realtime.frames.receivable.MessageUpdateFrame -import chat.revolt.api.realtime.frames.receivable.PongFrame -import chat.revolt.api.realtime.frames.receivable.ReadyFrame -import chat.revolt.api.realtime.frames.receivable.ServerCreateFrame -import chat.revolt.api.realtime.frames.receivable.ServerDeleteFrame -import chat.revolt.api.realtime.frames.receivable.ServerMemberJoinFrame -import chat.revolt.api.realtime.frames.receivable.ServerMemberLeaveFrame -import chat.revolt.api.realtime.frames.receivable.ServerMemberUpdateFrame -import chat.revolt.api.realtime.frames.receivable.ServerRoleDeleteFrame -import chat.revolt.api.realtime.frames.receivable.ServerRoleUpdateFrame -import chat.revolt.api.realtime.frames.receivable.ServerUpdateFrame -import chat.revolt.api.realtime.frames.receivable.UserRelationshipFrame -import chat.revolt.api.realtime.frames.receivable.UserUpdateFrame -import chat.revolt.api.realtime.frames.sendable.AuthorizationFrame -import chat.revolt.api.realtime.frames.sendable.BeginTypingFrame -import chat.revolt.api.realtime.frames.sendable.EndTypingFrame -import chat.revolt.api.realtime.frames.sendable.PingFrame -import chat.revolt.api.routes.server.fetchMember -import chat.revolt.api.schemas.Channel -import chat.revolt.api.schemas.ChannelType -import chat.revolt.api.schemas.Role -import chat.revolt.api.settings.LoadedSettings -import chat.revolt.api.settings.SyncedSettings -import chat.revolt.c2dm.ChannelRegistrator -import chat.revolt.persistence.Database -import chat.revolt.persistence.SqlStorage +import chat.peptide.PeptideApplication +import chat.peptide.api.PeptideAPI +import chat.peptide.api.PeptideHttp +import chat.peptide.api.PeptideJson +import chat.peptide.api.realtime.frames.receivable.AnyFrame +import chat.peptide.api.realtime.frames.receivable.BulkFrame +import chat.peptide.api.realtime.frames.receivable.ChannelAckFrame +import chat.peptide.api.realtime.frames.receivable.ChannelDeleteFrame +import chat.peptide.api.realtime.frames.receivable.ChannelStartTypingFrame +import chat.peptide.api.realtime.frames.receivable.ChannelStopTypingFrame +import chat.peptide.api.realtime.frames.receivable.ChannelUpdateFrame +import chat.peptide.api.realtime.frames.receivable.MessageAppendFrame +import chat.peptide.api.realtime.frames.receivable.MessageDeleteFrame +import chat.peptide.api.realtime.frames.receivable.MessageFrame +import chat.peptide.api.realtime.frames.receivable.MessageReactFrame +import chat.peptide.api.realtime.frames.receivable.MessageUpdateFrame +import chat.peptide.api.realtime.frames.receivable.PongFrame +import chat.peptide.api.realtime.frames.receivable.ReadyFrame +import chat.peptide.api.realtime.frames.receivable.ServerCreateFrame +import chat.peptide.api.realtime.frames.receivable.ServerDeleteFrame +import chat.peptide.api.realtime.frames.receivable.ServerMemberJoinFrame +import chat.peptide.api.realtime.frames.receivable.ServerMemberLeaveFrame +import chat.peptide.api.realtime.frames.receivable.ServerMemberUpdateFrame +import chat.peptide.api.realtime.frames.receivable.ServerRoleDeleteFrame +import chat.peptide.api.realtime.frames.receivable.ServerRoleUpdateFrame +import chat.peptide.api.realtime.frames.receivable.ServerUpdateFrame +import chat.peptide.api.realtime.frames.receivable.UserRelationshipFrame +import chat.peptide.api.realtime.frames.receivable.UserUpdateFrame +import chat.peptide.api.realtime.frames.sendable.AuthorizationFrame +import chat.peptide.api.realtime.frames.sendable.BeginTypingFrame +import chat.peptide.api.realtime.frames.sendable.EndTypingFrame +import chat.peptide.api.realtime.frames.sendable.PingFrame +import chat.peptide.api.routes.server.fetchMember +import chat.peptide.api.schemas.Channel +import chat.peptide.api.schemas.ChannelType +import chat.peptide.api.schemas.Role +import chat.peptide.api.settings.LoadedSettings +import chat.peptide.api.settings.SyncedSettings +import chat.peptide.c2dm.ChannelRegistrator +import chat.peptide.persistence.Database +import chat.peptide.persistence.SqlStorage import io.ktor.client.plugins.websocket.ws import io.ktor.websocket.CloseReason import io.ktor.websocket.Frame @@ -69,7 +69,7 @@ object RealtimeSocket { var socket: WebSocketSession? = null private val channelRegistrator: ChannelRegistrator - get() = ChannelRegistrator(RevoltApplication.instance) + get() = ChannelRegistrator(PeptideApplication.instance) private var _disconnectionState = mutableStateOf(DisconnectionState.Reconnecting) val disconnectionState: DisconnectionState @@ -87,7 +87,7 @@ object RealtimeSocket { socket?.close(CloseReason(CloseReason.Codes.NORMAL, "Reconnecting to websocket.")) - RevoltHttp.ws(RevoltAPI.getCurrentWebSocketUrl()) { + PeptideHttp.ws(PeptideAPI.getCurrentWebSocketUrl()) { socket = this Log.d("RealtimeSocket", "Connected to websocket.") @@ -97,7 +97,7 @@ object RealtimeSocket { // Send authorization frame val authFrame = AuthorizationFrame("Authenticate", token) val authFrameString = - RevoltJson.encodeToString(AuthorizationFrame.serializer(), authFrame) + PeptideJson.encodeToString(AuthorizationFrame.serializer(), authFrame) Log.d( "RealtimeSocket", @@ -108,13 +108,13 @@ object RealtimeSocket { ) }" ) - send(RevoltJson.encodeToString(AuthorizationFrame.serializer(), authFrame)) + send(PeptideJson.encodeToString(AuthorizationFrame.serializer(), authFrame)) incoming.consumeEach { frame -> if (frame is Frame.Text) { val frameString = frame.readText() val frameType = - RevoltJson.decodeFromString(AnyFrame.serializer(), frameString).type + PeptideJson.decodeFromString(AnyFrame.serializer(), frameString).type handleFrame(frameType, frameString) } @@ -126,29 +126,29 @@ object RealtimeSocket { if (disconnectionState != DisconnectionState.Connected) return val pingPacket = PingFrame("Ping", System.currentTimeMillis()) - socket?.send(RevoltJson.encodeToString(PingFrame.serializer(), pingPacket)) + socket?.send(PeptideJson.encodeToString(PingFrame.serializer(), pingPacket)) Log.d("RealtimeSocket", "Sent ping frame with ${pingPacket.data}") } private suspend fun handleFrame(type: String, rawFrame: String) { when (type) { "Pong" -> { - val pongFrame = RevoltJson.decodeFromString(PongFrame.serializer(), rawFrame) + val pongFrame = PeptideJson.decodeFromString(PongFrame.serializer(), rawFrame) Log.d("RealtimeSocket", "Received pong frame for ${pongFrame.data}") } "Bulk" -> { - val bulkFrame = RevoltJson.decodeFromString(BulkFrame.serializer(), rawFrame) + val bulkFrame = PeptideJson.decodeFromString(BulkFrame.serializer(), rawFrame) Log.d("RealtimeSocket", "Received bulk frame with ${bulkFrame.v.size} sub-frames.") bulkFrame.v.forEach { subFrame -> val subFrameType = - RevoltJson.decodeFromString(AnyFrame.serializer(), subFrame.toString()).type + PeptideJson.decodeFromString(AnyFrame.serializer(), subFrame.toString()).type handleFrame(subFrameType, subFrame.toString()) } } "Ready" -> { - val readyFrame = RevoltJson.decodeFromString(ReadyFrame.serializer(), rawFrame) + val readyFrame = PeptideJson.decodeFromString(ReadyFrame.serializer(), rawFrame) logcat { "Received ready frame with ${readyFrame.users.size} users, " + @@ -160,11 +160,11 @@ object RealtimeSocket { Log.d("RealtimeSocket", "Adding users to cache.") val userMap = readyFrame.users.associateBy { it.id!! } - RevoltAPI.userCache.putAll(userMap) + PeptideAPI.userCache.putAll(userMap) Log.d("RealtimeSocket", "Adding servers to cache.") val serverMap = readyFrame.servers.associateBy { it.id!! } - RevoltAPI.serverCache.putAll(serverMap) + PeptideAPI.serverCache.putAll(serverMap) // Cache servers in persistent local database readyFrame.servers.map { @@ -195,12 +195,12 @@ object RealtimeSocket { "Deleted server $it from local database due to not being in ready frame." ) // Conversely, remove the server from the API state - RevoltAPI.serverCache.remove(it) + PeptideAPI.serverCache.remove(it) } Log.d("RealtimeSocket", "Adding channels to cache.") val channelMap = readyFrame.channels.associateBy { it.id!! } - RevoltAPI.channelCache.putAll(channelMap) + PeptideAPI.channelCache.putAll(channelMap) // Cache channels in persistent local database readyFrame.channels.map { @@ -215,7 +215,7 @@ object RealtimeSocket { it.name, it.owner, it.description, - if (it.channelType == ChannelType.DirectMessage) it.recipients?.firstOrNull { u -> u != RevoltAPI.selfId } else null, + if (it.channelType == ChannelType.DirectMessage) it.recipients?.firstOrNull { u -> u != PeptideAPI.selfId } else null, it.icon?.id, it.lastMessageID, if (it.active == true) 1L else 0L, @@ -236,21 +236,21 @@ object RealtimeSocket { "Deleted channel $it from local database due to not being in ready frame." ) // Conversely, remove the channel from the API state - RevoltAPI.channelCache.remove(it) + PeptideAPI.channelCache.remove(it) } Log.d("RealtimeSocket", "Adding emojis to cache.") val emojiMap = readyFrame.emojis.associateBy { it.id!! } - RevoltAPI.emojiCache.putAll(emojiMap) + PeptideAPI.emojiCache.putAll(emojiMap) Log.d("RealtimeSocket", "Registering push notification channels.") channelRegistrator.register() - RevoltAPI.closeHydration() + PeptideAPI.closeHydration() } "Message" -> { - val messageFrame = RevoltJson.decodeFromString(MessageFrame.serializer(), rawFrame) + val messageFrame = PeptideJson.decodeFromString(MessageFrame.serializer(), rawFrame) Log.d( "RealtimeSocket", "Received message frame for ${messageFrame.id} in channel ${messageFrame.channel}." @@ -261,30 +261,30 @@ object RealtimeSocket { return } - RevoltAPI.messageCache[messageFrame.id] = messageFrame + PeptideAPI.messageCache[messageFrame.id] = messageFrame messageFrame.channel?.let { - if (RevoltAPI.channelCache[it] == null) { + if (PeptideAPI.channelCache[it] == null) { Log.d("RealtimeSocket", "Channel $it not found in cache. Ignoring.") return } - RevoltAPI.channelCache[it] = - RevoltAPI.channelCache[it]!!.copy(lastMessageID = messageFrame.id) + PeptideAPI.channelCache[it] = + PeptideAPI.channelCache[it]!!.copy(lastMessageID = messageFrame.id) - RevoltAPI.wsFrameChannel.send(messageFrame) + PeptideAPI.wsFrameChannel.send(messageFrame) } } "MessageAppend" -> { val messageAppendFrame = - RevoltJson.decodeFromString(MessageAppendFrame.serializer(), rawFrame) + PeptideJson.decodeFromString(MessageAppendFrame.serializer(), rawFrame) Log.d( "RealtimeSocket", "Received message append frame for ${messageAppendFrame.id} in channel ${messageAppendFrame.channel}." ) - var message = RevoltAPI.messageCache[messageAppendFrame.id] + var message = PeptideAPI.messageCache[messageAppendFrame.id] if (message == null) { Log.d( @@ -298,20 +298,20 @@ object RealtimeSocket { message = message!!.copy(embeds = message!!.embeds?.plus(it) ?: it) } - RevoltAPI.messageCache[messageAppendFrame.id] = message!! + PeptideAPI.messageCache[messageAppendFrame.id] = message!! - RevoltAPI.wsFrameChannel.send(messageAppendFrame) + PeptideAPI.wsFrameChannel.send(messageAppendFrame) } "MessageUpdate" -> { val messageUpdateFrame = - RevoltJson.decodeFromString(MessageUpdateFrame.serializer(), rawFrame) + PeptideJson.decodeFromString(MessageUpdateFrame.serializer(), rawFrame) Log.d( "RealtimeSocket", "Received message update frame for ${messageUpdateFrame.id} in channel ${messageUpdateFrame.channel}." ) - val oldMessage = RevoltAPI.messageCache[messageUpdateFrame.id] + val oldMessage = PeptideAPI.messageCache[messageUpdateFrame.id] if (oldMessage == null) { Log.d( "RealtimeSocket", @@ -323,7 +323,7 @@ object RealtimeSocket { val rawMessage: MessageFrame try { rawMessage = - RevoltJson.decodeFromJsonElement( + PeptideJson.decodeFromJsonElement( MessageFrame.serializer(), messageUpdateFrame.data ) @@ -337,28 +337,28 @@ object RealtimeSocket { "Merging message ${messageUpdateFrame.id} with updated partial." ) - RevoltAPI.messageCache[messageUpdateFrame.id] = + PeptideAPI.messageCache[messageUpdateFrame.id] = oldMessage.mergeWithPartial(rawMessage) messageUpdateFrame.channel.let { - if (RevoltAPI.channelCache[it] == null) { + if (PeptideAPI.channelCache[it] == null) { Log.d("RealtimeSocket", "Channel $it not found in cache. Ignoring.") return } } - RevoltAPI.wsFrameChannel.send(messageUpdateFrame) + PeptideAPI.wsFrameChannel.send(messageUpdateFrame) } "MessageDelete" -> { val messageDeleteFrame = - RevoltJson.decodeFromString(MessageDeleteFrame.serializer(), rawFrame) + PeptideJson.decodeFromString(MessageDeleteFrame.serializer(), rawFrame) Log.d( "RealtimeSocket", "Received message react frame for ${messageDeleteFrame.id}." ) - val message = RevoltAPI.messageCache[messageDeleteFrame.id] + val message = PeptideAPI.messageCache[messageDeleteFrame.id] if (message == null) { Log.d( "RealtimeSocket", @@ -367,19 +367,19 @@ object RealtimeSocket { return } - RevoltAPI.messageCache.remove(messageDeleteFrame.id) - RevoltAPI.wsFrameChannel.send(messageDeleteFrame) + PeptideAPI.messageCache.remove(messageDeleteFrame.id) + PeptideAPI.wsFrameChannel.send(messageDeleteFrame) } "MessageReact" -> { val messageReactFrame = - RevoltJson.decodeFromString(MessageReactFrame.serializer(), rawFrame) + PeptideJson.decodeFromString(MessageReactFrame.serializer(), rawFrame) Log.d( "RealtimeSocket", "Received message react frame for ${messageReactFrame.id}." ) - val oldMessage = RevoltAPI.messageCache[messageReactFrame.id] + val oldMessage = PeptideAPI.messageCache[messageReactFrame.id] if (oldMessage == null) { Log.d( "RealtimeSocket", @@ -394,21 +394,21 @@ object RealtimeSocket { forEmoji.add(messageReactFrame.user_id) reactions[messageReactFrame.emoji_id] = forEmoji - RevoltAPI.messageCache[messageReactFrame.id] = + PeptideAPI.messageCache[messageReactFrame.id] = oldMessage.copy(reactions = reactions) - RevoltAPI.wsFrameChannel.send(messageReactFrame) + PeptideAPI.wsFrameChannel.send(messageReactFrame) } "MessageUnreact" -> { val messageUnreactFrame = - RevoltJson.decodeFromString(MessageReactFrame.serializer(), rawFrame) + PeptideJson.decodeFromString(MessageReactFrame.serializer(), rawFrame) Log.d( "RealtimeSocket", "Received message unreact frame for ${messageUnreactFrame.id}." ) - val oldMessage = RevoltAPI.messageCache[messageUnreactFrame.id] + val oldMessage = PeptideAPI.messageCache[messageUnreactFrame.id] if (oldMessage == null) { Log.d( "RealtimeSocket", @@ -428,38 +428,38 @@ object RealtimeSocket { reactions[messageUnreactFrame.emoji_id] = forEmoji } - RevoltAPI.messageCache[messageUnreactFrame.id] = + PeptideAPI.messageCache[messageUnreactFrame.id] = oldMessage.copy(reactions = reactions) - RevoltAPI.wsFrameChannel.send(messageUnreactFrame) + PeptideAPI.wsFrameChannel.send(messageUnreactFrame) } "UserUpdate" -> { val userUpdateFrame = - RevoltJson.decodeFromString(UserUpdateFrame.serializer(), rawFrame) + PeptideJson.decodeFromString(UserUpdateFrame.serializer(), rawFrame) - val existing = RevoltAPI.userCache[userUpdateFrame.id] + val existing = PeptideAPI.userCache[userUpdateFrame.id] ?: return // if we don't have the user no point in updating it if (userUpdateFrame.clear != null) { if (userUpdateFrame.clear.contains("Avatar")) { - RevoltAPI.userCache[userUpdateFrame.id] = + PeptideAPI.userCache[userUpdateFrame.id] = existing.copy(avatar = null) } } - RevoltAPI.userCache[userUpdateFrame.id] = + PeptideAPI.userCache[userUpdateFrame.id] = existing.mergeWithPartial(userUpdateFrame.data) } "UserRelationship" -> { val userRelationshipFrame = - RevoltJson.decodeFromString(UserRelationshipFrame.serializer(), rawFrame) + PeptideJson.decodeFromString(UserRelationshipFrame.serializer(), rawFrame) - val existing = RevoltAPI.userCache[userRelationshipFrame.user.id] + val existing = PeptideAPI.userCache[userRelationshipFrame.user.id] if (existing == null && userRelationshipFrame.user.id != null) { - RevoltAPI.userCache[userRelationshipFrame.user.id] = + PeptideAPI.userCache[userRelationshipFrame.user.id] = userRelationshipFrame.user.copy( relationship = userRelationshipFrame.status ?: "None" ) @@ -467,7 +467,7 @@ object RealtimeSocket { val merged = existing.mergeWithPartial(userRelationshipFrame.user).copy( relationship = userRelationshipFrame.status ?: "None" ) - RevoltAPI.userCache[userRelationshipFrame.user.id] = merged + PeptideAPI.userCache[userRelationshipFrame.user.id] = merged } else { Log.w("RealtimeSocket", "Invalid UserRelationship frame: $rawFrame") } @@ -475,13 +475,13 @@ object RealtimeSocket { "ChannelUpdate" -> { val channelUpdateFrame = - RevoltJson.decodeFromString(ChannelUpdateFrame.serializer(), rawFrame) + PeptideJson.decodeFromString(ChannelUpdateFrame.serializer(), rawFrame) - val existing = RevoltAPI.channelCache[channelUpdateFrame.id] + val existing = PeptideAPI.channelCache[channelUpdateFrame.id] ?: return // if we don't have the channel no point in updating it val combined = existing.mergeWithPartial(channelUpdateFrame.data) - RevoltAPI.channelCache[channelUpdateFrame.id] = combined + PeptideAPI.channelCache[channelUpdateFrame.id] = combined database.channelQueries.upsert( channelUpdateFrame.id, @@ -490,7 +490,7 @@ object RealtimeSocket { combined.name, combined.owner, combined.description, - if (combined.channelType == ChannelType.DirectMessage) combined.recipients?.firstOrNull { u -> u != RevoltAPI.selfId } else null, + if (combined.channelType == ChannelType.DirectMessage) combined.recipients?.firstOrNull { u -> u != PeptideAPI.selfId } else null, combined.icon?.id, combined.lastMessageID, if (combined.active == true) 1L else 0L, @@ -501,14 +501,14 @@ object RealtimeSocket { "ChannelCreate" -> { val channelCreateFrame = - RevoltJson.decodeFromString(Channel.serializer(), rawFrame) + PeptideJson.decodeFromString(Channel.serializer(), rawFrame) Log.d( "RealtimeSocket", "Received channel create frame for ${channelCreateFrame.id}, with name ${channelCreateFrame.name}. Adding to cache." ) - RevoltAPI.channelCache[channelCreateFrame.id!!] = channelCreateFrame + PeptideAPI.channelCache[channelCreateFrame.id!!] = channelCreateFrame database.channelQueries.upsert( channelCreateFrame.id, channelCreateFrame.channelType?.value ?: ChannelType.TextChannel.value, @@ -516,7 +516,7 @@ object RealtimeSocket { channelCreateFrame.name, channelCreateFrame.owner, channelCreateFrame.description, - if (channelCreateFrame.channelType == ChannelType.DirectMessage) channelCreateFrame.recipients?.firstOrNull { u -> u != RevoltAPI.selfId } else null, + if (channelCreateFrame.channelType == ChannelType.DirectMessage) channelCreateFrame.recipients?.firstOrNull { u -> u != PeptideAPI.selfId } else null, channelCreateFrame.icon?.id, channelCreateFrame.lastMessageID, if (channelCreateFrame.active == true) 1L else 0L, @@ -527,13 +527,13 @@ object RealtimeSocket { "ChannelDelete" -> { val channelDeleteFrame = - RevoltJson.decodeFromString(ChannelDeleteFrame.serializer(), rawFrame) + PeptideJson.decodeFromString(ChannelDeleteFrame.serializer(), rawFrame) Log.d( "RealtimeSocket", "Received channel delete frame for ${channelDeleteFrame.id}. Removing from cache." ) - val currentChannel = RevoltAPI.channelCache[channelDeleteFrame.id] + val currentChannel = PeptideAPI.channelCache[channelDeleteFrame.id] if (currentChannel == null) { Log.d( "RealtimeSocket", @@ -542,11 +542,11 @@ object RealtimeSocket { return } - RevoltAPI.channelCache.remove(channelDeleteFrame.id) + PeptideAPI.channelCache.remove(channelDeleteFrame.id) database.channelQueries.delete(channelDeleteFrame.id) if (currentChannel.server != null) { - val existingServer = RevoltAPI.serverCache[currentChannel.server] + val existingServer = PeptideAPI.serverCache[currentChannel.server] if (existingServer == null) { Log.d( @@ -556,39 +556,39 @@ object RealtimeSocket { return } - RevoltAPI.serverCache[currentChannel.server] = existingServer.copy( + PeptideAPI.serverCache[currentChannel.server] = existingServer.copy( channels = existingServer.channels?.filter { it != channelDeleteFrame.id } ?: emptyList() ) } - RevoltAPI.wsFrameChannel.send(channelDeleteFrame) + PeptideAPI.wsFrameChannel.send(channelDeleteFrame) } "ChannelAck" -> { val channelAckFrame = - RevoltJson.decodeFromString(ChannelAckFrame.serializer(), rawFrame) + PeptideJson.decodeFromString(ChannelAckFrame.serializer(), rawFrame) Log.d( "RealtimeSocket", "Received channel ack frame for ${channelAckFrame.id} with new newest ${channelAckFrame.messageId}." ) - RevoltAPI.unreads.processExternalAck(channelAckFrame.id, channelAckFrame.messageId) + PeptideAPI.unreads.processExternalAck(channelAckFrame.id, channelAckFrame.messageId) } "ServerCreate" -> { val serverCreateFrame = - RevoltJson.decodeFromString(ServerCreateFrame.serializer(), rawFrame) + PeptideJson.decodeFromString(ServerCreateFrame.serializer(), rawFrame) Log.d( "RealtimeSocket", "Received server create frame for ${serverCreateFrame.id}, with name ${serverCreateFrame.server.name}. Adding to cache." ) - RevoltAPI.serverCache[serverCreateFrame.id] = serverCreateFrame.server + PeptideAPI.serverCache[serverCreateFrame.id] = serverCreateFrame.server serverCreateFrame.channels.forEach { channel -> if (channel.id == null) return@forEach - RevoltAPI.channelCache[channel.id] = channel + PeptideAPI.channelCache[channel.id] = channel } if (serverCreateFrame.server.owner != null && serverCreateFrame.server.name != null) { @@ -606,35 +606,35 @@ object RealtimeSocket { "ChannelStartTyping" -> { val channelStartTypingFrame = - RevoltJson.decodeFromString(ChannelStartTypingFrame.serializer(), rawFrame) + PeptideJson.decodeFromString(ChannelStartTypingFrame.serializer(), rawFrame) Log.d( "RealtimeSocket", "Received channel start typing frame for ${channelStartTypingFrame.id}." ) - RevoltAPI.wsFrameChannel.send(channelStartTypingFrame) + PeptideAPI.wsFrameChannel.send(channelStartTypingFrame) } "ChannelStopTyping" -> { val channelStopTypingFrame = - RevoltJson.decodeFromString(ChannelStopTypingFrame.serializer(), rawFrame) + PeptideJson.decodeFromString(ChannelStopTypingFrame.serializer(), rawFrame) Log.d( "RealtimeSocket", "Received channel stop typing frame for ${channelStopTypingFrame.id}." ) - RevoltAPI.wsFrameChannel.send(channelStopTypingFrame) + PeptideAPI.wsFrameChannel.send(channelStopTypingFrame) } "ServerUpdate" -> { val serverUpdateFrame = - RevoltJson.decodeFromString(ServerUpdateFrame.serializer(), rawFrame) + PeptideJson.decodeFromString(ServerUpdateFrame.serializer(), rawFrame) Log.d( "RealtimeSocket", "Received server update frame for ${serverUpdateFrame.id}." ) - val existing = RevoltAPI.serverCache[serverUpdateFrame.id] + val existing = PeptideAPI.serverCache[serverUpdateFrame.id] ?: return // if we don't have the server no point in updating it var updated = @@ -649,7 +649,7 @@ object RealtimeSocket { } } - RevoltAPI.serverCache[serverUpdateFrame.id] = updated + PeptideAPI.serverCache[serverUpdateFrame.id] = updated if (updated.id != null && updated.owner != null && updated.name != null) { try { @@ -670,25 +670,25 @@ object RealtimeSocket { "ServerDelete" -> { val serverDeleteFrame = - RevoltJson.decodeFromString(ServerDeleteFrame.serializer(), rawFrame) + PeptideJson.decodeFromString(ServerDeleteFrame.serializer(), rawFrame) Log.d( "RealtimeSocket", "Received server delete frame for ${serverDeleteFrame.id}." ) - RevoltAPI.serverCache.remove(serverDeleteFrame.id) + PeptideAPI.serverCache.remove(serverDeleteFrame.id) database.serverQueries.delete(serverDeleteFrame.id) } "ServerMemberUpdate" -> { val serverMemberUpdateFrame = - RevoltJson.decodeFromString(ServerMemberUpdateFrame.serializer(), rawFrame) + PeptideJson.decodeFromString(ServerMemberUpdateFrame.serializer(), rawFrame) Log.d( "RealtimeSocket", "Received server member update frame for ${serverMemberUpdateFrame.id.user} in ${serverMemberUpdateFrame.id.server}." ) - val existing = RevoltAPI.members.getMember( + val existing = PeptideAPI.members.getMember( serverMemberUpdateFrame.id.server, serverMemberUpdateFrame.id.user ) @@ -706,12 +706,12 @@ object RealtimeSocket { Log.d("RealtimeSocket", "Updated member: $updated") - RevoltAPI.members.setMember(serverMemberUpdateFrame.id.server, updated) + PeptideAPI.members.setMember(serverMemberUpdateFrame.id.server, updated) } "ServerMemberJoin" -> { val serverMemberJoinFrame = - RevoltJson.decodeFromString(ServerMemberJoinFrame.serializer(), rawFrame) + PeptideJson.decodeFromString(ServerMemberJoinFrame.serializer(), rawFrame) Log.d( "RealtimeSocket", "Received server member join frame for ${serverMemberJoinFrame.user} in ${serverMemberJoinFrame.id}." @@ -719,18 +719,18 @@ object RealtimeSocket { val member = fetchMember(serverMemberJoinFrame.id, serverMemberJoinFrame.user) - RevoltAPI.members.setMember(serverMemberJoinFrame.id, member) + PeptideAPI.members.setMember(serverMemberJoinFrame.id, member) } "ServerMemberLeave" -> { val serverMemberLeaveFrame = - RevoltJson.decodeFromString(ServerMemberLeaveFrame.serializer(), rawFrame) + PeptideJson.decodeFromString(ServerMemberLeaveFrame.serializer(), rawFrame) Log.d( "RealtimeSocket", "Received server member leave frame for ${serverMemberLeaveFrame.user} in ${serverMemberLeaveFrame.id}." ) - RevoltAPI.members.removeMember( + PeptideAPI.members.removeMember( serverMemberLeaveFrame.id, serverMemberLeaveFrame.user ) @@ -738,13 +738,13 @@ object RealtimeSocket { "ServerRoleUpdate" -> { val serverRoleUpdateFrame = - RevoltJson.decodeFromString(ServerRoleUpdateFrame.serializer(), rawFrame) + PeptideJson.decodeFromString(ServerRoleUpdateFrame.serializer(), rawFrame) Log.d( "RealtimeSocket", "Received server role update frame for ${serverRoleUpdateFrame.id}." ) - val server = RevoltAPI.serverCache[serverRoleUpdateFrame.id] + val server = PeptideAPI.serverCache[serverRoleUpdateFrame.id] if (server == null) { Log.d( "RealtimeSocket", @@ -766,7 +766,7 @@ object RealtimeSocket { Pair(serverRoleUpdateFrame.roleId, newRole) ) ?: mapOf(serverRoleUpdateFrame.roleId to newRole) ) - RevoltAPI.serverCache[serverRoleUpdateFrame.id] = newServer + PeptideAPI.serverCache[serverRoleUpdateFrame.id] = newServer } else { // True role update. Log.d( @@ -779,19 +779,19 @@ object RealtimeSocket { Pair(serverRoleUpdateFrame.roleId, updatedRole) ) ) - RevoltAPI.serverCache[serverRoleUpdateFrame.id] = newServer + PeptideAPI.serverCache[serverRoleUpdateFrame.id] = newServer } } "ServerRoleDelete" -> { val serverRoleDeleteFrame = - RevoltJson.decodeFromString(ServerRoleDeleteFrame.serializer(), rawFrame) + PeptideJson.decodeFromString(ServerRoleDeleteFrame.serializer(), rawFrame) Log.d( "RealtimeSocket", "Received server role delete frame for ${serverRoleDeleteFrame.id} and role ${serverRoleDeleteFrame.roleId}." ) - val server = RevoltAPI.serverCache[serverRoleDeleteFrame.id] + val server = PeptideAPI.serverCache[serverRoleDeleteFrame.id] if (server == null) { Log.d( "RealtimeSocket", @@ -803,7 +803,7 @@ object RealtimeSocket { val newRoles = server.roles?.toMutableMap() ?: mutableMapOf() newRoles.remove(serverRoleDeleteFrame.roleId) - RevoltAPI.serverCache[serverRoleDeleteFrame.id] = + PeptideAPI.serverCache[serverRoleDeleteFrame.id] = server.copy(roles = newRoles) } @@ -819,7 +819,7 @@ object RealtimeSocket { } private suspend fun pushReconnectEvent() { - RevoltAPI.wsFrameChannel.send(RealtimeSocketFrames.Reconnected) + PeptideAPI.wsFrameChannel.send(RealtimeSocketFrames.Reconnected) } suspend fun beginTyping(channelId: String) { @@ -827,7 +827,7 @@ object RealtimeSocket { val beginTypingFrame = BeginTypingFrame("BeginTyping", channelId) socket?.send( - RevoltJson.encodeToString( + PeptideJson.encodeToString( BeginTypingFrame.serializer(), beginTypingFrame ) @@ -839,7 +839,7 @@ object RealtimeSocket { val endTypingFrame = EndTypingFrame("EndTyping", channelId) socket?.send( - RevoltJson.encodeToString( + PeptideJson.encodeToString( EndTypingFrame.serializer(), endTypingFrame ) diff --git a/app/src/main/java/chat/revolt/api/realtime/frames/receivable/ReceivableFrames.kt b/app/src/main/java/chat/peptide/api/realtime/frames/receivable/ReceivableFrames.kt similarity index 91% rename from app/src/main/java/chat/revolt/api/realtime/frames/receivable/ReceivableFrames.kt rename to app/src/main/java/chat/peptide/api/realtime/frames/receivable/ReceivableFrames.kt index a6d7dbdc..1a878889 100644 --- a/app/src/main/java/chat/revolt/api/realtime/frames/receivable/ReceivableFrames.kt +++ b/app/src/main/java/chat/peptide/api/realtime/frames/receivable/ReceivableFrames.kt @@ -1,15 +1,15 @@ -package chat.revolt.api.realtime.frames.receivable +package chat.peptide.api.realtime.frames.receivable -import chat.revolt.api.schemas.Channel -import chat.revolt.api.schemas.ChannelVoiceState -import chat.revolt.api.schemas.Embed -import chat.revolt.api.schemas.Emoji -import chat.revolt.api.schemas.Member -import chat.revolt.api.schemas.Message -import chat.revolt.api.schemas.Role -import chat.revolt.api.schemas.Server -import chat.revolt.api.schemas.ServerUserChoice -import chat.revolt.api.schemas.User +import chat.peptide.api.schemas.Channel +import chat.peptide.api.schemas.ChannelVoiceState +import chat.peptide.api.schemas.Embed +import chat.peptide.api.schemas.Emoji +import chat.peptide.api.schemas.Member +import chat.peptide.api.schemas.Message +import chat.peptide.api.schemas.Role +import chat.peptide.api.schemas.Server +import chat.peptide.api.schemas.ServerUserChoice +import chat.peptide.api.schemas.User import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import kotlinx.serialization.json.JsonObject diff --git a/app/src/main/java/chat/revolt/api/realtime/frames/sendable/SendableFrames.kt b/app/src/main/java/chat/peptide/api/realtime/frames/sendable/SendableFrames.kt similarity index 88% rename from app/src/main/java/chat/revolt/api/realtime/frames/sendable/SendableFrames.kt rename to app/src/main/java/chat/peptide/api/realtime/frames/sendable/SendableFrames.kt index 527f01ca..72be1e90 100644 --- a/app/src/main/java/chat/revolt/api/realtime/frames/sendable/SendableFrames.kt +++ b/app/src/main/java/chat/peptide/api/realtime/frames/sendable/SendableFrames.kt @@ -1,4 +1,4 @@ -package chat.revolt.api.realtime.frames.sendable +package chat.peptide.api.realtime.frames.sendable import kotlinx.serialization.Serializable diff --git a/app/src/main/java/chat/revolt/api/routes/account/Login.kt b/app/src/main/java/chat/peptide/api/routes/account/Login.kt similarity index 72% rename from app/src/main/java/chat/revolt/api/routes/account/Login.kt rename to app/src/main/java/chat/peptide/api/routes/account/Login.kt index 2b391482..3c56c7ae 100644 --- a/app/src/main/java/chat/revolt/api/routes/account/Login.kt +++ b/app/src/main/java/chat/peptide/api/routes/account/Login.kt @@ -1,11 +1,11 @@ -package chat.revolt.api.routes.account +package chat.peptide.api.routes.account import android.os.Build import android.util.Log -import chat.revolt.api.RevoltError -import chat.revolt.api.RevoltHttp -import chat.revolt.api.RevoltJson -import chat.revolt.api.api +import chat.peptide.api.PeptideError +import chat.peptide.api.PeptideHttp +import chat.peptide.api.PeptideJson +import chat.peptide.api.api import io.ktor.client.request.post import io.ktor.client.request.setBody import io.ktor.client.statement.HttpResponse @@ -104,22 +104,22 @@ data class EmailPasswordAssessment( val proceedMfa: Boolean = false, val mfaSpec: MfaLoginSpec? = null, val firstUserHints: UserHints? = null, - val error: RevoltError? = null + val error: PeptideError? = null ) suspend fun negotiateAuthentication(email: String, password: String): EmailPasswordAssessment { val sessionName = friendlySessionName() - val response: HttpResponse = RevoltHttp.post("/auth/session/login".api()) { + val response: HttpResponse = PeptideHttp.post("/auth/session/login".api()) { contentType(ContentType.Application.Json) setBody(LoginNegotiation(email, password, sessionName, null)) } val responseContent = response.bodyAsText() - Log.d("Revolt", "negotiateAuthentication: $responseContent") + Log.d("Peptide", "negotiateAuthentication: $responseContent") try { - val error = RevoltJson.decodeFromString(RevoltError.serializer(), responseContent) + val error = PeptideJson.decodeFromString(PeptideError.serializer(), responseContent) return EmailPasswordAssessment(error = error) } catch (e: SerializationException) { // Not an error @@ -127,22 +127,22 @@ suspend fun negotiateAuthentication(email: String, password: String): EmailPassw if (response.status == HttpStatusCode.InternalServerError) { return EmailPasswordAssessment( - error = RevoltError( + error = PeptideError( "InternalServerError" ) ) } - val responseJson = RevoltJson.decodeFromString(MfaCheck.serializer(), responseContent) + val responseJson = PeptideJson.decodeFromString(MfaCheck.serializer(), responseContent) return when (responseJson.result) { "Success" -> EmailPasswordAssessment( - firstUserHints = RevoltJson.decodeFromString(UserHints.serializer(), responseContent) + firstUserHints = PeptideJson.decodeFromString(UserHints.serializer(), responseContent) ) "MFA" -> EmailPasswordAssessment( proceedMfa = true, - mfaSpec = RevoltJson.decodeFromString(MfaLoginSpec.serializer(), responseContent) + mfaSpec = PeptideJson.decodeFromString(MfaLoginSpec.serializer(), responseContent) ) else -> throw Exception("Unknown result: ${responseJson.result}") @@ -153,23 +153,23 @@ suspend fun authenticateWithMfaTotpCode( mfaTicket: String, mfaResponse: MfaResponseTotpCode ): EmailPasswordAssessment { - val response: HttpResponse = RevoltHttp.post("/auth/session/login".api()) { + val response: HttpResponse = PeptideHttp.post("/auth/session/login".api()) { contentType(ContentType.Application.Json) setBody(LoginMfaAmendmentTotpCode(mfaTicket, mfaResponse, friendlySessionName())) } try { - val error = RevoltJson.decodeFromString(RevoltError.serializer(), response.bodyAsText()) + val error = PeptideJson.decodeFromString(PeptideError.serializer(), response.bodyAsText()) return EmailPasswordAssessment(error = error) } catch (e: SerializationException) { // Not an error } val responseContent = response.bodyAsText() - Log.d("Revolt", "authenticateWithMfaTotpCode: $responseContent") + Log.d("Peptide", "authenticateWithMfaTotpCode: $responseContent") return EmailPasswordAssessment( - firstUserHints = RevoltJson.decodeFromString(UserHints.serializer(), responseContent) + firstUserHints = PeptideJson.decodeFromString(UserHints.serializer(), responseContent) ) } @@ -177,26 +177,26 @@ suspend fun authenticateWithMfaRecoveryCode( mfaTicket: String, mfaResponse: MfaResponseRecoveryCode ): EmailPasswordAssessment { - val response: HttpResponse = RevoltHttp.post("/auth/session/login".api()) { + val response: HttpResponse = PeptideHttp.post("/auth/session/login".api()) { contentType(ContentType.Application.Json) setBody(LoginMfaAmendmentRecoveryCode(mfaTicket, mfaResponse, friendlySessionName())) } try { - val error = RevoltJson.decodeFromString(RevoltError.serializer(), response.bodyAsText()) + val error = PeptideJson.decodeFromString(PeptideError.serializer(), response.bodyAsText()) return EmailPasswordAssessment(error = error) } catch (e: SerializationException) { // Not an error } val responseContent = response.bodyAsText() - Log.d("Revolt", "authenticateWithMfaRecoveryCode: $responseContent") + Log.d("Peptide", "authenticateWithMfaRecoveryCode: $responseContent") return EmailPasswordAssessment( - firstUserHints = RevoltJson.decodeFromString(UserHints.serializer(), responseContent) + firstUserHints = PeptideJson.decodeFromString(UserHints.serializer(), responseContent) ) } fun friendlySessionName(): String { - return "Revolt Android on ${Build.MANUFACTURER} ${Build.MODEL}" + return "Peptide Android on ${Build.MANUFACTURER} ${Build.MODEL}" } diff --git a/app/src/main/java/chat/revolt/api/routes/account/Register.kt b/app/src/main/java/chat/peptide/api/routes/account/Register.kt similarity index 60% rename from app/src/main/java/chat/revolt/api/routes/account/Register.kt rename to app/src/main/java/chat/peptide/api/routes/account/Register.kt index 57bd3056..077b7e47 100644 --- a/app/src/main/java/chat/revolt/api/routes/account/Register.kt +++ b/app/src/main/java/chat/peptide/api/routes/account/Register.kt @@ -1,10 +1,10 @@ -package chat.revolt.api.routes.account +package chat.peptide.api.routes.account -import chat.revolt.api.RevoltError -import chat.revolt.api.RevoltHttp -import chat.revolt.api.RevoltJson -import chat.revolt.api.schemas.RsResult -import chat.revolt.api.api +import chat.peptide.api.PeptideError +import chat.peptide.api.PeptideHttp +import chat.peptide.api.PeptideJson +import chat.peptide.api.schemas.RsResult +import chat.peptide.api.api import io.ktor.client.request.post import io.ktor.client.request.setBody import io.ktor.client.statement.bodyAsText @@ -21,8 +21,8 @@ data class RegistrationBody( val captcha: String ) -suspend fun register(body: RegistrationBody): RsResult { - val response = RevoltHttp.post("/auth/account/create".api()) { +suspend fun register(body: RegistrationBody): RsResult { + val response = PeptideHttp.post("/auth/account/create".api()) { setBody(body) contentType(ContentType.Application.Json) } @@ -30,7 +30,7 @@ suspend fun register(body: RegistrationBody): RsResult { val responseContent = response.bodyAsText() try { - val error = RevoltJson.decodeFromString(RevoltError.serializer(), responseContent) + val error = PeptideJson.decodeFromString(PeptideError.serializer(), responseContent) return RsResult.err(error) } catch (e: SerializationException) { // Not an error diff --git a/app/src/main/java/chat/revolt/api/routes/auth/Sessions.kt b/app/src/main/java/chat/peptide/api/routes/auth/Sessions.kt similarity index 57% rename from app/src/main/java/chat/revolt/api/routes/auth/Sessions.kt rename to app/src/main/java/chat/peptide/api/routes/auth/Sessions.kt index 6da806ee..1920cf4c 100644 --- a/app/src/main/java/chat/revolt/api/routes/auth/Sessions.kt +++ b/app/src/main/java/chat/peptide/api/routes/auth/Sessions.kt @@ -1,9 +1,9 @@ -package chat.revolt.api.routes.auth +package chat.peptide.api.routes.auth -import chat.revolt.api.RevoltHttp -import chat.revolt.api.RevoltJson -import chat.revolt.api.api -import chat.revolt.api.schemas.Session +import chat.peptide.api.PeptideHttp +import chat.peptide.api.PeptideJson +import chat.peptide.api.api +import chat.peptide.api.schemas.Session import io.ktor.client.request.delete import io.ktor.client.request.get import io.ktor.client.request.parameter @@ -11,21 +11,21 @@ import io.ktor.client.statement.bodyAsText import kotlinx.serialization.builtins.ListSerializer suspend fun fetchAllSessions(): List { - val response = RevoltHttp.get("/auth/session/all".api()) + val response = PeptideHttp.get("/auth/session/all".api()) .bodyAsText() - return RevoltJson.decodeFromString( + return PeptideJson.decodeFromString( ListSerializer(Session.serializer()), response ) } suspend fun logoutSessionById(id: String) { - RevoltHttp.delete("/auth/session/$id".api()) + PeptideHttp.delete("/auth/session/$id".api()) } suspend fun logoutAllSessions(includingSelf: Boolean = false) { - RevoltHttp.delete("/auth/session/all".api()) { + PeptideHttp.delete("/auth/session/all".api()) { parameter("revoke_self", includingSelf) } } diff --git a/app/src/main/java/chat/revolt/api/routes/channel/Channel.kt b/app/src/main/java/chat/peptide/api/routes/channel/Channel.kt similarity index 67% rename from app/src/main/java/chat/revolt/api/routes/channel/Channel.kt rename to app/src/main/java/chat/peptide/api/routes/channel/Channel.kt index 73d495df..3b4cb21e 100644 --- a/app/src/main/java/chat/revolt/api/routes/channel/Channel.kt +++ b/app/src/main/java/chat/peptide/api/routes/channel/Channel.kt @@ -1,15 +1,15 @@ -package chat.revolt.api.routes.channel +package chat.peptide.api.routes.channel -import chat.revolt.api.RevoltAPI -import chat.revolt.api.RevoltError -import chat.revolt.api.RevoltHttp -import chat.revolt.api.RevoltJson -import chat.revolt.api.api -import chat.revolt.api.internals.ULID -import chat.revolt.api.schemas.Channel -import chat.revolt.api.schemas.Message -import chat.revolt.api.schemas.MessagesInChannel -import chat.revolt.api.schemas.User +import chat.peptide.api.PeptideAPI +import chat.peptide.api.PeptideError +import chat.peptide.api.PeptideHttp +import chat.peptide.api.PeptideJson +import chat.peptide.api.api +import chat.peptide.api.internals.ULID +import chat.peptide.api.schemas.Channel +import chat.peptide.api.schemas.Message +import chat.peptide.api.schemas.MessagesInChannel +import chat.peptide.api.schemas.User import io.ktor.client.request.delete import io.ktor.client.request.get import io.ktor.client.request.header @@ -37,7 +37,7 @@ suspend fun fetchMessagesFromChannel( nearby: String? = null, sort: String? = null ): MessagesInChannel { - val response = RevoltHttp.get("/channels/$channelId/messages".api()) { + val response = PeptideHttp.get("/channels/$channelId/messages".api()) { parameter("limit", limit) parameter("include_users", includeUsers) @@ -49,12 +49,12 @@ suspend fun fetchMessagesFromChannel( .bodyAsText() if (includeUsers) { - return RevoltJson.decodeFromString( + return PeptideJson.decodeFromString( MessagesInChannel.serializer(), response ) } else { - val messages = RevoltJson.decodeFromString( + val messages = PeptideJson.decodeFromString( ListSerializer(Message.serializer()), response ) @@ -104,7 +104,7 @@ suspend fun sendMessage( attachments: List? = null, idempotencyKey: String = ULID.makeNext() ): String { - val response = RevoltHttp.post("/channels/$channelId/messages".api()) { + val response = PeptideHttp.post("/channels/$channelId/messages".api()) { contentType(ContentType.Application.Json) setBody( SendMessageBody( @@ -122,7 +122,7 @@ suspend fun sendMessage( } suspend fun editMessage(channelId: String, messageId: String, newContent: String? = null) { - val response = RevoltHttp.patch("/channels/$channelId/messages/$messageId".api()) { + val response = PeptideHttp.patch("/channels/$channelId/messages/$messageId".api()) { contentType(ContentType.Application.Json) setBody( EditMessageBody( @@ -133,7 +133,7 @@ suspend fun editMessage(channelId: String, messageId: String, newContent: String .bodyAsText() try { - val error = RevoltJson.decodeFromString(RevoltError.serializer(), response) + val error = PeptideJson.decodeFromString(PeptideError.serializer(), response) throw Error(error.type) } catch (e: SerializationException) { // Not an error @@ -141,55 +141,55 @@ suspend fun editMessage(channelId: String, messageId: String, newContent: String } suspend fun deleteMessage(channelId: String, messageId: String) { - RevoltHttp.delete("/channels/$channelId/messages/$messageId".api()) + PeptideHttp.delete("/channels/$channelId/messages/$messageId".api()) } suspend fun ackChannel(channelId: String, messageId: String = ULID.makeNext()) { - RevoltHttp.put("/channels/$channelId/ack/$messageId".api()) + PeptideHttp.put("/channels/$channelId/ack/$messageId".api()) } suspend fun fetchSingleChannel(channelId: String): Channel { - val response = RevoltHttp.get("/channels/$channelId".api()) + val response = PeptideHttp.get("/channels/$channelId".api()) .bodyAsText() - return RevoltJson.decodeFromString( + return PeptideJson.decodeFromString( Channel.serializer(), response ) } suspend fun fetchGroupParticipants(channelId: String): List { - val response = RevoltHttp.get("/channels/$channelId/members".api()) + val response = PeptideHttp.get("/channels/$channelId/members".api()) .bodyAsText() - return RevoltJson.decodeFromString( + return PeptideJson.decodeFromString( ListSerializer(User.serializer()), response ) } suspend fun createInvite(channelId: String): CreateInviteResponse { - val response = RevoltHttp.post("/channels/$channelId/invites".api()) + val response = PeptideHttp.post("/channels/$channelId/invites".api()) .bodyAsText() - val error = RevoltJson.decodeFromString(RevoltError.serializer(), response) + val error = PeptideJson.decodeFromString(PeptideError.serializer(), response) if (error.type != "Server") throw Error(error.type) - return RevoltJson.decodeFromString(CreateInviteResponse.serializer(), response) + return PeptideJson.decodeFromString(CreateInviteResponse.serializer(), response) } suspend fun fetchSingleMessage(channelId: String, messageId: String): Message { - val response = RevoltHttp.get("/channels/$channelId/messages/$messageId".api()) + val response = PeptideHttp.get("/channels/$channelId/messages/$messageId".api()) .bodyAsText() - return RevoltJson.decodeFromString( + return PeptideJson.decodeFromString( Message.serializer(), response ) } suspend fun leaveDeleteOrCloseChannel(channelId: String, leaveSilently: Boolean = false) { - RevoltHttp.delete("/channels/$channelId".api()) { + PeptideHttp.delete("/channels/$channelId".api()) { parameter("leave_silently", leaveSilently) } } @@ -207,33 +207,33 @@ suspend fun patchChannel( val body = mutableMapOf() if (name != null) { - body["name"] = RevoltJson.encodeToJsonElement(String.serializer(), name) + body["name"] = PeptideJson.encodeToJsonElement(String.serializer(), name) } if (description != null) { - body["description"] = RevoltJson.encodeToJsonElement(String.serializer(), description) + body["description"] = PeptideJson.encodeToJsonElement(String.serializer(), description) } if (icon != null) { - body["icon"] = RevoltJson.encodeToJsonElement(String.serializer(), icon) + body["icon"] = PeptideJson.encodeToJsonElement(String.serializer(), icon) } if (banner != null) { - body["banner"] = RevoltJson.encodeToJsonElement(String.serializer(), banner) + body["banner"] = PeptideJson.encodeToJsonElement(String.serializer(), banner) } if (remove != null) { - body["remove"] = RevoltJson.encodeToJsonElement(ListSerializer(String.serializer()), remove) + body["remove"] = PeptideJson.encodeToJsonElement(ListSerializer(String.serializer()), remove) } if (nsfw != null) { - body["nsfw"] = RevoltJson.encodeToJsonElement(Boolean.serializer(), nsfw) + body["nsfw"] = PeptideJson.encodeToJsonElement(Boolean.serializer(), nsfw) } - val response = RevoltHttp.patch("/channels/$channelId".api()) { + val response = PeptideHttp.patch("/channels/$channelId".api()) { contentType(ContentType.Application.Json) setBody( - RevoltJson.encodeToString( + PeptideJson.encodeToString( MapSerializer( String.serializer(), JsonElement.serializer() @@ -245,14 +245,14 @@ suspend fun patchChannel( .bodyAsText() try { - val error = RevoltJson.decodeFromString(RevoltError.serializer(), response) + val error = PeptideJson.decodeFromString(PeptideError.serializer(), response) throw Exception(error.type) } catch (e: SerializationException) { // Not an error } if (!pure) { - val channel = RevoltJson.decodeFromString(Channel.serializer(), response) - RevoltAPI.channelCache[channelId] = channel + val channel = PeptideJson.decodeFromString(Channel.serializer(), response) + PeptideAPI.channelCache[channelId] = channel } } \ No newline at end of file diff --git a/app/src/main/java/chat/revolt/api/routes/channel/GroupDM.kt b/app/src/main/java/chat/peptide/api/routes/channel/GroupDM.kt similarity index 64% rename from app/src/main/java/chat/revolt/api/routes/channel/GroupDM.kt rename to app/src/main/java/chat/peptide/api/routes/channel/GroupDM.kt index f4770553..194b47ca 100644 --- a/app/src/main/java/chat/revolt/api/routes/channel/GroupDM.kt +++ b/app/src/main/java/chat/peptide/api/routes/channel/GroupDM.kt @@ -1,11 +1,11 @@ -package chat.revolt.api.routes.channel +package chat.peptide.api.routes.channel -import chat.revolt.api.RevoltError -import chat.revolt.api.RevoltHttp -import chat.revolt.api.RevoltJson -import chat.revolt.api.api -import chat.revolt.api.schemas.Channel -import chat.revolt.screens.create.MAX_ADDABLE_PEOPLE_IN_GROUP +import chat.peptide.api.PeptideError +import chat.peptide.api.PeptideHttp +import chat.peptide.api.PeptideJson +import chat.peptide.api.api +import chat.peptide.api.schemas.Channel +import chat.peptide.screens.create.MAX_ADDABLE_PEOPLE_IN_GROUP import io.ktor.client.request.delete import io.ktor.client.request.post import io.ktor.client.request.put @@ -28,23 +28,23 @@ suspend fun createGroupDM(name: String, members: List): Channel { throw Exception("Too many members, maximum is $MAX_ADDABLE_PEOPLE_IN_GROUP") } - val response = RevoltHttp.post("/channels/create".api()) { + val response = PeptideHttp.post("/channels/create".api()) { contentType(ContentType.Application.Json) setBody(CreateGroupDMBody(name, members)) }.bodyAsText() try { - val error = RevoltJson.decodeFromString(RevoltError.serializer(), response) + val error = PeptideJson.decodeFromString(PeptideError.serializer(), response) throw Error(error.type) } catch (e: SerializationException) { // Not an error } - return RevoltJson.decodeFromString(Channel.serializer(), response) + return PeptideJson.decodeFromString(Channel.serializer(), response) } suspend fun removeMember(channelId: String, userId: String) { - val response = RevoltHttp.delete("/channels/$channelId/recipients/$userId".api()) + val response = PeptideHttp.delete("/channels/$channelId/recipients/$userId".api()) if (!response.status.isSuccess()) { throw Error(response.status.toString()) @@ -52,7 +52,7 @@ suspend fun removeMember(channelId: String, userId: String) { } suspend fun addMember(channelId: String, userId: String) { - val response = RevoltHttp.put("/channels/$channelId/recipients/$userId".api()) + val response = PeptideHttp.put("/channels/$channelId/recipients/$userId".api()) if (!response.status.isSuccess()) { throw Error(response.status.toString()) diff --git a/app/src/main/java/chat/peptide/api/routes/channel/Message.kt b/app/src/main/java/chat/peptide/api/routes/channel/Message.kt new file mode 100644 index 00000000..bb87cc44 --- /dev/null +++ b/app/src/main/java/chat/peptide/api/routes/channel/Message.kt @@ -0,0 +1,14 @@ +package chat.peptide.api.routes.channel + +import chat.peptide.api.PeptideHttp +import chat.peptide.api.api +import io.ktor.client.request.delete +import io.ktor.client.request.put + +suspend fun react(channelId: String, messageId: String, emoji: String) { + PeptideHttp.put("/channels/$channelId/messages/$messageId/reactions/$emoji".api()) +} + +suspend fun unreact(channelId: String, messageId: String, emoji: String) { + PeptideHttp.delete("/channels/$channelId/messages/$messageId/reactions/$emoji".api()) +} \ No newline at end of file diff --git a/app/src/main/java/chat/peptide/api/routes/custom/Emoji.kt b/app/src/main/java/chat/peptide/api/routes/custom/Emoji.kt new file mode 100644 index 00000000..420fd4f5 --- /dev/null +++ b/app/src/main/java/chat/peptide/api/routes/custom/Emoji.kt @@ -0,0 +1,16 @@ +package chat.peptide.api.routes.custom + +import chat.peptide.api.PeptideHttp +import chat.peptide.api.PeptideJson +import chat.peptide.api.api +import chat.peptide.api.schemas.Emoji +import io.ktor.client.request.get +import io.ktor.client.statement.bodyAsText + +suspend fun fetchEmoji(id: String): Emoji { + val response = PeptideHttp.get("/custom/emoji/$id".api()).bodyAsText() + return PeptideJson.decodeFromString( + Emoji.serializer(), + response + ) +} diff --git a/app/src/main/java/chat/revolt/api/routes/googlesheets/GoogleSheetsService.kt b/app/src/main/java/chat/peptide/api/routes/googlesheets/GoogleSheetsService.kt similarity index 94% rename from app/src/main/java/chat/revolt/api/routes/googlesheets/GoogleSheetsService.kt rename to app/src/main/java/chat/peptide/api/routes/googlesheets/GoogleSheetsService.kt index 4c2082ac..832f066e 100644 --- a/app/src/main/java/chat/revolt/api/routes/googlesheets/GoogleSheetsService.kt +++ b/app/src/main/java/chat/peptide/api/routes/googlesheets/GoogleSheetsService.kt @@ -1,7 +1,7 @@ -package chat.revolt.api.routes.googlesheets +package chat.peptide.api.routes.googlesheets -import chat.revolt.api.RevoltHttp -import chat.revolt.api.RevoltJson +import chat.peptide.api.PeptideHttp +import chat.peptide.api.PeptideJson import io.ktor.client.request.get import io.ktor.client.statement.bodyAsText import kotlinx.coroutines.Dispatchers @@ -27,7 +27,7 @@ object GoogleSheetsService { crossinline mapper: (Map) -> T ): List = withContext(Dispatchers.IO) { try { - val response = RevoltHttp.get(sheetUrl).bodyAsText() + val response = PeptideHttp.get(sheetUrl).bodyAsText() // Determine if the response is CSV or JSON if (sheetUrl.contains("output=csv") || response.startsWith("\"") || response.contains(",")) { @@ -104,7 +104,7 @@ object GoogleSheetsService { jsonData: String, crossinline mapper: (Map) -> T ): List { - val sheetResponse = RevoltJson.decodeFromString(jsonData) + val sheetResponse = PeptideJson.decodeFromString(jsonData) // Convert the sheet data to a list of objects val headers = sheetResponse.feed.entry diff --git a/app/src/main/java/chat/revolt/api/routes/googlesheets/ServerDataRepository.kt b/app/src/main/java/chat/peptide/api/routes/googlesheets/ServerDataRepository.kt similarity index 96% rename from app/src/main/java/chat/revolt/api/routes/googlesheets/ServerDataRepository.kt rename to app/src/main/java/chat/peptide/api/routes/googlesheets/ServerDataRepository.kt index 7d474c26..fc5c9b21 100644 --- a/app/src/main/java/chat/revolt/api/routes/googlesheets/ServerDataRepository.kt +++ b/app/src/main/java/chat/peptide/api/routes/googlesheets/ServerDataRepository.kt @@ -1,4 +1,4 @@ -package chat.revolt.api.routes.googlesheets +package chat.peptide.api.routes.googlesheets import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.Flow diff --git a/app/src/main/java/chat/peptide/api/routes/invites/Invites.kt b/app/src/main/java/chat/peptide/api/routes/invites/Invites.kt new file mode 100644 index 00000000..c8d81165 --- /dev/null +++ b/app/src/main/java/chat/peptide/api/routes/invites/Invites.kt @@ -0,0 +1,43 @@ +package chat.peptide.api.routes.invites + +import chat.peptide.api.PeptideError +import chat.peptide.api.PeptideHttp +import chat.peptide.api.PeptideJson +import chat.peptide.api.api +import chat.peptide.api.schemas.Invite +import chat.peptide.api.schemas.InviteJoined +import chat.peptide.api.schemas.RsResult +import io.ktor.client.request.get +import io.ktor.client.request.post +import io.ktor.client.statement.bodyAsText +import kotlinx.serialization.SerializationException + +suspend fun fetchInviteByCode(code: String): RsResult { + val response = PeptideHttp.get("/invites/$code".api()) + .bodyAsText() + + try { + val error = PeptideJson.decodeFromString(PeptideError.serializer(), response) + if (error.type != "Server") return RsResult.err(error) + } catch (e: SerializationException) { + // Not an error + } + + val invite = PeptideJson.decodeFromString(Invite.serializer(), response) + return RsResult.ok(invite) +} + +suspend fun joinInviteByCode(code: String): RsResult { + val response = PeptideHttp.post("/invites/$code".api()) + .bodyAsText() + + try { + val error = PeptideJson.decodeFromString(PeptideError.serializer(), response) + if (error.type != "Server") return RsResult.err(error) + } catch (e: SerializationException) { + // Not an error + } + + val invite = PeptideJson.decodeFromString(InviteJoined.serializer(), response) + return RsResult.ok(invite) +} diff --git a/app/src/main/java/chat/revolt/api/routes/microservices/autumn/Autumn.kt b/app/src/main/java/chat/peptide/api/routes/microservices/autumn/Autumn.kt similarity index 74% rename from app/src/main/java/chat/revolt/api/routes/microservices/autumn/Autumn.kt rename to app/src/main/java/chat/peptide/api/routes/microservices/autumn/Autumn.kt index 0159c07b..7d62faaa 100644 --- a/app/src/main/java/chat/revolt/api/routes/microservices/autumn/Autumn.kt +++ b/app/src/main/java/chat/peptide/api/routes/microservices/autumn/Autumn.kt @@ -1,11 +1,11 @@ -package chat.revolt.api.routes.microservices.autumn +package chat.peptide.api.routes.microservices.autumn -import chat.revolt.api.HitRateLimitException -import chat.revolt.api.RevoltAPI -import chat.revolt.api.RevoltHttp -import chat.revolt.api.RevoltJson -import chat.revolt.api.schemas.AutumnError -import chat.revolt.api.schemas.AutumnId +import chat.peptide.api.HitRateLimitException +import chat.peptide.api.PeptideAPI +import chat.peptide.api.PeptideHttp +import chat.peptide.api.PeptideJson +import chat.peptide.api.schemas.AutumnError +import chat.peptide.api.schemas.AutumnId import io.ktor.client.plugins.onUpload import io.ktor.client.request.forms.MultiPartFormDataContent import io.ktor.client.request.forms.formData @@ -36,9 +36,9 @@ suspend fun uploadToAutumn( contentType: ContentType, onProgress: (Long, Long) -> Unit = { _, _ -> } ): String { - val uploadUrl = "${RevoltAPI.getCurrentFilesUrl()}/$tag" + val uploadUrl = "${PeptideAPI.getCurrentFilesUrl()}/$tag" - val response = RevoltHttp.post(uploadUrl) { + val response = PeptideHttp.post(uploadUrl) { setBody( MultiPartFormDataContent( formData { @@ -53,18 +53,18 @@ suspend fun uploadToAutumn( } ) ) - header(RevoltAPI.TOKEN_HEADER_NAME, RevoltAPI.sessionToken) + header(PeptideAPI.TOKEN_HEADER_NAME, PeptideAPI.sessionToken) onUpload { bytesSentTotal, contentLength -> contentLength?.let { onProgress(bytesSentTotal, it) } } } try { - val autumnId = RevoltJson.decodeFromString(AutumnId.serializer(), response.bodyAsText()) + val autumnId = PeptideJson.decodeFromString(AutumnId.serializer(), response.bodyAsText()) return autumnId.id } catch (e: Exception) { try { - val error = RevoltJson.decodeFromString(AutumnError.serializer(), response.bodyAsText()) + val error = PeptideJson.decodeFromString(AutumnError.serializer(), response.bodyAsText()) throw Exception(error.type) } catch (e: Exception) { if (response.status == HttpStatusCode.TooManyRequests) { diff --git a/app/src/main/java/chat/revolt/api/routes/microservices/geo/Geo.kt b/app/src/main/java/chat/peptide/api/routes/microservices/geo/Geo.kt similarity index 68% rename from app/src/main/java/chat/revolt/api/routes/microservices/geo/Geo.kt rename to app/src/main/java/chat/peptide/api/routes/microservices/geo/Geo.kt index a54ea4b4..e6d09751 100644 --- a/app/src/main/java/chat/revolt/api/routes/microservices/geo/Geo.kt +++ b/app/src/main/java/chat/peptide/api/routes/microservices/geo/Geo.kt @@ -1,9 +1,9 @@ -package chat.revolt.api.routes.microservices.geo +package chat.peptide.api.routes.microservices.geo -import chat.revolt.api.HitRateLimitException -import chat.revolt.api.RevoltHttp -import chat.revolt.api.RevoltJson -import chat.revolt.api.buildUserAgent +import chat.peptide.api.HitRateLimitException +import chat.peptide.api.PeptideHttp +import chat.peptide.api.PeptideJson +import chat.peptide.api.buildUserAgent import io.ktor.client.request.get import io.ktor.client.request.header import io.ktor.client.statement.bodyAsText @@ -18,12 +18,12 @@ data class GeoResponse( suspend fun queryGeo(): GeoResponse { try { - val response = RevoltHttp.get("https://geo.revolt.chat/?client=android") { + val response = PeptideHttp.get("https://geo.peptide.chat/?client=android") { header("User-Agent", buildUserAgent("Ktor queryGeo")) } if (response.status == HttpStatusCode.OK) { - return RevoltJson.decodeFromString(response.bodyAsText()) + return PeptideJson.decodeFromString(response.bodyAsText()) } else throw Exception("Failed to query geo: ${response.status.value} ${response.status.description}") } catch (e: Exception) { throw Exception("Failed to query geo: ${e.message}", e).also { diff --git a/app/src/main/java/chat/peptide/api/routes/microservices/health/Health.kt b/app/src/main/java/chat/peptide/api/routes/microservices/health/Health.kt new file mode 100644 index 00000000..87ee1530 --- /dev/null +++ b/app/src/main/java/chat/peptide/api/routes/microservices/health/Health.kt @@ -0,0 +1,12 @@ +package chat.peptide.api.routes.microservices.health + +import chat.peptide.api.PeptideHttp +import chat.peptide.api.PeptideJson +import chat.peptide.api.schemas.HealthNotice +import io.ktor.client.request.get +import io.ktor.client.statement.bodyAsText + +suspend fun healthCheck(): HealthNotice { + val response = PeptideHttp.get("https://health.peptide.chat/api/health").bodyAsText() + return PeptideJson.decodeFromString(HealthNotice.serializer(), response) +} \ No newline at end of file diff --git a/app/src/main/java/chat/peptide/api/routes/microservices/january/January.kt b/app/src/main/java/chat/peptide/api/routes/microservices/january/January.kt new file mode 100644 index 00000000..33bf6b1e --- /dev/null +++ b/app/src/main/java/chat/peptide/api/routes/microservices/january/January.kt @@ -0,0 +1,8 @@ +package chat.peptide.api.routes.microservices.january + +import chat.peptide.api.PeptideAPI +import java.net.URLEncoder + +fun asJanuaryProxyUrl(url: String): String { + return "${PeptideAPI.getCurrentJanuaryUrl()}/proxy?url=${URLEncoder.encode(url, "utf-8")}" +} diff --git a/app/src/main/java/chat/revolt/api/routes/misc/Root.kt b/app/src/main/java/chat/peptide/api/routes/misc/Root.kt similarity index 87% rename from app/src/main/java/chat/revolt/api/routes/misc/Root.kt rename to app/src/main/java/chat/peptide/api/routes/misc/Root.kt index dfc22cd3..05033524 100644 --- a/app/src/main/java/chat/revolt/api/routes/misc/Root.kt +++ b/app/src/main/java/chat/peptide/api/routes/misc/Root.kt @@ -1,7 +1,7 @@ -package chat.revolt.api.routes.misc +package chat.peptide.api.routes.misc -import chat.revolt.api.RevoltHttp -import chat.revolt.api.api +import chat.peptide.api.PeptideHttp +import chat.peptide.api.api import io.ktor.client.call.body import io.ktor.client.request.get import kotlinx.serialization.SerialName @@ -9,7 +9,7 @@ import kotlinx.serialization.Serializable @Serializable data class Root( - val revolt: String, + val peptide: String, val features: Features, val ws: String, val app: String, @@ -61,5 +61,5 @@ data class LiveKitNode( ) suspend fun getRootRoute(): Root { - return RevoltHttp.get("/".api()).body() + return PeptideHttp.get("/".api()).body() } diff --git a/app/src/main/java/chat/revolt/api/routes/onboard/Onboarding.kt b/app/src/main/java/chat/peptide/api/routes/onboard/Onboarding.kt similarity index 52% rename from app/src/main/java/chat/revolt/api/routes/onboard/Onboarding.kt rename to app/src/main/java/chat/peptide/api/routes/onboard/Onboarding.kt index 9126648b..893daf8f 100644 --- a/app/src/main/java/chat/revolt/api/routes/onboard/Onboarding.kt +++ b/app/src/main/java/chat/peptide/api/routes/onboard/Onboarding.kt @@ -1,12 +1,12 @@ -package chat.revolt.api.routes.onboard +package chat.peptide.api.routes.onboard -import chat.revolt.api.RateLimitResponse -import chat.revolt.api.RevoltAPI -import chat.revolt.api.RevoltError -import chat.revolt.api.RevoltHttp -import chat.revolt.api.RevoltJson -import chat.revolt.api.api -import chat.revolt.api.schemas.RsResult +import chat.peptide.api.RateLimitResponse +import chat.peptide.api.PeptideAPI +import chat.peptide.api.PeptideError +import chat.peptide.api.PeptideHttp +import chat.peptide.api.PeptideJson +import chat.peptide.api.api +import chat.peptide.api.schemas.RsResult import io.ktor.client.request.get import io.ktor.client.request.header import io.ktor.client.request.post @@ -23,22 +23,22 @@ data class OnboardingResponse( val onboarding: Boolean ) -suspend fun needsOnboarding(sessionToken: String = RevoltAPI.sessionToken): Boolean { - val response = RevoltHttp.get("/onboard/hello".api()) { - header(RevoltAPI.TOKEN_HEADER_NAME, sessionToken) +suspend fun needsOnboarding(sessionToken: String = PeptideAPI.sessionToken): Boolean { + val response = PeptideHttp.get("/onboard/hello".api()) { + header(PeptideAPI.TOKEN_HEADER_NAME, sessionToken) } val responseContent = response.bodyAsText() try { val rateLimitResponse = - RevoltJson.decodeFromString(RateLimitResponse.serializer(), responseContent) + PeptideJson.decodeFromString(RateLimitResponse.serializer(), responseContent) throw rateLimitResponse.toException() } catch (e: SerializationException) { // good path } - return RevoltJson.decodeFromString(OnboardingResponse.serializer(), responseContent).onboarding + return PeptideJson.decodeFromString(OnboardingResponse.serializer(), responseContent).onboarding } @Serializable @@ -48,26 +48,26 @@ data class OnboardingCompletionBody( suspend fun completeOnboarding( body: OnboardingCompletionBody, - sessionToken: String = RevoltAPI.sessionToken -): RsResult { - val response = RevoltHttp.post("/onboard/complete".api()) { + sessionToken: String = PeptideAPI.sessionToken +): RsResult { + val response = PeptideHttp.post("/onboard/complete".api()) { setBody(body) contentType(ContentType.Application.Json) - header(RevoltAPI.TOKEN_HEADER_NAME, sessionToken) + header(PeptideAPI.TOKEN_HEADER_NAME, sessionToken) } if (response.status == HttpStatusCode.Conflict) { - return RsResult.err(RevoltError("UsernameTaken")) + return RsResult.err(PeptideError("UsernameTaken")) } if (response.status == HttpStatusCode.BadRequest) { - return RsResult.err(RevoltError("InvalidUsername")) + return RsResult.err(PeptideError("InvalidUsername")) } val responseContent = response.bodyAsText() try { - val error = RevoltJson.decodeFromString(RevoltError.serializer(), responseContent) + val error = PeptideJson.decodeFromString(PeptideError.serializer(), responseContent) return RsResult.err(error) } catch (e: SerializationException) { // Not an error diff --git a/app/src/main/java/chat/revolt/api/routes/push/Push.kt b/app/src/main/java/chat/peptide/api/routes/push/Push.kt similarity index 70% rename from app/src/main/java/chat/revolt/api/routes/push/Push.kt rename to app/src/main/java/chat/peptide/api/routes/push/Push.kt index 0e9dc263..b438e83c 100644 --- a/app/src/main/java/chat/revolt/api/routes/push/Push.kt +++ b/app/src/main/java/chat/peptide/api/routes/push/Push.kt @@ -1,8 +1,8 @@ -package chat.revolt.api.routes.push +package chat.peptide.api.routes.push -import chat.revolt.api.RevoltHttp -import chat.revolt.api.routes.account.WebPushData -import chat.revolt.api.api +import chat.peptide.api.PeptideHttp +import chat.peptide.api.routes.account.WebPushData +import chat.peptide.api.api import io.ktor.client.request.post import io.ktor.client.request.setBody import io.ktor.http.ContentType @@ -19,7 +19,7 @@ suspend fun subscribePush( auth = auth ) - RevoltHttp.post("/push/subscribe".api()) { + PeptideHttp.post("/push/subscribe".api()) { setBody(data) contentType(ContentType.Application.Json) } diff --git a/app/src/main/java/chat/revolt/api/routes/safety/Reporting.kt b/app/src/main/java/chat/peptide/api/routes/safety/Reporting.kt similarity index 64% rename from app/src/main/java/chat/revolt/api/routes/safety/Reporting.kt rename to app/src/main/java/chat/peptide/api/routes/safety/Reporting.kt index e471a048..9386e4f9 100644 --- a/app/src/main/java/chat/revolt/api/routes/safety/Reporting.kt +++ b/app/src/main/java/chat/peptide/api/routes/safety/Reporting.kt @@ -1,17 +1,17 @@ -package chat.revolt.api.routes.safety +package chat.peptide.api.routes.safety -import chat.revolt.api.RevoltError -import chat.revolt.api.RevoltHttp -import chat.revolt.api.RevoltJson -import chat.revolt.api.schemas.ContentReportReason -import chat.revolt.api.schemas.FullMessageReport -import chat.revolt.api.schemas.FullServerReport -import chat.revolt.api.schemas.FullUserReport -import chat.revolt.api.schemas.MessageReport -import chat.revolt.api.schemas.ServerReport -import chat.revolt.api.schemas.UserReport -import chat.revolt.api.schemas.UserReportReason -import chat.revolt.api.api +import chat.peptide.api.PeptideError +import chat.peptide.api.PeptideHttp +import chat.peptide.api.PeptideJson +import chat.peptide.api.schemas.ContentReportReason +import chat.peptide.api.schemas.FullMessageReport +import chat.peptide.api.schemas.FullServerReport +import chat.peptide.api.schemas.FullUserReport +import chat.peptide.api.schemas.MessageReport +import chat.peptide.api.schemas.ServerReport +import chat.peptide.api.schemas.UserReport +import chat.peptide.api.schemas.UserReportReason +import chat.peptide.api.api import io.ktor.client.request.post import io.ktor.client.request.setBody import io.ktor.client.statement.bodyAsText @@ -31,9 +31,9 @@ suspend fun putMessageReport( additional_context = additionalContext ) - val response = RevoltHttp.post("/safety/report".api()) { + val response = PeptideHttp.post("/safety/report".api()) { setBody( - RevoltJson.encodeToString( + PeptideJson.encodeToString( FullMessageReport.serializer(), fullMessageReport ) @@ -42,7 +42,7 @@ suspend fun putMessageReport( .bodyAsText() try { - val error = RevoltJson.decodeFromString(RevoltError.serializer(), response) + val error = PeptideJson.decodeFromString(PeptideError.serializer(), response) throw Error(error.type) } catch (e: SerializationException) { // Not an error @@ -63,9 +63,9 @@ suspend fun putServerReport( additional_context = additionalContext ) - val response = RevoltHttp.post("/safety/report".api()) { + val response = PeptideHttp.post("/safety/report".api()) { setBody( - RevoltJson.encodeToString( + PeptideJson.encodeToString( FullServerReport.serializer(), fullServerReport ) @@ -74,7 +74,7 @@ suspend fun putServerReport( .bodyAsText() try { - val error = RevoltJson.decodeFromString(RevoltError.serializer(), response) + val error = PeptideJson.decodeFromString(PeptideError.serializer(), response) throw Error(error.type) } catch (e: SerializationException) { // Not an error @@ -95,9 +95,9 @@ suspend fun putUserReport( additional_context = additionalContext ) - val response = RevoltHttp.post("/safety/report".api()) { + val response = PeptideHttp.post("/safety/report".api()) { setBody( - RevoltJson.encodeToString( + PeptideJson.encodeToString( FullUserReport.serializer(), fullUserReport ) @@ -106,7 +106,7 @@ suspend fun putUserReport( .bodyAsText() try { - val error = RevoltJson.decodeFromString(RevoltError.serializer(), response) + val error = PeptideJson.decodeFromString(PeptideError.serializer(), response) throw Error(error.type) } catch (e: SerializationException) { // Not an error diff --git a/app/src/main/java/chat/revolt/api/routes/server/Server.kt b/app/src/main/java/chat/peptide/api/routes/server/Server.kt similarity index 54% rename from app/src/main/java/chat/revolt/api/routes/server/Server.kt rename to app/src/main/java/chat/peptide/api/routes/server/Server.kt index 5428400c..0b8b379d 100644 --- a/app/src/main/java/chat/revolt/api/routes/server/Server.kt +++ b/app/src/main/java/chat/peptide/api/routes/server/Server.kt @@ -1,13 +1,13 @@ -package chat.revolt.api.routes.server +package chat.peptide.api.routes.server -import chat.revolt.api.RevoltAPI -import chat.revolt.api.RevoltError -import chat.revolt.api.RevoltHttp -import chat.revolt.api.RevoltJson -import chat.revolt.api.api -import chat.revolt.api.schemas.Member -import chat.revolt.api.schemas.ServerWithChannelObjects -import chat.revolt.api.schemas.User +import chat.peptide.api.PeptideAPI +import chat.peptide.api.PeptideError +import chat.peptide.api.PeptideHttp +import chat.peptide.api.PeptideJson +import chat.peptide.api.api +import chat.peptide.api.schemas.Member +import chat.peptide.api.schemas.ServerWithChannelObjects +import chat.peptide.api.schemas.User import io.ktor.client.request.delete import io.ktor.client.request.get import io.ktor.client.request.parameter @@ -25,7 +25,7 @@ data class FetchMembersResponse( ) suspend fun ackServer(serverId: String) { - RevoltHttp.put("/servers/$serverId/ack".api()) + PeptideHttp.put("/servers/$serverId/ack".api()) } suspend fun fetchMembers( @@ -33,55 +33,55 @@ suspend fun fetchMembers( includeOffline: Boolean = false, pure: Boolean = false ): FetchMembersResponse { - val response = RevoltHttp.get("/servers/$serverId/members".api()) { + val response = PeptideHttp.get("/servers/$serverId/members".api()) { parameter("exclude_offline", !includeOffline) } val responseContent = response.bodyAsText() try { - val error = RevoltJson.decodeFromString(RevoltError.serializer(), responseContent) + val error = PeptideJson.decodeFromString(PeptideError.serializer(), responseContent) throw Error(error.type) } catch (e: SerializationException) { // Not an error } val membersResponse = - RevoltJson.decodeFromString(FetchMembersResponse.serializer(), responseContent) + PeptideJson.decodeFromString(FetchMembersResponse.serializer(), responseContent) if (pure) { return membersResponse } membersResponse.members.forEach { member -> - if (!RevoltAPI.members.hasMember(serverId, member.id!!.user)) { - RevoltAPI.members.setMember(serverId, member) + if (!PeptideAPI.members.hasMember(serverId, member.id!!.user)) { + PeptideAPI.members.setMember(serverId, member) } } membersResponse.users.forEach { user -> - user.id?.let { RevoltAPI.userCache.putIfAbsent(it, user) } + user.id?.let { PeptideAPI.userCache.putIfAbsent(it, user) } } return membersResponse } suspend fun fetchMember(serverId: String, userId: String, pure: Boolean = false): Member { - val response = RevoltHttp.get("/servers/$serverId/members/$userId".api()) + val response = PeptideHttp.get("/servers/$serverId/members/$userId".api()) try { - val error = RevoltJson.decodeFromString(RevoltError.serializer(), response.bodyAsText()) + val error = PeptideJson.decodeFromString(PeptideError.serializer(), response.bodyAsText()) throw Exception(error.type) } catch (e: SerializationException) { // Not an error } - val member = RevoltJson.decodeFromString(Member.serializer(), response.bodyAsText()) + val member = PeptideJson.decodeFromString(Member.serializer(), response.bodyAsText()) if (!pure) { member.id?.let { - if (!RevoltAPI.members.hasMember(serverId, it.user)) { - RevoltAPI.members.setMember(serverId, member) + if (!PeptideAPI.members.hasMember(serverId, it.user)) { + PeptideAPI.members.setMember(serverId, member) } } } @@ -90,7 +90,7 @@ suspend fun fetchMember(serverId: String, userId: String, pure: Boolean = false) } suspend fun leaveOrDeleteServer(serverId: String, leaveSilently: Boolean = false) { - RevoltHttp.delete("/servers/$serverId".api()) { + PeptideHttp.delete("/servers/$serverId".api()) { parameter("leave_silently", leaveSilently) } } @@ -109,16 +109,16 @@ suspend fun createServer( ): ServerWithChannelObjects { val body = ServerCreationBody(name, description, nsfw) - val response = RevoltHttp.post("/servers/create".api()) { - setBody(RevoltJson.encodeToString(ServerCreationBody.serializer(), body)) + val response = PeptideHttp.post("/servers/create".api()) { + setBody(PeptideJson.encodeToString(ServerCreationBody.serializer(), body)) } try { - val error = RevoltJson.decodeFromString(RevoltError.serializer(), response.bodyAsText()) + val error = PeptideJson.decodeFromString(PeptideError.serializer(), response.bodyAsText()) throw Exception(error.type) } catch (e: SerializationException) { // Not an error } - return RevoltJson.decodeFromString(ServerWithChannelObjects.serializer(), response.bodyAsText()) + return PeptideJson.decodeFromString(ServerWithChannelObjects.serializer(), response.bodyAsText()) } \ No newline at end of file diff --git a/app/src/main/java/chat/revolt/api/routes/sync/SettingsSync.kt b/app/src/main/java/chat/peptide/api/routes/sync/SettingsSync.kt similarity index 68% rename from app/src/main/java/chat/revolt/api/routes/sync/SettingsSync.kt rename to app/src/main/java/chat/peptide/api/routes/sync/SettingsSync.kt index 3f1a7709..c3d5503c 100644 --- a/app/src/main/java/chat/revolt/api/routes/sync/SettingsSync.kt +++ b/app/src/main/java/chat/peptide/api/routes/sync/SettingsSync.kt @@ -1,9 +1,9 @@ -package chat.revolt.api.routes.sync +package chat.peptide.api.routes.sync -import chat.revolt.api.RevoltAPI -import chat.revolt.api.RevoltHttp -import chat.revolt.api.RevoltJson -import chat.revolt.api.api +import chat.peptide.api.PeptideAPI +import chat.peptide.api.PeptideHttp +import chat.peptide.api.PeptideJson +import chat.peptide.api.api import io.ktor.client.request.parameter import io.ktor.client.request.post import io.ktor.client.request.setBody @@ -17,13 +17,13 @@ import kotlinx.serialization.json.JsonArray @Serializable data class SyncedSetting(val timestamp: Long, val value: String) -suspend fun getKeys(vararg keys: String, revoltToken: String): Map { - val response = RevoltHttp.post("/sync/settings/fetch".api()) { - headers.append(RevoltAPI.TOKEN_HEADER_NAME, revoltToken) +suspend fun getKeys(vararg keys: String, peptideToken: String): Map { + val response = PeptideHttp.post("/sync/settings/fetch".api()) { + headers.append(PeptideAPI.TOKEN_HEADER_NAME, peptideToken) // format: {"keys": ["key1", "key2"]} setBody( - RevoltJson.encodeToString( + PeptideJson.encodeToString( MapSerializer( String.serializer(), ListSerializer(String.serializer()) @@ -33,7 +33,7 @@ suspend fun getKeys(vararg keys: String, revoltToken: String): Map { - return getKeys(*keys, revoltToken = RevoltAPI.sessionToken) + return getKeys(*keys, peptideToken = PeptideAPI.sessionToken) } suspend fun setKey(key: String, value: String) { - RevoltHttp.post("/sync/settings/set".api()) { + PeptideHttp.post("/sync/settings/set".api()) { parameter("timestamp", System.currentTimeMillis()) // format: {"key": "value"} setBody( - RevoltJson.encodeToString( + PeptideJson.encodeToString( MapSerializer( String.serializer(), String.serializer() diff --git a/app/src/main/java/chat/revolt/api/routes/sync/UnreadSync.kt b/app/src/main/java/chat/peptide/api/routes/sync/UnreadSync.kt similarity index 50% rename from app/src/main/java/chat/revolt/api/routes/sync/UnreadSync.kt rename to app/src/main/java/chat/peptide/api/routes/sync/UnreadSync.kt index d38dadbf..073faacd 100644 --- a/app/src/main/java/chat/revolt/api/routes/sync/UnreadSync.kt +++ b/app/src/main/java/chat/peptide/api/routes/sync/UnreadSync.kt @@ -1,18 +1,18 @@ -package chat.revolt.api.routes.sync +package chat.peptide.api.routes.sync -import chat.revolt.api.RevoltHttp -import chat.revolt.api.RevoltJson -import chat.revolt.api.api -import chat.revolt.api.schemas.ChannelUnreadResponse +import chat.peptide.api.PeptideHttp +import chat.peptide.api.PeptideJson +import chat.peptide.api.api +import chat.peptide.api.schemas.ChannelUnreadResponse import io.ktor.client.request.get import io.ktor.client.statement.bodyAsText import kotlinx.serialization.builtins.ListSerializer suspend fun syncUnreads(): List { - val response = RevoltHttp.get("/sync/unreads".api()) + val response = PeptideHttp.get("/sync/unreads".api()) .bodyAsText() - return RevoltJson.decodeFromString( + return PeptideJson.decodeFromString( ListSerializer(ChannelUnreadResponse.serializer()), response ) diff --git a/app/src/main/java/chat/peptide/api/routes/user/DirectMessaging.kt b/app/src/main/java/chat/peptide/api/routes/user/DirectMessaging.kt new file mode 100644 index 00000000..fbeda2c9 --- /dev/null +++ b/app/src/main/java/chat/peptide/api/routes/user/DirectMessaging.kt @@ -0,0 +1,24 @@ +package chat.peptide.api.routes.user + +import chat.peptide.api.PeptideError +import chat.peptide.api.PeptideHttp +import chat.peptide.api.PeptideJson +import chat.peptide.api.api +import chat.peptide.api.schemas.Channel +import io.ktor.client.request.get +import io.ktor.client.statement.bodyAsText +import kotlinx.serialization.SerializationException + +suspend fun openDM(userId: String): Channel { + val response = PeptideHttp.get("/users/$userId/dm".api()) + .bodyAsText() + + try { + val error = PeptideJson.decodeFromString(PeptideError.serializer(), response) + throw Error(error.type) + } catch (e: SerializationException) { + // Not an error + } + + return PeptideJson.decodeFromString(Channel.serializer(), response) +} \ No newline at end of file diff --git a/app/src/main/java/chat/revolt/api/routes/user/Relationships.kt b/app/src/main/java/chat/peptide/api/routes/user/Relationships.kt similarity index 59% rename from app/src/main/java/chat/revolt/api/routes/user/Relationships.kt rename to app/src/main/java/chat/peptide/api/routes/user/Relationships.kt index f9db7e98..4551b3e0 100644 --- a/app/src/main/java/chat/revolt/api/routes/user/Relationships.kt +++ b/app/src/main/java/chat/peptide/api/routes/user/Relationships.kt @@ -1,9 +1,9 @@ -package chat.revolt.api.routes.user +package chat.peptide.api.routes.user -import chat.revolt.api.RevoltError -import chat.revolt.api.RevoltHttp -import chat.revolt.api.RevoltJson -import chat.revolt.api.api +import chat.peptide.api.PeptideError +import chat.peptide.api.PeptideHttp +import chat.peptide.api.PeptideJson +import chat.peptide.api.api import io.ktor.client.request.delete import io.ktor.client.request.post import io.ktor.client.request.put @@ -14,11 +14,11 @@ import io.ktor.http.contentType import kotlinx.serialization.SerializationException suspend fun blockUser(userId: String) { - val response = RevoltHttp.put("/users/$userId/block".api()) + val response = PeptideHttp.put("/users/$userId/block".api()) .bodyAsText() try { - val error = RevoltJson.decodeFromString(RevoltError.serializer(), response) + val error = PeptideJson.decodeFromString(PeptideError.serializer(), response) throw Exception(error.type) } catch (e: SerializationException) { // Not an error @@ -26,11 +26,11 @@ suspend fun blockUser(userId: String) { } suspend fun unblockUser(userId: String) { - val response = RevoltHttp.delete("/users/$userId/block".api()) + val response = PeptideHttp.delete("/users/$userId/block".api()) .bodyAsText() try { - val error = RevoltJson.decodeFromString(RevoltError.serializer(), response) + val error = PeptideJson.decodeFromString(PeptideError.serializer(), response) throw Exception(error.type) } catch (e: SerializationException) { // Not an error @@ -38,14 +38,14 @@ suspend fun unblockUser(userId: String) { } suspend fun friendUser(username: String) { - val response = RevoltHttp.post("/users/friend".api()) { + val response = PeptideHttp.post("/users/friend".api()) { contentType(ContentType.Application.Json) setBody(mapOf("username" to username)) } val body = response.bodyAsText() try { - val error = RevoltJson.decodeFromString(RevoltError.serializer(), body) + val error = PeptideJson.decodeFromString(PeptideError.serializer(), body) throw Exception(error.type) } catch (e: SerializationException) { // Not an error @@ -53,11 +53,11 @@ suspend fun friendUser(username: String) { } suspend fun acceptFriendRequest(userId: String) { - val response = RevoltHttp.put("/users/$userId/friend".api()) + val response = PeptideHttp.put("/users/$userId/friend".api()) .bodyAsText() try { - val error = RevoltJson.decodeFromString(RevoltError.serializer(), response) + val error = PeptideJson.decodeFromString(PeptideError.serializer(), response) throw Exception(error.type) } catch (e: SerializationException) { // Not an error @@ -65,11 +65,11 @@ suspend fun acceptFriendRequest(userId: String) { } suspend fun unfriendUser(userId: String) { - val response = RevoltHttp.delete("/users/$userId/friend".api()) + val response = PeptideHttp.delete("/users/$userId/friend".api()) .bodyAsText() try { - val error = RevoltJson.decodeFromString(RevoltError.serializer(), response) + val error = PeptideJson.decodeFromString(PeptideError.serializer(), response) throw Exception(error.type) } catch (e: SerializationException) { // Not an error diff --git a/app/src/main/java/chat/revolt/api/routes/user/User.kt b/app/src/main/java/chat/peptide/api/routes/user/User.kt similarity index 57% rename from app/src/main/java/chat/revolt/api/routes/user/User.kt rename to app/src/main/java/chat/peptide/api/routes/user/User.kt index 7dc8750a..d249d288 100644 --- a/app/src/main/java/chat/revolt/api/routes/user/User.kt +++ b/app/src/main/java/chat/peptide/api/routes/user/User.kt @@ -1,13 +1,13 @@ -package chat.revolt.api.routes.user +package chat.peptide.api.routes.user -import chat.revolt.api.RevoltAPI -import chat.revolt.api.RevoltError -import chat.revolt.api.RevoltHttp -import chat.revolt.api.RevoltJson -import chat.revolt.api.api -import chat.revolt.api.schemas.Profile -import chat.revolt.api.schemas.Status -import chat.revolt.api.schemas.User +import chat.peptide.api.PeptideAPI +import chat.peptide.api.PeptideError +import chat.peptide.api.PeptideHttp +import chat.peptide.api.PeptideJson +import chat.peptide.api.api +import chat.peptide.api.schemas.Profile +import chat.peptide.api.schemas.Status +import chat.peptide.api.schemas.User import io.ktor.client.request.get import io.ktor.client.request.patch import io.ktor.client.request.setBody @@ -21,24 +21,24 @@ import kotlinx.serialization.builtins.serializer import kotlinx.serialization.json.JsonElement suspend fun fetchSelf(): User { - val response = RevoltHttp.get("/users/@me".api()) + val response = PeptideHttp.get("/users/@me".api()) .bodyAsText() try { - val error = RevoltJson.decodeFromString(RevoltError.serializer(), response) + val error = PeptideJson.decodeFromString(PeptideError.serializer(), response) throw Exception(error.type) } catch (e: SerializationException) { // Not an error } - val user = RevoltJson.decodeFromString(User.serializer(), response) + val user = PeptideJson.decodeFromString(User.serializer(), response) if (user.id == null) { throw Exception("Self user ID is null") } - RevoltAPI.userCache[user.id] = user - RevoltAPI.selfId = user.id + PeptideAPI.userCache[user.id] = user + PeptideAPI.selfId = user.id return user } @@ -54,11 +54,11 @@ suspend fun patchSelf( val body = mutableMapOf() if (status != null) { - body["status"] = RevoltJson.encodeToJsonElement(Status.serializer(), status) + body["status"] = PeptideJson.encodeToJsonElement(Status.serializer(), status) } if (avatar != null) { - body["avatar"] = RevoltJson.encodeToJsonElement(String.serializer(), avatar) + body["avatar"] = PeptideJson.encodeToJsonElement(String.serializer(), avatar) } if (background != null || bio != null) { @@ -71,7 +71,7 @@ suspend fun patchSelf( profileMap["content"] = bio } - body["profile"] = RevoltJson.encodeToJsonElement( + body["profile"] = PeptideJson.encodeToJsonElement( MapSerializer( String.serializer(), String.serializer() @@ -81,13 +81,13 @@ suspend fun patchSelf( } if (remove != null) { - body["remove"] = RevoltJson.encodeToJsonElement(ListSerializer(String.serializer()), remove) + body["remove"] = PeptideJson.encodeToJsonElement(ListSerializer(String.serializer()), remove) } - val response = RevoltHttp.patch("/users/@me".api()) { + val response = PeptideHttp.patch("/users/@me".api()) { contentType(ContentType.Application.Json) setBody( - RevoltJson.encodeToString( + PeptideJson.encodeToString( MapSerializer( String.serializer(), JsonElement.serializer() @@ -98,21 +98,21 @@ suspend fun patchSelf( } .bodyAsText() - if (RevoltAPI.selfId == null) { + if (PeptideAPI.selfId == null) { throw Error("Self ID is null") } - val currentUser = RevoltAPI.userCache[RevoltAPI.selfId] ?: fetchSelf() - val newUserKeys = RevoltJson.decodeFromString(User.serializer(), response) + val currentUser = PeptideAPI.userCache[PeptideAPI.selfId] ?: fetchSelf() + val newUserKeys = PeptideJson.decodeFromString(User.serializer(), response) val mergedUser = currentUser.mergeWithPartial(newUserKeys) if (!pure) { - RevoltAPI.userCache[RevoltAPI.selfId!!] = mergedUser + PeptideAPI.userCache[PeptideAPI.selfId!!] = mergedUser } } suspend fun fetchUser(id: String): User { - val res = RevoltHttp.get("/users/$id".api()) + val res = PeptideHttp.get("/users/$id".api()) if (res.status.value == 404) { return User.getPlaceholder(id) @@ -121,42 +121,42 @@ suspend fun fetchUser(id: String): User { val response = res.bodyAsText() try { - val error = RevoltJson.decodeFromString(RevoltError.serializer(), response) + val error = PeptideJson.decodeFromString(PeptideError.serializer(), response) throw Exception(error.type) } catch (e: SerializationException) { // Not an error } - val user = RevoltJson.decodeFromString(User.serializer(), response) + val user = PeptideJson.decodeFromString(User.serializer(), response) user.id?.let { - RevoltAPI.userCache[it] = user + PeptideAPI.userCache[it] = user } return user } suspend fun getOrFetchUser(id: String): User { - return RevoltAPI.userCache[id] ?: fetchUser(id) + return PeptideAPI.userCache[id] ?: fetchUser(id) } suspend fun addUserIfUnknown(id: String) { - if (RevoltAPI.userCache[id] == null) { - RevoltAPI.userCache[id] = fetchUser(id) + if (PeptideAPI.userCache[id] == null) { + PeptideAPI.userCache[id] = fetchUser(id) } } suspend fun fetchUserProfile(id: String): Profile { - val res = RevoltHttp.get("/users/$id/profile".api()) + val res = PeptideHttp.get("/users/$id/profile".api()) val response = res.bodyAsText() try { - val error = RevoltJson.decodeFromString(RevoltError.serializer(), response) + val error = PeptideJson.decodeFromString(PeptideError.serializer(), response) throw Exception(error.type) } catch (e: SerializationException) { // Not an error } - return RevoltJson.decodeFromString(Profile.serializer(), response) + return PeptideJson.decodeFromString(Profile.serializer(), response) } \ No newline at end of file diff --git a/app/src/main/java/chat/revolt/api/routes/voice/Voice.kt b/app/src/main/java/chat/peptide/api/routes/voice/Voice.kt similarity index 61% rename from app/src/main/java/chat/revolt/api/routes/voice/Voice.kt rename to app/src/main/java/chat/peptide/api/routes/voice/Voice.kt index 9f9e5fdb..5df2c143 100644 --- a/app/src/main/java/chat/revolt/api/routes/voice/Voice.kt +++ b/app/src/main/java/chat/peptide/api/routes/voice/Voice.kt @@ -1,9 +1,9 @@ -package chat.revolt.api.routes.voice +package chat.peptide.api.routes.voice -import chat.revolt.api.RevoltError -import chat.revolt.api.RevoltHttp -import chat.revolt.api.RevoltJson -import chat.revolt.api.api +import chat.peptide.api.PeptideError +import chat.peptide.api.PeptideHttp +import chat.peptide.api.PeptideJson +import chat.peptide.api.api import io.ktor.client.request.post import io.ktor.client.request.setBody import io.ktor.client.statement.bodyAsText @@ -19,17 +19,17 @@ data class JoinCallResponse( ) suspend fun joinCall(channelId: String, nodeName: String): JoinCallResponse { - val response = RevoltHttp.post("/channels/$channelId/join_call".api()) { + val response = PeptideHttp.post("/channels/$channelId/join_call".api()) { contentType(ContentType.Application.Json) setBody(mapOf("node" to nodeName)) }.bodyAsText() try { - val error = RevoltJson.decodeFromString(RevoltError.serializer(), response) + val error = PeptideJson.decodeFromString(PeptideError.serializer(), response) throw Exception(error.type) } catch (e: SerializationException) { // Not an error } - return RevoltJson.decodeFromString(JoinCallResponse.serializer(), response) + return PeptideJson.decodeFromString(JoinCallResponse.serializer(), response) } \ No newline at end of file diff --git a/app/src/main/java/chat/revolt/api/schemas/Auth.kt b/app/src/main/java/chat/peptide/api/schemas/Auth.kt similarity index 66% rename from app/src/main/java/chat/revolt/api/schemas/Auth.kt rename to app/src/main/java/chat/peptide/api/schemas/Auth.kt index 7772359d..5a82a044 100644 --- a/app/src/main/java/chat/revolt/api/schemas/Auth.kt +++ b/app/src/main/java/chat/peptide/api/schemas/Auth.kt @@ -1,6 +1,6 @@ -package chat.revolt.api.schemas +package chat.peptide.api.schemas -import chat.revolt.api.RevoltAPI +import chat.peptide.api.PeptideAPI import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -10,6 +10,6 @@ data class Session( val name: String ) { fun isCurrent(): Boolean { - return id == RevoltAPI.sessionId + return id == PeptideAPI.sessionId } } diff --git a/app/src/main/java/chat/revolt/api/schemas/Channel.kt b/app/src/main/java/chat/peptide/api/schemas/Channel.kt similarity index 98% rename from app/src/main/java/chat/revolt/api/schemas/Channel.kt rename to app/src/main/java/chat/peptide/api/schemas/Channel.kt index 552b7989..f4a84a0c 100644 --- a/app/src/main/java/chat/revolt/api/schemas/Channel.kt +++ b/app/src/main/java/chat/peptide/api/schemas/Channel.kt @@ -1,4 +1,4 @@ -package chat.revolt.api.schemas +package chat.peptide.api.schemas import kotlinx.datetime.Instant import kotlinx.serialization.KSerializer @@ -111,7 +111,7 @@ enum class ChannelType(val value: String) { override val descriptor: SerialDescriptor get() { return PrimitiveSerialDescriptor( - "chat.revolt.api.schemas.ChannelType", + "chat.peptide.api.schemas.ChannelType", PrimitiveKind.STRING ) } diff --git a/app/src/main/java/chat/revolt/api/schemas/Generic.kt b/app/src/main/java/chat/peptide/api/schemas/Generic.kt similarity index 96% rename from app/src/main/java/chat/revolt/api/schemas/Generic.kt rename to app/src/main/java/chat/peptide/api/schemas/Generic.kt index 6ce8d2ac..43a593da 100644 --- a/app/src/main/java/chat/revolt/api/schemas/Generic.kt +++ b/app/src/main/java/chat/peptide/api/schemas/Generic.kt @@ -1,4 +1,4 @@ -package chat.revolt.api.schemas +package chat.peptide.api.schemas import android.os.Parcelable import kotlinx.parcelize.Parcelize diff --git a/app/src/main/java/chat/revolt/api/schemas/Health.kt b/app/src/main/java/chat/peptide/api/schemas/Health.kt similarity index 93% rename from app/src/main/java/chat/revolt/api/schemas/Health.kt rename to app/src/main/java/chat/peptide/api/schemas/Health.kt index 70980109..7d580d5e 100644 --- a/app/src/main/java/chat/revolt/api/schemas/Health.kt +++ b/app/src/main/java/chat/peptide/api/schemas/Health.kt @@ -1,4 +1,4 @@ -package chat.revolt.api.schemas +package chat.peptide.api.schemas import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/app/src/main/java/chat/revolt/api/schemas/Invites.kt b/app/src/main/java/chat/peptide/api/schemas/Invites.kt similarity index 82% rename from app/src/main/java/chat/revolt/api/schemas/Invites.kt rename to app/src/main/java/chat/peptide/api/schemas/Invites.kt index bf841fbd..109ad690 100644 --- a/app/src/main/java/chat/revolt/api/schemas/Invites.kt +++ b/app/src/main/java/chat/peptide/api/schemas/Invites.kt @@ -1,8 +1,8 @@ -package chat.revolt.api.schemas +package chat.peptide.api.schemas import android.net.Uri import androidx.core.net.toUri -import chat.revolt.api.RevoltAPI +import chat.peptide.api.PeptideAPI import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -51,10 +51,10 @@ data class InviteJoined( fun Uri.isInviteUri(): Boolean { val firstPathSegmentIsInvite = this.pathSegments.firstOrNull() == "invite" - val isAppRevoltChat = this.host == RevoltAPI.getCurrentAppUrl().toUri().host - val matchRvltGG = this.host == RevoltAPI.getCurrentInvitesUrl().toUri().host + val isAppPeptideChat = this.host == PeptideAPI.getCurrentAppUrl().toUri().host + val matchRvltGG = this.host == PeptideAPI.getCurrentInvitesUrl().toUri().host - val matchApp = isAppRevoltChat && firstPathSegmentIsInvite + val matchApp = isAppPeptideChat && firstPathSegmentIsInvite val hasEnoughSegments = if (matchApp) this.pathSegments.size == 2 else this.pathSegments.size == 1 diff --git a/app/src/main/java/chat/revolt/api/schemas/Messages.kt b/app/src/main/java/chat/peptide/api/schemas/Messages.kt similarity index 95% rename from app/src/main/java/chat/revolt/api/schemas/Messages.kt rename to app/src/main/java/chat/peptide/api/schemas/Messages.kt index a311ce6d..c42e4206 100644 --- a/app/src/main/java/chat/revolt/api/schemas/Messages.kt +++ b/app/src/main/java/chat/peptide/api/schemas/Messages.kt @@ -1,6 +1,6 @@ -package chat.revolt.api.schemas +package chat.peptide.api.schemas -import chat.revolt.api.RevoltAPI +import chat.peptide.api.PeptideAPI import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -24,14 +24,14 @@ data class Message( val interactions: InteractionsDescription? = null, val pinned: Boolean? = null, /** - * See [chat.revolt.api.internals.MessageFlag] + * See [chat.peptide.api.internals.MessageFlag] */ val flags: Int? = null, val type: String? = null, // this is _only_ used for websocket events! val tail: Boolean? = null // this is used to determine if the message is the last in a message group ) { fun getAuthor(): User? { - return author?.let { RevoltAPI.userCache[it] } + return author?.let { PeptideAPI.userCache[it] } } fun mergeWithPartial(partial: Message): Message { diff --git a/app/src/main/java/chat/revolt/api/schemas/Safety.kt b/app/src/main/java/chat/peptide/api/schemas/Safety.kt similarity index 96% rename from app/src/main/java/chat/revolt/api/schemas/Safety.kt rename to app/src/main/java/chat/peptide/api/schemas/Safety.kt index fc407390..00c52b03 100644 --- a/app/src/main/java/chat/revolt/api/schemas/Safety.kt +++ b/app/src/main/java/chat/peptide/api/schemas/Safety.kt @@ -1,4 +1,4 @@ -package chat.revolt.api.schemas +package chat.peptide.api.schemas import kotlinx.serialization.KSerializer import kotlinx.serialization.Serializable @@ -29,7 +29,7 @@ enum class ContentReportReason(val value: String) { override val descriptor: SerialDescriptor get() { return PrimitiveSerialDescriptor( - "chat.revolt.api.schemas.ContentReportReason", + "chat.peptide.api.schemas.ContentReportReason", PrimitiveKind.STRING ) } @@ -73,7 +73,7 @@ enum class UserReportReason(val value: String) { override val descriptor: SerialDescriptor get() { return PrimitiveSerialDescriptor( - "chat.revolt.api.schemas.UserReportReason", + "chat.peptide.api.schemas.UserReportReason", PrimitiveKind.STRING ) } diff --git a/app/src/main/java/chat/revolt/api/schemas/Server.kt b/app/src/main/java/chat/peptide/api/schemas/Server.kt similarity index 99% rename from app/src/main/java/chat/revolt/api/schemas/Server.kt rename to app/src/main/java/chat/peptide/api/schemas/Server.kt index 4b637e9c..a12fd284 100644 --- a/app/src/main/java/chat/revolt/api/schemas/Server.kt +++ b/app/src/main/java/chat/peptide/api/schemas/Server.kt @@ -1,4 +1,4 @@ -package chat.revolt.api.schemas +package chat.peptide.api.schemas import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/app/src/main/java/chat/revolt/api/schemas/Settings.kt b/app/src/main/java/chat/peptide/api/schemas/Settings.kt similarity index 92% rename from app/src/main/java/chat/revolt/api/schemas/Settings.kt rename to app/src/main/java/chat/peptide/api/schemas/Settings.kt index 2577a6c0..761c369d 100644 --- a/app/src/main/java/chat/revolt/api/schemas/Settings.kt +++ b/app/src/main/java/chat/peptide/api/schemas/Settings.kt @@ -1,6 +1,6 @@ -package chat.revolt.api.schemas +package chat.peptide.api.schemas -import chat.revolt.ui.theme.OverridableColourScheme +import chat.peptide.ui.theme.OverridableColourScheme import kotlinx.serialization.Serializable import kotlinx.serialization.json.JsonElement @@ -40,7 +40,7 @@ data class AndroidSpecificSettingsSpecialEmbedSettings( data class AndroidSpecificSettings( /** * The theme to use for the app. - * Can be one of `{ None, Revolt, Light, M3Dynamic, Amoled }` + * Can be one of `{ None, Peptide, Light, M3Dynamic, Amoled }` */ var theme: String? = null, /** diff --git a/app/src/main/java/chat/revolt/api/schemas/User.kt b/app/src/main/java/chat/peptide/api/schemas/User.kt similarity index 99% rename from app/src/main/java/chat/revolt/api/schemas/User.kt rename to app/src/main/java/chat/peptide/api/schemas/User.kt index 848f4759..2f06589d 100644 --- a/app/src/main/java/chat/revolt/api/schemas/User.kt +++ b/app/src/main/java/chat/peptide/api/schemas/User.kt @@ -1,4 +1,4 @@ -package chat.revolt.api.schemas +package chat.peptide.api.schemas import android.os.Parcelable import kotlinx.parcelize.Parcelize diff --git a/app/src/main/java/chat/revolt/api/schemas/Util.kt b/app/src/main/java/chat/peptide/api/schemas/Util.kt similarity index 97% rename from app/src/main/java/chat/revolt/api/schemas/Util.kt rename to app/src/main/java/chat/peptide/api/schemas/Util.kt index c6d94165..1f110531 100644 --- a/app/src/main/java/chat/revolt/api/schemas/Util.kt +++ b/app/src/main/java/chat/peptide/api/schemas/Util.kt @@ -1,4 +1,4 @@ -package chat.revolt.api.schemas +package chat.peptide.api.schemas // Result class similar to Rust std::result::Result data class RsResult(val value: V?, val error: E?) { diff --git a/app/src/main/java/chat/revolt/api/schemas/Voice.kt b/app/src/main/java/chat/peptide/api/schemas/Voice.kt similarity index 93% rename from app/src/main/java/chat/revolt/api/schemas/Voice.kt rename to app/src/main/java/chat/peptide/api/schemas/Voice.kt index ba643d4d..722d5159 100644 --- a/app/src/main/java/chat/revolt/api/schemas/Voice.kt +++ b/app/src/main/java/chat/peptide/api/schemas/Voice.kt @@ -1,4 +1,4 @@ -package chat.revolt.api.schemas +package chat.peptide.api.schemas import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/app/src/main/java/chat/revolt/api/settings/Experiments.kt b/app/src/main/java/chat/peptide/api/settings/Experiments.kt similarity index 89% rename from app/src/main/java/chat/revolt/api/settings/Experiments.kt rename to app/src/main/java/chat/peptide/api/settings/Experiments.kt index 818d997e..2db9a1ac 100644 --- a/app/src/main/java/chat/revolt/api/settings/Experiments.kt +++ b/app/src/main/java/chat/peptide/api/settings/Experiments.kt @@ -1,11 +1,11 @@ -package chat.revolt.api.settings +package chat.peptide.api.settings import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue -import chat.revolt.BuildConfig -import chat.revolt.RevoltApplication -import chat.revolt.persistence.KVStorage +import chat.peptide.BuildConfig +import chat.peptide.PeptideApplication +import chat.peptide.persistence.KVStorage class ExperimentInstance(default: Boolean) { private var _isEnabled by mutableStateOf(default) @@ -31,7 +31,7 @@ object Experiments { val enableServerIdentityOptions = ExperimentInstance(false) suspend fun hydrateWithKv() { - val kvStorage = KVStorage(RevoltApplication.instance) + val kvStorage = KVStorage(PeptideApplication.instance) if (BuildConfig.DEBUG) { LoadedSettings.experimentsEnabled = true diff --git a/app/src/main/java/chat/revolt/api/settings/FeatureFlags.kt b/app/src/main/java/chat/peptide/api/settings/FeatureFlags.kt similarity index 93% rename from app/src/main/java/chat/revolt/api/settings/FeatureFlags.kt rename to app/src/main/java/chat/peptide/api/settings/FeatureFlags.kt index f7dee8c9..44c5a6e0 100644 --- a/app/src/main/java/chat/revolt/api/settings/FeatureFlags.kt +++ b/app/src/main/java/chat/peptide/api/settings/FeatureFlags.kt @@ -1,10 +1,10 @@ -package chat.revolt.api.settings +package chat.peptide.api.settings import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue -import chat.revolt.api.RevoltAPI -import chat.revolt.api.internals.SpecialUsers +import chat.peptide.api.PeptideAPI +import chat.peptide.api.internals.SpecialUsers annotation class FeatureFlag(val name: String) annotation class Treatment(val description: String) @@ -60,7 +60,7 @@ object FeatureFlags { @FeatureFlag("LabsAccessControl") var labsAccessControl by mutableStateOf( LabsAccessControlVariates.Restricted { - RevoltAPI.selfId == SpecialUsers.JENNIFER + PeptideAPI.selfId == SpecialUsers.JENNIFER } ) @@ -72,7 +72,7 @@ object FeatureFlags { @FeatureFlag("UserCards") var userCards by mutableStateOf( UserCardsVariates.Restricted { - RevoltAPI.selfId?.endsWith("Z") == true + PeptideAPI.selfId?.endsWith("Z") == true } ) diff --git a/app/src/main/java/chat/revolt/api/settings/GeoStateProvider.kt b/app/src/main/java/chat/peptide/api/settings/GeoStateProvider.kt similarity index 84% rename from app/src/main/java/chat/revolt/api/settings/GeoStateProvider.kt rename to app/src/main/java/chat/peptide/api/settings/GeoStateProvider.kt index 47f50b35..a84ab72a 100644 --- a/app/src/main/java/chat/revolt/api/settings/GeoStateProvider.kt +++ b/app/src/main/java/chat/peptide/api/settings/GeoStateProvider.kt @@ -1,9 +1,9 @@ -package chat.revolt.api.settings +package chat.peptide.api.settings import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue -import chat.revolt.api.routes.microservices.geo.GeoResponse +import chat.peptide.api.routes.microservices.geo.GeoResponse object GeoStateProvider { var geoState by mutableStateOf(null) diff --git a/app/src/main/java/chat/revolt/api/settings/LoadedSettings.kt b/app/src/main/java/chat/peptide/api/settings/LoadedSettings.kt similarity index 59% rename from app/src/main/java/chat/revolt/api/settings/LoadedSettings.kt rename to app/src/main/java/chat/peptide/api/settings/LoadedSettings.kt index ea322c00..436c5fd9 100644 --- a/app/src/main/java/chat/revolt/api/settings/LoadedSettings.kt +++ b/app/src/main/java/chat/peptide/api/settings/LoadedSettings.kt @@ -1,12 +1,12 @@ -package chat.revolt.api.settings +package chat.peptide.api.settings import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue -import chat.revolt.api.schemas.AndroidSpecificSettingsSpecialEmbedSettings -import chat.revolt.ui.theme.Theme -import chat.revolt.ui.theme.getDefaultTheme +import chat.peptide.api.schemas.AndroidSpecificSettingsSpecialEmbedSettings +import chat.peptide.ui.theme.Theme +import chat.peptide.ui.theme.getDefaultTheme enum class MessageReplyStyle { None, @@ -25,12 +25,16 @@ object LoadedSettings { var poorlyFormedSettingsKeys by mutableStateOf(emptySet()) fun hydrateWithSettings(settings: SyncedSettings) { - this.theme = settings.android.theme?.let { Theme.valueOf(it) } ?: getDefaultTheme() - this.messageReplyStyle = - settings.android.messageReplyStyle?.let { MessageReplyStyle.valueOf(it) } - ?: MessageReplyStyle.SwipeFromEnd - this.avatarRadius = settings.android.avatarRadius ?: 50 - this.specialEmbedSettings = settings.android.specialEmbedSettings ?: SpecialEmbedSettings() + try { + this.theme = settings.android.theme?.let { Theme.valueOf(it) } ?: getDefaultTheme() + this.messageReplyStyle = + settings.android.messageReplyStyle?.let { MessageReplyStyle.valueOf(it) } + ?: MessageReplyStyle.SwipeFromEnd + this.avatarRadius = settings.android.avatarRadius ?: 50 + this.specialEmbedSettings = settings.android.specialEmbedSettings ?: SpecialEmbedSettings() + } catch (_: Exception) { + reset() + } } fun reset() { diff --git a/app/src/main/java/chat/revolt/api/settings/NotificationSettingsProvider.kt b/app/src/main/java/chat/peptide/api/settings/NotificationSettingsProvider.kt similarity index 91% rename from app/src/main/java/chat/revolt/api/settings/NotificationSettingsProvider.kt rename to app/src/main/java/chat/peptide/api/settings/NotificationSettingsProvider.kt index 899b3913..b6e340a4 100644 --- a/app/src/main/java/chat/revolt/api/settings/NotificationSettingsProvider.kt +++ b/app/src/main/java/chat/peptide/api/settings/NotificationSettingsProvider.kt @@ -1,4 +1,4 @@ -package chat.revolt.api.settings +package chat.peptide.api.settings object NotificationSettingsProvider { fun isChannelMuted(channelId: String, serverId: String?): Boolean { diff --git a/app/src/main/java/chat/peptide/api/settings/NotificationType.kt b/app/src/main/java/chat/peptide/api/settings/NotificationType.kt new file mode 100644 index 00000000..d203af6a --- /dev/null +++ b/app/src/main/java/chat/peptide/api/settings/NotificationType.kt @@ -0,0 +1,25 @@ +package chat.peptide.api.settings + +enum class NotificationType(val storageValue: String) { + DEFAULT("default"), + MUTED("muted"), + ALL("all"), + MENTIONS_ONLY("mentions"), + NONE("none"); + + companion object { + fun fromStorage(value: String?): NotificationType { + return when (value) { + null -> DEFAULT + "default" -> DEFAULT + "muted" -> MUTED + "all" -> ALL + "mentions" -> MENTIONS_ONLY + "none" -> NONE + else -> DEFAULT + } + } + } +} + + diff --git a/app/src/main/java/chat/revolt/api/settings/SyncedSettings.kt b/app/src/main/java/chat/peptide/api/settings/SyncedSettings.kt similarity index 76% rename from app/src/main/java/chat/revolt/api/settings/SyncedSettings.kt rename to app/src/main/java/chat/peptide/api/settings/SyncedSettings.kt index 3bbe4b53..20bf8306 100644 --- a/app/src/main/java/chat/revolt/api/settings/SyncedSettings.kt +++ b/app/src/main/java/chat/peptide/api/settings/SyncedSettings.kt @@ -1,14 +1,14 @@ -package chat.revolt.api.settings +package chat.peptide.api.settings import androidx.compose.runtime.mutableStateOf -import chat.revolt.api.RevoltAPI -import chat.revolt.api.RevoltJson -import chat.revolt.api.routes.sync.getKeys -import chat.revolt.api.routes.sync.setKey -import chat.revolt.api.schemas.AndroidSpecificSettings -import chat.revolt.api.schemas.NotificationSettings -import chat.revolt.api.schemas.OrderingSettings -import chat.revolt.api.schemas._NotificationSettingsToParse +import chat.peptide.api.PeptideAPI +import chat.peptide.api.PeptideJson +import chat.peptide.api.routes.sync.getKeys +import chat.peptide.api.routes.sync.setKey +import chat.peptide.api.schemas.AndroidSpecificSettings +import chat.peptide.api.schemas.NotificationSettings +import chat.peptide.api.schemas.OrderingSettings +import chat.peptide.api.schemas._NotificationSettingsToParse import kotlinx.serialization.json.JsonPrimitive import kotlinx.serialization.json.jsonPrimitive import logcat.LogPriority @@ -40,14 +40,14 @@ object SyncedSettings { val notifications: NotificationSettings get() = _notifications.value - suspend fun fetch(revoltToken: String = RevoltAPI.sessionToken) { + suspend fun fetch(peptideToken: String = PeptideAPI.sessionToken) { try { val settings = - getKeys("ordering", "android", "notifications", revoltToken = revoltToken) + getKeys("ordering", "android", "notifications", peptideToken = peptideToken) settings["ordering"]?.let { try { - _ordering.value = RevoltJson.decodeFromString( + _ordering.value = PeptideJson.decodeFromString( OrderingSettings.serializer(), it.value ) @@ -59,7 +59,7 @@ object SyncedSettings { settings["android"]?.let { try { - _android.value = RevoltJson.decodeFromString( + _android.value = PeptideJson.decodeFromString( AndroidSpecificSettings.serializer(), it.value ) @@ -82,7 +82,7 @@ object SyncedSettings { private fun parseNotificationSettings(value: String): NotificationSettings { return try { var intermediate = - RevoltJson.decodeFromString(_NotificationSettingsToParse.serializer(), value) + PeptideJson.decodeFromString(_NotificationSettingsToParse.serializer(), value) // Throw out any value of intermediate.server and .channel that isn't a string intermediate = intermediate.copy( @@ -108,23 +108,23 @@ object SyncedSettings { suspend fun updateOrdering(value: OrderingSettings) { _ordering.value = value - setKey("ordering", RevoltJson.encodeToString(OrderingSettings.serializer(), value)) + setKey("ordering", PeptideJson.encodeToString(OrderingSettings.serializer(), value)) } suspend fun updateAndroid(value: AndroidSpecificSettings) { _android.value = value - setKey("android", RevoltJson.encodeToString(AndroidSpecificSettings.serializer(), value)) + setKey("android", PeptideJson.encodeToString(AndroidSpecificSettings.serializer(), value)) } suspend fun updateNotifications(value: NotificationSettings) { _notifications.value = value - setKey("notifications", RevoltJson.encodeToString(NotificationSettings.serializer(), value)) + setKey("notifications", PeptideJson.encodeToString(NotificationSettings.serializer(), value)) } suspend fun resetOrdering() { val default = OrderingSettings() _ordering.value = default - setKey("ordering", RevoltJson.encodeToString(OrderingSettings.serializer(), default)) + setKey("ordering", PeptideJson.encodeToString(OrderingSettings.serializer(), default)) } suspend fun resetAndroid() { @@ -134,7 +134,7 @@ object SyncedSettings { messageReplyStyle = "None" ) _android.value = default - setKey("android", RevoltJson.encodeToString(AndroidSpecificSettings.serializer(), default)) + setKey("android", PeptideJson.encodeToString(AndroidSpecificSettings.serializer(), default)) } suspend fun resetNotifications() { @@ -142,7 +142,7 @@ object SyncedSettings { _notifications.value = default setKey( "notifications", - RevoltJson.encodeToString(NotificationSettings.serializer(), default) + PeptideJson.encodeToString(NotificationSettings.serializer(), default) ) } } diff --git a/app/src/main/java/chat/revolt/api/unreads/Unreads.kt b/app/src/main/java/chat/peptide/api/unreads/Unreads.kt similarity index 82% rename from app/src/main/java/chat/revolt/api/unreads/Unreads.kt rename to app/src/main/java/chat/peptide/api/unreads/Unreads.kt index 4be01c41..54c62168 100644 --- a/app/src/main/java/chat/revolt/api/unreads/Unreads.kt +++ b/app/src/main/java/chat/peptide/api/unreads/Unreads.kt @@ -1,16 +1,16 @@ -package chat.revolt.api.unreads +package chat.peptide.api.unreads import android.util.Log import androidx.compose.runtime.mutableStateMapOf import androidx.compose.runtime.mutableStateOf -import chat.revolt.api.RevoltAPI -import chat.revolt.api.internals.ULID -import chat.revolt.api.routes.channel.ackChannel -import chat.revolt.api.routes.server.ackServer -import chat.revolt.api.routes.sync.syncUnreads -import chat.revolt.api.schemas.ChannelType -import chat.revolt.api.schemas.ChannelUnread -import chat.revolt.api.settings.NotificationSettingsProvider +import chat.peptide.api.PeptideAPI +import chat.peptide.api.internals.ULID +import chat.peptide.api.routes.channel.ackChannel +import chat.peptide.api.routes.server.ackServer +import chat.peptide.api.routes.sync.syncUnreads +import chat.peptide.api.schemas.ChannelType +import chat.peptide.api.schemas.ChannelUnread +import chat.peptide.api.settings.NotificationSettingsProvider class Unreads { private val hasLoaded = mutableStateOf(false) @@ -50,8 +50,8 @@ class Unreads { fun serverHasUnread(serverId: String): Boolean { if (!hasLoaded.value) return false - return RevoltAPI.serverCache[serverId]?.channels?.any { - val channel = RevoltAPI.channelCache[it] ?: return@any false // Channel not found + return PeptideAPI.serverCache[serverId]?.channels?.any { + val channel = PeptideAPI.channelCache[it] ?: return@any false // Channel not found if (channel.channelType == ChannelType.VoiceChannel) return@any false // Channel is voice if (NotificationSettingsProvider.isChannelMuted( it, @@ -81,7 +81,7 @@ class Unreads { suspend fun markServerAsRead(serverId: String, sync: Boolean = true) { if (!hasLoaded.value) return - val server = RevoltAPI.serverCache[serverId] ?: return + val server = PeptideAPI.serverCache[serverId] ?: return server.channels?.forEach { channel -> channels[channel] = channels[channel]?.copy(last_id = ULID.makeNext()) ?: ChannelUnread( channel, diff --git a/app/src/main/java/chat/revolt/c2dm/ChannelRegistrator.kt b/app/src/main/java/chat/peptide/c2dm/ChannelRegistrator.kt similarity index 89% rename from app/src/main/java/chat/revolt/c2dm/ChannelRegistrator.kt rename to app/src/main/java/chat/peptide/c2dm/ChannelRegistrator.kt index e3751546..8e880c70 100644 --- a/app/src/main/java/chat/revolt/c2dm/ChannelRegistrator.kt +++ b/app/src/main/java/chat/peptide/c2dm/ChannelRegistrator.kt @@ -1,11 +1,11 @@ -package chat.revolt.c2dm +package chat.peptide.c2dm import android.app.NotificationChannel import android.app.NotificationChannelGroup import android.app.NotificationManager import android.content.Context import androidx.core.content.ContextCompat.getSystemService -import chat.revolt.R +import chat.peptide.R // TODO // * Add the remaining groups. @@ -15,10 +15,10 @@ import chat.revolt.R class ChannelRegistrator(val context: Context) { companion object { - const val CHANNEL_ID_GROUP_CONVERSATIONS = "chat.revolt.c2dm.conversations" + const val CHANNEL_ID_GROUP_CONVERSATIONS = "chat.peptide.c2dm.conversations" - const val CHANNEL_ID_GROUP_SOCIAL = "chat.revolt.c2dm.social" - const val CHANNEL_ID_GROUP_SOCIAL_FRIENDREQUESTS = "chat.revolt.c2dm.social.friendrequests" + const val CHANNEL_ID_GROUP_SOCIAL = "chat.peptide.c2dm.social" + const val CHANNEL_ID_GROUP_SOCIAL_FRIENDREQUESTS = "chat.peptide.c2dm.social.friendrequests" } private val notificationManager = diff --git a/app/src/main/java/chat/revolt/c2dm/HandlerService.kt b/app/src/main/java/chat/peptide/c2dm/HandlerService.kt similarity index 87% rename from app/src/main/java/chat/revolt/c2dm/HandlerService.kt rename to app/src/main/java/chat/peptide/c2dm/HandlerService.kt index ff21cb7a..f21d473e 100644 --- a/app/src/main/java/chat/revolt/c2dm/HandlerService.kt +++ b/app/src/main/java/chat/peptide/c2dm/HandlerService.kt @@ -1,4 +1,4 @@ -package chat.revolt.c2dm +package chat.peptide.c2dm import android.app.PendingIntent import android.content.Intent @@ -10,17 +10,17 @@ import androidx.core.app.NotificationManagerCompat import androidx.core.app.Person import androidx.core.app.RemoteInput import androidx.core.graphics.drawable.IconCompat -import chat.revolt.R -import chat.revolt.activities.MainActivity -import chat.revolt.api.RevoltAPI -import chat.revolt.api.RevoltJson -import chat.revolt.api.internals.ULID -import chat.revolt.api.routes.push.subscribePush -import chat.revolt.api.schemas.Message -import chat.revolt.api.schemas.User -import chat.revolt.c2dm.ChannelRegistrator.Companion.CHANNEL_ID_GROUP_SOCIAL_FRIENDREQUESTS -import chat.revolt.persistence.Database -import chat.revolt.persistence.SqlStorage +import chat.peptide.R +import chat.peptide.activities.MainActivity +import chat.peptide.api.PeptideAPI +import chat.peptide.api.PeptideJson +import chat.peptide.api.internals.ULID +import chat.peptide.api.routes.push.subscribePush +import chat.peptide.api.schemas.Message +import chat.peptide.api.schemas.User +import chat.peptide.c2dm.ChannelRegistrator.Companion.CHANNEL_ID_GROUP_SOCIAL_FRIENDREQUESTS +import chat.peptide.persistence.Database +import chat.peptide.persistence.SqlStorage import com.bumptech.glide.Glide import com.google.firebase.messaging.FirebaseMessagingService import com.google.firebase.messaging.RemoteMessage @@ -51,13 +51,13 @@ class HandlerService : FirebaseMessagingService() { Log.d("HandlerService", payloadString) - val payload = RevoltJson.parseToJsonElement(payloadString).jsonObject + val payload = PeptideJson.parseToJsonElement(payloadString).jsonObject val keys = payload.keys.toList().toString() Log.d("HandlerService", "following keys: $keys") var authorIcon = payload["icon"]?.jsonPrimitive?.contentOrNull val message = payload["message"]?.jsonObject?.let { - RevoltJson.decodeFromJsonElement( + PeptideJson.decodeFromJsonElement( Message.serializer(), it ) @@ -67,7 +67,7 @@ class HandlerService : FirebaseMessagingService() { } val user = payload["message"]?.jsonObject?.get("user")?.jsonObject?.let { - RevoltJson.decodeFromJsonElement( + PeptideJson.decodeFromJsonElement( User.serializer(), it ) @@ -78,7 +78,7 @@ class HandlerService : FirebaseMessagingService() { if (authorIcon == null) { authorIcon = - "${RevoltAPI.getCurrentBaseUrl()}/users/${message.author?.ifBlank { "0".repeat(26) }}/default_avatar" + "${PeptideAPI.getCurrentBaseUrl()}/users/${message.author?.ifBlank { "0".repeat(26) }}/default_avatar" } val db = Database(SqlStorage.driver) diff --git a/app/src/main/java/chat/revolt/callbacks/ActionChannel.kt b/app/src/main/java/chat/peptide/callbacks/ActionChannel.kt similarity index 79% rename from app/src/main/java/chat/revolt/callbacks/ActionChannel.kt rename to app/src/main/java/chat/peptide/callbacks/ActionChannel.kt index c8f0d630..a674e917 100644 --- a/app/src/main/java/chat/revolt/callbacks/ActionChannel.kt +++ b/app/src/main/java/chat/peptide/callbacks/ActionChannel.kt @@ -1,11 +1,14 @@ -package chat.revolt.callbacks +package chat.peptide.callbacks -import chat.revolt.screens.chat.ChatRouterDestination +import chat.peptide.screens.chat.ChatRouterDestination import kotlinx.coroutines.channels.Channel sealed class Action { data class OpenUserSheet(val userId: String, val serverId: String?) : Action() - data class SwitchChannel(val channelId: String) : Action() + data class SwitchChannel( + val channelId: String, + val messageId: String? = null, + ) : Action() data class LinkInfo(val url: String) : Action() data class EmoteInfo(val emoteId: String) : Action() data class MessageReactionInfo(val messageId: String, val emoji: String) : Action() diff --git a/app/src/main/java/chat/revolt/callbacks/UiCallbacks.kt b/app/src/main/java/chat/peptide/callbacks/UiCallbacks.kt similarity index 96% rename from app/src/main/java/chat/revolt/callbacks/UiCallbacks.kt rename to app/src/main/java/chat/peptide/callbacks/UiCallbacks.kt index 725d9b13..519f2a16 100644 --- a/app/src/main/java/chat/revolt/callbacks/UiCallbacks.kt +++ b/app/src/main/java/chat/peptide/callbacks/UiCallbacks.kt @@ -1,4 +1,4 @@ -package chat.revolt.callbacks +package chat.peptide.callbacks import kotlinx.coroutines.flow.MutableSharedFlow diff --git a/app/src/main/java/chat/revolt/composables/chat/DateDivider.kt b/app/src/main/java/chat/peptide/composables/chat/DateDivider.kt similarity index 97% rename from app/src/main/java/chat/revolt/composables/chat/DateDivider.kt rename to app/src/main/java/chat/peptide/composables/chat/DateDivider.kt index 6aca1028..400186c0 100644 --- a/app/src/main/java/chat/revolt/composables/chat/DateDivider.kt +++ b/app/src/main/java/chat/peptide/composables/chat/DateDivider.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.chat +package chat.peptide.composables.chat import android.icu.text.DateFormat import android.text.format.DateUtils diff --git a/app/src/main/java/chat/revolt/composables/chat/DisconnectedNotice.kt b/app/src/main/java/chat/peptide/composables/chat/DisconnectedNotice.kt similarity index 96% rename from app/src/main/java/chat/revolt/composables/chat/DisconnectedNotice.kt rename to app/src/main/java/chat/peptide/composables/chat/DisconnectedNotice.kt index 05fc735e..cdfd058c 100644 --- a/app/src/main/java/chat/revolt/composables/chat/DisconnectedNotice.kt +++ b/app/src/main/java/chat/peptide/composables/chat/DisconnectedNotice.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.chat +package chat.peptide.composables.chat import androidx.compose.foundation.background import androidx.compose.foundation.clickable @@ -28,10 +28,10 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import chat.revolt.R -import chat.revolt.api.realtime.DisconnectionState -import chat.revolt.api.settings.LoadedSettings -import chat.revolt.ui.theme.Theme +import chat.peptide.R +import chat.peptide.api.realtime.DisconnectionState +import chat.peptide.api.settings.LoadedSettings +import chat.peptide.ui.theme.Theme private val NON_MATERIAL_COLOURS = mapOf( DisconnectionState.Disconnected to (Color(0xff4E0C0C) to Color(0xffff1744)), diff --git a/app/src/main/java/chat/revolt/composables/chat/Embed.kt b/app/src/main/java/chat/peptide/composables/chat/Embed.kt similarity index 91% rename from app/src/main/java/chat/revolt/composables/chat/Embed.kt rename to app/src/main/java/chat/peptide/composables/chat/Embed.kt index b1464475..08103352 100644 --- a/app/src/main/java/chat/revolt/composables/chat/Embed.kt +++ b/app/src/main/java/chat/peptide/composables/chat/Embed.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.chat +package chat.peptide.composables.chat import androidx.compose.foundation.background import androidx.compose.foundation.clickable @@ -23,14 +23,14 @@ import androidx.compose.ui.graphics.Brush import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp -import chat.revolt.api.internals.BrushCompat -import chat.revolt.api.internals.solidColor -import chat.revolt.api.routes.microservices.january.asJanuaryProxyUrl -import chat.revolt.api.schemas.Embed -import chat.revolt.composables.chat.specialembeds.SpecialEmbedSwitch -import chat.revolt.composables.generic.RemoteImage -import chat.revolt.composables.markdown.RichMarkdown -import chat.revolt.api.schemas.Embed as EmbedSchema +import chat.peptide.api.internals.BrushCompat +import chat.peptide.api.internals.solidColor +import chat.peptide.api.routes.microservices.january.asJanuaryProxyUrl +import chat.peptide.api.schemas.Embed +import chat.peptide.composables.chat.specialembeds.SpecialEmbedSwitch +import chat.peptide.composables.generic.RemoteImage +import chat.peptide.composables.markdown.RichMarkdown +import chat.peptide.api.schemas.Embed as EmbedSchema @Composable fun RegularEmbed( diff --git a/app/src/main/java/chat/revolt/composables/chat/InReplyTo.kt b/app/src/main/java/chat/peptide/composables/chat/InReplyTo.kt similarity index 87% rename from app/src/main/java/chat/revolt/composables/chat/InReplyTo.kt rename to app/src/main/java/chat/peptide/composables/chat/InReplyTo.kt index a4197ff9..a6b1fcbc 100644 --- a/app/src/main/java/chat/revolt/composables/chat/InReplyTo.kt +++ b/app/src/main/java/chat/peptide/composables/chat/InReplyTo.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.chat +package chat.peptide.composables.chat import android.util.Log import androidx.compose.foundation.clickable @@ -26,16 +26,16 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import chat.revolt.R -import chat.revolt.api.RevoltAPI -import chat.revolt.api.internals.solidColor -import chat.revolt.api.routes.channel.fetchSingleMessage -import chat.revolt.api.schemas.User -import chat.revolt.api.settings.Experiments -import chat.revolt.composables.generic.UserAvatar -import chat.revolt.markdown.jbm.JBM -import chat.revolt.markdown.jbm.JBMRenderer -import chat.revolt.markdown.jbm.LocalJBMarkdownTreeState +import chat.peptide.R +import chat.peptide.api.PeptideAPI +import chat.peptide.api.internals.solidColor +import chat.peptide.api.routes.channel.fetchSingleMessage +import chat.peptide.api.schemas.User +import chat.peptide.api.settings.Experiments +import chat.peptide.composables.generic.UserAvatar +import chat.peptide.markdown.jbm.JBM +import chat.peptide.markdown.jbm.JBMRenderer +import chat.peptide.markdown.jbm.LocalJBMarkdownTreeState import java.util.concurrent.CancellationException @OptIn(JBM::class) @@ -47,8 +47,8 @@ fun InReplyTo( withMention: Boolean = false, onMessageClick: (String) -> Unit = { _ -> } ) { - val message = RevoltAPI.messageCache[messageId] - val author = RevoltAPI.userCache[message?.author ?: ""] + val message = PeptideAPI.messageCache[messageId] + val author = PeptideAPI.userCache[message?.author ?: ""] val username = message?.let { authorName(it) } ?: author?.let { User.resolveDefaultName(it) } @@ -58,12 +58,12 @@ fun InReplyTo( val usernameColor = message?.let { authorColour(it) } ?: Brush.solidColor(contentColor) - val serverId = remember(channelId) { RevoltAPI.channelCache[channelId]?.server } + val serverId = remember(channelId) { PeptideAPI.channelCache[channelId]?.server } LaunchedEffect(messageId) { - if (messageId !in RevoltAPI.messageCache) { + if (messageId !in PeptideAPI.messageCache) { try { - RevoltAPI.messageCache[messageId] = fetchSingleMessage(channelId, messageId) + PeptideAPI.messageCache[messageId] = fetchSingleMessage(channelId, messageId) } catch (e: CancellationException) { // It's fine } catch (e: Exception) { diff --git a/app/src/main/java/chat/revolt/composables/chat/InlineBadge.kt b/app/src/main/java/chat/peptide/composables/chat/InlineBadge.kt similarity index 98% rename from app/src/main/java/chat/revolt/composables/chat/InlineBadge.kt rename to app/src/main/java/chat/peptide/composables/chat/InlineBadge.kt index a5f9bfc5..1a92e2a7 100644 --- a/app/src/main/java/chat/revolt/composables/chat/InlineBadge.kt +++ b/app/src/main/java/chat/peptide/composables/chat/InlineBadge.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.chat +package chat.peptide.composables.chat import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.padding @@ -9,7 +9,7 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp -import chat.revolt.R +import chat.peptide.R enum class InlineBadge { Bot, diff --git a/app/src/main/java/chat/revolt/composables/chat/MemberListItem.kt b/app/src/main/java/chat/peptide/composables/chat/MemberListItem.kt similarity index 80% rename from app/src/main/java/chat/revolt/composables/chat/MemberListItem.kt rename to app/src/main/java/chat/peptide/composables/chat/MemberListItem.kt index 775ed1dc..9e36bc51 100644 --- a/app/src/main/java/chat/revolt/composables/chat/MemberListItem.kt +++ b/app/src/main/java/chat/peptide/composables/chat/MemberListItem.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.chat +package chat.peptide.composables.chat import androidx.compose.material3.ListItem import androidx.compose.material3.LocalContentColor @@ -8,15 +8,15 @@ 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.RevoltAPI -import chat.revolt.api.internals.BrushCompat -import chat.revolt.api.internals.Roles -import chat.revolt.api.internals.solidColor -import chat.revolt.api.schemas.Member -import chat.revolt.api.schemas.User -import chat.revolt.composables.generic.UserAvatar -import chat.revolt.composables.generic.presenceFromStatus -import chat.revolt.internals.extensions.TransparentListItemColours +import chat.peptide.api.PeptideAPI +import chat.peptide.api.internals.BrushCompat +import chat.peptide.api.internals.Roles +import chat.peptide.api.internals.solidColor +import chat.peptide.api.schemas.Member +import chat.peptide.api.schemas.User +import chat.peptide.composables.generic.UserAvatar +import chat.peptide.composables.generic.presenceFromStatus +import chat.peptide.internals.extensions.TransparentListItemColours @Composable fun MemberListItem( @@ -74,7 +74,7 @@ fun MemberListItem( ?: user?.id ?: userId, avatar = user?.avatar, - rawUrl = member?.avatar?.let { "${RevoltAPI.getCurrentFilesUrl()}/avatars/${it.id}" }, + rawUrl = member?.avatar?.let { "${PeptideAPI.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/peptide/composables/chat/Message.kt similarity index 85% rename from app/src/main/java/chat/revolt/composables/chat/Message.kt rename to app/src/main/java/chat/peptide/composables/chat/Message.kt index 50fba1c1..c27d59af 100644 --- a/app/src/main/java/chat/revolt/composables/chat/Message.kt +++ b/app/src/main/java/chat/peptide/composables/chat/Message.kt @@ -1,10 +1,11 @@ -package chat.revolt.composables.chat +package chat.peptide.composables.chat import android.annotation.SuppressLint import android.content.Intent import android.icu.text.DateFormat import android.net.Uri import android.text.format.DateUtils +import android.util.Log import android.widget.Toast import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.contract.ActivityResultContracts @@ -59,40 +60,41 @@ import androidx.compose.ui.text.style.TextDecoration import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp 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.RevoltAPI -import chat.revolt.api.internals.BrushCompat -import chat.revolt.api.internals.MessageFlag -import chat.revolt.api.internals.Roles -import chat.revolt.api.internals.SpecialUsers -import chat.revolt.api.internals.ULID -import chat.revolt.api.internals.has -import chat.revolt.api.internals.solidColor -import chat.revolt.api.routes.channel.react -import chat.revolt.api.routes.channel.unreact -import chat.revolt.api.routes.microservices.january.asJanuaryProxyUrl -import chat.revolt.api.schemas.AutumnResource -import chat.revolt.api.schemas.User -import chat.revolt.api.settings.Experiments -import chat.revolt.api.settings.LoadedSettings -import chat.revolt.api.settings.MessageReplyStyle -import chat.revolt.callbacks.Action -import chat.revolt.callbacks.ActionChannel -import chat.revolt.composables.generic.RemoteImage -import chat.revolt.composables.generic.UserAvatar -import chat.revolt.composables.generic.UserAvatarWidthPlaceholder -import chat.revolt.composables.markdown.LocalMarkdownTreeConfig -import chat.revolt.composables.markdown.RichMarkdown -import chat.revolt.internals.text.Gigamoji -import chat.revolt.internals.text.MessageProcessor -import chat.revolt.markdown.jbm.JBM -import chat.revolt.markdown.jbm.JBMRenderer -import chat.revolt.markdown.jbm.LocalJBMarkdownTreeState -import chat.revolt.persistence.KVStorage +import chat.peptide.R +import chat.peptide.activities.media.ImageViewActivity +import chat.peptide.activities.media.VideoViewActivity +import chat.peptide.api.PeptideAPI +import chat.peptide.api.internals.BrushCompat +import chat.peptide.api.internals.MessageFlag +import chat.peptide.api.internals.Roles +import chat.peptide.api.internals.SpecialUsers +import chat.peptide.api.internals.ULID +import chat.peptide.api.internals.has +import chat.peptide.api.internals.solidColor +import chat.peptide.api.routes.channel.react +import chat.peptide.api.routes.channel.unreact +import chat.peptide.api.routes.microservices.january.asJanuaryProxyUrl +import chat.peptide.api.schemas.AutumnResource +import chat.peptide.api.schemas.User +import chat.peptide.api.settings.Experiments +import chat.peptide.api.settings.LoadedSettings +import chat.peptide.api.settings.MessageReplyStyle +import chat.peptide.callbacks.Action +import chat.peptide.callbacks.ActionChannel +import chat.peptide.utils.InternalLinkHandler +import chat.peptide.composables.generic.RemoteImage +import chat.peptide.composables.generic.UserAvatar +import chat.peptide.composables.generic.UserAvatarWidthPlaceholder +import chat.peptide.composables.markdown.LocalMarkdownTreeConfig +import chat.peptide.composables.markdown.RichMarkdown +import chat.peptide.internals.text.Gigamoji +import chat.peptide.internals.text.MessageProcessor +import chat.peptide.markdown.jbm.JBM +import chat.peptide.markdown.jbm.JBMRenderer +import chat.peptide.markdown.jbm.LocalJBMarkdownTreeState +import chat.peptide.persistence.KVStorage import kotlinx.coroutines.launch -import chat.revolt.api.schemas.Message as MessageSchema +import chat.peptide.api.schemas.Message as MessageSchema @Composable fun authorColour(message: MessageSchema): Brush { @@ -101,7 +103,7 @@ fun authorColour(message: MessageSchema): Brush { } else { val defaultColour = Brush.solidColor(LocalContentColor.current) - val serverId = RevoltAPI.channelCache[message.channel]?.server ?: return defaultColour + val serverId = PeptideAPI.channelCache[message.channel]?.server ?: return defaultColour val highestRole = message.author?.let { Roles.resolveHighestRole(serverId, it, withColour = true) @@ -119,14 +121,14 @@ fun authorName(message: MessageSchema): String { } val serverId = - RevoltAPI.channelCache[message.channel]?.server - ?: return RevoltAPI.userCache[message.author]?.let { User.resolveDefaultName(it) } + PeptideAPI.channelCache[message.channel]?.server + ?: return PeptideAPI.userCache[message.author]?.let { User.resolveDefaultName(it) } ?: stringResource(R.string.unknown) - val member = message.author?.let { RevoltAPI.members.getMember(serverId, it) } + val member = message.author?.let { PeptideAPI.members.getMember(serverId, it) } ?: return stringResource(R.string.unknown) return member.nickname - ?: RevoltAPI.userCache[message.author]?.let { User.resolveDefaultName(it) } + ?: PeptideAPI.userCache[message.author]?.let { User.resolveDefaultName(it) } ?: stringResource(R.string.unknown) } @@ -137,22 +139,52 @@ fun authorAvatarUrl(message: MessageSchema): String? { } val serverId = - RevoltAPI.channelCache[message.channel]?.server ?: return null - val member = message.author?.let { RevoltAPI.members.getMember(serverId, it) } + PeptideAPI.channelCache[message.channel]?.server ?: return null + val member = message.author?.let { PeptideAPI.members.getMember(serverId, it) } ?: return null - return member.avatar?.let { "${RevoltAPI.getCurrentFilesUrl()}/avatars/${it.id}" } + return member.avatar?.let { "${PeptideAPI.getCurrentFilesUrl()}/avatars/${it.id}" } } fun viewUrlInBrowser(ctx: android.content.Context, url: String) { - val customTab = CustomTabsIntent - .Builder() - .build() - customTab.launchUrl(ctx, Uri.parse(url)) + Log.d("Message", "viewUrlInBrowser called with url: $url") + + // Check if this is an internal link that should be handled by the app + if (InternalLinkHandler.isInternalLink(url)) { + Log.d("Message", "URL is an internal link, attempting to handle internally") + + // Try to handle the link internally + val handled = InternalLinkHandler.handleInternalLink(ctx, url, true) + + Log.d("Message", "Internal link handled: $handled") + + if (handled) { + // Link was handled internally + Log.d("Message", "Link was handled internally, returning") + return + } else { + Log.d("Message", "Failed to handle link internally, falling back to browser") + } + } else { + Log.d("Message", "URL is not an internal link, opening in browser") + } + + // If not an internal link or couldn't be handled internally, open in browser + try { + Log.d("Message", "Opening URL in browser") + val customTab = CustomTabsIntent + .Builder() + .build() + customTab.launchUrl(ctx, Uri.parse(url)) + Log.d("Message", "URL opened in browser successfully") + } catch (e: Exception) { + Log.e("Message", "Error opening URL in browser", e) + } } fun viewAttachmentInBrowser(ctx: android.content.Context, attachment: AutumnResource) { - val url = "${RevoltAPI.getCurrentFilesUrl()}/attachments/${attachment.id}/${attachment.filename}" + val url = + "${PeptideAPI.getCurrentFilesUrl()}/attachments/${attachment.id}/${attachment.filename}" viewUrlInBrowser(ctx, url) } @@ -186,6 +218,7 @@ fun formatLongAsTime(time: Long): String { @OptIn(ExperimentalFoundationApi::class, ExperimentalLayoutApi::class, JBM::class) @Composable fun Message( + modifier: Modifier = Modifier, message: MessageSchema, onMessageContextMenu: () -> Unit = {}, onAvatarClick: () -> Unit = {}, @@ -195,9 +228,8 @@ fun Message( onAddReaction: () -> Unit = {}, fromWebhook: Boolean = false, webhookName: String? = null, - modifier: Modifier = Modifier ) { - val author = RevoltAPI.userCache[message.author] ?: return CircularProgressIndicator() + val author = PeptideAPI.userCache[message.author] ?: return CircularProgressIndicator() val context = LocalContext.current val scope = rememberCoroutineScope() @@ -229,8 +261,8 @@ fun Message( var mentionsSelfRole by remember(message) { mutableStateOf(false) } LaunchedEffect(Unit) { val serverId = - RevoltAPI.channelCache[message.channel]?.server ?: return@LaunchedEffect - var selfMember = RevoltAPI.selfId?.let { RevoltAPI.members.getMember(serverId, it) } + PeptideAPI.channelCache[message.channel]?.server ?: return@LaunchedEffect + var selfMember = PeptideAPI.selfId?.let { PeptideAPI.members.getMember(serverId, it) } ?: return@LaunchedEffect var messageRoleMentions = MessageProcessor.findMentionedRoleIDs(message.content) @@ -280,7 +312,7 @@ fun Message( } else { Column( modifier = Modifier.then( - if ((message.mentions?.contains(RevoltAPI.selfId) == true) + if ((message.mentions?.contains(PeptideAPI.selfId) == true) || mentionsSelfRole || message.flags has MessageFlag.MentionsOnline || message.flags has MessageFlag.MentionsEveryone @@ -294,7 +326,7 @@ fun Message( ) ) { message.replies?.forEach { reply -> - val replyMessage = RevoltAPI.messageCache[reply] + val replyMessage = PeptideAPI.messageCache[reply] message.channel?.let { chId -> InReplyTo( @@ -430,7 +462,7 @@ fun Message( if (Experiments.useKotlinBasedMarkdownRenderer.isEnabled) { CompositionLocalProvider( LocalJBMarkdownTreeState provides LocalJBMarkdownTreeState.current.copy( - currentServer = RevoltAPI.channelCache[message.channel]?.server, + currentServer = PeptideAPI.channelCache[message.channel]?.server, fontSizeMultiplier = Gigamoji.useGigamojiForMessage( message.content ) @@ -445,7 +477,7 @@ fun Message( } else { CompositionLocalProvider( LocalMarkdownTreeConfig provides LocalMarkdownTreeConfig.current.copy( - currentServer = RevoltAPI.channelCache[message.channel]?.server, + currentServer = PeptideAPI.channelCache[message.channel]?.server, fontSizeMultiplier = Gigamoji.useGigamojiForMessage( message.content ) @@ -516,9 +548,12 @@ fun Message( } Spacer(modifier = Modifier.height(8.dp)) - Embed(embed = embed, onLinkClick = { - viewUrlInBrowser(context, it) - }) + Embed( + embed = embed, + onLinkClick = { + viewUrlInBrowser(context, it) + } + ) Spacer(modifier = Modifier.height(8.dp)) } diff --git a/app/src/main/java/chat/revolt/composables/chat/MessageAttachment.kt b/app/src/main/java/chat/peptide/composables/chat/MessageAttachment.kt similarity index 93% rename from app/src/main/java/chat/revolt/composables/chat/MessageAttachment.kt rename to app/src/main/java/chat/peptide/composables/chat/MessageAttachment.kt index f737cb1e..56ce72b4 100644 --- a/app/src/main/java/chat/revolt/composables/chat/MessageAttachment.kt +++ b/app/src/main/java/chat/peptide/composables/chat/MessageAttachment.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.chat +package chat.peptide.composables.chat import android.annotation.SuppressLint import android.text.format.Formatter @@ -32,11 +32,11 @@ import androidx.compose.ui.res.painterResource 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.RevoltAPI -import chat.revolt.api.schemas.AutumnResource -import chat.revolt.composables.generic.RemoteImage -import chat.revolt.composables.media.AudioPlayer +import chat.peptide.R +import chat.peptide.api.PeptideAPI +import chat.peptide.api.schemas.AutumnResource +import chat.peptide.composables.generic.RemoteImage +import chat.peptide.composables.media.AudioPlayer import dev.chrisbanes.haze.hazeEffect import dev.chrisbanes.haze.hazeSource import dev.chrisbanes.haze.materials.ExperimentalHazeMaterialsApi @@ -83,7 +83,7 @@ fun FileAttachment(attachment: AutumnResource) { @SuppressLint("UnusedBoxWithConstraintsScope") @Composable fun ImageAttachment(attachment: AutumnResource) { - val url = "${RevoltAPI.getCurrentFilesUrl()}/attachments/${attachment.id}/${attachment.filename}" + val url = "${PeptideAPI.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 = "${RevoltAPI.getCurrentFilesUrl()}/attachments/${attachment.id}/${attachment.filename}" + val url = "${PeptideAPI.getCurrentFilesUrl()}/attachments/${attachment.id}/${attachment.filename}" BoxWithConstraints { Box( @@ -179,7 +179,7 @@ fun VideoAttachment(attachment: AutumnResource) { @Composable fun AudioAttachment(attachment: AutumnResource) { - val url = "${RevoltAPI.getCurrentFilesUrl()}/attachments/${attachment.id}/${attachment.filename}" + val url = "${PeptideAPI.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/peptide/composables/chat/MessageField.kt similarity index 95% rename from app/src/main/java/chat/revolt/composables/chat/MessageField.kt rename to app/src/main/java/chat/peptide/composables/chat/MessageField.kt index 3a327122..341f9044 100644 --- a/app/src/main/java/chat/revolt/composables/chat/MessageField.kt +++ b/app/src/main/java/chat/peptide/composables/chat/MessageField.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.chat +package chat.peptide.composables.chat import android.net.Uri import androidx.compose.animation.AnimatedVisibility @@ -79,17 +79,17 @@ import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.IntSize import androidx.compose.ui.unit.dp -import chat.revolt.R -import chat.revolt.activities.RevoltTweenFloat -import chat.revolt.activities.RevoltTweenInt -import chat.revolt.api.RevoltAPI -import chat.revolt.api.internals.BrushCompat -import chat.revolt.api.schemas.ChannelType -import chat.revolt.api.schemas.Member -import chat.revolt.composables.generic.RemoteImage -import chat.revolt.composables.generic.UserAvatar -import chat.revolt.composables.screens.chat.ChannelIcon -import chat.revolt.internals.Autocomplete +import chat.peptide.R +import chat.peptide.activities.PeptideTweenFloat +import chat.peptide.activities.PeptideTweenInt +import chat.peptide.api.PeptideAPI +import chat.peptide.api.internals.BrushCompat +import chat.peptide.api.schemas.ChannelType +import chat.peptide.api.schemas.Member +import chat.peptide.composables.generic.RemoteImage +import chat.peptide.composables.generic.UserAvatar +import chat.peptide.composables.screens.chat.ChannelIcon +import chat.peptide.internals.Autocomplete import kotlinx.coroutines.launch fun Pair.asTextRange(): TextRange { @@ -111,25 +111,25 @@ private fun CharSequence.lastWordStartsAt(): Int { sealed class AutocompleteSuggestion { data class User( - val user: chat.revolt.api.schemas.User, + val user: chat.peptide.api.schemas.User, val member: Member?, val query: String ) : AutocompleteSuggestion() data class Channel( - val channel: chat.revolt.api.schemas.Channel, + val channel: chat.peptide.api.schemas.Channel, val query: String ) : AutocompleteSuggestion() data class Emoji( val shortcode: String, val unicode: String?, - val custom: chat.revolt.api.schemas.Emoji?, + val custom: chat.peptide.api.schemas.Emoji?, val query: String ) : AutocompleteSuggestion() data class Role( - val role: chat.revolt.api.schemas.Role, + val role: chat.peptide.api.schemas.Role, val id: String, val query: String ) : AutocompleteSuggestion() @@ -318,7 +318,7 @@ fun MessageField( userId = item.user.id ?: "", avatar = item.user.avatar, rawUrl = item.member?.avatar?.id?.let { - "${RevoltAPI.getCurrentFilesUrl()}/avatars/$it" + "${PeptideAPI.getCurrentFilesUrl()}/avatars/$it" }, size = SuggestionChipDefaults.IconSize, ) @@ -444,7 +444,7 @@ fun MessageField( ) } else { RemoteImage( - url = "${RevoltAPI.getCurrentFilesUrl()}/emojis/${item.custom?.id}", + url = "${PeptideAPI.getCurrentFilesUrl()}/emojis/${item.custom?.id}", description = null, contentScale = ContentScale.Fit, modifier = Modifier @@ -606,18 +606,18 @@ fun MessageField( full.height ) }) + slideInHorizontally( - animationSpec = RevoltTweenInt, + animationSpec = PeptideTweenInt, initialOffsetX = { -it } - ) + fadeIn(animationSpec = RevoltTweenFloat), + ) + fadeIn(animationSpec = PeptideTweenFloat), exit = shrinkOut(targetSize = { full -> IntSize( 0, full.height ) }) + slideOutHorizontally( - animationSpec = RevoltTweenInt, + animationSpec = PeptideTweenInt, targetOffsetX = { it } - ) + fadeOut(animationSpec = RevoltTweenFloat) + ) + fadeOut(animationSpec = PeptideTweenFloat) ) { Icon( painter = when { diff --git a/app/src/main/java/chat/revolt/composables/chat/Reaction.kt b/app/src/main/java/chat/peptide/composables/chat/Reaction.kt similarity index 92% rename from app/src/main/java/chat/revolt/composables/chat/Reaction.kt rename to app/src/main/java/chat/peptide/composables/chat/Reaction.kt index e28f48b6..f9a45b1e 100644 --- a/app/src/main/java/chat/revolt/composables/chat/Reaction.kt +++ b/app/src/main/java/chat/peptide/composables/chat/Reaction.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.chat +package chat.peptide.composables.chat import androidx.compose.animation.AnimatedContent import androidx.compose.animation.animateColorAsState @@ -28,9 +28,9 @@ 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.RevoltAPI -import chat.revolt.api.internals.isUlid -import chat.revolt.composables.generic.RemoteImage +import chat.peptide.api.PeptideAPI +import chat.peptide.api.internals.isUlid +import chat.peptide.composables.generic.RemoteImage @OptIn(ExperimentalFoundationApi::class) @Composable @@ -40,11 +40,11 @@ fun Reaction( onClick: (Boolean) -> Unit, onLongClick: () -> Unit ) { - val hasOwn = members.contains(RevoltAPI.selfId) + val hasOwn = members.contains(PeptideAPI.selfId) val background by animateColorAsState( targetValue = if (hasOwn) { - MaterialTheme.colorScheme.primary + MaterialTheme.colorScheme.secondary } else { MaterialTheme.colorScheme.surfaceContainer }, @@ -52,7 +52,7 @@ fun Reaction( ) val foreground by animateColorAsState( targetValue = if (hasOwn) { - MaterialTheme.colorScheme.onPrimary + MaterialTheme.colorScheme.onSecondaryContainer } else { MaterialTheme.colorScheme.onSurface }, @@ -73,7 +73,7 @@ fun Reaction( CompositionLocalProvider(LocalContentColor provides foreground) { if (emoji.isUlid()) { RemoteImage( - url = "${RevoltAPI.getCurrentFilesUrl()}/emojis/${emoji}", + url = "${PeptideAPI.getCurrentFilesUrl()}/emojis/${emoji}", description = null, modifier = Modifier.size(16.dp) ) diff --git a/app/src/main/java/chat/revolt/composables/chat/RoleChip.kt b/app/src/main/java/chat/peptide/composables/chat/RoleChip.kt similarity index 96% rename from app/src/main/java/chat/revolt/composables/chat/RoleChip.kt rename to app/src/main/java/chat/peptide/composables/chat/RoleChip.kt index 09a67abb..a6f8386f 100644 --- a/app/src/main/java/chat/revolt/composables/chat/RoleChip.kt +++ b/app/src/main/java/chat/peptide/composables/chat/RoleChip.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.chat +package chat.peptide.composables.chat import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box diff --git a/app/src/main/java/chat/revolt/composables/chat/RoleListEntry.kt b/app/src/main/java/chat/peptide/composables/chat/RoleListEntry.kt similarity index 96% rename from app/src/main/java/chat/revolt/composables/chat/RoleListEntry.kt rename to app/src/main/java/chat/peptide/composables/chat/RoleListEntry.kt index cfad0022..0dad6d37 100644 --- a/app/src/main/java/chat/revolt/composables/chat/RoleListEntry.kt +++ b/app/src/main/java/chat/peptide/composables/chat/RoleListEntry.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.chat +package chat.peptide.composables.chat import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box diff --git a/app/src/main/java/chat/revolt/composables/chat/SystemMessage.kt b/app/src/main/java/chat/peptide/composables/chat/SystemMessage.kt similarity index 98% rename from app/src/main/java/chat/revolt/composables/chat/SystemMessage.kt rename to app/src/main/java/chat/peptide/composables/chat/SystemMessage.kt index 776ef49f..f528b876 100644 --- a/app/src/main/java/chat/revolt/composables/chat/SystemMessage.kt +++ b/app/src/main/java/chat/peptide/composables/chat/SystemMessage.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.chat +package chat.peptide.composables.chat import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box @@ -28,9 +28,9 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp -import chat.revolt.R -import chat.revolt.api.schemas.Message -import chat.revolt.composables.markdown.RichMarkdown +import chat.peptide.R +import chat.peptide.api.schemas.Message +import chat.peptide.composables.markdown.RichMarkdown enum class SystemMessageType(val type: String) { CHANNEL_OWNERSHIP_CHANGED("channel_ownership_changed"), diff --git a/app/src/main/java/chat/revolt/composables/chat/TimeRift.kt b/app/src/main/java/chat/peptide/composables/chat/TimeRift.kt similarity index 93% rename from app/src/main/java/chat/revolt/composables/chat/TimeRift.kt rename to app/src/main/java/chat/peptide/composables/chat/TimeRift.kt index efebc12f..b1d1844b 100644 --- a/app/src/main/java/chat/revolt/composables/chat/TimeRift.kt +++ b/app/src/main/java/chat/peptide/composables/chat/TimeRift.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.chat +package chat.peptide.composables.chat import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement @@ -19,7 +19,8 @@ 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.R +import chat.peptide.R +import chat.peptide.composables.generic.PepTextButton @Composable fun TimeRift(modifier: Modifier = Modifier, onMessageLoad: () -> Unit) { @@ -48,7 +49,7 @@ fun TimeRift(modifier: Modifier = Modifier, onMessageLoad: () -> Unit) { Spacer(modifier = Modifier.height(5.dp)) - TextButton(onClick = onMessageLoad) { + PepTextButton(onClick = onMessageLoad) { Text( text = stringResource(id = R.string.time_rift_cta), color = LocalContentColor.current.copy( diff --git a/app/src/main/java/chat/revolt/composables/chat/UserBadgeList.kt b/app/src/main/java/chat/peptide/composables/chat/UserBadgeList.kt similarity index 98% rename from app/src/main/java/chat/revolt/composables/chat/UserBadgeList.kt rename to app/src/main/java/chat/peptide/composables/chat/UserBadgeList.kt index b191652d..23d0aba5 100644 --- a/app/src/main/java/chat/revolt/composables/chat/UserBadgeList.kt +++ b/app/src/main/java/chat/peptide/composables/chat/UserBadgeList.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.chat +package chat.peptide.composables.chat import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Arrangement @@ -17,9 +17,9 @@ import androidx.compose.ui.graphics.painter.Painter import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp -import chat.revolt.R -import chat.revolt.api.schemas.UserBadges -import chat.revolt.api.schemas.has +import chat.peptide.R +import chat.peptide.api.schemas.UserBadges +import chat.peptide.api.schemas.has @Composable fun BadgeListEntryTemplate( diff --git a/app/src/main/java/chat/revolt/composables/chat/specialembeds/AppleMusicEmbed.kt b/app/src/main/java/chat/peptide/composables/chat/specialembeds/AppleMusicEmbed.kt similarity index 91% rename from app/src/main/java/chat/revolt/composables/chat/specialembeds/AppleMusicEmbed.kt rename to app/src/main/java/chat/peptide/composables/chat/specialembeds/AppleMusicEmbed.kt index 586fc8eb..867b69c9 100644 --- a/app/src/main/java/chat/revolt/composables/chat/specialembeds/AppleMusicEmbed.kt +++ b/app/src/main/java/chat/peptide/composables/chat/specialembeds/AppleMusicEmbed.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.chat.specialembeds +package chat.peptide.composables.chat.specialembeds import android.annotation.SuppressLint import android.net.Uri @@ -11,9 +11,9 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.unit.dp import androidx.compose.ui.viewinterop.AndroidView -import chat.revolt.api.schemas.Special -import chat.revolt.api.settings.LoadedSettings -import chat.revolt.ui.theme.isThemeDark +import chat.peptide.api.schemas.Special +import chat.peptide.api.settings.LoadedSettings +import chat.peptide.ui.theme.isThemeDark @SuppressLint("SetJavaScriptEnabled") @Composable diff --git a/app/src/main/java/chat/revolt/composables/chat/specialembeds/SpecialEmbedSwitch.kt b/app/src/main/java/chat/peptide/composables/chat/specialembeds/SpecialEmbedSwitch.kt similarity index 79% rename from app/src/main/java/chat/revolt/composables/chat/specialembeds/SpecialEmbedSwitch.kt rename to app/src/main/java/chat/peptide/composables/chat/specialembeds/SpecialEmbedSwitch.kt index 73990010..8a65fc01 100644 --- a/app/src/main/java/chat/revolt/composables/chat/specialembeds/SpecialEmbedSwitch.kt +++ b/app/src/main/java/chat/peptide/composables/chat/specialembeds/SpecialEmbedSwitch.kt @@ -1,9 +1,9 @@ -package chat.revolt.composables.chat.specialembeds +package chat.peptide.composables.chat.specialembeds import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import chat.revolt.api.schemas.Special -import chat.revolt.api.settings.LoadedSettings +import chat.peptide.api.schemas.Special +import chat.peptide.api.settings.LoadedSettings @Composable fun SpecialEmbedSwitch(special: Special, modifier: Modifier = Modifier) { diff --git a/app/src/main/java/chat/revolt/composables/chat/specialembeds/YouTubeEmbed.kt b/app/src/main/java/chat/peptide/composables/chat/specialembeds/YouTubeEmbed.kt similarity index 95% rename from app/src/main/java/chat/revolt/composables/chat/specialembeds/YouTubeEmbed.kt rename to app/src/main/java/chat/peptide/composables/chat/specialembeds/YouTubeEmbed.kt index 25e71ac5..38108f02 100644 --- a/app/src/main/java/chat/revolt/composables/chat/specialembeds/YouTubeEmbed.kt +++ b/app/src/main/java/chat/peptide/composables/chat/specialembeds/YouTubeEmbed.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.chat.specialembeds +package chat.peptide.composables.chat.specialembeds import android.annotation.SuppressLint import android.webkit.WebView @@ -21,10 +21,10 @@ import androidx.compose.ui.draw.clip import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.res.stringResource import androidx.compose.ui.viewinterop.AndroidView -import chat.revolt.R -import chat.revolt.api.schemas.Special -import chat.revolt.composables.chat.VideoPlayButton -import chat.revolt.composables.generic.RemoteImage +import chat.peptide.R +import chat.peptide.api.schemas.Special +import chat.peptide.composables.chat.VideoPlayButton +import chat.peptide.composables.generic.RemoteImage import org.intellij.lang.annotations.Language @Language("HTML") diff --git a/app/src/main/java/chat/revolt/composables/emoji/EmojiPicker.kt b/app/src/main/java/chat/peptide/composables/emoji/EmojiPicker.kt similarity index 96% rename from app/src/main/java/chat/revolt/composables/emoji/EmojiPicker.kt rename to app/src/main/java/chat/peptide/composables/emoji/EmojiPicker.kt index 026814f2..04f7a621 100644 --- a/app/src/main/java/chat/revolt/composables/emoji/EmojiPicker.kt +++ b/app/src/main/java/chat/peptide/composables/emoji/EmojiPicker.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.emoji +package chat.peptide.composables.emoji import android.util.TypedValue import android.view.HapticFeedbackConstants @@ -60,18 +60,18 @@ import androidx.compose.ui.text.style.TextAlign 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.activities.RevoltTweenFloat -import chat.revolt.api.RevoltAPI -import chat.revolt.callbacks.Action -import chat.revolt.callbacks.ActionChannel -import chat.revolt.composables.generic.IconPlaceholder -import chat.revolt.composables.generic.RemoteImage -import chat.revolt.internals.Category -import chat.revolt.internals.EmojiImpl -import chat.revolt.internals.EmojiPickerItem -import chat.revolt.internals.FitzpatrickSkinTone -import chat.revolt.internals.UnicodeEmojiSection +import chat.peptide.R +import chat.peptide.activities.PeptideTweenFloat +import chat.peptide.api.PeptideAPI +import chat.peptide.callbacks.Action +import chat.peptide.callbacks.ActionChannel +import chat.peptide.composables.generic.IconPlaceholder +import chat.peptide.composables.generic.RemoteImage +import chat.peptide.internals.Category +import chat.peptide.internals.EmojiImpl +import chat.peptide.internals.EmojiPickerItem +import chat.peptide.internals.FitzpatrickSkinTone +import chat.peptide.internals.UnicodeEmojiSection import kotlinx.coroutines.launch @Composable @@ -132,12 +132,12 @@ fun EmojiPicker( var showSkinToneMenu by remember { mutableStateOf(false) } val skinToneMenuAreaWeight by animateFloatAsState( if (showSkinToneMenu) 1f else .15f, - animationSpec = RevoltTweenFloat, + animationSpec = PeptideTweenFloat, label = "skinToneMenuAreaWeight" ) val skinToneMenuCloseHintIconOpacity by animateFloatAsState( if (showSkinToneMenu) 1f else 0f, - animationSpec = RevoltTweenFloat, + animationSpec = PeptideTweenFloat, label = "skinToneMenuCloseHintIconOpacity" ) @@ -150,7 +150,7 @@ fun EmojiPicker( var searchQuery by remember { mutableStateOf("") } val searchFieldOpacity by animateFloatAsState( if (showSkinToneMenu) 0f else 1f, - animationSpec = RevoltTweenFloat, + animationSpec = PeptideTweenFloat, label = "searchFieldOpacity" ) @@ -188,7 +188,7 @@ fun EmojiPicker( } val clearQueryButtonOpacity = animateFloatAsState( if (searchQuery.isNotEmpty()) 1f else 0f, - animationSpec = RevoltTweenFloat, + animationSpec = PeptideTweenFloat, label = "clearQueryButtonOpacity" ) @@ -401,7 +401,7 @@ fun EmojiPicker( ) } else { RemoteImage( - url = "${RevoltAPI.getCurrentFilesUrl()}/icons/${server.icon.id}", + url = "${PeptideAPI.getCurrentFilesUrl()}/icons/${server.icon.id}", allowAnimation = false, description = server.name, modifier = Modifier @@ -619,7 +619,7 @@ fun ColumnScope.PickerItem( verticalArrangement = Arrangement.Center ) { RemoteImage( - url = "${RevoltAPI.getCurrentFilesUrl()}/emojis/${item.emote.id}", + url = "${PeptideAPI.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/CollapsibleCard.kt b/app/src/main/java/chat/peptide/composables/generic/CollapsibleCard.kt similarity index 98% rename from app/src/main/java/chat/revolt/composables/generic/CollapsibleCard.kt rename to app/src/main/java/chat/peptide/composables/generic/CollapsibleCard.kt index f80c966c..2f939214 100644 --- a/app/src/main/java/chat/revolt/composables/generic/CollapsibleCard.kt +++ b/app/src/main/java/chat/peptide/composables/generic/CollapsibleCard.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.generic +package chat.peptide.composables.generic import androidx.compose.animation.AnimatedVisibility import androidx.compose.foundation.clickable diff --git a/app/src/main/java/chat/revolt/composables/generic/DobPicker.kt b/app/src/main/java/chat/peptide/composables/generic/DobPicker.kt similarity index 98% rename from app/src/main/java/chat/revolt/composables/generic/DobPicker.kt rename to app/src/main/java/chat/peptide/composables/generic/DobPicker.kt index 7c1bbfa7..a2bc8910 100644 --- a/app/src/main/java/chat/revolt/composables/generic/DobPicker.kt +++ b/app/src/main/java/chat/peptide/composables/generic/DobPicker.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.generic +package chat.peptide.composables.generic import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column @@ -18,7 +18,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp -import chat.revolt.R +import chat.peptide.R sealed class DobElement { data object Day : DobElement() diff --git a/app/src/main/java/chat/revolt/composables/generic/FormTextField.kt b/app/src/main/java/chat/peptide/composables/generic/FormTextField.kt similarity index 94% rename from app/src/main/java/chat/revolt/composables/generic/FormTextField.kt rename to app/src/main/java/chat/peptide/composables/generic/FormTextField.kt index fe4eeeea..d869c0f7 100644 --- a/app/src/main/java/chat/revolt/composables/generic/FormTextField.kt +++ b/app/src/main/java/chat/peptide/composables/generic/FormTextField.kt @@ -1,8 +1,9 @@ -package chat.revolt.composables.generic +package chat.peptide.composables.generic import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material3.Text import androidx.compose.material3.TextField +import androidx.compose.material3.TextFieldDefaults import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.text.input.ImeAction diff --git a/app/src/main/java/chat/revolt/composables/generic/GradientStopEditor.kt b/app/src/main/java/chat/peptide/composables/generic/GradientStopEditor.kt similarity index 98% rename from app/src/main/java/chat/revolt/composables/generic/GradientStopEditor.kt rename to app/src/main/java/chat/peptide/composables/generic/GradientStopEditor.kt index 12c82dd8..5d6a31e2 100644 --- a/app/src/main/java/chat/revolt/composables/generic/GradientStopEditor.kt +++ b/app/src/main/java/chat/peptide/composables/generic/GradientStopEditor.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.generic +package chat.peptide.composables.generic import android.annotation.SuppressLint import androidx.compose.foundation.Canvas diff --git a/app/src/main/java/chat/revolt/composables/generic/HealthAlert.kt b/app/src/main/java/chat/peptide/composables/generic/HealthAlert.kt similarity index 89% rename from app/src/main/java/chat/revolt/composables/generic/HealthAlert.kt rename to app/src/main/java/chat/peptide/composables/generic/HealthAlert.kt index dfce1dc9..1c5a41a7 100644 --- a/app/src/main/java/chat/revolt/composables/generic/HealthAlert.kt +++ b/app/src/main/java/chat/peptide/composables/generic/HealthAlert.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.generic +package chat.peptide.composables.generic import androidx.browser.customtabs.CustomTabColorSchemeParams import androidx.browser.customtabs.CustomTabsIntent @@ -11,8 +11,8 @@ import androidx.compose.ui.graphics.toArgb import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.core.net.toUri -import chat.revolt.R -import chat.revolt.api.schemas.HealthNotice +import chat.peptide.R +import chat.peptide.api.schemas.HealthNotice @Composable fun HealthAlert(notice: HealthNotice, onDismiss: () -> Unit) { @@ -32,7 +32,7 @@ fun HealthAlert(notice: HealthNotice, onDismiss: () -> Unit) { confirmButton = { notice.alert?.actions?.map { action -> when (action.type) { - "external" -> TextButton( + "external" -> PepTextButton( onClick = { val customTab = CustomTabsIntent.Builder() .setShowTitle(true) @@ -42,7 +42,7 @@ fun HealthAlert(notice: HealthNotice, onDismiss: () -> Unit) { .build() ) .build() - customTab.launchUrl(context, action.href?.toUri() ?: return@TextButton) + customTab.launchUrl(context, action.href?.toUri() ?: return@PepTextButton) } ) { Text( @@ -52,7 +52,7 @@ fun HealthAlert(notice: HealthNotice, onDismiss: () -> Unit) { } } } - TextButton(onClick = onDismiss) { + PepTextButton(onClick = onDismiss) { Text(stringResource(R.string.service_health_alert_actions_dismiss)) } } diff --git a/app/src/main/java/chat/revolt/composables/generic/IconPlaceholder.kt b/app/src/main/java/chat/peptide/composables/generic/IconPlaceholder.kt similarity index 95% rename from app/src/main/java/chat/revolt/composables/generic/IconPlaceholder.kt rename to app/src/main/java/chat/peptide/composables/generic/IconPlaceholder.kt index 5cd2c417..5710dfe7 100644 --- a/app/src/main/java/chat/revolt/composables/generic/IconPlaceholder.kt +++ b/app/src/main/java/chat/peptide/composables/generic/IconPlaceholder.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.generic +package chat.peptide.composables.generic import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box diff --git a/app/src/main/java/chat/revolt/composables/generic/InlineMediaPicker.kt b/app/src/main/java/chat/peptide/composables/generic/InlineMediaPicker.kt similarity index 97% rename from app/src/main/java/chat/revolt/composables/generic/InlineMediaPicker.kt rename to app/src/main/java/chat/peptide/composables/generic/InlineMediaPicker.kt index 4c6cc06a..9639b72f 100644 --- a/app/src/main/java/chat/revolt/composables/generic/InlineMediaPicker.kt +++ b/app/src/main/java/chat/peptide/composables/generic/InlineMediaPicker.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.generic +package chat.peptide.composables.generic import android.net.Uri import androidx.activity.compose.rememberLauncherForActivityResult @@ -27,8 +27,8 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp -import chat.revolt.R -import chat.revolt.api.settings.LoadedSettings +import chat.peptide.R +import chat.peptide.api.settings.LoadedSettings import com.bumptech.glide.integration.compose.CrossFade import com.bumptech.glide.integration.compose.ExperimentalGlideComposeApi import com.bumptech.glide.integration.compose.GlideImage @@ -86,7 +86,7 @@ fun InlineMediaPicker( if (canRemove) { Spacer(modifier = Modifier.height(8.dp)) - TextButton( + PepTextButton( onClick = { onRemove() }, diff --git a/app/src/main/java/chat/revolt/composables/generic/ListHeader.kt b/app/src/main/java/chat/peptide/composables/generic/ListHeader.kt similarity index 97% rename from app/src/main/java/chat/revolt/composables/generic/ListHeader.kt rename to app/src/main/java/chat/peptide/composables/generic/ListHeader.kt index 952b89b8..1d6bba9f 100644 --- a/app/src/main/java/chat/revolt/composables/generic/ListHeader.kt +++ b/app/src/main/java/chat/peptide/composables/generic/ListHeader.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.generic +package chat.peptide.composables.generic import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box diff --git a/app/src/main/java/chat/revolt/composables/generic/NonIdealState.kt b/app/src/main/java/chat/peptide/composables/generic/NonIdealState.kt similarity index 97% rename from app/src/main/java/chat/revolt/composables/generic/NonIdealState.kt rename to app/src/main/java/chat/peptide/composables/generic/NonIdealState.kt index 2145a38c..6d48cab9 100644 --- a/app/src/main/java/chat/revolt/composables/generic/NonIdealState.kt +++ b/app/src/main/java/chat/peptide/composables/generic/NonIdealState.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.generic +package chat.peptide.composables.generic import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column @@ -26,7 +26,7 @@ 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.dp -import chat.revolt.R +import chat.peptide.R private val NoneLambda = @Composable { throw UnsupportedOperationException() } @@ -95,7 +95,7 @@ fun NonIdealStatePreview() { title = { Text("Channel") }, description = { Text("You are not in any channels.") }, actions = { - Button(onClick = {}) { + SquareButton(onClick = {}) { Text("Create a channel") } } diff --git a/app/src/main/java/chat/revolt/composables/generic/SquareButton.kt b/app/src/main/java/chat/peptide/composables/generic/PepButtons.kt similarity index 50% rename from app/src/main/java/chat/revolt/composables/generic/SquareButton.kt rename to app/src/main/java/chat/peptide/composables/generic/PepButtons.kt index 4c8d4a30..5a3f33a9 100644 --- a/app/src/main/java/chat/revolt/composables/generic/SquareButton.kt +++ b/app/src/main/java/chat/peptide/composables/generic/PepButtons.kt @@ -1,9 +1,12 @@ -package chat.revolt.composables.generic +package chat.peptide.composables.generic import androidx.compose.foundation.shape.CornerSize import androidx.compose.material3.Button +import androidx.compose.material3.ButtonColors +import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.ElevatedButton import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp @@ -13,11 +16,16 @@ fun SquareButton( onClick: () -> Unit, modifier: Modifier = Modifier, enabled: Boolean = true, + colors: ButtonColors = ButtonDefaults.buttonColors().copy( + containerColor = MaterialTheme.colorScheme.primary, + contentColor = MaterialTheme.colorScheme.onPrimary, + ), content: @Composable () -> Unit ) { Button( onClick = onClick, modifier = modifier, + colors = colors, enabled = enabled, shape = MaterialTheme.shapes.small.copy( topStart = CornerSize(8.dp), @@ -30,6 +38,31 @@ fun SquareButton( } } +@Composable +fun PepTextButton( + onClick: () -> Unit, + modifier: Modifier = Modifier, + enabled: Boolean = true, + content: @Composable () -> Unit +) { + TextButton( + onClick = onClick, + modifier = modifier, + colors = ButtonDefaults.textButtonColors().copy( + contentColor = MaterialTheme.colorScheme.onBackground, + ), + shape = MaterialTheme.shapes.small.copy( + topStart = CornerSize(8.dp), + topEnd = CornerSize(8.dp), + bottomStart = CornerSize(8.dp), + bottomEnd = CornerSize(8.dp) + ), + enabled = enabled, + ) { + content() + } +} + @Composable fun SquareElevatedButton( onClick: () -> Unit, @@ -39,6 +72,10 @@ fun SquareElevatedButton( ElevatedButton( onClick = onClick, modifier = modifier, + colors = ButtonDefaults.buttonColors().copy( + containerColor = MaterialTheme.colorScheme.primary, + contentColor = MaterialTheme.colorScheme.onPrimary, + ), shape = MaterialTheme.shapes.small.copy( topStart = CornerSize(8.dp), topEnd = CornerSize(8.dp), diff --git a/app/src/main/java/chat/revolt/composables/generic/PrimaryTabs.kt b/app/src/main/java/chat/peptide/composables/generic/PrimaryTabs.kt similarity index 95% rename from app/src/main/java/chat/revolt/composables/generic/PrimaryTabs.kt rename to app/src/main/java/chat/peptide/composables/generic/PrimaryTabs.kt index 6fb1e17e..912e594c 100644 --- a/app/src/main/java/chat/revolt/composables/generic/PrimaryTabs.kt +++ b/app/src/main/java/chat/peptide/composables/generic/PrimaryTabs.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.generic +package chat.peptide.composables.generic import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.material3.ExperimentalMaterial3Api @@ -11,8 +11,8 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.viewinterop.AndroidView -import chat.revolt.api.settings.LoadedSettings -import chat.revolt.ui.theme.Theme +import chat.peptide.api.settings.LoadedSettings +import chat.peptide.ui.theme.Theme import com.google.android.material.tabs.TabLayout @OptIn(ExperimentalMaterial3Api::class) diff --git a/app/src/main/java/chat/revolt/composables/generic/RadioItem.kt b/app/src/main/java/chat/peptide/composables/generic/RadioItem.kt similarity index 96% rename from app/src/main/java/chat/revolt/composables/generic/RadioItem.kt rename to app/src/main/java/chat/peptide/composables/generic/RadioItem.kt index 67f9490e..da41fa94 100644 --- a/app/src/main/java/chat/revolt/composables/generic/RadioItem.kt +++ b/app/src/main/java/chat/peptide/composables/generic/RadioItem.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.generic +package chat.peptide.composables.generic import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.selection.selectable diff --git a/app/src/main/java/chat/revolt/composables/generic/RemoteImage.kt b/app/src/main/java/chat/peptide/composables/generic/RemoteImage.kt similarity index 97% rename from app/src/main/java/chat/revolt/composables/generic/RemoteImage.kt rename to app/src/main/java/chat/peptide/composables/generic/RemoteImage.kt index 46889f09..d6c1ebf5 100644 --- a/app/src/main/java/chat/revolt/composables/generic/RemoteImage.kt +++ b/app/src/main/java/chat/peptide/composables/generic/RemoteImage.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.generic +package chat.peptide.composables.generic import android.util.DisplayMetrics import androidx.compose.foundation.layout.height diff --git a/app/src/main/java/chat/revolt/composables/generic/SheetButton.kt b/app/src/main/java/chat/peptide/composables/generic/SheetButton.kt similarity index 58% rename from app/src/main/java/chat/revolt/composables/generic/SheetButton.kt rename to app/src/main/java/chat/peptide/composables/generic/SheetButton.kt index 87d997d2..99b1eade 100644 --- a/app/src/main/java/chat/revolt/composables/generic/SheetButton.kt +++ b/app/src/main/java/chat/peptide/composables/generic/SheetButton.kt @@ -1,16 +1,22 @@ -package chat.revolt.composables.generic +package chat.peptide.composables.generic +import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.padding import androidx.compose.material3.ListItem +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Info +import androidx.compose.material3.Icon import androidx.compose.material3.LocalContentColor import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import chat.revolt.internals.extensions.TransparentListItemColours +import chat.peptide.internals.extensions.TransparentListItemColours @Composable fun SheetButton( @@ -26,7 +32,6 @@ fun SheetButton( Box( modifier = modifier .clickable { onClick() } - .padding(horizontal = 16.dp) ) { ListItem( colors = TransparentListItemColours, @@ -88,4 +93,75 @@ fun SheetButton( } ) } -} \ No newline at end of file +} + +@Preview +@Composable +private fun SheetButtonPreview() { + MaterialTheme { + SheetButton( + headlineContent = { Text("Headline") }, + leadingContent = { Icon(Icons.Default.Info, contentDescription = null) }, + onClick = {}, + modifier = Modifier.background(MaterialTheme.colorScheme.surface) + ) + } +} + +@Preview +@Composable +private fun SheetButtonWithSupportingContentPreview() { + MaterialTheme { + SheetButton( + headlineContent = { Text("Headline") }, + leadingContent = { Icon(Icons.Default.Info, contentDescription = null) }, + supportingContent = { Text("Supporting content") }, + onClick = {}, + modifier = Modifier.background(MaterialTheme.colorScheme.surface) + ) + } +} + +@Preview +@Composable +private fun SheetButtonWithTrailingContentPreview() { + MaterialTheme { + SheetButton( + headlineContent = { Text("Headline") }, + leadingContent = { Icon(Icons.Default.Info, contentDescription = null) }, + trailingContent = { Text("Trailing") }, + onClick = {}, + modifier = Modifier.background(MaterialTheme.colorScheme.surface) + ) + } +} + +@Preview +@Composable +private fun DangerousSheetButtonPreview() { + MaterialTheme { + SheetButton( + headlineContent = { Text("Headline") }, + leadingContent = { Icon(Icons.Default.Info, contentDescription = null) }, + onClick = {}, + dangerous = true, + modifier = Modifier.background(MaterialTheme.colorScheme.surface) + ) + } +} + +@Preview +@Composable +private fun SpecialSheetButtonPreview() { + MaterialTheme { + SheetButton( + headlineContent = { Text("Headline") }, + leadingContent = { Icon(Icons.Default.Info, contentDescription = null) }, + onClick = {}, + special = true, + modifier = Modifier.background(MaterialTheme.colorScheme.surface) + ) + } +} + + diff --git a/app/src/main/java/chat/revolt/composables/generic/SheetHeaderPadding.kt b/app/src/main/java/chat/peptide/composables/generic/SheetHeaderPadding.kt similarity index 92% rename from app/src/main/java/chat/revolt/composables/generic/SheetHeaderPadding.kt rename to app/src/main/java/chat/peptide/composables/generic/SheetHeaderPadding.kt index 8ec94e42..077d6ede 100644 --- a/app/src/main/java/chat/revolt/composables/generic/SheetHeaderPadding.kt +++ b/app/src/main/java/chat/peptide/composables/generic/SheetHeaderPadding.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.generic +package chat.peptide.composables.generic import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.BoxScope diff --git a/app/src/main/java/chat/revolt/composables/generic/UserAvatar.kt b/app/src/main/java/chat/peptide/composables/generic/UserAvatar.kt similarity index 93% rename from app/src/main/java/chat/revolt/composables/generic/UserAvatar.kt rename to app/src/main/java/chat/peptide/composables/generic/UserAvatar.kt index ad321892..236add2d 100644 --- a/app/src/main/java/chat/revolt/composables/generic/UserAvatar.kt +++ b/app/src/main/java/chat/peptide/composables/generic/UserAvatar.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.generic +package chat.peptide.composables.generic import android.graphics.Bitmap import android.graphics.drawable.BitmapDrawable @@ -24,10 +24,10 @@ import androidx.compose.ui.res.stringResource 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.RevoltAPI -import chat.revolt.api.schemas.AutumnResource -import chat.revolt.api.settings.LoadedSettings +import chat.peptide.R +import chat.peptide.api.PeptideAPI +import chat.peptide.api.schemas.AutumnResource +import chat.peptide.api.settings.LoadedSettings enum class Presence { Online, @@ -103,7 +103,7 @@ fun UserAvatar( ) { if (avatar != null) { RemoteImage( - url = rawUrl ?: "${RevoltAPI.getCurrentFilesUrl()}/avatars/${avatar.id}", + url = rawUrl ?: "${PeptideAPI.getCurrentFilesUrl()}/avatars/${avatar.id}", contentScale = ContentScale.Crop, description = stringResource(id = R.string.avatar_alt, username), allowAnimation = allowAnimation, @@ -124,7 +124,7 @@ fun UserAvatar( ) } else { RemoteImage( - url = "${RevoltAPI.getCurrentBaseUrl()}/users/${userId.ifBlank { "0".repeat(26) }}/default_avatar", + url = "${PeptideAPI.getCurrentBaseUrl()}/users/${userId.ifBlank { "0".repeat(26) }}/default_avatar", description = stringResource(id = R.string.avatar_alt, username), allowAnimation = allowAnimation, modifier = Modifier @@ -168,7 +168,7 @@ fun GroupIcon( ) { if (icon?.id != null) { RemoteImage( - url = rawUrl ?: "${RevoltAPI.getCurrentFilesUrl()}/icons/${icon.id}", + url = rawUrl ?: "${PeptideAPI.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/generic/Weblink.kt b/app/src/main/java/chat/peptide/composables/generic/Weblink.kt similarity index 94% rename from app/src/main/java/chat/revolt/composables/generic/Weblink.kt rename to app/src/main/java/chat/peptide/composables/generic/Weblink.kt index dc0b1476..d3cfc20a 100644 --- a/app/src/main/java/chat/revolt/composables/generic/Weblink.kt +++ b/app/src/main/java/chat/peptide/composables/generic/Weblink.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.generic +package chat.peptide.composables.generic import android.net.Uri import androidx.browser.customtabs.CustomTabsIntent @@ -53,7 +53,7 @@ fun AnyLink(text: String, action: () -> Unit, modifier: Modifier = Modifier) { @Preview(showBackground = true) @Composable fun WeblinkPreview() { - Weblink(text = "https://revolt.chat", url = "https://revolt.chat") + Weblink(text = "https://peptide.chat", url = "https://peptide.chat") } @Preview(showBackground = true) diff --git a/app/src/main/java/chat/revolt/composables/markdown/MarkdownCodeBlock.kt b/app/src/main/java/chat/peptide/composables/markdown/MarkdownCodeBlock.kt similarity index 89% rename from app/src/main/java/chat/revolt/composables/markdown/MarkdownCodeBlock.kt rename to app/src/main/java/chat/peptide/composables/markdown/MarkdownCodeBlock.kt index 97a48abf..db63ec28 100644 --- a/app/src/main/java/chat/revolt/composables/markdown/MarkdownCodeBlock.kt +++ b/app/src/main/java/chat/peptide/composables/markdown/MarkdownCodeBlock.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.markdown +package chat.peptide.composables.markdown import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box @@ -9,8 +9,8 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.unit.dp -import chat.revolt.ndk.AstNode -import chat.revolt.ui.theme.FragmentMono +import chat.peptide.ndk.AstNode +import chat.peptide.ui.theme.FragmentMono @Composable fun MarkdownCodeBlock(node: AstNode, modifier: Modifier = Modifier) { diff --git a/app/src/main/java/chat/revolt/composables/markdown/MarkdownText.kt b/app/src/main/java/chat/peptide/composables/markdown/MarkdownText.kt similarity index 90% rename from app/src/main/java/chat/revolt/composables/markdown/MarkdownText.kt rename to app/src/main/java/chat/peptide/composables/markdown/MarkdownText.kt index 5c70613b..a35df96a 100644 --- a/app/src/main/java/chat/revolt/composables/markdown/MarkdownText.kt +++ b/app/src/main/java/chat/peptide/composables/markdown/MarkdownText.kt @@ -1,6 +1,7 @@ -package chat.revolt.composables.markdown +package chat.peptide.composables.markdown import android.content.Intent +import android.util.Log import android.widget.Toast import androidx.browser.customtabs.CustomTabColorSchemeParams import androidx.browser.customtabs.CustomTabsIntent @@ -19,6 +20,7 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.toArgb import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.layout.ContentScale @@ -33,18 +35,19 @@ import androidx.compose.ui.text.font.FontStyle import androidx.compose.ui.text.font.FontSynthesis 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.RevoltAPI -import chat.revolt.api.routes.custom.fetchEmoji -import chat.revolt.api.schemas.isInviteUri -import chat.revolt.callbacks.Action -import chat.revolt.callbacks.ActionChannel -import chat.revolt.composables.generic.RemoteImage -import chat.revolt.composables.utils.detectTapGesturesConditionalConsume -import chat.revolt.internals.resolveTimestamp -import chat.revolt.ndk.AstNode -import chat.revolt.ui.theme.FragmentMono +import chat.peptide.R +import chat.peptide.activities.InviteActivity +import chat.peptide.api.PeptideAPI +import chat.peptide.api.routes.custom.fetchEmoji +import chat.peptide.api.schemas.isInviteUri +import chat.peptide.callbacks.Action +import chat.peptide.callbacks.ActionChannel +import chat.peptide.composables.generic.RemoteImage +import chat.peptide.composables.utils.detectTapGesturesConditionalConsume +import chat.peptide.internals.resolveTimestamp +import chat.peptide.ndk.AstNode +import chat.peptide.ui.theme.FragmentMono +import chat.peptide.utils.InternalLinkHandler import kotlinx.coroutines.launch @@ -100,10 +103,10 @@ fun annotateText(node: AstNode): AnnotatedString { ) ) val member = LocalMarkdownTreeConfig.current.currentServer?.let { serverId -> - RevoltAPI.members.getMember(serverId, mention.groupValues[1]) + PeptideAPI.members.getMember(serverId, mention.groupValues[1]) } val content = member?.nickname?.let { nick -> "@$nick" } - ?: RevoltAPI.userCache[mention.groupValues[1]]?.username?.let { username -> "@$username" } + ?: PeptideAPI.userCache[mention.groupValues[1]]?.username?.let { username -> "@$username" } ?: "<@${mention.groupValues[1]}>" append(content) pop() @@ -129,7 +132,7 @@ fun annotateText(node: AstNode): AnnotatedString { ) ) val content = - RevoltAPI.channelCache[channel.groupValues[1]]?.name?.let { chId -> "#$chId" } + PeptideAPI.channelCache[channel.groupValues[1]]?.name?.let { chId -> "#$chId" } ?: "<#${channel.groupValues[1]}>" append(content) pop() @@ -198,7 +201,7 @@ fun annotateText(node: AstNode): AnnotatedString { pushStyle( LocalTextStyle.current.toSpanStyle() .copy( - color = MaterialTheme.colorScheme.primary + color = Color(0xff4775bf) ) ) append(url.value) @@ -242,7 +245,7 @@ fun annotateText(node: AstNode): AnnotatedString { pushStyle( LocalTextStyle.current.toSpanStyle() .copy( - color = MaterialTheme.colorScheme.primary + color = MaterialTheme.colorScheme.secondary ) ) node.children?.forEach { append(annotateText(it)) } @@ -306,10 +309,12 @@ fun MarkdownText(textNode: AstNode, modifier: Modifier = Modifier) { end = offset ).firstOrNull()?.let { annotation -> val url = annotation.item + Log.d("MarkdownText", "URL clicked: $url") try { val uri = url.toUri() if (uri.isInviteUri()) { + Log.d("MarkdownText", "URL is an invite URI, launching InviteActivity") scope.launch { Intent(context, InviteActivity::class.java).apply { data = uri @@ -322,6 +327,14 @@ fun MarkdownText(textNode: AstNode, modifier: Modifier = Modifier) { // no-op } + if (InternalLinkHandler.isInternalLink(url)) { + val handled = InternalLinkHandler.handleInternalLink(context, url, true) + if (handled) { + return@handler true + } + } + + // If not an internal link or couldn't be handled internally, open in browser val customTab = CustomTabsIntent.Builder() .setShowTitle(true) .setDefaultColorSchemeParams( @@ -420,11 +433,11 @@ fun MarkdownText(textNode: AstNode, modifier: Modifier = Modifier) { placeholderVerticalAlign = PlaceholderVerticalAlign.Center ), ) { id -> - val emote = RevoltAPI.emojiCache[id] + val emote = PeptideAPI.emojiCache[id] if (emote == null) { scope.launch { try { - RevoltAPI.emojiCache[id] = fetchEmoji(id) + PeptideAPI.emojiCache[id] = fetchEmoji(id) } catch (e: Exception) { // no-op } @@ -433,7 +446,7 @@ fun MarkdownText(textNode: AstNode, modifier: Modifier = Modifier) { } else { with(LocalDensity.current) { RemoteImage( - url = "${RevoltAPI.getCurrentFilesUrl()}/emojis/${id}", + url = "${PeptideAPI.getCurrentFilesUrl()}/emojis/${id}", description = emote.name, contentScale = ContentScale.Fit, modifier = Modifier diff --git a/app/src/main/java/chat/revolt/composables/markdown/MarkdownTree.kt b/app/src/main/java/chat/peptide/composables/markdown/MarkdownTree.kt similarity index 97% rename from app/src/main/java/chat/revolt/composables/markdown/MarkdownTree.kt rename to app/src/main/java/chat/peptide/composables/markdown/MarkdownTree.kt index 4a17ceb7..6022664e 100644 --- a/app/src/main/java/chat/revolt/composables/markdown/MarkdownTree.kt +++ b/app/src/main/java/chat/peptide/composables/markdown/MarkdownTree.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.markdown +package chat.peptide.composables.markdown import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box @@ -22,8 +22,8 @@ import androidx.compose.ui.graphics.Brush import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import chat.revolt.api.internals.solidColor -import chat.revolt.ndk.AstNode +import chat.peptide.api.internals.solidColor +import chat.peptide.ndk.AstNode data class MarkdownTreeConfig( val linksClickable: Boolean = true, diff --git a/app/src/main/java/chat/revolt/composables/markdown/RichMarkdown.kt b/app/src/main/java/chat/peptide/composables/markdown/RichMarkdown.kt similarity index 68% rename from app/src/main/java/chat/revolt/composables/markdown/RichMarkdown.kt rename to app/src/main/java/chat/peptide/composables/markdown/RichMarkdown.kt index f09a8eca..0d14da97 100644 --- a/app/src/main/java/chat/revolt/composables/markdown/RichMarkdown.kt +++ b/app/src/main/java/chat/peptide/composables/markdown/RichMarkdown.kt @@ -1,12 +1,12 @@ -package chat.revolt.composables.markdown +package chat.peptide.composables.markdown import androidx.compose.foundation.layout.Column import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import chat.revolt.api.settings.Experiments -import chat.revolt.markdown.jbm.JBM -import chat.revolt.markdown.jbm.JBMRenderer -import chat.revolt.ndk.Stendal +import chat.peptide.api.settings.Experiments +import chat.peptide.markdown.jbm.JBM +import chat.peptide.markdown.jbm.JBMRenderer +import chat.peptide.ndk.Stendal @OptIn(JBM::class) @Composable diff --git a/app/src/main/java/chat/revolt/composables/media/AudioPlayer.kt b/app/src/main/java/chat/peptide/composables/media/AudioPlayer.kt similarity index 98% rename from app/src/main/java/chat/revolt/composables/media/AudioPlayer.kt rename to app/src/main/java/chat/peptide/composables/media/AudioPlayer.kt index 3dd8d09d..f1b8986e 100644 --- a/app/src/main/java/chat/revolt/composables/media/AudioPlayer.kt +++ b/app/src/main/java/chat/peptide/composables/media/AudioPlayer.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.media +package chat.peptide.composables.media import android.content.ContentValues import android.content.Intent @@ -40,8 +40,8 @@ import androidx.compose.ui.unit.dp import androidx.media3.common.MediaItem import androidx.media3.common.Player import androidx.media3.exoplayer.ExoPlayer -import chat.revolt.R -import chat.revolt.api.RevoltHttp +import chat.peptide.R +import chat.peptide.api.PeptideHttp import io.ktor.client.request.get import io.ktor.client.statement.readBytes import kotlinx.coroutines.delay @@ -118,13 +118,13 @@ fun AudioPlayer(url: String, filename: String, contentType: String) { ContentValues().apply { put(MediaStore.Audio.Media.DISPLAY_NAME, filename) put(MediaStore.Audio.Media.MIME_TYPE, contentType) - put(MediaStore.Audio.Media.RELATIVE_PATH, "Music/Revolt") + put(MediaStore.Audio.Media.RELATIVE_PATH, "Music/Peptide") put(MediaStore.Audio.Media.IS_PENDING, 1) } ) }?.let { uri -> context.contentResolver.openOutputStream(uri).use { stream -> - val audio = RevoltHttp.get(url).readBytes() + val audio = PeptideHttp.get(url).readBytes() stream?.write(audio) context.applicationContext.let { diff --git a/app/src/main/java/chat/revolt/composables/media/MediaPickerGateway.kt b/app/src/main/java/chat/peptide/composables/media/MediaPickerGateway.kt similarity index 98% rename from app/src/main/java/chat/revolt/composables/media/MediaPickerGateway.kt rename to app/src/main/java/chat/peptide/composables/media/MediaPickerGateway.kt index a8e90b94..8025ee7c 100644 --- a/app/src/main/java/chat/revolt/composables/media/MediaPickerGateway.kt +++ b/app/src/main/java/chat/peptide/composables/media/MediaPickerGateway.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.media +package chat.peptide.composables.media import androidx.compose.foundation.background import androidx.compose.foundation.border @@ -27,7 +27,7 @@ import androidx.compose.ui.res.painterResource 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.peptide.R @Composable fun MediaPickerGateway( diff --git a/app/src/main/java/chat/revolt/composables/profile/UserCard.kt b/app/src/main/java/chat/peptide/composables/profile/UserCard.kt similarity index 95% rename from app/src/main/java/chat/revolt/composables/profile/UserCard.kt rename to app/src/main/java/chat/peptide/composables/profile/UserCard.kt index 710345c9..7fcc462b 100644 --- a/app/src/main/java/chat/revolt/composables/profile/UserCard.kt +++ b/app/src/main/java/chat/peptide/composables/profile/UserCard.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.profile +package chat.peptide.composables.profile import android.graphics.Bitmap import android.icu.text.DateFormat @@ -51,13 +51,13 @@ import androidx.compose.ui.unit.sp import androidx.constraintlayout.compose.ConstraintLayout import androidx.core.graphics.drawable.toBitmap import androidx.palette.graphics.Palette -import chat.revolt.R -import chat.revolt.api.internals.ResourceLocations -import chat.revolt.api.internals.ULID -import chat.revolt.api.internals.UserQR -import chat.revolt.api.schemas.User -import chat.revolt.composables.generic.UserAvatar -import chat.revolt.ui.theme.FragmentMono +import chat.peptide.R +import chat.peptide.api.internals.ResourceLocations +import chat.peptide.api.internals.ULID +import chat.peptide.api.internals.UserQR +import chat.peptide.api.schemas.User +import chat.peptide.composables.generic.UserAvatar +import chat.peptide.ui.theme.FragmentMono import com.bumptech.glide.Glide import com.google.zxing.BarcodeFormat import com.google.zxing.EncodeHintType @@ -142,32 +142,32 @@ fun UserCard( LocalTextStyle provides LocalTextStyle.current.copy( fontFamily = FontFamily( Font( - R.font.revolt_usercard, + R.font.peptide_usercard, variationSettings = FontVariation.Settings(FontVariation.weight(200)), weight = FontWeight.ExtraLight ), Font( - R.font.revolt_usercard, + R.font.peptide_usercard, variationSettings = FontVariation.Settings(FontVariation.weight(300)), weight = FontWeight.Light ), Font( - R.font.revolt_usercard, + R.font.peptide_usercard, variationSettings = FontVariation.Settings(FontVariation.weight(400)), weight = FontWeight.Normal ), Font( - R.font.revolt_usercard, + R.font.peptide_usercard, variationSettings = FontVariation.Settings(FontVariation.weight(500)), weight = FontWeight.Medium ), Font( - R.font.revolt_usercard, + R.font.peptide_usercard, variationSettings = FontVariation.Settings(FontVariation.weight(700)), weight = FontWeight.Bold ), Font( - R.font.revolt_usercard, + R.font.peptide_usercard, variationSettings = FontVariation.Settings(FontVariation.weight(900)), weight = FontWeight.Black ) @@ -342,7 +342,7 @@ fun UserCard( } Text( - "revolt.chat", + "peptide.chat", fontSize = 16.sp, fontWeight = FontWeight.Bold, modifier = Modifier diff --git a/app/src/main/java/chat/revolt/composables/screens/chat/AttachmentManager.kt b/app/src/main/java/chat/peptide/composables/screens/chat/AttachmentManager.kt similarity index 96% rename from app/src/main/java/chat/revolt/composables/screens/chat/AttachmentManager.kt rename to app/src/main/java/chat/peptide/composables/screens/chat/AttachmentManager.kt index 04c8c9ad..b11f84ea 100644 --- a/app/src/main/java/chat/revolt/composables/screens/chat/AttachmentManager.kt +++ b/app/src/main/java/chat/peptide/composables/screens/chat/AttachmentManager.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.screens.chat +package chat.peptide.composables.screens.chat import android.text.format.Formatter import androidx.compose.animation.AnimatedVisibility @@ -18,7 +18,6 @@ import androidx.compose.foundation.layout.width import androidx.compose.foundation.rememberScrollState import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Close -import androidx.compose.material3.Button import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.LinearProgressIndicator @@ -30,7 +29,6 @@ import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.ProgressIndicatorDefaults import androidx.compose.material3.Switch import androidx.compose.material3.Text -import androidx.compose.material3.TextButton import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue @@ -50,9 +48,11 @@ 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 chat.revolt.R -import chat.revolt.api.routes.microservices.autumn.FileArgs -import chat.revolt.composables.generic.RemoteImage +import chat.peptide.R +import chat.peptide.api.routes.microservices.autumn.FileArgs +import chat.peptide.composables.generic.PepTextButton +import chat.peptide.composables.generic.RemoteImage +import chat.peptide.composables.generic.SquareButton import kotlinx.coroutines.launch import java.io.File @@ -125,7 +125,7 @@ fun FilePreviewSheet( } Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) { - Button(onClick = { + SquareButton(onClick = { onDismiss() }, modifier = Modifier.weight(1f)) { Icon(Icons.Default.Close, contentDescription = null) @@ -133,7 +133,7 @@ fun FilePreviewSheet( Text(stringResource(R.string.attachment_preview_close)) } if (canRemove) { - TextButton(onClick = { + PepTextButton(onClick = { onRemove() }, modifier = Modifier.weight(1f)) { Icon( diff --git a/app/src/main/java/chat/revolt/composables/screens/chat/ChannelHeader.kt b/app/src/main/java/chat/peptide/composables/screens/chat/ChannelHeader.kt similarity index 94% rename from app/src/main/java/chat/revolt/composables/screens/chat/ChannelHeader.kt rename to app/src/main/java/chat/peptide/composables/screens/chat/ChannelHeader.kt index a841cd63..74a0e186 100644 --- a/app/src/main/java/chat/revolt/composables/screens/chat/ChannelHeader.kt +++ b/app/src/main/java/chat/peptide/composables/screens/chat/ChannelHeader.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.screens.chat +package chat.peptide.composables.screens.chat import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Row @@ -22,10 +22,10 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp -import chat.revolt.R -import chat.revolt.api.internals.ChannelUtils -import chat.revolt.api.schemas.Channel -import chat.revolt.api.schemas.ChannelType +import chat.peptide.R +import chat.peptide.api.internals.ChannelUtils +import chat.peptide.api.schemas.Channel +import chat.peptide.api.schemas.ChannelType @Composable fun ChannelHeader( diff --git a/app/src/main/java/chat/revolt/composables/screens/chat/ChannelIcon.kt b/app/src/main/java/chat/peptide/composables/screens/chat/ChannelIcon.kt similarity index 96% rename from app/src/main/java/chat/revolt/composables/screens/chat/ChannelIcon.kt rename to app/src/main/java/chat/peptide/composables/screens/chat/ChannelIcon.kt index 87dd0907..658d8ff5 100644 --- a/app/src/main/java/chat/revolt/composables/screens/chat/ChannelIcon.kt +++ b/app/src/main/java/chat/peptide/composables/screens/chat/ChannelIcon.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.screens.chat +package chat.peptide.composables.screens.chat import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box @@ -16,8 +16,8 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.tooling.preview.PreviewParameterProvider import androidx.compose.ui.unit.dp -import chat.revolt.R -import chat.revolt.api.schemas.ChannelType +import chat.peptide.R +import chat.peptide.api.schemas.ChannelType @Composable fun ChannelIcon(channelType: ChannelType, modifier: Modifier = Modifier) { diff --git a/app/src/main/java/chat/revolt/composables/screens/chat/ChannelSheetHeader.kt b/app/src/main/java/chat/peptide/composables/screens/chat/ChannelSheetHeader.kt similarity index 87% rename from app/src/main/java/chat/revolt/composables/screens/chat/ChannelSheetHeader.kt rename to app/src/main/java/chat/peptide/composables/screens/chat/ChannelSheetHeader.kt index 0ee6371c..1d5fd0e1 100644 --- a/app/src/main/java/chat/revolt/composables/screens/chat/ChannelSheetHeader.kt +++ b/app/src/main/java/chat/peptide/composables/screens/chat/ChannelSheetHeader.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.screens.chat +package chat.peptide.composables.screens.chat import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box @@ -26,15 +26,15 @@ 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.RevoltAPI -import chat.revolt.api.schemas.AutumnResource -import chat.revolt.api.schemas.ChannelType -import chat.revolt.api.schemas.User -import chat.revolt.composables.generic.RemoteImage -import chat.revolt.composables.generic.UserAvatar -import chat.revolt.composables.markdown.MarkdownTree -import chat.revolt.ndk.AstNode -import chat.revolt.ndk.Stendal +import chat.peptide.api.PeptideAPI +import chat.peptide.api.schemas.AutumnResource +import chat.peptide.api.schemas.ChannelType +import chat.peptide.api.schemas.User +import chat.peptide.composables.generic.RemoteImage +import chat.peptide.composables.generic.UserAvatar +import chat.peptide.composables.markdown.MarkdownTree +import chat.peptide.ndk.AstNode +import chat.peptide.ndk.Stendal @Composable fun ChannelSheetHeader( @@ -66,7 +66,7 @@ fun ChannelSheetHeader( ) { if (channelIcon != null) { RemoteImage( - url = "${RevoltAPI.getCurrentFilesUrl()}/icons/${channelIcon.id ?: ""}", + url = "${PeptideAPI.getCurrentFilesUrl()}/icons/${channelIcon.id ?: ""}", description = null, // decorative contentScale = ContentScale.Crop, height = 48, diff --git a/app/src/main/java/chat/revolt/composables/screens/chat/ReplyManager.kt b/app/src/main/java/chat/peptide/composables/screens/chat/ReplyManager.kt similarity index 87% rename from app/src/main/java/chat/revolt/composables/screens/chat/ReplyManager.kt rename to app/src/main/java/chat/peptide/composables/screens/chat/ReplyManager.kt index 5250e1e2..f0442b26 100644 --- a/app/src/main/java/chat/revolt/composables/screens/chat/ReplyManager.kt +++ b/app/src/main/java/chat/peptide/composables/screens/chat/ReplyManager.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.screens.chat +package chat.peptide.composables.screens.chat import androidx.compose.foundation.background import androidx.compose.foundation.clickable @@ -27,15 +27,15 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import chat.revolt.R -import chat.revolt.api.RevoltAPI -import chat.revolt.api.internals.ULID -import chat.revolt.api.routes.channel.SendMessageReply -import chat.revolt.api.schemas.Message -import chat.revolt.composables.chat.authorAvatarUrl -import chat.revolt.composables.chat.authorColour -import chat.revolt.composables.chat.authorName -import chat.revolt.composables.generic.UserAvatar +import chat.peptide.R +import chat.peptide.api.PeptideAPI +import chat.peptide.api.internals.ULID +import chat.peptide.api.routes.channel.SendMessageReply +import chat.peptide.api.schemas.Message +import chat.peptide.composables.chat.authorAvatarUrl +import chat.peptide.composables.chat.authorColour +import chat.peptide.composables.chat.authorName +import chat.peptide.composables.generic.UserAvatar @Composable fun replyContentText(message: Message): String { @@ -48,8 +48,8 @@ fun replyContentText(message: Message): String { @Composable fun ManageableReply(reply: SendMessageReply, onToggleMention: () -> Unit, onRemove: () -> Unit) { - val replyMessage = RevoltAPI.messageCache[reply.id] ?: return onRemove() - val replyAuthor = RevoltAPI.userCache[replyMessage.author] ?: return onRemove() + val replyMessage = PeptideAPI.messageCache[reply.id] ?: return onRemove() + val replyAuthor = PeptideAPI.userCache[replyMessage.author] ?: return onRemove() Row( modifier = Modifier diff --git a/app/src/main/java/chat/revolt/composables/screens/chat/TypingIndicator.kt b/app/src/main/java/chat/peptide/composables/screens/chat/TypingIndicator.kt similarity index 77% rename from app/src/main/java/chat/revolt/composables/screens/chat/TypingIndicator.kt rename to app/src/main/java/chat/peptide/composables/screens/chat/TypingIndicator.kt index a8443e3f..8c131472 100644 --- a/app/src/main/java/chat/revolt/composables/screens/chat/TypingIndicator.kt +++ b/app/src/main/java/chat/peptide/composables/screens/chat/TypingIndicator.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.screens.chat +package chat.peptide.composables.screens.chat import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.fadeIn @@ -21,12 +21,12 @@ import androidx.compose.ui.text.style.TextOverflow 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.activities.RevoltTweenFloat -import chat.revolt.activities.RevoltTweenInt -import chat.revolt.api.RevoltAPI -import chat.revolt.api.schemas.User -import chat.revolt.composables.generic.UserAvatar +import chat.peptide.R +import chat.peptide.activities.PeptideTweenFloat +import chat.peptide.activities.PeptideTweenInt +import chat.peptide.api.PeptideAPI +import chat.peptide.api.schemas.User +import chat.peptide.composables.generic.UserAvatar @Composable fun StackedUserAvatars( @@ -41,15 +41,15 @@ fun StackedUserAvatars( .size(size + (offset * minOf(users.size, amount)), size) ) { users.take(amount).forEachIndexed { index, userId -> - val user = RevoltAPI.userCache[userId] - val maybeMember = serverId?.let { RevoltAPI.members.getMember(serverId, userId) } + val user = PeptideAPI.userCache[userId] + val maybeMember = serverId?.let { PeptideAPI.members.getMember(serverId, userId) } UserAvatar( avatar = user?.avatar, userId = userId, username = user?.let { User.resolveDefaultName(it) } ?: stringResource(id = R.string.unknown), - rawUrl = maybeMember?.avatar?.let { "${RevoltAPI.getCurrentFilesUrl()}/avatars/${it.id}" }, + rawUrl = maybeMember?.avatar?.let { "${PeptideAPI.getCurrentFilesUrl()}/avatars/${it.id}" }, size = size, modifier = Modifier .offset( @@ -74,13 +74,13 @@ fun TypingIndicator(users: List, serverId: String?) { AnimatedVisibility( visible = users.isNotEmpty(), enter = slideInVertically( - animationSpec = RevoltTweenInt, + animationSpec = PeptideTweenInt, initialOffsetY = { it } - ) + fadeIn(animationSpec = RevoltTweenFloat), + ) + fadeIn(animationSpec = PeptideTweenFloat), exit = slideOutVertically( - animationSpec = RevoltTweenInt, + animationSpec = PeptideTweenInt, targetOffsetY = { it } - ) + fadeOut(animationSpec = RevoltTweenFloat) + ) + fadeOut(animationSpec = PeptideTweenFloat) ) { Row( Modifier @@ -94,9 +94,9 @@ fun TypingIndicator(users: List, serverId: String?) { text = stringResource( id = typingMessageResource(), users.joinToString { userId -> - RevoltAPI.userCache[userId]?.let { u -> + PeptideAPI.userCache[userId]?.let { u -> val maybeMember = - serverId?.let { RevoltAPI.members.getMember(serverId, userId) } + serverId?.let { PeptideAPI.members.getMember(serverId, userId) } maybeMember?.nickname ?: User.resolveDefaultName(u) } ?: userId diff --git a/app/src/main/java/chat/revolt/composables/screens/chat/atoms/RegularMessage.kt b/app/src/main/java/chat/peptide/composables/screens/chat/atoms/RegularMessage.kt similarity index 95% rename from app/src/main/java/chat/revolt/composables/screens/chat/atoms/RegularMessage.kt rename to app/src/main/java/chat/peptide/composables/screens/chat/atoms/RegularMessage.kt index 505102f0..20d27361 100644 --- a/app/src/main/java/chat/revolt/composables/screens/chat/atoms/RegularMessage.kt +++ b/app/src/main/java/chat/peptide/composables/screens/chat/atoms/RegularMessage.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.screens.chat.atoms +package chat.peptide.composables.screens.chat.atoms import android.annotation.SuppressLint import androidx.compose.animation.AnimatedContent @@ -41,16 +41,16 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.min -import chat.revolt.R -import chat.revolt.api.RevoltAPI -import chat.revolt.api.schemas.Channel -import chat.revolt.api.schemas.Message -import chat.revolt.api.settings.LoadedSettings -import chat.revolt.api.settings.MessageReplyStyle -import chat.revolt.callbacks.Action -import chat.revolt.callbacks.ActionChannel -import chat.revolt.composables.chat.Message -import chat.revolt.internals.extensions.supportSwipeReply +import chat.peptide.R +import chat.peptide.api.PeptideAPI +import chat.peptide.api.schemas.Channel +import chat.peptide.api.schemas.Message +import chat.peptide.api.settings.LoadedSettings +import chat.peptide.api.settings.MessageReplyStyle +import chat.peptide.callbacks.Action +import chat.peptide.callbacks.ActionChannel +import chat.peptide.composables.chat.Message +import chat.peptide.internals.extensions.supportSwipeReply import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch import kotlin.math.abs @@ -162,7 +162,7 @@ fun RegularMessage( } }, onNameClick = { - val author = message.author?.let { RevoltAPI.userCache[it] } ?: return@Message + val author = message.author?.let { PeptideAPI.userCache[it] } ?: return@Message putTextAtCursorPosition("@${author.username}#${author.discriminator}") }, canReply = true, diff --git a/app/src/main/java/chat/revolt/composables/screens/chat/discover/DiscoverServersList.kt b/app/src/main/java/chat/peptide/composables/screens/chat/discover/DiscoverServersList.kt similarity index 78% rename from app/src/main/java/chat/revolt/composables/screens/chat/discover/DiscoverServersList.kt rename to app/src/main/java/chat/peptide/composables/screens/chat/discover/DiscoverServersList.kt index 374d924a..1fc58149 100644 --- a/app/src/main/java/chat/revolt/composables/screens/chat/discover/DiscoverServersList.kt +++ b/app/src/main/java/chat/peptide/composables/screens/chat/discover/DiscoverServersList.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.screens.chat.discover +package chat.peptide.composables.screens.chat.discover import androidx.compose.foundation.Image import androidx.compose.foundation.background @@ -39,10 +39,10 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.core.graphics.toColorInt import androidx.hilt.navigation.compose.hiltViewModel -import chat.revolt.R -import chat.revolt.api.RevoltAPI -import chat.revolt.api.routes.googlesheets.ServerData -import chat.revolt.composables.generic.SquareButton +import chat.peptide.R +import chat.peptide.api.PeptideAPI +import chat.peptide.api.routes.googlesheets.ServerData +import chat.peptide.composables.generic.SquareButton @Composable fun DiscoverServersList( @@ -104,7 +104,7 @@ fun DiscoverServersList( ) { CircularProgressIndicator( modifier = Modifier - .padding(16.dp) + .padding(16.dp), ) } } @@ -165,8 +165,8 @@ fun DiscoverServersList( } private fun isServerAlreadyJoined(serverId: String): Boolean { - // Check if the server exists in RevoltAPI.serverCache - return RevoltAPI.serverCache.containsKey(serverId) + // Check if the server exists in PeptideAPI.serverCache + return PeptideAPI.serverCache.containsKey(serverId) } @Composable @@ -237,7 +237,7 @@ fun ServerItem( Text( text = server.description, - style = MaterialTheme.typography.bodyMedium, + style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onBackground.copy( alpha = descriptionAlpha, ), @@ -247,46 +247,43 @@ fun ServerItem( } Spacer(modifier = Modifier.height(12.dp)) - if (isProcessing) { - CircularProgressIndicator( + IconButton( + onClick = onClick, + ) { + Box( modifier = Modifier - .size(24.dp), - strokeWidth = 2.dp - ) - } else { - IconButton( - onClick = onClick, + .fillMaxSize() ) { - Box( - modifier = Modifier - .fillMaxSize() - ) { - if (isJoined) { - // Show tick icon with green background for joined servers - Box( - modifier = Modifier - .size(20.dp) - .clip(CircleShape) - .background(MaterialTheme.colorScheme.primary) // Green color - .align(Alignment.Center), - contentAlignment = Alignment.Center - ) { - Image( - modifier = Modifier.size(16.dp), - painter = painterResource(R.drawable.icn_check_24dp), - contentDescription = "Already joined", - colorFilter = ColorFilter.tint(MaterialTheme.colorScheme.onPrimary) - ) - } - } else { - // Show arrow icon for servers not joined yet + when { + isProcessing -> CircularProgressIndicator( + modifier = Modifier.size(20.dp) + .align(Alignment.Center), + strokeWidth = 2.dp + ) + isJoined -> Box( + modifier = Modifier + .size(20.dp) + .clip(CircleShape) + .background(Color(0xFF43bf83)) + .align(Alignment.Center), + contentAlignment = Alignment.Center + ) { + Image( + modifier = Modifier.size(16.dp), + painter = painterResource(R.drawable.icn_check_24dp), + contentDescription = "Already joined", + colorFilter = ColorFilter.tint(Color.White) + ) + } + else -> { Image( painter = painterResource(R.drawable.icn_arrow_forward_24dp), contentDescription = "Join server", - modifier = Modifier - .align(Alignment.Center), + modifier = Modifier.align(Alignment.Center), colorFilter = ColorFilter.tint( - color = MaterialTheme.colorScheme.onBackground.copy(alpha = contentAlpha) + color = MaterialTheme.colorScheme.onBackground.copy( + alpha = contentAlpha + ) ) ) } @@ -302,9 +299,9 @@ fun ServerItem( private fun ServerItemPreview() { val server = ServerData( id = "1", - name = "Revolt Lounge", - description = "The official Revolt server. Hang out, chat, and get help with Revolt.", - inviteCode = "revolt", + name = "Peptide Lounge", + description = "The official Peptide server. Hang out, chat, and get help with Peptide.", + inviteCode = "peptide", disabled = false, showColor = null ) @@ -321,9 +318,9 @@ private fun ServerItemPreview() { private fun ColorfulServerItemPreview() { val server = ServerData( id = "1", - name = "Revolt Lounge", - description = "The official Revolt server. Hang out, chat, and get help with Revolt.", - inviteCode = "revolt", + name = "Peptide Lounge", + description = "The official Peptide server. Hang out, chat, and get help with Peptide.", + inviteCode = "peptide", disabled = false, showColor = "#1591ea" ) @@ -341,9 +338,9 @@ private fun ColorfulServerItemPreview() { private fun JoinedServerItemPreview() { val server = ServerData( id = "1", - name = "Revolt Lounge", - description = "The official Revolt server. Hang out, chat, and get help with Revolt.", - inviteCode = "revolt", + name = "Peptide Lounge", + description = "The official Peptide server. Hang out, chat, and get help with Peptide.", + inviteCode = "peptide", disabled = false, showColor = null, ) @@ -353,4 +350,22 @@ private fun JoinedServerItemPreview() { isJoined = true, isProcessing = false ) +} +@Preview +@Composable +private fun JoinedServerItemLoadingPreview() { + val server = ServerData( + id = "1", + name = "Peptide Lounge", + description = "The official Peptide server. Hang out, chat, and get help with Peptide.", + inviteCode = "peptide", + disabled = false, + showColor = null, + ) + ServerItem( + server = server, + onClick = {}, + isJoined = true, + isProcessing = true + ) } \ No newline at end of file diff --git a/app/src/main/java/chat/revolt/composables/screens/chat/discover/DiscoverServersListViewModel.kt b/app/src/main/java/chat/peptide/composables/screens/chat/discover/DiscoverServersListViewModel.kt similarity index 86% rename from app/src/main/java/chat/revolt/composables/screens/chat/discover/DiscoverServersListViewModel.kt rename to app/src/main/java/chat/peptide/composables/screens/chat/discover/DiscoverServersListViewModel.kt index ae55a2ed..73eb6128 100644 --- a/app/src/main/java/chat/revolt/composables/screens/chat/discover/DiscoverServersListViewModel.kt +++ b/app/src/main/java/chat/peptide/composables/screens/chat/discover/DiscoverServersListViewModel.kt @@ -1,15 +1,15 @@ -package chat.revolt.composables.screens.chat.discover +package chat.peptide.composables.screens.chat.discover import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import chat.revolt.api.RevoltError -import chat.revolt.api.routes.googlesheets.ServerData -import chat.revolt.api.routes.googlesheets.ServerDataRepository -import chat.revolt.api.routes.invites.fetchInviteByCode -import chat.revolt.api.routes.invites.joinInviteByCode -import chat.revolt.api.schemas.Invite -import chat.revolt.api.schemas.InviteJoined -import chat.revolt.api.schemas.RsResult +import chat.peptide.api.PeptideError +import chat.peptide.api.routes.googlesheets.ServerData +import chat.peptide.api.routes.googlesheets.ServerDataRepository +import chat.peptide.api.routes.invites.fetchInviteByCode +import chat.peptide.api.routes.invites.joinInviteByCode +import chat.peptide.api.schemas.Invite +import chat.peptide.api.schemas.InviteJoined +import chat.peptide.api.schemas.RsResult import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.Flow @@ -34,7 +34,7 @@ data class DiscoverUiState( val selectedInviteCode: String? = null, val processingServerId: String? = null, val loadedInviteData: Invite? = null, - val loadedError: RevoltError? = null + val loadedError: PeptideError? = null ) @HiltViewModel @@ -108,7 +108,7 @@ class DiscoverServersListViewModel @Inject constructor( } catch (_: Exception) { updateState { it.copy( - loadedError = RevoltError("Unknown"), + loadedError = PeptideError("Unknown"), selectedInviteCode = inviteCode, processingServerId = null ) @@ -120,11 +120,11 @@ class DiscoverServersListViewModel @Inject constructor( /** * Join server without showing loading in the server list */ - fun joinServerWithoutProcessingIndicator(inviteCode: String): Flow> = flow { + fun joinServerWithoutProcessingIndicator(inviteCode: String): Flow> = flow { try { emit(joinInviteByCode(inviteCode)) } catch (_: Exception) { - emit(RsResult.err(RevoltError("Unknown"))) + emit(RsResult.err(PeptideError("Unknown"))) } }.flowOn(Dispatchers.IO) diff --git a/app/src/main/java/chat/revolt/composables/screens/chat/discover/ServerInviteDialog.kt b/app/src/main/java/chat/peptide/composables/screens/chat/discover/ServerInviteDialog.kt similarity index 91% rename from app/src/main/java/chat/revolt/composables/screens/chat/discover/ServerInviteDialog.kt rename to app/src/main/java/chat/peptide/composables/screens/chat/discover/ServerInviteDialog.kt index 88472408..f326209d 100644 --- a/app/src/main/java/chat/revolt/composables/screens/chat/discover/ServerInviteDialog.kt +++ b/app/src/main/java/chat/peptide/composables/screens/chat/discover/ServerInviteDialog.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.screens.chat.discover +package chat.peptide.composables.screens.chat.discover import androidx.compose.foundation.Image import androidx.compose.foundation.border @@ -30,18 +30,20 @@ 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 chat.revolt.R -import chat.revolt.api.RevoltAPI -import chat.revolt.api.RevoltError -import chat.revolt.api.schemas.Invite -import chat.revolt.composables.generic.IconPlaceholder -import chat.revolt.composables.generic.RemoteImage +import chat.peptide.R +import chat.peptide.api.PeptideAPI +import chat.peptide.api.PeptideError +import chat.peptide.api.schemas.Invite +import chat.peptide.composables.generic.IconPlaceholder +import chat.peptide.composables.generic.PepTextButton +import chat.peptide.composables.generic.RemoteImage +import chat.peptide.composables.generic.SquareButton @Composable fun ServerInviteDialog( isLoading: Boolean, invite: Invite?, - error: RevoltError?, + error: PeptideError?, onJoinClick: () -> Unit, onDismiss: () -> Unit ) { @@ -74,7 +76,7 @@ fun ServerInviteDialog( modifier = Modifier.fillMaxWidth() ) Spacer(Modifier.height(32.dp)) - Button( + SquareButton( onClick = onDismiss, modifier = Modifier.fillMaxWidth(), ) { @@ -100,7 +102,7 @@ fun ServerInviteDialog( horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Bottom // Align buttons to the bottom ) { - Button( + SquareButton( onClick = onJoinClick, modifier = Modifier.fillMaxWidth(), enabled = !isLoading @@ -121,7 +123,7 @@ fun ServerInviteDialog( Text(text = stringResource(id = R.string.invite_join)) } } - TextButton( + PepTextButton( onClick = onDismiss, modifier = Modifier.fillMaxWidth() ) { @@ -136,7 +138,7 @@ fun ServerInviteDialog( ) { if (invite.serverIcon != null) { RemoteImage( - url = "${RevoltAPI.getCurrentFilesUrl()}/icons/${invite.serverIcon.id}/${invite.serverIcon.filename}", + url = "${PeptideAPI.getCurrentFilesUrl()}/icons/${invite.serverIcon.id}/${invite.serverIcon.filename}", allowAnimation = false, description = invite.serverName ?: stringResource(id = R.string.unknown), modifier = Modifier @@ -190,7 +192,7 @@ fun ServerInviteDialog( ) { if (invite.userAvatar != null) { RemoteImage( - url = "${RevoltAPI.getCurrentFilesUrl()}/avatars/${invite.userAvatar.id}/${invite.userAvatar.filename}", + url = "${PeptideAPI.getCurrentFilesUrl()}/avatars/${invite.userAvatar.id}/${invite.userAvatar.filename}", description = invite.userName, modifier = Modifier .size(24.dp) @@ -246,7 +248,7 @@ fun ServerInviteDialogPreviewError() { ServerInviteDialog( isLoading = false, invite = null, - error = RevoltError(type = "NotFound"), + error = PeptideError(type = "NotFound"), onJoinClick = {}, onDismiss = {} ) @@ -256,7 +258,7 @@ fun ServerInviteDialogPreviewError() { @Composable fun ServerInviteDialogPreviewSuccess() { val invite = Invite( - serverName = "Revolt Test Server", + serverName = "Peptide Test Server", serverIcon = null, // Replace with a real AutumnResource if needed for preview memberCount = 123, userName = "TestUser", diff --git a/app/src/main/java/chat/revolt/composables/screens/chat/discover/ServerInviteHandler.kt b/app/src/main/java/chat/peptide/composables/screens/chat/discover/ServerInviteHandler.kt similarity index 92% rename from app/src/main/java/chat/revolt/composables/screens/chat/discover/ServerInviteHandler.kt rename to app/src/main/java/chat/peptide/composables/screens/chat/discover/ServerInviteHandler.kt index c63b555c..bb0a1f28 100644 --- a/app/src/main/java/chat/revolt/composables/screens/chat/discover/ServerInviteHandler.kt +++ b/app/src/main/java/chat/peptide/composables/screens/chat/discover/ServerInviteHandler.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.screens.chat.discover +package chat.peptide.composables.screens.chat.discover import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState @@ -8,7 +8,7 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.hilt.navigation.compose.hiltViewModel -import chat.revolt.api.RevoltError +import chat.peptide.api.PeptideError import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch @@ -22,7 +22,7 @@ fun ServerInviteHandler( val scope = rememberCoroutineScope() var isJoining by remember { mutableStateOf(false) } var showDialog by remember { mutableStateOf(true) } - var error by remember { mutableStateOf(null) } + var error by remember { mutableStateOf(null) } // Get the UI state val uiState by viewModel.uiState.collectAsState() diff --git a/app/src/main/java/chat/revolt/composables/screens/chat/drawer/ChannelSideDrawer.kt b/app/src/main/java/chat/peptide/composables/screens/chat/drawer/ChannelSideDrawer.kt similarity index 85% rename from app/src/main/java/chat/revolt/composables/screens/chat/drawer/ChannelSideDrawer.kt rename to app/src/main/java/chat/peptide/composables/screens/chat/drawer/ChannelSideDrawer.kt index c948cb5e..5ec8f6ed 100644 --- a/app/src/main/java/chat/revolt/composables/screens/chat/drawer/ChannelSideDrawer.kt +++ b/app/src/main/java/chat/peptide/composables/screens/chat/drawer/ChannelSideDrawer.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.screens.chat.drawer +package chat.peptide.composables.screens.chat.drawer import androidx.compose.animation.animateColorAsState import androidx.compose.animation.core.Spring @@ -72,30 +72,31 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import chat.revolt.R -import chat.revolt.api.RevoltAPI -import chat.revolt.api.internals.CategorisedChannelList -import chat.revolt.api.internals.ChannelUtils -import chat.revolt.api.internals.DirectMessages -import chat.revolt.api.schemas.Category -import chat.revolt.api.schemas.Channel -import chat.revolt.api.schemas.ChannelType -import chat.revolt.api.schemas.ServerFlags -import chat.revolt.api.schemas.User -import chat.revolt.api.schemas.has -import chat.revolt.api.settings.GeoStateProvider -import chat.revolt.api.settings.NotificationSettingsProvider -import chat.revolt.api.settings.SyncedSettings -import chat.revolt.composables.generic.GroupIcon -import chat.revolt.composables.generic.IconPlaceholder -import chat.revolt.composables.generic.RemoteImage -import chat.revolt.composables.generic.SquareButton -import chat.revolt.composables.generic.UserAvatar -import chat.revolt.composables.generic.presenceFromStatus -import chat.revolt.composables.screens.chat.ChannelIcon -import chat.revolt.composables.screens.chat.discover.DiscoverServersList -import chat.revolt.screens.chat.ChatRouterDestination -import chat.revolt.sheets.ChannelContextSheet +import chat.peptide.R +import chat.peptide.api.PeptideAPI +import chat.peptide.api.internals.CategorisedChannelList +import chat.peptide.api.internals.ChannelUtils +import chat.peptide.api.internals.DirectMessages +import chat.peptide.api.schemas.Category +import chat.peptide.api.schemas.Channel +import chat.peptide.api.schemas.ChannelType +import chat.peptide.api.schemas.ServerFlags +import chat.peptide.api.schemas.User +import chat.peptide.api.schemas.has +import chat.peptide.api.settings.GeoStateProvider +import chat.peptide.api.settings.NotificationSettingsProvider +import chat.peptide.api.settings.SyncedSettings +import chat.peptide.composables.generic.GroupIcon +import chat.peptide.composables.generic.IconPlaceholder +import chat.peptide.composables.generic.RemoteImage +import chat.peptide.composables.generic.SquareButton +import chat.peptide.composables.generic.UserAvatar +import chat.peptide.composables.generic.presenceFromStatus +import chat.peptide.composables.screens.chat.ChannelIcon +import chat.peptide.composables.screens.chat.discover.DiscoverServersList +import chat.peptide.screens.chat.ChatRouterDestination +import chat.peptide.sheets.ChannelContextSheet +import chat.peptide.sheets.UserInfoSheet @OptIn( ExperimentalMaterial3Api::class, ExperimentalFoundationApi::class, @@ -114,7 +115,7 @@ fun ChannelSideDrawer( modifier: Modifier = Modifier ) { - val server = RevoltAPI.serverCache[currentServer] + val server = PeptideAPI.serverCache[currentServer] val categorisedChannels = server?.let { ChannelUtils.categoriseServerFlat(it) } @@ -157,18 +158,19 @@ fun ChannelSideDrawer( // - Sort the servers that are in the ordering using the ordering. // - Add the servers that aren't in the ordering to the end of the list. // - Sort the servers that aren't in the ordering by their ID (creation order). - val serverList = ((RevoltAPI.serverCache.values.filter { + val serverList = ((PeptideAPI.serverCache.values.filter { SyncedSettings.ordering.servers.contains( it.id ) } - .sortedBy { SyncedSettings.ordering.servers.indexOf(it.id) }) + (RevoltAPI.serverCache.values.filter { + .sortedBy { SyncedSettings.ordering.servers.indexOf(it.id) }) + (PeptideAPI.serverCache.values.filter { !SyncedSettings.ordering.servers.contains( it.id ) }.sortedBy { it.id })) var channelContextSheetTarget by remember { mutableStateOf(null) } + var userContextSheetTarget by remember { mutableStateOf(null) } if (channelContextSheetTarget != null) { val channelContextSheetState = rememberModalBottomSheetState() @@ -189,6 +191,26 @@ fun ChannelSideDrawer( } } + if (userContextSheetTarget != null) { + val userContextSheetState = rememberModalBottomSheetState( + skipPartiallyExpanded = true, + ) + ModalBottomSheet( + sheetState = userContextSheetState, + onDismissRequest = { + userContextSheetTarget = null + } + ) { + UserInfoSheet( + userId = userContextSheetTarget!!, + dismissSheet = { + userContextSheetState.hide() + userContextSheetTarget = null + } + ) + } + } + Box { @@ -208,13 +230,19 @@ fun ChannelSideDrawer( onDestinationChanged(ChatRouterDestination.Home) } .size(48.dp) - .background(MaterialTheme.colorScheme.primaryContainer), + .background( + color = if (currentDestination is ChatRouterDestination.Home) { + MaterialTheme.colorScheme.secondaryContainer + } else MaterialTheme.colorScheme.primaryContainer + ), contentAlignment = Alignment.Center ) { Icon( painter = painterResource(R.drawable.ic_direct_messages), contentDescription = stringResource(R.string.discover_alt), - tint = MaterialTheme.colorScheme.onPrimaryContainer + tint = if (currentDestination is ChatRouterDestination.Home) { + MaterialTheme.colorScheme.onSecondaryContainer + } else MaterialTheme.colorScheme.onBackground ) } } @@ -243,7 +271,7 @@ fun ChannelSideDrawer( else -> { val partner = if (dm.channelType == ChannelType.DirectMessage) { - RevoltAPI.userCache[ + PeptideAPI.userCache[ ChannelUtils.resolveDMPartner( dm ) @@ -292,19 +320,35 @@ fun ChannelSideDrawer( Box( Modifier .padding(8.dp) - .clip(RoundedCornerShape(16.dp)) + .clip( + animateDpAsState( + targetValue = if (currentDestination is ChatRouterDestination.Discover) 16.dp else 24.dp, + animationSpec = spring(stiffness = Spring.StiffnessMediumLow), + label = "Discover button corner radius" + ).value.let { RoundedCornerShape(it) }) .clickable { onDestinationChanged( ChatRouterDestination.Discover ) } .size(48.dp) - .background(MaterialTheme.colorScheme.secondaryContainer), + .background( + animateColorAsState( + targetValue = if (currentDestination is ChatRouterDestination.Discover) { + MaterialTheme.colorScheme.secondaryContainer + } else MaterialTheme.colorScheme.primaryContainer, + animationSpec = spring(stiffness = Spring.StiffnessMediumLow), + label = "Discover button background" + ).value + ), contentAlignment = Alignment.Center ) { Icon( painter = painterResource(R.drawable.icn_explore_24dp), - contentDescription = stringResource(R.string.discover_alt) + contentDescription = stringResource(R.string.discover_alt), + tint = if (currentDestination is ChatRouterDestination.Discover) { + MaterialTheme.colorScheme.onSecondaryContainer + } else MaterialTheme.colorScheme.onPrimaryContainer ) } } @@ -318,12 +362,13 @@ fun ChannelSideDrawer( onShowAddServerSheet() } .size(48.dp) - .background(MaterialTheme.colorScheme.secondaryContainer), + .background(MaterialTheme.colorScheme.primaryContainer), contentAlignment = Alignment.Center ) { Icon( painter = painterResource(R.drawable.icn_add_24dp), - contentDescription = stringResource(R.string.server_plus_alt) + contentDescription = stringResource(R.string.server_plus_alt), + tint = MaterialTheme.colorScheme.onPrimaryContainer ) } } @@ -334,7 +379,7 @@ fun ChannelSideDrawer( ) { val serverInList = serverList[it] val serverHasUnread = - serverInList.id?.let { srvId -> RevoltAPI.unreads.serverHasUnread(srvId) } + serverInList.id?.let { srvId -> PeptideAPI.unreads.serverHasUnread(srvId) } ?: false val leftIndicatorHeight = animateDpAsState( targetValue = if (serverInList.id == currentServer) 32.dp @@ -360,16 +405,23 @@ fun ChannelSideDrawer( label = "Left indicator colour" ) - Box(Modifier.fillMaxWidth()) { - Box( - Modifier - .padding(8.dp) - .clip(CircleShape) - .clickable { + Box( + Modifier + .fillMaxWidth() + .combinedClickable( + onClick = { serverInList.id?.let { srvId -> navigateToServer(srvId) } - }) { + }, + onLongClick = { + serverInList.id?.let { srvId -> onShowServerContextSheet(srvId) } + } + ) + ) { + Box( + Modifier.padding(8.dp) + ) { val icon = serverInList.icon?.id?.let { iconId -> - "${RevoltAPI.getCurrentFilesUrl()}/icons/$iconId" + "${PeptideAPI.getCurrentFilesUrl()}/icons/$iconId" } if (icon != null) { RemoteImage( @@ -436,7 +488,7 @@ fun ChannelSideDrawer( ) { if (server?.banner != null) { RemoteImage( - url = "${RevoltAPI.getCurrentFilesUrl()}/banners/${server.banner.id}", + url = "${PeptideAPI.getCurrentFilesUrl()}/banners/${server.banner.id}", description = null, contentScale = ContentScale.Crop, modifier = Modifier @@ -480,7 +532,7 @@ fun ChannelSideDrawer( if (server?.flags has ServerFlags.Official) { Icon( painter = painterResource( - id = R.drawable.ic_revolt_decagram_24dp + id = R.drawable.ic_peptide_decagram_24dp ), contentDescription = stringResource( R.string.server_flag_official @@ -541,7 +593,7 @@ fun ChannelSideDrawer( currentDestination, onDestinationChanged, channelListState, - onOpenChannelContextSheet = { channelContextSheetTarget = it } + onOpenUserInfoSheet = { userId -> userContextSheetTarget = userId } ) } else { ServerChannelListRenderer( @@ -564,14 +616,13 @@ fun ChannelSideDrawer( onClick = { onDestinationChanged(ChatRouterDestination.Friends) }, - containerColor = MaterialTheme.colorScheme.primaryContainer, - contentColor = MaterialTheme.colorScheme.onPrimaryContainer, + containerColor = MaterialTheme.colorScheme.primary, shape = CircleShape ) { Icon( painter = painterResource(R.drawable.ic_new_message), contentDescription = stringResource(R.string.message_friends), - tint = MaterialTheme.colorScheme.onPrimaryContainer + tint = MaterialTheme.colorScheme.onPrimary ) } } @@ -615,11 +666,11 @@ private fun DirectMessagesChannelListRendererPreview() { "user2_id" to User(id = "user2_id", username = "User Two", avatar = null, online = false) ) - // Simulate RevoltAPI cache for preview - RevoltAPI.channelCache.clear() - mockChannels.forEach { RevoltAPI.channelCache[it.id!!] = it } - RevoltAPI.userCache.clear() - mockUsers.forEach { (id, user) -> RevoltAPI.userCache[id] = user } + // Simulate PeptideAPI cache for preview + PeptideAPI.channelCache.clear() + mockChannels.forEach { PeptideAPI.channelCache[it.id!!] = it } + PeptideAPI.userCache.clear() + mockUsers.forEach { (id, user) -> PeptideAPI.userCache[id] = user } //ColumnScope is required for DirectMessagesChannelListRenderer, let's provide a dummy one @@ -628,7 +679,7 @@ private fun DirectMessagesChannelListRendererPreview() { currentDestination = ChatRouterDestination.Home, onDestinationChanged = {}, channelListState = rememberLazyListState(), - onOpenChannelContextSheet = {} + onOpenUserInfoSheet = {} ) } } @@ -636,14 +687,14 @@ private fun DirectMessagesChannelListRendererPreview() { @Preview @Composable private fun DirectMessagesChannelListRendererEmptyPreview() { - // Simulate RevoltAPI cache for preview - empty state - RevoltAPI.channelCache.clear() - RevoltAPI.channelCache["saved_notes_channel_id"] = Channel( + // Simulate PeptideAPI cache for preview - empty state + PeptideAPI.channelCache.clear() + PeptideAPI.channelCache["saved_notes_channel_id"] = Channel( id = "saved_notes_channel_id", name = "Saved Messages", channelType = ChannelType.SavedMessages ) - RevoltAPI.userCache.clear() + PeptideAPI.userCache.clear() //ColumnScope is required for DirectMessagesChannelListRenderer, let's provide a dummy one Column(Modifier.background(MaterialTheme.colorScheme.surface)) { @@ -651,7 +702,7 @@ private fun DirectMessagesChannelListRendererEmptyPreview() { currentDestination = ChatRouterDestination.Home, onDestinationChanged = {}, channelListState = rememberLazyListState(), - onOpenChannelContextSheet = {} + onOpenUserInfoSheet = {} ) } } @@ -661,10 +712,10 @@ private fun ColumnScope.DirectMessagesChannelListRenderer( currentDestination: ChatRouterDestination, onDestinationChanged: (ChatRouterDestination) -> Unit, channelListState: LazyListState, - onOpenChannelContextSheet: (String) -> Unit, + onOpenUserInfoSheet: (String) -> Unit, ) { val dmAbleChannels = - RevoltAPI.channelCache.values + PeptideAPI.channelCache.values .filter { it.channelType == ChannelType.DirectMessage || it.channelType == ChannelType.Group } .filter { if (it.channelType == ChannelType.DirectMessage) it.active == true else true } .sortedBy { it.lastMessageID ?: it.id } @@ -677,7 +728,7 @@ private fun ColumnScope.DirectMessagesChannelListRenderer( .weight(1f) ) { item(key = "saved_messages") { - val notesChannel = RevoltAPI.channelCache.values.firstOrNull { + val notesChannel = PeptideAPI.channelCache.values.firstOrNull { it.channelType == ChannelType.SavedMessages } @@ -756,7 +807,7 @@ private fun ColumnScope.DirectMessagesChannelListRenderer( val partner = if (channel.channelType == ChannelType.DirectMessage) { - RevoltAPI.userCache[ + PeptideAPI.userCache[ ChannelUtils.resolveDMPartner( channel ) @@ -776,7 +827,7 @@ private fun ColumnScope.DirectMessagesChannelListRenderer( else -> false }, hasUnread = channel.lastMessageID?.let { lastMessageID -> - RevoltAPI.unreads.hasUnread( + PeptideAPI.unreads.hasUnread( channel.id!!, lastMessageID, serverId = null @@ -786,7 +837,8 @@ private fun ColumnScope.DirectMessagesChannelListRenderer( onDestinationChanged = { dest -> onDestinationChanged(dest) }, - onOpenChannelContextSheet = onOpenChannelContextSheet + onOpenChannelContextSheet = {}, + onOpenUserInfoSheet = { userId -> onOpenUserInfoSheet(userId) } ) } } @@ -859,7 +911,7 @@ private fun ColumnScope.ServerChannelListRenderer( onDestinationChanged(dest) }, hasUnread = channelOrCat.channel.lastMessageID?.let { lastMessageID -> - RevoltAPI.unreads.hasUnread( + PeptideAPI.unreads.hasUnread( channelOrCat.channel.id!!, lastMessageID, serverId @@ -927,9 +979,7 @@ fun ChannelItem( horizontalArrangement = Arrangement.spacedBy(8.dp, Alignment.Start), modifier = Modifier .padding(start = 8.dp, end = 8.dp) - .clip( - CircleShape - ) + .clip(CircleShape) .combinedClickable( onLongClickLabel = stringResource(R.string.channel_context_sheet_open), onLongClick = { @@ -981,7 +1031,7 @@ fun ChannelItem( Text( text = (ChannelUtils.resolveName(channel) ?: stringResource(R.string.unknown)) + if (appendServerName && channel.server != null) { - " (${RevoltAPI.serverCache[channel.server]?.name ?: stringResource(R.string.unknown)})" + " (${PeptideAPI.serverCache[channel.server]?.name ?: stringResource(R.string.unknown)})" } else { "" }, @@ -1025,7 +1075,8 @@ fun DMOrGroupItem( hasUnread: Boolean, isMuted: Boolean = false, onDestinationChanged: (ChatRouterDestination) -> Unit, - onOpenChannelContextSheet: (String) -> Unit + onOpenChannelContextSheet: (String) -> Unit, + onOpenUserInfoSheet: (String) -> Unit ) { val currentIndicatorOpacity = animateFloatAsState( targetValue = if (isCurrent) 1f else 0f, @@ -1043,9 +1094,12 @@ fun DMOrGroupItem( .combinedClickable( onLongClickLabel = stringResource(R.string.channel_context_sheet_open), onLongClick = { - channel.id?.let { chId -> + partner?.id?.let { userId -> + onOpenUserInfoSheet(userId) + } ?: channel.id?.let { chId -> onOpenChannelContextSheet(chId) } + }, onClick = { channel.id?.let { chId -> @@ -1105,7 +1159,18 @@ fun DMOrGroupItem( avatar = partner?.avatar ?: channel.icon, size = 28.dp, presenceSize = 12.dp - ) + ).let { avatar -> + // Placed inside a Box, otherwise the combinedClickable modifier doesn't work. + Box( + Modifier.combinedClickable( + onLongClick = { + partner?.id?.let { uid -> onOpenUserInfoSheet(uid) } + }, + onClick = {} + ), + content = { avatar } + ) + } } Column(Modifier.weight(1f)) { diff --git a/app/src/main/java/chat/revolt/composables/screens/chat/molecules/JoinVoiceChannelButton.kt b/app/src/main/java/chat/peptide/composables/screens/chat/molecules/JoinVoiceChannelButton.kt similarity index 89% rename from app/src/main/java/chat/revolt/composables/screens/chat/molecules/JoinVoiceChannelButton.kt rename to app/src/main/java/chat/peptide/composables/screens/chat/molecules/JoinVoiceChannelButton.kt index dcdec0a9..a7dc5c87 100644 --- a/app/src/main/java/chat/revolt/composables/screens/chat/molecules/JoinVoiceChannelButton.kt +++ b/app/src/main/java/chat/peptide/composables/screens/chat/molecules/JoinVoiceChannelButton.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.screens.chat.molecules +package chat.peptide.composables.screens.chat.molecules import androidx.compose.foundation.background import androidx.compose.foundation.clickable @@ -15,10 +15,10 @@ import androidx.compose.ui.draw.clip import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp -import chat.revolt.R -import chat.revolt.callbacks.Action -import chat.revolt.callbacks.ActionChannel -import chat.revolt.composables.screens.chat.StackedUserAvatars +import chat.peptide.R +import chat.peptide.callbacks.Action +import chat.peptide.callbacks.ActionChannel +import chat.peptide.composables.screens.chat.StackedUserAvatars import kotlinx.coroutines.launch @Composable diff --git a/app/src/main/java/chat/revolt/composables/screens/services/DiscoverView.kt b/app/src/main/java/chat/peptide/composables/screens/services/DiscoverView.kt similarity index 92% rename from app/src/main/java/chat/revolt/composables/screens/services/DiscoverView.kt rename to app/src/main/java/chat/peptide/composables/screens/services/DiscoverView.kt index 80a4df91..f71310c1 100644 --- a/app/src/main/java/chat/revolt/composables/screens/services/DiscoverView.kt +++ b/app/src/main/java/chat/peptide/composables/screens/services/DiscoverView.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.screens.services +package chat.peptide.composables.screens.services import android.annotation.SuppressLint import android.content.Intent @@ -22,11 +22,11 @@ import androidx.compose.ui.Modifier 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.RevoltAPI -import chat.revolt.api.RevoltJson -import chat.revolt.api.buildUserAgent -import chat.revolt.api.internals.ThemeCompat +import chat.peptide.activities.InviteActivity +import chat.peptide.api.PeptideAPI +import chat.peptide.api.PeptideJson +import chat.peptide.api.buildUserAgent +import chat.peptide.api.internals.ThemeCompat import kotlinx.serialization.json.JsonObject import kotlinx.serialization.json.JsonPrimitive @@ -60,13 +60,13 @@ fun ColumnScope.DiscoverView() { super.onPageFinished(view, url) val themeMessage = JsonObject( mapOf( - "source" to JsonPrimitive("revolt"), + "source" to JsonPrimitive("peptide"), "type" to JsonPrimitive("theme"), "theme" to themeMap ) ) val themeMessageString = - RevoltJson.encodeToString(JsonObject.serializer(), themeMessage) + PeptideJson.encodeToString(JsonObject.serializer(), themeMessage) evaluateJavascript( """ @@ -101,7 +101,7 @@ fun ColumnScope.DiscoverView() { view: WebView?, request: WebResourceRequest? ): Boolean { - if (request?.url?.host.equals(Uri.parse(RevoltAPI.getCurrentAppUrl()).host)) { + if (request?.url?.host.equals(Uri.parse(PeptideAPI.getCurrentAppUrl()).host)) { val intent = Intent( context, InviteActivity::class.java diff --git a/app/src/main/java/chat/revolt/composables/screens/settings/AttributionItem.kt b/app/src/main/java/chat/peptide/composables/screens/settings/AttributionItem.kt similarity index 85% rename from app/src/main/java/chat/revolt/composables/screens/settings/AttributionItem.kt rename to app/src/main/java/chat/peptide/composables/screens/settings/AttributionItem.kt index 12482e38..89ad9dbf 100644 --- a/app/src/main/java/chat/revolt/composables/screens/settings/AttributionItem.kt +++ b/app/src/main/java/chat/peptide/composables/screens/settings/AttributionItem.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.screens.settings +package chat.peptide.composables.screens.settings import androidx.compose.foundation.clickable import androidx.compose.material3.ListItem @@ -6,8 +6,8 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource -import chat.revolt.R -import chat.revolt.screens.about.Library +import chat.peptide.R +import chat.peptide.screens.about.Library @Composable fun AttributionItem(library: Library, onClick: () -> Unit) { diff --git a/app/src/main/java/chat/revolt/composables/screens/settings/ServerOverview.kt b/app/src/main/java/chat/peptide/composables/screens/settings/ServerOverview.kt similarity index 89% rename from app/src/main/java/chat/revolt/composables/screens/settings/ServerOverview.kt rename to app/src/main/java/chat/peptide/composables/screens/settings/ServerOverview.kt index 693db19c..180b8aef 100644 --- a/app/src/main/java/chat/revolt/composables/screens/settings/ServerOverview.kt +++ b/app/src/main/java/chat/peptide/composables/screens/settings/ServerOverview.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.screens.settings +package chat.peptide.composables.screens.settings import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box @@ -26,13 +26,13 @@ import androidx.compose.ui.res.painterResource 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.RevoltAPI -import chat.revolt.api.schemas.Server -import chat.revolt.api.schemas.ServerFlags -import chat.revolt.api.schemas.has -import chat.revolt.composables.generic.IconPlaceholder -import chat.revolt.composables.generic.RemoteImage +import chat.peptide.R +import chat.peptide.api.PeptideAPI +import chat.peptide.api.schemas.Server +import chat.peptide.api.schemas.ServerFlags +import chat.peptide.api.schemas.has +import chat.peptide.composables.generic.IconPlaceholder +import chat.peptide.composables.generic.RemoteImage @Composable fun ServerOverview(server: Server) { @@ -51,7 +51,7 @@ fun ServerOverview(server: Server) { ) RemoteImage( - url = "${RevoltAPI.getCurrentFilesUrl()}/banners/${it.id}/${it.filename}", + url = "${PeptideAPI.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 = "${RevoltAPI.getCurrentFilesUrl()}/icons/${it.id}", + url = "${PeptideAPI.getCurrentFilesUrl()}/icons/${it.id}", description = null, allowAnimation = false, modifier = Modifier @@ -104,7 +104,7 @@ fun ServerOverview(server: Server) { CompositionLocalProvider(LocalContentColor provides Color.White) { if (server.flags has ServerFlags.Official) { Icon( - painter = painterResource(id = R.drawable.ic_revolt_decagram_24dp), + painter = painterResource(id = R.drawable.ic_peptide_decagram_24dp), contentDescription = stringResource(R.string.server_flag_official), modifier = Modifier .padding(end = 8.dp) diff --git a/app/src/main/java/chat/peptide/composables/screens/settings/UserButtons.kt b/app/src/main/java/chat/peptide/composables/screens/settings/UserButtons.kt new file mode 100644 index 00000000..99f84223 --- /dev/null +++ b/app/src/main/java/chat/peptide/composables/screens/settings/UserButtons.kt @@ -0,0 +1,326 @@ +package chat.peptide.composables.screens.settings + +import android.widget.Toast +import androidx.compose.animation.animateContentSize +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.FilledTonalButton +import androidx.compose.material3.Icon +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.LocalContentColor +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import chat.peptide.R +import chat.peptide.api.PeptideAPI +import chat.peptide.api.routes.user.acceptFriendRequest +import chat.peptide.api.routes.user.friendUser +import chat.peptide.api.routes.user.openDM +import chat.peptide.api.routes.user.unfriendUser +import chat.peptide.api.schemas.User +import chat.peptide.callbacks.Action +import chat.peptide.callbacks.ActionChannel +import chat.peptide.composables.generic.SquareButton +import kotlinx.coroutines.launch +import logcat.LogPriority +import logcat.asLog +import logcat.logcat + +private const val REL_NONE: String = "None" +private const val REL_USER: String = "User" +private const val REL_FRIEND: String = "Friend" +private const val REL_OUTGOING: String = "Outgoing" +private const val REL_INCOMING: String = "Incoming" +private const val REL_BLOCKED: String = "Blocked" +private const val REL_BLOCKED_OTHER: String = "BlockedOther" + +@Composable +fun UserButtons( + user: User, + dismissSheet: suspend () -> Unit, + onRelationshipChanged: (String?) -> Unit = {} +) { + val scope = rememberCoroutineScope() + val context = LocalContext.current + + var botEasterEgg by remember { mutableStateOf(false) } + var isAddFriendLoading by remember { mutableStateOf(false) } + var isOpenDMLoading by remember { mutableStateOf(false) } + var isCancelRequestLoading by remember { mutableStateOf(false) } + var isAcceptRequestLoading by remember { mutableStateOf(false) } + var isDeclineRequestLoading by remember { mutableStateOf(false) } + + // Always derive latest user from cache to reflect relationship changes + val latestUser: User = user.id?.let { id -> PeptideAPI.userCache[id] } ?: user + val relationship: String = latestUser.relationship ?: REL_NONE + + if (user.id == null) return Row { + SquareButton( + onClick = { + scope.launch { + try { + friendUser("${user.username}#${user.discriminator}") + } catch (e: Exception) { + // Button did nothing, but not an error + if (e.message == "NoEffect") return@launch + + // Log all other errors + logcat(LogPriority.ERROR) { e.asLog() } + } + } + }, + modifier = Modifier.weight(1f) + ) { + Text(stringResource(R.string.user_info_sheet_add_friend)) + } + } + + Row( + horizontalArrangement = Arrangement.spacedBy(8.dp), + verticalAlignment = Alignment.CenterVertically + ) { + when (relationship) { + REL_NONE -> { + if (latestUser.bot == null) { + SquareButton( + onClick = { + scope.launch { + try { + isAddFriendLoading = true + friendUser("${latestUser.username}#${latestUser.discriminator}") + latestUser.id?.let { id -> + val updated = latestUser.copy(relationship = REL_OUTGOING) + PeptideAPI.userCache[id] = + (PeptideAPI.userCache[id]?.copy(relationship = REL_OUTGOING)) + ?: updated + onRelationshipChanged(REL_OUTGOING) + } + } catch (e: Exception) { + if (e.message == "NoEffect") return@launch + logcat(LogPriority.ERROR) { e.asLog() } + } finally { + isAddFriendLoading = false + } + } + }, + modifier = Modifier.weight(1f), + enabled = !isAddFriendLoading + ) { + Row(horizontalArrangement = Arrangement.spacedBy(8.dp), verticalAlignment = Alignment.CenterVertically) { + Text(stringResource(R.string.user_info_sheet_add_friend)) + if (isAddFriendLoading) { + CircularProgressIndicator(modifier = Modifier.size(16.dp), strokeWidth = 2.dp, color = LocalContentColor.current) + } + } + } + } else { + Row( + horizontalArrangement = Arrangement.spacedBy( + 8.dp, + alignment = Alignment.Start + ), + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier + .animateContentSize() + .clip(MaterialTheme.shapes.small) + .clickable { botEasterEgg = true } + .padding(8.dp) + .weight(1f) + ) { + Icon( + painter = painterResource(R.drawable.icn_smart_toy_24dp), + contentDescription = null + ) + Text( + if (botEasterEgg) { + stringResource(R.string.user_info_sheet_user_is_bot_easter_egg) + } else { + stringResource(R.string.user_info_sheet_user_is_bot) + }, + style = MaterialTheme.typography.bodyMedium + ) + } + } + } + + REL_USER -> { + SquareButton( + onClick = { + scope.launch { + ActionChannel.send(Action.TopNavigate("settings/profile")) + // We must now close the bottom sheet, + // else we will crash if we try to open this sheet again + dismissSheet() + } + }, + modifier = Modifier.weight(1f) + ) { + Text(stringResource(R.string.user_info_sheet_edit_profile)) + } + } + + REL_FRIEND -> { + FilledTonalButton( + onClick = { + latestUser.id?.let { + scope.launch { + try { + isOpenDMLoading = true + val dm = openDM(latestUser.id) + if (dm.id != null) { + if (PeptideAPI.channelCache[dm.id] == null) + PeptideAPI.channelCache[dm.id] = dm + ActionChannel.send(Action.SwitchChannel(dm.id)) + dismissSheet() + } else { + Toast.makeText( + context, + context.getString(R.string.user_info_sheet_failed_to_open_dm), + Toast.LENGTH_SHORT + ).show() + } + } finally { + isOpenDMLoading = false + } + } + } + }, + modifier = Modifier.weight(1f), + enabled = !isOpenDMLoading + ) { + Row(horizontalArrangement = Arrangement.spacedBy(8.dp), verticalAlignment = Alignment.CenterVertically) { + Text(stringResource(R.string.user_info_sheet_send_message)) + if (isOpenDMLoading) { + CircularProgressIndicator(modifier = Modifier.size(16.dp), strokeWidth = 2.dp, color = LocalContentColor.current) + } + } + } + // Remove friend (in overflow menu) + } + + REL_OUTGOING -> { + SquareButton( + onClick = { + latestUser.id?.let { + scope.launch { + try { + isCancelRequestLoading = true + unfriendUser(latestUser.id) + val updated = latestUser.copy(relationship = REL_NONE) + PeptideAPI.userCache[latestUser.id] = + (PeptideAPI.userCache[latestUser.id]?.copy(relationship = REL_NONE)) + ?: updated + onRelationshipChanged(REL_NONE) + } catch (e: Exception) { + if (e.message == "NoEffect") return@launch + logcat(LogPriority.ERROR) { e.asLog() } + } finally { + isCancelRequestLoading = false + } + } + } + }, + modifier = Modifier.weight(1f), + enabled = !isCancelRequestLoading + ) { + Row(horizontalArrangement = Arrangement.spacedBy(8.dp), verticalAlignment = Alignment.CenterVertically) { + Text(stringResource(R.string.user_info_sheet_cancel_request)) + if (isCancelRequestLoading) { + CircularProgressIndicator(modifier = Modifier.size(16.dp), strokeWidth = 2.dp, color = LocalContentColor.current) + } + } + } + } + + REL_INCOMING -> { + SquareButton( + onClick = { + latestUser.id?.let { + scope.launch { + try { + isAcceptRequestLoading = true + acceptFriendRequest(latestUser.id) + val updated = latestUser.copy(relationship = REL_FRIEND) + PeptideAPI.userCache[latestUser.id] = + (PeptideAPI.userCache[latestUser.id]?.copy(relationship = REL_FRIEND)) + ?: updated + onRelationshipChanged(REL_FRIEND) + } catch (e: Exception) { + if (e.message == "NoEffect") return@launch + logcat(LogPriority.ERROR) { e.asLog() } + } finally { + isAcceptRequestLoading = false + } + } + } + }, + modifier = Modifier.weight(1f), + enabled = !isAcceptRequestLoading + ) { + Row(horizontalArrangement = Arrangement.spacedBy(8.dp), verticalAlignment = Alignment.CenterVertically) { + Text(stringResource(R.string.user_info_sheet_accept_request)) + if (isAcceptRequestLoading) { + CircularProgressIndicator(modifier = Modifier.size(16.dp), strokeWidth = 2.dp, color = LocalContentColor.current) + } + } + } + SquareButton( + onClick = { + latestUser.id?.let { + scope.launch { + try { + isDeclineRequestLoading = true + unfriendUser( latestUser.id) + val updated = latestUser.copy(relationship = REL_NONE) + PeptideAPI.userCache[latestUser.id] = + (PeptideAPI.userCache[latestUser.id]?.copy(relationship = REL_NONE)) + ?: updated + onRelationshipChanged(REL_NONE) + } catch (e: Exception) { + if (e.message == "NoEffect") return@launch + + logcat(LogPriority.ERROR) { e.asLog() } + } finally { + isDeclineRequestLoading = false + } + } + } + + }, + colors = ButtonDefaults.buttonColors( + containerColor = MaterialTheme.colorScheme.error, + contentColor = MaterialTheme.colorScheme.onError, + ), + modifier = Modifier.weight(1f), + enabled = !isDeclineRequestLoading + ) { + Row(horizontalArrangement = Arrangement.spacedBy(8.dp), verticalAlignment = Alignment.CenterVertically) { + Text(stringResource(R.string.user_info_sheet_decline_request)) + if (isDeclineRequestLoading) { + CircularProgressIndicator(modifier = Modifier.size(16.dp), strokeWidth = 2.dp, color = LocalContentColor.current) + } + } + } + } + REL_BLOCKED, REL_BLOCKED_OTHER -> Box(Modifier.weight(1f)) + else -> Box(Modifier.weight(1f)) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/chat/revolt/composables/screens/settings/UserOverview.kt b/app/src/main/java/chat/peptide/composables/screens/settings/UserOverview.kt similarity index 87% rename from app/src/main/java/chat/revolt/composables/screens/settings/UserOverview.kt rename to app/src/main/java/chat/peptide/composables/screens/settings/UserOverview.kt index fc91a77c..fb1da006 100644 --- a/app/src/main/java/chat/revolt/composables/screens/settings/UserOverview.kt +++ b/app/src/main/java/chat/peptide/composables/screens/settings/UserOverview.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.screens.settings +package chat.peptide.composables.screens.settings import androidx.compose.foundation.background import androidx.compose.foundation.border @@ -30,24 +30,24 @@ import androidx.compose.ui.text.AnnotatedString 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.RevoltAPI -import chat.revolt.api.internals.SpecialUsers -import chat.revolt.api.internals.ULID -import chat.revolt.api.internals.solidColor -import chat.revolt.api.routes.user.fetchUserProfile -import chat.revolt.api.schemas.AutumnResource -import chat.revolt.api.schemas.Profile -import chat.revolt.api.schemas.User -import chat.revolt.composables.generic.RemoteImage -import chat.revolt.composables.generic.UserAvatar -import chat.revolt.composables.generic.presenceFromStatus +import chat.peptide.R +import chat.peptide.api.PeptideAPI +import chat.peptide.api.internals.SpecialUsers +import chat.peptide.api.internals.ULID +import chat.peptide.api.internals.solidColor +import chat.peptide.api.routes.user.fetchUserProfile +import chat.peptide.api.schemas.AutumnResource +import chat.peptide.api.schemas.Profile +import chat.peptide.api.schemas.User +import chat.peptide.composables.generic.RemoteImage +import chat.peptide.composables.generic.UserAvatar +import chat.peptide.composables.generic.presenceFromStatus import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.runBlocking @Composable fun SelfUserOverview() { - val selfUser = RevoltAPI.userCache[RevoltAPI.selfId] ?: return + val selfUser = PeptideAPI.userCache[PeptideAPI.selfId] ?: return UserOverview(selfUser) } @@ -115,7 +115,7 @@ fun RawUserOverview( if (background != null) { RemoteImage( url = backgroundUrl - ?: "${RevoltAPI.getCurrentFilesUrl()}/backgrounds/${if (background is AutumnResource) background.id else null}/${if (background is AutumnResource) background.filename else background}", + ?: "${PeptideAPI.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/composables/screens/settings/appearance/ColourChip.kt b/app/src/main/java/chat/peptide/composables/screens/settings/appearance/ColourChip.kt similarity index 96% rename from app/src/main/java/chat/revolt/composables/screens/settings/appearance/ColourChip.kt rename to app/src/main/java/chat/peptide/composables/screens/settings/appearance/ColourChip.kt index 60bfc210..cf1cca80 100644 --- a/app/src/main/java/chat/revolt/composables/screens/settings/appearance/ColourChip.kt +++ b/app/src/main/java/chat/peptide/composables/screens/settings/appearance/ColourChip.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.screens.settings.appearance +package chat.peptide.composables.screens.settings.appearance import androidx.compose.foundation.background import androidx.compose.foundation.clickable diff --git a/app/src/main/java/chat/revolt/composables/screens/settings/appearance/CornerRadiusPicker.kt b/app/src/main/java/chat/peptide/composables/screens/settings/appearance/CornerRadiusPicker.kt similarity index 96% rename from app/src/main/java/chat/revolt/composables/screens/settings/appearance/CornerRadiusPicker.kt rename to app/src/main/java/chat/peptide/composables/screens/settings/appearance/CornerRadiusPicker.kt index 50c7340f..5445ec64 100644 --- a/app/src/main/java/chat/revolt/composables/screens/settings/appearance/CornerRadiusPicker.kt +++ b/app/src/main/java/chat/peptide/composables/screens/settings/appearance/CornerRadiusPicker.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.screens.settings.appearance +package chat.peptide.composables.screens.settings.appearance import androidx.compose.foundation.background import androidx.compose.foundation.clickable @@ -12,12 +12,10 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.AlertDialog -import androidx.compose.material3.Button import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Slider import androidx.compose.material3.Text -import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf @@ -31,7 +29,9 @@ import androidx.compose.ui.graphics.painter.Painter import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp -import chat.revolt.R +import chat.peptide.R +import chat.peptide.composables.generic.PepTextButton +import chat.peptide.composables.generic.SquareButton enum class CornerRadiusPreset(val percentage: Int) { SHARP(0), @@ -84,7 +84,7 @@ fun CornerRadiusPicker(percentage: Int, onUpdate: (Int) -> Unit, modifier: Modif } }, confirmButton = { - Button( + SquareButton( onClick = { showOtherModal = false onUpdate(sliderPosition.toInt()) @@ -94,7 +94,7 @@ fun CornerRadiusPicker(percentage: Int, onUpdate: (Int) -> Unit, modifier: Modif } }, dismissButton = { - TextButton( + PepTextButton( onClick = { showOtherModal = false } diff --git a/app/src/main/java/chat/revolt/composables/screens/splash/DisconnectedScreen.kt b/app/src/main/java/chat/peptide/composables/screens/splash/DisconnectedScreen.kt similarity index 91% rename from app/src/main/java/chat/revolt/composables/screens/splash/DisconnectedScreen.kt rename to app/src/main/java/chat/peptide/composables/screens/splash/DisconnectedScreen.kt index 05710bad..c846eb62 100644 --- a/app/src/main/java/chat/revolt/composables/screens/splash/DisconnectedScreen.kt +++ b/app/src/main/java/chat/peptide/composables/screens/splash/DisconnectedScreen.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.screens.splash +package chat.peptide.composables.screens.splash import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement @@ -16,7 +16,8 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import chat.revolt.R +import chat.peptide.R +import chat.peptide.composables.generic.SquareButton @Composable fun DisconnectedScreen(onRetry: () -> Unit) { @@ -45,7 +46,7 @@ fun DisconnectedScreen(onRetry: () -> Unit) { .fillMaxWidth() ) - Button(onClick = onRetry) { + SquareButton(onClick = onRetry) { Text(stringResource(R.string.tap_to_retry)) } } diff --git a/app/src/main/java/chat/revolt/composables/settings/SettingsHintBanner.kt b/app/src/main/java/chat/peptide/composables/settings/SettingsHintBanner.kt similarity index 94% rename from app/src/main/java/chat/revolt/composables/settings/SettingsHintBanner.kt rename to app/src/main/java/chat/peptide/composables/settings/SettingsHintBanner.kt index ab5e13ce..d9c00b7e 100644 --- a/app/src/main/java/chat/revolt/composables/settings/SettingsHintBanner.kt +++ b/app/src/main/java/chat/peptide/composables/settings/SettingsHintBanner.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.settings +package chat.peptide.composables.settings import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement @@ -19,6 +19,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import chat.peptide.composables.generic.SquareButton @Composable fun SettingsHintBanner( @@ -72,7 +73,7 @@ private fun SimpleSettingsHintBannerPreview() { ) }, button = { - Button(onClick = {}) { + SquareButton(onClick = {}) { Text("Let's test it out!") } }, diff --git a/app/src/main/java/chat/revolt/composables/settings/profile/StatusPicker.kt b/app/src/main/java/chat/peptide/composables/settings/profile/StatusPicker.kt similarity index 95% rename from app/src/main/java/chat/revolt/composables/settings/profile/StatusPicker.kt rename to app/src/main/java/chat/peptide/composables/settings/profile/StatusPicker.kt index a9e602e8..06291f0d 100644 --- a/app/src/main/java/chat/revolt/composables/settings/profile/StatusPicker.kt +++ b/app/src/main/java/chat/peptide/composables/settings/profile/StatusPicker.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.settings.profile +package chat.peptide.composables.settings.profile import androidx.compose.foundation.background import androidx.compose.foundation.clickable @@ -18,9 +18,9 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp -import chat.revolt.R -import chat.revolt.composables.generic.Presence -import chat.revolt.composables.generic.presenceColour +import chat.peptide.R +import chat.peptide.composables.generic.Presence +import chat.peptide.composables.generic.presenceColour fun Presence.stringResource(): Int { return when (this) { diff --git a/app/src/main/java/chat/revolt/composables/settings/sessions/SessionItem.kt b/app/src/main/java/chat/peptide/composables/settings/sessions/SessionItem.kt similarity index 92% rename from app/src/main/java/chat/revolt/composables/settings/sessions/SessionItem.kt rename to app/src/main/java/chat/peptide/composables/settings/sessions/SessionItem.kt index 660f9c15..a8775627 100644 --- a/app/src/main/java/chat/revolt/composables/settings/sessions/SessionItem.kt +++ b/app/src/main/java/chat/peptide/composables/settings/sessions/SessionItem.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.settings.sessions +package chat.peptide.composables.settings.sessions import android.text.format.DateUtils import androidx.compose.material3.Icon @@ -13,9 +13,9 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow -import chat.revolt.R -import chat.revolt.api.internals.ULID -import chat.revolt.api.schemas.Session +import chat.peptide.R +import chat.peptide.api.internals.ULID +import chat.peptide.api.schemas.Session @Composable fun SessionItem( diff --git a/app/src/main/java/chat/revolt/composables/sheets/SheetSelection.kt b/app/src/main/java/chat/peptide/composables/sheets/SheetSelection.kt similarity index 97% rename from app/src/main/java/chat/revolt/composables/sheets/SheetSelection.kt rename to app/src/main/java/chat/peptide/composables/sheets/SheetSelection.kt index 5efeccf3..5545e0ef 100644 --- a/app/src/main/java/chat/revolt/composables/sheets/SheetSelection.kt +++ b/app/src/main/java/chat/peptide/composables/sheets/SheetSelection.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.sheets +package chat.peptide.composables.sheets import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement @@ -15,7 +15,7 @@ import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp -import chat.revolt.R +import chat.peptide.R /** * Sheet selection. Used when a modal sheet prompts a choice out of x options. diff --git a/app/src/main/java/chat/revolt/composables/sheets/SheetTile.kt b/app/src/main/java/chat/peptide/composables/sheets/SheetTile.kt similarity index 97% rename from app/src/main/java/chat/revolt/composables/sheets/SheetTile.kt rename to app/src/main/java/chat/peptide/composables/sheets/SheetTile.kt index 4336576f..f9b39c71 100644 --- a/app/src/main/java/chat/revolt/composables/sheets/SheetTile.kt +++ b/app/src/main/java/chat/peptide/composables/sheets/SheetTile.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.sheets +package chat.peptide.composables.sheets import androidx.compose.foundation.background import androidx.compose.foundation.clickable @@ -22,7 +22,7 @@ import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Brush import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Dialog -import chat.revolt.api.internals.solidColor +import chat.peptide.api.internals.solidColor @Composable fun SheetTile( diff --git a/app/src/main/java/chat/revolt/composables/skeletons/MessageSkeleton.kt b/app/src/main/java/chat/peptide/composables/skeletons/MessageSkeleton.kt similarity index 97% rename from app/src/main/java/chat/revolt/composables/skeletons/MessageSkeleton.kt rename to app/src/main/java/chat/peptide/composables/skeletons/MessageSkeleton.kt index a6a2274a..4aea113b 100644 --- a/app/src/main/java/chat/revolt/composables/skeletons/MessageSkeleton.kt +++ b/app/src/main/java/chat/peptide/composables/skeletons/MessageSkeleton.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.skeletons +package chat.peptide.composables.skeletons import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box @@ -17,7 +17,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import chat.revolt.api.settings.LoadedSettings +import chat.peptide.api.settings.LoadedSettings enum class MessageSkeletonVariant { One, diff --git a/app/src/main/java/chat/revolt/composables/skeletons/SkeletonGlobals.kt b/app/src/main/java/chat/peptide/composables/skeletons/SkeletonGlobals.kt similarity index 74% rename from app/src/main/java/chat/revolt/composables/skeletons/SkeletonGlobals.kt rename to app/src/main/java/chat/peptide/composables/skeletons/SkeletonGlobals.kt index e7967cc2..b3510478 100644 --- a/app/src/main/java/chat/revolt/composables/skeletons/SkeletonGlobals.kt +++ b/app/src/main/java/chat/peptide/composables/skeletons/SkeletonGlobals.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.skeletons +package chat.peptide.composables.skeletons import androidx.compose.material3.LocalContentColor import androidx.compose.runtime.Composable diff --git a/app/src/main/java/chat/revolt/composables/skeletons/UserOverviewSkeleton.kt b/app/src/main/java/chat/peptide/composables/skeletons/UserOverviewSkeleton.kt similarity index 96% rename from app/src/main/java/chat/revolt/composables/skeletons/UserOverviewSkeleton.kt rename to app/src/main/java/chat/peptide/composables/skeletons/UserOverviewSkeleton.kt index 55c70cdf..3b272079 100644 --- a/app/src/main/java/chat/revolt/composables/skeletons/UserOverviewSkeleton.kt +++ b/app/src/main/java/chat/peptide/composables/skeletons/UserOverviewSkeleton.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.skeletons +package chat.peptide.composables.skeletons import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box @@ -18,7 +18,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import chat.revolt.api.settings.LoadedSettings +import chat.peptide.api.settings.LoadedSettings import com.valentinilk.shimmer.shimmer @Composable diff --git a/app/src/main/java/chat/revolt/composables/utils/ConditionalConsumptionPointerInput.kt b/app/src/main/java/chat/peptide/composables/utils/ConditionalConsumptionPointerInput.kt similarity index 99% rename from app/src/main/java/chat/revolt/composables/utils/ConditionalConsumptionPointerInput.kt rename to app/src/main/java/chat/peptide/composables/utils/ConditionalConsumptionPointerInput.kt index f16e5957..7f1cb39c 100644 --- a/app/src/main/java/chat/revolt/composables/utils/ConditionalConsumptionPointerInput.kt +++ b/app/src/main/java/chat/peptide/composables/utils/ConditionalConsumptionPointerInput.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.utils +package chat.peptide.composables.utils import androidx.compose.foundation.gestures.GestureCancellationException import androidx.compose.foundation.gestures.PressGestureScope diff --git a/app/src/main/java/chat/revolt/composables/utils/SizeMeasured.kt b/app/src/main/java/chat/peptide/composables/utils/SizeMeasured.kt similarity index 95% rename from app/src/main/java/chat/revolt/composables/utils/SizeMeasured.kt rename to app/src/main/java/chat/peptide/composables/utils/SizeMeasured.kt index 3e0c389d..41d1fb9c 100644 --- a/app/src/main/java/chat/revolt/composables/utils/SizeMeasured.kt +++ b/app/src/main/java/chat/peptide/composables/utils/SizeMeasured.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.utils +package chat.peptide.composables.utils import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier diff --git a/app/src/main/java/chat/revolt/composables/vectorassets/CreateServer.kt b/app/src/main/java/chat/peptide/composables/vectorassets/CreateServer.kt similarity index 97% rename from app/src/main/java/chat/revolt/composables/vectorassets/CreateServer.kt rename to app/src/main/java/chat/peptide/composables/vectorassets/CreateServer.kt index 5047f61a..c27be546 100644 --- a/app/src/main/java/chat/revolt/composables/vectorassets/CreateServer.kt +++ b/app/src/main/java/chat/peptide/composables/vectorassets/CreateServer.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.vectorassets +package chat.peptide.composables.vectorassets import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable diff --git a/app/src/main/java/chat/revolt/composables/vectorassets/GeoGateUX.kt b/app/src/main/java/chat/peptide/composables/vectorassets/GeoGateUX.kt similarity index 98% rename from app/src/main/java/chat/revolt/composables/vectorassets/GeoGateUX.kt rename to app/src/main/java/chat/peptide/composables/vectorassets/GeoGateUX.kt index d5a04e9a..52a2ba2a 100644 --- a/app/src/main/java/chat/revolt/composables/vectorassets/GeoGateUX.kt +++ b/app/src/main/java/chat/peptide/composables/vectorassets/GeoGateUX.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.vectorassets +package chat.peptide.composables.vectorassets import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable diff --git a/app/src/main/java/chat/revolt/composables/vectorassets/JoinServer.kt b/app/src/main/java/chat/peptide/composables/vectorassets/JoinServer.kt similarity index 95% rename from app/src/main/java/chat/revolt/composables/vectorassets/JoinServer.kt rename to app/src/main/java/chat/peptide/composables/vectorassets/JoinServer.kt index 5aa2a5fa..fc18f5be 100644 --- a/app/src/main/java/chat/revolt/composables/vectorassets/JoinServer.kt +++ b/app/src/main/java/chat/peptide/composables/vectorassets/JoinServer.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.vectorassets +package chat.peptide.composables.vectorassets import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable diff --git a/app/src/main/java/chat/revolt/composables/vectorassets/NewServer.kt b/app/src/main/java/chat/peptide/composables/vectorassets/NewServer.kt similarity index 99% rename from app/src/main/java/chat/revolt/composables/vectorassets/NewServer.kt rename to app/src/main/java/chat/peptide/composables/vectorassets/NewServer.kt index e9e2c520..56014ee0 100644 --- a/app/src/main/java/chat/revolt/composables/vectorassets/NewServer.kt +++ b/app/src/main/java/chat/peptide/composables/vectorassets/NewServer.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.vectorassets +package chat.peptide.composables.vectorassets import androidx.compose.foundation.Image import androidx.compose.material3.MaterialTheme diff --git a/app/src/main/java/chat/revolt/composables/vectorassets/RevoltTagIntro.kt b/app/src/main/java/chat/peptide/composables/vectorassets/PeptideTagIntro.kt similarity index 99% rename from app/src/main/java/chat/revolt/composables/vectorassets/RevoltTagIntro.kt rename to app/src/main/java/chat/peptide/composables/vectorassets/PeptideTagIntro.kt index c040e5fc..2694ae4a 100644 --- a/app/src/main/java/chat/revolt/composables/vectorassets/RevoltTagIntro.kt +++ b/app/src/main/java/chat/peptide/composables/vectorassets/PeptideTagIntro.kt @@ -1,4 +1,4 @@ -package chat.revolt.components.vectorassets +package chat.peptide.components.vectorassets import androidx.compose.foundation.Image import androidx.compose.material3.MaterialTheme @@ -13,14 +13,14 @@ import androidx.compose.ui.unit.dp const val HL_USERNAME = 0xFF4799F0 const val HL_TAG = 0xFF3ABF7E -val RevoltTagIntro: ImageVector +val PeptideTagIntro: ImageVector @Composable get() { - if (_RevoltTagIntro != null) { - return _RevoltTagIntro!! + if (_PeptideTagIntro != null) { + return _PeptideTagIntro!! } - _RevoltTagIntro = ImageVector.Builder( - name = "RevoltTagIntro", + _PeptideTagIntro = ImageVector.Builder( + name = "PeptideTagIntro", defaultWidth = 700.dp, defaultHeight = 412.dp, viewportWidth = 700f, @@ -833,17 +833,17 @@ val RevoltTagIntro: ImageVector } }.build() - return _RevoltTagIntro!! + return _PeptideTagIntro!! } @Suppress("ObjectPropertyName") -private var _RevoltTagIntro: ImageVector? = null +private var _PeptideTagIntro: ImageVector? = null @Preview(showBackground = true) @Composable -fun RevoltTagIntroPreview() { +fun PeptideTagIntroPreview() { Image( - imageVector = RevoltTagIntro, + imageVector = PeptideTagIntro, contentDescription = null ) } diff --git a/app/src/main/java/chat/revolt/composables/vectorassets/SwipeToReplySpark.kt b/app/src/main/java/chat/peptide/composables/vectorassets/SwipeToReplySpark.kt similarity index 99% rename from app/src/main/java/chat/revolt/composables/vectorassets/SwipeToReplySpark.kt rename to app/src/main/java/chat/peptide/composables/vectorassets/SwipeToReplySpark.kt index 1dfdc51c..988b16d9 100644 --- a/app/src/main/java/chat/revolt/composables/vectorassets/SwipeToReplySpark.kt +++ b/app/src/main/java/chat/peptide/composables/vectorassets/SwipeToReplySpark.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.vectorassets +package chat.peptide.composables.vectorassets import androidx.compose.foundation.Image import androidx.compose.material3.MaterialTheme diff --git a/app/src/main/java/chat/revolt/composables/voice/VoicePermissionSwitch.kt b/app/src/main/java/chat/peptide/composables/voice/VoicePermissionSwitch.kt similarity index 97% rename from app/src/main/java/chat/revolt/composables/voice/VoicePermissionSwitch.kt rename to app/src/main/java/chat/peptide/composables/voice/VoicePermissionSwitch.kt index 7410e153..18618f63 100644 --- a/app/src/main/java/chat/revolt/composables/voice/VoicePermissionSwitch.kt +++ b/app/src/main/java/chat/peptide/composables/voice/VoicePermissionSwitch.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.voice +package chat.peptide.composables.voice import android.Manifest import android.content.Intent @@ -29,7 +29,8 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.core.net.toUri -import chat.revolt.R +import chat.peptide.R +import chat.peptide.composables.generic.SquareButton import com.google.accompanist.permissions.ExperimentalPermissionsApi import com.google.accompanist.permissions.PermissionStatus import com.google.accompanist.permissions.rememberMultiplePermissionsState @@ -116,7 +117,7 @@ fun VoicePermissionSwitch(onCancel: () -> Unit, onPermissionGranted: @Composable color = MaterialTheme.colorScheme.tertiary, modifier = Modifier.fillMaxWidth() ) - Button( + SquareButton( onClick = { if (fullyRevoked) { // Launch settings to allow the user to manually enable permissions diff --git a/app/src/main/java/chat/revolt/composables/voice/VoiceSheet.kt b/app/src/main/java/chat/peptide/composables/voice/VoiceSheet.kt similarity index 94% rename from app/src/main/java/chat/revolt/composables/voice/VoiceSheet.kt rename to app/src/main/java/chat/peptide/composables/voice/VoiceSheet.kt index 7deb95fd..d7abb126 100644 --- a/app/src/main/java/chat/revolt/composables/voice/VoiceSheet.kt +++ b/app/src/main/java/chat/peptide/composables/voice/VoiceSheet.kt @@ -1,4 +1,4 @@ -package chat.revolt.composables.voice +package chat.peptide.composables.voice import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect @@ -8,9 +8,9 @@ import androidx.compose.runtime.setValue import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel import androidx.lifecycle.viewmodel.compose.viewModel -import chat.revolt.R -import chat.revolt.api.routes.misc.getRootRoute -import chat.revolt.api.routes.voice.joinCall +import chat.peptide.R +import chat.peptide.api.routes.misc.getRootRoute +import chat.peptide.api.routes.voice.joinCall import logcat.LogPriority import logcat.asLog import logcat.logcat @@ -102,12 +102,12 @@ fun VoiceSheet( Text("status = ${room.state.name}") } item(key = "controls") { - Button(onClick = { + SquareButton(onClick = { room.setMicrophoneMute(true) }) { Text("mute 🎤🫷😤") } - Button(onClick = { + SquareButton(onClick = { room.setMicrophoneMute(false) }) { Text("unmute 🗣️📢🔥") @@ -117,7 +117,7 @@ fun VoiceSheet( Row( horizontalArrangement = Arrangement.spacedBy(16.dp) ) { - Button( + SquareButton( colors = ButtonDefaults.buttonColors().copy( containerColor = MaterialTheme.colorScheme.errorContainer, contentColor = MaterialTheme.colorScheme.onErrorContainer, diff --git a/app/src/main/java/chat/revolt/di/GoogleSheetsModule.kt b/app/src/main/java/chat/peptide/di/GoogleSheetsModule.kt similarity index 86% rename from app/src/main/java/chat/revolt/di/GoogleSheetsModule.kt rename to app/src/main/java/chat/peptide/di/GoogleSheetsModule.kt index 2825e080..e2613c41 100644 --- a/app/src/main/java/chat/revolt/di/GoogleSheetsModule.kt +++ b/app/src/main/java/chat/peptide/di/GoogleSheetsModule.kt @@ -1,6 +1,6 @@ -package chat.revolt.di +package chat.peptide.di -import chat.revolt.api.routes.googlesheets.ServerDataRepository +import chat.peptide.api.routes.googlesheets.ServerDataRepository import dagger.Module import dagger.Provides import dagger.hilt.InstallIn diff --git a/app/src/main/java/chat/revolt/dialogs/NotificationRationaleDialog.kt b/app/src/main/java/chat/peptide/dialogs/NotificationRationaleDialog.kt similarity index 87% rename from app/src/main/java/chat/revolt/dialogs/NotificationRationaleDialog.kt rename to app/src/main/java/chat/peptide/dialogs/NotificationRationaleDialog.kt index 4e1ac34e..14e57127 100644 --- a/app/src/main/java/chat/revolt/dialogs/NotificationRationaleDialog.kt +++ b/app/src/main/java/chat/peptide/dialogs/NotificationRationaleDialog.kt @@ -1,4 +1,4 @@ -package chat.revolt.dialogs +package chat.peptide.dialogs import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Arrangement @@ -6,10 +6,8 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.widthIn import androidx.compose.material3.AlertDialog -import androidx.compose.material3.Button import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text -import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -19,8 +17,10 @@ import androidx.compose.ui.text.SpanStyle import androidx.compose.ui.text.buildAnnotatedString import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp -import chat.revolt.BuildConfig -import chat.revolt.R +import chat.peptide.BuildConfig +import chat.peptide.R +import chat.peptide.composables.generic.PepTextButton +import chat.peptide.composables.generic.SquareButton @Composable fun NotificationRationaleDialog( @@ -62,15 +62,17 @@ fun NotificationRationaleDialog( } }, dismissButton = { - TextButton(onClick = { - onSelected(false) - onDismiss() - }) { + PepTextButton( + onClick = { + onSelected(false) + onDismiss() + } + ) { Text(stringResource(id = R.string.spark_notifications_rationale_dismiss)) } }, confirmButton = { - Button(onClick = { + SquareButton(onClick = { onSelected(true) onDismiss() }) { diff --git a/app/src/main/java/chat/revolt/fragments/ChangelogBottomSheetFragment.kt b/app/src/main/java/chat/peptide/fragments/ChangelogBottomSheetFragment.kt similarity index 94% rename from app/src/main/java/chat/revolt/fragments/ChangelogBottomSheetFragment.kt rename to app/src/main/java/chat/peptide/fragments/ChangelogBottomSheetFragment.kt index e3231ad5..66bddc88 100644 --- a/app/src/main/java/chat/revolt/fragments/ChangelogBottomSheetFragment.kt +++ b/app/src/main/java/chat/peptide/fragments/ChangelogBottomSheetFragment.kt @@ -1,4 +1,4 @@ -package chat.revolt.fragments +package chat.peptide.fragments import android.annotation.SuppressLint import android.content.DialogInterface @@ -19,10 +19,10 @@ import androidx.browser.customtabs.CustomTabColorSchemeParams import androidx.browser.customtabs.CustomTabsIntent import androidx.core.content.res.ResourcesCompat import androidx.webkit.WebViewAssetLoader -import chat.revolt.R -import chat.revolt.activities.InviteActivity -import chat.revolt.api.RevoltAPI -import chat.revolt.databinding.SheetChangelogBinding +import chat.peptide.R +import chat.peptide.activities.InviteActivity +import chat.peptide.api.PeptideAPI +import chat.peptide.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(RevoltAPI.getCurrentAppUrl()).host!!) + .setDomain(Uri.parse(PeptideAPI.getCurrentAppUrl()).host!!) .addPathHandler( "/_android_assets/", WebViewAssetLoader.AssetsPathHandler(context) @@ -89,7 +89,7 @@ class ChangelogBottomSheetFragment( // Capture clicks on invite links if (webResourceRequest.url.host == "rvlt.gg" || ( - webResourceRequest.url.host?.endsWith("revolt.chat") == true && webResourceRequest.url.path?.startsWith( + webResourceRequest.url.host?.endsWith("peptide.chat") == true && webResourceRequest.url.path?.startsWith( "/invite" ) == true ) @@ -127,7 +127,7 @@ class ChangelogBottomSheetFragment( } loadUrl( - "${RevoltAPI.getCurrentAppUrl()}/_android_assets/changelogs/renderer.html" + "${PeptideAPI.getCurrentAppUrl()}/_android_assets/changelogs/renderer.html" ) settings.apply { diff --git a/app/src/main/java/chat/revolt/internals/Autocomplete.kt b/app/src/main/java/chat/peptide/internals/Autocomplete.kt similarity index 79% rename from app/src/main/java/chat/revolt/internals/Autocomplete.kt rename to app/src/main/java/chat/peptide/internals/Autocomplete.kt index 9fa2fa3d..5f72796d 100644 --- a/app/src/main/java/chat/revolt/internals/Autocomplete.kt +++ b/app/src/main/java/chat/peptide/internals/Autocomplete.kt @@ -1,12 +1,12 @@ -package chat.revolt.internals +package chat.peptide.internals -import chat.revolt.api.RevoltAPI -import chat.revolt.api.internals.PermissionBit -import chat.revolt.api.internals.Roles -import chat.revolt.api.internals.has -import chat.revolt.api.schemas.ChannelType -import chat.revolt.api.settings.FeatureFlags -import chat.revolt.composables.chat.AutocompleteSuggestion +import chat.peptide.api.PeptideAPI +import chat.peptide.api.internals.PermissionBit +import chat.peptide.api.internals.Roles +import chat.peptide.api.internals.has +import chat.peptide.api.schemas.ChannelType +import chat.peptide.api.settings.FeatureFlags +import chat.peptide.composables.chat.AutocompleteSuggestion object Autocomplete { private val emojiImpl = EmojiImpl() @@ -23,7 +23,7 @@ object Autocomplete { }.distinctBy { it.shortcode } val customResults = - RevoltAPI.emojiCache.values.filter { + PeptideAPI.emojiCache.values.filter { it.name?.contains(query, ignoreCase = true) ?: false }.mapNotNull { if (it.name != null) { @@ -46,25 +46,25 @@ object Autocomplete { serverId: String? = null, query: String ): List { - val channel = RevoltAPI.channelCache[channelId] ?: return emptyList() + val channel = PeptideAPI.channelCache[channelId] ?: return emptyList() - val member = serverId?.let { RevoltAPI.members.getMember(serverId, RevoltAPI.selfId ?: "") } + val member = serverId?.let { PeptideAPI.members.getMember(serverId, PeptideAPI.selfId ?: "") } val massMentionSuggestions = listOf("everyone", "online") .filter { it.startsWith(query, ignoreCase = true) } - val selfPermissions = RevoltAPI.channelCache[channelId]?.let { ch -> + val selfPermissions = PeptideAPI.channelCache[channelId]?.let { ch -> Roles.permissionFor( ch, - RevoltAPI.userCache[RevoltAPI.selfId], + PeptideAPI.userCache[PeptideAPI.selfId], member ) } return when (channel.channelType) { ChannelType.DirectMessage -> { - val otherUser = channel.recipients?.find { it != RevoltAPI.selfId } + val otherUser = channel.recipients?.find { it != PeptideAPI.selfId } if (otherUser != null) { - val user = RevoltAPI.userCache[otherUser] + val user = PeptideAPI.userCache[otherUser] if (user != null && user.username?.contains(query, ignoreCase = true) == true) { listOf( AutocompleteSuggestion.User( @@ -83,7 +83,7 @@ object Autocomplete { ChannelType.Group -> { val users = - channel.recipients?.mapNotNull { RevoltAPI.userCache[it] } ?: emptyList() + channel.recipients?.mapNotNull { PeptideAPI.userCache[it] } ?: emptyList() users .filter { it.username?.contains(query, ignoreCase = true) ?: false } .map { @@ -96,7 +96,7 @@ object Autocomplete { } ChannelType.SavedMessages -> { - val user = RevoltAPI.userCache[RevoltAPI.selfId] + val user = PeptideAPI.userCache[PeptideAPI.selfId] return if (user != null && user.username?.contains( query, ignoreCase = true @@ -119,22 +119,22 @@ object Autocomplete { if (query.length < 2) return emptyList() val roles = - if (selfPermissions has PermissionBit.MentionRoles && FeatureFlags.massMentionsGranted) RevoltAPI.serverCache[serverId]?.roles + if (selfPermissions has PermissionBit.MentionRoles && FeatureFlags.massMentionsGranted) PeptideAPI.serverCache[serverId]?.roles ?: emptyMap() else emptyMap() - val byNickname = RevoltAPI.members.filterNamesFor(serverId, query) - .map { m -> m to RevoltAPI.userCache[m.id?.user] }.filter { (_, u) -> + val byNickname = PeptideAPI.members.filterNamesFor(serverId, query) + .map { m -> m to PeptideAPI.userCache[m.id?.user] }.filter { (_, u) -> u != null }.map { (m, u) -> m to u!! } - val byUsername = RevoltAPI.userCache.values.filter { + val byUsername = PeptideAPI.userCache.values.filter { it.username?.contains( query, ignoreCase = true ) == true }.mapNotNull { it.id?.let { _ -> - RevoltAPI.members.getMember( + PeptideAPI.members.getMember( serverId, it.id ) to it @@ -183,8 +183,8 @@ object Autocomplete { serverId: String, query: String ): List { - val server = RevoltAPI.serverCache[serverId] ?: return emptyList() - val channels = server.channels?.mapNotNull { RevoltAPI.channelCache[it] } ?: emptyList() + val server = PeptideAPI.serverCache[serverId] ?: return emptyList() + val channels = server.channels?.mapNotNull { PeptideAPI.channelCache[it] } ?: emptyList() return channels.filter { it.name?.contains(query, ignoreCase = true) == true }.map { AutocompleteSuggestion.Channel( diff --git a/app/src/main/java/chat/revolt/internals/Changelogs.kt b/app/src/main/java/chat/peptide/internals/Changelogs.kt similarity index 83% rename from app/src/main/java/chat/revolt/internals/Changelogs.kt rename to app/src/main/java/chat/peptide/internals/Changelogs.kt index c168a036..b7f36740 100644 --- a/app/src/main/java/chat/revolt/internals/Changelogs.kt +++ b/app/src/main/java/chat/peptide/internals/Changelogs.kt @@ -1,11 +1,11 @@ -package chat.revolt.internals +package chat.peptide.internals import android.content.Context -import chat.revolt.api.RevoltAPI -import chat.revolt.api.RevoltHttp -import chat.revolt.api.RevoltJson -import chat.revolt.internals.IndexHolder.cachedIndex -import chat.revolt.persistence.KVStorage +import chat.peptide.api.PeptideAPI +import chat.peptide.api.PeptideHttp +import chat.peptide.api.PeptideJson +import chat.peptide.internals.IndexHolder.cachedIndex +import chat.peptide.persistence.KVStorage import io.ktor.client.request.get import io.ktor.client.statement.bodyAsText import kotlinx.serialization.Serializable @@ -55,9 +55,9 @@ class Changelogs(val context: Context, val kvStorage: KVStorage? = null) { } try { - val response = RevoltHttp.get("${RevoltAPI.getCurrentKjBookUrl()}/changelogs.json") + val response = PeptideHttp.get("${PeptideAPI.getCurrentKjBookUrl()}/changelogs.json") cachedIndex = - RevoltJson.decodeFromString(ChangelogIndex.serializer(), response.bodyAsText()) + PeptideJson.decodeFromString(ChangelogIndex.serializer(), response.bodyAsText()) return cachedIndex as ChangelogIndex } catch (e: Error) { return ChangelogIndex() @@ -66,8 +66,8 @@ class Changelogs(val context: Context, val kvStorage: KVStorage? = null) { suspend fun fetchChangelogByVersionCode(versionCode: Long): Changelog { try { - val response = RevoltHttp.get("${RevoltAPI.getCurrentKjBookUrl()}/changelogs/$versionCode.json") - return RevoltJson.decodeFromString(Changelog.serializer(), response.bodyAsText()) + val response = PeptideHttp.get("${PeptideAPI.getCurrentKjBookUrl()}/changelogs/$versionCode.json") + return PeptideJson.decodeFromString(Changelog.serializer(), response.bodyAsText()) } catch (e: Error) { return Changelog( id = "", diff --git a/app/src/main/java/chat/revolt/internals/EmojiImpl.kt b/app/src/main/java/chat/peptide/internals/EmojiImpl.kt similarity index 92% rename from app/src/main/java/chat/revolt/internals/EmojiImpl.kt rename to app/src/main/java/chat/peptide/internals/EmojiImpl.kt index 15801c4c..9da69b67 100644 --- a/app/src/main/java/chat/revolt/internals/EmojiImpl.kt +++ b/app/src/main/java/chat/peptide/internals/EmojiImpl.kt @@ -1,11 +1,11 @@ -package chat.revolt.internals +package chat.peptide.internals import android.content.Context -import chat.revolt.R -import chat.revolt.RevoltApplication -import chat.revolt.api.RevoltAPI -import chat.revolt.api.RevoltJson -import chat.revolt.api.schemas.Server +import chat.peptide.R +import chat.peptide.PeptideApplication +import chat.peptide.api.PeptideAPI +import chat.peptide.api.PeptideJson +import chat.peptide.api.schemas.Server import kotlinx.serialization.Serializable import kotlinx.serialization.builtins.ListSerializer @@ -58,7 +58,7 @@ sealed class EmojiPickerItem { val alternates: List> ) : EmojiPickerItem() - data class ServerEmote(val emote: chat.revolt.api.schemas.Emoji) : EmojiPickerItem() + data class ServerEmote(val emote: chat.peptide.api.schemas.Emoji) : EmojiPickerItem() } class EmojiImpl { @@ -68,11 +68,11 @@ class EmojiImpl { val json = context.assets.open("metadata/emoji.json").use { it.reader().readText() } - return RevoltJson.decodeFromString(ListSerializer(EmojiGroup.serializer()), json) + return PeptideJson.decodeFromString(ListSerializer(EmojiGroup.serializer()), json) } fun serversWithEmotes(): List { - return RevoltAPI + return PeptideAPI .emojiCache .values .asSequence() @@ -81,13 +81,13 @@ class EmojiImpl { .filter { it.type == "Server" } .map { it.id } .distinct() - .mapNotNull { RevoltAPI.serverCache[it] } + .mapNotNull { PeptideAPI.serverCache[it] } .toList() } fun serverEmoteList(server: Server): List { val list = mutableListOf() - val emotes = RevoltAPI.emojiCache.values.filter { it.parent?.id == server.id } + val emotes = PeptideAPI.emojiCache.values.filter { it.parent?.id == server.id } list.add(EmojiPickerItem.Section(Category.ServerEmoteCategory(server))) list.addAll(emotes.map { EmojiPickerItem.ServerEmote(it) }) @@ -149,7 +149,7 @@ class EmojiImpl { it is EmojiPickerItem.Section && it.category is Category.ServerEmoteCategory && it.category.server == server } val allEmotesInThatServer = - RevoltAPI.emojiCache.values.filter { it.parent?.id == server.id } + PeptideAPI.emojiCache.values.filter { it.parent?.id == server.id } val lastIndex = index + allEmotesInThatServer.size output[Category.ServerEmoteCategory(server)] = Pair(index, lastIndex) @@ -206,7 +206,7 @@ class EmojiImpl { val list = mutableListOf() for (server in serversWithEmotes()) { - val emotes = RevoltAPI.emojiCache.values.filter { it.parent?.id == server.id } + val emotes = PeptideAPI.emojiCache.values.filter { it.parent?.id == server.id } val matchingEmotes = emotes.filter { it.name?.contains(query, ignoreCase = true) ?: false } if (matchingEmotes.isNotEmpty()) { @@ -290,6 +290,6 @@ class EmojiImpl { } init { - metadata = initMetadata(RevoltApplication.instance.applicationContext) + metadata = initMetadata(PeptideApplication.instance.applicationContext) } } diff --git a/app/src/main/java/chat/revolt/internals/Platform.kt b/app/src/main/java/chat/peptide/internals/Platform.kt similarity index 84% rename from app/src/main/java/chat/revolt/internals/Platform.kt rename to app/src/main/java/chat/peptide/internals/Platform.kt index 1296e91a..b62a493e 100644 --- a/app/src/main/java/chat/revolt/internals/Platform.kt +++ b/app/src/main/java/chat/peptide/internals/Platform.kt @@ -1,4 +1,4 @@ -package chat.revolt.internals +package chat.peptide.internals import android.os.Build diff --git a/app/src/main/java/chat/revolt/internals/TailwindColourScheme.kt b/app/src/main/java/chat/peptide/internals/TailwindColourScheme.kt similarity index 99% rename from app/src/main/java/chat/revolt/internals/TailwindColourScheme.kt rename to app/src/main/java/chat/peptide/internals/TailwindColourScheme.kt index 741e23ef..c4d2b4e7 100644 --- a/app/src/main/java/chat/revolt/internals/TailwindColourScheme.kt +++ b/app/src/main/java/chat/peptide/internals/TailwindColourScheme.kt @@ -1,4 +1,4 @@ -package chat.revolt.internals +package chat.peptide.internals import androidx.compose.ui.graphics.Color diff --git a/app/src/main/java/chat/revolt/internals/Timestamp.kt b/app/src/main/java/chat/peptide/internals/Timestamp.kt similarity index 98% rename from app/src/main/java/chat/revolt/internals/Timestamp.kt rename to app/src/main/java/chat/peptide/internals/Timestamp.kt index 38128f3b..c90c5216 100644 --- a/app/src/main/java/chat/revolt/internals/Timestamp.kt +++ b/app/src/main/java/chat/peptide/internals/Timestamp.kt @@ -1,4 +1,4 @@ -package chat.revolt.internals +package chat.peptide.internals import android.text.format.DateUtils import android.util.Log diff --git a/app/src/main/java/chat/revolt/internals/extensions/Defaults.kt b/app/src/main/java/chat/peptide/internals/extensions/Defaults.kt similarity index 87% rename from app/src/main/java/chat/revolt/internals/extensions/Defaults.kt rename to app/src/main/java/chat/peptide/internals/extensions/Defaults.kt index 0df18d8b..56340619 100644 --- a/app/src/main/java/chat/revolt/internals/extensions/Defaults.kt +++ b/app/src/main/java/chat/peptide/internals/extensions/Defaults.kt @@ -1,4 +1,4 @@ -package chat.revolt.internals.extensions +package chat.peptide.internals.extensions import androidx.compose.material3.ListItemColors import androidx.compose.material3.ListItemDefaults diff --git a/app/src/main/java/chat/revolt/internals/extensions/Input.kt b/app/src/main/java/chat/peptide/internals/extensions/Input.kt similarity index 96% rename from app/src/main/java/chat/revolt/internals/extensions/Input.kt rename to app/src/main/java/chat/peptide/internals/extensions/Input.kt index f63c1ea9..f5f03ec8 100644 --- a/app/src/main/java/chat/revolt/internals/extensions/Input.kt +++ b/app/src/main/java/chat/peptide/internals/extensions/Input.kt @@ -1,4 +1,4 @@ -package chat.revolt.internals.extensions +package chat.peptide.internals.extensions import androidx.compose.foundation.gestures.awaitEachGesture import androidx.compose.foundation.gestures.awaitFirstDown diff --git a/app/src/main/java/chat/revolt/internals/extensions/Insets.kt b/app/src/main/java/chat/peptide/internals/extensions/Insets.kt similarity index 92% rename from app/src/main/java/chat/revolt/internals/extensions/Insets.kt rename to app/src/main/java/chat/peptide/internals/extensions/Insets.kt index dc950659..420c6bf8 100644 --- a/app/src/main/java/chat/revolt/internals/extensions/Insets.kt +++ b/app/src/main/java/chat/peptide/internals/extensions/Insets.kt @@ -1,4 +1,4 @@ -package chat.revolt.internals.extensions +package chat.peptide.internals.extensions import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.exclude diff --git a/app/src/main/java/chat/revolt/internals/extensions/Locales.kt b/app/src/main/java/chat/peptide/internals/extensions/Locales.kt similarity index 94% rename from app/src/main/java/chat/revolt/internals/extensions/Locales.kt rename to app/src/main/java/chat/peptide/internals/extensions/Locales.kt index a972e44f..1d42d64c 100644 --- a/app/src/main/java/chat/revolt/internals/extensions/Locales.kt +++ b/app/src/main/java/chat/peptide/internals/extensions/Locales.kt @@ -1,4 +1,4 @@ -package chat.revolt.internals.extensions +package chat.peptide.internals.extensions import android.annotation.SuppressLint import android.content.Context diff --git a/app/src/main/java/chat/revolt/internals/extensions/Permissions.kt b/app/src/main/java/chat/peptide/internals/extensions/Permissions.kt similarity index 54% rename from app/src/main/java/chat/revolt/internals/extensions/Permissions.kt rename to app/src/main/java/chat/peptide/internals/extensions/Permissions.kt index 5f39b1af..20be373c 100644 --- a/app/src/main/java/chat/revolt/internals/extensions/Permissions.kt +++ b/app/src/main/java/chat/peptide/internals/extensions/Permissions.kt @@ -1,28 +1,28 @@ -package chat.revolt.internals.extensions +package chat.peptide.internals.extensions import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.MutableLongState import androidx.compose.runtime.mutableLongStateOf import androidx.compose.runtime.saveable.rememberSaveable -import chat.revolt.api.RevoltAPI -import chat.revolt.api.internals.Roles +import chat.peptide.api.PeptideAPI +import chat.peptide.api.internals.Roles @Composable fun rememberChannelPermissions(channelId: String, key1: Any = Unit): MutableLongState { val permissions = rememberSaveable { mutableLongStateOf(0L) } LaunchedEffect(channelId, key1) { - if (RevoltAPI.selfId == null) return@LaunchedEffect - if (RevoltAPI.userCache[RevoltAPI.selfId] == null) return@LaunchedEffect - if (RevoltAPI.channelCache[channelId] == null) return@LaunchedEffect + if (PeptideAPI.selfId == null) return@LaunchedEffect + if (PeptideAPI.userCache[PeptideAPI.selfId] == null) return@LaunchedEffect + if (PeptideAPI.channelCache[channelId] == null) return@LaunchedEffect - val channel = RevoltAPI.channelCache[channelId] - val selfUser = RevoltAPI.userCache[RevoltAPI.selfId] + val channel = PeptideAPI.channelCache[channelId] + val selfUser = PeptideAPI.userCache[PeptideAPI.selfId] val member = channel?.let { it.server?.let { server -> - RevoltAPI.selfId?.let { selfId -> - RevoltAPI.members.getMember(server, selfId) + PeptideAPI.selfId?.let { selfId -> + PeptideAPI.members.getMember(server, selfId) } } } diff --git a/app/src/main/java/chat/revolt/internals/text/Gigamoji.kt b/app/src/main/java/chat/peptide/internals/text/Gigamoji.kt similarity index 96% rename from app/src/main/java/chat/revolt/internals/text/Gigamoji.kt rename to app/src/main/java/chat/peptide/internals/text/Gigamoji.kt index ceb2c0ad..b055c1d1 100644 --- a/app/src/main/java/chat/revolt/internals/text/Gigamoji.kt +++ b/app/src/main/java/chat/peptide/internals/text/Gigamoji.kt @@ -1,4 +1,4 @@ -package chat.revolt.internals.text +package chat.peptide.internals.text private val STRING_IS_CUSTOM_EMOTES_REGEX = Regex("(?::[0-9A-HJKMNP-TV-Z]{26}:|\\s)+") diff --git a/app/src/main/java/chat/revolt/internals/text/MessageProcessor.kt b/app/src/main/java/chat/peptide/internals/text/MessageProcessor.kt similarity index 88% rename from app/src/main/java/chat/revolt/internals/text/MessageProcessor.kt rename to app/src/main/java/chat/peptide/internals/text/MessageProcessor.kt index 37fc89eb..f1270413 100644 --- a/app/src/main/java/chat/revolt/internals/text/MessageProcessor.kt +++ b/app/src/main/java/chat/peptide/internals/text/MessageProcessor.kt @@ -1,8 +1,8 @@ -package chat.revolt.internals.text +package chat.peptide.internals.text -import chat.revolt.api.RevoltAPI -import chat.revolt.api.schemas.ChannelType -import chat.revolt.internals.EmojiImpl +import chat.peptide.api.PeptideAPI +import chat.peptide.api.schemas.ChannelType +import chat.peptide.internals.EmojiImpl object MessageProcessor { private val MentionRegex = Regex("@((?:\\p{L}|[\\d_.-])+)#([0-9]{4})", RegexOption.IGNORE_CASE) @@ -25,7 +25,7 @@ object MessageProcessor { ?: return@fold acc val user = - RevoltAPI.userCache.values.find { it.username == username && it.discriminator == discriminator } + PeptideAPI.userCache.values.find { it.username == username && it.discriminator == discriminator } val userId = user?.id ?: return@fold acc acc.replace(mention, "<@$userId>") @@ -38,7 +38,7 @@ object MessageProcessor { ?: return@fold acc val fetchedChannel = - RevoltAPI.channelCache.values.find { + PeptideAPI.channelCache.values.find { it.name == channelName && it.server == serverId && it.channelType == ChannelType.TextChannel } ?: return@fold acc diff --git a/app/src/main/java/chat/revolt/markdown/jbm/FallbackRenderer.kt b/app/src/main/java/chat/peptide/markdown/jbm/FallbackRenderer.kt similarity index 89% rename from app/src/main/java/chat/revolt/markdown/jbm/FallbackRenderer.kt rename to app/src/main/java/chat/peptide/markdown/jbm/FallbackRenderer.kt index 0e58e3bd..b88c6c7e 100644 --- a/app/src/main/java/chat/revolt/markdown/jbm/FallbackRenderer.kt +++ b/app/src/main/java/chat/peptide/markdown/jbm/FallbackRenderer.kt @@ -16,12 +16,12 @@ import androidx.compose.ui.Modifier 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.RevoltAPI -import chat.revolt.api.internals.ResourceLocations -import chat.revolt.markdown.jbm.LocalJBMarkdownTreeState -import chat.revolt.markdown.jbm.MentionResolver -import chat.revolt.markdown.jbm.asHexString +import chat.peptide.activities.InviteActivity +import chat.peptide.api.PeptideAPI +import chat.peptide.api.internals.ResourceLocations +import chat.peptide.markdown.jbm.LocalJBMarkdownTreeState +import chat.peptide.markdown.jbm.MentionResolver +import chat.peptide.markdown.jbm.asHexString @SuppressLint("SetJavaScriptEnabled") @Composable @@ -34,7 +34,7 @@ fun FallbackRenderer(content: String, modifier: Modifier = Modifier) { factory = { context -> WebView(context).apply { val assetLoader = WebViewAssetLoader.Builder() - .setDomain(Uri.parse(RevoltAPI.getCurrentAppUrl()).host!!) + .setDomain(Uri.parse(PeptideAPI.getCurrentAppUrl()).host!!) .addPathHandler( "/_android_assets/", WebViewAssetLoader.AssetsPathHandler(context) @@ -61,7 +61,7 @@ fun FallbackRenderer(content: String, modifier: Modifier = Modifier) { // Capture clicks on invite links if (webResourceRequest.url.host == "rvlt.gg" || ( - webResourceRequest.url.host?.endsWith("revolt.chat") == true && webResourceRequest.url.path?.startsWith( + webResourceRequest.url.host?.endsWith("peptide.chat") == true && webResourceRequest.url.path?.startsWith( "/invite" ) == true ) @@ -126,7 +126,7 @@ fun FallbackRenderer(content: String, modifier: Modifier = Modifier) { @JavascriptInterface fun getCustomEmoteUrl(emoteId: String): String { - return "${RevoltAPI.getCurrentFilesUrl()}/emojis/$emoteId/original" + return "${PeptideAPI.getCurrentFilesUrl()}/emojis/$emoteId/original" } @JavascriptInterface @@ -136,7 +136,7 @@ fun FallbackRenderer(content: String, modifier: Modifier = Modifier) { @JavascriptInterface fun userAvatar(userId: String): String { - return ResourceLocations.userAvatarUrl(RevoltAPI.userCache[userId]) + return ResourceLocations.userAvatarUrl(PeptideAPI.userCache[userId]) } @JavascriptInterface @@ -149,7 +149,7 @@ fun FallbackRenderer(content: String, modifier: Modifier = Modifier) { setBackgroundColor(android.graphics.Color.TRANSPARENT) loadUrl( - "${RevoltAPI.getCurrentAppUrl()}/_android_assets/markdown/markdown.html" + "${PeptideAPI.getCurrentAppUrl()}/_android_assets/markdown/markdown.html" ) } } diff --git a/app/src/main/java/chat/revolt/markdown/jbm/JBMApi.kt b/app/src/main/java/chat/peptide/markdown/jbm/JBMApi.kt similarity index 92% rename from app/src/main/java/chat/revolt/markdown/jbm/JBMApi.kt rename to app/src/main/java/chat/peptide/markdown/jbm/JBMApi.kt index 4ce186b1..2c7ae10b 100644 --- a/app/src/main/java/chat/revolt/markdown/jbm/JBMApi.kt +++ b/app/src/main/java/chat/peptide/markdown/jbm/JBMApi.kt @@ -1,4 +1,4 @@ -package chat.revolt.markdown.jbm +package chat.peptide.markdown.jbm import org.intellij.markdown.ast.ASTNode import org.intellij.markdown.parser.MarkdownParser diff --git a/app/src/main/java/chat/revolt/markdown/jbm/JBMRenderer.kt b/app/src/main/java/chat/peptide/markdown/jbm/JBMRenderer.kt similarity index 97% rename from app/src/main/java/chat/revolt/markdown/jbm/JBMRenderer.kt rename to app/src/main/java/chat/peptide/markdown/jbm/JBMRenderer.kt index 3155a2c4..dceba08b 100644 --- a/app/src/main/java/chat/revolt/markdown/jbm/JBMRenderer.kt +++ b/app/src/main/java/chat/peptide/markdown/jbm/JBMRenderer.kt @@ -1,4 +1,4 @@ -package chat.revolt.markdown.jbm +package chat.peptide.markdown.jbm import FallbackRenderer import android.content.Intent @@ -71,23 +71,23 @@ import androidx.compose.ui.text.withStyle import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.core.net.toUri -import chat.revolt.R -import chat.revolt.activities.InviteActivity -import chat.revolt.api.RevoltAPI -import chat.revolt.api.internals.BrushCompat -import chat.revolt.api.internals.InstancedBrushCompat -import chat.revolt.api.internals.isUlid -import chat.revolt.api.routes.custom.fetchEmoji -import chat.revolt.api.schemas.isInviteUri -import chat.revolt.api.settings.LoadedSettings -import chat.revolt.callbacks.Action -import chat.revolt.callbacks.ActionChannel -import chat.revolt.composables.generic.RemoteImage -import chat.revolt.composables.generic.UserAvatar -import chat.revolt.composables.markdown.Annotations -import chat.revolt.composables.utils.detectTapGesturesConditionalConsume -import chat.revolt.ui.theme.FragmentMono -import chat.revolt.ui.theme.isThemeDark +import chat.peptide.R +import chat.peptide.activities.InviteActivity +import chat.peptide.api.PeptideAPI +import chat.peptide.api.internals.BrushCompat +import chat.peptide.api.internals.InstancedBrushCompat +import chat.peptide.api.internals.isUlid +import chat.peptide.api.routes.custom.fetchEmoji +import chat.peptide.api.schemas.isInviteUri +import chat.peptide.api.settings.LoadedSettings +import chat.peptide.callbacks.Action +import chat.peptide.callbacks.ActionChannel +import chat.peptide.composables.generic.RemoteImage +import chat.peptide.composables.generic.UserAvatar +import chat.peptide.composables.markdown.Annotations +import chat.peptide.composables.utils.detectTapGesturesConditionalConsume +import chat.peptide.ui.theme.FragmentMono +import chat.peptide.ui.theme.isThemeDark import dev.snipme.highlights.Highlights import dev.snipme.highlights.model.BoldHighlight import dev.snipme.highlights.model.CodeHighlight @@ -267,7 +267,7 @@ private fun annotateText( append(annotateText(state, child)) } } else { - val server = RevoltAPI.serverCache[state.currentServer] + val server = PeptideAPI.serverCache[state.currentServer] val role = server?.roles?.get(roleId) val isGradient = role?.colour?.contains("gradient") == true @@ -722,7 +722,7 @@ private fun JBMText(node: ASTNode, modifier: Modifier) { placeholderVerticalAlign = PlaceholderVerticalAlign.Center ), ) { id -> - val role = RevoltAPI.serverCache[mdState.currentServer]?.roles?.get(id) + val role = PeptideAPI.serverCache[mdState.currentServer]?.roles?.get(id) Box( contentAlignment = Alignment.Center, modifier = Modifier @@ -748,11 +748,11 @@ private fun JBMText(node: ASTNode, modifier: Modifier) { placeholderVerticalAlign = PlaceholderVerticalAlign.Center ), ) { id -> - val emote = RevoltAPI.emojiCache[id] + val emote = PeptideAPI.emojiCache[id] if (emote == null) { scope.launch { try { - RevoltAPI.emojiCache[id] = fetchEmoji(id) + PeptideAPI.emojiCache[id] = fetchEmoji(id) } catch (e: Exception) { // no-op } @@ -761,7 +761,7 @@ private fun JBMText(node: ASTNode, modifier: Modifier) { } else { with(LocalDensity.current) { RemoteImage( - url = "${RevoltAPI.getCurrentFilesUrl()}/emojis/${id}", + url = "${PeptideAPI.getCurrentFilesUrl()}/emojis/${id}", description = emote.name, contentScale = ContentScale.Fit, modifier = Modifier @@ -786,7 +786,7 @@ private fun JBMText(node: ASTNode, modifier: Modifier) { placeholderVerticalAlign = PlaceholderVerticalAlign.Center ), ) { id -> - val user = RevoltAPI.userCache[id] + val user = PeptideAPI.userCache[id] Box( contentAlignment = Alignment.Center, modifier = Modifier diff --git a/app/src/main/java/chat/revolt/markdown/jbm/KatexRenderer.kt b/app/src/main/java/chat/peptide/markdown/jbm/KatexRenderer.kt similarity index 93% rename from app/src/main/java/chat/revolt/markdown/jbm/KatexRenderer.kt rename to app/src/main/java/chat/peptide/markdown/jbm/KatexRenderer.kt index fc934268..f303d13a 100644 --- a/app/src/main/java/chat/revolt/markdown/jbm/KatexRenderer.kt +++ b/app/src/main/java/chat/peptide/markdown/jbm/KatexRenderer.kt @@ -1,4 +1,4 @@ -package chat.revolt.markdown.jbm +package chat.peptide.markdown.jbm import android.annotation.SuppressLint import android.content.Intent @@ -19,8 +19,8 @@ import androidx.compose.ui.graphics.Color 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.RevoltAPI +import chat.peptide.activities.InviteActivity +import chat.peptide.api.PeptideAPI 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(RevoltAPI.getCurrentAppUrl()).host!!) + .setDomain(Uri.parse(PeptideAPI.getCurrentAppUrl()).host!!) .addPathHandler( "/_android_assets/", WebViewAssetLoader.AssetsPathHandler(context) @@ -73,7 +73,7 @@ fun KatexRenderer(content: String, modifier: Modifier = Modifier) { // Capture clicks on invite links if (webResourceRequest.url.host == "rvlt.gg" || ( - webResourceRequest.url.host?.endsWith("revolt.chat") == true && webResourceRequest.url.path?.startsWith( + webResourceRequest.url.host?.endsWith("peptide.chat") == true && webResourceRequest.url.path?.startsWith( "/invite" ) == true ) @@ -131,7 +131,7 @@ fun KatexRenderer(content: String, modifier: Modifier = Modifier) { setBackgroundColor(android.graphics.Color.TRANSPARENT) loadUrl( - "${RevoltAPI.getCurrentAppUrl()}/_android_assets/katex/katex.html" + "${PeptideAPI.getCurrentAppUrl()}/_android_assets/katex/katex.html" ) } } diff --git a/app/src/main/java/chat/revolt/markdown/jbm/MentionResolver.kt b/app/src/main/java/chat/peptide/markdown/jbm/MentionResolver.kt similarity index 76% rename from app/src/main/java/chat/revolt/markdown/jbm/MentionResolver.kt rename to app/src/main/java/chat/peptide/markdown/jbm/MentionResolver.kt index 1874863a..a5958bad 100644 --- a/app/src/main/java/chat/revolt/markdown/jbm/MentionResolver.kt +++ b/app/src/main/java/chat/peptide/markdown/jbm/MentionResolver.kt @@ -1,6 +1,6 @@ -package chat.revolt.markdown.jbm +package chat.peptide.markdown.jbm -import chat.revolt.api.RevoltAPI +import chat.peptide.api.PeptideAPI object MentionResolver { /** @@ -12,9 +12,9 @@ object MentionResolver { * @return The resolved user mention. */ fun resolveUser(userId: String, serverId: String? = null): String { - val maybeMember = serverId?.let { RevoltAPI.members.getMember(serverId, userId) } + val maybeMember = serverId?.let { PeptideAPI.members.getMember(serverId, userId) } return maybeMember?.nickname - ?: RevoltAPI.userCache[userId]?.username + ?: PeptideAPI.userCache[userId]?.username ?: "<@$userId>" } @@ -26,7 +26,7 @@ object MentionResolver { * @return The resolved channel mention. */ fun resolveChannel(channelId: String): String { - val channel = RevoltAPI.channelCache[channelId] + val channel = PeptideAPI.channelCache[channelId] return channel?.name?.let { name -> "#$name" } ?: "<#$channelId>" } } \ No newline at end of file diff --git a/app/src/main/java/chat/revolt/markdown/jbm/RSMElementTypes.kt b/app/src/main/java/chat/peptide/markdown/jbm/RSMElementTypes.kt similarity index 94% rename from app/src/main/java/chat/revolt/markdown/jbm/RSMElementTypes.kt rename to app/src/main/java/chat/peptide/markdown/jbm/RSMElementTypes.kt index 72c57355..ddd02ffe 100644 --- a/app/src/main/java/chat/revolt/markdown/jbm/RSMElementTypes.kt +++ b/app/src/main/java/chat/peptide/markdown/jbm/RSMElementTypes.kt @@ -1,4 +1,4 @@ -package chat.revolt.markdown.jbm +package chat.peptide.markdown.jbm import org.intellij.markdown.IElementType import org.intellij.markdown.MarkdownElementType diff --git a/app/src/main/java/chat/revolt/markdown/jbm/RSMFlavourDescriptor.kt b/app/src/main/java/chat/peptide/markdown/jbm/RSMFlavourDescriptor.kt similarity index 82% rename from app/src/main/java/chat/revolt/markdown/jbm/RSMFlavourDescriptor.kt rename to app/src/main/java/chat/peptide/markdown/jbm/RSMFlavourDescriptor.kt index b3f51b0b..3a77ea8a 100644 --- a/app/src/main/java/chat/revolt/markdown/jbm/RSMFlavourDescriptor.kt +++ b/app/src/main/java/chat/peptide/markdown/jbm/RSMFlavourDescriptor.kt @@ -1,10 +1,10 @@ -package chat.revolt.markdown.jbm +package chat.peptide.markdown.jbm -import chat.revolt.markdown.jbm.sequentialparsers.ChannelMentionParser -import chat.revolt.markdown.jbm.sequentialparsers.CustomEmoteParser -import chat.revolt.markdown.jbm.sequentialparsers.MassMentionParser -import chat.revolt.markdown.jbm.sequentialparsers.RoleMentionParser -import chat.revolt.markdown.jbm.sequentialparsers.UserMentionParser +import chat.peptide.markdown.jbm.sequentialparsers.ChannelMentionParser +import chat.peptide.markdown.jbm.sequentialparsers.CustomEmoteParser +import chat.peptide.markdown.jbm.sequentialparsers.MassMentionParser +import chat.peptide.markdown.jbm.sequentialparsers.RoleMentionParser +import chat.peptide.markdown.jbm.sequentialparsers.UserMentionParser import org.intellij.markdown.MarkdownTokenTypes import org.intellij.markdown.flavours.gfm.GFMFlavourDescriptor import org.intellij.markdown.flavours.gfm.GFMTokenTypes diff --git a/app/src/main/java/chat/revolt/markdown/jbm/sequentialparsers/ChannelMentionParser.kt b/app/src/main/java/chat/peptide/markdown/jbm/sequentialparsers/ChannelMentionParser.kt similarity index 93% rename from app/src/main/java/chat/revolt/markdown/jbm/sequentialparsers/ChannelMentionParser.kt rename to app/src/main/java/chat/peptide/markdown/jbm/sequentialparsers/ChannelMentionParser.kt index 29b7332b..c878f80d 100644 --- a/app/src/main/java/chat/revolt/markdown/jbm/sequentialparsers/ChannelMentionParser.kt +++ b/app/src/main/java/chat/peptide/markdown/jbm/sequentialparsers/ChannelMentionParser.kt @@ -1,6 +1,6 @@ -package chat.revolt.markdown.jbm.sequentialparsers +package chat.peptide.markdown.jbm.sequentialparsers -import chat.revolt.markdown.jbm.RSMElementTypes +import chat.peptide.markdown.jbm.RSMElementTypes import org.intellij.markdown.MarkdownTokenTypes import org.intellij.markdown.parser.sequentialparsers.RangesListBuilder import org.intellij.markdown.parser.sequentialparsers.SequentialParser diff --git a/app/src/main/java/chat/revolt/markdown/jbm/sequentialparsers/CustomEmoteParser.kt b/app/src/main/java/chat/peptide/markdown/jbm/sequentialparsers/CustomEmoteParser.kt similarity index 94% rename from app/src/main/java/chat/revolt/markdown/jbm/sequentialparsers/CustomEmoteParser.kt rename to app/src/main/java/chat/peptide/markdown/jbm/sequentialparsers/CustomEmoteParser.kt index 95ac1eb8..00b88e05 100644 --- a/app/src/main/java/chat/revolt/markdown/jbm/sequentialparsers/CustomEmoteParser.kt +++ b/app/src/main/java/chat/peptide/markdown/jbm/sequentialparsers/CustomEmoteParser.kt @@ -1,6 +1,6 @@ -package chat.revolt.markdown.jbm.sequentialparsers +package chat.peptide.markdown.jbm.sequentialparsers -import chat.revolt.markdown.jbm.RSMElementTypes +import chat.peptide.markdown.jbm.RSMElementTypes import org.intellij.markdown.MarkdownTokenTypes import org.intellij.markdown.parser.sequentialparsers.RangesListBuilder import org.intellij.markdown.parser.sequentialparsers.SequentialParser diff --git a/app/src/main/java/chat/revolt/markdown/jbm/sequentialparsers/MassMentionParser.kt b/app/src/main/java/chat/peptide/markdown/jbm/sequentialparsers/MassMentionParser.kt similarity index 92% rename from app/src/main/java/chat/revolt/markdown/jbm/sequentialparsers/MassMentionParser.kt rename to app/src/main/java/chat/peptide/markdown/jbm/sequentialparsers/MassMentionParser.kt index 37944adf..29c7b5c3 100644 --- a/app/src/main/java/chat/revolt/markdown/jbm/sequentialparsers/MassMentionParser.kt +++ b/app/src/main/java/chat/peptide/markdown/jbm/sequentialparsers/MassMentionParser.kt @@ -1,4 +1,4 @@ -package chat.revolt.markdown.jbm.sequentialparsers +package chat.peptide.markdown.jbm.sequentialparsers import org.intellij.markdown.parser.sequentialparsers.RangesListBuilder import org.intellij.markdown.parser.sequentialparsers.SequentialParser diff --git a/app/src/main/java/chat/revolt/markdown/jbm/sequentialparsers/RoleMentionParser.kt b/app/src/main/java/chat/peptide/markdown/jbm/sequentialparsers/RoleMentionParser.kt similarity index 94% rename from app/src/main/java/chat/revolt/markdown/jbm/sequentialparsers/RoleMentionParser.kt rename to app/src/main/java/chat/peptide/markdown/jbm/sequentialparsers/RoleMentionParser.kt index 98cecafd..e9d7c908 100644 --- a/app/src/main/java/chat/revolt/markdown/jbm/sequentialparsers/RoleMentionParser.kt +++ b/app/src/main/java/chat/peptide/markdown/jbm/sequentialparsers/RoleMentionParser.kt @@ -1,6 +1,6 @@ -package chat.revolt.markdown.jbm.sequentialparsers +package chat.peptide.markdown.jbm.sequentialparsers -import chat.revolt.markdown.jbm.RSMElementTypes +import chat.peptide.markdown.jbm.RSMElementTypes import org.intellij.markdown.MarkdownTokenTypes import org.intellij.markdown.parser.sequentialparsers.RangesListBuilder import org.intellij.markdown.parser.sequentialparsers.SequentialParser diff --git a/app/src/main/java/chat/revolt/markdown/jbm/sequentialparsers/UserMentionParser.kt b/app/src/main/java/chat/peptide/markdown/jbm/sequentialparsers/UserMentionParser.kt similarity index 93% rename from app/src/main/java/chat/revolt/markdown/jbm/sequentialparsers/UserMentionParser.kt rename to app/src/main/java/chat/peptide/markdown/jbm/sequentialparsers/UserMentionParser.kt index 7788b795..f92d95bc 100644 --- a/app/src/main/java/chat/revolt/markdown/jbm/sequentialparsers/UserMentionParser.kt +++ b/app/src/main/java/chat/peptide/markdown/jbm/sequentialparsers/UserMentionParser.kt @@ -1,6 +1,6 @@ -package chat.revolt.markdown.jbm.sequentialparsers +package chat.peptide.markdown.jbm.sequentialparsers -import chat.revolt.markdown.jbm.RSMElementTypes +import chat.peptide.markdown.jbm.RSMElementTypes import org.intellij.markdown.MarkdownTokenTypes import org.intellij.markdown.parser.sequentialparsers.RangesListBuilder import org.intellij.markdown.parser.sequentialparsers.SequentialParser diff --git a/app/src/main/java/chat/revolt/material/EasingTokens.kt b/app/src/main/java/chat/peptide/material/EasingTokens.kt similarity index 89% rename from app/src/main/java/chat/revolt/material/EasingTokens.kt rename to app/src/main/java/chat/peptide/material/EasingTokens.kt index 9fc5a323..5884c5ae 100644 --- a/app/src/main/java/chat/revolt/material/EasingTokens.kt +++ b/app/src/main/java/chat/peptide/material/EasingTokens.kt @@ -1,4 +1,4 @@ -package chat.revolt.material +package chat.peptide.material import androidx.compose.animation.core.CubicBezierEasing diff --git a/app/src/main/java/chat/revolt/ndk/NativeLibraries.kt b/app/src/main/java/chat/peptide/ndk/NativeLibraries.kt similarity index 91% rename from app/src/main/java/chat/revolt/ndk/NativeLibraries.kt rename to app/src/main/java/chat/peptide/ndk/NativeLibraries.kt index 10af43e7..29fcf6e8 100644 --- a/app/src/main/java/chat/revolt/ndk/NativeLibraries.kt +++ b/app/src/main/java/chat/peptide/ndk/NativeLibraries.kt @@ -1,4 +1,4 @@ -package chat.revolt.ndk +package chat.peptide.ndk annotation class NativeLibrary(val name: String) { companion object { diff --git a/app/src/main/java/chat/revolt/ndk/Stendal.kt b/app/src/main/java/chat/peptide/ndk/Stendal.kt similarity index 96% rename from app/src/main/java/chat/revolt/ndk/Stendal.kt rename to app/src/main/java/chat/peptide/ndk/Stendal.kt index 070c6ad3..9ea491dc 100644 --- a/app/src/main/java/chat/revolt/ndk/Stendal.kt +++ b/app/src/main/java/chat/peptide/ndk/Stendal.kt @@ -1,4 +1,4 @@ -package chat.revolt.ndk +package chat.peptide.ndk import kotlinx.serialization.Serializable diff --git a/app/src/main/java/chat/revolt/persistence/KVStorage.kt b/app/src/main/java/chat/peptide/persistence/KVStorage.kt similarity index 89% rename from app/src/main/java/chat/revolt/persistence/KVStorage.kt rename to app/src/main/java/chat/peptide/persistence/KVStorage.kt index f42f28ef..90f529d0 100644 --- a/app/src/main/java/chat/revolt/persistence/KVStorage.kt +++ b/app/src/main/java/chat/peptide/persistence/KVStorage.kt @@ -1,4 +1,4 @@ -package chat.revolt.persistence +package chat.peptide.persistence import android.content.Context import androidx.datastore.core.DataStore @@ -11,13 +11,13 @@ import kotlinx.coroutines.flow.firstOrNull import javax.inject.Inject import javax.inject.Singleton -val Context.revoltKVStorage: DataStore by preferencesDataStore(name = "revolt_kv") +val Context.peptideKVStorage: DataStore by preferencesDataStore(name = "peptide_kv") @Singleton class KVStorage @Inject constructor( @ApplicationContext private val mContext: Context ) { - private val dataStore = mContext.revoltKVStorage + private val dataStore = mContext.peptideKVStorage suspend fun set(key: String, value: String) { dataStore.edit { preferences -> diff --git a/app/src/main/java/chat/revolt/persistence/SqlStorage.kt b/app/src/main/java/chat/peptide/persistence/SqlStorage.kt similarity index 57% rename from app/src/main/java/chat/revolt/persistence/SqlStorage.kt rename to app/src/main/java/chat/peptide/persistence/SqlStorage.kt index a46590a4..6fd7479f 100644 --- a/app/src/main/java/chat/revolt/persistence/SqlStorage.kt +++ b/app/src/main/java/chat/peptide/persistence/SqlStorage.kt @@ -1,13 +1,13 @@ -package chat.revolt.persistence +package chat.peptide.persistence import app.cash.sqldelight.db.SqlDriver import app.cash.sqldelight.driver.android.AndroidSqliteDriver -import chat.revolt.RevoltApplication +import chat.peptide.PeptideApplication object SqlStorage { val driver: SqlDriver = AndroidSqliteDriver( Database.Schema, - RevoltApplication.instance.applicationContext, - "revolt.db" + PeptideApplication.instance.applicationContext, + "peptide.db" ) } \ No newline at end of file diff --git a/app/src/main/java/chat/revolt/providers/AttachmentProvider.kt b/app/src/main/java/chat/peptide/providers/AttachmentProvider.kt similarity index 81% rename from app/src/main/java/chat/revolt/providers/AttachmentProvider.kt rename to app/src/main/java/chat/peptide/providers/AttachmentProvider.kt index 3336188f..86e07dc9 100644 --- a/app/src/main/java/chat/revolt/providers/AttachmentProvider.kt +++ b/app/src/main/java/chat/peptide/providers/AttachmentProvider.kt @@ -1,11 +1,11 @@ -package chat.revolt.providers +package chat.peptide.providers import android.content.Context import android.net.Uri import androidx.core.content.FileProvider -import chat.revolt.BuildConfig -import chat.revolt.R -import chat.revolt.api.RevoltHttp +import chat.peptide.BuildConfig +import chat.peptide.R +import chat.peptide.api.PeptideHttp import io.ktor.client.request.get import io.ktor.client.statement.readBytes import java.io.File @@ -23,7 +23,7 @@ suspend fun getAttachmentContentUri( attachmentsDir.mkdir() } - val response = RevoltHttp.get(resourceUrl) + val response = PeptideHttp.get(resourceUrl) val file = File(attachmentsDir, "$id-$filename") file.writeBytes(response.readBytes()) diff --git a/app/src/main/java/chat/revolt/screens/DefaultDestinationScreen.kt b/app/src/main/java/chat/peptide/screens/DefaultDestinationScreen.kt similarity index 84% rename from app/src/main/java/chat/revolt/screens/DefaultDestinationScreen.kt rename to app/src/main/java/chat/peptide/screens/DefaultDestinationScreen.kt index e86af7f2..c59d9f82 100644 --- a/app/src/main/java/chat/revolt/screens/DefaultDestinationScreen.kt +++ b/app/src/main/java/chat/peptide/screens/DefaultDestinationScreen.kt @@ -1,4 +1,4 @@ -package chat.revolt.screens +package chat.peptide.screens import android.app.Activity import androidx.compose.foundation.layout.Box @@ -10,9 +10,9 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.toArgb import androidx.compose.ui.platform.LocalContext import androidx.navigation.NavController -import chat.revolt.RevoltApplication -import chat.revolt.api.internals.getComponentActivity -import chat.revolt.composables.screens.splash.DisconnectedScreen +import chat.peptide.PeptideApplication +import chat.peptide.api.internals.getComponentActivity +import chat.peptide.composables.screens.splash.DisconnectedScreen import com.google.android.material.color.DynamicColors @Composable @@ -39,7 +39,7 @@ fun DefaultDestinationScreen( // See the other one in MainActivity.kt val activity = context.getComponentActivity() as Activity DynamicColors.applyToActivityIfAvailable(activity) - DynamicColors.applyToActivitiesIfAvailable(RevoltApplication.instance) + DynamicColors.applyToActivitiesIfAvailable(PeptideApplication.instance) activity.window.statusBarColor = Color.Transparent.toArgb() navController.popBackStack(navController.graph.startDestinationRoute!!, true) diff --git a/app/src/main/java/chat/revolt/screens/about/AboutScreen.kt b/app/src/main/java/chat/peptide/screens/about/AboutScreen.kt similarity index 92% rename from app/src/main/java/chat/revolt/screens/about/AboutScreen.kt rename to app/src/main/java/chat/peptide/screens/about/AboutScreen.kt index 89454eb0..aab5f681 100644 --- a/app/src/main/java/chat/revolt/screens/about/AboutScreen.kt +++ b/app/src/main/java/chat/peptide/screens/about/AboutScreen.kt @@ -1,4 +1,4 @@ -package chat.revolt.screens.about +package chat.peptide.screens.about import android.os.Build import android.widget.Toast @@ -15,8 +15,6 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.automirrored.filled.ArrowBack import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.ElevatedButton import androidx.compose.material3.ExperimentalMaterial3Api @@ -51,14 +49,15 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavController -import chat.revolt.BuildConfig -import chat.revolt.R -import chat.revolt.api.RevoltAPI -import chat.revolt.api.RevoltJson -import chat.revolt.api.routes.misc.Root -import chat.revolt.api.routes.misc.getRootRoute -import chat.revolt.composables.generic.PrimaryTabs -import chat.revolt.internals.Platform +import chat.peptide.BuildConfig +import chat.peptide.R +import chat.peptide.api.PeptideAPI +import chat.peptide.api.PeptideJson +import chat.peptide.api.routes.misc.Root +import chat.peptide.api.routes.misc.getRootRoute +import chat.peptide.composables.generic.PepTextButton +import chat.peptide.composables.generic.PrimaryTabs +import chat.peptide.internals.Platform import kotlinx.coroutines.launch import kotlinx.serialization.encodeToString import java.net.URI @@ -72,8 +71,8 @@ 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(RevoltAPI.getCurrentBaseUrl()).host, - "API Version" to (root?.revolt ?: "Unknown"), + "API Host" to URI(PeptideAPI.getCurrentBaseUrl()).host, + "API Version" to (root?.peptide ?: "Unknown"), "Runtime SDK" to Build.VERSION.SDK_INT.toString(), "Model" to "${Build.MANUFACTURER} ${ Build.DEVICE.replaceFirstChar { @@ -143,7 +142,7 @@ fun AboutScreen(navController: NavController, viewModel: AboutViewModel = viewMo fun copyDebugInformation() { clipboardManager.setText( - AnnotatedString(RevoltJson.encodeToString(viewModel.getDebugInformation())) + AnnotatedString(PeptideJson.encodeToString(viewModel.getDebugInformation())) ) if (Platform.needsShowClipboardNotification()) { @@ -211,7 +210,7 @@ fun AboutScreen(navController: NavController, viewModel: AboutViewModel = viewMo when (viewModel.selectedTabIndex) { 0 -> { Image( - painter = painterResource(R.drawable.revolt_logo_wide), + painter = painterResource(R.drawable.peptide_logo_wide), contentDescription = stringResource(R.string.about_full_name), colorFilter = ColorFilter.tint(LocalContentColor.current), modifier = Modifier @@ -252,7 +251,7 @@ fun AboutScreen(navController: NavController, viewModel: AboutViewModel = viewMo 1 -> { DebugInfo(viewModel) - TextButton(onClick = ::copyDebugInformation) { + PepTextButton(onClick = ::copyDebugInformation) { Text(text = stringResource(id = R.string.copy)) } } diff --git a/app/src/main/java/chat/revolt/screens/about/AttributionScreen.kt b/app/src/main/java/chat/peptide/screens/about/AttributionScreen.kt similarity index 98% rename from app/src/main/java/chat/revolt/screens/about/AttributionScreen.kt rename to app/src/main/java/chat/peptide/screens/about/AttributionScreen.kt index cc9a002d..212e8d02 100644 --- a/app/src/main/java/chat/revolt/screens/about/AttributionScreen.kt +++ b/app/src/main/java/chat/peptide/screens/about/AttributionScreen.kt @@ -1,4 +1,4 @@ -package chat.revolt.screens.about +package chat.peptide.screens.about import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement @@ -41,8 +41,8 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.navigation.NavController -import chat.revolt.R -import chat.revolt.composables.screens.settings.AttributionItem +import chat.peptide.R +import chat.peptide.composables.screens.settings.AttributionItem import kotlinx.serialization.Serializable import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonArray diff --git a/app/src/main/java/chat/revolt/screens/chat/ChatRouterScreen.kt b/app/src/main/java/chat/peptide/screens/chat/ChatRouterScreen.kt similarity index 77% rename from app/src/main/java/chat/revolt/screens/chat/ChatRouterScreen.kt rename to app/src/main/java/chat/peptide/screens/chat/ChatRouterScreen.kt index ef660e5e..afac9d47 100644 --- a/app/src/main/java/chat/revolt/screens/chat/ChatRouterScreen.kt +++ b/app/src/main/java/chat/peptide/screens/chat/ChatRouterScreen.kt @@ -1,4 +1,4 @@ -package chat.revolt.screens.chat +package chat.peptide.screens.chat import android.Manifest import android.annotation.SuppressLint @@ -10,6 +10,7 @@ import android.view.inputmethod.InputMethodManager import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.contract.ActivityResultContracts import androidx.compose.animation.AnimatedVisibility +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.WindowInsetsSides @@ -28,9 +29,9 @@ import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.NavigationBarItem +import androidx.compose.material3.NavigationBarItemDefaults import androidx.compose.material3.Scaffold import androidx.compose.material3.Text -import androidx.compose.material3.TextButton import androidx.compose.material3.rememberDrawerState import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.material3.windowsizeclass.WindowHeightSizeClass @@ -48,6 +49,7 @@ import androidx.compose.runtime.setValue import androidx.compose.runtime.snapshotFlow import androidx.compose.runtime.structuralEqualityPolicy import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalView import androidx.compose.ui.res.painterResource @@ -61,43 +63,44 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.compose.LifecycleEventEffect import androidx.lifecycle.viewModelScope import androidx.navigation.NavController -import chat.revolt.BuildConfig -import chat.revolt.R -import chat.revolt.api.RevoltAPI -import chat.revolt.api.internals.DirectMessages -import chat.revolt.api.realtime.DisconnectionState -import chat.revolt.api.realtime.RealtimeSocket -import chat.revolt.api.routes.push.subscribePush -import chat.revolt.callbacks.Action -import chat.revolt.callbacks.ActionChannel -import chat.revolt.composables.chat.DisconnectedNotice -import chat.revolt.composables.screens.chat.drawer.ChannelSideDrawer -import chat.revolt.dialogs.NotificationRationaleDialog -import chat.revolt.internals.Changelogs -import chat.revolt.persistence.KVStorage -import chat.revolt.screens.chat.dialogs.safety.ReportMessageDialog -import chat.revolt.screens.chat.dialogs.safety.ReportServerDialog -import chat.revolt.screens.chat.dialogs.safety.ReportUserDialog -import chat.revolt.screens.chat.views.FriendsScreen -import chat.revolt.screens.chat.views.NoCurrentChannelScreen -import chat.revolt.screens.chat.views.channel.ChannelScreen -import chat.revolt.screens.settings.SettingsScreen -import chat.revolt.sheets.AddServerSheet -import chat.revolt.sheets.ChangelogSheet -import chat.revolt.sheets.EarlyAccessSheet -import chat.revolt.sheets.EmoteInfoSheet -import chat.revolt.sheets.LinkInfoSheet -import chat.revolt.sheets.ReactionInfoSheet -import chat.revolt.sheets.ServerContextSheet -import chat.revolt.sheets.StatusSheet -import chat.revolt.sheets.UserInfoSheet -import chat.revolt.sheets.WebHookUserSheet -import chat.revolt.sheets.spark.SwipeToReplySparkSheet +import chat.peptide.BuildConfig +import chat.peptide.R +import chat.peptide.api.PeptideAPI +import chat.peptide.api.internals.DirectMessages +import chat.peptide.api.realtime.DisconnectionState +import chat.peptide.api.realtime.RealtimeSocket +import chat.peptide.api.routes.push.subscribePush +import chat.peptide.callbacks.Action +import chat.peptide.callbacks.ActionChannel +import chat.peptide.composables.chat.DisconnectedNotice +import chat.peptide.composables.generic.PepTextButton +import chat.peptide.composables.screens.chat.drawer.ChannelSideDrawer +import chat.peptide.dialogs.NotificationRationaleDialog +import chat.peptide.internals.Changelogs +import chat.peptide.utils.DeepLinkHandler +import chat.peptide.persistence.KVStorage +import chat.peptide.screens.chat.dialogs.safety.ReportMessageDialog +import chat.peptide.screens.chat.dialogs.safety.ReportServerDialog +import chat.peptide.screens.chat.dialogs.safety.ReportUserDialog +import chat.peptide.screens.chat.views.FriendsScreen +import chat.peptide.screens.chat.views.NoCurrentChannelScreen +import chat.peptide.screens.chat.views.channel.ChannelScreen +import chat.peptide.screens.settings.SettingsScreen +import chat.peptide.sheets.AddServerSheet +import chat.peptide.sheets.ChangelogSheet +import chat.peptide.sheets.EarlyAccessSheet +import chat.peptide.sheets.EmoteInfoSheet +import chat.peptide.sheets.LinkInfoSheet +import chat.peptide.sheets.ReactionInfoSheet +import chat.peptide.sheets.ServerContextSheet +import chat.peptide.sheets.StatusSheet +import chat.peptide.sheets.UserInfoSheet +import chat.peptide.sheets.WebHookUserSheet +import chat.peptide.sheets.spark.SwipeToReplySparkSheet import com.google.android.gms.tasks.OnCompleteListener import com.google.firebase.messaging.FirebaseMessaging import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.qualifiers.ApplicationContext -import io.sentry.Sentry import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.launch import javax.inject.Inject @@ -107,17 +110,21 @@ sealed class ChatRouterDestination { data object Friends : ChatRouterDestination() data object Home : ChatRouterDestination() data object Discover : ChatRouterDestination() - data class Channel(val channelId: String) : ChatRouterDestination() + data class Channel( + val channelId: String, + val messageId: String? = null, + ) : ChatRouterDestination() + data class ServersChannels(val serverID: String) : ChatRouterDestination() data class NoCurrentChannel(val serverId: String?) : ChatRouterDestination() companion object { - val default = Settings + val default = Home // Changed default from Settings to Home fun fromString(destination: String): ChatRouterDestination { return when { - destination == "home" -> Settings // previous name for overview - destination == "overview" -> Settings + destination == "home" -> Home // Changed from Settings to Home + destination == "overview" -> Home // Changed from Settings to Home destination == "friends" -> Friends destination.startsWith("no_current_channel/") -> NoCurrentChannel( destination.removePrefix( @@ -125,7 +132,17 @@ sealed class ChatRouterDestination { ) ) - destination.startsWith("channel/") -> Channel(destination.removePrefix("channel/")) + destination.startsWith("channel/") -> { + val parts = destination.removePrefix("channel/").split("/") + val channelId = parts.getOrNull(0) + val messageId = parts.getOrNull(1) + if (channelId != null) { + Channel(channelId, messageId) + } else { + default + } + } + else -> default } } @@ -150,8 +167,18 @@ class ChatRouterViewModel @Inject constructor( init { viewModelScope.launch { - val current = kvStorage.get("currentDestination") - setSaveDestination(ChatRouterDestination.fromString(current ?: "")) + // Check if there's a deep link to handle first + if (DeepLinkHandler.hasDeepLink) { + Log.d( + "ChatRouterViewModel", + "Deep link detected in init, skipping saved destination" + ) + // Don't set any destination here, let the LaunchedEffect in ChatRouterScreen handle it + } else { + // No deep link, load the saved destination + val current = kvStorage.get("currentDestination") + setSaveDestination(ChatRouterDestination.fromString(current ?: "")) + } latestChangelogRead = changelogs.hasSeenCurrent() latestChangelog = changelogs.getLatestChangelogCode() @@ -193,7 +220,7 @@ class ChatRouterViewModel @Inject constructor( OnCompleteListener { task -> if (!task.isSuccessful) { Log.w("FCM", "Fetching FCM registration token failed", task.exception) - task.exception?.let { Sentry.captureException(it) } +// task.exception?.let { Sentry.captureException(it) } return@OnCompleteListener } @@ -302,7 +329,7 @@ fun ChatRouterScreen( val currentServer = remember(viewModel.currentDestination) { when (viewModel.currentDestination) { is ChatRouterDestination.Channel -> { - RevoltAPI.channelCache[(viewModel.currentDestination as ChatRouterDestination.Channel).channelId]?.server + PeptideAPI.channelCache[(viewModel.currentDestination as ChatRouterDestination.Channel).channelId]?.server } is ChatRouterDestination.NoCurrentChannel -> { @@ -316,7 +343,7 @@ fun ChatRouterScreen( LifecycleEventEffect(Lifecycle.Event.ON_RESUME) { if (RealtimeSocket.disconnectionState == DisconnectionState.Disconnected) { RealtimeSocket.updateDisconnectionState(DisconnectionState.Reconnecting) - scope.launch { RevoltAPI.connectWS() } + scope.launch { PeptideAPI.connectWS() } } } @@ -332,8 +359,8 @@ fun ChatRouterScreen( } } - LaunchedEffect(RevoltAPI.selfId) { - snapshotFlow { RevoltAPI.selfId } + LaunchedEffect(PeptideAPI.selfId) { + snapshotFlow { PeptideAPI.selfId } .distinctUntilChanged() .collect { selfId -> if (selfId == null) { @@ -361,6 +388,66 @@ fun ChatRouterScreen( } } + // Handle deep links when the ChatRouterScreen is first composed + LaunchedEffect(Unit) { + // Check if there's a deep link to handle + if (DeepLinkHandler.hasDeepLink) { + Log.d("ChatRouterScreen", "Processing deep link data") + + // Process the deep link based on priority + when { + // Priority 1: Handle server/channel/message format (most specific) + DeepLinkHandler.messageId != null && DeepLinkHandler.channelId != null -> { + val messageId = DeepLinkHandler.messageId!! + val channelId = DeepLinkHandler.channelId!! + Log.d( + "ChatRouterScreen", + "Setting destination to message: $messageId in channel: $channelId" + ) + + val resolvedChannel = PeptideAPI.channelCache[channelId] + if (resolvedChannel == null) { + showChannelUnavailableAlert = true + } else { + // Navigate to the channel first, then the message will be handled by the channel screen + viewModel.setSaveDestination(ChatRouterDestination.Channel(channelId)) + // TODO: Add logic to scroll to the specific message in the channel + } + } + + // Priority 2: Handle channel deep link + DeepLinkHandler.channelId != null -> { + val channelId = DeepLinkHandler.channelId!! + Log.d("ChatRouterScreen", "Setting destination to channel: $channelId") + val resolvedChannel = PeptideAPI.channelCache[channelId] + + if (resolvedChannel == null) { + showChannelUnavailableAlert = true + } else { + viewModel.setSaveDestination(ChatRouterDestination.Channel(channelId)) + } + } + + // Priority 3: Handle server deep link + DeepLinkHandler.serverId != null -> { + val serverId = DeepLinkHandler.serverId!! + Log.d("ChatRouterScreen", "Setting destination to server: $serverId") + viewModel.navigateToServer(serverId) + } + + // Priority 4: Handle user deep link + DeepLinkHandler.userId != null -> { + val userId = DeepLinkHandler.userId!! + Log.d("ChatRouterScreen", "Setting destination to user: $userId") + // TODO: Implement user navigation if needed + } + } + + // Clear the deep link data after processing + DeepLinkHandler.clear() + } + } + LaunchedEffect(Unit) { while (true) { ActionChannel.receive().let { action -> @@ -372,7 +459,7 @@ fun ChatRouterScreen( } is Action.SwitchChannel -> { - val resolvedChannel = RevoltAPI.channelCache[action.channelId] + val resolvedChannel = PeptideAPI.channelCache[action.channelId] if (resolvedChannel == null) { showChannelUnavailableAlert = true @@ -381,7 +468,8 @@ fun ChatRouterScreen( viewModel.setSaveDestination( ChatRouterDestination.Channel( - action.channelId + channelId = action.channelId, + messageId = action.messageId, ) ) } @@ -464,7 +552,7 @@ fun ChatRouterScreen( Text(stringResource(id = R.string.notice_platform_mod_dm_description)) }, confirmButton = { - TextButton(onClick = { + PepTextButton(onClick = { showPlatformModDMHint = false DirectMessages.getPlatformModerationDM()?.id?.let { viewModel.setSaveDestination(ChatRouterDestination.Channel(it)) @@ -534,7 +622,7 @@ fun ChatRouterScreen( showServerContextSheet = false }, onReportServer = { - reportServerTarget = currentServer ?: "" + reportServerTarget = serverContextSheetTarget showReportServer = true } ) @@ -542,7 +630,9 @@ fun ChatRouterScreen( } if (showUserContextSheet) { - val userContextSheetState = rememberModalBottomSheetState() + val userContextSheetState = rememberModalBottomSheetState( + skipPartiallyExpanded = true, + ) ModalBottomSheet( sheetState = userContextSheetState, @@ -552,7 +642,6 @@ fun ChatRouterScreen( ) { UserInfoSheet( userId = userContextSheetTarget, - serverId = userContextSheetServer, dismissSheet = { userContextSheetState.hide() showUserContextSheet = false @@ -601,6 +690,7 @@ fun ChatRouterScreen( AlertDialog( onDismissRequest = { showChannelUnavailableAlert = false + viewModel.setSaveDestination(ChatRouterDestination.Discover) }, icon = { Icon( @@ -624,8 +714,9 @@ fun ChatRouterScreen( ) }, confirmButton = { - TextButton(onClick = { + PepTextButton(onClick = { showChannelUnavailableAlert = false + viewModel.setSaveDestination(ChatRouterDestination.Discover) }) { Text(text = stringResource(id = R.string.ok)) } @@ -777,7 +868,7 @@ fun ChatRouterScreen( state = RealtimeSocket.disconnectionState, onReconnect = { RealtimeSocket.updateDisconnectionState(DisconnectionState.Reconnecting) - scope.launch { RevoltAPI.connectWS() } + scope.launch { PeptideAPI.connectWS() } } ) } @@ -826,6 +917,7 @@ fun ChannelNavigator( is ChatRouterDestination.Channel -> { ChannelScreen( channelId = dest.channelId, + messageId = dest.messageId, backToChannelsScreen = { currentServer?.let { viewModel.setSaveDestination( @@ -857,13 +949,25 @@ fun ChannelNavigator( label = { Text(text = "you") }, - selected = when(dest){ + selected = when (dest) { is ChatRouterDestination.ServersChannels, is ChatRouterDestination.NoCurrentChannel, ChatRouterDestination.Home, ChatRouterDestination.Discover -> true + else -> false - } , + }, + colors = NavigationBarItemDefaults.colors( + indicatorColor = Color.Transparent, + selectedIconColor = MaterialTheme.colorScheme.onBackground, + selectedTextColor = MaterialTheme.colorScheme.onBackground, + unselectedTextColor = MaterialTheme.colorScheme.onBackground.copy( + alpha = 0.4f + ), + unselectedIconColor = MaterialTheme.colorScheme.onBackground.copy( + alpha = 0.4f + ), + ), enabled = true, onClick = { viewModel.setSaveDestination(ChatRouterDestination.Home) @@ -882,6 +986,17 @@ fun ChannelNavigator( }, selected = dest is ChatRouterDestination.Friends, enabled = true, + colors = NavigationBarItemDefaults.colors( + indicatorColor = Color.Transparent, + selectedIconColor = MaterialTheme.colorScheme.onBackground, + selectedTextColor = MaterialTheme.colorScheme.onBackground, + unselectedTextColor = MaterialTheme.colorScheme.onBackground.copy( + alpha = 0.4f + ), + unselectedIconColor = MaterialTheme.colorScheme.onBackground.copy( + alpha = 0.4f + ), + ), onClick = { viewModel.setSaveDestination(ChatRouterDestination.Friends) } @@ -898,6 +1013,17 @@ fun ChannelNavigator( Text(text = "you") }, selected = dest is ChatRouterDestination.Settings, + colors = NavigationBarItemDefaults.colors( + indicatorColor = Color.Transparent, + selectedIconColor = MaterialTheme.colorScheme.onBackground, + selectedTextColor = MaterialTheme.colorScheme.onBackground, + unselectedTextColor = MaterialTheme.colorScheme.onBackground.copy( + alpha = 0.4f + ), + unselectedIconColor = MaterialTheme.colorScheme.onBackground.copy( + alpha = 0.4f + ), + ), enabled = true, onClick = { viewModel.setSaveDestination(ChatRouterDestination.Settings) @@ -906,7 +1032,7 @@ fun ChannelNavigator( } } ) { innerPadding -> - Column(modifier = Modifier.padding(innerPadding)) { + Box(modifier = Modifier.padding(innerPadding)) { when (dest) { is ChatRouterDestination.Settings -> { SettingsScreen( diff --git a/app/src/main/java/chat/revolt/screens/chat/dialogs/InviteDialog.kt b/app/src/main/java/chat/peptide/screens/chat/dialogs/InviteDialog.kt similarity index 92% rename from app/src/main/java/chat/revolt/screens/chat/dialogs/InviteDialog.kt rename to app/src/main/java/chat/peptide/screens/chat/dialogs/InviteDialog.kt index a99e8598..4bfb5b63 100644 --- a/app/src/main/java/chat/revolt/screens/chat/dialogs/InviteDialog.kt +++ b/app/src/main/java/chat/peptide/screens/chat/dialogs/InviteDialog.kt @@ -1,4 +1,4 @@ -package chat.revolt.screens.chat.dialogs +package chat.peptide.screens.chat.dialogs import android.net.Uri import android.widget.Toast @@ -41,11 +41,13 @@ 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.R -import chat.revolt.api.RevoltAPI -import chat.revolt.api.routes.channel.createInvite -import chat.revolt.internals.Platform -import chat.revolt.ui.theme.FragmentMono +import chat.peptide.R +import chat.peptide.api.PeptideAPI +import chat.peptide.api.routes.channel.createInvite +import chat.peptide.composables.generic.PepTextButton +import chat.peptide.composables.generic.SquareButton +import chat.peptide.internals.Platform +import chat.peptide.ui.theme.FragmentMono import kotlinx.coroutines.Job import kotlinx.coroutines.delay import kotlinx.coroutines.launch @@ -69,7 +71,7 @@ operator fun InviteCodeChar.compareTo(other: InviteCodeChar): Int { @Composable fun InviteDialog(channelId: String, onDismissRequest: () -> Unit) { - val channel = RevoltAPI.channelCache[channelId] + val channel = PeptideAPI.channelCache[channelId] if (channel == null) { onDismissRequest() @@ -141,7 +143,7 @@ fun InviteDialog(channelId: String, onDismissRequest: () -> Unit) { Spacer(Modifier.height(16.dp)) Text( - (Uri.parse(RevoltAPI.getCurrentInvitesUrl()).host ?: "rvlt.gg") + "/", + (Uri.parse(PeptideAPI.getCurrentInvitesUrl()).host ?: "rvlt.gg") + "/", style = MaterialTheme.typography.bodySmall, textAlign = TextAlign.Center, modifier = Modifier @@ -196,15 +198,15 @@ fun InviteDialog(channelId: String, onDismissRequest: () -> Unit) { modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.End ) { - TextButton(onClick = { + PepTextButton(onClick = { onDismissRequest() }) { Text(stringResource(R.string.invite_dialog_close)) } Spacer(Modifier.width(8.dp)) - Button(onClick = { + SquareButton(onClick = { clipboardManager.setText(AnnotatedString.Builder().apply { - append(RevoltAPI.getCurrentInvitesUrl()) + append(PeptideAPI.getCurrentInvitesUrl()) append("/") append(inviteCode) }.toAnnotatedString()) diff --git a/app/src/main/java/chat/revolt/screens/chat/dialogs/safety/ReportMessageDialog.kt b/app/src/main/java/chat/peptide/screens/chat/dialogs/safety/ReportMessageDialog.kt similarity index 95% rename from app/src/main/java/chat/revolt/screens/chat/dialogs/safety/ReportMessageDialog.kt rename to app/src/main/java/chat/peptide/screens/chat/dialogs/safety/ReportMessageDialog.kt index 114deea9..91ae448e 100644 --- a/app/src/main/java/chat/revolt/screens/chat/dialogs/safety/ReportMessageDialog.kt +++ b/app/src/main/java/chat/peptide/screens/chat/dialogs/safety/ReportMessageDialog.kt @@ -1,4 +1,4 @@ -package chat.revolt.screens.chat.dialogs.safety +package chat.peptide.screens.chat.dialogs.safety import android.util.Log import androidx.compose.foundation.background @@ -37,13 +37,14 @@ 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.R -import chat.revolt.api.RevoltAPI -import chat.revolt.api.routes.safety.putMessageReport -import chat.revolt.api.routes.user.blockUser -import chat.revolt.api.schemas.ContentReportReason -import chat.revolt.composables.chat.Message -import chat.revolt.composables.generic.FormTextField +import chat.peptide.R +import chat.peptide.api.PeptideAPI +import chat.peptide.api.routes.safety.putMessageReport +import chat.peptide.api.routes.user.blockUser +import chat.peptide.api.schemas.ContentReportReason +import chat.peptide.composables.chat.Message +import chat.peptide.composables.generic.FormTextField +import chat.peptide.composables.generic.PepTextButton import kotlinx.coroutines.launch enum class MessageReportFlowState { @@ -56,13 +57,13 @@ enum class MessageReportFlowState { @OptIn(ExperimentalMaterial3Api::class) @Composable fun ReportMessageDialog(onDismiss: () -> Unit, messageId: String) { - val message = RevoltAPI.messageCache[messageId] + val message = PeptideAPI.messageCache[messageId] if (message == null) { onDismiss() return } - val author = RevoltAPI.userCache[message.author] + val author = PeptideAPI.userCache[message.author] val messageIsBridged = author?.let { author.bot != null && message.masquerade != null } ?: false val state = remember { mutableStateOf(MessageReportFlowState.Reason) } @@ -200,7 +201,7 @@ fun ReportMessageDialog(onDismiss: () -> Unit, messageId: String) { } }, dismissButton = { - TextButton( + PepTextButton( onClick = { onDismiss() }, @@ -210,7 +211,7 @@ fun ReportMessageDialog(onDismiss: () -> Unit, messageId: String) { } }, confirmButton = { - TextButton( + PepTextButton( onClick = { state.value = MessageReportFlowState.Sending }, @@ -305,7 +306,7 @@ fun ReportMessageDialog(onDismiss: () -> Unit, messageId: String) { } }, dismissButton = { - TextButton( + PepTextButton( onClick = { onDismiss() }, @@ -315,7 +316,7 @@ fun ReportMessageDialog(onDismiss: () -> Unit, messageId: String) { } }, confirmButton = { - TextButton( + PepTextButton( onClick = { scope.launch { blockUser(message.author ?: return@launch) @@ -358,7 +359,7 @@ fun ReportMessageDialog(onDismiss: () -> Unit, messageId: String) { } }, dismissButton = { - TextButton( + PepTextButton( onClick = { onDismiss() }, diff --git a/app/src/main/java/chat/revolt/screens/chat/dialogs/safety/ReportServerDialog.kt b/app/src/main/java/chat/peptide/screens/chat/dialogs/safety/ReportServerDialog.kt similarity index 95% rename from app/src/main/java/chat/revolt/screens/chat/dialogs/safety/ReportServerDialog.kt rename to app/src/main/java/chat/peptide/screens/chat/dialogs/safety/ReportServerDialog.kt index d7bf403c..f044174a 100644 --- a/app/src/main/java/chat/revolt/screens/chat/dialogs/safety/ReportServerDialog.kt +++ b/app/src/main/java/chat/peptide/screens/chat/dialogs/safety/ReportServerDialog.kt @@ -1,4 +1,4 @@ -package chat.revolt.screens.chat.dialogs.safety +package chat.peptide.screens.chat.dialogs.safety import android.util.Log import androidx.compose.foundation.layout.Column @@ -32,12 +32,13 @@ 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.R -import chat.revolt.api.RevoltAPI -import chat.revolt.api.routes.safety.putServerReport -import chat.revolt.api.schemas.ContentReportReason -import chat.revolt.composables.generic.FormTextField -import chat.revolt.composables.screens.settings.ServerOverview +import chat.peptide.R +import chat.peptide.api.PeptideAPI +import chat.peptide.api.routes.safety.putServerReport +import chat.peptide.api.schemas.ContentReportReason +import chat.peptide.composables.generic.FormTextField +import chat.peptide.composables.generic.PepTextButton +import chat.peptide.composables.screens.settings.ServerOverview import kotlinx.coroutines.launch enum class ServerReportFlowState { @@ -50,7 +51,7 @@ enum class ServerReportFlowState { @OptIn(ExperimentalMaterial3Api::class) @Composable fun ReportServerDialog(onDismiss: () -> Unit, serverId: String) { - val server = RevoltAPI.serverCache[serverId] + val server = PeptideAPI.serverCache[serverId] if (server == null) { onDismiss() return @@ -169,7 +170,7 @@ fun ReportServerDialog(onDismiss: () -> Unit, serverId: String) { } }, dismissButton = { - TextButton( + PepTextButton( onClick = { onDismiss() }, @@ -179,7 +180,7 @@ fun ReportServerDialog(onDismiss: () -> Unit, serverId: String) { } }, confirmButton = { - TextButton( + PepTextButton( onClick = { state.value = ServerReportFlowState.Sending }, @@ -263,7 +264,7 @@ fun ReportServerDialog(onDismiss: () -> Unit, serverId: String) { } }, confirmButton = { - TextButton( + PepTextButton( onClick = { onDismiss() }, @@ -303,7 +304,7 @@ fun ReportServerDialog(onDismiss: () -> Unit, serverId: String) { } }, dismissButton = { - TextButton( + PepTextButton( onClick = { onDismiss() }, diff --git a/app/src/main/java/chat/revolt/screens/chat/dialogs/safety/ReportUserDialog.kt b/app/src/main/java/chat/peptide/screens/chat/dialogs/safety/ReportUserDialog.kt similarity index 95% rename from app/src/main/java/chat/revolt/screens/chat/dialogs/safety/ReportUserDialog.kt rename to app/src/main/java/chat/peptide/screens/chat/dialogs/safety/ReportUserDialog.kt index cf8c7a43..201850d0 100644 --- a/app/src/main/java/chat/revolt/screens/chat/dialogs/safety/ReportUserDialog.kt +++ b/app/src/main/java/chat/peptide/screens/chat/dialogs/safety/ReportUserDialog.kt @@ -1,4 +1,4 @@ -package chat.revolt.screens.chat.dialogs.safety +package chat.peptide.screens.chat.dialogs.safety import android.util.Log import androidx.compose.foundation.layout.Column @@ -30,13 +30,14 @@ 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.R -import chat.revolt.api.RevoltAPI -import chat.revolt.api.routes.safety.putUserReport -import chat.revolt.api.routes.user.blockUser -import chat.revolt.api.schemas.UserReportReason -import chat.revolt.composables.generic.FormTextField -import chat.revolt.composables.screens.settings.UserOverview +import chat.peptide.R +import chat.peptide.api.PeptideAPI +import chat.peptide.api.routes.safety.putUserReport +import chat.peptide.api.routes.user.blockUser +import chat.peptide.api.schemas.UserReportReason +import chat.peptide.composables.generic.FormTextField +import chat.peptide.composables.generic.PepTextButton +import chat.peptide.composables.screens.settings.UserOverview import kotlinx.coroutines.launch enum class UserReportFlowState { @@ -49,7 +50,7 @@ enum class UserReportFlowState { @OptIn(ExperimentalMaterial3Api::class) @Composable fun ReportUserDialog(onDismiss: () -> Unit, userId: String) { - val user = RevoltAPI.userCache[userId] + val user = PeptideAPI.userCache[userId] if (user == null) { onDismiss() return @@ -162,7 +163,7 @@ fun ReportUserDialog(onDismiss: () -> Unit, userId: String) { } }, dismissButton = { - TextButton( + PepTextButton( onClick = { onDismiss() }, @@ -172,7 +173,7 @@ fun ReportUserDialog(onDismiss: () -> Unit, userId: String) { } }, confirmButton = { - TextButton( + PepTextButton( onClick = { state.value = UserReportFlowState.Sending }, @@ -267,7 +268,7 @@ fun ReportUserDialog(onDismiss: () -> Unit, userId: String) { } }, dismissButton = { - TextButton( + PepTextButton( onClick = { onDismiss() }, @@ -277,7 +278,7 @@ fun ReportUserDialog(onDismiss: () -> Unit, userId: String) { } }, confirmButton = { - TextButton( + PepTextButton( onClick = { scope.launch { blockUser(userId) @@ -320,7 +321,7 @@ fun ReportUserDialog(onDismiss: () -> Unit, userId: String) { } }, dismissButton = { - TextButton( + PepTextButton( onClick = { onDismiss() }, diff --git a/app/src/main/java/chat/revolt/screens/chat/views/FriendsScreen.kt b/app/src/main/java/chat/peptide/screens/chat/views/FriendsScreen.kt similarity index 95% rename from app/src/main/java/chat/revolt/screens/chat/views/FriendsScreen.kt rename to app/src/main/java/chat/peptide/screens/chat/views/FriendsScreen.kt index 6b242e69..d9bcbd1c 100644 --- a/app/src/main/java/chat/revolt/screens/chat/views/FriendsScreen.kt +++ b/app/src/main/java/chat/peptide/screens/chat/views/FriendsScreen.kt @@ -1,4 +1,4 @@ -package chat.revolt.screens.chat.views +package chat.peptide.screens.chat.views import android.content.Context import android.widget.Toast @@ -23,7 +23,6 @@ import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Add import androidx.compose.material.icons.filled.Close -import androidx.compose.material3.Button import androidx.compose.material3.DropdownMenu import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.ExperimentalMaterial3Api @@ -37,7 +36,6 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.Scaffold import androidx.compose.material3.Text -import androidx.compose.material3.TextButton import androidx.compose.material3.TextField import androidx.compose.material3.ToggleFloatingActionButton import androidx.compose.material3.ToggleFloatingActionButtonDefaults.animateIcon @@ -76,25 +74,27 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.navigation.NavController -import chat.revolt.R -import chat.revolt.api.internals.FriendRequests -import chat.revolt.api.internals.UserQR -import chat.revolt.api.internals.UserQRContents -import chat.revolt.api.routes.user.friendUser -import chat.revolt.api.routes.user.unfriendUser -import chat.revolt.api.schemas.AutumnResource -import chat.revolt.api.schemas.Metadata -import chat.revolt.api.settings.LoadedSettings -import chat.revolt.callbacks.Action -import chat.revolt.callbacks.ActionChannel -import chat.revolt.components.vectorassets.HL_TAG -import chat.revolt.components.vectorassets.HL_USERNAME -import chat.revolt.components.vectorassets.RevoltTagIntro -import chat.revolt.composables.chat.MemberListItem -import chat.revolt.composables.generic.CountableListHeader -import chat.revolt.composables.generic.UserAvatar -import chat.revolt.internals.extensions.zero -import chat.revolt.markdown.jbm.asHexString +import chat.peptide.R +import chat.peptide.api.internals.FriendRequests +import chat.peptide.api.internals.UserQR +import chat.peptide.api.internals.UserQRContents +import chat.peptide.api.routes.user.friendUser +import chat.peptide.api.routes.user.unfriendUser +import chat.peptide.api.schemas.AutumnResource +import chat.peptide.api.schemas.Metadata +import chat.peptide.api.settings.LoadedSettings +import chat.peptide.callbacks.Action +import chat.peptide.callbacks.ActionChannel +import chat.peptide.components.vectorassets.HL_TAG +import chat.peptide.components.vectorassets.HL_USERNAME +import chat.peptide.components.vectorassets.PeptideTagIntro +import chat.peptide.composables.chat.MemberListItem +import chat.peptide.composables.generic.CountableListHeader +import chat.peptide.composables.generic.PepTextButton +import chat.peptide.composables.generic.SquareButton +import chat.peptide.composables.generic.UserAvatar +import chat.peptide.internals.extensions.zero +import chat.peptide.markdown.jbm.asHexString import io.github.g00fy2.quickie.QRResult import io.github.g00fy2.quickie.ScanQRCode import kotlinx.coroutines.Dispatchers @@ -151,7 +151,7 @@ fun FriendsScreen(topNav: NavController, useDrawer: Boolean = false, onDrawerCli horizontalAlignment = Alignment.CenterHorizontally, ) { Image( - imageVector = RevoltTagIntro, + imageVector = PeptideTagIntro, contentDescription = null, modifier = Modifier .fillMaxWidth(0.5f) @@ -183,7 +183,7 @@ fun FriendsScreen(topNav: NavController, useDrawer: Boolean = false, onDrawerCli TextField( value = username, onValueChange = { - // Cf. https://github.com/revoltchat/backend/blob/aab1734615ac3e09cd447d2c2862ae0f33f5ce5f/crates/delta/src/routes/onboard/complete.rs#L16 + // Cf. https://github.com/peptidechat/backend/blob/aab1734615ac3e09cd447d2c2862ae0f33f5ce5f/crates/delta/src/routes/onboard/complete.rs#L16 if (it.length <= 32 && it.all { char -> char.isLetterOrDigit() || char == '_' || char == '.' || char == '-' @@ -240,7 +240,7 @@ fun FriendsScreen(topNav: NavController, useDrawer: Boolean = false, onDrawerCli verticalAlignment = Alignment.CenterVertically, modifier = Modifier.fillMaxWidth() ) { - TextButton( + PepTextButton( onClick = { scope.launch { val clipboardText = @@ -279,7 +279,7 @@ fun FriendsScreen(topNav: NavController, useDrawer: Boolean = false, onDrawerCli ) { Text(stringResource(R.string.friends_add_by_tag_sheet_paste_from_clipboard)) } - Button( + SquareButton( onClick = { scope.launch { if (username.isNotBlank() && tag.isNotBlank()) { @@ -353,7 +353,7 @@ fun FriendsScreen(topNav: NavController, useDrawer: Boolean = false, onDrawerCli textAlign = TextAlign.Center, modifier = Modifier.fillMaxWidth() ) - Button( + SquareButton( onClick = { qrResult = null contents = null @@ -413,7 +413,7 @@ fun FriendsScreen(topNav: NavController, useDrawer: Boolean = false, onDrawerCli modifier = Modifier.fillMaxWidth() ) - Button( + SquareButton( onClick = { scope.launch { contents?.let { userContents -> @@ -451,7 +451,7 @@ fun FriendsScreen(topNav: NavController, useDrawer: Boolean = false, onDrawerCli textAlign = TextAlign.Center, modifier = Modifier.fillMaxWidth() ) - Button( + SquareButton( onClick = { qrResult = null contents = null diff --git a/app/src/main/java/chat/revolt/screens/chat/views/NoCurrentChannelScreen.kt b/app/src/main/java/chat/peptide/screens/chat/views/NoCurrentChannelScreen.kt similarity index 95% rename from app/src/main/java/chat/revolt/screens/chat/views/NoCurrentChannelScreen.kt rename to app/src/main/java/chat/peptide/screens/chat/views/NoCurrentChannelScreen.kt index 91dcc03e..f1f36d8f 100644 --- a/app/src/main/java/chat/revolt/screens/chat/views/NoCurrentChannelScreen.kt +++ b/app/src/main/java/chat/peptide/screens/chat/views/NoCurrentChannelScreen.kt @@ -1,4 +1,4 @@ -package chat.revolt.screens.chat.views +package chat.peptide.screens.chat.views import androidx.compose.animation.AnimatedVisibility import androidx.compose.foundation.layout.Arrangement @@ -25,9 +25,9 @@ import androidx.compose.ui.res.stringResource 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.internals.extensions.zero -import chat.revolt.screens.chat.LocalIsConnected +import chat.peptide.R +import chat.peptide.internals.extensions.zero +import chat.peptide.screens.chat.LocalIsConnected @OptIn(ExperimentalMaterial3Api::class) @Composable diff --git a/app/src/main/java/chat/revolt/screens/chat/views/OverviewScreen.kt b/app/src/main/java/chat/peptide/screens/chat/views/OverviewScreen.kt similarity index 95% rename from app/src/main/java/chat/revolt/screens/chat/views/OverviewScreen.kt rename to app/src/main/java/chat/peptide/screens/chat/views/OverviewScreen.kt index fa9bc235..6fbfbc63 100644 --- a/app/src/main/java/chat/revolt/screens/chat/views/OverviewScreen.kt +++ b/app/src/main/java/chat/peptide/screens/chat/views/OverviewScreen.kt @@ -1,4 +1,4 @@ -package chat.revolt.screens.chat.views +package chat.peptide.screens.chat.views import android.util.Log import android.widget.Toast @@ -52,17 +52,16 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.navigation.NavController -import chat.revolt.R -import chat.revolt.api.RevoltAPI -import chat.revolt.api.routes.user.fetchSelf -import chat.revolt.api.schemas.User -import chat.revolt.composables.generic.NonIdealState -import chat.revolt.composables.screens.settings.UserOverview -import chat.revolt.composables.skeletons.UserOverviewSkeleton -import chat.revolt.internals.extensions.zero -import chat.revolt.screens.chat.LocalIsConnected -import chat.revolt.sheets.UserCardSheet -import io.sentry.Sentry +import chat.peptide.R +import chat.peptide.api.PeptideAPI +import chat.peptide.api.routes.user.fetchSelf +import chat.peptide.api.schemas.User +import chat.peptide.composables.generic.NonIdealState +import chat.peptide.composables.screens.settings.UserOverview +import chat.peptide.composables.skeletons.UserOverviewSkeleton +import chat.peptide.internals.extensions.zero +import chat.peptide.screens.chat.LocalIsConnected +import chat.peptide.sheets.UserCardSheet @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -77,7 +76,7 @@ fun OverviewScreen( var isLoading by rememberSaveable { mutableStateOf(true) } var user by rememberSaveable { mutableStateOf(null) } LaunchedEffect(Unit) { - val inCache = RevoltAPI.userCache[RevoltAPI.selfId] + val inCache = PeptideAPI.userCache[PeptideAPI.selfId] if (inCache != null) { user = inCache isLoading = false @@ -89,7 +88,7 @@ fun OverviewScreen( } } catch (e: Exception) { Log.e("OverviewScreen", "Failed to fetch self", e) - Sentry.captureException(e) +// Sentry.captureException(e) isLoading = false } } diff --git a/app/src/main/java/chat/revolt/screens/chat/views/channel/ChannelScreen.kt b/app/src/main/java/chat/peptide/screens/chat/views/channel/ChannelScreen.kt similarity index 75% rename from app/src/main/java/chat/revolt/screens/chat/views/channel/ChannelScreen.kt rename to app/src/main/java/chat/peptide/screens/chat/views/channel/ChannelScreen.kt index fa55778e..815481dc 100644 --- a/app/src/main/java/chat/revolt/screens/chat/views/channel/ChannelScreen.kt +++ b/app/src/main/java/chat/peptide/screens/chat/views/channel/ChannelScreen.kt @@ -1,24 +1,34 @@ -package chat.revolt.screens.chat.views.channel +package chat.peptide.screens.chat.views.channel +import android.Manifest import android.annotation.SuppressLint import android.app.Activity import android.content.ContentValues +import android.content.pm.PackageManager import android.content.res.Configuration import android.net.Uri import android.os.Environment import android.provider.MediaStore import android.util.DisplayMetrics import android.util.Log +import android.view.Surface.ROTATION_0 import android.widget.Toast import androidx.activity.compose.BackHandler import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.PickVisualMediaRequest import androidx.activity.result.contract.ActivityResultContracts +import androidx.camera.core.CameraSelector +import androidx.camera.core.ImageCapture +import androidx.camera.core.ImageCaptureException +import androidx.camera.lifecycle.ProcessCameraProvider +import androidx.camera.view.PreviewView import androidx.compose.animation.AnimatedContent import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.Crossfade import androidx.compose.animation.core.animateDpAsState +import androidx.compose.animation.core.animateFloatAsState import androidx.compose.animation.core.animateIntAsState +import androidx.compose.animation.core.tween import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut import androidx.compose.animation.slideInVertically @@ -49,6 +59,7 @@ import androidx.compose.foundation.layout.requiredHeight import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.statusBars import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.foundation.text.InlineTextContent import androidx.compose.foundation.text.appendInlineContent @@ -59,6 +70,7 @@ import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.DropdownMenu import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.FloatingActionButton import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.LocalContentColor @@ -103,49 +115,53 @@ import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.em import androidx.compose.ui.unit.sp +import androidx.compose.ui.viewinterop.AndroidView +import androidx.core.content.ContextCompat import androidx.documentfile.provider.DocumentFile import androidx.hilt.navigation.compose.hiltViewModel -import chat.revolt.R -import chat.revolt.RevoltApplication -import chat.revolt.activities.RevoltTweenDp -import chat.revolt.activities.RevoltTweenFloat -import chat.revolt.activities.RevoltTweenInt -import chat.revolt.api.RevoltAPI -import chat.revolt.api.internals.ChannelUtils -import chat.revolt.api.internals.PermissionBit -import chat.revolt.api.internals.has -import chat.revolt.api.routes.channel.react -import chat.revolt.api.routes.microservices.autumn.FileArgs -import chat.revolt.api.schemas.ChannelType -import chat.revolt.api.schemas.Message -import chat.revolt.api.settings.FeatureFlags -import chat.revolt.callbacks.Action -import chat.revolt.callbacks.ActionChannel -import chat.revolt.composables.chat.DateDivider -import chat.revolt.composables.chat.Message -import chat.revolt.composables.chat.MessageField -import chat.revolt.composables.chat.SystemMessage -import chat.revolt.composables.emoji.EmojiPicker -import chat.revolt.composables.generic.GroupIcon -import chat.revolt.composables.generic.PresenceBadge -import chat.revolt.composables.generic.UserAvatar -import chat.revolt.composables.generic.UserAvatarWidthPlaceholder -import chat.revolt.composables.generic.presenceFromStatus -import chat.revolt.composables.media.MediaPickerGateway -import chat.revolt.composables.screens.chat.AttachmentManager -import chat.revolt.composables.screens.chat.ChannelIcon -import chat.revolt.composables.screens.chat.ReplyManager -import chat.revolt.composables.screens.chat.TypingIndicator -import chat.revolt.composables.screens.chat.atoms.RegularMessage -import chat.revolt.composables.screens.chat.molecules.JoinVoiceChannelButton -import chat.revolt.composables.skeletons.MessageSkeleton -import chat.revolt.composables.skeletons.MessageSkeletonVariant -import chat.revolt.internals.extensions.rememberChannelPermissions -import chat.revolt.internals.extensions.zero -import chat.revolt.screens.chat.LocalIsConnected -import chat.revolt.sheets.ChannelInfoSheet -import chat.revolt.sheets.MessageContextSheet -import chat.revolt.sheets.ReactSheet +import chat.peptide.R +import chat.peptide.PeptideApplication +import chat.peptide.activities.PeptideTweenDp +import chat.peptide.activities.PeptideTweenFloat +import chat.peptide.activities.PeptideTweenInt +import chat.peptide.api.PeptideAPI +import chat.peptide.api.internals.ChannelUtils +import chat.peptide.api.internals.PermissionBit +import chat.peptide.api.internals.has +import chat.peptide.api.routes.channel.react +import chat.peptide.api.routes.microservices.autumn.FileArgs +import chat.peptide.api.schemas.ChannelType +import chat.peptide.api.schemas.Message +import chat.peptide.api.settings.FeatureFlags +import chat.peptide.callbacks.Action +import chat.peptide.callbacks.ActionChannel +import chat.peptide.composables.chat.DateDivider +import chat.peptide.composables.chat.Message +import chat.peptide.composables.chat.MessageField +import chat.peptide.composables.chat.SystemMessage +import chat.peptide.composables.emoji.EmojiPicker +import chat.peptide.composables.generic.GroupIcon +import chat.peptide.composables.generic.PepTextButton +import chat.peptide.composables.generic.PresenceBadge +import chat.peptide.composables.generic.SquareButton +import chat.peptide.composables.generic.UserAvatar +import chat.peptide.composables.generic.UserAvatarWidthPlaceholder +import chat.peptide.composables.generic.presenceFromStatus +import chat.peptide.composables.media.MediaPickerGateway +import chat.peptide.composables.screens.chat.AttachmentManager +import chat.peptide.composables.screens.chat.ChannelIcon +import chat.peptide.composables.screens.chat.ReplyManager +import chat.peptide.composables.screens.chat.TypingIndicator +import chat.peptide.composables.screens.chat.atoms.RegularMessage +import chat.peptide.composables.screens.chat.molecules.JoinVoiceChannelButton +import chat.peptide.composables.skeletons.MessageSkeleton +import chat.peptide.composables.skeletons.MessageSkeletonVariant +import chat.peptide.internals.extensions.rememberChannelPermissions +import chat.peptide.internals.extensions.zero +import chat.peptide.screens.chat.LocalIsConnected +import chat.peptide.sheets.ChannelInfoSheet +import chat.peptide.sheets.MessageContextSheet +import chat.peptide.sheets.ReactSheet import com.valentinilk.shimmer.ShimmerBounds import com.valentinilk.shimmer.rememberShimmer import com.valentinilk.shimmer.shimmer @@ -154,6 +170,7 @@ import kotlinx.coroutines.launch import kotlinx.datetime.Instant import java.io.File import kotlin.math.max +import androidx.camera.core.Preview as CameraPreview sealed class ChannelScreenItem { data class RegularMessage(val message: Message) : ChannelScreenItem() @@ -176,7 +193,7 @@ sealed class ChannelScreenActivePane { private fun pxAsDp(px: Int): Dp { return ( px / ( - RevoltApplication.instance.resources + PeptideApplication.instance.resources .displayMetrics.densityDpi.toFloat() / DisplayMetrics.DENSITY_DEFAULT ) ).dp @@ -189,6 +206,7 @@ private const val NOT_ENOUGH_SPACE_FOR_PANES_THRESHOLD = 500 @Composable fun ChannelScreen( channelId: String, + messageId: String? = null, useDrawer: Boolean = false, backToChannelsScreen: (() -> Unit)?, useBackButton: Boolean = false, @@ -223,8 +241,8 @@ fun ChannelScreen( // val channelPermissions by rememberChannelPermissions(channelId, viewModel.ensuredSelfMember) - LaunchedEffect(channelId) { - viewModel.switchChannel(channelId) + LaunchedEffect(channelId, messageId) { + viewModel.switchChannel(channelId, skipInitialLoad = messageId != null) } // // @@ -294,7 +312,6 @@ fun ChannelScreen( } } } - val pickFileLauncher = rememberLauncherForActivityResult( contract = ActivityResultContracts.OpenMultipleDocuments() ) { uriList -> @@ -304,7 +321,6 @@ fun ChannelScreen( } } } - val pickMediaLauncher = rememberLauncherForActivityResult( contract = ActivityResultContracts.PickMultipleVisualMedia() ) { @@ -314,70 +330,86 @@ fun ChannelScreen( } } } - val capturedPhotoUri = rememberSaveable { mutableStateOf(null) } - val pickCameraLauncher = rememberLauncherForActivityResult( - contract = ActivityResultContracts.TakePicture() - ) { uriUpdated -> - if (uriUpdated) { - capturedPhotoUri.value?.let { uri -> - processFileUri(uri, null) - } - } - } + val lifecycleOwner = androidx.lifecycle.compose.LocalLifecycleOwner.current + val cameraProviderFuture = remember { ProcessCameraProvider.getInstance(context) } + val imageCapture = ImageCapture.Builder().setTargetRotation(ROTATION_0).build() + var showCameraSheet by remember { mutableStateOf(false) } + val capturePhoto = { + scope.launch { + try { + val cameraProvider = cameraProviderFuture.get() + // Ensure there's a camera available to bind to + val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA + if (!cameraProvider.hasCamera(cameraSelector)) { + Toast.makeText(context, "No camera available", Toast.LENGTH_SHORT).show() + Log.e("ChannelScreen", "No camera available to bind") + return@launch + } + cameraProvider.unbindAll() // Unbind previous use cases - val openCameraCallback = cb@{ - // Create a new content URI to store the captured image. - val contentResolver = - context.contentResolver - val contentValues = ContentValues().apply { - put( - MediaStore.MediaColumns.DISPLAY_NAME, - "RVL_${System.currentTimeMillis()}.jpg" - ) - put( - MediaStore.MediaColumns.MIME_TYPE, - "image/jpeg" - ) - put( - MediaStore.MediaColumns.RELATIVE_PATH, - Environment.DIRECTORY_PICTURES - ) - } + val name = "peptide-photo-${System.currentTimeMillis()}.jpg" + val contentValues = ContentValues().apply { + put(MediaStore.MediaColumns.DISPLAY_NAME, name) + put(MediaStore.MediaColumns.MIME_TYPE, "image/jpeg") + put(MediaStore.Images.Media.RELATIVE_PATH, Environment.DIRECTORY_PICTURES) + } + val outputOptions = ImageCapture.OutputFileOptions + .Builder( + context.contentResolver, + MediaStore.Images.Media.EXTERNAL_CONTENT_URI, + contentValues + ) + .build() - try { - capturedPhotoUri.value = - contentResolver.insert( - MediaStore.Images.Media.EXTERNAL_CONTENT_URI, - contentValues + // Bind use cases before taking picture + val preview = CameraPreview.Builder().build() // Dummy preview, not shown + cameraProvider.bindToLifecycle( + lifecycleOwner, + cameraSelector, + preview, // Bind a preview as it's often required + imageCapture ) - } catch (_: Exception) { - Toast.makeText( - context, - context.getString( - R.string.file_picker_chip_camera_failed - ), - Toast.LENGTH_SHORT - ).show() + imageCapture.takePicture( + outputOptions, + ContextCompat.getMainExecutor(context), + object : ImageCapture.OnImageSavedCallback { + override fun onImageSaved(output: ImageCapture.OutputFileResults) { + output.savedUri?.let { uri -> + capturedPhotoUri.value = uri + processFileUri(uri, null) + showCameraSheet = false + } + } - return@cb - } - - try { - capturedPhotoUri.value?.let { uri -> - pickCameraLauncher.launch(uri) + override fun onError(exc: ImageCaptureException) { + Toast.makeText(context, "Photo capture failed: ${exc.message}", Toast.LENGTH_SHORT).show() + Log.e("ChannelScreen", "Photo capture failed: ", exc) + } + }) + } catch (e: Exception) { + Log.e("ChannelScreen", "Error opening camera: ", e) + Toast.makeText(context, "Error opening camera: ${e.message}", Toast.LENGTH_SHORT).show() } - } catch (_: Exception) { - Toast.makeText( - context, - context.getString( - R.string.file_picker_chip_camera_none_installed - ), - Toast.LENGTH_SHORT - ).show() } } - + val cameraPermissionLauncher = rememberLauncherForActivityResult( + contract = ActivityResultContracts.RequestPermission() + ) { granted -> + if (granted) { + capturePhoto() + } else { + Toast.makeText(context, "Camera permission denied", Toast.LENGTH_SHORT).show() + } + } + val openCameraCallback = { + val granted = ContextCompat.checkSelfPermission(context, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED + if (granted) { + showCameraSheet = true + } else { + cameraPermissionLauncher.launch(Manifest.permission.CAMERA) + } + } val openDocumentPickerCallback = { pickFileLauncher.launch(arrayOf("*/*")) } @@ -394,6 +426,14 @@ fun ChannelScreen( val lazyListState = rememberLazyListState() var disableScroll by remember { mutableStateOf(false) } + // State to track the highlighted message ID and animation + var highlightedMessageId by remember { mutableStateOf(null) } + val highlightAlpha by animateFloatAsState( + targetValue = if (highlightedMessageId != null) 0.3f else 0f, + animationSpec = tween(durationMillis = 1500), + finishedListener = { highlightedMessageId = null } + ) + val isScrolledToBottom = remember(lazyListState) { derivedStateOf { lazyListState.firstVisibleItemIndex <= 6 @@ -412,22 +452,68 @@ fun ChannelScreen( } } + // Near bottom detection (reverseLayout = true): firstVisibleItemIndex small means near bottom/latest + val isNearBottom = remember(lazyListState) { + derivedStateOf { + lazyListState.firstVisibleItemIndex < 3 + } + } + val scrollDownFABPadding by animateDpAsState( if (viewModel.typingUsers.isNotEmpty()) 25.dp else 0.dp, - animationSpec = RevoltTweenDp, + animationSpec = PeptideTweenDp, label = "ScrollDownFABPadding" ) // Load more messages when we reach the top of the list // TODO: Temp - use LoadTrigger instead + messageId?.let { id -> + LaunchedEffect(id) { + Log.d("ChannelScreen", "Loading around message: $id") + // Load 60 messages centered on the target (API returns around window) + viewModel.loadMessages(amount = 60, around = id) + + // Wait until the target message appears (poll with timeout) + var attempts = 0 + var messageIndex = -1 + while (attempts < 30 && messageIndex == -1) { // ~3s max + kotlinx.coroutines.delay(100) + messageIndex = viewModel.items.indexOfFirst { item -> + when (item) { + is ChannelScreenItem.RegularMessage -> item.message.id == id + is ChannelScreenItem.SystemMessage -> item.message.id == id + else -> false + } + } + attempts++ + } + + if (messageIndex != -1) { + Log.d( + "ChannelScreen", + "Target message located at index: $messageIndex (reverseLayout=true)" + ) + // Instantly jump to the message without long animation + try { + lazyListState.scrollToItem(index = messageIndex) + highlightedMessageId = id + } catch (e: Exception) { + Log.e("ChannelScreen", "Error scrolling to message", e) + } + } else { + Log.w("ChannelScreen", "Target message not found after loading around window") + } + } + } + + // Always-on pagination collectors (work for both default and around modes) LaunchedEffect(isNearTop) { snapshotFlow { isNearTop.value } .distinctUntilChanged() - .collect { isNearTop -> - if (isNearTop) { - Log.d("ChannelScreen", "Loading more messages") - viewModel.loadMessages(before = viewModel.items.lastOrNull { + .collect { nearTop -> + if (nearTop && !viewModel.endOfChannel) { + val oldestId = viewModel.items.lastOrNull { it is ChannelScreenItem.RegularMessage || it is ChannelScreenItem.SystemMessage }?.let { when (it) { @@ -435,10 +521,65 @@ fun ChannelScreen( is ChannelScreenItem.SystemMessage -> it.message.id else -> null } - }, amount = 50) + } + if (oldestId != null) { + Log.d("ChannelScreen", "Pagination: loading older before=$oldestId") + viewModel.loadMessages( + amount = 50, + before = oldestId, + ignoreExisting = true + ) + } } } } + + LaunchedEffect(isNearBottom) { + snapshotFlow { isNearBottom.value } + .distinctUntilChanged() + .collect { nearBottom -> + if (nearBottom) { + val newestId = viewModel.items.firstOrNull { + it is ChannelScreenItem.RegularMessage || it is ChannelScreenItem.SystemMessage + }?.let { + when (it) { + is ChannelScreenItem.RegularMessage -> it.message.id + is ChannelScreenItem.SystemMessage -> it.message.id + else -> null + } + } + if (newestId != null) { + // Preserve anchor: remember current first visible item and offset + val beforeSize = viewModel.items.size + val anchorIndex = lazyListState.firstVisibleItemIndex + val anchorOffset = lazyListState.firstVisibleItemScrollOffset + Log.d( + "ChannelScreen", + "Pagination: loading newer after=$newestId (anchor index=$anchorIndex, offset=$anchorOffset, size=$beforeSize)" + ) + + viewModel.loadMessages(amount = 50, after = newestId, ignoreExisting = true) + + // Wait until items are appended to the front (after-insert path adds to front) + var attempts = 0 + while (attempts < 30) { // ~1.5s max + kotlinx.coroutines.delay(50) + val added = viewModel.items.size - beforeSize + if (added > 0) { + // Shift anchor forward by number of inserted items to keep viewport stable + try { + lazyListState.scrollToItem(anchorIndex + added, anchorOffset) + } catch (_: Exception) { + } + break + } + attempts++ + } + } + } + } + } + // // var channelInfoSheetShown by remember { mutableStateOf(false) } @@ -537,7 +678,7 @@ fun ChannelScreen( when (it.channelType) { ChannelType.DirectMessage -> { val partner = - RevoltAPI.userCache[ChannelUtils.resolveDMPartner(it)] + PeptideAPI.userCache[ChannelUtils.resolveDMPartner(it)] UserAvatar( username = it.name ?: stringResource(R.string.unknown), userId = ChannelUtils.resolveDMPartner(it) ?: "", @@ -559,7 +700,7 @@ fun ChannelScreen( ChannelIcon( channelType = it.channelType ?: ChannelType.TextChannel, modifier = Modifier - .size(24.dp) + .alpha(0.8f) ) } @@ -604,7 +745,7 @@ fun ChannelScreen( if (it.channelType == ChannelType.DirectMessage) { val partner = - RevoltAPI.userCache[ChannelUtils.resolveDMPartner(it)] + PeptideAPI.userCache[ChannelUtils.resolveDMPartner(it)] PresenceBadge( presence = presenceFromStatus( partner?.status?.presence, @@ -703,21 +844,28 @@ fun ChannelScreen( } items( - viewModel.items.size, - key = { index -> - when (val item = viewModel.items[index]) { - is ChannelScreenItem.RegularMessage -> item.message.id!! - is ChannelScreenItem.ProspectiveMessage -> item.message.id!! - is ChannelScreenItem.FailedMessage -> item.message.id!! - is ChannelScreenItem.SystemMessage -> item.message.id!! - is ChannelScreenItem.DateDivider -> item.instant.toEpochMilliseconds() - is ChannelScreenItem.LoadTrigger -> index - is ChannelScreenItem.Loading -> index + items = viewModel.items, + key = { item -> + when (item) { + is ChannelScreenItem.RegularMessage -> item.message.id + ?: "regular_null_id" + + is ChannelScreenItem.ProspectiveMessage -> item.message.id + ?: "prospective_null_id" + + is ChannelScreenItem.FailedMessage -> item.message.id + ?: "failed_null_id" + + is ChannelScreenItem.SystemMessage -> item.message.id + ?: "system_null_id" + + is ChannelScreenItem.DateDivider -> "date_${item.instant.toEpochMilliseconds()}" + is ChannelScreenItem.LoadTrigger -> "load trigger_${item.after}_${item.before}" + is ChannelScreenItem.Loading -> "loading" } }, - contentType = { index -> - when (viewModel.items.getOrNull(index)) { - null -> null + contentType = { item -> + when (item) { is ChannelScreenItem.RegularMessage -> "RegularMessage" is ChannelScreenItem.ProspectiveMessage -> "ProspectiveMessage" is ChannelScreenItem.FailedMessage -> "FailedMessage" @@ -727,32 +875,49 @@ fun ChannelScreen( is ChannelScreenItem.Loading -> "Loading" } } - ) { index -> - when (val item = viewModel.items[index]) { + ) { item -> + when (item) { is ChannelScreenItem.RegularMessage -> { - RegularMessage( - item.message, - viewModel.channel, - setDrawerGestureEnabled = { - setDrawerGestureEnabled(it) - }, - setDisableScroll = { - disableScroll = it - }, - showMessageBottomSheet = { - messageContextSheetTarget = it - messageContextSheetShown = true - }, - showReactBottomSheet = { - item.message.id?.let { - reactSheetTarget = it - reactSheetShown = true - } - }, - putTextAtCursorPosition = viewModel::putAtCursorPosition, - replyToMessage = viewModel::addReplyTo, - scope = scope - ) + // Check if this message should be highlighted + val isHighlighted = + item.message.id == highlightedMessageId + + // Apply highlight effect if needed + Box( + modifier = if (isHighlighted) { + Modifier.background( + MaterialTheme.colorScheme.primary.copy( + alpha = highlightAlpha + ) + ) + } else { + Modifier + } + ) { + RegularMessage( + item.message, + viewModel.channel, + setDrawerGestureEnabled = { + setDrawerGestureEnabled(it) + }, + setDisableScroll = { + disableScroll = it + }, + showMessageBottomSheet = { + messageContextSheetTarget = it + messageContextSheetShown = true + }, + showReactBottomSheet = { + item.message.id?.let { + reactSheetTarget = it + reactSheetShown = true + } + }, + putTextAtCursorPosition = viewModel::putAtCursorPosition, + replyToMessage = viewModel::addReplyTo, + scope = scope + ) + } } is ChannelScreenItem.ProspectiveMessage -> { @@ -803,7 +968,24 @@ fun ChannelScreen( } is ChannelScreenItem.SystemMessage -> { - SystemMessage(message = item.message) + // Check if this message should be highlighted + val isHighlighted = + item.message.id == highlightedMessageId + + // Apply highlight effect if needed + Box( + modifier = if (isHighlighted) { + Modifier.background( + MaterialTheme.colorScheme.primary.copy( + alpha = highlightAlpha + ) + ) + } else { + Modifier + } + ) { + SystemMessage(message = item.message) + } } is ChannelScreenItem.DateDivider -> { @@ -844,13 +1026,13 @@ fun ChannelScreen( androidx.compose.animation.AnimatedVisibility( !isScrolledToBottom.value, enter = slideInVertically( - animationSpec = RevoltTweenInt, + animationSpec = PeptideTweenInt, initialOffsetY = { it } - ) + fadeIn(animationSpec = RevoltTweenFloat), + ) + fadeIn(animationSpec = PeptideTweenFloat), exit = slideOutVertically( - animationSpec = RevoltTweenInt, + animationSpec = PeptideTweenInt, targetOffsetY = { it } - ) + fadeOut(animationSpec = RevoltTweenFloat) + ) + fadeOut(animationSpec = PeptideTweenFloat) ) { SmallFloatingActionButton( modifier = Modifier @@ -858,9 +1040,10 @@ fun ChannelScreen( .align(Alignment.BottomCenter) .padding(16.dp), onClick = { - scope.launch { - lazyListState.animateScrollToItem(0) - } + // Clear the around-view and reload latest messages + viewModel.reloadLatest() + // Jump to bottom instantly (latest) + scope.launch { lazyListState.scrollToItem(0) } }, contentColor = MaterialTheme.colorScheme.onSurfaceVariant, containerColor = MaterialTheme.colorScheme.surfaceVariant @@ -925,7 +1108,7 @@ fun ChannelScreen( Row( horizontalArrangement = Arrangement.spacedBy(8.dp), ) { - Button( + SquareButton( onClick = { viewModel.dismissPhysicalKeyboardSpark() }, @@ -933,7 +1116,7 @@ fun ChannelScreen( ) { Text(stringResource(R.string.spark_keyboard_shortcuts_dismiss)) } - TextButton( + PepTextButton( onClick = { (context as Activity).requestShowKeyboardShortcuts() }, @@ -954,6 +1137,49 @@ fun ChannelScreen( } } + // Full-screen camera preview sheet + if (showCameraSheet) { + val sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true) + ModalBottomSheet( + sheetState = sheetState, + onDismissRequest = { showCameraSheet = false } + ) { + Box(Modifier.fillMaxSize()) { + AndroidView( + modifier = Modifier.fillMaxSize(), + factory = { ctx -> + PreviewView(ctx).also { pv -> + pv.scaleType = PreviewView.ScaleType.FILL_CENTER + // Bind use cases when view is ready + val cameraProvider = cameraProviderFuture.get() + cameraProvider.unbindAll() + val preview = CameraPreview.Builder().build().also { pr -> + pr.surfaceProvider = pv.surfaceProvider + } + cameraProvider.bindToLifecycle( + lifecycleOwner, + CameraSelector.DEFAULT_BACK_CAMERA, + preview, + imageCapture + ) + } + } + ) + FloatingActionButton( + modifier = Modifier + .align(Alignment.BottomCenter) + .padding(24.dp), + onClick = { capturePhoto() } + ) { + Icon( + painter = painterResource(R.drawable.icn_camera_24dp), + contentDescription = stringResource(R.string.file_picker_chip_camera) + ) + } + } + } + } + Column( modifier = Modifier .background(MaterialTheme.colorScheme.surfaceContainer) @@ -1228,7 +1454,7 @@ fun ChannelScreen( ChannelScreenActivePane.None } - MediaPickerGateway( + MediaPickerGateway( onOpenPhotoPicker = { openPhotoPickerCallback() viewModel.activePane = diff --git a/app/src/main/java/chat/revolt/screens/chat/views/channel/ChannelScreenAgeGate.kt b/app/src/main/java/chat/peptide/screens/chat/views/channel/ChannelScreenAgeGate.kt similarity index 94% rename from app/src/main/java/chat/revolt/screens/chat/views/channel/ChannelScreenAgeGate.kt rename to app/src/main/java/chat/peptide/screens/chat/views/channel/ChannelScreenAgeGate.kt index 23898040..d03c5ed5 100644 --- a/app/src/main/java/chat/revolt/screens/chat/views/channel/ChannelScreenAgeGate.kt +++ b/app/src/main/java/chat/peptide/screens/chat/views/channel/ChannelScreenAgeGate.kt @@ -1,4 +1,4 @@ -package chat.revolt.screens.chat.views.channel +package chat.peptide.screens.chat.views.channel import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column @@ -29,9 +29,11 @@ import androidx.compose.ui.text.intl.Locale import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import chat.revolt.R -import chat.revolt.composables.generic.DobPicker -import chat.revolt.composables.generic.DobRegion +import chat.peptide.R +import chat.peptide.composables.generic.DobPicker +import chat.peptide.composables.generic.DobRegion +import chat.peptide.composables.generic.PepTextButton +import chat.peptide.composables.generic.SquareButton import kotlinx.datetime.Clock import kotlinx.datetime.LocalDateTime import kotlinx.datetime.TimeZone @@ -171,11 +173,11 @@ fun ChannelScreenAgeGate( Row( horizontalArrangement = Arrangement.spacedBy(8.dp, Alignment.CenterHorizontally), ) { - Button(onClick = { onDeny() }) { + SquareButton(onClick = { onDeny() }) { Text(stringResource(R.string.channel_age_gate_dob_cancel)) } - TextButton(onClick = { onAccept() }, enabled = dobValid) { + PepTextButton(onClick = { onAccept() }, enabled = dobValid) { Text(stringResource(R.string.channel_age_gate_dob_proceed)) } } diff --git a/app/src/main/java/chat/revolt/screens/chat/views/channel/ChannelScreenGeoGate.kt b/app/src/main/java/chat/peptide/screens/chat/views/channel/ChannelScreenGeoGate.kt similarity index 89% rename from app/src/main/java/chat/revolt/screens/chat/views/channel/ChannelScreenGeoGate.kt rename to app/src/main/java/chat/peptide/screens/chat/views/channel/ChannelScreenGeoGate.kt index 9fa9d6b6..eef90b15 100644 --- a/app/src/main/java/chat/revolt/screens/chat/views/channel/ChannelScreenGeoGate.kt +++ b/app/src/main/java/chat/peptide/screens/chat/views/channel/ChannelScreenGeoGate.kt @@ -1,4 +1,4 @@ -package chat.revolt.screens.chat.views.channel +package chat.peptide.screens.chat.views.channel import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Arrangement @@ -17,9 +17,10 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import chat.revolt.R -import chat.revolt.api.settings.GeoStateProvider -import chat.revolt.composables.vectorassets.GeoGateUX +import chat.peptide.R +import chat.peptide.api.settings.GeoStateProvider +import chat.peptide.composables.generic.SquareButton +import chat.peptide.composables.vectorassets.GeoGateUX @Composable fun ChannelScreenGeoGate( @@ -68,7 +69,7 @@ fun ChannelScreenGeoGate( } } - Button(onClick = { onAcknowledge() }) { + SquareButton(onClick = { onAcknowledge() }) { Text(stringResource(R.string.geogate_acknowledge)) } } diff --git a/app/src/main/java/chat/revolt/screens/chat/views/channel/ChannelScreenViewModel.kt b/app/src/main/java/chat/peptide/screens/chat/views/channel/ChannelScreenViewModel.kt similarity index 87% rename from app/src/main/java/chat/revolt/screens/chat/views/channel/ChannelScreenViewModel.kt rename to app/src/main/java/chat/peptide/screens/chat/views/channel/ChannelScreenViewModel.kt index 1402e278..e39d7daf 100644 --- a/app/src/main/java/chat/revolt/screens/chat/views/channel/ChannelScreenViewModel.kt +++ b/app/src/main/java/chat/peptide/screens/chat/views/channel/ChannelScreenViewModel.kt @@ -1,4 +1,4 @@ -package chat.revolt.screens.chat.views.channel +package chat.peptide.screens.chat.views.channel import android.util.Log import androidx.compose.runtime.getValue @@ -10,48 +10,48 @@ import androidx.compose.runtime.toMutableStateList import androidx.compose.ui.util.fastDistinctBy import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import chat.revolt.R -import chat.revolt.api.RevoltAPI -import chat.revolt.api.RevoltJson -import chat.revolt.api.internals.ChannelUtils -import chat.revolt.api.internals.PermissionBit -import chat.revolt.api.internals.Roles -import chat.revolt.api.internals.SpecialUsers -import chat.revolt.api.internals.ULID -import chat.revolt.api.internals.has -import chat.revolt.api.realtime.RealtimeSocket -import chat.revolt.api.realtime.RealtimeSocketFrames -import chat.revolt.api.realtime.frames.receivable.ChannelDeleteFrame -import chat.revolt.api.realtime.frames.receivable.ChannelStartTypingFrame -import chat.revolt.api.realtime.frames.receivable.ChannelStopTypingFrame -import chat.revolt.api.realtime.frames.receivable.MessageAppendFrame -import chat.revolt.api.realtime.frames.receivable.MessageDeleteFrame -import chat.revolt.api.realtime.frames.receivable.MessageFrame -import chat.revolt.api.realtime.frames.receivable.MessageReactFrame -import chat.revolt.api.realtime.frames.receivable.MessageUnreactFrame -import chat.revolt.api.realtime.frames.receivable.MessageUpdateFrame -import chat.revolt.api.routes.channel.SendMessageReply -import chat.revolt.api.routes.channel.ackChannel -import chat.revolt.api.routes.channel.editMessage -import chat.revolt.api.routes.channel.fetchMessagesFromChannel -import chat.revolt.api.routes.channel.sendMessage -import chat.revolt.api.routes.microservices.autumn.FileArgs -import chat.revolt.api.routes.microservices.autumn.MAX_ATTACHMENTS_PER_MESSAGE -import chat.revolt.api.routes.microservices.autumn.uploadToAutumn -import chat.revolt.api.routes.server.fetchMember -import chat.revolt.api.routes.user.addUserIfUnknown -import chat.revolt.api.routes.user.fetchUser -import chat.revolt.api.schemas.Channel -import chat.revolt.api.schemas.Message -import chat.revolt.api.settings.GeoStateProvider -import chat.revolt.callbacks.Action -import chat.revolt.callbacks.ActionChannel -import chat.revolt.callbacks.UiCallback -import chat.revolt.callbacks.UiCallbacks -import chat.revolt.internals.text.MessageProcessor -import chat.revolt.persistence.KVStorage -import chat.revolt.screens.chat.ChatRouterDestination -import chat.revolt.settings.providers.AgeGateUnlockedStorageProvider +import chat.peptide.R +import chat.peptide.api.PeptideAPI +import chat.peptide.api.PeptideJson +import chat.peptide.api.internals.ChannelUtils +import chat.peptide.api.internals.PermissionBit +import chat.peptide.api.internals.Roles +import chat.peptide.api.internals.SpecialUsers +import chat.peptide.api.internals.ULID +import chat.peptide.api.internals.has +import chat.peptide.api.realtime.RealtimeSocket +import chat.peptide.api.realtime.RealtimeSocketFrames +import chat.peptide.api.realtime.frames.receivable.ChannelDeleteFrame +import chat.peptide.api.realtime.frames.receivable.ChannelStartTypingFrame +import chat.peptide.api.realtime.frames.receivable.ChannelStopTypingFrame +import chat.peptide.api.realtime.frames.receivable.MessageAppendFrame +import chat.peptide.api.realtime.frames.receivable.MessageDeleteFrame +import chat.peptide.api.realtime.frames.receivable.MessageFrame +import chat.peptide.api.realtime.frames.receivable.MessageReactFrame +import chat.peptide.api.realtime.frames.receivable.MessageUnreactFrame +import chat.peptide.api.realtime.frames.receivable.MessageUpdateFrame +import chat.peptide.api.routes.channel.SendMessageReply +import chat.peptide.api.routes.channel.ackChannel +import chat.peptide.api.routes.channel.editMessage +import chat.peptide.api.routes.channel.fetchMessagesFromChannel +import chat.peptide.api.routes.channel.sendMessage +import chat.peptide.api.routes.microservices.autumn.FileArgs +import chat.peptide.api.routes.microservices.autumn.MAX_ATTACHMENTS_PER_MESSAGE +import chat.peptide.api.routes.microservices.autumn.uploadToAutumn +import chat.peptide.api.routes.server.fetchMember +import chat.peptide.api.routes.user.addUserIfUnknown +import chat.peptide.api.routes.user.fetchUser +import chat.peptide.api.schemas.Channel +import chat.peptide.api.schemas.Message +import chat.peptide.api.settings.GeoStateProvider +import chat.peptide.callbacks.Action +import chat.peptide.callbacks.ActionChannel +import chat.peptide.callbacks.UiCallback +import chat.peptide.callbacks.UiCallbacks +import chat.peptide.internals.text.MessageProcessor +import chat.peptide.persistence.KVStorage +import chat.peptide.screens.chat.ChatRouterDestination +import chat.peptide.settings.providers.AgeGateUnlockedStorageProvider import dagger.hilt.android.lifecycle.HiltViewModel import io.ktor.http.ContentType import kotlinx.coroutines.Dispatchers @@ -114,10 +114,10 @@ class ChannelScreenViewModel @Inject constructor( private var loadMessagesJob: Job? = null - fun switchChannel(id: String) { + fun switchChannel(id: String, skipInitialLoad: Boolean = false) { // Reset state this.loadMessagesJob?.cancel() - this.channel = RevoltAPI.channelCache[id] + this.channel = PeptideAPI.channelCache[id] this.items = mutableStateListOf(ChannelScreenItem.Loading) this.activePane = ChannelScreenActivePane.None this.typingUsers = mutableStateListOf() @@ -150,6 +150,17 @@ class ChannelScreenViewModel @Inject constructor( denyMessageFieldIfNeeded() } + if (!skipInitialLoad) { + this.loadMessages(50, markLastAsRead = true) + } + } + + fun reloadLatest() { + // Reset only message list state and fetch latest messages + this.loadMessagesJob?.cancel() + this.items = mutableStateListOf(ChannelScreenItem.Loading) + this.endOfChannel = false + this.didInitialChannelFetch = false this.loadMessages(50, markLastAsRead = true) } @@ -160,8 +171,8 @@ class ChannelScreenViewModel @Inject constructor( private suspend fun ensureSelfHasMember() { channel?.server?.let { serverId -> - RevoltAPI.selfId?.let { selfId -> - if (!RevoltAPI.members.hasMember(serverId, selfId)) { + PeptideAPI.selfId?.let { selfId -> + if (!PeptideAPI.members.hasMember(serverId, selfId)) { try { fetchMember(serverId, selfId) } catch (e: Exception) { @@ -177,13 +188,13 @@ class ChannelScreenViewModel @Inject constructor( private suspend fun denyMessageFieldIfNeeded() { if (channel == null) return - val selfUser = RevoltAPI.userCache[RevoltAPI.selfId] ?: return + val selfUser = PeptideAPI.userCache[PeptideAPI.selfId] ?: return val selfMember = if (channel!!.server == null) { null } else { channel?.server?.let { serverId -> try { - RevoltAPI.members.getMember(serverId, selfUser.id!!) ?: fetchMember( + PeptideAPI.members.getMember(serverId, selfUser.id!!) ?: fetchMember( serverId, selfUser.id ) @@ -226,7 +237,7 @@ class ChannelScreenViewModel @Inject constructor( } viewModelScope.launch { - withContext(RevoltAPI.realtimeContext) { + withContext(PeptideAPI.realtimeContext) { channel?.id?.let { RealtimeSocket.beginTyping(it) } @@ -248,7 +259,7 @@ class ChannelScreenViewModel @Inject constructor( private fun stopTyping() { if (editingMessage != null) return viewModelScope.launch { - withContext(RevoltAPI.realtimeContext) { + withContext(PeptideAPI.realtimeContext) { channel?.id?.let { RealtimeSocket.endTyping(it) } @@ -372,16 +383,16 @@ class ChannelScreenViewModel @Inject constructor( val prospectiveMessage = Message( id = nonce, channel = channel?.id, - author = RevoltAPI.selfId, + author = PeptideAPI.selfId, content = content, nonce = nonce, attachments = listOf(), replies = listOf(), tail = items.firstOrNull()?.let { if (it is ChannelScreenItem.RegularMessage) { - it.message.author == RevoltAPI.selfId + it.message.author == PeptideAPI.selfId } else if (it is ChannelScreenItem.ProspectiveMessage) { - it.message.author == RevoltAPI.selfId + it.message.author == PeptideAPI.selfId } else { false } @@ -441,22 +452,22 @@ class ChannelScreenViewModel @Inject constructor( } it.users?.forEach { user -> - if (!RevoltAPI.userCache.containsKey(user.id)) { - RevoltAPI.userCache[user.id!!] = user + if (!PeptideAPI.userCache.containsKey(user.id)) { + PeptideAPI.userCache[user.id!!] = user } } it.messages?.forEach { message -> addUserIfUnknown(message.author ?: return@forEach) - if (!RevoltAPI.messageCache.containsKey(message.id)) { - RevoltAPI.messageCache[message.id!!] = message + if (!PeptideAPI.messageCache.containsKey(message.id)) { + PeptideAPI.messageCache[message.id!!] = message } messages.add(message) } it.members?.forEach { member -> - if (!RevoltAPI.members.hasMember(member.id!!.server, member.id.user)) { - RevoltAPI.members.setMember(member.id.server, member) + if (!PeptideAPI.members.hasMember(member.id!!.server, member.id.user)) { + PeptideAPI.members.setMember(member.id.server, member) } } @@ -465,7 +476,16 @@ class ChannelScreenViewModel @Inject constructor( } } - val newItems = messages.filter { + // Ensure messages are ordered newest -> oldest consistently + val sortedMessages = messages.sortedByDescending { m -> + try { + ULID.asTimestamp(m.id ?: "0") + } catch (e: Exception) { + 0L + } + } + + val newItems = sortedMessages.filter { if (ignoreExisting) { items.none { m -> when (m) { @@ -512,10 +532,10 @@ class ChannelScreenViewModel @Inject constructor( } suspend fun listenToWsEvents() { - withContext(RevoltAPI.realtimeContext) { + withContext(PeptideAPI.realtimeContext) { flow { while (true) { - emit(RevoltAPI.wsFrameChannel.receive()) + emit(PeptideAPI.wsFrameChannel.receive()) } }.onEach { when (it) { @@ -525,8 +545,8 @@ class ChannelScreenViewModel @Inject constructor( if (items.any { m -> (m is ChannelScreenItem.RegularMessage && m.message.id == it.id) || (m is ChannelScreenItem.SystemMessage && m.message.id == it.id) }) return@onEach it.author?.let { userId -> - if (RevoltAPI.userCache[userId] == null) { - RevoltAPI.userCache[userId] = fetchUser(userId) + if (PeptideAPI.userCache[userId] == null) { + PeptideAPI.userCache[userId] = fetchUser(userId) } } channel?.server?.let { serverId -> @@ -576,7 +596,7 @@ class ChannelScreenViewModel @Inject constructor( if (it.channel != channel?.id) return@onEach val messageFrame = - RevoltJson.decodeFromJsonElement(MessageFrame.serializer(), it.data) + PeptideJson.decodeFromJsonElement(MessageFrame.serializer(), it.data) val currentMessage = items.find { m -> m is ChannelScreenItem.RegularMessage && m.message.id == it.id @@ -612,7 +632,7 @@ class ChannelScreenViewModel @Inject constructor( updateItems( items.map { currentMsg -> if (currentMsg is ChannelScreenItem.RegularMessage && currentMsg.message.id == it.id) { - RevoltAPI.messageCache[it.id]?.let { m -> + PeptideAPI.messageCache[it.id]?.let { m -> ChannelScreenItem.RegularMessage(m) } ?: return@map currentMsg } else { @@ -636,7 +656,7 @@ class ChannelScreenViewModel @Inject constructor( updateItems( items.map { currentMsg -> if (currentMsg is ChannelScreenItem.RegularMessage && currentMsg.message.id == it.id) { - RevoltAPI.messageCache[it.id]?.let { m -> + PeptideAPI.messageCache[it.id]?.let { m -> ChannelScreenItem.RegularMessage(m) } ?: return@map currentMsg } else { @@ -660,7 +680,7 @@ class ChannelScreenViewModel @Inject constructor( updateItems( items.map { currentMsg -> if (currentMsg is ChannelScreenItem.RegularMessage && currentMsg.message.id == it.id) { - RevoltAPI.messageCache[it.id]?.let { m -> + PeptideAPI.messageCache[it.id]?.let { m -> ChannelScreenItem.RegularMessage(m) } ?: return@map currentMsg } else { @@ -673,7 +693,7 @@ class ChannelScreenViewModel @Inject constructor( is ChannelStartTypingFrame -> { if (it.id != channel?.id) return@onEach if (typingUsers.contains(it.user)) return@onEach - if (it.user == RevoltAPI.selfId) return@onEach + if (it.user == PeptideAPI.selfId) return@onEach addUserIfUnknown(it.user) typingUsers.add(it.user) diff --git a/app/src/main/java/chat/revolt/screens/chooseplatform/ChoosePlatformScreen.kt b/app/src/main/java/chat/peptide/screens/chooseplatform/ChoosePlatformScreen.kt similarity index 92% rename from app/src/main/java/chat/revolt/screens/chooseplatform/ChoosePlatformScreen.kt rename to app/src/main/java/chat/peptide/screens/chooseplatform/ChoosePlatformScreen.kt index 79e57f43..b1e8c182 100644 --- a/app/src/main/java/chat/revolt/screens/chooseplatform/ChoosePlatformScreen.kt +++ b/app/src/main/java/chat/peptide/screens/chooseplatform/ChoosePlatformScreen.kt @@ -1,4 +1,4 @@ -package chat.revolt.screens.chooseplatform +package chat.peptide.screens.chooseplatform import androidx.compose.foundation.Image import androidx.compose.foundation.clickable @@ -32,10 +32,10 @@ import androidx.compose.ui.text.style.TextAlign 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 -import chat.revolt.composables.generic.SquareButton +import chat.peptide.R +import chat.peptide.api.ApplicationPlatform +import chat.peptide.api.PeptideAPI +import chat.peptide.composables.generic.SquareButton @Composable fun ChoosePlatformScreen(navController: NavController) { @@ -54,7 +54,7 @@ fun ChoosePlatformScreen(navController: NavController) { ) { Image( modifier = Modifier.padding(vertical = 24.dp), - painter = painterResource(id = R.drawable.pep_logo_wide), + painter = painterResource(id = R.drawable.peptide_logo_wide), contentDescription = "Pep Wide Logo" ) @@ -143,7 +143,7 @@ fun ChoosePlatformScreen(navController: NavController) { .padding(bottom = 8.dp) .size(72.dp) .clickable { - apiUrlValue.value = "https://api.revolt.chat" + apiUrlValue.value = "https://api.peptide.chat" }, ) { Box( @@ -152,12 +152,12 @@ fun ChoosePlatformScreen(navController: NavController) { ) { Image( painter = painterResource(id = R.drawable.ic_revolt_r), - contentDescription = "Revolt Logo" + contentDescription = "Peptide Logo" ) } } Text( - text = "Revolt", + text = "Peptide", color = MaterialTheme.colorScheme.onBackground.copy( alpha = 0.5f ), @@ -194,10 +194,10 @@ fun ChoosePlatformScreen(navController: NavController) { onClick = { if(apiUrlValue.value.isNotEmpty()){ when(apiUrlValue.value){ - ApplicationPlatform.PEP.baseUrl -> RevoltAPI.setPlatform( + ApplicationPlatform.PEP.baseUrl -> PeptideAPI.setPlatform( ApplicationPlatform.PEP ) - ApplicationPlatform.REVOLT.baseUrl -> RevoltAPI.setPlatform( + ApplicationPlatform.REVOLT.baseUrl -> PeptideAPI.setPlatform( ApplicationPlatform.REVOLT ) else -> return@SquareButton diff --git a/app/src/main/java/chat/revolt/screens/create/CreateGroupScreen.kt b/app/src/main/java/chat/peptide/screens/create/CreateGroupScreen.kt similarity index 92% rename from app/src/main/java/chat/revolt/screens/create/CreateGroupScreen.kt rename to app/src/main/java/chat/peptide/screens/create/CreateGroupScreen.kt index cdbb61ed..c8f92923 100644 --- a/app/src/main/java/chat/revolt/screens/create/CreateGroupScreen.kt +++ b/app/src/main/java/chat/peptide/screens/create/CreateGroupScreen.kt @@ -1,4 +1,4 @@ -package chat.revolt.screens.create +package chat.peptide.screens.create import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.scaleIn @@ -36,14 +36,14 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavController -import chat.revolt.R -import chat.revolt.activities.RevoltTweenFloat -import chat.revolt.api.RevoltAPI -import chat.revolt.api.internals.FriendRequests -import chat.revolt.api.routes.channel.createGroupDM -import chat.revolt.callbacks.Action -import chat.revolt.callbacks.ActionChannel -import chat.revolt.composables.chat.MemberListItem +import chat.peptide.R +import chat.peptide.activities.PeptideTweenFloat +import chat.peptide.api.PeptideAPI +import chat.peptide.api.internals.FriendRequests +import chat.peptide.api.routes.channel.createGroupDM +import chat.peptide.callbacks.Action +import chat.peptide.callbacks.ActionChannel +import chat.peptide.composables.chat.MemberListItem import kotlinx.coroutines.launch const val MAX_PEOPLE_IN_GROUP = 50 @@ -131,8 +131,8 @@ fun CreateGroupScreen( floatingActionButton = { AnimatedVisibility( visible = viewModel.groupName.isNotBlank() && viewModel.groupMembers.isNotEmpty(), - enter = scaleIn(animationSpec = RevoltTweenFloat), - exit = scaleOut(animationSpec = RevoltTweenFloat) + enter = scaleIn(animationSpec = PeptideTweenFloat), + exit = scaleOut(animationSpec = PeptideTweenFloat) ) { FloatingActionButton(onClick = { viewModel.createGroup(navController::popBackStack) }) { Icon( @@ -189,7 +189,7 @@ fun CreateGroupScreen( ) LazyColumn(contentPadding = PaddingValues(bottom = 78.0.dp)) { items(viewModel.friendsFilteredBySearch.size) { index -> - val friend = RevoltAPI.userCache[viewModel.friendsFilteredBySearch[index]] + val friend = PeptideAPI.userCache[viewModel.friendsFilteredBySearch[index]] ?: return@items val isMember = viewModel.groupMembers.contains(friend.id) diff --git a/app/src/main/java/chat/revolt/screens/labs/LabsHomeScreen.kt b/app/src/main/java/chat/peptide/screens/labs/LabsHomeScreen.kt similarity index 98% rename from app/src/main/java/chat/revolt/screens/labs/LabsHomeScreen.kt rename to app/src/main/java/chat/peptide/screens/labs/LabsHomeScreen.kt index 3f878803..f924877d 100644 --- a/app/src/main/java/chat/revolt/screens/labs/LabsHomeScreen.kt +++ b/app/src/main/java/chat/peptide/screens/labs/LabsHomeScreen.kt @@ -1,4 +1,4 @@ -package chat.revolt.screens.labs +package chat.peptide.screens.labs import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement @@ -35,8 +35,8 @@ import androidx.compose.ui.text.buildAnnotatedString import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.navigation.NavController -import chat.revolt.R -import chat.revolt.ui.theme.FragmentMono +import chat.peptide.R +import chat.peptide.ui.theme.FragmentMono enum class LabsHomeScreenTab { Home, @@ -193,13 +193,13 @@ fun LabsHomeScreen(navController: NavController, topNav: NavController) { headlineContent = { Text(buildAnnotatedString { pushStyle(SpanStyle(fontFamily = FragmentMono)) - append("librevolt") + append("libpeptide") pop() append(" Sample") }) }, modifier = Modifier.clickable { - navController.navigate("sandboxes/librevolt") + navController.navigate("sandboxes/libpeptide") } ) HorizontalDivider() diff --git a/app/src/main/java/chat/revolt/screens/labs/LabsRootScreen.kt b/app/src/main/java/chat/peptide/screens/labs/LabsRootScreen.kt similarity index 80% rename from app/src/main/java/chat/revolt/screens/labs/LabsRootScreen.kt rename to app/src/main/java/chat/peptide/screens/labs/LabsRootScreen.kt index a4f81a9e..52030a99 100644 --- a/app/src/main/java/chat/revolt/screens/labs/LabsRootScreen.kt +++ b/app/src/main/java/chat/peptide/screens/labs/LabsRootScreen.kt @@ -1,4 +1,4 @@ -package chat.revolt.screens.labs +package chat.peptide.screens.labs import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize @@ -11,12 +11,13 @@ import androidx.navigation.NavController import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController -import chat.revolt.api.settings.FeatureFlags -import chat.revolt.screens.labs.ui.mockups.NewLoginExperienceMockup -import chat.revolt.screens.labs.ui.sandbox.CoreLibSandbox -import chat.revolt.screens.labs.ui.sandbox.GradientEditorSandbox -import chat.revolt.screens.labs.ui.sandbox.JBMSandbox -import chat.revolt.screens.labs.ui.sandbox.SettingsDslSandbox +import chat.peptide.api.settings.FeatureFlags +import chat.peptide.composables.generic.PepTextButton +import chat.peptide.screens.labs.ui.mockups.NewLoginExperienceMockup +import chat.peptide.screens.labs.ui.sandbox.CoreLibSandbox +import chat.peptide.screens.labs.ui.sandbox.GradientEditorSandbox +import chat.peptide.screens.labs.ui.sandbox.JBMSandbox +import chat.peptide.screens.labs.ui.sandbox.SettingsDslSandbox annotation class LabsFeature @@ -26,7 +27,7 @@ fun LabsGuard(onTurnBack: () -> Unit = {}, content: @Composable () -> Unit) { AlertDialog( onDismissRequest = { onTurnBack() }, confirmButton = { - TextButton(onClick = { onTurnBack() }) { + PepTextButton(onClick = { onTurnBack() }) { Text("Turn back") } }, @@ -76,7 +77,7 @@ fun LabsRootScreen(topNav: NavController) { composable("sandboxes/gradienteditor") { GradientEditorSandbox(labsNav) } - composable("sandboxes/librevolt") { + composable("sandboxes/libpeptide") { CoreLibSandbox(labsNav) } } diff --git a/app/src/main/java/chat/revolt/screens/labs/ui/mockups/NewLoginExperienceMockup.kt b/app/src/main/java/chat/peptide/screens/labs/ui/mockups/NewLoginExperienceMockup.kt similarity index 92% rename from app/src/main/java/chat/revolt/screens/labs/ui/mockups/NewLoginExperienceMockup.kt rename to app/src/main/java/chat/peptide/screens/labs/ui/mockups/NewLoginExperienceMockup.kt index e23d1cbf..0972b99c 100644 --- a/app/src/main/java/chat/revolt/screens/labs/ui/mockups/NewLoginExperienceMockup.kt +++ b/app/src/main/java/chat/peptide/screens/labs/ui/mockups/NewLoginExperienceMockup.kt @@ -1,4 +1,4 @@ -package chat.revolt.screens.labs.ui.mockups +package chat.peptide.screens.labs.ui.mockups import androidx.compose.animation.core.tween import androidx.compose.animation.slideIn @@ -36,9 +36,11 @@ import androidx.navigation.NavController import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController -import chat.revolt.R -import chat.revolt.api.settings.LoadedSettings -import chat.revolt.ui.theme.Theme +import chat.peptide.R +import chat.peptide.api.settings.LoadedSettings +import chat.peptide.composables.generic.PepTextButton +import chat.peptide.composables.generic.SquareButton +import chat.peptide.ui.theme.Theme @OptIn(ExperimentalMaterial3ExpressiveApi::class) @Composable @@ -94,7 +96,7 @@ fun NewLoginExperienceMockup(navController: NavController) { ) { Spacer(modifier = Modifier.height(64.dp)) Image( - painter = painterResource(R.drawable.revolt_logo_wide), + painter = painterResource(R.drawable.peptide_logo_wide), contentDescription = null, colorFilter = if (LoadedSettings.theme == Theme.M3Dynamic) ColorFilter.tint( MaterialTheme.colorScheme.onBackground @@ -109,7 +111,7 @@ fun NewLoginExperienceMockup(navController: NavController) { ) Spacer(modifier = Modifier.height(16.dp)) Text( - "Revolt is the chat app that’s truly built with you in mind.", + "Peptide is the chat app that’s truly built with you in mind.", style = MaterialTheme.typography.bodyLargeEmphasized, fontSize = 18.sp, textAlign = TextAlign.Center @@ -126,13 +128,13 @@ fun NewLoginExperienceMockup(navController: NavController) { .padding(horizontal = 16.dp) .widthIn(max = 150.dp) ) { - Button( + SquareButton( onClick = { loginNav.navigate("login") }, modifier = Modifier.fillMaxWidth() ) { Text("Log In") } - TextButton( + PepTextButton( onClick = { navController.popBackStack() }, modifier = Modifier.fillMaxWidth() ) { @@ -149,7 +151,7 @@ fun NewLoginExperienceMockup(navController: NavController) { .fillMaxSize() .background(Color.Blue), Alignment.Center ) { - Button(onClick = { loginNav.navigate("greet") }) { + SquareButton(onClick = { loginNav.navigate("greet") }) { Text("Greetings!") } } diff --git a/app/src/main/java/chat/revolt/screens/labs/ui/sandbox/CoreLibSandbox.kt b/app/src/main/java/chat/peptide/screens/labs/ui/sandbox/CoreLibSandbox.kt similarity index 80% rename from app/src/main/java/chat/revolt/screens/labs/ui/sandbox/CoreLibSandbox.kt rename to app/src/main/java/chat/peptide/screens/labs/ui/sandbox/CoreLibSandbox.kt index ddee7d68..6db1888a 100644 --- a/app/src/main/java/chat/revolt/screens/labs/ui/sandbox/CoreLibSandbox.kt +++ b/app/src/main/java/chat/peptide/screens/labs/ui/sandbox/CoreLibSandbox.kt @@ -1,6 +1,5 @@ -package chat.revolt.screens.labs.ui.sandbox +package chat.peptide.screens.labs.ui.sandbox -import androidx.compose.material3.Button import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue @@ -11,8 +10,9 @@ import androidx.compose.ui.text.SpanStyle import androidx.compose.ui.text.buildAnnotatedString import androidx.compose.ui.text.style.TextOverflow import androidx.navigation.NavController -import chat.revolt.settings.dsl.SettingsPage -import chat.revolt.ui.theme.FragmentMono +import chat.peptide.composables.generic.SquareButton +import chat.peptide.settings.dsl.SettingsPage +import chat.peptide.ui.theme.FragmentMono @Composable fun CoreLibSandbox(navController: NavController) { @@ -24,7 +24,7 @@ fun CoreLibSandbox(navController: NavController) { Text( text = buildAnnotatedString { pushStyle(SpanStyle(fontFamily = FragmentMono)) - append("librevolt") + append("libpeptide") pop() append(" Sample") }, @@ -33,7 +33,7 @@ fun CoreLibSandbox(navController: NavController) { ) } ) { - Button(onClick = { + SquareButton(onClick = { greeting = librevolt.greet() }) { Text("Greet") diff --git a/app/src/main/java/chat/revolt/screens/labs/ui/sandbox/GradientEditorSandbox.kt b/app/src/main/java/chat/peptide/screens/labs/ui/sandbox/GradientEditorSandbox.kt similarity index 88% rename from app/src/main/java/chat/revolt/screens/labs/ui/sandbox/GradientEditorSandbox.kt rename to app/src/main/java/chat/peptide/screens/labs/ui/sandbox/GradientEditorSandbox.kt index d2287b37..9a51ff9a 100644 --- a/app/src/main/java/chat/revolt/screens/labs/ui/sandbox/GradientEditorSandbox.kt +++ b/app/src/main/java/chat/peptide/screens/labs/ui/sandbox/GradientEditorSandbox.kt @@ -1,4 +1,4 @@ -package chat.revolt.screens.labs.ui.sandbox +package chat.peptide.screens.labs.ui.sandbox import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.height @@ -15,8 +15,9 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.navigation.NavController -import chat.revolt.composables.generic.GradientStopEditor -import chat.revolt.settings.dsl.SettingsPage +import chat.peptide.composables.generic.GradientStopEditor +import chat.peptide.composables.generic.PepTextButton +import chat.peptide.settings.dsl.SettingsPage @Composable fun GradientEditorSandbox(navController: NavController) { @@ -35,7 +36,7 @@ fun GradientEditorSandbox(navController: NavController) { Row( verticalAlignment = Alignment.CenterVertically ) { - TextButton( + PepTextButton( onClick = { if (segmentCount >= 2) segmentCount-- @@ -50,7 +51,7 @@ fun GradientEditorSandbox(navController: NavController) { modifier = Modifier.weight(1f), textAlign = TextAlign.Center ) - TextButton( + PepTextButton( onClick = { segmentCount++ }, modifier = Modifier.weight(1f) ) { diff --git a/app/src/main/java/chat/revolt/screens/labs/ui/sandbox/JBMSandbox.kt b/app/src/main/java/chat/peptide/screens/labs/ui/sandbox/JBMSandbox.kt similarity index 85% rename from app/src/main/java/chat/revolt/screens/labs/ui/sandbox/JBMSandbox.kt rename to app/src/main/java/chat/peptide/screens/labs/ui/sandbox/JBMSandbox.kt index 6684d2d2..ce49b0b5 100644 --- a/app/src/main/java/chat/revolt/screens/labs/ui/sandbox/JBMSandbox.kt +++ b/app/src/main/java/chat/peptide/screens/labs/ui/sandbox/JBMSandbox.kt @@ -1,4 +1,4 @@ -package chat.revolt.screens.labs.ui.sandbox +package chat.peptide.screens.labs.ui.sandbox import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer @@ -19,10 +19,11 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.navigation.NavController -import chat.revolt.markdown.jbm.JBM -import chat.revolt.markdown.jbm.JBMRenderer -import chat.revolt.markdown.jbm.LocalJBMarkdownTreeState -import chat.revolt.settings.dsl.SettingsPage +import chat.peptide.composables.generic.PepTextButton +import chat.peptide.markdown.jbm.JBM +import chat.peptide.markdown.jbm.JBMRenderer +import chat.peptide.markdown.jbm.LocalJBMarkdownTreeState +import chat.peptide.settings.dsl.SettingsPage @OptIn(JBM::class) @Composable @@ -65,16 +66,16 @@ fun JBMSandbox(navController: NavController) { modifier = Modifier.fillMaxWidth() ) - TextButton(onClick = { + PepTextButton(onClick = { submitMdSource = mdSource }) { Text("Submit") } - TextButton(onClick = { + PepTextButton(onClick = { submitMdSource = """# Full range of MD now supported! 1. Text with **bold**, *italics*, and ***both***! 2. You ~~can't see me~~. -3. [I'm a link to another website.]() +3. [I'm a link to another website.]() 4. I'm a spoiler with ||**bold text inside it**|| - I'm a sub-item on this list... - Let's go even deeper... @@ -91,7 +92,7 @@ let x = "I'm a multi-line code block!"; | Timestamp | Mention | Channel Link | Message Link | |:-:|:-:|:-:|:-:| -| | <@01EX2NCWQ0CHS3QJF0FEQS1GR4> | <#01H73F4RAHTPBHKJ1XBQDXK3NQ> | https://revolt.chat/server/01F7ZSBSFHQ8TA81725KQCSDDP/channel/01F92C5ZXBQWQ8KY7J8KY917NM/01J25XZM9JXVVJDDKFPB7Q48HZ |""" +| | <@01EX2NCWQ0CHS3QJF0FEQS1GR4> | <#01H73F4RAHTPBHKJ1XBQDXK3NQ> | https://peptide.chat/server/01F7ZSBSFHQ8TA81725KQCSDDP/channel/01F92C5ZXBQWQ8KY7J8KY917NM/01J25XZM9JXVVJDDKFPB7Q48HZ |""" }) { Text("Submit test document") } diff --git a/app/src/main/java/chat/revolt/screens/labs/ui/sandbox/SettingsDslSandbox.kt b/app/src/main/java/chat/peptide/screens/labs/ui/sandbox/SettingsDslSandbox.kt similarity index 87% rename from app/src/main/java/chat/revolt/screens/labs/ui/sandbox/SettingsDslSandbox.kt rename to app/src/main/java/chat/peptide/screens/labs/ui/sandbox/SettingsDslSandbox.kt index 11e9bc4e..865cd13d 100644 --- a/app/src/main/java/chat/revolt/screens/labs/ui/sandbox/SettingsDslSandbox.kt +++ b/app/src/main/java/chat/peptide/screens/labs/ui/sandbox/SettingsDslSandbox.kt @@ -1,11 +1,11 @@ -package chat.revolt.screens.labs.ui.sandbox +package chat.peptide.screens.labs.ui.sandbox import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.text.style.TextOverflow import androidx.navigation.NavController -import chat.revolt.settings.dsl.SettingsPage -import chat.revolt.settings.dsl.SubcategoryContentInsets +import chat.peptide.settings.dsl.SettingsPage +import chat.peptide.settings.dsl.SubcategoryContentInsets enum class SettingsDslSandboxTab { General, diff --git a/app/src/main/java/chat/revolt/screens/login/LoginGreetingScreen.kt b/app/src/main/java/chat/peptide/screens/login/LoginGreetingScreen.kt similarity index 95% rename from app/src/main/java/chat/revolt/screens/login/LoginGreetingScreen.kt rename to app/src/main/java/chat/peptide/screens/login/LoginGreetingScreen.kt index c538463a..0d426574 100644 --- a/app/src/main/java/chat/revolt/screens/login/LoginGreetingScreen.kt +++ b/app/src/main/java/chat/peptide/screens/login/LoginGreetingScreen.kt @@ -1,4 +1,4 @@ -package chat.revolt.screens.login +package chat.peptide.screens.login import android.widget.Toast import androidx.compose.animation.AnimatedVisibility @@ -38,9 +38,10 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.navigation.NavController import androidx.navigation.compose.rememberNavController -import chat.revolt.R -import chat.revolt.composables.generic.SquareButton -import chat.revolt.composables.generic.SquareElevatedButton +import chat.peptide.R +import chat.peptide.composables.generic.PepTextButton +import chat.peptide.composables.generic.SquareButton +import chat.peptide.composables.generic.SquareElevatedButton @OptIn(ExperimentalFoundationApi::class) @Composable @@ -65,7 +66,7 @@ fun LoginGreetingScreen(navController: NavController) { ) { Image( painter = painterResource(id = R.drawable.onboarding_fly_image), - contentDescription = "Revolt Logo", + contentDescription = "Peptide Logo", contentScale = ContentScale.Fit, modifier = Modifier .padding(bottom = 16.dp) @@ -151,7 +152,7 @@ fun LoginGreetingScreen(navController: NavController) { AnimatedVisibility(showBoringButton) { Spacer(modifier = Modifier.height(10.dp)) - TextButton( + PepTextButton( onClick = { navController.navigate("login2/init") }, modifier = Modifier .fillMaxWidth() diff --git a/app/src/main/java/chat/revolt/screens/login/LoginScreen.kt b/app/src/main/java/chat/peptide/screens/login/LoginScreen.kt similarity index 93% rename from app/src/main/java/chat/revolt/screens/login/LoginScreen.kt rename to app/src/main/java/chat/peptide/screens/login/LoginScreen.kt index 180e4af1..c612b609 100644 --- a/app/src/main/java/chat/revolt/screens/login/LoginScreen.kt +++ b/app/src/main/java/chat/peptide/screens/login/LoginScreen.kt @@ -1,4 +1,4 @@ -package chat.revolt.screens.login +package chat.peptide.screens.login import android.util.Log import androidx.compose.foundation.Image @@ -49,17 +49,17 @@ import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import androidx.navigation.NavController -import chat.revolt.R -import chat.revolt.RevoltApplication -import chat.revolt.api.RevoltAPI -import chat.revolt.api.routes.account.EmailPasswordAssessment -import chat.revolt.api.routes.account.negotiateAuthentication -import chat.revolt.api.routes.onboard.needsOnboarding -import chat.revolt.composables.generic.FormTextField -import chat.revolt.composables.generic.SquareButton -import chat.revolt.composables.generic.Weblink -import chat.revolt.persistence.KVStorage -import chat.revolt.ui.theme.FragmentMono +import chat.peptide.R +import chat.peptide.PeptideApplication +import chat.peptide.api.PeptideAPI +import chat.peptide.api.routes.account.EmailPasswordAssessment +import chat.peptide.api.routes.account.negotiateAuthentication +import chat.peptide.api.routes.onboard.needsOnboarding +import chat.peptide.composables.generic.FormTextField +import chat.peptide.composables.generic.SquareButton +import chat.peptide.composables.generic.Weblink +import chat.peptide.persistence.KVStorage +import chat.peptide.ui.theme.FragmentMono import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch import javax.inject.Inject @@ -96,7 +96,7 @@ class LoginViewModel @Inject constructor( negotiateAuthentication(_email, _password) } catch (e: Exception) { _error = if (e.message?.startsWith("Unexpected JSON token") == true) { - RevoltApplication.instance.getString(R.string.service_health_alert_body_default) + PeptideApplication.instance.getString(R.string.service_health_alert_body_default) } else e.message ?: "Unknown error" return@launch } @@ -127,8 +127,8 @@ class LoginViewModel @Inject constructor( return@launch } - RevoltAPI.loginAs(token) - RevoltAPI.setSessionId(response.firstUserHints.token) + PeptideAPI.loginAs(token) + PeptideAPI.setSessionId(response.firstUserHints.token) _navigateTo = "home" } catch (e: Error) { @@ -331,7 +331,7 @@ fun LoginScreen(navController: NavController, viewModel: LoginViewModel = hiltVi ) Weblink( text = stringResource(R.string.password_forgot), - url = "${RevoltAPI.getCurrentAppUrl()}/login/reset", + url = "${PeptideAPI.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/login/MfaScreen.kt b/app/src/main/java/chat/peptide/screens/login/MfaScreen.kt similarity index 93% rename from app/src/main/java/chat/revolt/screens/login/MfaScreen.kt rename to app/src/main/java/chat/peptide/screens/login/MfaScreen.kt index effa1085..3c920dd3 100644 --- a/app/src/main/java/chat/revolt/screens/login/MfaScreen.kt +++ b/app/src/main/java/chat/peptide/screens/login/MfaScreen.kt @@ -1,4 +1,4 @@ -package chat.revolt.screens.login +package chat.peptide.screens.login import android.util.Log import androidx.compose.foundation.Image @@ -36,15 +36,16 @@ import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import androidx.navigation.NavController -import chat.revolt.R -import chat.revolt.api.RevoltAPI -import chat.revolt.api.routes.account.MfaResponseRecoveryCode -import chat.revolt.api.routes.account.MfaResponseTotpCode -import chat.revolt.api.routes.account.authenticateWithMfaRecoveryCode -import chat.revolt.api.routes.account.authenticateWithMfaTotpCode -import chat.revolt.composables.generic.CollapsibleCard -import chat.revolt.composables.generic.FormTextField -import chat.revolt.persistence.KVStorage +import chat.peptide.R +import chat.peptide.api.PeptideAPI +import chat.peptide.api.routes.account.MfaResponseRecoveryCode +import chat.peptide.api.routes.account.MfaResponseTotpCode +import chat.peptide.api.routes.account.authenticateWithMfaRecoveryCode +import chat.peptide.api.routes.account.authenticateWithMfaTotpCode +import chat.peptide.composables.generic.CollapsibleCard +import chat.peptide.composables.generic.FormTextField +import chat.peptide.composables.generic.SquareButton +import chat.peptide.persistence.KVStorage import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch import javax.inject.Inject @@ -93,8 +94,8 @@ class MfaScreenViewModel @Inject constructor( val token = response.firstUserHints!!.token val id = response.firstUserHints.id - RevoltAPI.loginAs(token) - RevoltAPI.setSessionId(id) + PeptideAPI.loginAs(token) + PeptideAPI.setSessionId(id) kvStorage.set("sessionToken", token) kvStorage.set("sessionId", id) @@ -123,8 +124,8 @@ class MfaScreenViewModel @Inject constructor( val token = response.firstUserHints!!.token val id = response.firstUserHints.id - RevoltAPI.loginAs(token) - RevoltAPI.setSessionId(id) + PeptideAPI.loginAs(token) + PeptideAPI.setSessionId(id) kvStorage.set("sessionToken", token) kvStorage.set("sessionId", id) @@ -255,7 +256,7 @@ fun MfaScreen( value = viewModel.totpCode ) - Button( + SquareButton( onClick = { viewModel.tryAuthorizeTotp(mfaTicket) }, modifier = Modifier .padding(horizontal = 20.dp, vertical = 10.dp) @@ -309,7 +310,7 @@ fun MfaScreen( value = viewModel.recoveryCode ) - Button( + SquareButton( onClick = { viewModel.tryAuthorizeRecovery(mfaTicket) }, modifier = Modifier .padding(horizontal = 20.dp, vertical = 10.dp) diff --git a/app/src/main/java/chat/revolt/screens/login2/InitScreen.kt b/app/src/main/java/chat/peptide/screens/login2/InitScreen.kt similarity index 87% rename from app/src/main/java/chat/revolt/screens/login2/InitScreen.kt rename to app/src/main/java/chat/peptide/screens/login2/InitScreen.kt index 7090add8..cb5728b9 100644 --- a/app/src/main/java/chat/revolt/screens/login2/InitScreen.kt +++ b/app/src/main/java/chat/peptide/screens/login2/InitScreen.kt @@ -1,4 +1,4 @@ -package chat.revolt.screens.login2 +package chat.peptide.screens.login2 import android.content.Intent import android.net.Uri @@ -33,13 +33,15 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.navigation.NavController -import chat.revolt.BuildConfig -import chat.revolt.R -import chat.revolt.api.RevoltAPI -import chat.revolt.api.settings.LoadedSettings -import chat.revolt.composables.generic.AnyLink -import chat.revolt.composables.generic.Weblink -import chat.revolt.ui.theme.Theme +import chat.peptide.BuildConfig +import chat.peptide.R +import chat.peptide.api.PeptideAPI +import chat.peptide.api.settings.LoadedSettings +import chat.peptide.composables.generic.AnyLink +import chat.peptide.composables.generic.PepTextButton +import chat.peptide.composables.generic.SquareButton +import chat.peptide.composables.generic.Weblink +import chat.peptide.ui.theme.Theme import com.chuckerteam.chucker.api.Chucker @Composable @@ -101,7 +103,7 @@ private fun LeadPart(windowSizeClass: WindowSizeClass) { Spacer(Modifier.height(64.dp)) } Image( - painter = painterResource(R.drawable.revolt_logo_wide), + painter = painterResource(R.drawable.peptide_logo_wide), contentDescription = null, colorFilter = ColorFilter.tint( MaterialTheme.colorScheme.onBackground @@ -117,7 +119,7 @@ private fun LeadPart(windowSizeClass: WindowSizeClass) { ) Spacer(modifier = Modifier.height(16.dp)) Text( - "Revolt is the chat app that’s truly built with you in mind.", // FIXME hardcoded string + "Peptide is the chat app that’s truly built with you in mind.", // FIXME hardcoded string style = MaterialTheme.typography.bodyLarge, fontSize = 18.sp, textAlign = TextAlign.Center @@ -140,13 +142,13 @@ private fun LinkPart(windowSizeClass: WindowSizeClass) { .fillMaxWidth() ) { Column(Modifier.widthIn(max = 150.dp)) { - Button( + SquareButton( onClick = {/* navController.navigate("login2/existing/details") */ }, modifier = Modifier.fillMaxWidth() ) { Text("Log In") // FIXME hardcoded string } - TextButton( + PepTextButton( onClick = {/* navController.navigate("login2/new/details") */ }, modifier = Modifier.fillMaxWidth() ) { @@ -158,15 +160,15 @@ private fun LinkPart(windowSizeClass: WindowSizeClass) { Weblink( text = stringResource(R.string.terms_of_service), - url = "${RevoltAPI.getCurrentMarketingUrl()}/terms" + url = "${PeptideAPI.getCurrentMarketingUrl()}/terms" ) Weblink( text = stringResource(R.string.privacy_policy), - url = "${RevoltAPI.getCurrentMarketingUrl()}/privacy" + url = "${PeptideAPI.getCurrentMarketingUrl()}/privacy" ) Weblink( text = stringResource(R.string.community_guidelines), - url = "${RevoltAPI.getCurrentMarketingUrl()}/aup" + url = "${PeptideAPI.getCurrentMarketingUrl()}/aup" ) if (BuildConfig.DEBUG) { diff --git a/app/src/main/java/chat/revolt/screens/main/ConversationsScreen.kt b/app/src/main/java/chat/peptide/screens/main/ConversationsScreen.kt similarity index 88% rename from app/src/main/java/chat/revolt/screens/main/ConversationsScreen.kt rename to app/src/main/java/chat/peptide/screens/main/ConversationsScreen.kt index 22cb903e..d8413d15 100644 --- a/app/src/main/java/chat/revolt/screens/main/ConversationsScreen.kt +++ b/app/src/main/java/chat/peptide/screens/main/ConversationsScreen.kt @@ -1,4 +1,4 @@ -package chat.revolt.screens.main +package chat.peptide.screens.main import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box @@ -29,13 +29,13 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.navigation.NavController -import chat.revolt.R -import chat.revolt.api.RevoltAPI -import chat.revolt.api.schemas.ChannelType -import chat.revolt.api.schemas.User -import chat.revolt.api.settings.LoadedSettings -import chat.revolt.composables.generic.UserAvatar -import chat.revolt.internals.extensions.zero +import chat.peptide.R +import chat.peptide.api.PeptideAPI +import chat.peptide.api.schemas.ChannelType +import chat.peptide.api.schemas.User +import chat.peptide.api.settings.LoadedSettings +import chat.peptide.composables.generic.UserAvatar +import chat.peptide.internals.extensions.zero // Note - this is not a traditional screen per se, as it is a part of the main screen @OptIn(ExperimentalMaterial3Api::class) @@ -43,7 +43,7 @@ import chat.revolt.internals.extensions.zero fun ConversationsScreen(navController: NavController) { val context = LocalContext.current val dmAbleChannels = - RevoltAPI.channelCache.values + PeptideAPI.channelCache.values .filter { it.channelType == ChannelType.DirectMessage || it.channelType == ChannelType.Group } .filter { if (it.channelType == ChannelType.DirectMessage) it.active == true else true } .sortedBy { it.lastMessageID ?: it.id } @@ -63,13 +63,13 @@ fun ConversationsScreen(navController: NavController) { ) { item(key = "saved_messages") { val notesChannel = - RevoltAPI.channelCache.values.firstOrNull { it.channelType == ChannelType.SavedMessages } - val lastMessage = notesChannel?.lastMessageID?.let { RevoltAPI.messageCache[it] } + PeptideAPI.channelCache.values.firstOrNull { it.channelType == ChannelType.SavedMessages } + val lastMessage = notesChannel?.lastMessageID?.let { PeptideAPI.messageCache[it] } val hasAttachments = remember { context.getString(R.string.reply_message_empty_has_attachments) } val preview = remember(lastMessage) { - (RevoltAPI.userCache[RevoltAPI.selfId]?.let { + (PeptideAPI.userCache[PeptideAPI.selfId]?.let { User.resolveDefaultName( it ) @@ -93,7 +93,7 @@ fun ConversationsScreen(navController: NavController) { }, leadingContent = { Box(contentAlignment = Alignment.TopEnd) { - RevoltAPI.userCache[RevoltAPI.selfId]?.let { + PeptideAPI.userCache[PeptideAPI.selfId]?.let { UserAvatar( username = it.username.toString(), avatar = it.avatar, diff --git a/app/src/main/java/chat/revolt/screens/main/MainScreen.kt b/app/src/main/java/chat/peptide/screens/main/MainScreen.kt similarity index 97% rename from app/src/main/java/chat/revolt/screens/main/MainScreen.kt rename to app/src/main/java/chat/peptide/screens/main/MainScreen.kt index afb3b3d1..94cebda1 100644 --- a/app/src/main/java/chat/revolt/screens/main/MainScreen.kt +++ b/app/src/main/java/chat/peptide/screens/main/MainScreen.kt @@ -1,4 +1,4 @@ -package chat.revolt.screens.main +package chat.peptide.screens.main import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.padding @@ -16,8 +16,8 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.navigation.NavController -import chat.revolt.R -import chat.revolt.screens.chat.views.OverviewScreen +import chat.peptide.R +import chat.peptide.screens.chat.views.OverviewScreen enum class MainScreenTab { Communities, diff --git a/app/src/main/java/chat/revolt/screens/register/OnboardingScreen.kt b/app/src/main/java/chat/peptide/screens/register/OnboardingScreen.kt similarity index 95% rename from app/src/main/java/chat/revolt/screens/register/OnboardingScreen.kt rename to app/src/main/java/chat/peptide/screens/register/OnboardingScreen.kt index d21decf6..df813666 100644 --- a/app/src/main/java/chat/revolt/screens/register/OnboardingScreen.kt +++ b/app/src/main/java/chat/peptide/screens/register/OnboardingScreen.kt @@ -1,4 +1,4 @@ -package chat.revolt.screens.register +package chat.peptide.screens.register import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Arrangement @@ -30,12 +30,12 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp 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.FormTextField -import chat.revolt.composables.generic.SquareButton -import chat.revolt.persistence.KVStorage +import chat.peptide.R +import chat.peptide.api.routes.onboard.OnboardingCompletionBody +import chat.peptide.api.routes.onboard.completeOnboarding +import chat.peptide.composables.generic.FormTextField +import chat.peptide.composables.generic.SquareButton +import chat.peptide.persistence.KVStorage import kotlinx.coroutines.launch @OptIn(ExperimentalLayoutApi::class) diff --git a/app/src/main/java/chat/revolt/screens/register/RegisterDetailsScreen.kt b/app/src/main/java/chat/peptide/screens/register/RegisterDetailsScreen.kt similarity index 95% rename from app/src/main/java/chat/revolt/screens/register/RegisterDetailsScreen.kt rename to app/src/main/java/chat/peptide/screens/register/RegisterDetailsScreen.kt index 31483187..a5f3f96e 100644 --- a/app/src/main/java/chat/revolt/screens/register/RegisterDetailsScreen.kt +++ b/app/src/main/java/chat/peptide/screens/register/RegisterDetailsScreen.kt @@ -1,4 +1,4 @@ -package chat.revolt.screens.register +package chat.peptide.screens.register import android.content.Context import androidx.compose.foundation.Image @@ -44,13 +44,13 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavController -import chat.revolt.R -import chat.revolt.RevoltApplication -import chat.revolt.api.routes.account.RegistrationBody -import chat.revolt.api.routes.account.register -import chat.revolt.api.routes.misc.getRootRoute -import chat.revolt.composables.generic.FormTextField -import chat.revolt.composables.generic.SquareButton +import chat.peptide.R +import chat.peptide.PeptideApplication +import chat.peptide.api.routes.account.RegistrationBody +import chat.peptide.api.routes.account.register +import chat.peptide.api.routes.misc.getRootRoute +import chat.peptide.composables.generic.FormTextField +import chat.peptide.composables.generic.SquareButton import com.hcaptcha.sdk.HCaptcha import com.hcaptcha.sdk.HCaptchaConfig import com.hcaptcha.sdk.HCaptchaSize @@ -69,7 +69,7 @@ class RegisterDetailsScreenViewModel : ViewModel() { getRootRoute() } catch (e: Exception) { error = if (e.message?.startsWith("Expected response body of the type") == true) { - RevoltApplication.instance.getString(R.string.service_health_alert_body_default) + PeptideApplication.instance.getString(R.string.service_health_alert_body_default) } else e.message return@launch } diff --git a/app/src/main/java/chat/revolt/screens/register/RegisterGreetingScreen.kt b/app/src/main/java/chat/peptide/screens/register/RegisterGreetingScreen.kt similarity index 91% rename from app/src/main/java/chat/revolt/screens/register/RegisterGreetingScreen.kt rename to app/src/main/java/chat/peptide/screens/register/RegisterGreetingScreen.kt index 279fe19f..27d86f56 100644 --- a/app/src/main/java/chat/revolt/screens/register/RegisterGreetingScreen.kt +++ b/app/src/main/java/chat/peptide/screens/register/RegisterGreetingScreen.kt @@ -1,4 +1,4 @@ -package chat.revolt.screens.register +package chat.peptide.screens.register import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Arrangement @@ -26,7 +26,9 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.navigation.NavController -import chat.revolt.R +import chat.peptide.R +import chat.peptide.composables.generic.PepTextButton +import chat.peptide.composables.generic.SquareButton @Composable fun RegisterGreetingScreen(navController: NavController) { @@ -59,7 +61,7 @@ fun RegisterGreetingScreen(navController: NavController) { Spacer(modifier = Modifier.height(20.dp)) Image( - painter = painterResource(id = R.drawable.revolt_onboarding), + painter = painterResource(id = R.drawable.peptide_onboarding), contentDescription = stringResource(id = R.string.register_image_alt), modifier = Modifier .size(300.dp) @@ -83,7 +85,7 @@ fun RegisterGreetingScreen(navController: NavController) { } Row { - TextButton(onClick = { + PepTextButton(onClick = { navController.popBackStack() }) { Text(text = stringResource(R.string.back)) @@ -91,7 +93,7 @@ fun RegisterGreetingScreen(navController: NavController) { Spacer(modifier = Modifier.width(10.dp)) - Button(onClick = { + SquareButton(onClick = { navController.navigate("register/details") }) { Text(text = stringResource(R.string.next)) diff --git a/app/src/main/java/chat/revolt/screens/register/RegisterVerifyScreen.kt b/app/src/main/java/chat/peptide/screens/register/RegisterVerifyScreen.kt similarity index 97% rename from app/src/main/java/chat/revolt/screens/register/RegisterVerifyScreen.kt rename to app/src/main/java/chat/peptide/screens/register/RegisterVerifyScreen.kt index 55f74d26..2364b723 100644 --- a/app/src/main/java/chat/revolt/screens/register/RegisterVerifyScreen.kt +++ b/app/src/main/java/chat/peptide/screens/register/RegisterVerifyScreen.kt @@ -1,4 +1,4 @@ -package chat.revolt.screens.register +package chat.peptide.screens.register import android.content.Intent import androidx.activity.compose.rememberLauncherForActivityResult @@ -32,8 +32,8 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.navigation.NavController import androidx.navigation.compose.rememberNavController -import chat.revolt.R -import chat.revolt.composables.generic.SquareButton +import chat.peptide.R +import chat.peptide.composables.generic.SquareButton @OptIn(ExperimentalMaterial3Api::class) @Composable diff --git a/app/src/main/java/chat/revolt/screens/services/DiscoverScreen.kt b/app/src/main/java/chat/peptide/screens/services/DiscoverScreen.kt similarity index 93% rename from app/src/main/java/chat/revolt/screens/services/DiscoverScreen.kt rename to app/src/main/java/chat/peptide/screens/services/DiscoverScreen.kt index 119406d0..63eefab6 100644 --- a/app/src/main/java/chat/revolt/screens/services/DiscoverScreen.kt +++ b/app/src/main/java/chat/peptide/screens/services/DiscoverScreen.kt @@ -1,4 +1,4 @@ -package chat.revolt.screens.services +package chat.peptide.screens.services import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize @@ -17,8 +17,8 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow import androidx.navigation.NavController -import chat.revolt.R -import chat.revolt.composables.screens.services.DiscoverView +import chat.peptide.R +import chat.peptide.composables.screens.services.DiscoverView @OptIn(ExperimentalMaterial3Api::class) @Composable diff --git a/app/src/main/java/chat/revolt/screens/settings/AppearanceSettingsScreen.kt b/app/src/main/java/chat/peptide/screens/settings/AppearanceSettingsScreen.kt similarity index 86% rename from app/src/main/java/chat/revolt/screens/settings/AppearanceSettingsScreen.kt rename to app/src/main/java/chat/peptide/screens/settings/AppearanceSettingsScreen.kt index cd7fe0a4..8719efaa 100644 --- a/app/src/main/java/chat/revolt/screens/settings/AppearanceSettingsScreen.kt +++ b/app/src/main/java/chat/peptide/screens/settings/AppearanceSettingsScreen.kt @@ -1,4 +1,4 @@ -package chat.revolt.screens.settings +package chat.peptide.screens.settings import android.content.Context import android.net.Uri @@ -8,7 +8,6 @@ import androidx.activity.result.contract.ActivityResultContracts import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.core.animateFloatAsState import androidx.compose.foundation.clickable -import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -31,7 +30,6 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.Scaffold import androidx.compose.material3.Text -import androidx.compose.material3.TextButton import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.dynamicDarkColorScheme import androidx.compose.material3.rememberModalBottomSheetState @@ -57,19 +55,20 @@ import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import androidx.navigation.NavController -import chat.revolt.R -import chat.revolt.api.RevoltCbor -import chat.revolt.api.RevoltJson -import chat.revolt.api.settings.LoadedSettings -import chat.revolt.api.settings.SyncedSettings -import chat.revolt.composables.generic.ListHeader -import chat.revolt.composables.screens.settings.appearance.ColourChip -import chat.revolt.composables.screens.settings.appearance.CornerRadiusPicker -import chat.revolt.sheets.ColourPickerSheet -import chat.revolt.ui.theme.OverridableColourScheme -import chat.revolt.ui.theme.Theme -import chat.revolt.ui.theme.getFieldByName -import chat.revolt.ui.theme.systemSupportsDynamicColors +import chat.peptide.R +import chat.peptide.api.PeptideCbor +import chat.peptide.api.PeptideJson +import chat.peptide.api.settings.LoadedSettings +import chat.peptide.api.settings.SyncedSettings +import chat.peptide.composables.generic.ListHeader +import chat.peptide.composables.generic.PepTextButton +import chat.peptide.composables.screens.settings.appearance.ColourChip +import chat.peptide.composables.screens.settings.appearance.CornerRadiusPicker +import chat.peptide.sheets.ColourPickerSheet +import chat.peptide.ui.theme.OverridableColourScheme +import chat.peptide.ui.theme.Theme +import chat.peptide.ui.theme.getFieldByName +import chat.peptide.ui.theme.systemSupportsDynamicColors import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.qualifiers.ApplicationContext import kotlinx.coroutines.launch @@ -109,11 +108,11 @@ class AppearanceSettingsScreenViewModel @Inject constructor( if (overrides != null) { // Yes, this looks stupid. Please see the comments in OverridableColourScheme.kt regarding this. - val json = RevoltJson.encodeToString( + val json = PeptideJson.encodeToString( OverridableColourScheme.serializer(), overrides ) - val asMap = RevoltJson.decodeFromString( + val asMap = PeptideJson.decodeFromString( MapSerializer(String.serializer(), Int.serializer()), json ) @@ -168,7 +167,7 @@ class AppearanceSettingsScreenViewModel @Inject constructor( } try { - RevoltCbor.decodeFromByteArray( + PeptideCbor.decodeFromByteArray( MapSerializer(String.serializer(), Int.serializer()), mFile.readBytes() ).let { @@ -189,7 +188,7 @@ class AppearanceSettingsScreenViewModel @Inject constructor( fun saveOverridesToFile(uri: Uri) { context.contentResolver.openOutputStream(uri)?.use { outputStream -> outputStream.write( - RevoltCbor.encodeToByteArray( + PeptideCbor.encodeToByteArray( OverridableColourScheme.serializer(), SyncedSettings.android.colourOverrides ?: OverridableColourScheme() ) @@ -219,7 +218,7 @@ fun AppearanceSettingsScreen( } } val fileSaver = rememberLauncherForActivityResult( - contract = ActivityResultContracts.CreateDocument("application/x-revolt-android-theme-overrides"), + contract = ActivityResultContracts.CreateDocument("application/x-peptide-android-theme-overrides"), ) { uri -> if (uri != null) { viewModel.saveOverridesToFile(uri) @@ -316,46 +315,13 @@ fun AppearanceSettingsScreen( ) { ColourChip( color = Color(0xff333642), - text = stringResource(id = R.string.settings_appearance_theme_revolt), - selected = LoadedSettings.theme == Theme.Revolt, + text = stringResource(id = R.string.settings_appearance_theme_peptide), + selected = LoadedSettings.theme == Theme.PEPTIDE_DARK, modifier = Modifier .weight(1f) - .testTag("set_theme_revolt") + .testTag("set_theme_peptide") ) { - viewModel.saveNewTheme(Theme.Revolt) - } - - ColourChip( - color = Color(0xfff7f7f7), - text = stringResource(id = R.string.settings_appearance_theme_light), - selected = LoadedSettings.theme == Theme.Light, - modifier = Modifier - .weight(1f) - .testTag("set_theme_light") - ) { - viewModel.saveNewTheme(Theme.Light) - } - - ColourChip( - color = Color(0xff000000), - text = stringResource(id = R.string.settings_appearance_theme_amoled), - selected = LoadedSettings.theme == Theme.Amoled, - modifier = Modifier - .weight(1f) - .testTag("set_theme_amoled") - ) { - viewModel.saveNewTheme(Theme.Amoled) - } - - ColourChip( - color = if (isSystemInDarkTheme()) Color(0xff333642) else Color(0xfff7f7f7), - text = stringResource(id = R.string.settings_appearance_theme_none), - selected = LoadedSettings.theme == Theme.None, - modifier = Modifier - .weight(1f) - .testTag("set_theme_none") - ) { - viewModel.saveNewTheme(Theme.None) + viewModel.saveNewTheme(Theme.PEPTIDE_DARK) } if (systemSupportsDynamicColors()) { @@ -447,7 +413,7 @@ fun AppearanceSettingsScreen( .fillMaxWidth() .padding(horizontal = 20.dp) ) { - TextButton( + PepTextButton( onClick = { filePicker.launch(arrayOf("*/*")) }, @@ -465,7 +431,7 @@ fun AppearanceSettingsScreen( ) } - TextButton( + PepTextButton( onClick = { fileSaver.launch("${SyncedSettings.android.theme}-colours.rato") }, diff --git a/app/src/main/java/chat/revolt/screens/settings/ChangelogsScreen.kt b/app/src/main/java/chat/peptide/screens/settings/ChangelogsScreen.kt similarity index 97% rename from app/src/main/java/chat/revolt/screens/settings/ChangelogsScreen.kt rename to app/src/main/java/chat/peptide/screens/settings/ChangelogsScreen.kt index 6dd235ec..af51b730 100644 --- a/app/src/main/java/chat/revolt/screens/settings/ChangelogsScreen.kt +++ b/app/src/main/java/chat/peptide/screens/settings/ChangelogsScreen.kt @@ -1,4 +1,4 @@ -package chat.revolt.screens.settings +package chat.peptide.screens.settings import android.content.Context import android.text.format.DateUtils @@ -40,11 +40,11 @@ import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import androidx.navigation.NavController -import chat.revolt.R -import chat.revolt.internals.ChangelogIndex -import chat.revolt.internals.Changelogs -import chat.revolt.persistence.KVStorage -import chat.revolt.sheets.ChangelogSheet +import chat.peptide.R +import chat.peptide.internals.ChangelogIndex +import chat.peptide.internals.Changelogs +import chat.peptide.persistence.KVStorage +import chat.peptide.sheets.ChangelogSheet import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.qualifiers.ApplicationContext import kotlinx.coroutines.launch diff --git a/app/src/main/java/chat/revolt/screens/settings/ChatSettingsScreen.kt b/app/src/main/java/chat/peptide/screens/settings/ChatSettingsScreen.kt similarity index 96% rename from app/src/main/java/chat/revolt/screens/settings/ChatSettingsScreen.kt rename to app/src/main/java/chat/peptide/screens/settings/ChatSettingsScreen.kt index 96ab36aa..4ebaef25 100644 --- a/app/src/main/java/chat/revolt/screens/settings/ChatSettingsScreen.kt +++ b/app/src/main/java/chat/peptide/screens/settings/ChatSettingsScreen.kt @@ -1,4 +1,4 @@ -package chat.revolt.screens.settings +package chat.peptide.screens.settings import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement @@ -37,13 +37,14 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavController -import chat.revolt.R -import chat.revolt.api.settings.LoadedSettings -import chat.revolt.api.settings.MessageReplyStyle -import chat.revolt.api.settings.SpecialEmbedSettings -import chat.revolt.api.settings.SyncedSettings -import chat.revolt.composables.generic.ListHeader -import chat.revolt.composables.generic.RadioItem +import chat.peptide.R +import chat.peptide.api.settings.LoadedSettings +import chat.peptide.api.settings.MessageReplyStyle +import chat.peptide.api.settings.SpecialEmbedSettings +import chat.peptide.api.settings.SyncedSettings +import chat.peptide.composables.generic.ListHeader +import chat.peptide.composables.generic.PepTextButton +import chat.peptide.composables.generic.RadioItem import kotlinx.coroutines.launch class ChatSettingsScreenViewModel : ViewModel() { @@ -141,7 +142,7 @@ fun ChatSettingsScreen( for (key in LoadedSettings.poorlyFormedSettingsKeys.filter { it in setOf("ordering", "android", "notifications") }) { - TextButton( + PepTextButton( onClick = { scope.launch { when (key) { diff --git a/app/src/main/java/chat/revolt/screens/settings/DebugSettingsScreen.kt b/app/src/main/java/chat/peptide/screens/settings/DebugSettingsScreen.kt similarity index 95% rename from app/src/main/java/chat/revolt/screens/settings/DebugSettingsScreen.kt rename to app/src/main/java/chat/peptide/screens/settings/DebugSettingsScreen.kt index 44e33dea..e1228dfe 100644 --- a/app/src/main/java/chat/revolt/screens/settings/DebugSettingsScreen.kt +++ b/app/src/main/java/chat/peptide/screens/settings/DebugSettingsScreen.kt @@ -1,4 +1,4 @@ -package chat.revolt.screens.settings +package chat.peptide.screens.settings import android.os.Build import android.util.Log @@ -48,13 +48,15 @@ import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import androidx.navigation.NavController -import chat.revolt.R -import chat.revolt.api.routes.push.subscribePush -import chat.revolt.dialogs.NotificationRationaleDialog -import chat.revolt.persistence.Database -import chat.revolt.persistence.KVStorage -import chat.revolt.persistence.SqlStorage -import chat.revolt.ui.theme.FragmentMono +import chat.peptide.R +import chat.peptide.api.routes.push.subscribePush +import chat.peptide.composables.generic.PepTextButton +import chat.peptide.composables.generic.SquareButton +import chat.peptide.dialogs.NotificationRationaleDialog +import chat.peptide.persistence.Database +import chat.peptide.persistence.KVStorage +import chat.peptide.persistence.SqlStorage +import chat.peptide.ui.theme.FragmentMono import com.google.android.gms.common.ConnectionResult import com.google.android.gms.common.GoogleApiAvailabilityLight import com.google.android.gms.tasks.OnCompleteListener @@ -178,7 +180,7 @@ fun DebugSettingsScreen( } }, confirmButton = { - TextButton(onClick = { + PepTextButton(onClick = { showC2dmDataDialogue = false }) { Text("OK") @@ -239,7 +241,7 @@ fun DebugSettingsScreen( ElevatedButton(onClick = { viewModel.forgetSwipeToReplySpark() }) { Text("Forget swipe to reply spark") } - Button(onClick = { viewModel.forgetAllSparks() }) { + SquareButton(onClick = { viewModel.forgetAllSparks() }) { Text("Forget all sparks") } } diff --git a/app/src/main/java/chat/revolt/screens/settings/ExperimentsSettingsScreen.kt b/app/src/main/java/chat/peptide/screens/settings/ExperimentsSettingsScreen.kt similarity index 92% rename from app/src/main/java/chat/revolt/screens/settings/ExperimentsSettingsScreen.kt rename to app/src/main/java/chat/peptide/screens/settings/ExperimentsSettingsScreen.kt index 5b931589..f02f5be7 100644 --- a/app/src/main/java/chat/revolt/screens/settings/ExperimentsSettingsScreen.kt +++ b/app/src/main/java/chat/peptide/screens/settings/ExperimentsSettingsScreen.kt @@ -1,4 +1,4 @@ -package chat.revolt.screens.settings +package chat.peptide.screens.settings import android.content.Context import android.content.Intent @@ -21,17 +21,19 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavController -import chat.revolt.BuildConfig -import chat.revolt.RevoltApplication -import chat.revolt.api.settings.Experiments -import chat.revolt.api.settings.LoadedSettings -import chat.revolt.persistence.KVStorage -import chat.revolt.settings.dsl.SettingsPage -import chat.revolt.settings.dsl.SubcategoryContentInsets +import chat.peptide.BuildConfig +import chat.peptide.PeptideApplication +import chat.peptide.api.settings.Experiments +import chat.peptide.api.settings.LoadedSettings +import chat.peptide.composables.generic.PepTextButton +import chat.peptide.composables.generic.SquareButton +import chat.peptide.persistence.KVStorage +import chat.peptide.settings.dsl.SettingsPage +import chat.peptide.settings.dsl.SubcategoryContentInsets import kotlinx.coroutines.launch class ExperimentsSettingsScreenViewModel : ViewModel() { - private val kv = KVStorage(RevoltApplication.instance) + private val kv = KVStorage(PeptideApplication.instance) fun init() { viewModelScope.launch { @@ -121,7 +123,7 @@ fun ExperimentsSettingsScreen( Text("The changes you made require a restart to take effect.") }, confirmButton = { - Button( + SquareButton( onClick = { viewModel.restartApp(context) } @@ -130,7 +132,7 @@ fun ExperimentsSettingsScreen( } }, dismissButton = { - TextButton( + PepTextButton( onClick = { viewModel.showNeedsRestartAlert.value = false } diff --git a/app/src/main/java/chat/revolt/screens/settings/LanguagePickerSettingsScreen.kt b/app/src/main/java/chat/peptide/screens/settings/LanguagePickerSettingsScreen.kt similarity index 98% rename from app/src/main/java/chat/revolt/screens/settings/LanguagePickerSettingsScreen.kt rename to app/src/main/java/chat/peptide/screens/settings/LanguagePickerSettingsScreen.kt index 1b801a9c..0076e4cd 100644 --- a/app/src/main/java/chat/revolt/screens/settings/LanguagePickerSettingsScreen.kt +++ b/app/src/main/java/chat/peptide/screens/settings/LanguagePickerSettingsScreen.kt @@ -1,4 +1,4 @@ -package chat.revolt.screens.settings +package chat.peptide.screens.settings import android.content.Context import androidx.appcompat.app.AppCompatDelegate @@ -31,8 +31,8 @@ import androidx.core.os.LocaleListCompat import androidx.lifecycle.ViewModel import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavController -import chat.revolt.R -import chat.revolt.internals.extensions.getSupportedLocales +import chat.peptide.R +import chat.peptide.internals.extensions.getSupportedLocales import java.util.Locale class LanguagePickerSettingsScreen : ViewModel() { diff --git a/app/src/main/java/chat/revolt/screens/settings/ProfileSettngsScreen.kt b/app/src/main/java/chat/peptide/screens/settings/ProfileSettngsScreen.kt similarity index 92% rename from app/src/main/java/chat/revolt/screens/settings/ProfileSettngsScreen.kt rename to app/src/main/java/chat/peptide/screens/settings/ProfileSettngsScreen.kt index 55e2d90e..ff498b5a 100644 --- a/app/src/main/java/chat/revolt/screens/settings/ProfileSettngsScreen.kt +++ b/app/src/main/java/chat/peptide/screens/settings/ProfileSettngsScreen.kt @@ -1,4 +1,4 @@ -package chat.revolt.screens.settings +package chat.peptide.screens.settings import android.content.Context import android.net.Uri @@ -46,14 +46,15 @@ import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import androidx.navigation.NavController -import chat.revolt.R -import chat.revolt.api.RevoltAPI -import chat.revolt.api.routes.microservices.autumn.uploadToAutumn -import chat.revolt.api.routes.user.fetchUserProfile -import chat.revolt.api.routes.user.patchSelf -import chat.revolt.api.schemas.Profile -import chat.revolt.composables.generic.InlineMediaPicker -import chat.revolt.composables.screens.settings.RawUserOverview +import chat.peptide.R +import chat.peptide.api.PeptideAPI +import chat.peptide.api.routes.microservices.autumn.uploadToAutumn +import chat.peptide.api.routes.user.fetchUserProfile +import chat.peptide.api.routes.user.patchSelf +import chat.peptide.api.schemas.Profile +import chat.peptide.composables.generic.InlineMediaPicker +import chat.peptide.composables.generic.PepTextButton +import chat.peptide.composables.screens.settings.RawUserOverview import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.qualifiers.ApplicationContext import io.ktor.http.ContentType @@ -75,14 +76,14 @@ class ProfileSettingsScreenViewModel @Inject constructor(@ApplicationContext val var bioError by mutableStateOf(null) init { - RevoltAPI.selfId?.let { self -> - RevoltAPI.userCache[self]?.avatar?.id?.let { - pfpModel = "${RevoltAPI.getCurrentAutumnUrl()}/avatars/${it}" + PeptideAPI.selfId?.let { self -> + PeptideAPI.userCache[self]?.avatar?.id?.let { + pfpModel = "${PeptideAPI.getCurrentAutumnUrl()}/avatars/${it}" } viewModelScope.launch { currentProfile = fetchUserProfile(self) currentProfile!!.background?.id?.let { - backgroundModel = "${RevoltAPI.getCurrentAutumnUrl()}/backgrounds/${it}" + backgroundModel = "${PeptideAPI.getCurrentAutumnUrl()}/backgrounds/${it}" } pendingProfile = currentProfile!!.copy() @@ -136,8 +137,8 @@ class ProfileSettingsScreenViewModel @Inject constructor(@ApplicationContext val return@launch } - pfpModel = RevoltAPI.userCache[RevoltAPI.selfId]?.avatar?.id?.let { - "${RevoltAPI.getCurrentAutumnUrl()}/avatars/${it}" + pfpModel = PeptideAPI.userCache[PeptideAPI.selfId]?.avatar?.id?.let { + "${PeptideAPI.getCurrentAutumnUrl()}/avatars/${it}" } uploadProgress = 0f @@ -187,13 +188,13 @@ class ProfileSettingsScreenViewModel @Inject constructor(@ApplicationContext val return@launch } - backgroundModel = RevoltAPI.selfId?.let { + backgroundModel = PeptideAPI.selfId?.let { val profile = fetchUserProfile(it) currentProfile = profile pendingProfile = profile profile.background?.id?.let { id -> - "${RevoltAPI.getCurrentAutumnUrl()}/backgrounds/${id}" + "${PeptideAPI.getCurrentAutumnUrl()}/backgrounds/${id}" } } @@ -221,7 +222,7 @@ class ProfileSettingsScreenViewModel @Inject constructor(@ApplicationContext val try { patchSelf(bio = pendingProfile?.content) - fetchUserProfile(RevoltAPI.selfId!!).let { + fetchUserProfile(PeptideAPI.selfId!!).let { currentProfile = it pendingProfile = it } @@ -298,7 +299,7 @@ fun ProfileSettingsScreen( .size(48.dp) ) } else { - RevoltAPI.userCache[RevoltAPI.selfId]?.let { + PeptideAPI.userCache[PeptideAPI.selfId]?.let { RawUserOverview( it, viewModel.pendingProfile, @@ -415,7 +416,7 @@ fun ProfileSettingsScreen( Spacer(Modifier.height(8.dp)) - TextButton( + PepTextButton( onClick = { viewModel.saveBio() }, diff --git a/app/src/main/java/chat/revolt/screens/settings/SessionSettngsScreen.kt b/app/src/main/java/chat/peptide/screens/settings/SessionSettngsScreen.kt similarity index 93% rename from app/src/main/java/chat/revolt/screens/settings/SessionSettngsScreen.kt rename to app/src/main/java/chat/peptide/screens/settings/SessionSettngsScreen.kt index 483a16a5..f34471b1 100644 --- a/app/src/main/java/chat/revolt/screens/settings/SessionSettngsScreen.kt +++ b/app/src/main/java/chat/peptide/screens/settings/SessionSettngsScreen.kt @@ -1,4 +1,4 @@ -package chat.revolt.screens.settings +package chat.peptide.screens.settings import android.util.Log import androidx.compose.foundation.ExperimentalFoundationApi @@ -14,10 +14,7 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.automirrored.filled.ArrowBack import androidx.compose.material3.AlertDialog -import androidx.compose.material3.Button import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.FilledTonalButton @@ -27,7 +24,6 @@ import androidx.compose.material3.LargeTopAppBar import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold import androidx.compose.material3.Text -import androidx.compose.material3.TextButton import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect @@ -48,15 +44,17 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavController -import chat.revolt.R -import chat.revolt.api.RevoltAPI -import chat.revolt.api.routes.auth.fetchAllSessions -import chat.revolt.api.routes.auth.logoutAllSessions -import chat.revolt.api.routes.auth.logoutSessionById -import chat.revolt.api.schemas.Session -import chat.revolt.composables.generic.ListHeader -import chat.revolt.composables.markdown.RichMarkdown -import chat.revolt.composables.settings.sessions.SessionItem +import chat.peptide.R +import chat.peptide.api.PeptideAPI +import chat.peptide.api.routes.auth.fetchAllSessions +import chat.peptide.api.routes.auth.logoutAllSessions +import chat.peptide.api.routes.auth.logoutSessionById +import chat.peptide.api.schemas.Session +import chat.peptide.composables.generic.ListHeader +import chat.peptide.composables.generic.PepTextButton +import chat.peptide.composables.generic.SquareButton +import chat.peptide.composables.markdown.RichMarkdown +import chat.peptide.composables.settings.sessions.SessionItem import kotlinx.coroutines.launch class SessionSettingsScreenViewModel : ViewModel() { @@ -71,7 +69,7 @@ class SessionSettingsScreenViewModel : ViewModel() { currentSession = sessions.firstOrNull { it.isCurrent() } Log.d( "SessionSettingsScreen", - "Current session: $currentSession. Current session ID: ${RevoltAPI.sessionId}" + "Current session: $currentSession. Current session ID: ${PeptideAPI.sessionId}" ) isLoading = false } @@ -114,7 +112,7 @@ fun SessionSettingsScreen( ) }, confirmButton = { - Button( + SquareButton( onClick = { viewModel.showLogoutOtherConfirmation = false viewModel.logoutOtherSessions() @@ -124,7 +122,7 @@ fun SessionSettingsScreen( } }, dismissButton = { - TextButton( + PepTextButton( onClick = { viewModel.showLogoutOtherConfirmation = false } diff --git a/app/src/main/java/chat/revolt/screens/settings/SettingsScreen.kt b/app/src/main/java/chat/peptide/screens/settings/SettingsScreen.kt similarity index 96% rename from app/src/main/java/chat/revolt/screens/settings/SettingsScreen.kt rename to app/src/main/java/chat/peptide/screens/settings/SettingsScreen.kt index 8b7eac44..10ab1b50 100644 --- a/app/src/main/java/chat/revolt/screens/settings/SettingsScreen.kt +++ b/app/src/main/java/chat/peptide/screens/settings/SettingsScreen.kt @@ -1,4 +1,4 @@ -package chat.revolt.screens.settings +package chat.peptide.screens.settings import android.content.Intent import androidx.compose.foundation.clickable @@ -10,9 +10,12 @@ import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll 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 import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBarDefaults @@ -30,14 +33,14 @@ import androidx.core.net.toUri import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.ViewModel import androidx.navigation.NavController -import chat.revolt.BuildConfig -import chat.revolt.R -import chat.revolt.activities.InviteActivity -import chat.revolt.api.RevoltAPI -import chat.revolt.api.settings.FeatureFlags -import chat.revolt.api.settings.LoadedSettings -import chat.revolt.composables.generic.ListHeader -import chat.revolt.persistence.KVStorage +import chat.peptide.BuildConfig +import chat.peptide.R +import chat.peptide.activities.InviteActivity +import chat.peptide.api.PeptideAPI +import chat.peptide.api.settings.FeatureFlags +import chat.peptide.api.settings.LoadedSettings +import chat.peptide.composables.generic.ListHeader +import chat.peptide.persistence.KVStorage import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.runBlocking import javax.inject.Inject @@ -50,7 +53,7 @@ class SettingsScreenViewModel @Inject constructor( runBlocking { kvStorage.remove("sessionToken") LoadedSettings.reset() - RevoltAPI.logout() + PeptideAPI.logout() } } } @@ -67,7 +70,7 @@ fun SettingsScreen( Column( modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection), ) { - TopAppBar( + LargeTopAppBar( scrollBehavior = scrollBehavior, title = { Text( diff --git a/app/src/main/java/chat/revolt/screens/settings/channel/ChannelSettingsHome.kt b/app/src/main/java/chat/peptide/screens/settings/channel/ChannelSettingsHome.kt similarity index 92% rename from app/src/main/java/chat/revolt/screens/settings/channel/ChannelSettingsHome.kt rename to app/src/main/java/chat/peptide/screens/settings/channel/ChannelSettingsHome.kt index e3729722..3724687c 100644 --- a/app/src/main/java/chat/revolt/screens/settings/channel/ChannelSettingsHome.kt +++ b/app/src/main/java/chat/peptide/screens/settings/channel/ChannelSettingsHome.kt @@ -1,4 +1,4 @@ -package chat.revolt.screens.settings.channel +package chat.peptide.screens.settings.channel import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box @@ -8,7 +8,6 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material3.AlertDialog -import androidx.compose.material3.Button import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon @@ -19,7 +18,6 @@ import androidx.compose.material3.LocalContentColor import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold import androidx.compose.material3.Text -import androidx.compose.material3.TextButton import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider @@ -36,21 +34,23 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow import androidx.navigation.NavController -import chat.revolt.R -import chat.revolt.api.RevoltAPI -import chat.revolt.api.internals.PermissionBit -import chat.revolt.api.internals.hasPermission -import chat.revolt.api.routes.channel.leaveDeleteOrCloseChannel -import chat.revolt.api.schemas.ChannelType -import chat.revolt.api.settings.FeatureFlags -import chat.revolt.internals.extensions.rememberChannelPermissions -import chat.revolt.screens.settings.SettingsIcon +import chat.peptide.R +import chat.peptide.api.PeptideAPI +import chat.peptide.api.internals.PermissionBit +import chat.peptide.api.internals.hasPermission +import chat.peptide.api.routes.channel.leaveDeleteOrCloseChannel +import chat.peptide.api.schemas.ChannelType +import chat.peptide.api.settings.FeatureFlags +import chat.peptide.composables.generic.PepTextButton +import chat.peptide.composables.generic.SquareButton +import chat.peptide.internals.extensions.rememberChannelPermissions +import chat.peptide.screens.settings.SettingsIcon import kotlinx.coroutines.launch @OptIn(ExperimentalMaterial3Api::class) @Composable fun ChannelSettingsHome(navController: NavController, channelId: String) { - val channel = RevoltAPI.channelCache[channelId] + val channel = PeptideAPI.channelCache[channelId] val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior() val permissions by rememberChannelPermissions(channelId) var showDeletionConfirmation by remember { mutableStateOf(false) } @@ -64,14 +64,14 @@ fun ChannelSettingsHome(navController: NavController, channelId: String) { title = { Text(stringResource(R.string.channel_settings_delete_confirm)) }, text = { Text(stringResource(R.string.channel_settings_delete_confirm_description)) }, dismissButton = { - TextButton(onClick = { + PepTextButton(onClick = { showDeletionConfirmation = false }) { Text(stringResource(R.string.channel_settings_delete_confirm_no)) } }, confirmButton = { - Button(onClick = { + SquareButton(onClick = { showDeletionConfirmation = false scope.launch { leaveDeleteOrCloseChannel(channelId) diff --git a/app/src/main/java/chat/revolt/screens/settings/channel/ChannelSettingsOverview.kt b/app/src/main/java/chat/peptide/screens/settings/channel/ChannelSettingsOverview.kt similarity index 94% rename from app/src/main/java/chat/revolt/screens/settings/channel/ChannelSettingsOverview.kt rename to app/src/main/java/chat/peptide/screens/settings/channel/ChannelSettingsOverview.kt index 4b643868..ea854112 100644 --- a/app/src/main/java/chat/revolt/screens/settings/channel/ChannelSettingsOverview.kt +++ b/app/src/main/java/chat/peptide/screens/settings/channel/ChannelSettingsOverview.kt @@ -1,4 +1,4 @@ -package chat.revolt.screens.settings.channel +package chat.peptide.screens.settings.channel import android.content.Context import android.net.Uri @@ -56,14 +56,16 @@ import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import androidx.navigation.NavController -import chat.revolt.R -import chat.revolt.activities.RevoltTweenFloat -import chat.revolt.api.RevoltAPI -import chat.revolt.api.routes.channel.patchChannel -import chat.revolt.api.routes.microservices.autumn.uploadToAutumn -import chat.revolt.api.schemas.Channel -import chat.revolt.composables.generic.InlineMediaPicker -import chat.revolt.composables.generic.ListHeader +import chat.peptide.R +import chat.peptide.activities.PeptideTweenFloat +import chat.peptide.api.PeptideAPI +import chat.peptide.api.routes.channel.patchChannel +import chat.peptide.api.routes.microservices.autumn.uploadToAutumn +import chat.peptide.api.schemas.Channel +import chat.peptide.composables.generic.InlineMediaPicker +import chat.peptide.composables.generic.ListHeader +import chat.peptide.composables.generic.PepTextButton +import chat.peptide.composables.generic.SquareButton import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.qualifiers.ApplicationContext import io.ktor.http.ContentType @@ -89,12 +91,12 @@ class ChannelSettingsOverviewViewModel @Inject constructor(@ApplicationContext v var showNsfwToggleDialogue by mutableStateOf(false) fun populateWithChannel(channelId: String) { - val channel = RevoltAPI.channelCache[channelId] + val channel = PeptideAPI.channelCache[channelId] initialChannel = channel channel?.let { channelName = it.name ?: "" channelDescription = it.description ?: "" - iconModel = it.icon?.let { icon -> "${RevoltAPI.getCurrentFilesUrl()}/icons/${icon.id}" } + iconModel = it.icon?.let { icon -> "${PeptideAPI.getCurrentFilesUrl()}/icons/${icon.id}" } } } @@ -217,7 +219,7 @@ fun ChannelSettingsOverview( channelId: String, viewModel: ChannelSettingsOverviewViewModel = hiltViewModel() ) { - val currentChannel = RevoltAPI.channelCache[channelId] + val currentChannel = PeptideAPI.channelCache[channelId] val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior() LaunchedEffect(channelId) { @@ -257,7 +259,7 @@ fun ChannelSettingsOverview( } }, confirmButton = { - Button( + SquareButton( onClick = { viewModel.toggleNsfw() } @@ -270,7 +272,7 @@ fun ChannelSettingsOverview( } }, dismissButton = { - TextButton( + PepTextButton( onClick = { viewModel.showNsfwToggleDialogue = false } @@ -312,8 +314,8 @@ fun ChannelSettingsOverview( floatingActionButton = { AnimatedVisibility( visible = channelInfoUpdated, - enter = scaleIn(animationSpec = RevoltTweenFloat), - exit = scaleOut(animationSpec = RevoltTweenFloat) + enter = scaleIn(animationSpec = PeptideTweenFloat), + exit = scaleOut(animationSpec = PeptideTweenFloat) ) { FloatingActionButton(onClick = { viewModel.updateChannel() }) { Icon( diff --git a/app/src/main/java/chat/revolt/screens/settings/channel/ChannelSettingsPermissions.kt b/app/src/main/java/chat/peptide/screens/settings/channel/ChannelSettingsPermissions.kt similarity index 95% rename from app/src/main/java/chat/revolt/screens/settings/channel/ChannelSettingsPermissions.kt rename to app/src/main/java/chat/peptide/screens/settings/channel/ChannelSettingsPermissions.kt index 695c4d16..a7f3dab5 100644 --- a/app/src/main/java/chat/revolt/screens/settings/channel/ChannelSettingsPermissions.kt +++ b/app/src/main/java/chat/peptide/screens/settings/channel/ChannelSettingsPermissions.kt @@ -1,4 +1,4 @@ -package chat.revolt.screens.settings.channel +package chat.peptide.screens.settings.channel import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -25,13 +25,13 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow import androidx.navigation.NavController -import chat.revolt.R -import chat.revolt.api.RevoltAPI +import chat.peptide.R +import chat.peptide.api.PeptideAPI @OptIn(ExperimentalMaterial3Api::class) @Composable fun ChannelSettingsPermissions(navController: NavController, channelId: String) { - val channel = RevoltAPI.channelCache[channelId] + val channel = PeptideAPI.channelCache[channelId] val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior() Scaffold( diff --git a/app/src/main/java/chat/revolt/settings/dsl/SettingsPage.kt b/app/src/main/java/chat/peptide/settings/dsl/SettingsPage.kt similarity index 96% rename from app/src/main/java/chat/revolt/settings/dsl/SettingsPage.kt rename to app/src/main/java/chat/peptide/settings/dsl/SettingsPage.kt index 7c7b0a73..d3544dc9 100644 --- a/app/src/main/java/chat/revolt/settings/dsl/SettingsPage.kt +++ b/app/src/main/java/chat/peptide/settings/dsl/SettingsPage.kt @@ -1,4 +1,4 @@ -package chat.revolt.settings.dsl +package chat.peptide.settings.dsl import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues @@ -28,9 +28,9 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.navigation.NavController -import chat.revolt.R -import chat.revolt.composables.generic.ListHeader -import chat.revolt.composables.generic.RadioItem +import chat.peptide.R +import chat.peptide.composables.generic.ListHeader +import chat.peptide.composables.generic.RadioItem import kotlinx.coroutines.launch import kotlin.enums.EnumEntries diff --git a/app/src/main/java/chat/revolt/settings/providers/AgeGateUnlockedStorageProvider.kt b/app/src/main/java/chat/peptide/settings/providers/AgeGateUnlockedStorageProvider.kt similarity index 58% rename from app/src/main/java/chat/revolt/settings/providers/AgeGateUnlockedStorageProvider.kt rename to app/src/main/java/chat/peptide/settings/providers/AgeGateUnlockedStorageProvider.kt index 4357b047..2aa65ffc 100644 --- a/app/src/main/java/chat/revolt/settings/providers/AgeGateUnlockedStorageProvider.kt +++ b/app/src/main/java/chat/peptide/settings/providers/AgeGateUnlockedStorageProvider.kt @@ -1,10 +1,10 @@ -package chat.revolt.settings.providers +package chat.peptide.settings.providers -import chat.revolt.RevoltApplication -import chat.revolt.persistence.KVStorage +import chat.peptide.PeptideApplication +import chat.peptide.persistence.KVStorage object AgeGateUnlockedStorageProvider { - private val kv = KVStorage(RevoltApplication.instance) + private val kv = KVStorage(PeptideApplication.instance) suspend fun setAgeGateUnlocked(unlocked: Boolean) { kv.set("ageGateUnlocked", unlocked) diff --git a/app/src/main/java/chat/revolt/sheets/AddServerSheet.kt b/app/src/main/java/chat/peptide/sheets/AddServerSheet.kt similarity index 96% rename from app/src/main/java/chat/revolt/sheets/AddServerSheet.kt rename to app/src/main/java/chat/peptide/sheets/AddServerSheet.kt index a879b031..997cec74 100644 --- a/app/src/main/java/chat/revolt/sheets/AddServerSheet.kt +++ b/app/src/main/java/chat/peptide/sheets/AddServerSheet.kt @@ -1,4 +1,4 @@ -package chat.revolt.sheets +package chat.peptide.sheets import android.content.Intent import android.util.Log @@ -52,19 +52,20 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.core.net.toUri -import chat.revolt.R -import chat.revolt.activities.InviteActivity -import chat.revolt.api.RevoltAPI -import chat.revolt.api.routes.server.createServer -import chat.revolt.callbacks.Action -import chat.revolt.callbacks.ActionChannel -import chat.revolt.composables.sheets.SheetSelection -import chat.revolt.composables.vectorassets.CreateServer -import chat.revolt.composables.vectorassets.JoinServer -import chat.revolt.composables.vectorassets.NewServer -import chat.revolt.material.EasingTokens -import chat.revolt.screens.chat.ChatRouterDestination -import chat.revolt.ui.theme.FragmentMono +import chat.peptide.R +import chat.peptide.activities.InviteActivity +import chat.peptide.api.PeptideAPI +import chat.peptide.api.routes.server.createServer +import chat.peptide.callbacks.Action +import chat.peptide.callbacks.ActionChannel +import chat.peptide.composables.generic.SquareButton +import chat.peptide.composables.sheets.SheetSelection +import chat.peptide.composables.vectorassets.CreateServer +import chat.peptide.composables.vectorassets.JoinServer +import chat.peptide.composables.vectorassets.NewServer +import chat.peptide.material.EasingTokens +import chat.peptide.screens.chat.ChatRouterDestination +import chat.peptide.ui.theme.FragmentMono import kotlinx.coroutines.launch import logcat.asLog import logcat.logcat @@ -307,7 +308,7 @@ fun AddServerSheet(onDismiss: () -> Unit) { .padding(vertical = 16.dp, horizontal = 8.dp) ) - Button( + SquareButton( onClick = { val intent = Intent(context, InviteActivity::class.java) intent.data = if (inviteState.text.startsWith("https://")) { @@ -319,10 +320,10 @@ fun AddServerSheet(onDismiss: () -> Unit) { "Invalid URL: ${inviteState.text}", e ) - return@Button + return@SquareButton } } else { - "https://${RevoltAPI.getCurrentAppUrl()}/invite/${inviteState.text}".toUri() + "https://${PeptideAPI.getCurrentAppUrl()}/invite/${inviteState.text}".toUri() } context.startActivity(intent) @@ -452,7 +453,7 @@ fun AddServerSheet(onDismiss: () -> Unit) { .padding(vertical = 16.dp, horizontal = 8.dp) ) - Button( + SquareButton( onClick = { serverCreationError = false diff --git a/app/src/main/java/chat/revolt/sheets/ChangelogSheet.kt b/app/src/main/java/chat/peptide/sheets/ChangelogSheet.kt similarity index 91% rename from app/src/main/java/chat/revolt/sheets/ChangelogSheet.kt rename to app/src/main/java/chat/peptide/sheets/ChangelogSheet.kt index 4cdb9a16..7e2000e6 100644 --- a/app/src/main/java/chat/revolt/sheets/ChangelogSheet.kt +++ b/app/src/main/java/chat/peptide/sheets/ChangelogSheet.kt @@ -1,4 +1,4 @@ -package chat.revolt.sheets +package chat.peptide.sheets import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect @@ -7,8 +7,8 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.platform.LocalContext -import chat.revolt.api.internals.getFragmentActivity -import chat.revolt.fragments.ChangelogBottomSheetFragment +import chat.peptide.api.internals.getFragmentActivity +import chat.peptide.fragments.ChangelogBottomSheetFragment @Composable fun ChangelogSheet( diff --git a/app/src/main/java/chat/peptide/sheets/ChannelContextSheet.kt b/app/src/main/java/chat/peptide/sheets/ChannelContextSheet.kt new file mode 100644 index 00000000..e7020fc9 --- /dev/null +++ b/app/src/main/java/chat/peptide/sheets/ChannelContextSheet.kt @@ -0,0 +1,410 @@ +package chat.peptide.sheets + +import android.widget.Toast +import androidx.compose.animation.AnimatedContent +import androidx.compose.animation.core.tween +import androidx.compose.animation.slideInHorizontally +import androidx.compose.animation.slideOutHorizontally +import androidx.compose.animation.togetherWith +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.platform.LocalClipboardManager +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.AnnotatedString +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import androidx.compose.ui.window.Dialog +import chat.peptide.R +import chat.peptide.api.PeptideAPI +import chat.peptide.api.internals.ChannelUtils +import chat.peptide.composables.generic.RemoteImage +import chat.peptide.composables.generic.SheetButton +import chat.peptide.internals.Platform +import chat.peptide.screens.chat.dialogs.InviteDialog +import kotlinx.coroutines.launch +import chat.peptide.api.settings.NotificationType +import chat.peptide.api.settings.SyncedSettings +import chat.peptide.api.schemas.NotificationSettings +import kotlinx.coroutines.GlobalScope + +@Composable +fun ChannelContextSheet(channelId: String, onHideSheet: suspend () -> Unit) { + val channel = PeptideAPI.channelCache[channelId] + if (channel == null) { + Box( + modifier = Modifier + .fillMaxWidth() + .height(200.dp) + ) { + CircularProgressIndicator(modifier = Modifier.align(Alignment.Center)) + } + return + } + + val server = channel.server?.let { PeptideAPI.serverCache[it] } + val clipboardManager = LocalClipboardManager.current + val context = LocalContext.current + + val coroutineScope = rememberCoroutineScope() + var inviteDialogShown by remember { mutableStateOf(false) } + + if (inviteDialogShown) { + Dialog(onDismissRequest = { inviteDialogShown = false }) { + InviteDialog( + channelId = channelId, + onDismissRequest = { inviteDialogShown = false } + ) + } + } + + // Animated content pages inside the sheet + var currentPage by remember { mutableIntStateOf(0) } // 0 = main, 1 = notifications + + + // Action buttons or notifications page + AnimatedContent( + targetState = currentPage, + transitionSpec = { + if (targetState > initialState) { + // forward: slide in from right, out to left + slideInHorizontally(animationSpec = tween(200)) { fullWidth -> fullWidth } togetherWith + slideOutHorizontally(animationSpec = tween(200)) { fullWidth -> -fullWidth } + } else { + // back: slide in from left, out to right + slideInHorizontally(animationSpec = tween(200)) { fullWidth -> -fullWidth } togetherWith + slideOutHorizontally(animationSpec = tween(200)) { fullWidth -> fullWidth } + } + }, label = "Channel context sheet pager" + ) { page -> + if (page == 0) { + Column(Modifier.fillMaxWidth()) { + // Header with server image and channel info in a row layout + Box( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp, vertical = 20.dp) + ) { + Row( + modifier = Modifier.fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(12.dp) + ) { + server?.icon?.id?.let { iconId -> + RemoteImage( + url = "${PeptideAPI.getCurrentFilesUrl()}/icons/$iconId", + allowAnimation = false, + modifier = Modifier + .size(40.dp) + .clip(RoundedCornerShape(8.dp)), + description = server.name ?: stringResource(R.string.unknown) + ) + } + + Text( + text = "# ${ChannelUtils.resolveName(channel) ?: stringResource(R.string.unknown)}", + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.SemiBold, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + } + } + Column( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp) + ) { + // Group 1: Mark as read + Notification options + Box( + modifier = Modifier + .fillMaxWidth() + .clip(RoundedCornerShape(16.dp)) + .background(MaterialTheme.colorScheme.surfaceBright) + ) { + Column(modifier = Modifier.fillMaxWidth()) { + SheetButton( + headlineContent = { + Text( + text = stringResource(id = R.string.channel_context_sheet_actions_mark_read), + fontWeight = FontWeight.Medium + ) + }, + leadingContent = { + Icon( + painter = painterResource(id = R.drawable.icn_mark_chat_read_24dp), + contentDescription = null + ) + }, + onClick = { + coroutineScope.launch { + channel.lastMessageID?.let { + PeptideAPI.unreads.markAsRead(channelId, it, sync = true) + } + onHideSheet() + } + } + ) + HorizontalDivider(modifier = Modifier.padding(horizontal = 12.dp)) + SheetButton( + headlineContent = { + Text( + text = stringResource(id = R.string.channel_info_sheet_options_notifications_manage), + fontWeight = FontWeight.Medium + ) + }, + leadingContent = { + Icon( + painter = painterResource(id = R.drawable.icn_notification_settings_24dp), + contentDescription = null + ) + }, + onClick = { + currentPage = 1 + } + ) + } + } + // Group 2: Invite + Copy channel ID + Box( + modifier = Modifier + .fillMaxWidth() + .padding(top = 24.dp) + .clip(RoundedCornerShape(16.dp)) + .background(MaterialTheme.colorScheme.surfaceBright) + ) { + Column(modifier = Modifier.fillMaxWidth()) { + SheetButton( + headlineContent = { + Text( + text = stringResource(id = R.string.channel_info_sheet_options_invite), + fontWeight = FontWeight.Medium + ) + }, + leadingContent = { + Icon( + painter = painterResource(id = R.drawable.icn_add_24dp), + contentDescription = null + ) + }, + onClick = { + inviteDialogShown = true + } + ) + HorizontalDivider(modifier = Modifier.padding(horizontal = 12.dp)) + SheetButton( + headlineContent = { + Text( + text = stringResource(id = R.string.channel_context_sheet_actions_copy_id), + fontWeight = FontWeight.Medium + ) + }, + leadingContent = { + Icon( + painter = painterResource(id = R.drawable.icn_identifier_copy_24dp), + contentDescription = null + ) + }, + onClick = { + if (channel.id == null) return@SheetButton + + clipboardManager.setText(AnnotatedString(channel.id)) + + if (Platform.needsShowClipboardNotification()) { + Toast.makeText( + context, + context.getString(R.string.channel_context_sheet_actions_copy_id_copied), + Toast.LENGTH_SHORT + ).show() + } + + coroutineScope.launch { + onHideSheet() + } + } + ) + } + } + } + } + }else{ + Column( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp) + ) { + // Top bar for notifications page + Box( + modifier = Modifier + .fillMaxWidth() + .padding(12.dp), + ) { + Icon( + painter = painterResource(id = R.drawable.ic_arrow_left_24dp), + contentDescription = null, + modifier = Modifier + .size(24.dp) + .clickable { currentPage = 0 } + .align(Alignment.CenterStart) + ) + Text( + modifier = Modifier.align(Alignment.Center), + text = stringResource(id = R.string.channel_info_sheet_options_notifications_manage), + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.SemiBold + ) + } + + // Notifications controls container (with radio options) + Box( + modifier = Modifier + .fillMaxWidth() + .padding(top = 24.dp) + .clip(RoundedCornerShape(16.dp)) + .background(MaterialTheme.colorScheme.surfaceBright) + ) { + // Load current selection from SyncedSettings + var selected by remember { + mutableStateOf( + NotificationType.fromStorage( + SyncedSettings.notifications.channel[channelId] + ).storageValue + ) + } + Column(modifier = Modifier.fillMaxWidth()) { + NotificationRadioRow( + title = stringResource(id = R.string.notification_option_use_default), + type = NotificationType.DEFAULT, + channelId = channelId, + current = selected, + onChange = { selected = it } + ) + HorizontalDivider(modifier = Modifier.padding(horizontal = 12.dp)) + NotificationRadioRow( + title = stringResource(id = R.string.notification_option_muted), + type = NotificationType.MUTED, + channelId = channelId, + current = selected, + onChange = { selected = it } + ) + HorizontalDivider(modifier = Modifier.padding(horizontal = 12.dp)) + NotificationRadioRow( + title = stringResource(id = R.string.notification_option_all_messages), + type = NotificationType.ALL, + channelId = channelId, + current = selected, + onChange = { selected = it } + ) + HorizontalDivider(modifier = Modifier.padding(horizontal = 12.dp)) + NotificationRadioRow( + title = stringResource(id = R.string.notification_option_mentions_only), + type = NotificationType.MENTIONS_ONLY, + channelId = channelId, + current = selected, + onChange = { selected = it } + ) + HorizontalDivider(modifier = Modifier.padding(horizontal = 12.dp)) + NotificationRadioRow( + title = stringResource(id = R.string.notification_option_none), + type = NotificationType.NONE, + channelId = channelId, + current = selected, + onChange = { selected = it } + ) + } + } + } + } + } +} + +@Composable +fun NotificationRadioRow( + title: String, + type: NotificationType, + channelId: String, + current: String, + onChange: (String) -> Unit +) { + val isSelected = current == type.storageValue + SheetButton( + headlineContent = { Text(text = title) }, + leadingContent = { + Icon( + painter = painterResource(id = when(type){ + NotificationType.DEFAULT -> R.drawable.icn_notif_use_default + NotificationType.MUTED -> R.drawable.icn_notif_mute + NotificationType.ALL -> R.drawable.icn_notif_all_messages + NotificationType.MENTIONS_ONLY -> R.drawable.icn_notif_mention_only + NotificationType.NONE -> R.drawable.icn_notif_none + }), + contentDescription = null + ) + }, + trailingContent = { + androidx.compose.material3.RadioButton( + selected = isSelected, + onClick = { + onChange(type.storageValue) + val currentSettings = SyncedSettings.notifications + val updated = NotificationSettings( + server = currentSettings.server, + channel = currentSettings.channel.toMutableMap().apply { + if (type == NotificationType.DEFAULT) { + remove(channelId) + } else { + put(channelId, type.storageValue) + } + } + ) + GlobalScope.launch { + SyncedSettings.updateNotifications(updated) + } + } + ) + }, + onClick = { + onChange(type.storageValue) + val currentSettings = SyncedSettings.notifications + val updated = NotificationSettings( + server = currentSettings.server, + channel = currentSettings.channel.toMutableMap().apply { + if (type == NotificationType.DEFAULT) { + remove(channelId) + } else { + put(channelId, type.storageValue) + } + } + ) + GlobalScope.launch { + SyncedSettings.updateNotifications(updated) + } + } + ) +} diff --git a/app/src/main/java/chat/revolt/sheets/ChannelInfoSheet.kt b/app/src/main/java/chat/peptide/sheets/ChannelInfoSheet.kt similarity index 90% rename from app/src/main/java/chat/revolt/sheets/ChannelInfoSheet.kt rename to app/src/main/java/chat/peptide/sheets/ChannelInfoSheet.kt index 36ffb27b..588689fc 100644 --- a/app/src/main/java/chat/revolt/sheets/ChannelInfoSheet.kt +++ b/app/src/main/java/chat/peptide/sheets/ChannelInfoSheet.kt @@ -1,4 +1,4 @@ -package chat.revolt.sheets +package chat.peptide.sheets import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box @@ -25,26 +25,26 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Dialog -import chat.revolt.R -import chat.revolt.api.RevoltAPI -import chat.revolt.api.internals.ChannelUtils -import chat.revolt.api.internals.PermissionBit -import chat.revolt.api.internals.Roles -import chat.revolt.api.internals.has -import chat.revolt.api.schemas.ChannelType -import chat.revolt.callbacks.Action -import chat.revolt.callbacks.ActionChannel -import chat.revolt.composables.generic.SheetButton -import chat.revolt.composables.screens.chat.ChannelSheetHeader -import chat.revolt.internals.extensions.rememberChannelPermissions -import chat.revolt.screens.chat.dialogs.InviteDialog +import chat.peptide.R +import chat.peptide.api.PeptideAPI +import chat.peptide.api.internals.ChannelUtils +import chat.peptide.api.internals.PermissionBit +import chat.peptide.api.internals.Roles +import chat.peptide.api.internals.has +import chat.peptide.api.schemas.ChannelType +import chat.peptide.callbacks.Action +import chat.peptide.callbacks.ActionChannel +import chat.peptide.composables.generic.SheetButton +import chat.peptide.composables.screens.chat.ChannelSheetHeader +import chat.peptide.internals.extensions.rememberChannelPermissions +import chat.peptide.screens.chat.dialogs.InviteDialog import kotlinx.coroutines.delay import kotlinx.coroutines.launch @OptIn(ExperimentalMaterial3Api::class) @Composable fun ChannelInfoSheet(channelId: String, onHideSheet: suspend () -> Unit) { - val channel = RevoltAPI.channelCache[channelId] + val channel = PeptideAPI.channelCache[channelId] var memberListSheetShown by remember { mutableStateOf(false) } var inviteDialogShown by remember { mutableStateOf(false) } val scope = rememberCoroutineScope() @@ -95,7 +95,7 @@ fun ChannelInfoSheet(channelId: String, onHideSheet: suspend () -> Unit) { val partner = ChannelUtils .resolveDMPartner(channel) ?.let { - RevoltAPI.userCache[it] + PeptideAPI.userCache[it] } Column( @@ -140,7 +140,7 @@ fun ChannelInfoSheet(channelId: String, onHideSheet: suspend () -> Unit) { if ( Roles.permissionFor( channel, - RevoltAPI.userCache[RevoltAPI.selfId] + PeptideAPI.userCache[PeptideAPI.selfId] ) has PermissionBit.InviteOthers ) { when (channel.channelType) { diff --git a/app/src/main/java/chat/revolt/sheets/ColourPickerSheet.kt b/app/src/main/java/chat/peptide/sheets/ColourPickerSheet.kt similarity index 98% rename from app/src/main/java/chat/revolt/sheets/ColourPickerSheet.kt rename to app/src/main/java/chat/peptide/sheets/ColourPickerSheet.kt index 0449fc3e..f3e0edfc 100644 --- a/app/src/main/java/chat/revolt/sheets/ColourPickerSheet.kt +++ b/app/src/main/java/chat/peptide/sheets/ColourPickerSheet.kt @@ -1,4 +1,4 @@ -package chat.revolt.sheets +package chat.peptide.sheets import android.graphics.RuntimeShader import android.os.Build @@ -29,7 +29,6 @@ import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Check import androidx.compose.material.icons.filled.CheckCircle import androidx.compose.material.icons.filled.Close -import androidx.compose.material3.Button import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme @@ -40,7 +39,6 @@ import androidx.compose.material3.Slider import androidx.compose.material3.SliderDefaults import androidx.compose.material3.SliderState import androidx.compose.material3.Text -import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue @@ -61,8 +59,10 @@ import androidx.compose.ui.graphics.toArgb import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp -import chat.revolt.R -import chat.revolt.internals.TailwindColourScheme +import chat.peptide.R +import chat.peptide.composables.generic.PepTextButton +import chat.peptide.composables.generic.SquareButton +import chat.peptide.internals.TailwindColourScheme import org.intellij.lang.annotations.Language enum class ColourPickerMode { @@ -629,7 +629,7 @@ fun ColumnScope.ColourPickerSheet( }, ) - TextButton( + PepTextButton( onClick = { try { color = Color(android.graphics.Color.parseColor(hex)) @@ -671,7 +671,7 @@ fun ColumnScope.ColourPickerSheet( Modifier.fillMaxWidth(), verticalArrangement = Arrangement.spacedBy(4.dp) ) { - TextButton(onClick = onUseDefaultColour, Modifier.fillMaxWidth()) { + PepTextButton(onClick = onUseDefaultColour, Modifier.fillMaxWidth()) { Icon(Icons.Default.CheckCircle, null) Spacer(Modifier.width(8.dp)) Text(stringResource(R.string.colour_picker_use_default)) @@ -681,12 +681,12 @@ fun ColumnScope.ColourPickerSheet( Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.spacedBy(4.dp) ) { - TextButton(onClick = onDismiss, modifier = Modifier.weight(1f)) { + PepTextButton(onClick = onDismiss, modifier = Modifier.weight(1f)) { Icon(Icons.Default.Close, null) Spacer(Modifier.width(8.dp)) Text(stringResource(R.string.colour_picker_cancel)) } - Button( + SquareButton( onClick = { onColourSelected(color.toArgb()) }, modifier = Modifier.weight(1f) ) { diff --git a/app/src/main/java/chat/revolt/sheets/EarlyAccessSheet.kt b/app/src/main/java/chat/peptide/sheets/EarlyAccessSheet.kt similarity index 92% rename from app/src/main/java/chat/revolt/sheets/EarlyAccessSheet.kt rename to app/src/main/java/chat/peptide/sheets/EarlyAccessSheet.kt index 0608a985..386c1536 100644 --- a/app/src/main/java/chat/revolt/sheets/EarlyAccessSheet.kt +++ b/app/src/main/java/chat/peptide/sheets/EarlyAccessSheet.kt @@ -1,4 +1,4 @@ -package chat.revolt.sheets +package chat.peptide.sheets import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Arrangement @@ -16,7 +16,8 @@ import androidx.compose.ui.res.stringResource 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.peptide.R +import chat.peptide.composables.generic.PepTextButton @Composable fun EarlyAccessSheet(onClose: () -> Unit) { @@ -55,7 +56,7 @@ fun EarlyAccessSheet(onClose: () -> Unit) { style = MaterialTheme.typography.bodyLarge, textAlign = TextAlign.Center ) - TextButton(onClick = onClose, modifier = Modifier.fillMaxWidth()) { + PepTextButton(onClick = onClose, modifier = Modifier.fillMaxWidth()) { Text(stringResource(R.string.spark_early_access_cta)) } } diff --git a/app/src/main/java/chat/revolt/sheets/EmoteInfoSheet.kt b/app/src/main/java/chat/peptide/sheets/EmoteInfoSheet.kt similarity index 87% rename from app/src/main/java/chat/revolt/sheets/EmoteInfoSheet.kt rename to app/src/main/java/chat/peptide/sheets/EmoteInfoSheet.kt index bb70f794..4edc3ac1 100644 --- a/app/src/main/java/chat/revolt/sheets/EmoteInfoSheet.kt +++ b/app/src/main/java/chat/peptide/sheets/EmoteInfoSheet.kt @@ -1,4 +1,4 @@ -package chat.revolt.sheets +package chat.peptide.sheets import android.widget.Toast import androidx.compose.foundation.layout.Arrangement @@ -30,14 +30,14 @@ import androidx.compose.ui.text.AnnotatedString 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.RevoltAPI -import chat.revolt.api.routes.custom.fetchEmoji -import chat.revolt.api.schemas.Emoji -import chat.revolt.api.schemas.Server -import chat.revolt.composables.generic.RemoteImage -import chat.revolt.composables.generic.SheetButton -import chat.revolt.internals.Platform +import chat.peptide.R +import chat.peptide.api.PeptideAPI +import chat.peptide.api.routes.custom.fetchEmoji +import chat.peptide.api.schemas.Emoji +import chat.peptide.api.schemas.Server +import chat.peptide.composables.generic.RemoteImage +import chat.peptide.composables.generic.SheetButton +import chat.peptide.internals.Platform import kotlinx.coroutines.launch @Composable @@ -50,9 +50,9 @@ fun EmoteInfoSheet(id: String, onDismiss: () -> Unit) { var parentServer by remember { mutableStateOf(null) } LaunchedEffect(id) { - emoteInfo = RevoltAPI.emojiCache[id] ?: fetchEmoji(id) + emoteInfo = PeptideAPI.emojiCache[id] ?: fetchEmoji(id) when (emoteInfo?.parent?.type) { - "Server" -> parentServer = RevoltAPI.serverCache[emoteInfo?.parent?.id] + "Server" -> parentServer = PeptideAPI.serverCache[emoteInfo?.parent?.id] } } @@ -64,7 +64,7 @@ fun EmoteInfoSheet(id: String, onDismiss: () -> Unit) { verticalAlignment = Alignment.CenterVertically ) { RemoteImage( - url = "${RevoltAPI.getCurrentFilesUrl()}/emojis/$id", + url = "${PeptideAPI.getCurrentFilesUrl()}/emojis/$id", description = emoteInfo?.name, contentScale = ContentScale.Fit, modifier = Modifier diff --git a/app/src/main/java/chat/revolt/sheets/JBMDebuggerSheet.kt b/app/src/main/java/chat/peptide/sheets/JBMDebuggerSheet.kt similarity index 95% rename from app/src/main/java/chat/revolt/sheets/JBMDebuggerSheet.kt rename to app/src/main/java/chat/peptide/sheets/JBMDebuggerSheet.kt index 6faa88f5..90c524c6 100644 --- a/app/src/main/java/chat/revolt/sheets/JBMDebuggerSheet.kt +++ b/app/src/main/java/chat/peptide/sheets/JBMDebuggerSheet.kt @@ -1,4 +1,4 @@ -package chat.revolt.sheets +package chat.peptide.sheets import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column @@ -21,9 +21,9 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.drawBehind import androidx.compose.ui.geometry.Offset import androidx.compose.ui.unit.dp -import chat.revolt.composables.generic.SheetHeaderPadding -import chat.revolt.markdown.jbm.JBM -import chat.revolt.markdown.jbm.JBMApi +import chat.peptide.composables.generic.SheetHeaderPadding +import chat.peptide.markdown.jbm.JBM +import chat.peptide.markdown.jbm.JBMApi import org.intellij.markdown.ast.ASTNode import org.intellij.markdown.ast.getTextInNode diff --git a/app/src/main/java/chat/revolt/sheets/LinkInfoSheet.kt b/app/src/main/java/chat/peptide/sheets/LinkInfoSheet.kt similarity index 96% rename from app/src/main/java/chat/revolt/sheets/LinkInfoSheet.kt rename to app/src/main/java/chat/peptide/sheets/LinkInfoSheet.kt index 45c5dde5..c9d4fb68 100644 --- a/app/src/main/java/chat/revolt/sheets/LinkInfoSheet.kt +++ b/app/src/main/java/chat/peptide/sheets/LinkInfoSheet.kt @@ -1,4 +1,4 @@ -package chat.revolt.sheets +package chat.peptide.sheets import android.net.Uri import android.widget.Toast @@ -24,9 +24,9 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.unit.dp -import chat.revolt.R -import chat.revolt.composables.generic.SheetButton -import chat.revolt.internals.Platform +import chat.peptide.R +import chat.peptide.composables.generic.SheetButton +import chat.peptide.internals.Platform import kotlinx.coroutines.launch @Composable diff --git a/app/src/main/java/chat/revolt/sheets/MemberContextSheet.kt b/app/src/main/java/chat/peptide/sheets/MemberContextSheet.kt similarity index 90% rename from app/src/main/java/chat/revolt/sheets/MemberContextSheet.kt rename to app/src/main/java/chat/peptide/sheets/MemberContextSheet.kt index 6ccf99c0..5b4401c5 100644 --- a/app/src/main/java/chat/revolt/sheets/MemberContextSheet.kt +++ b/app/src/main/java/chat/peptide/sheets/MemberContextSheet.kt @@ -1,4 +1,4 @@ -package chat.revolt.sheets +package chat.peptide.sheets import android.widget.Toast import androidx.compose.foundation.layout.ColumnScope @@ -16,11 +16,11 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.style.TextOverflow -import chat.revolt.R -import chat.revolt.api.RevoltAPI -import chat.revolt.api.routes.channel.removeMember -import chat.revolt.composables.generic.SheetButton -import chat.revolt.internals.Platform +import chat.peptide.R +import chat.peptide.api.PeptideAPI +import chat.peptide.api.routes.channel.removeMember +import chat.peptide.composables.generic.SheetButton +import chat.peptide.internals.Platform import kotlinx.coroutines.launch @Composable @@ -31,7 +31,7 @@ fun ColumnScope.GroupDMMemberContextSheet( onRequestUpdateMembers: suspend () -> Unit ) { val scope = rememberCoroutineScope() - val channel = RevoltAPI.channelCache[channelId] + val channel = PeptideAPI.channelCache[channelId] val clipboardManager = LocalClipboardManager.current val context = LocalContext.current @@ -43,7 +43,7 @@ fun ColumnScope.GroupDMMemberContextSheet( if (channel == null) return - if (channel.owner == RevoltAPI.selfId && userId != RevoltAPI.selfId) { + if (channel.owner == PeptideAPI.selfId && userId != PeptideAPI.selfId) { SheetButton( headlineContent = { CompositionLocalProvider(value = LocalContentColor provides MaterialTheme.colorScheme.error) { @@ -110,8 +110,8 @@ fun ColumnScope.ServerMemberContextSheet( dismissSheet: suspend () -> Unit, onRequestUpdateMembers: suspend () -> Unit ) { - val server = RevoltAPI.serverCache[serverId] - val channel = RevoltAPI.channelCache[channelId] + val server = PeptideAPI.serverCache[serverId] + val channel = PeptideAPI.channelCache[channelId] val clipboardManager = LocalClipboardManager.current val context = LocalContext.current diff --git a/app/src/main/java/chat/revolt/sheets/MemberListSheet.kt b/app/src/main/java/chat/peptide/sheets/MemberListSheet.kt similarity index 91% rename from app/src/main/java/chat/revolt/sheets/MemberListSheet.kt rename to app/src/main/java/chat/peptide/sheets/MemberListSheet.kt index 03a2d296..9a422e6d 100644 --- a/app/src/main/java/chat/revolt/sheets/MemberListSheet.kt +++ b/app/src/main/java/chat/peptide/sheets/MemberListSheet.kt @@ -1,4 +1,4 @@ -package chat.revolt.sheets +package chat.peptide.sheets import android.annotation.SuppressLint import android.content.Context @@ -32,20 +32,20 @@ import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import chat.revolt.R -import chat.revolt.api.RevoltAPI -import chat.revolt.api.internals.PermissionBit -import chat.revolt.api.internals.Roles -import chat.revolt.api.internals.hasPermission -import chat.revolt.api.routes.channel.fetchGroupParticipants -import chat.revolt.api.routes.server.fetchMembers -import chat.revolt.api.schemas.Member -import chat.revolt.api.schemas.User -import chat.revolt.composables.chat.MemberListItem -import chat.revolt.composables.generic.CountableListHeader -import chat.revolt.composables.generic.Presence -import chat.revolt.composables.generic.SheetHeaderPadding -import chat.revolt.composables.generic.presenceFromStatus +import chat.peptide.R +import chat.peptide.api.PeptideAPI +import chat.peptide.api.internals.PermissionBit +import chat.peptide.api.internals.Roles +import chat.peptide.api.internals.hasPermission +import chat.peptide.api.routes.channel.fetchGroupParticipants +import chat.peptide.api.routes.server.fetchMembers +import chat.peptide.api.schemas.Member +import chat.peptide.api.schemas.User +import chat.peptide.composables.chat.MemberListItem +import chat.peptide.composables.generic.CountableListHeader +import chat.peptide.composables.generic.Presence +import chat.peptide.composables.generic.SheetHeaderPadding +import chat.peptide.composables.generic.presenceFromStatus import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.qualifiers.ApplicationContext import kotlinx.coroutines.flow.distinctUntilChanged @@ -53,7 +53,7 @@ import kotlinx.coroutines.launch import javax.inject.Inject val DO_NOT_FETCH_OFFLINE_MEMBERS_SERVERS = listOf( - "01F7ZSBSFHQ8TA81725KQCSDDP" // Revolt Lounge + "01F7ZSBSFHQ8TA81725KQCSDDP" // Peptide Lounge ) sealed class MemberListSheetItem { @@ -75,7 +75,7 @@ class MemberListSheetViewModel @Inject constructor( serverId = serverId, includeOffline = serverId !in DO_NOT_FETCH_OFFLINE_MEMBERS_SERVERS ).members - val channel = RevoltAPI.channelCache[channelId] ?: return@launch + val channel = PeptideAPI.channelCache[channelId] ?: return@launch val categories = mutableMapOf>() @@ -83,7 +83,7 @@ class MemberListSheetViewModel @Inject constructor( val defaultCategoryName = context.getString(R.string.status_online) memberList.forEach { member -> - val user = RevoltAPI.userCache[member.id!!.user] ?: run { + val user = PeptideAPI.userCache[member.id!!.user] ?: run { Log.w( "MemberListSheet", "User ${member.id.user} found in member list of server $serverId but not in user cache" @@ -215,8 +215,8 @@ fun MemberListSheet( var memberContextSheetTarget by remember { mutableStateOf("") } // We use LaunchedEffect to make sure that this is called every time any of the users status changes - LaunchedEffect(RevoltAPI.userCache) { - snapshotFlow { RevoltAPI.userCache }.distinctUntilChanged().collect { + LaunchedEffect(PeptideAPI.userCache) { + snapshotFlow { PeptideAPI.userCache }.distinctUntilChanged().collect { if (serverId != null) { viewModel.fetchServerMemberList(serverId, channelId) } else { @@ -226,7 +226,9 @@ fun MemberListSheet( } if (showUserInfoSheet) { - val userContextSheetState = rememberModalBottomSheetState() + val userContextSheetState = rememberModalBottomSheetState( + skipPartiallyExpanded = true, + ) ModalBottomSheet( sheetState = userContextSheetState, @@ -236,7 +238,6 @@ fun MemberListSheet( ) { UserInfoSheet( userId = userInfoSheetTarget, - serverId = serverId, dismissSheet = { userContextSheetState.hide() showUserInfoSheet = false @@ -319,7 +320,7 @@ fun MemberListSheet( is MemberListSheetItem.MemberItem -> item(key = item.member.id!!.user) { MemberListItem( - user = RevoltAPI.userCache[item.member.id.user], + user = PeptideAPI.userCache[item.member.id.user], member = item.member, serverId = serverId, userId = item.member.id.user, diff --git a/app/src/main/java/chat/revolt/sheets/MessageContextSheet.kt b/app/src/main/java/chat/peptide/sheets/MessageContextSheet.kt similarity index 92% rename from app/src/main/java/chat/revolt/sheets/MessageContextSheet.kt rename to app/src/main/java/chat/peptide/sheets/MessageContextSheet.kt index 3e103127..5e862cd1 100644 --- a/app/src/main/java/chat/revolt/sheets/MessageContextSheet.kt +++ b/app/src/main/java/chat/peptide/sheets/MessageContextSheet.kt @@ -1,4 +1,4 @@ -package chat.revolt.sheets +package chat.peptide.sheets import android.widget.Toast import androidx.compose.foundation.layout.Arrangement @@ -10,14 +10,12 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material3.AlertDialog -import androidx.compose.material3.Button import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.Text -import androidx.compose.material3.TextButton import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue @@ -33,19 +31,21 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.unit.dp -import chat.revolt.BuildConfig -import chat.revolt.R -import chat.revolt.api.RevoltAPI -import chat.revolt.api.internals.PermissionBit -import chat.revolt.api.internals.Roles -import chat.revolt.api.internals.has -import chat.revolt.api.routes.channel.deleteMessage -import chat.revolt.api.routes.channel.react -import chat.revolt.api.settings.Experiments -import chat.revolt.callbacks.UiCallbacks -import chat.revolt.composables.chat.Message -import chat.revolt.composables.generic.SheetButton -import chat.revolt.internals.Platform +import chat.peptide.BuildConfig +import chat.peptide.R +import chat.peptide.api.PeptideAPI +import chat.peptide.api.internals.PermissionBit +import chat.peptide.api.internals.Roles +import chat.peptide.api.internals.has +import chat.peptide.api.routes.channel.deleteMessage +import chat.peptide.api.routes.channel.react +import chat.peptide.api.settings.Experiments +import chat.peptide.callbacks.UiCallbacks +import chat.peptide.composables.chat.Message +import chat.peptide.composables.generic.PepTextButton +import chat.peptide.composables.generic.SheetButton +import chat.peptide.composables.generic.SquareButton +import chat.peptide.internals.Platform import kotlinx.coroutines.launch @OptIn(ExperimentalMaterial3Api::class) @@ -55,7 +55,7 @@ fun MessageContextSheet( onHideSheet: suspend () -> Unit, onReportMessage: () -> Unit ) { - val message = RevoltAPI.messageCache[messageId] + val message = PeptideAPI.messageCache[messageId] if (message == null) { Box( modifier = Modifier @@ -76,7 +76,7 @@ fun MessageContextSheet( var showDeleteMessageConfirmation by remember { mutableStateOf(false) } var showInspectASTSheet by remember { mutableStateOf(false) } val showInspectASTSheetButton = - BuildConfig.DEBUG || (message.content != null && Experiments.useKotlinBasedMarkdownRenderer.isEnabled) + BuildConfig.DEBUG && (message.content != null && Experiments.useKotlinBasedMarkdownRenderer.isEnabled) if (showShareSheet) { val shareSheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true) @@ -171,11 +171,11 @@ fun MessageContextSheet( return@SheetButton } - val server = RevoltAPI.serverCache.values.find { server -> + val server = PeptideAPI.serverCache.values.find { server -> server.channels?.contains(message.channel) ?: false } val messageLink = - "${RevoltAPI.getCurrentAppUrl()}/server/${server?.id}/channel/${message.channel}/${message.id}" + "${PeptideAPI.getCurrentAppUrl()}/server/${server?.id}/channel/${message.channel}/${message.id}" clipboardManager.setText(AnnotatedString(messageLink)) if (Platform.needsShowClipboardNotification()) { @@ -280,7 +280,7 @@ fun MessageContextSheet( ) }, confirmButton = { - Button( + SquareButton( onClick = { showDeleteMessageConfirmation = false coroutineScope.launch { @@ -295,7 +295,7 @@ fun MessageContextSheet( } }, dismissButton = { - TextButton( + PepTextButton( onClick = { showDeleteMessageConfirmation = false } @@ -374,7 +374,7 @@ fun MessageContextSheet( } ) - if (message.author == RevoltAPI.selfId) { + if (message.author == PeptideAPI.selfId) { SheetButton( leadingContent = { Icon( @@ -460,12 +460,12 @@ fun MessageContextSheet( if ( (message.channel?.let { - val channel = RevoltAPI.channelCache[it] ?: return@let null + val channel = PeptideAPI.channelCache[it] ?: return@let null Roles.permissionFor( channel, - RevoltAPI.userCache[RevoltAPI.selfId] + PeptideAPI.userCache[PeptideAPI.selfId] ) - } ?: 0) has PermissionBit.ManageMessages || message.author == RevoltAPI.selfId + } ?: 0) has PermissionBit.ManageMessages || message.author == PeptideAPI.selfId ) { SheetButton( leadingContent = { @@ -486,7 +486,7 @@ fun MessageContextSheet( ) } - if (message.author != RevoltAPI.selfId) { + if (message.author != PeptideAPI.selfId) { SheetButton( leadingContent = { Icon( diff --git a/app/src/main/java/chat/revolt/sheets/ReactSheet.kt b/app/src/main/java/chat/peptide/sheets/ReactSheet.kt similarity index 61% rename from app/src/main/java/chat/revolt/sheets/ReactSheet.kt rename to app/src/main/java/chat/peptide/sheets/ReactSheet.kt index 88f2f576..98c69aac 100644 --- a/app/src/main/java/chat/revolt/sheets/ReactSheet.kt +++ b/app/src/main/java/chat/peptide/sheets/ReactSheet.kt @@ -1,12 +1,12 @@ -package chat.revolt.sheets +package chat.peptide.sheets import androidx.compose.runtime.Composable -import chat.revolt.api.RevoltAPI -import chat.revolt.composables.emoji.EmojiPicker +import chat.peptide.api.PeptideAPI +import chat.peptide.composables.emoji.EmojiPicker @Composable fun ReactSheet(messageId: String, onSelect: (String?) -> Unit) { - val message = RevoltAPI.messageCache[messageId] + val message = PeptideAPI.messageCache[messageId] if (message == null) { onSelect(null) diff --git a/app/src/main/java/chat/revolt/sheets/ReactionInfoSheet.kt b/app/src/main/java/chat/peptide/sheets/ReactionInfoSheet.kt similarity index 88% rename from app/src/main/java/chat/revolt/sheets/ReactionInfoSheet.kt rename to app/src/main/java/chat/peptide/sheets/ReactionInfoSheet.kt index f71d4fdb..f77b818e 100644 --- a/app/src/main/java/chat/revolt/sheets/ReactionInfoSheet.kt +++ b/app/src/main/java/chat/peptide/sheets/ReactionInfoSheet.kt @@ -1,4 +1,4 @@ -package chat.revolt.sheets +package chat.peptide.sheets import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.clickable @@ -16,14 +16,12 @@ import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.material3.AlertDialog -import androidx.compose.material3.Button import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.LocalTextStyle import androidx.compose.material3.MaterialTheme import androidx.compose.material3.PrimaryScrollableTabRow import androidx.compose.material3.Tab import androidx.compose.material3.Text -import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue @@ -43,25 +41,27 @@ 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.R -import chat.revolt.api.RevoltAPI -import chat.revolt.api.internals.isUlid -import chat.revolt.api.routes.custom.fetchEmoji -import chat.revolt.api.routes.user.fetchUser -import chat.revolt.api.schemas.Emoji -import chat.revolt.api.schemas.User -import chat.revolt.api.settings.LoadedSettings -import chat.revolt.composables.chat.MemberListItem -import chat.revolt.composables.generic.RemoteImage -import chat.revolt.internals.text.MessageProcessor -import chat.revolt.persistence.KVStorage +import chat.peptide.R +import chat.peptide.api.PeptideAPI +import chat.peptide.api.internals.isUlid +import chat.peptide.api.routes.custom.fetchEmoji +import chat.peptide.api.routes.user.fetchUser +import chat.peptide.api.schemas.Emoji +import chat.peptide.api.schemas.User +import chat.peptide.api.settings.LoadedSettings +import chat.peptide.composables.chat.MemberListItem +import chat.peptide.composables.generic.PepTextButton +import chat.peptide.composables.generic.RemoteImage +import chat.peptide.composables.generic.SquareButton +import chat.peptide.internals.text.MessageProcessor +import chat.peptide.persistence.KVStorage import kotlinx.coroutines.launch @OptIn(ExperimentalFoundationApi::class) @Composable fun ReactionInfoSheet(messageId: String, emoji: String, onDismiss: () -> Unit) { - val message = RevoltAPI.messageCache[messageId] ?: return - val channel = RevoltAPI.channelCache[message.channel] ?: return + val message = PeptideAPI.messageCache[messageId] ?: return + val channel = PeptideAPI.channelCache[message.channel] ?: return val reactions = message.reactions val interactions = message.interactions?.reactions ?: emptyList() val reactionEmoji = @@ -71,7 +71,7 @@ fun ReactionInfoSheet(messageId: String, emoji: String, onDismiss: () -> Unit) { .filterNot { it.isEmpty() } .sortedBy { if (it.isUlid()) { - RevoltAPI.emojiCache[it]?.name ?: it.codePointAt(0).toString() + PeptideAPI.emojiCache[it]?.name ?: it.codePointAt(0).toString() } else { it.codePointAt(0).toString() } @@ -85,7 +85,7 @@ fun ReactionInfoSheet(messageId: String, emoji: String, onDismiss: () -> Unit) { LaunchedEffect(reactionEmoji) { reactionEmoji?.forEach { if (it.isUlid()) { - extendedEmojiInfo.add(RevoltAPI.emojiCache[it] ?: fetchEmoji(it)) + extendedEmojiInfo.add(PeptideAPI.emojiCache[it] ?: fetchEmoji(it)) } } } @@ -118,7 +118,7 @@ fun ReactionInfoSheet(messageId: String, emoji: String, onDismiss: () -> Unit) { if (emoji.isUlid()) { Row(verticalAlignment = Alignment.CenterVertically) { RemoteImage( - url = "${RevoltAPI.getCurrentFilesUrl()}/emojis/${emoji}", + url = "${PeptideAPI.getCurrentFilesUrl()}/emojis/${emoji}", description = null, modifier = Modifier.size(16.dp) ) @@ -181,7 +181,7 @@ fun ReactionInfoSheet(messageId: String, emoji: String, onDismiss: () -> Unit) { title = { Text("Traveller, you may not unsee your knowledge...") }, text = { Text("Experimental features are already unlocked.") }, confirmButton = { - TextButton(onClick = { showEnabledAlreadyAlert = false }) { + PepTextButton(onClick = { showEnabledAlreadyAlert = false }) { Text("OK") } } @@ -194,7 +194,7 @@ fun ReactionInfoSheet(messageId: String, emoji: String, onDismiss: () -> Unit) { title = { Text("You hear a faint whisper in the wind...") }, text = { Text("Would you like to enable experimental features? They may be unstable.") }, confirmButton = { - TextButton(onClick = { + PepTextButton(onClick = { showEnabledConfirmAlert = false LoadedSettings.experimentsEnabled = true scope.launch { @@ -205,7 +205,7 @@ fun ReactionInfoSheet(messageId: String, emoji: String, onDismiss: () -> Unit) { } }, dismissButton = { - Button(onClick = { showEnabledConfirmAlert = false }) { + SquareButton(onClick = { showEnabledConfirmAlert = false }) { Text("I shall not risk it.") } } @@ -228,7 +228,7 @@ fun ReactionInfoSheet(messageId: String, emoji: String, onDismiss: () -> Unit) { if (current.isUlid()) { val cached = extendedEmojiInfo.find { it.id == current } RemoteImage( - url = "${RevoltAPI.getCurrentFilesUrl()}/emojis/$current", + url = "${PeptideAPI.getCurrentFilesUrl()}/emojis/$current", description = cached?.name, contentScale = ContentScale.Fit, modifier = Modifier @@ -288,7 +288,7 @@ fun ReactionInfoSheet(messageId: String, emoji: String, onDismiss: () -> Unit) { val cached = extendedEmojiInfo.find { it.id == current } if (cached?.parent != null) { when (cached.parent.type) { - "Server" -> RevoltAPI.serverCache[cached.parent.id]?.name?.let { + "Server" -> PeptideAPI.serverCache[cached.parent.id]?.name?.let { stringResource( id = R.string.emote_info_from_server, it @@ -316,18 +316,18 @@ fun ReactionInfoSheet(messageId: String, emoji: String, onDismiss: () -> Unit) { val reactionsForEmoji = reactions?.get(reactionEmoji[selectedReactionIndex]) ?: emptyList() items(items = reactionsForEmoji) { reaction -> - val userOrNull = RevoltAPI.userCache[reaction] + val userOrNull = PeptideAPI.userCache[reaction] val user = userOrNull ?: User.getPlaceholder(reaction) val member = if (channel.server != null && user.id != null) { - RevoltAPI.members.getMember(channel.server, user.id) + PeptideAPI.members.getMember(channel.server, user.id) } else { null } LaunchedEffect(reaction) { - if (reaction !in RevoltAPI.userCache) { + if (reaction !in PeptideAPI.userCache) { try { - RevoltAPI.userCache[reaction] = fetchUser(reaction) + PeptideAPI.userCache[reaction] = fetchUser(reaction) } catch (e: Exception) { // too bad! } diff --git a/app/src/main/java/chat/peptide/sheets/ServerContextSheet.kt b/app/src/main/java/chat/peptide/sheets/ServerContextSheet.kt new file mode 100644 index 00000000..3704e291 --- /dev/null +++ b/app/src/main/java/chat/peptide/sheets/ServerContextSheet.kt @@ -0,0 +1,478 @@ +package chat.peptide.sheets + +import android.content.Intent +import android.widget.Toast +import androidx.compose.foundation.background +import androidx.compose.animation.AnimatedContent +import androidx.compose.animation.core.tween +import androidx.compose.animation.slideInHorizontally +import androidx.compose.animation.slideOutHorizontally +import androidx.compose.animation.togetherWith +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.text.selection.SelectionContainer +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.Checkbox +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.Icon +import androidx.compose.material3.LocalContentColor +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.RadioButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.ui.platform.LocalClipboardManager +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.AnnotatedString +import androidx.compose.ui.unit.dp +import androidx.core.net.toUri +import chat.peptide.R +import chat.peptide.api.PeptideAPI +import chat.peptide.api.routes.server.leaveOrDeleteServer +import chat.peptide.api.schemas.NotificationSettings +import chat.peptide.api.settings.NotificationType +import chat.peptide.api.settings.SyncedSettings +import chat.peptide.composables.generic.PepTextButton +import chat.peptide.composables.generic.SheetButton +import chat.peptide.composables.generic.SquareButton +import chat.peptide.composables.markdown.RichMarkdown +import chat.peptide.composables.screens.settings.ServerOverview +import chat.peptide.composables.sheets.SheetSelection +import chat.peptide.callbacks.Action +import chat.peptide.callbacks.ActionChannel +import chat.peptide.internals.Platform +import chat.peptide.screens.chat.ChatRouterDestination +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.launch + +@Composable +fun ServerContextSheet( + serverId: String, + onReportServer: () -> Unit, + onHideSheet: suspend () -> Unit +) { + val coroutineScope = rememberCoroutineScope() + val clipboardManager = LocalClipboardManager.current + val context = LocalContext.current + var showLeaveConfirmation by remember { mutableStateOf(false) } + var leaveSilently by remember { mutableStateOf(false) } + val server = PeptideAPI.serverCache[serverId] + + LaunchedEffect(server) { + if (server == null) { + coroutineScope.launch { + onHideSheet() + } + } + } + + if (server == null) { + return + } + + var page by remember { mutableIntStateOf(0) } + + if (showLeaveConfirmation) { + AlertDialog( + onDismissRequest = { + showLeaveConfirmation = false + }, + title = { + Text( + text = stringResource( + id = R.string.server_context_sheet_actions_leave_confirm, + server.name ?: stringResource(R.string.unknown) + ) + ) + }, + text = { + Column { + Text( + text = stringResource( + id = R.string.server_context_sheet_actions_leave_confirm_eyebrow + ) + ) + Row( + Modifier + .fillMaxWidth() + .padding(start = 0.dp, end = 0.dp, top = 16.dp, bottom = 0.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Checkbox( + checked = leaveSilently, + onCheckedChange = { leaveSilently = it } + ) + Text( + text = stringResource( + id = R.string.server_context_sheet_actions_leave_silently + ), + modifier = Modifier.padding(start = 4.dp) + ) + } + } + }, + confirmButton = { + SquareButton( + onClick = { + coroutineScope.launch { + try { + leaveOrDeleteServer(serverId, leaveSilently) + PeptideAPI.serverCache.remove(serverId) + ActionChannel.send(Action.ChatNavigate(ChatRouterDestination.Home)) + } catch (_: Exception) { + // ignore + } finally { + showLeaveConfirmation = false + } + } + } + ) { + Text( + text = stringResource( + id = R.string.server_context_sheet_actions_leave_confirm_yes + ) + ) + } + }, + dismissButton = { + PepTextButton( + onClick = { + showLeaveConfirmation = false + } + ) { + Text( + text = stringResource( + id = R.string.server_context_sheet_actions_leave_confirm_no + ) + ) + } + } + ) + } + + AnimatedContent( + targetState = page, + transitionSpec = { + if (targetState > initialState) { + slideInHorizontally(animationSpec = tween(200)) { it } togetherWith + slideOutHorizontally(animationSpec = tween(200)) { -it } + } else { + slideInHorizontally(animationSpec = tween(200)) { -it } togetherWith + slideOutHorizontally(animationSpec = tween(200)) { it } + } + }, label = "Server context pager" + ) { current -> + if (current == 0) { + Column(Modifier.verticalScroll(rememberScrollState())) { + Column( + verticalArrangement = Arrangement.spacedBy(16.dp), + modifier = Modifier + .padding(top = 8.dp, start = 16.dp, end = 16.dp, bottom = 4.dp), + ) { + ServerOverview(server) + + SelectionContainer { + RichMarkdown( + input = if (server.description?.isBlank() == false) { + server.description + } else { + stringResource( + R.string.server_context_sheet_description_empty + ) + } + ) + } + + if (server.owner == PeptideAPI.selfId) { + Box( + modifier = Modifier + .clip(MaterialTheme.shapes.medium) + .background(MaterialTheme.colorScheme.primary) + ) { + CompositionLocalProvider(LocalContentColor provides MaterialTheme.colorScheme.onPrimary) { + SheetSelection( + icon = {}, + title = { + Text( + text = stringResource(id = R.string.server_context_sheet_moderators_early_disclaimer_title) + ) + }, + description = { + Text( + text = stringResource(id = R.string.server_context_sheet_moderators_early_disclaimer_body) + ) + }, + arrowTint = LocalContentColor.current.copy(alpha = 0.5f), + ) { + context.startActivity( + Intent( + Intent.ACTION_VIEW, + "${PeptideAPI.getCurrentAppUrl()}/server/${server.id}/settings".toUri() + ) + ) + } + } + } + } + Spacer(modifier = Modifier.height(12.dp)) + } + + // Primary actions group + Column( + modifier = Modifier + .padding(horizontal = 12.dp) + .clip(RoundedCornerShape(16.dp)) + .background(MaterialTheme.colorScheme.surfaceBright) + ) { + SheetButton( + leadingContent = { + Icon( + painter = painterResource(id = R.drawable.icn_identifier_copy_24dp), + contentDescription = null + ) + }, + headlineContent = { + Text( + text = stringResource(id = R.string.server_context_sheet_actions_copy_id) + ) + }, + onClick = { + if (server.id == null) return@SheetButton + + clipboardManager.setText(AnnotatedString(server.id)) + + if (Platform.needsShowClipboardNotification()) { + Toast.makeText( + context, + context.getString(R.string.server_context_sheet_actions_copy_id_copied), + Toast.LENGTH_SHORT + ).show() + } + + coroutineScope.launch { + onHideSheet() + } + } + ) + HorizontalDivider() + SheetButton( + leadingContent = { + Icon( + painter = painterResource(R.drawable.icn_notification_settings_24dp), + contentDescription = null + ) + }, + headlineContent = { + Text( + text = stringResource(id = R.string.channel_info_sheet_options_notifications_manage) + ) + }, + onClick = { page = 1 } + ) + HorizontalDivider() + SheetButton( + leadingContent = { + Icon( + painter = painterResource(id = R.drawable.icn_mark_chat_read_24dp), + contentDescription = null + ) + }, + headlineContent = { + Text( + text = stringResource(id = R.string.server_context_sheet_actions_mark_read) + ) + }, + onClick = { + coroutineScope.launch { + server.id?.let { + PeptideAPI.unreads.markServerAsRead(it, sync = true) + } + onHideSheet() + } + } + ) + } + + // Danger actions group + if (server.owner != PeptideAPI.selfId) { + Column( + modifier = Modifier + .padding(start = 12.dp, end = 12.dp, top = 16.dp) + .clip(RoundedCornerShape(16.dp)) + .background(MaterialTheme.colorScheme.surfaceBright) + ) { + SheetButton( + leadingContent = { + Icon( + painter = painterResource(id = R.drawable.icn_report_24dp), + contentDescription = null + ) + }, + headlineContent = { + Text( + text = stringResource(id = R.string.server_context_sheet_actions_report), + ) + }, + dangerous = true, + onClick = { + onReportServer() + } + ) + + HorizontalDivider() + + SheetButton( + leadingContent = { + Icon( + painter = painterResource(id = R.drawable.icn_door_open_24dp), + contentDescription = null, + ) + }, + headlineContent = { + Text( + text = stringResource(id = R.string.server_context_sheet_actions_leave) + ) + }, + dangerous = true, + onClick = { + showLeaveConfirmation = true + } + ) + } + } + } + } else { + Column(Modifier.verticalScroll(rememberScrollState())) { + Box( + modifier = Modifier + .fillMaxWidth() + .padding(12.dp), + ) { + Icon( + painter = painterResource(id = R.drawable.ic_arrow_left_24dp), + contentDescription = null, + modifier = Modifier + .size(24.dp) + .clickable { page = 0 } + .align(Alignment.CenterStart) + ) + Text( + modifier = Modifier.align(Alignment.Center), + text = stringResource(id = R.string.channel_info_sheet_options_notifications_manage), + style = MaterialTheme.typography.titleMedium + ) + } + Column( + modifier = Modifier + .padding(top = 24.dp, start = 12.dp, end = 12.dp) + .clip(RoundedCornerShape(16.dp)) + .background(MaterialTheme.colorScheme.surfaceBright) + ) { + var selected by remember { + mutableStateOf( + NotificationType.fromStorage( + SyncedSettings.notifications.server[server.id ?: ""] + ).storageValue + ) + } + + fun updateSelection(newValue: NotificationType) { + selected = newValue.storageValue + val currentSettings = SyncedSettings.notifications + val updated = NotificationSettings( + server = currentSettings.server.toMutableMap().apply { + if (server.id.isNullOrBlank() || newValue == NotificationType.DEFAULT) { + if (!server.id.isNullOrBlank()) remove(server.id) + } else { + put(server.id!!, newValue.storageValue) + } + }, + channel = currentSettings.channel + ) + GlobalScope.launch { + SyncedSettings.updateNotifications(updated) + } + } + + @Composable + fun ServerNotificationRow(title: String, type: NotificationType) { + val isSelected = selected == type.storageValue + SheetButton( + headlineContent = { Text(text = title) }, + leadingContent = { + Icon( + painter = painterResource( + id = when (type) { + NotificationType.DEFAULT -> R.drawable.icn_notif_use_default + NotificationType.MUTED -> R.drawable.icn_notif_mute + NotificationType.ALL -> R.drawable.icn_notif_all_messages + NotificationType.MENTIONS_ONLY -> R.drawable.icn_notif_mention_only + NotificationType.NONE -> R.drawable.icn_notif_none + } + ), + contentDescription = null + ) + }, + trailingContent = { + RadioButton( + selected = isSelected, + onClick = { updateSelection(type) } + ) + }, + onClick = { updateSelection(type) } + ) + } + + ServerNotificationRow( + title = stringResource(id = R.string.notification_option_use_default), + type = NotificationType.DEFAULT + ) + HorizontalDivider(modifier = Modifier.padding(horizontal = 12.dp)) + ServerNotificationRow( + title = stringResource(id = R.string.notification_option_muted), + type = NotificationType.MUTED + ) + HorizontalDivider(modifier = Modifier.padding(horizontal = 12.dp)) + ServerNotificationRow( + title = stringResource(id = R.string.notification_option_all_messages), + type = NotificationType.ALL + ) + HorizontalDivider(modifier = Modifier.padding(horizontal = 12.dp)) + ServerNotificationRow( + title = stringResource(id = R.string.notification_option_mentions_only), + type = NotificationType.MENTIONS_ONLY + ) + HorizontalDivider(modifier = Modifier.padding(horizontal = 12.dp)) + ServerNotificationRow( + title = stringResource(id = R.string.notification_option_none), + type = NotificationType.NONE + ) + } + } + } + } +} diff --git a/app/src/main/java/chat/revolt/sheets/ServerIdentityOptionsSheet.kt b/app/src/main/java/chat/peptide/sheets/ServerIdentityOptionsSheet.kt similarity index 96% rename from app/src/main/java/chat/revolt/sheets/ServerIdentityOptionsSheet.kt rename to app/src/main/java/chat/peptide/sheets/ServerIdentityOptionsSheet.kt index 65004869..4ffd50a9 100644 --- a/app/src/main/java/chat/revolt/sheets/ServerIdentityOptionsSheet.kt +++ b/app/src/main/java/chat/peptide/sheets/ServerIdentityOptionsSheet.kt @@ -1,4 +1,4 @@ -package chat.revolt.sheets +package chat.peptide.sheets import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement @@ -24,14 +24,14 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp -import chat.revolt.api.RevoltAPI -import chat.revolt.persistence.KVStorage +import chat.peptide.api.PeptideAPI +import chat.peptide.persistence.KVStorage import kotlinx.coroutines.launch // Internal: Untranslated @Composable fun ServerIdentityOptionsSheet(userId: String) { - val user = RevoltAPI.userCache[userId] + val user = PeptideAPI.userCache[userId] if (user == null) { Text("No such user") diff --git a/app/src/main/java/chat/revolt/sheets/StatusSheet.kt b/app/src/main/java/chat/peptide/sheets/StatusSheet.kt similarity index 88% rename from app/src/main/java/chat/revolt/sheets/StatusSheet.kt rename to app/src/main/java/chat/peptide/sheets/StatusSheet.kt index fb2fdac0..73ad4817 100644 --- a/app/src/main/java/chat/revolt/sheets/StatusSheet.kt +++ b/app/src/main/java/chat/peptide/sheets/StatusSheet.kt @@ -1,4 +1,4 @@ -package chat.revolt.sheets +package chat.peptide.sheets import android.util.Log import androidx.compose.foundation.background @@ -13,14 +13,10 @@ import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.text.input.TextFieldLineLimits import androidx.compose.foundation.text.input.rememberTextFieldState import androidx.compose.foundation.verticalScroll -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Edit -import androidx.compose.material.icons.filled.Settings import androidx.compose.material3.AlertDialog import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text -import androidx.compose.material3.TextButton import androidx.compose.material3.TextField import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect @@ -36,16 +32,18 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import chat.revolt.R -import chat.revolt.api.RevoltAPI -import chat.revolt.api.routes.user.patchSelf -import chat.revolt.api.schemas.User -import chat.revolt.composables.generic.SheetButton -import chat.revolt.composables.generic.asApiName -import chat.revolt.composables.generic.presenceFromStatus -import chat.revolt.composables.screens.settings.UserOverview -import chat.revolt.composables.settings.profile.StatusPicker +import chat.peptide.R +import chat.peptide.api.PeptideAPI +import chat.peptide.api.routes.user.patchSelf +import chat.peptide.api.schemas.User +import chat.peptide.composables.generic.PepTextButton +import chat.peptide.composables.generic.SheetButton +import chat.peptide.composables.generic.asApiName +import chat.peptide.composables.generic.presenceFromStatus +import chat.peptide.composables.screens.settings.UserOverview +import chat.peptide.composables.settings.profile.StatusPicker import kotlinx.coroutines.launch @Composable @@ -101,7 +99,7 @@ fun StatusTextEditDialog( } }, confirmButton = { - TextButton( + PepTextButton( enabled = isConfirmEnabled, onClick = { errorText = null @@ -110,11 +108,11 @@ fun StatusTextEditDialog( } else { if (fieldState.text == initialStatus) { onDismiss() - return@TextButton + return@PepTextButton } else if (fieldState.text.isBlank()) { if (selfUser.status?.text == null) { onDismiss() - return@TextButton + return@PepTextButton } scope.launch { try { @@ -150,7 +148,7 @@ fun StatusTextEditDialog( } }, dismissButton = { - TextButton( + PepTextButton( onClick = onDismiss ) { Text( @@ -161,9 +159,20 @@ fun StatusTextEditDialog( ) } +@Composable +@Preview +fun StatusTextEditDialogPreview() { + StatusTextEditDialog( + selfUser = User.getPlaceholder("01G00000000000000000000000"), + initialStatus = "This is a test status", + onDismiss = {} + ) +} + + @Composable fun StatusSheet(onBeforeNavigation: () -> Unit, onGoSettings: () -> Unit) { - val selfUser = RevoltAPI.userCache[RevoltAPI.selfId]!! + val selfUser = PeptideAPI.userCache[PeptideAPI.selfId]!! val scope = rememberCoroutineScope() var showStatusEditDialog by remember { mutableStateOf(false) } @@ -253,3 +262,12 @@ fun StatusSheet(onBeforeNavigation: () -> Unit, onGoSettings: () -> Unit) { } + +@Preview +@Composable +fun StatusSheetPreview() { + StatusSheet( + onBeforeNavigation = {}, + onGoSettings = {} + ) +} diff --git a/app/src/main/java/chat/revolt/sheets/UserCardSheet.kt b/app/src/main/java/chat/peptide/sheets/UserCardSheet.kt similarity index 93% rename from app/src/main/java/chat/revolt/sheets/UserCardSheet.kt rename to app/src/main/java/chat/peptide/sheets/UserCardSheet.kt index c6386a55..eaac638d 100644 --- a/app/src/main/java/chat/revolt/sheets/UserCardSheet.kt +++ b/app/src/main/java/chat/peptide/sheets/UserCardSheet.kt @@ -1,4 +1,4 @@ -package chat.revolt.sheets +package chat.peptide.sheets import android.content.ClipData import android.content.Intent @@ -14,11 +14,9 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width -import androidx.compose.material3.Button import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text -import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf @@ -36,12 +34,14 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.core.content.FileProvider -import chat.revolt.BuildConfig -import chat.revolt.R -import chat.revolt.api.RevoltAPI -import chat.revolt.api.schemas.User -import chat.revolt.composables.profile.UserCard -import chat.revolt.internals.Platform +import chat.peptide.BuildConfig +import chat.peptide.R +import chat.peptide.api.PeptideAPI +import chat.peptide.api.schemas.User +import chat.peptide.composables.generic.PepTextButton +import chat.peptide.composables.generic.SquareButton +import chat.peptide.composables.profile.UserCard +import chat.peptide.internals.Platform import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -62,7 +62,7 @@ fun UserCardSheet(user: User?) { val folder = File( context.cacheDir, "usercards" - ).let { File(it, RevoltAPI.selfId.toString()) } + ).let { File(it, PeptideAPI.selfId.toString()) } try { folder.mkdirs() @@ -114,7 +114,7 @@ fun UserCardSheet(user: User?) { val folder = File( context.cacheDir, "usercards" - ).let { File(it, RevoltAPI.selfId.toString()) } + ).let { File(it, PeptideAPI.selfId.toString()) } folder.mkdirs() val bitmap = cardGraphics.toImageBitmap() @@ -200,7 +200,7 @@ fun UserCardSheet(user: User?) { horizontalArrangement = Arrangement.spacedBy(16.dp), modifier = Modifier.fillMaxWidth() ) { - Button( + SquareButton( onClick = { scope.launch { shareCard() @@ -220,7 +220,7 @@ fun UserCardSheet(user: User?) { ) } - TextButton( + PepTextButton( onClick = { scope.launch { copyCard() diff --git a/app/src/main/java/chat/peptide/sheets/UserInfoSheet.kt b/app/src/main/java/chat/peptide/sheets/UserInfoSheet.kt new file mode 100644 index 00000000..d744a7d2 --- /dev/null +++ b/app/src/main/java/chat/peptide/sheets/UserInfoSheet.kt @@ -0,0 +1,562 @@ +package chat.peptide.sheets + +import android.widget.Toast +import androidx.compose.animation.AnimatedContent +import androidx.compose.animation.core.tween +import androidx.compose.animation.slideInHorizontally +import androidx.compose.animation.slideOutHorizontally +import androidx.compose.animation.togetherWith +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.lazy.staggeredgrid.LazyVerticalStaggeredGrid +import androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridCells +import androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridItemSpan +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.Icon +import androidx.compose.material3.LocalContentColor +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.ModalBottomSheet +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.SmallFloatingActionButton +import androidx.compose.material3.Text +import androidx.compose.material3.rememberModalBottomSheetState +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.platform.LocalClipboardManager +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.AnnotatedString +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import chat.peptide.R +import chat.peptide.api.PeptideAPI +import chat.peptide.api.routes.user.blockUser +import chat.peptide.api.routes.user.fetchUser +import chat.peptide.api.routes.user.openDM +import chat.peptide.api.routes.user.unblockUser +import chat.peptide.api.routes.user.unfriendUser +import chat.peptide.api.schemas.ChannelType +import chat.peptide.api.schemas.NotificationSettings +import chat.peptide.api.settings.Experiments +import chat.peptide.api.settings.NotificationType +import chat.peptide.api.settings.SyncedSettings +import chat.peptide.callbacks.Action +import chat.peptide.callbacks.ActionChannel +import chat.peptide.composables.generic.NonIdealState +import chat.peptide.composables.generic.SheetButton +import chat.peptide.composables.generic.UserAvatar +import chat.peptide.composables.screens.settings.UserButtons +import chat.peptide.internals.Platform +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.launch +import logcat.LogPriority +import logcat.asLog +import logcat.logcat + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun UserInfoSheet( + userId: String, + dismissSheet: suspend () -> Unit +) { + var resolvedUser by remember { mutableStateOf(PeptideAPI.userCache[userId]) } + + LaunchedEffect(userId) { + try { + // Show cached value immediately if present + resolvedUser = PeptideAPI.userCache[userId] + // Fetch fresh to ensure latest relationship state + val fresh = fetchUser(userId) + resolvedUser = fresh + } catch (e: Exception) { + e.printStackTrace() + } + } + + if (resolvedUser == null) { + NonIdealState( + icon = { + Icon( + painter = painterResource(R.drawable.icn_error_24dp), + contentDescription = null, + modifier = Modifier.size(it) + ) + }, + title = { + Text( + text = stringResource(R.string.user_info_sheet_user_not_found) + ) + }, + description = { + Text( + text = stringResource(R.string.user_info_sheet_user_not_found_description) + ) + } + ) + Spacer(Modifier.height(20.dp)) + return + } + + var showUserCard by remember { mutableStateOf(false) } + if (showUserCard) { + val sheetState = rememberModalBottomSheetState(true) + ModalBottomSheet( + sheetState = sheetState, + onDismissRequest = { showUserCard = false } + ) { + UserCardSheet(resolvedUser!!) + } + } + + var showServerIdentityOptions by remember { mutableStateOf(false) } + if (showServerIdentityOptions) { + val sheetState = rememberModalBottomSheetState(true) + ModalBottomSheet( + sheetState = sheetState, + onDismissRequest = { showServerIdentityOptions = false } + ) { + ServerIdentityOptionsSheet( + userId = resolvedUser!!.id!! + ) + } + } + + // Page state: 0 = main, 1 = notifications + var page by remember { mutableIntStateOf(0) } + + AnimatedContent( + targetState = page, + transitionSpec = { + if (targetState > initialState) { + slideInHorizontally(animationSpec = tween(200)) { it } togetherWith + slideOutHorizontally(animationSpec = tween(200)) { -it } + } else { + slideInHorizontally(animationSpec = tween(200)) { -it } togetherWith + slideOutHorizontally(animationSpec = tween(200)) { it } + } + }, label = "User info actions pager" + ) { current -> + val scope = rememberCoroutineScope() + val clipboardManager = LocalClipboardManager.current + val context = LocalContext.current + LazyVerticalStaggeredGrid( + columns = StaggeredGridCells.Fixed(2), + horizontalArrangement = Arrangement.spacedBy(16.dp), + verticalItemSpacing = 16.dp, + modifier = Modifier.padding(16.dp) + ) { + if (current == 0) { + item(key = "overview", span = StaggeredGridItemSpan.FullLine) { + Column( + modifier = Modifier + .clip(RoundedCornerShape(16.dp)) + .background(MaterialTheme.colorScheme.surfaceBright) + .padding(16.dp) + ) { + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(12.dp) + ) { + UserAvatar( + username = resolvedUser!!.displayName ?: resolvedUser!!.username + ?: stringResource(R.string.unknown), + avatar = resolvedUser!!.avatar, + userId = resolvedUser!!.id!!, + size = 64.dp + ) + Column(modifier = Modifier.weight(1f)) { + Text( + text = resolvedUser!!.displayName ?: resolvedUser!!.username + ?: stringResource(R.string.unknown), + style = MaterialTheme.typography.titleMedium, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + resolvedUser!!.username?.let { uname -> + Text( + text = "@$uname", + style = MaterialTheme.typography.bodySmall, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + } + } + if (Experiments.enableServerIdentityOptions.isEnabled) { + Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) { + if (Experiments.enableServerIdentityOptions.isEnabled) { + SmallFloatingActionButton(onClick = { + showServerIdentityOptions = true + }) { + Icon( + painter = painterResource(R.drawable.icn_psychology_alt_24dp), + contentDescription = null + ) + } + } + } + } + } + resolvedUser!!.status?.text?.takeIf { it.isNotBlank() }?.let { st -> + Spacer(Modifier.height(12.dp)) + Text( + text = st, + style = MaterialTheme.typography.bodyMedium + ) + } + } + } + + // Primary actions block (View Profile, Message, Notification Options, Copy DM ID) + item(key = "primary-actions", span = StaggeredGridItemSpan.FullLine) { + if (current == 0) { + Column( + modifier = Modifier + .clip(RoundedCornerShape(16.dp)) + .background(MaterialTheme.colorScheme.surfaceBright) + ) { + SheetButton( + headlineContent = { Text(text = stringResource(id = R.string.message)) }, + leadingContent = { + Icon( + painter = painterResource(R.drawable.icn_message_to_user), + contentDescription = null + ) + }, + onClick = { + resolvedUser?.id?.let { targetId -> + scope.launch { + val dm = openDM(targetId) + if (dm.id != null) { + if (PeptideAPI.channelCache[dm.id] == null) { + PeptideAPI.channelCache[dm.id] = dm + } + ActionChannel.send(Action.SwitchChannel(dm.id)) + dismissSheet() + } else { + Toast.makeText( + context, + context.getString(R.string.user_info_sheet_failed_to_open_dm), + Toast.LENGTH_SHORT + ).show() + } + } + } + } + ) + HorizontalDivider() + SheetButton( + headlineContent = { Text(text = stringResource(id = R.string.channel_info_sheet_options_notifications_manage)) }, + leadingContent = { + Icon( + painter = painterResource(R.drawable.icn_notification_settings_24dp), + contentDescription = null + ) + }, + onClick = { page = 1 } + ) + HorizontalDivider() + SheetButton( + headlineContent = { Text(text = stringResource(id = R.string.channel_context_sheet_actions_copy_id)) }, + leadingContent = { + Icon( + painter = painterResource(R.drawable.icn_identifier_copy_24dp), + contentDescription = null + ) + }, + onClick = { + resolvedUser?.id?.let { userId -> + scope.launch { + clipboardManager.setText(AnnotatedString(userId)) + Toast.makeText( + context, + context.getString(R.string.copied), + Toast.LENGTH_SHORT + ).show() + } + } + } + ) + } + } + } + + // Danger block (Block, Remove Friend, Report User) + item(key = "danger-actions_${resolvedUser!!.relationship}", span = StaggeredGridItemSpan.FullLine) { + var isBlockActionLoading by remember { mutableStateOf(false) } + var isRemoveFriendLoading by remember { mutableStateOf(false) } + Column( + modifier = Modifier + .padding(top = 16.dp) + .clip(RoundedCornerShape(16.dp)) + .background(MaterialTheme.colorScheme.surfaceBright) + ) { + SheetButton( + headlineContent = { + Text( + text = stringResource( + id = if (resolvedUser?.relationship == "Blocked") { + R.string.user_info_sheet_unblock + } else R.string.user_info_sheet_block + ) + ) + }, + leadingContent = { + Icon( + painter = painterResource(R.drawable.icn_block_24dp), + contentDescription = null, + ) + }, + trailingContent = { + if (isBlockActionLoading) { + CircularProgressIndicator( + modifier = Modifier.size(18.dp), + strokeWidth = 2.dp, + color = LocalContentColor.current + ) + } + }, + onClick = { + scope.launch { + try { + isBlockActionLoading = true + resolvedUser?.id?.let { userId -> + if (resolvedUser?.relationship == "Blocked") { + unblockUser(userId) + // Update local cache/state to reflect new relationship + val updated = resolvedUser!!.copy(relationship = null) + resolvedUser = updated + PeptideAPI.userCache[userId] = + (PeptideAPI.userCache[userId]?.copy(relationship = null)) + ?: updated + try { fetchUser(userId) } catch (_: Exception) {} + } else { + blockUser(userId) + // Update local cache/state to reflect new relationship + val updated = resolvedUser!!.copy(relationship = "Blocked") + resolvedUser = updated + PeptideAPI.userCache[userId] = + (PeptideAPI.userCache[userId]?.copy(relationship = "Blocked")) + ?: updated + try { fetchUser(userId) } catch (_: Exception) {} + } + } + } catch (e: Exception) { + if (e.message == "NoEffect") return@launch + logcat(LogPriority.ERROR) { e.asLog() } + } finally { + isBlockActionLoading = false + } + } + }, + modifier = Modifier, + dangerous = true + ) + if (resolvedUser?.relationship == "Friend") { + HorizontalDivider() + SheetButton( + headlineContent = { Text(stringResource(R.string.user_info_sheet_remove_friend)) }, + leadingContent = { + Icon( + painter = painterResource(R.drawable.icn_group_remove_24dp), + contentDescription = null + ) + }, + trailingContent = { + if (isRemoveFriendLoading) { + CircularProgressIndicator( + modifier = Modifier.size(18.dp), + strokeWidth = 2.dp, + color = LocalContentColor.current + ) + } + }, + onClick = { + resolvedUser?.id?.let { userId -> + scope.launch { + try { + isRemoveFriendLoading = true + unfriendUser(userId) + val updated = resolvedUser!!.copy(relationship = "None") + resolvedUser = updated + PeptideAPI.userCache[userId] = + (PeptideAPI.userCache[userId]?.copy(relationship = "None")) + ?: updated + try { fetchUser(userId) } catch (_: Exception) {} + } catch (e: Exception) { + if (e.message == "NoEffect") return@launch + logcat(LogPriority.ERROR) { e.asLog() } + } finally { + isRemoveFriendLoading = false + } + } + } + }, + dangerous = true + ) + } + HorizontalDivider() + SheetButton( + headlineContent = { Text(text = stringResource(id = R.string.report)) }, + leadingContent = { + Icon( + painter = painterResource(R.drawable.icn_psychology_alt_24dp), + contentDescription = null + ) + }, + onClick = { + resolvedUser?.id?.let { userId -> + scope.launch { + ActionChannel.send(Action.ReportUser(userId)) + + if (Platform.needsShowClipboardNotification()) { + Toast.makeText( + context, + context.getString(R.string.copied), + Toast.LENGTH_SHORT + ).show() + } + } + } + }, + dangerous = true + ) + } + } + + // Removed joined, badges, and bio sections per request + + item(key = "actions_${resolvedUser!!.id}_${resolvedUser!!.relationship}", span = StaggeredGridItemSpan.FullLine) { + UserButtons(resolvedUser!!, dismissSheet, onRelationshipChanged = { newRel -> + resolvedUser = resolvedUser!!.copy(relationship = newRel) + }) + } + } else { + item(key = "notifications", span = StaggeredGridItemSpan.FullLine) { + // Notifications page + Column { + Box( + modifier = Modifier + .fillMaxWidth() + .padding(12.dp), + ) { + Icon( + painter = painterResource(id = R.drawable.ic_arrow_left_24dp), + contentDescription = null, + modifier = Modifier + .size(24.dp) + .clickable { page = 0 } + .align(Alignment.CenterStart) + ) + Text( + modifier = Modifier.align(Alignment.Center), + text = stringResource(id = R.string.channel_info_sheet_options_notifications_manage), + style = MaterialTheme.typography.titleMedium + ) + } + Column( + modifier = Modifier + .padding(top = 24.dp) + .clip(RoundedCornerShape(16.dp)) + .background(MaterialTheme.colorScheme.surfaceBright) + ) { + + // Radio options + val dmChannelId = PeptideAPI.channelCache.values.firstOrNull { ch -> + ch.channelType == ChannelType.DirectMessage && ch.user == resolvedUser!!.id + }?.id + + var selected by remember { + mutableStateOf( + NotificationType.fromStorage( + SyncedSettings.notifications.channel[dmChannelId ?: ""] + ).storageValue + ) + } + + fun updateSelection(newValue: NotificationType) { + selected = newValue.storageValue + val currentSettings = SyncedSettings.notifications + val updated = NotificationSettings( + server = currentSettings.server, + channel = currentSettings.channel.toMutableMap().apply { + if (dmChannelId.isNullOrBlank() || newValue == NotificationType.DEFAULT) { + if (!dmChannelId.isNullOrBlank()) remove(dmChannelId) + } else { + put(dmChannelId, newValue.storageValue) + } + } + ) + GlobalScope.launch { + SyncedSettings.updateNotifications(updated) + } + } + + NotificationRadioRow( + title = stringResource(id = R.string.notification_option_use_default), + type = NotificationType.DEFAULT, + channelId = dmChannelId ?: "", + current = selected, + onChange = { updateSelection(NotificationType.DEFAULT) } + ) + HorizontalDivider(modifier = Modifier.padding(horizontal = 12.dp)) + NotificationRadioRow( + title = stringResource(id = R.string.notification_option_muted), + type = NotificationType.MUTED, + channelId = dmChannelId ?: "", + current = selected, + onChange = { updateSelection(NotificationType.MUTED) } + ) + HorizontalDivider(modifier = Modifier.padding(horizontal = 12.dp)) + NotificationRadioRow( + title = stringResource(id = R.string.notification_option_all_messages), + type = NotificationType.ALL, + channelId = dmChannelId ?: "", + current = selected, + onChange = { updateSelection(NotificationType.ALL) } + ) + HorizontalDivider(modifier = Modifier.padding(horizontal = 12.dp)) + NotificationRadioRow( + title = stringResource(id = R.string.notification_option_mentions_only), + type = NotificationType.MENTIONS_ONLY, + channelId = dmChannelId ?: "", + current = selected, + onChange = { updateSelection(NotificationType.MENTIONS_ONLY) } + ) + HorizontalDivider(modifier = Modifier.padding(horizontal = 12.dp)) + NotificationRadioRow( + title = stringResource(id = R.string.notification_option_none), + type = NotificationType.NONE, + channelId = dmChannelId ?: "", + current = selected, + onChange = { updateSelection(NotificationType.NONE) } + ) + } + } + } + } + + } + + } +} \ No newline at end of file diff --git a/app/src/main/java/chat/revolt/sheets/WebHookUserSheet.kt b/app/src/main/java/chat/peptide/sheets/WebHookUserSheet.kt similarity index 94% rename from app/src/main/java/chat/revolt/sheets/WebHookUserSheet.kt rename to app/src/main/java/chat/peptide/sheets/WebHookUserSheet.kt index c29beb01..696362e8 100644 --- a/app/src/main/java/chat/revolt/sheets/WebHookUserSheet.kt +++ b/app/src/main/java/chat/peptide/sheets/WebHookUserSheet.kt @@ -1,4 +1,4 @@ -package chat.revolt.sheets +package chat.peptide.sheets import android.widget.Toast import androidx.compose.foundation.Image @@ -18,7 +18,8 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import chat.revolt.R +import chat.peptide.R +import chat.peptide.composables.generic.SquareButton @Composable fun WebHookUserSheet(modifier: Modifier = Modifier) { @@ -45,7 +46,7 @@ fun WebHookUserSheet(modifier: Modifier = Modifier) { textAlign = TextAlign.Center, modifier = Modifier.fillMaxWidth() ) - Button( + SquareButton( onClick = { Toast(context).apply { setText(context.getString(R.string.comingsoon_toast)) diff --git a/app/src/main/java/chat/revolt/sheets/spark/SwipeToReplySparkSheet.kt b/app/src/main/java/chat/peptide/sheets/spark/SwipeToReplySparkSheet.kt similarity index 89% rename from app/src/main/java/chat/revolt/sheets/spark/SwipeToReplySparkSheet.kt rename to app/src/main/java/chat/peptide/sheets/spark/SwipeToReplySparkSheet.kt index 0fa77d65..d1637983 100644 --- a/app/src/main/java/chat/revolt/sheets/spark/SwipeToReplySparkSheet.kt +++ b/app/src/main/java/chat/peptide/sheets/spark/SwipeToReplySparkSheet.kt @@ -1,4 +1,4 @@ -package chat.revolt.sheets.spark +package chat.peptide.sheets.spark import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Arrangement @@ -8,10 +8,8 @@ import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding -import androidx.compose.material3.Button import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text -import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -19,8 +17,10 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import chat.revolt.R -import chat.revolt.composables.vectorassets.SwipeToReplySpark +import chat.peptide.R +import chat.peptide.composables.generic.PepTextButton +import chat.peptide.composables.generic.SquareButton +import chat.peptide.composables.vectorassets.SwipeToReplySpark @Composable fun SwipeToReplySparkSheet( @@ -51,13 +51,13 @@ fun SwipeToReplySparkSheet( Column( verticalArrangement = Arrangement.spacedBy(8.dp) ) { - TextButton( + PepTextButton( onClick = onOpenOptions, modifier = Modifier.fillMaxWidth() ) { Text(stringResource(R.string.spark_swipe_to_reply_customise)) } - Button( + SquareButton( onClick = onDismissSheet, modifier = Modifier.fillMaxWidth() ) { diff --git a/app/src/main/java/chat/revolt/ui/theme/Colour.kt b/app/src/main/java/chat/peptide/ui/theme/AppColors.kt similarity index 75% rename from app/src/main/java/chat/revolt/ui/theme/Colour.kt rename to app/src/main/java/chat/peptide/ui/theme/AppColors.kt index 5fcb762b..cc6b9771 100644 --- a/app/src/main/java/chat/revolt/ui/theme/Colour.kt +++ b/app/src/main/java/chat/peptide/ui/theme/AppColors.kt @@ -1,18 +1,17 @@ -package chat.revolt.ui.theme +package chat.peptide.ui.theme import androidx.compose.ui.graphics.Color -object Colour { - val RevoltUltraPink = Color(0xFFFF005C) +object AppColors { - val PrimaryLight = Color(0xFFBD0042) - val OnPrimaryLight = Color(0xFFFFFFFF) - val PrimaryContainerLight = Color(0xFFFFD9DC) - val OnPrimaryContainerLight = Color(0xFF910031) - val SecondaryLight = Color(0xFFC0001F) - val OnSecondaryLight = Color(0xFFFFFFFF) - val SecondaryContainerLight = Color(0xFFFFDAD7) - val OnSecondaryContainerLight = Color(0xFF930015) + val PrimaryLight = Color(0xFF662D91) + val OnPrimaryLight = Color(0xFFFFFFFD) + val PrimaryContainerLight = Color(0xFF662D91) + val OnPrimaryContainerLight = Color(0xFFFFFFFF) + val SecondaryLight = Color(0xFFFFDE17) + val OnSecondaryLight = Color(0xFF000000) + val SecondaryContainerLight = Color(0xFFCBB2E5) + val OnSecondaryContainerLight = Color(0xFFFFDE17) val TertiaryLight = Color(0xFF0060A9) val OnTertiaryLight = Color(0xFFFFFFFF) val TertiaryContainerLight = Color(0xFFD3E4FF) @@ -41,14 +40,14 @@ object Colour { val SurfaceContainerHighLight = Color(0xFFE4E8F8) val SurfaceContainerHighestLight = Color(0xFFDEE2F2) - val PrimaryDark = Color(0xFFFFB2BA) - val OnPrimaryDark = Color(0xFF670020) - val PrimaryContainerDark = Color(0xFF910031) - val OnPrimaryContainerDark = Color(0xFFFFD9DC) - val SecondaryDark = Color(0xFFFFB3AE) - val OnSecondaryDark = Color(0xFF68000C) - val SecondaryContainerDark = Color(0xFF930015) - val OnSecondaryContainerDark = Color(0xFFFFDAD7) + val PrimaryDark = Color(0xFFFFDE17) + val OnPrimaryDark = Color(0xFF000000) + val PrimaryContainerDark = Color(0xFF332E36) + val OnPrimaryContainerDark = Color(0xFFFFDE17) + val SecondaryDark = Color(0xFF662D91) + val OnSecondaryDark = Color(0xFFFFFFFD) + val SecondaryContainerDark = Color(0xFF662D91) + val OnSecondaryContainerDark = Color(0xFFFFFFFF) val TertiaryDark = Color(0xFFA2C9FF) val OnTertiaryDark = Color(0xFF00315B) val TertiaryContainerDark = Color(0xFF004881) diff --git a/app/src/main/java/chat/revolt/ui/theme/OverridableColourScheme.kt b/app/src/main/java/chat/peptide/ui/theme/OverridableColourScheme.kt similarity index 99% rename from app/src/main/java/chat/revolt/ui/theme/OverridableColourScheme.kt rename to app/src/main/java/chat/peptide/ui/theme/OverridableColourScheme.kt index dbfcdd86..91e3f4f0 100644 --- a/app/src/main/java/chat/revolt/ui/theme/OverridableColourScheme.kt +++ b/app/src/main/java/chat/peptide/ui/theme/OverridableColourScheme.kt @@ -1,9 +1,9 @@ -package chat.revolt.ui.theme +package chat.peptide.ui.theme import androidx.compose.material3.ColorScheme import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.toArgb -import chat.revolt.R +import chat.peptide.R import kotlinx.serialization.Serializable // Word of warning, this file is ugly, because I've had to fight a bit with the Compose compiler, diff --git a/app/src/main/java/chat/peptide/ui/theme/Theme.kt b/app/src/main/java/chat/peptide/ui/theme/Theme.kt new file mode 100644 index 00000000..3b91fc26 --- /dev/null +++ b/app/src/main/java/chat/peptide/ui/theme/Theme.kt @@ -0,0 +1,188 @@ +package chat.peptide.ui.theme + +import android.annotation.SuppressLint +import android.app.Activity +import android.os.Build +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.foundation.shape.CornerSize +import androidx.compose.material3.ColorScheme +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.darkColorScheme +import androidx.compose.material3.dynamicDarkColorScheme +import androidx.compose.material3.dynamicLightColorScheme +import androidx.compose.material3.lightColorScheme +import androidx.compose.runtime.Composable +import androidx.compose.runtime.SideEffect +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.toArgb +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalView +import androidx.compose.ui.unit.dp +import androidx.core.view.ViewCompat + +//val LightColorScheme = lightColorScheme( +// primary = AppColors.PrimaryLight, +// onPrimary = AppColors.OnPrimaryLight, +// primaryContainer = AppColors.PrimaryContainerLight, +// onPrimaryContainer = AppColors.OnPrimaryContainerLight, +// secondary = AppColors.SecondaryLight, +// onSecondary = AppColors.OnSecondaryLight, +// secondaryContainer = AppColors.SecondaryContainerLight, +// onSecondaryContainer = AppColors.OnSecondaryContainerLight, +// tertiary = AppColors.TertiaryLight, +// onTertiary = AppColors.OnTertiaryLight, +// tertiaryContainer = AppColors.TertiaryContainerLight, +// onTertiaryContainer = AppColors.OnTertiaryContainerLight, +// error = AppColors.ErrorLight, +// onError = AppColors.OnErrorLight, +// errorContainer = AppColors.ErrorContainerLight, +// onErrorContainer = AppColors.OnErrorContainerLight, +// background = AppColors.BackgroundLight, +// onBackground = AppColors.OnBackgroundLight, +// surface = AppColors.SurfaceLight, +// onSurface = AppColors.OnSurfaceLight, +// surfaceVariant = AppColors.SurfaceVariantLight, +// onSurfaceVariant = AppColors.OnSurfaceVariantLight, +// outline = AppColors.OutlineLight, +// outlineVariant = AppColors.OutlineVariantLight, +// scrim = AppColors.ScrimLight, +// inverseSurface = AppColors.InverseSurfaceLight, +// inverseOnSurface = AppColors.InverseOnSurfaceLight, +// inversePrimary = AppColors.InversePrimaryLight, +// surfaceDim = AppColors.SurfaceDimLight, +// surfaceBright = AppColors.SurfaceBrightLight, +// surfaceContainerLowest = AppColors.SurfaceContainerLowestLight, +// surfaceContainerLow = AppColors.SurfaceContainerLowLight, +// surfaceContainer = AppColors.SurfaceContainerLight, +// surfaceContainerHigh = AppColors.SurfaceContainerHighLight, +// surfaceContainerHighest = AppColors.SurfaceContainerHighestLight, +//) + +private val PeptideColorScheme = darkColorScheme( + primary = AppColors.PrimaryDark, + onPrimary = AppColors.OnPrimaryDark, + primaryContainer = AppColors.PrimaryContainerDark, + onPrimaryContainer = AppColors.OnPrimaryContainerDark, + secondary = AppColors.SecondaryDark, + onSecondary = AppColors.OnSecondaryDark, + secondaryContainer = AppColors.SecondaryContainerDark, + onSecondaryContainer = AppColors.OnSecondaryContainerDark, + tertiary = AppColors.TertiaryDark, + onTertiary = AppColors.OnTertiaryDark, + tertiaryContainer = AppColors.TertiaryContainerDark, + onTertiaryContainer = AppColors.OnTertiaryContainerDark, + error = AppColors.ErrorDark, + onError = AppColors.OnErrorDark, + errorContainer = AppColors.ErrorContainerDark, + onErrorContainer = AppColors.OnErrorContainerDark, + background = AppColors.BackgroundDark, + onBackground = AppColors.OnBackgroundDark, + surface = AppColors.SurfaceDark, + onSurface = AppColors.OnSurfaceDark, + surfaceVariant = AppColors.SurfaceVariantDark, + onSurfaceVariant = AppColors.OnSurfaceVariantDark, + outline = AppColors.OutlineDark, + outlineVariant = AppColors.OutlineVariantDark, + scrim = AppColors.ScrimDark, + inverseSurface = AppColors.InverseSurfaceDark, + inverseOnSurface = AppColors.InverseOnSurfaceDark, + inversePrimary = AppColors.InversePrimaryDark, + surfaceDim = AppColors.SurfaceDimDark, + surfaceBright = AppColors.SurfaceBrightDark, + surfaceContainerLowest = AppColors.SurfaceContainerLowestDark, + surfaceContainerLow = AppColors.SurfaceContainerLowDark, + surfaceContainer = AppColors.SurfaceContainerDark, + surfaceContainerHigh = AppColors.SurfaceContainerHighDark, + surfaceContainerHighest = AppColors.SurfaceContainerHighestDark, +) + +enum class Theme { + PEPTIDE_DARK, + M3Dynamic, +} + +@Composable +fun getColorScheme( + requestedTheme: Theme, + colourOverrides: OverridableColourScheme? = null +): ColorScheme { + val context = LocalContext.current + + val systemInDarkTheme = isSystemInDarkTheme() + val m3Supported = systemSupportsDynamicColors() + + val colorScheme = when { + m3Supported && requestedTheme == Theme.M3Dynamic && systemInDarkTheme -> dynamicDarkColorScheme( + context + ) + + m3Supported && requestedTheme == Theme.M3Dynamic && !systemInDarkTheme -> dynamicLightColorScheme( + context + ) + + requestedTheme == Theme.PEPTIDE_DARK -> PeptideColorScheme + else -> PeptideColorScheme + }.copy() + + val colorSchemeIsDark = when { + m3Supported && requestedTheme == Theme.M3Dynamic -> isSystemInDarkTheme() + else -> true + } + + val view = LocalView.current + if (!view.isInEditMode) { + SideEffect { + val window = (view.context as Activity).window + window.statusBarColor = Color.Transparent.toArgb() + @Suppress("DEPRECATION") + ViewCompat.getWindowInsetsController(view)?.isAppearanceLightStatusBars = + !colorSchemeIsDark + + } + } + + if (colourOverrides == null) return colorScheme + return colourOverrides.applyTo(colorScheme) +} + +@SuppressLint("NewApi") +@Composable +fun PeptideTheme( + requestedTheme: Theme, + colourOverrides: OverridableColourScheme? = null, + content: @Composable () -> Unit +) { + val colorScheme = getColorScheme(requestedTheme, colourOverrides) + + MaterialTheme( + shapes = MaterialTheme.shapes.copy( + small = MaterialTheme.shapes.small.copy( + topStart = CornerSize(8.dp), + topEnd = CornerSize(8.dp), + bottomStart = CornerSize(8.dp), + bottomEnd = CornerSize(8.dp) + ) + ), + colorScheme = colorScheme, + typography = PeptideTypography, + content = content + ) +} + +fun systemSupportsDynamicColors(): Boolean { + return Build.VERSION.SDK_INT >= Build.VERSION_CODES.S +} + +fun getDefaultTheme(): Theme { + return Theme.PEPTIDE_DARK +} + +fun isThemeDark(theme: Theme, systemIsDark: Boolean): Boolean { + return when (theme) { + Theme.M3Dynamic, + Theme.PEPTIDE_DARK -> true + } +} + +@Composable +fun isThemeDark(theme: Theme) = isThemeDark(theme, isSystemInDarkTheme()) \ No newline at end of file diff --git a/app/src/main/java/chat/revolt/ui/theme/Typography.kt b/app/src/main/java/chat/peptide/ui/theme/Typography.kt similarity index 98% rename from app/src/main/java/chat/revolt/ui/theme/Typography.kt rename to app/src/main/java/chat/peptide/ui/theme/Typography.kt index 05daf8ad..1e5446ff 100644 --- a/app/src/main/java/chat/revolt/ui/theme/Typography.kt +++ b/app/src/main/java/chat/peptide/ui/theme/Typography.kt @@ -1,4 +1,4 @@ -package chat.revolt.ui.theme +package chat.peptide.ui.theme import androidx.compose.material3.Typography import androidx.compose.ui.text.TextStyle @@ -7,7 +7,8 @@ import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.font.FontStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.sp -import chat.revolt.R +import chat.peptide.R + private val Inter = FontFamily( Font(R.font.inter_thin, FontWeight.Thin), @@ -54,7 +55,7 @@ val FragmentMono = FontFamily( Font(R.font.fragmentmono_italic, FontWeight.Normal, FontStyle.Italic) ) -val RevoltTypography = Typography( +val PeptideTypography = Typography( displayLarge = TextStyle( fontFamily = InterDisplay, fontWeight = FontWeight.Black, diff --git a/app/src/main/java/chat/peptide/utils/DeepLinkHandler.kt b/app/src/main/java/chat/peptide/utils/DeepLinkHandler.kt new file mode 100644 index 00000000..71c0c0d4 --- /dev/null +++ b/app/src/main/java/chat/peptide/utils/DeepLinkHandler.kt @@ -0,0 +1,42 @@ +package chat.peptide.utils + +/** + * Static handler for deep link data that needs to be passed between activities and composables. + */ +object DeepLinkHandler { + /** + * Channel ID from deep link + */ + var channelId: String? = null + + /** + * Server ID from deep link + */ + var serverId: String? = null + + /** + * User ID from deep link + */ + var userId: String? = null + + /** + * Message ID from deep link + */ + var messageId: String? = null + + /** + * Flag indicating if there is an active deep link to process + */ + var hasDeepLink: Boolean = false + + /** + * Clears all deep link data + */ + fun clear() { + channelId = null + serverId = null + userId = null + messageId = null + hasDeepLink = false + } +} diff --git a/app/src/main/java/chat/peptide/utils/DeepLinkUtils.kt b/app/src/main/java/chat/peptide/utils/DeepLinkUtils.kt new file mode 100644 index 00000000..d703f24d --- /dev/null +++ b/app/src/main/java/chat/peptide/utils/DeepLinkUtils.kt @@ -0,0 +1,216 @@ +package chat.peptide.utils + +import android.content.Context +import android.content.Intent +import android.net.Uri +import chat.peptide.activities.DeepLinkActivity +import chat.peptide.activities.MainActivity + +/** + * Utility class for handling deep links in the Peptide app. + */ +object DeepLinkUtils { + + /** + * Checks if the given URI is a valid Peptide deep link. + * + * @param uri The URI to check + * @return true if the URI is a valid Peptide deep link, false otherwise + */ + fun isPeptideDeepLink(uri: Uri?): Boolean { + if (uri == null) return false + + val host = uri.host ?: return false + val scheme = uri.scheme ?: return false + + // Check if the scheme is http or https + if (scheme != "http" && scheme != "https") return false + + // Check if the host is a valid Peptide host + return host == "peptide.chat" || host == "app.peptide.chat" + } + + /** + * Extracts the channel ID from a channel deep link URI. + * + * @param uri The URI to extract the channel ID from + * @return The channel ID, or null if the URI is not a valid channel deep link + */ + fun extractChannelId(uri: Uri?): String? { + if (uri == null) return null + + val pathSegments = uri.pathSegments + + // Handle /channels/CHANNEL_ID format + if (pathSegments.size >= 2 && pathSegments[0] == "channels") { + return pathSegments[1] + } + + // Handle /server/SERVER_ID/channel/CHANNEL_ID format + if (pathSegments.size >= 4 && + pathSegments[0] == "server" && + pathSegments[2] == "channel") { + return pathSegments[3] + } + + return null + } + + /** + * Extracts the server ID from a server deep link URI. + * + * @param uri The URI to extract the server ID from + * @return The server ID, or null if the URI is not a valid server deep link + */ + fun extractServerId(uri: Uri?): String? { + if (uri == null) return null + + val pathSegments = uri.pathSegments + + // Handle /servers/SERVER_ID format + if (pathSegments.size >= 2 && pathSegments[0] == "servers") { + return pathSegments[1] + } + + // Handle /server/SERVER_ID format + if (pathSegments.size >= 2 && pathSegments[0] == "server") { + return pathSegments[1] + } + + return null + } + + /** + * Extracts the user ID from a user deep link URI. + * + * @param uri The URI to extract the user ID from + * @return The user ID, or null if the URI is not a valid user deep link + */ + fun extractUserId(uri: Uri?): String? { + if (uri == null) return null + + val pathSegments = uri.pathSegments + if (pathSegments.size < 2 || pathSegments[0] != "users") return null + + return pathSegments[1] + } + + /** + * Extracts the message ID from a message deep link URI. + * + * @param uri The URI to extract the message ID from + * @return The message ID, or null if the URI is not a valid message deep link + */ + fun extractMessageId(uri: Uri?): String? { + if (uri == null) return null + + val pathSegments = uri.pathSegments + + // Handle /messages/MESSAGE_ID format + if (pathSegments.size >= 2 && pathSegments[0] == "messages") { + return pathSegments[1] + } + + // Handle /server/SERVER_ID/channel/CHANNEL_ID/MESSAGE_ID format + if (pathSegments.size >= 5 && + pathSegments[0] == "server" && + pathSegments[2] == "channel") { + return pathSegments[4] + } + + return null + } + + /** + * Data class to hold server, channel, and message IDs extracted from a URI. + */ + data class ServerChannelMessage( + val serverId: String, + val channelId: String, + val messageId: String? = null + ) + + /** + * Extracts server, channel, and message IDs from a server channel message deep link URI. + * + * @param uri The URI to extract the IDs from + * @return A ServerChannelMessage object containing the extracted IDs, or null if the URI is not a valid server channel message deep link + */ + fun extractServerChannelMessage(uri: Uri?): ServerChannelMessage? { + if (uri == null) return null + + val pathSegments = uri.pathSegments + + // Handle /server/SERVER_ID/channel/CHANNEL_ID format + if (pathSegments.size >= 4 && + pathSegments[0] == "server" && + pathSegments[2] == "channel") { + + val serverId = pathSegments[1] + val channelId = pathSegments[3] + + // Check if there's a message ID (5th segment) + val messageId = if (pathSegments.size >= 5) pathSegments[4] else null + + return ServerChannelMessage(serverId, channelId, messageId) + } + + return null + } + + /** + * Creates an intent to navigate to a specific channel. + * + * @param context The context to use for creating the intent + * @param channelId The ID of the channel to navigate to + * @return An intent that will navigate to the specified channel + */ + fun createChannelIntent(context: Context, channelId: String): Intent { + return Intent(context, MainActivity::class.java).apply { + putExtra(DeepLinkActivity.PATH_CHANNEL, channelId) + } + } + + /** + * Creates an intent to navigate to a specific server. + * + * @param context The context to use for creating the intent + * @param serverId The ID of the server to navigate to + * @return An intent that will navigate to the specified server + */ + fun createServerIntent(context: Context, serverId: String): Intent { + return Intent(context, MainActivity::class.java).apply { + putExtra(DeepLinkActivity.PATH_SERVER, serverId) + } + } + + /** + * Creates an intent to navigate to a specific user. + * + * @param context The context to use for creating the intent + * @param userId The ID of the user to navigate to + * @return An intent that will navigate to the specified user + */ + fun createUserIntent(context: Context, userId: String): Intent { + return Intent(context, MainActivity::class.java).apply { + putExtra(DeepLinkActivity.PATH_USER, userId) + } + } + + /** + * Creates an intent to navigate to a specific message. + * + * @param context The context to use for creating the intent + * @param messageId The ID of the message to navigate to + * @param channelId The ID of the channel containing the message, if known + * @return An intent that will navigate to the specified message + */ + fun createMessageIntent(context: Context, messageId: String, channelId: String? = null): Intent { + return Intent(context, MainActivity::class.java).apply { + putExtra(DeepLinkActivity.PATH_MESSAGE, messageId) + if (channelId != null) { + putExtra(DeepLinkActivity.PATH_CHANNEL, channelId) + } + } + } +} diff --git a/app/src/main/java/chat/peptide/utils/InternalLinkHandler.kt b/app/src/main/java/chat/peptide/utils/InternalLinkHandler.kt new file mode 100644 index 00000000..389915ea --- /dev/null +++ b/app/src/main/java/chat/peptide/utils/InternalLinkHandler.kt @@ -0,0 +1,155 @@ +package chat.peptide.utils + +import android.content.Context +import android.content.Intent +import android.net.Uri +import android.util.Log +import chat.peptide.activities.DeepLinkActivity +import chat.peptide.callbacks.Action +import chat.peptide.callbacks.ActionChannel +import chat.peptide.screens.chat.ChatRouterDestination +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch + +/** + * Utility class to handle internal links within the app + */ +object InternalLinkHandler { + private const val TAG = "InternalLinkHandler" + + /** + * Checks if a URL is an internal link that should be handled by the app + * + * @param url The URL to check + * @return true if the URL is an internal link, false otherwise + */ + fun isInternalLink(url: String): Boolean { + val uri = Uri.parse(url) + val isInternal = DeepLinkUtils.isPeptideDeepLink(uri) + Log.d(TAG, "isInternalLink: $url -> $isInternal") + return isInternal + } + + /** + * Handles an internal link by either navigating within the app or launching the DeepLinkActivity + * + * @param context The context to use for launching activities + * @param url The URL to handle + * @param isAlreadyInChatScreen Whether the user is already in the chat screen + * @return true if the link was handled, false otherwise + */ + fun handleInternalLink(context: Context, url: String, isAlreadyInChatScreen: Boolean = false): Boolean { + Log.d(TAG, "handleInternalLink called with url: $url, isAlreadyInChatScreen: $isAlreadyInChatScreen") + + if (!isInternalLink(url)) { + Log.d(TAG, "Not an internal link, returning false") + return false + } + + Log.d(TAG, "Handling internal link: $url") + val uri = Uri.parse(url) + + // If we're already in the chat screen, we can use the ActionChannel to navigate + if (isAlreadyInChatScreen) { + Log.d(TAG, "Already in chat screen, using ActionChannel") + val result = handleLinkInChatScreen(uri) + Log.d(TAG, "handleLinkInChatScreen result: $result") + return result + } + + // Otherwise, launch the DeepLinkActivity + try { + Log.d(TAG, "Launching DeepLinkActivity") + val intent = Intent(Intent.ACTION_VIEW, uri, context, DeepLinkActivity::class.java) + context.startActivity(intent) + Log.d(TAG, "DeepLinkActivity launched successfully") + return true + } catch (e: Exception) { + Log.e(TAG, "Error launching DeepLinkActivity", e) + return false + } + } + + /** + * Handles a link when already in the chat screen by sending actions through the ActionChannel + * + * @param uri The URI to handle + * @return true if the link was handled, false otherwise + */ + private fun handleLinkInChatScreen(uri: Uri): Boolean { + Log.d(TAG, "handleLinkInChatScreen called with uri: $uri") + + try { + // Extract data from the URI + val serverChannelMessage = DeepLinkUtils.extractServerChannelMessage(uri) + Log.d(TAG, "serverChannelMessage: $serverChannelMessage") + + if (serverChannelMessage != null) { + // Handle server/channel/message format + val serverId = serverChannelMessage.serverId + val channelId = serverChannelMessage.channelId + val messageId = serverChannelMessage.messageId + + Log.d(TAG, "Handling server/channel/message: $serverId/$channelId/$messageId") + + // First navigate to the channel + CoroutineScope(Dispatchers.Main).launch { + try { + Log.d(TAG, "Sending SwitchChannel action for channelId: $channelId") + ActionChannel.send(Action.SwitchChannel(channelId,messageId)) + Log.d(TAG, "SwitchChannel action sent successfully") + + // TODO: If messageId is not null, add logic to scroll to the message + } catch (e: Exception) { + Log.e(TAG, "Error sending action", e) + } + } + + return true + } + + // Handle channel deep link + val channelId = DeepLinkUtils.extractChannelId(uri) + Log.d(TAG, "extractChannelId result: $channelId") + + if (channelId != null) { + Log.d(TAG, "Handling channel: $channelId") + CoroutineScope(Dispatchers.Main).launch { + try { + Log.d(TAG, "Sending SwitchChannel action for channelId: $channelId") + ActionChannel.send(Action.SwitchChannel(channelId)) + Log.d(TAG, "SwitchChannel action sent successfully") + } catch (e: Exception) { + Log.e(TAG, "Error sending action", e) + } + } + return true + } + + // Handle server deep link + val serverId = DeepLinkUtils.extractServerId(uri) + Log.d(TAG, "extractServerId result: $serverId") + + if (serverId != null) { + Log.d(TAG, "Handling server: $serverId") + CoroutineScope(Dispatchers.Main).launch { + try { + Log.d(TAG, "Sending ChatNavigate action for serverId: $serverId") + ActionChannel.send(Action.ChatNavigate(ChatRouterDestination.ServersChannels(serverId))) + Log.d(TAG, "ChatNavigate action sent successfully") + } catch (e: Exception) { + Log.e(TAG, "Error sending action", e) + } + } + return true + } + + Log.d(TAG, "No handlers matched for this URI") + return false + } catch (e: Exception) { + Log.e(TAG, "Error in handleLinkInChatScreen", e) + return false + } + } +} diff --git a/app/src/main/java/chat/revolt/api/routes/channel/Message.kt b/app/src/main/java/chat/revolt/api/routes/channel/Message.kt deleted file mode 100644 index 3dcb2e97..00000000 --- a/app/src/main/java/chat/revolt/api/routes/channel/Message.kt +++ /dev/null @@ -1,14 +0,0 @@ -package chat.revolt.api.routes.channel - -import chat.revolt.api.RevoltHttp -import chat.revolt.api.api -import io.ktor.client.request.delete -import io.ktor.client.request.put - -suspend fun react(channelId: String, messageId: String, emoji: String) { - RevoltHttp.put("/channels/$channelId/messages/$messageId/reactions/$emoji".api()) -} - -suspend fun unreact(channelId: String, messageId: String, emoji: String) { - RevoltHttp.delete("/channels/$channelId/messages/$messageId/reactions/$emoji".api()) -} \ No newline at end of file diff --git a/app/src/main/java/chat/revolt/api/routes/custom/Emoji.kt b/app/src/main/java/chat/revolt/api/routes/custom/Emoji.kt deleted file mode 100644 index 2e9060c3..00000000 --- a/app/src/main/java/chat/revolt/api/routes/custom/Emoji.kt +++ /dev/null @@ -1,16 +0,0 @@ -package chat.revolt.api.routes.custom - -import chat.revolt.api.RevoltHttp -import chat.revolt.api.RevoltJson -import chat.revolt.api.api -import chat.revolt.api.schemas.Emoji -import io.ktor.client.request.get -import io.ktor.client.statement.bodyAsText - -suspend fun fetchEmoji(id: String): Emoji { - val response = RevoltHttp.get("/custom/emoji/$id".api()).bodyAsText() - return RevoltJson.decodeFromString( - Emoji.serializer(), - response - ) -} diff --git a/app/src/main/java/chat/revolt/api/routes/invites/Invites.kt b/app/src/main/java/chat/revolt/api/routes/invites/Invites.kt deleted file mode 100644 index 46db268d..00000000 --- a/app/src/main/java/chat/revolt/api/routes/invites/Invites.kt +++ /dev/null @@ -1,43 +0,0 @@ -package chat.revolt.api.routes.invites - -import chat.revolt.api.RevoltError -import chat.revolt.api.RevoltHttp -import chat.revolt.api.RevoltJson -import chat.revolt.api.api -import chat.revolt.api.schemas.Invite -import chat.revolt.api.schemas.InviteJoined -import chat.revolt.api.schemas.RsResult -import io.ktor.client.request.get -import io.ktor.client.request.post -import io.ktor.client.statement.bodyAsText -import kotlinx.serialization.SerializationException - -suspend fun fetchInviteByCode(code: String): RsResult { - val response = RevoltHttp.get("/invites/$code".api()) - .bodyAsText() - - try { - val error = RevoltJson.decodeFromString(RevoltError.serializer(), response) - if (error.type != "Server") return RsResult.err(error) - } catch (e: SerializationException) { - // Not an error - } - - val invite = RevoltJson.decodeFromString(Invite.serializer(), response) - return RsResult.ok(invite) -} - -suspend fun joinInviteByCode(code: String): RsResult { - val response = RevoltHttp.post("/invites/$code".api()) - .bodyAsText() - - try { - val error = RevoltJson.decodeFromString(RevoltError.serializer(), response) - if (error.type != "Server") return RsResult.err(error) - } catch (e: SerializationException) { - // Not an error - } - - val invite = RevoltJson.decodeFromString(InviteJoined.serializer(), response) - return RsResult.ok(invite) -} diff --git a/app/src/main/java/chat/revolt/api/routes/microservices/health/Health.kt b/app/src/main/java/chat/revolt/api/routes/microservices/health/Health.kt deleted file mode 100644 index 5fb2dab5..00000000 --- a/app/src/main/java/chat/revolt/api/routes/microservices/health/Health.kt +++ /dev/null @@ -1,12 +0,0 @@ -package chat.revolt.api.routes.microservices.health - -import chat.revolt.api.RevoltHttp -import chat.revolt.api.RevoltJson -import chat.revolt.api.schemas.HealthNotice -import io.ktor.client.request.get -import io.ktor.client.statement.bodyAsText - -suspend fun healthCheck(): HealthNotice { - val response = RevoltHttp.get("https://health.revolt.chat/api/health").bodyAsText() - return RevoltJson.decodeFromString(HealthNotice.serializer(), response) -} \ No newline at end of file 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 deleted file mode 100644 index 1280269a..00000000 --- a/app/src/main/java/chat/revolt/api/routes/microservices/january/January.kt +++ /dev/null @@ -1,8 +0,0 @@ -package chat.revolt.api.routes.microservices.january - -import chat.revolt.api.RevoltAPI -import java.net.URLEncoder - -fun asJanuaryProxyUrl(url: String): String { - return "${RevoltAPI.getCurrentJanuaryUrl()}/proxy?url=${URLEncoder.encode(url, "utf-8")}" -} diff --git a/app/src/main/java/chat/revolt/api/routes/user/DirectMessaging.kt b/app/src/main/java/chat/revolt/api/routes/user/DirectMessaging.kt deleted file mode 100644 index c41ccecd..00000000 --- a/app/src/main/java/chat/revolt/api/routes/user/DirectMessaging.kt +++ /dev/null @@ -1,24 +0,0 @@ -package chat.revolt.api.routes.user - -import chat.revolt.api.RevoltError -import chat.revolt.api.RevoltHttp -import chat.revolt.api.RevoltJson -import chat.revolt.api.api -import chat.revolt.api.schemas.Channel -import io.ktor.client.request.get -import io.ktor.client.statement.bodyAsText -import kotlinx.serialization.SerializationException - -suspend fun openDM(userId: String): Channel { - val response = RevoltHttp.get("/users/$userId/dm".api()) - .bodyAsText() - - try { - val error = RevoltJson.decodeFromString(RevoltError.serializer(), response) - throw Error(error.type) - } catch (e: SerializationException) { - // Not an error - } - - return RevoltJson.decodeFromString(Channel.serializer(), response) -} \ No newline at end of file diff --git a/app/src/main/java/chat/revolt/composables/screens/settings/UserButtons.kt b/app/src/main/java/chat/revolt/composables/screens/settings/UserButtons.kt deleted file mode 100644 index 35a8cc51..00000000 --- a/app/src/main/java/chat/revolt/composables/screens/settings/UserButtons.kt +++ /dev/null @@ -1,344 +0,0 @@ -package chat.revolt.composables.screens.settings - -import android.widget.Toast -import androidx.compose.animation.animateContentSize -import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.padding -import androidx.compose.material3.Button -import androidx.compose.material3.ButtonDefaults -import androidx.compose.material3.DropdownMenu -import androidx.compose.material3.DropdownMenuItem -import androidx.compose.material3.FilledTonalButton -import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.rememberCoroutineScope -import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.clip -import androidx.compose.ui.platform.LocalClipboardManager -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.AnnotatedString -import androidx.compose.ui.unit.dp -import chat.revolt.R -import chat.revolt.api.RevoltAPI -import chat.revolt.api.routes.user.acceptFriendRequest -import chat.revolt.api.routes.user.blockUser -import chat.revolt.api.routes.user.friendUser -import chat.revolt.api.routes.user.openDM -import chat.revolt.api.routes.user.unblockUser -import chat.revolt.api.routes.user.unfriendUser -import chat.revolt.api.schemas.User -import chat.revolt.callbacks.Action -import chat.revolt.callbacks.ActionChannel -import chat.revolt.internals.Platform -import kotlinx.coroutines.launch -import logcat.LogPriority -import logcat.asLog -import logcat.logcat - -@Composable -fun UserButtons( - user: User, - dismissSheet: suspend () -> Unit -) { - val scope = rememberCoroutineScope() - val context = LocalContext.current - val clipboard = LocalClipboardManager.current - - var botEasterEgg by remember { mutableStateOf(false) } - var menuOpen by remember { mutableStateOf(false) } - - if (user.id == null) return Row { - Button( - onClick = { - scope.launch { - try { - friendUser("${user.username}#${user.discriminator}") - } catch (e: Exception) { - // Button did nothing, but not an error - if (e.message == "NoEffect") return@launch - - // Log all other errors - logcat(LogPriority.ERROR) { e.asLog() } - } - } - }, - modifier = Modifier.weight(1f) - ) { - Text(stringResource(R.string.user_info_sheet_add_friend)) - } - } - - Row( - horizontalArrangement = Arrangement.spacedBy(8.dp), - verticalAlignment = Alignment.CenterVertically - ) { - when (user.relationship) { - "None" -> { - if (user.bot == null) { - Button( - onClick = { - scope.launch { - try { - friendUser("${user.username}#${user.discriminator}") - } catch (e: Exception) { - if (e.message == "NoEffect") return@launch - logcat(LogPriority.ERROR) { e.asLog() } - } - } - }, - modifier = Modifier.weight(1f) - ) { - Text(stringResource(R.string.user_info_sheet_add_friend)) - } - } else { - Row( - horizontalArrangement = Arrangement.spacedBy( - 8.dp, - alignment = Alignment.Start - ), - verticalAlignment = Alignment.CenterVertically, - modifier = Modifier - .animateContentSize() - .clip(MaterialTheme.shapes.small) - .clickable { botEasterEgg = true } - .padding(8.dp) - .weight(1f) - ) { - Icon( - painter = painterResource(R.drawable.icn_smart_toy_24dp), - contentDescription = null - ) - Text( - if (botEasterEgg) { - stringResource(R.string.user_info_sheet_user_is_bot_easter_egg) - } else { - stringResource(R.string.user_info_sheet_user_is_bot) - }, - style = MaterialTheme.typography.bodyMedium - ) - } - } - } - - "User" -> { - Button( - onClick = { - scope.launch { - ActionChannel.send(Action.TopNavigate("settings/profile")) - // We must now close the bottom sheet, - // else we will crash if we try to open this sheet again - dismissSheet() - } - }, - modifier = Modifier.weight(1f) - ) { - Text(stringResource(R.string.user_info_sheet_edit_profile)) - } - } - - "Friend" -> { - FilledTonalButton( - onClick = { - scope.launch { - val dm = openDM(user.id) - if (dm.id != null) { - if (RevoltAPI.channelCache[dm.id] == null) - RevoltAPI.channelCache[dm.id] = dm - ActionChannel.send(Action.SwitchChannel(dm.id)) - dismissSheet() - } else { - Toast.makeText( - context, - context.getString(R.string.user_info_sheet_failed_to_open_dm), - Toast.LENGTH_SHORT - ).show() - } - } - }, - modifier = Modifier.weight(1f) - ) { - Text(stringResource(R.string.user_info_sheet_send_message)) - } - // Remove friend (in overflow menu) - } - - "Outgoing" -> { - Button( - onClick = { - scope.launch { - try { - unfriendUser(user.id) - } catch (e: Exception) { - if (e.message == "NoEffect") return@launch - logcat(LogPriority.ERROR) { e.asLog() } - } - } - }, - modifier = Modifier.weight(1f) - ) { - Text(stringResource(R.string.user_info_sheet_cancel_request)) - } - } - - "Incoming" -> { - Button( - onClick = { - scope.launch { - try { - acceptFriendRequest(user.id) - } catch (e: Exception) { - if (e.message == "NoEffect") return@launch - logcat(LogPriority.ERROR) { e.asLog() } - } - } - }, - modifier = Modifier.weight(1f) - ) { - Text(stringResource(R.string.user_info_sheet_accept_request)) - } - Button( - onClick = { - scope.launch { - try { - unfriendUser(user.id) - } catch (e: Exception) { - if (e.message == "NoEffect") return@launch - logcat(LogPriority.ERROR) { e.asLog() } - } - } - }, - colors = ButtonDefaults.buttonColors( - containerColor = MaterialTheme.colorScheme.error, - contentColor = MaterialTheme.colorScheme.onError, - ), - modifier = Modifier.weight(1f) - ) { - Text(stringResource(R.string.user_info_sheet_decline_request)) - } - } - - "Blocked" -> { - Button( - onClick = { - scope.launch { - try { - unblockUser(user.id) - } catch (e: Exception) { - if (e.message == "NoEffect") return@launch - logcat(LogPriority.ERROR) { e.asLog() } - } - } - }, - modifier = Modifier.weight(1f) - ) { - Text(stringResource(R.string.user_info_sheet_unblock)) - } - } - - "BlockedOther" -> Box(Modifier.weight(1f)) - } - - if (user.relationship != "User") { - Row { // Prevent the dropdown menu from counting towards arrangement spacing - DropdownMenu( - expanded = menuOpen, - onDismissRequest = { menuOpen = false } - ) { - when (user.relationship) { - "Friend" -> { - DropdownMenuItem( - text = { - Text(stringResource(R.string.user_info_sheet_remove_friend)) - }, - onClick = { - scope.launch { - try { - unfriendUser(user.id) - } catch (e: Exception) { - if (e.message == "NoEffect") return@launch - logcat(LogPriority.ERROR) { e.asLog() } - } - } - } - ) - } - } - - when (user.relationship) { - "Blocked" -> {} - - else -> DropdownMenuItem( - text = { - Text(stringResource(R.string.user_info_sheet_block)) - }, - onClick = { - scope.launch { - try { - blockUser(user.id) - } catch (e: Exception) { - if (e.message == "NoEffect") return@launch - logcat(LogPriority.ERROR) { e.asLog() } - } - } - } - ) - } - - DropdownMenuItem( - text = { - Text(stringResource(R.string.user_info_sheet_copy_id)) - }, - onClick = { - scope.launch { - clipboard.setText(AnnotatedString(user.id)) - } - } - ) - - DropdownMenuItem( - text = { - Text(stringResource(R.string.user_info_sheet_report)) - }, - onClick = { - scope.launch { - ActionChannel.send(Action.ReportUser(user.id)) - - if (Platform.needsShowClipboardNotification()) { - Toast.makeText( - context, - context.getString(R.string.copied), - Toast.LENGTH_SHORT - ).show() - } - } - } - ) - } - - IconButton( - onClick = { - menuOpen = true - } - ) { - Icon( - painter = painterResource(R.drawable.icn_more_vert_24dp), - contentDescription = stringResource(R.string.menu) - ) - } - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/chat/revolt/sheets/ChannelContextSheet.kt b/app/src/main/java/chat/revolt/sheets/ChannelContextSheet.kt deleted file mode 100644 index 57ef991d..00000000 --- a/app/src/main/java/chat/revolt/sheets/ChannelContextSheet.kt +++ /dev/null @@ -1,100 +0,0 @@ -package chat.revolt.sheets - -import android.widget.Toast -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height -import androidx.compose.material3.CircularProgressIndicator -import androidx.compose.material3.Icon -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.rememberCoroutineScope -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.LocalClipboardManager -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.AnnotatedString -import androidx.compose.ui.unit.dp -import chat.revolt.R -import chat.revolt.api.RevoltAPI -import chat.revolt.composables.generic.SheetButton - -import chat.revolt.internals.Platform -import kotlinx.coroutines.launch - -@Composable -fun ChannelContextSheet(channelId: String, onHideSheet: suspend () -> Unit) { - val channel = RevoltAPI.channelCache[channelId] - if (channel == null) { - Box( - modifier = Modifier - .fillMaxWidth() - .height(200.dp) - ) { - CircularProgressIndicator(modifier = Modifier.align(Alignment.Center)) - } - return - } - - val clipboardManager = LocalClipboardManager.current - val context = LocalContext.current - - val coroutineScope = rememberCoroutineScope() - - SheetButton( - headlineContent = { - Text( - text = stringResource(id = R.string.channel_context_sheet_actions_copy_id), - ) - }, - leadingContent = { - Icon( - painter = painterResource(id = R.drawable.icn_identifier_copy_24dp), - contentDescription = null - ) - }, - onClick = { - if (channel.id == null) return@SheetButton - - clipboardManager.setText(AnnotatedString(channel.id)) - - if (Platform.needsShowClipboardNotification()) { - Toast.makeText( - context, - context.getString(R.string.channel_context_sheet_actions_copy_id_copied), - Toast.LENGTH_SHORT - ).show() - } - - coroutineScope.launch { - onHideSheet() - } - } - ) - - SheetButton( - headlineContent = { - Text( - text = stringResource(id = R.string.channel_context_sheet_actions_mark_read), - ) - }, - leadingContent = { - Icon( - painter = painterResource(id = R.drawable.icn_mark_chat_read_24dp), - contentDescription = null - ) - }, - onClick = { - coroutineScope.launch { - channel.lastMessageID?.let { - RevoltAPI.unreads.markAsRead(channelId, it, sync = true) - } - onHideSheet() - } - } - ) - - -} diff --git a/app/src/main/java/chat/revolt/sheets/ServerContextSheet.kt b/app/src/main/java/chat/revolt/sheets/ServerContextSheet.kt deleted file mode 100644 index 98403d24..00000000 --- a/app/src/main/java/chat/revolt/sheets/ServerContextSheet.kt +++ /dev/null @@ -1,298 +0,0 @@ -package chat.revolt.sheets - -import android.content.Intent -import android.widget.Toast -import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.rememberScrollState -import androidx.compose.foundation.text.selection.SelectionContainer -import androidx.compose.foundation.verticalScroll -import androidx.compose.material3.AlertDialog -import androidx.compose.material3.Button -import androidx.compose.material3.Checkbox -import androidx.compose.material3.CircularProgressIndicator -import androidx.compose.material3.HorizontalDivider -import androidx.compose.material3.Icon -import androidx.compose.material3.LocalContentColor -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Text -import androidx.compose.material3.TextButton -import androidx.compose.runtime.Composable -import androidx.compose.runtime.CompositionLocalProvider -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.rememberCoroutineScope -import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.clip -import androidx.compose.ui.platform.LocalClipboardManager -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.res.stringResource -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.RevoltAPI -import chat.revolt.api.routes.server.leaveOrDeleteServer -import chat.revolt.composables.generic.SheetButton -import chat.revolt.composables.markdown.RichMarkdown -import chat.revolt.composables.screens.settings.ServerOverview -import chat.revolt.composables.sheets.SheetSelection -import chat.revolt.internals.Platform -import kotlinx.coroutines.launch - -@Composable -fun ServerContextSheet( - serverId: String, - onReportServer: () -> Unit, - onHideSheet: suspend () -> Unit -) { - val server = RevoltAPI.serverCache[serverId] - - if (server == null) { - Box( - modifier = Modifier - .fillMaxWidth() - .height(200.dp) - ) { - CircularProgressIndicator(modifier = Modifier.align(Alignment.Center)) - } - return - } - - val coroutineScope = rememberCoroutineScope() - val clipboardManager = LocalClipboardManager.current - val context = LocalContext.current - - var showLeaveConfirmation by remember { mutableStateOf(false) } - var leaveSilently by remember { mutableStateOf(false) } - - if (showLeaveConfirmation) { - AlertDialog( - onDismissRequest = { - showLeaveConfirmation = false - }, - title = { - Text( - text = stringResource( - id = R.string.server_context_sheet_actions_leave_confirm, - server.name ?: stringResource(R.string.unknown) - ) - ) - }, - text = { - Column { - Text( - text = stringResource( - id = R.string.server_context_sheet_actions_leave_confirm_eyebrow - ) - ) - Row( - Modifier - .fillMaxWidth() - .padding(start = 0.dp, end = 0.dp, top = 16.dp, bottom = 0.dp), - verticalAlignment = Alignment.CenterVertically - ) { - Checkbox( - checked = leaveSilently, - onCheckedChange = { leaveSilently = it } - ) - Text( - text = stringResource( - id = R.string.server_context_sheet_actions_leave_silently - ), - modifier = Modifier.padding(start = 4.dp) - ) - } - } - }, - confirmButton = { - Button( - onClick = { - coroutineScope.launch { - onHideSheet() - } - coroutineScope.launch { - leaveOrDeleteServer(serverId, leaveSilently) - } - } - ) { - Text( - text = stringResource( - id = R.string.server_context_sheet_actions_leave_confirm_yes - ) - ) - } - }, - dismissButton = { - TextButton( - onClick = { - showLeaveConfirmation = false - } - ) { - Text( - text = stringResource( - id = R.string.server_context_sheet_actions_leave_confirm_no - ) - ) - } - } - ) - } - - Column(Modifier.verticalScroll(rememberScrollState())) { - Column( - verticalArrangement = Arrangement.spacedBy(16.dp), - modifier = Modifier - .padding(top = 8.dp, start = 16.dp, end = 16.dp, bottom = 4.dp), - ) { - ServerOverview(server) - - SelectionContainer { - RichMarkdown( - input = if (server.description?.isBlank() == false) { - server.description - } else { - stringResource( - R.string.server_context_sheet_description_empty - ) - } - ) - } - - if (server.owner == RevoltAPI.selfId) { - Box( - modifier = Modifier - .clip(MaterialTheme.shapes.medium) - .background(MaterialTheme.colorScheme.primary) - ) { - CompositionLocalProvider(LocalContentColor provides MaterialTheme.colorScheme.onPrimary) { - SheetSelection( - icon = {}, - title = { - Text( - text = stringResource(id = R.string.server_context_sheet_moderators_early_disclaimer_title) - ) - }, - description = { - Text( - text = stringResource(id = R.string.server_context_sheet_moderators_early_disclaimer_body) - ) - }, - arrowTint = LocalContentColor.current.copy(alpha = 0.5f), - ) { - context.startActivity( - Intent( - Intent.ACTION_VIEW, - "${RevoltAPI.getCurrentAppUrl()}/server/${server.id}/settings".toUri() - ) - ) - } - } - } - } - - HorizontalDivider() - } - - SheetButton( - leadingContent = { - Icon( - painter = painterResource(id = R.drawable.icn_identifier_copy_24dp), - contentDescription = null - ) - }, - headlineContent = { - Text( - text = stringResource(id = R.string.server_context_sheet_actions_copy_id) - ) - }, - onClick = { - if (server.id == null) return@SheetButton - - clipboardManager.setText(AnnotatedString(server.id)) - - if (Platform.needsShowClipboardNotification()) { - Toast.makeText( - context, - context.getString(R.string.server_context_sheet_actions_copy_id_copied), - Toast.LENGTH_SHORT - ).show() - } - - coroutineScope.launch { - onHideSheet() - } - } - ) - - SheetButton( - leadingContent = { - Icon( - painter = painterResource(id = R.drawable.icn_mark_chat_read_24dp), - contentDescription = null - ) - }, - headlineContent = { - Text( - text = stringResource(id = R.string.server_context_sheet_actions_mark_read) - ) - }, - onClick = { - coroutineScope.launch { - server.id?.let { - RevoltAPI.unreads.markServerAsRead(it, sync = true) - } - onHideSheet() - } - } - ) - - if (server.owner != RevoltAPI.selfId) { - SheetButton( - leadingContent = { - Icon( - painter = painterResource(id = R.drawable.icn_report_24dp), - contentDescription = null - ) - }, - headlineContent = { - Text( - text = stringResource(id = R.string.server_context_sheet_actions_report), - ) - }, - dangerous = true, - onClick = { - onReportServer() - } - ) - - SheetButton( - leadingContent = { - Icon( - painter = painterResource(id = R.drawable.icn_door_open_24dp), - contentDescription = null, - ) - }, - headlineContent = { - Text( - text = stringResource(id = R.string.server_context_sheet_actions_leave) - ) - }, - dangerous = true, - onClick = { - showLeaveConfirmation = true - } - ) - } - } -} diff --git a/app/src/main/java/chat/revolt/sheets/UserInfoSheet.kt b/app/src/main/java/chat/revolt/sheets/UserInfoSheet.kt deleted file mode 100644 index fee3cf9d..00000000 --- a/app/src/main/java/chat/revolt/sheets/UserInfoSheet.kt +++ /dev/null @@ -1,421 +0,0 @@ -package chat.revolt.sheets - -import android.text.format.DateUtils -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size -import androidx.compose.foundation.layout.width -import androidx.compose.foundation.lazy.staggeredgrid.LazyVerticalStaggeredGrid -import androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridCells -import androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridItemSpan -import androidx.compose.foundation.rememberScrollState -import androidx.compose.foundation.text.selection.SelectionContainer -import androidx.compose.foundation.verticalScroll -import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.Icon -import androidx.compose.material3.LocalContentColor -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.ModalBottomSheet -import androidx.compose.material3.SmallFloatingActionButton -import androidx.compose.material3.Text -import androidx.compose.material3.rememberModalBottomSheetState -import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Brush -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.style.TextOverflow -import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp -import chat.revolt.R -import chat.revolt.api.RevoltAPI -import chat.revolt.api.internals.BrushCompat -import chat.revolt.api.internals.ULID -import chat.revolt.api.internals.solidColor -import chat.revolt.api.routes.user.fetchUserProfile -import chat.revolt.api.schemas.Profile -import chat.revolt.api.settings.Experiments -import chat.revolt.api.settings.FeatureFlags -import chat.revolt.composables.chat.RoleListEntry -import chat.revolt.composables.chat.UserBadgeList -import chat.revolt.composables.chat.UserBadgeRow -import chat.revolt.composables.generic.NonIdealState -import chat.revolt.composables.generic.UserAvatar -import chat.revolt.composables.markdown.RichMarkdown -import chat.revolt.composables.screens.settings.RawUserOverview -import chat.revolt.composables.screens.settings.UserButtons -import chat.revolt.composables.sheets.SheetTile -import kotlinx.datetime.Instant - -@OptIn(ExperimentalMaterial3Api::class) -@Composable -fun UserInfoSheet( - userId: String, - serverId: String? = null, - dismissSheet: suspend () -> Unit -) { - val user = RevoltAPI.userCache[userId] - - val member = serverId?.let { RevoltAPI.members.getMember(it, userId) } - - val server = RevoltAPI.serverCache[serverId] - - var profile by remember { mutableStateOf(null) } - var profileNotFound by remember { mutableStateOf(false) } - - LaunchedEffect(user) { - try { - user?.id?.let { fetchUserProfile(it) }?.let { profile = it } - } catch (e: Exception) { - if (e.message == "NotFound") { - profileNotFound = true - } - e.printStackTrace() - } - } - - if (user == null) { - // TODO fetch user in this scenario - NonIdealState( - icon = { - Icon( - painter = painterResource(R.drawable.icn_error_24dp), - contentDescription = null, - modifier = Modifier.size(it) - ) - }, - title = { - Text( - text = stringResource(R.string.user_info_sheet_user_not_found) - ) - }, - description = { - Text( - text = stringResource(R.string.user_info_sheet_user_not_found_description) - ) - } - ) - Spacer(Modifier.height(20.dp)) - return - } - - var showUserCard by remember { mutableStateOf(false) } - if (showUserCard) { - val sheetState = rememberModalBottomSheetState(true) - ModalBottomSheet( - sheetState = sheetState, - onDismissRequest = { showUserCard = false } - ) { - UserCardSheet(user) - } - } - - var showServerIdentityOptions by remember { mutableStateOf(false) } - if (showServerIdentityOptions) { - val sheetState = rememberModalBottomSheetState(true) - ModalBottomSheet( - sheetState = sheetState, - onDismissRequest = { showServerIdentityOptions = false } - ) { - ServerIdentityOptionsSheet( - userId = user.id!! - ) - } - } - - LazyVerticalStaggeredGrid( - columns = StaggeredGridCells.Fixed(2), - horizontalArrangement = Arrangement.spacedBy(16.dp), - verticalItemSpacing = 16.dp, - modifier = Modifier.padding(16.dp) - ) { - item(key = "overview", span = StaggeredGridItemSpan.FullLine) { - Box { - RawUserOverview(user, profile, internalPadding = false) - Row( - modifier = Modifier - .align(Alignment.TopEnd) - .padding(top = 8.dp, end = 8.dp) - ) { - if (Experiments.enableServerIdentityOptions.isEnabled) { - SmallFloatingActionButton( - onClick = { showServerIdentityOptions = true }, - ) { - Icon( - painter = painterResource(R.drawable.icn_psychology_alt_24dp), - contentDescription = null - ) - } - } - - if (FeatureFlags.userCardsGranted) { - SmallFloatingActionButton( - onClick = { showUserCard = true }, - ) { - Icon( - painter = painterResource(R.drawable.icn_badge_24dp), - contentDescription = null - ) - } - } - } - } - } - - member?.roles?.let { - item(key = "roles") { - SheetTile( - header = { - Text(stringResource(R.string.user_info_sheet_category_roles)) - }, - contentPreview = { - Column(verticalArrangement = Arrangement.spacedBy(8.dp)) { - it - .map { roleId -> server?.roles?.get(roleId) } - .sortedBy { it?.rank ?: 0.0 } - .take(3) - .forEach { role -> - role?.let { - RoleListEntry( - label = role.name ?: "null", - brush = role.colour?.let { BrushCompat.parseColour(it) } - ?: Brush.solidColor(LocalContentColor.current) - ) - } - } - } - } - ) { - Column(verticalArrangement = Arrangement.spacedBy(8.dp)) { - it - .map { roleId -> server?.roles?.get(roleId) } - .sortedBy { it?.rank ?: 0.0 } - .forEach { role -> - role?.let { - RoleListEntry( - label = role.name ?: "null", - brush = role.colour?.let { BrushCompat.parseColour(it) } - ?: Brush.solidColor(LocalContentColor.current) - ) - } - } - } - } - } - } - val accountAt = user.id?.let { - DateUtils.getRelativeTimeSpanString( - ULID.asTimestamp(user.id), - System.currentTimeMillis(), - DateUtils.MINUTE_IN_MILLIS - ).toString() - } - val joinedAt = member?.joinedAt?.let { - DateUtils.getRelativeTimeSpanString( - Instant.parse(member.joinedAt).toEpochMilliseconds(), - System.currentTimeMillis(), - DateUtils.MINUTE_IN_MILLIS - ).toString() - } - - item(key = "joined") { - SheetTile( - header = { - Text(stringResource(R.string.user_info_sheet_category_joined)) - }, - contentPreview = { - if (joinedAt != null && server?.name != null) { - Text( - text = joinedAt, - fontSize = 14.sp - ) - - Text( - text = server.name, - style = MaterialTheme.typography.labelMedium, - maxLines = 1, - overflow = TextOverflow.Ellipsis - ) - - Spacer(Modifier.height(4.dp)) - } - - accountAt?.let { _ -> - Text( - text = accountAt, - fontSize = 14.sp - ) - - Text( - text = stringResource(id = R.string.user_info_sheet_category_joined_revolt), - style = MaterialTheme.typography.labelMedium - ) - } - } - ) { - if (joinedAt != null && server?.name != null) { - Text( - text = joinedAt, - style = MaterialTheme.typography.displaySmall - ) - - Text( - text = server.name, - style = MaterialTheme.typography.labelMedium - ) - - Spacer(Modifier.height(8.dp)) - } - - accountAt?.let { _ -> - Text( - text = accountAt, - style = MaterialTheme.typography.displaySmall - ) - - Text( - text = stringResource(id = R.string.user_info_sheet_category_joined_revolt), - style = MaterialTheme.typography.labelMedium - ) - } - } - } - - if ((user.badges ?: 0) > 0) { - item(key = "info") { - SheetTile( - header = { - Text(stringResource(R.string.user_info_sheet_category_badges)) - }, - contentPreview = { - user.badges?.let { UserBadgeRow(badges = it) } - } - ) { - user.badges?.let { UserBadgeList(badges = it) } - } - } - } - - if (user.status?.text != null) { - item(key = "status") { - SheetTile( - header = { - Text(stringResource(R.string.user_info_sheet_category_status)) - }, - contentPreview = { - Text( - text = user.status.text, - fontSize = 14.sp, - maxLines = 5, - overflow = TextOverflow.Ellipsis - ) - } - ) { - Text( - text = user.status.text, - style = MaterialTheme.typography.bodyMedium - ) - } - } - } - - if (user.bot != null) { - val resolvedOwner = user.bot.owner?.let { RevoltAPI.userCache[it] } - - item(key = "bot-owner") { - SheetTile( - header = { - Text(stringResource(R.string.user_info_sheet_category_owner)) - }, - contentPreview = { - Row( - verticalAlignment = Alignment.CenterVertically - ) { - resolvedOwner?.let { - UserAvatar( - username = it.displayName ?: it.username - ?: stringResource(R.string.unknown), - avatar = it.avatar, - userId = it.id!!, - size = 32.dp - ) - Spacer(modifier = Modifier.width(8.dp)) - Text( - text = it.displayName ?: it.username - ?: stringResource(R.string.unknown), - fontSize = 14.sp, - maxLines = 1, - overflow = TextOverflow.Ellipsis - ) - } ?: run { - Icon( - painter = painterResource(id = R.drawable.icn_error_24dp), - contentDescription = null - ) - Spacer(modifier = Modifier.width(8.dp)) - Text( - text = stringResource(R.string.unknown), - fontSize = 14.sp, - maxLines = 1, - overflow = TextOverflow.Ellipsis - ) - } - } - } - ) { - resolvedOwner?.let { - RawUserOverview(it, null, internalPadding = false) - } ?: run { - NonIdealState( - icon = { - Icon( - painter = painterResource(R.drawable.icn_error_24dp), - contentDescription = null, - modifier = Modifier.size(24.dp) - ) - }, - title = { - Text( - text = stringResource(R.string.user_info_sheet_owner_not_found) - ) - } - ) - } - } - } - } - - if (profile?.content.isNullOrBlank().not()) { - item(key = "bio", span = StaggeredGridItemSpan.FullLine) { - SheetTile( - header = { - Text(stringResource(R.string.user_info_sheet_category_bio)) - }, - contentPreview = { - RichMarkdown(input = profile?.content!!) - } - ) { - SelectionContainer(modifier = Modifier.verticalScroll(rememberScrollState())) { - RichMarkdown(input = profile?.content!!) - } - } - } - } - - item(key = "actions", span = StaggeredGridItemSpan.FullLine) { - UserButtons(user, dismissSheet) - } - } - -} \ No newline at end of file diff --git a/app/src/main/java/chat/revolt/ui/theme/Theme.kt b/app/src/main/java/chat/revolt/ui/theme/Theme.kt deleted file mode 100644 index b8b0411c..00000000 --- a/app/src/main/java/chat/revolt/ui/theme/Theme.kt +++ /dev/null @@ -1,218 +0,0 @@ -package chat.revolt.ui.theme - -import android.annotation.SuppressLint -import android.app.Activity -import android.os.Build -import androidx.compose.foundation.isSystemInDarkTheme -import androidx.compose.foundation.shape.CornerBasedShape -import androidx.compose.foundation.shape.CornerSize -import androidx.compose.material3.ColorScheme -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.darkColorScheme -import androidx.compose.material3.dynamicDarkColorScheme -import androidx.compose.material3.dynamicLightColorScheme -import androidx.compose.material3.lightColorScheme -import androidx.compose.runtime.Composable -import androidx.compose.runtime.SideEffect -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.toArgb -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.platform.LocalView -import androidx.compose.ui.unit.dp -import androidx.core.view.ViewCompat - -val LightColorScheme = lightColorScheme( - primary = Colour.PrimaryLight, - onPrimary = Colour.OnPrimaryLight, - primaryContainer = Colour.PrimaryContainerLight, - onPrimaryContainer = Colour.OnPrimaryContainerLight, - secondary = Colour.SecondaryLight, - onSecondary = Colour.OnSecondaryLight, - secondaryContainer = Colour.SecondaryContainerLight, - onSecondaryContainer = Colour.OnSecondaryContainerLight, - tertiary = Colour.TertiaryLight, - onTertiary = Colour.OnTertiaryLight, - tertiaryContainer = Colour.TertiaryContainerLight, - onTertiaryContainer = Colour.OnTertiaryContainerLight, - error = Colour.ErrorLight, - onError = Colour.OnErrorLight, - errorContainer = Colour.ErrorContainerLight, - onErrorContainer = Colour.OnErrorContainerLight, - background = Colour.BackgroundLight, - onBackground = Colour.OnBackgroundLight, - surface = Colour.SurfaceLight, - onSurface = Colour.OnSurfaceLight, - surfaceVariant = Colour.SurfaceVariantLight, - onSurfaceVariant = Colour.OnSurfaceVariantLight, - outline = Colour.OutlineLight, - outlineVariant = Colour.OutlineVariantLight, - scrim = Colour.ScrimLight, - inverseSurface = Colour.InverseSurfaceLight, - inverseOnSurface = Colour.InverseOnSurfaceLight, - inversePrimary = Colour.InversePrimaryLight, - surfaceDim = Colour.SurfaceDimLight, - surfaceBright = Colour.SurfaceBrightLight, - surfaceContainerLowest = Colour.SurfaceContainerLowestLight, - surfaceContainerLow = Colour.SurfaceContainerLowLight, - surfaceContainer = Colour.SurfaceContainerLight, - surfaceContainerHigh = Colour.SurfaceContainerHighLight, - surfaceContainerHighest = Colour.SurfaceContainerHighestLight, -) - -private val RevoltColorScheme = darkColorScheme( - primary = Colour.PrimaryDark, - onPrimary = Colour.OnPrimaryDark, - primaryContainer = Colour.PrimaryContainerDark, - onPrimaryContainer = Colour.OnPrimaryContainerDark, - secondary = Colour.SecondaryDark, - onSecondary = Colour.OnSecondaryDark, - secondaryContainer = Colour.SecondaryContainerDark, - onSecondaryContainer = Colour.OnSecondaryContainerDark, - tertiary = Colour.TertiaryDark, - onTertiary = Colour.OnTertiaryDark, - tertiaryContainer = Colour.TertiaryContainerDark, - onTertiaryContainer = Colour.OnTertiaryContainerDark, - error = Colour.ErrorDark, - onError = Colour.OnErrorDark, - errorContainer = Colour.ErrorContainerDark, - onErrorContainer = Colour.OnErrorContainerDark, - background = Colour.BackgroundDark, - onBackground = Colour.OnBackgroundDark, - surface = Colour.SurfaceDark, - onSurface = Colour.OnSurfaceDark, - surfaceVariant = Colour.SurfaceVariantDark, - onSurfaceVariant = Colour.OnSurfaceVariantDark, - outline = Colour.OutlineDark, - outlineVariant = Colour.OutlineVariantDark, - scrim = Colour.ScrimDark, - inverseSurface = Colour.InverseSurfaceDark, - inverseOnSurface = Colour.InverseOnSurfaceDark, - inversePrimary = Colour.InversePrimaryDark, - surfaceDim = Colour.SurfaceDimDark, - surfaceBright = Colour.SurfaceBrightDark, - surfaceContainerLowest = Colour.SurfaceContainerLowestDark, - surfaceContainerLow = Colour.SurfaceContainerLowDark, - surfaceContainer = Colour.SurfaceContainerDark, - surfaceContainerHigh = Colour.SurfaceContainerHighDark, - surfaceContainerHighest = Colour.SurfaceContainerHighestDark, -) - -val AmoledColorScheme = RevoltColorScheme.copy( - background = Color(0xff000000), - onBackground = Color(0xffffffff), - surfaceVariant = Color(0xff131313), - onSurfaceVariant = Color(0xffffffff), - surface = Color(0xff000000), - onSurface = Color(0xffffffff), - surfaceContainerLowest = Color(0xff000000), - surfaceContainerLow = Color(0xff000000), - surfaceContainer = Color(0xff000000), - surfaceContainerHigh = Color(0xff000000), - surfaceContainerHighest = Color(0xff000000), -) - -enum class Theme { - None, - Revolt, - Light, - M3Dynamic, - Amoled -} - -@Composable -fun getColorScheme( - requestedTheme: Theme, - colourOverrides: OverridableColourScheme? = null -): ColorScheme { - val context = LocalContext.current - - val systemInDarkTheme = isSystemInDarkTheme() - val m3Supported = systemSupportsDynamicColors() - - val colorScheme = when { - m3Supported && requestedTheme == Theme.M3Dynamic && systemInDarkTheme -> dynamicDarkColorScheme( - context - ) - - m3Supported && requestedTheme == Theme.M3Dynamic && !systemInDarkTheme -> dynamicLightColorScheme( - context - ) - - requestedTheme == Theme.Revolt -> RevoltColorScheme - requestedTheme == Theme.Light -> LightColorScheme - requestedTheme == Theme.Amoled -> AmoledColorScheme - requestedTheme == Theme.None && systemInDarkTheme -> RevoltColorScheme - requestedTheme == Theme.None && !systemInDarkTheme -> LightColorScheme - else -> RevoltColorScheme - }.copy() - - val colorSchemeIsDark = when { - m3Supported && requestedTheme == Theme.M3Dynamic -> isSystemInDarkTheme() - requestedTheme == Theme.Revolt -> true - requestedTheme == Theme.Light -> false - requestedTheme == Theme.Amoled -> true - requestedTheme == Theme.None && systemInDarkTheme -> true - requestedTheme == Theme.None && !systemInDarkTheme -> false - else -> true - } - - val view = LocalView.current - if (!view.isInEditMode) { - SideEffect { - val window = (view.context as Activity).window - window.statusBarColor = Color.Transparent.toArgb() - @Suppress("DEPRECATION") - ViewCompat.getWindowInsetsController(view)?.isAppearanceLightStatusBars = - !colorSchemeIsDark - } - } - - if (colourOverrides == null) return colorScheme - return colourOverrides.applyTo(colorScheme) -} - -@SuppressLint("NewApi") -@Composable -fun RevoltTheme( - requestedTheme: Theme, - colourOverrides: OverridableColourScheme? = null, - content: @Composable () -> Unit -) { - val colorScheme = getColorScheme(requestedTheme, colourOverrides) - - MaterialTheme( - shapes = MaterialTheme.shapes.copy( - small = MaterialTheme.shapes.small.copy( - topStart = CornerSize(8.dp), - topEnd = CornerSize(8.dp), - bottomStart = CornerSize(8.dp), - bottomEnd = CornerSize(8.dp) - ) - ), - colorScheme = colorScheme, - typography = RevoltTypography, - content = content - ) -} - -fun systemSupportsDynamicColors(): Boolean { - return Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -} - -fun getDefaultTheme(): Theme { - return when { - systemSupportsDynamicColors() -> Theme.M3Dynamic - else -> Theme.Revolt - } -} - -fun isThemeDark(theme: Theme, systemIsDark: Boolean): Boolean { - return when (theme) { - Theme.Revolt, Theme.Amoled -> true - Theme.Light -> false - Theme.M3Dynamic, Theme.None -> systemIsDark - } -} - -@Composable -fun isThemeDark(theme: Theme) = isThemeDark(theme, isSystemInDarkTheme()) \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_revolt_decagram_24dp.xml b/app/src/main/res/drawable/ic_peptide_decagram_24dp.xml similarity index 100% rename from app/src/main/res/drawable/ic_revolt_decagram_24dp.xml rename to app/src/main/res/drawable/ic_peptide_decagram_24dp.xml diff --git a/app/src/main/res/drawable/icn_message_to_user.xml b/app/src/main/res/drawable/icn_message_to_user.xml new file mode 100644 index 00000000..da228649 --- /dev/null +++ b/app/src/main/res/drawable/icn_message_to_user.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/icn_notif_all_messages.xml b/app/src/main/res/drawable/icn_notif_all_messages.xml new file mode 100644 index 00000000..8ea11146 --- /dev/null +++ b/app/src/main/res/drawable/icn_notif_all_messages.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/icn_notif_mention_only.xml b/app/src/main/res/drawable/icn_notif_mention_only.xml new file mode 100644 index 00000000..9c02575c --- /dev/null +++ b/app/src/main/res/drawable/icn_notif_mention_only.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/icn_notif_mute.xml b/app/src/main/res/drawable/icn_notif_mute.xml new file mode 100644 index 00000000..6ca87c16 --- /dev/null +++ b/app/src/main/res/drawable/icn_notif_mute.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/icn_notif_none.xml b/app/src/main/res/drawable/icn_notif_none.xml new file mode 100644 index 00000000..24b069b4 --- /dev/null +++ b/app/src/main/res/drawable/icn_notif_none.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/icn_notif_use_default.xml b/app/src/main/res/drawable/icn_notif_use_default.xml new file mode 100644 index 00000000..3d28c65a --- /dev/null +++ b/app/src/main/res/drawable/icn_notif_use_default.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/pep_logo_wide.xml b/app/src/main/res/drawable/peptide_logo_wide.xml similarity index 100% rename from app/src/main/res/drawable/pep_logo_wide.xml rename to app/src/main/res/drawable/peptide_logo_wide.xml diff --git a/app/src/main/res/drawable/revolt_onboarding.xml b/app/src/main/res/drawable/peptide_onboarding.xml similarity index 100% rename from app/src/main/res/drawable/revolt_onboarding.xml rename to app/src/main/res/drawable/peptide_onboarding.xml diff --git a/app/src/main/res/drawable/revolt_logo_wide.xml b/app/src/main/res/drawable/revolt_logo_wide.xml deleted file mode 100644 index 6fa06d8a..00000000 --- a/app/src/main/res/drawable/revolt_logo_wide.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - diff --git a/app/src/main/res/drawable/usercard_heading.xml b/app/src/main/res/drawable/usercard_heading.xml index 20dd1723..4eb95a07 100644 --- a/app/src/main/res/drawable/usercard_heading.xml +++ b/app/src/main/res/drawable/usercard_heading.xml @@ -1,30 +1,15 @@ - - - - - - - + android:width="194dp" + android:height="32dp" + android:viewportWidth="194" + android:viewportHeight="32"> + + + diff --git a/app/src/main/res/font/revolt_usercard.ttf b/app/src/main/res/font/peptide_usercard.ttf similarity index 100% rename from app/src/main/res/font/revolt_usercard.ttf rename to app/src/main/res/font/peptide_usercard.ttf diff --git a/app/src/main/res/layout/activity_videoplayer.xml b/app/src/main/res/layout/activity_videoplayer.xml index fc3252fe..19225b04 100644 --- a/app/src/main/res/layout/activity_videoplayer.xml +++ b/app/src/main/res/layout/activity_videoplayer.xml @@ -24,7 +24,7 @@ app:navigationIcon="@drawable/ic_arrow_left_24dp" app:menu="@menu/menu_videoplayer" app:navigationIconTint="?attr/colorOnSurface" - style="@style/Widget.Revolt.Toolbar" /> + style="@style/Widget.Peptide.Toolbar" /> سياسة الخصوصية ارشادات المجتمع أجد مجتمعك، اتصل بالعالم. - Revolt من أفضل الطرق لكي تظل متصلاً مع أصدقائك ومجتمعك، في أي مكان، وفي أي وقت. + Peptide من أفضل الطرق لكي تظل متصلاً مع أصدقائك ومجتمعك، في أي مكان، وفي أي وقت. البريد الإلكتروني كلمة المرور تسجيل الدخول @@ -20,8 +20,8 @@ هيا نسجل دخولك نسيت كلمة المرور؟ نسيت كلمة المرور؟ - مرحبا بك في Revolt - استخدم Revolt كي تتحدث عن الأشياء. + مرحبا بك في Peptide + استخدم Peptide كي تتحدث عن الأشياء. نجلب بعض المعلومات، انتظرنا… أعد إرسال بريد إلكتروني للتحقق تستخدم مساعد كلمات المرور؟ @@ -48,12 +48,12 @@ أدخل كلمة المرور الخاصة بك أدخل كلمة المرور الخاصة بك للاستمرار. عن - Revolt علي Android - مقدم إليك ب❤️ من قبل فريق Revolt. + Peptide علي Android + مقدم إليك ب❤️ من قبل فريق Peptide. إصدار معلومات تفصيلية إسناد البرامج مفتوحة المصدر - Revolt مبنيآ بمساعدة هذه البرامج المفتوحة المصدر الرائعة. + Peptide مبنيآ بمساعدة هذه البرامج المفتوحة المصدر الرائعة. البريد الإلكتروني سنرسل إليك بريد إلكتروني للتعريف لنعرّف حسابك. ثمانية فأكثر، كلمات المرور الشائعة سيئة. الرموز والأرقام مُستحسنة. @@ -85,7 +85,7 @@ الرموز الأعلام بوت - عضو من أعضاء Revolt + عضو من أعضاء Peptide غير معلوم قائمة تسجيل الخروج @@ -97,7 +97,7 @@ اعتدال المنصة تسجيل خروج المحادثات - مشاركة الى Revolt + مشاركة الى Peptide انت غير متصل بي الانترنت يرجى التحقق من اتصالك ثم حاول مره اخرا ابقي تسجيل الدخول متصل @@ -278,7 +278,7 @@ سجل التغيير %1$d اسم %1$d اسم المستخدم - %1$d على Revolt منذ + %1$d على Peptide منذ ويب هوك %1$dQR Code %1$d.صورة @@ -333,7 +333,7 @@ إرسال الإبلاغ.… تم الابلاغ - شكرا للمساعدة في الحفاظ على امان Revolt. سنراجع تقريرك في أقرب وقت ممكن. + شكرا للمساعدة في الحفاظ على امان Peptide. سنراجع تقريرك في أقرب وقت ممكن. خطأ حدث خطأ أثناء تقديم التقرير الخاص بك. يرجى المحاولة مرة أخرى في وقت لاحق. إغلاق @@ -381,7 +381,7 @@ لن تتلقى أي إشعارات للرسائل، ولكنك ستتلقى إشعارات للإشارات @. عدم الإزعاج لن تتلقى أي إشعارات، بما في ذلك الرسائل و@الإشارات. - ستتمكن من استخدام Revolt كالمعتاد، لكنك لن تظهر كمتصل للآخرين + ستتمكن من استخدام Peptide كالمعتاد، لكنك لن تظهر كمتصل للآخرين نص الحالة طويل جدا. محاولة للحفاظ عليه تحت%1$dالشخصيات ترك بصمت لا يمكن جلب السيرة الذاتية لهذا المستخدم. يرجى التحقق من مشاركة الخادم أو الأصدقاء. diff --git a/app/src/main/res/values-ast/strings.xml b/app/src/main/res/values-ast/strings.xml index 84c5ebd0..687c20bb 100644 --- a/app/src/main/res/values-ast/strings.xml +++ b/app/src/main/res/values-ast/strings.xml @@ -37,7 +37,7 @@ Introduz la to contraseña Introduz la to contraseña pa seguir. Alrodiu de - Revolt en Android + Peptide en Android Versión Atribución de códigu abiertu Damos-yos les gracies a los desenvolvedores d\'esos proyeutos por facer disponible\'l so trabayu pa tol mundu. @@ -61,7 +61,7 @@ Bot Dende la canal venceyada Moderación de plataforma - Miembru del equipu de Revolt + Miembru del equipu de Peptide Desconocíu Menú Zarrar sesión @@ -174,7 +174,7 @@ Axuntase Crear un nuevu servidor Crear un nuevu servidor - Escubrir Revolt + Escubrir Peptide Reportar Atayar Dinos lo que tá mal d\'esti mensaxe @@ -255,7 +255,7 @@ Caltener la sesión abierta Temes Sistema - Revolt + Peptide Nidiu Prietu dafechu Material You @@ -293,12 +293,12 @@ ← P\'atrás Pescanciando daqué d\'información, aguanta ehí… Atopa la to comunidá, conecta col mundu. - Revolt ye una de les meyores formes de tar conectáu colos tos amigos y comunidá, en cualesquier llugar y en cualesquier momentu. + Peptide ye una de les meyores formes de tar conectáu colos tos amigos y comunidá, en cualesquier llugar y en cualesquier momentu. Inscribíte ¿Escaecisti la to contraseña\? Introduz el to corréu electrónicu y unviarémoste instrucciones sobro como restablecer la to contraseña. - Bienveníu a Revolt - Usa Revolt pa falar sobro coses. + Bienveníu a Peptide + Usa Peptide pa falar sobro coses. Ye como un llugar pa pasar el ratu, rexuntáse, y falar sobro coses. La meyor parte, tá n\'internet. Corréu electrónicu Vamos unviáte un corréu de verificación pa confirmar la to cuenta. @@ -309,9 +309,9 @@ Usar un códigu de recuperación Pon el códigu de seyes númberos de la to aplicación d\'autenticación. Introduz ún de los tos códigos de recuperación. - Trayíu pa ti con ❤️ pol equipu de Revolt. + Trayíu pa ti con ❤️ pol equipu de Peptide. Detalles - Revolt tá fechu cola ayuda d\'estos maraviyosos proyeutos de códigu abiertu. + Peptide tá fechu cola ayuda d\'estos maraviyosos proyeutos de códigu abiertu. La llista d\'embaxu foi xenerada automáticamente. Pue tar incompleta o enquivocada. Pulsa pa ver la llicencia Varies persones tán escribiendo @@ -319,7 +319,7 @@ \@ activáu Comida y Bebíes Viaxe y Llugares - Xuntáse a Revolt + Xuntáse a Peptide Jenvolt ye\'l espaciu dirixíu por desenvolvedores pa toles coses d\'Android app y más. Sofitu y comentarios fácense equí. ¡Quiciabes pueas llograr probar nueves característiques! 👀 Esborrar toles solicitúes entrantes Nun hai nenguna canal nesti servidor. Nin siquier una canal de bienvenida. Qué faltoso. @@ -328,7 +328,7 @@ Cargar mensaxes Unviar un mensaxe en %1$s Nun tienes permisu pa unviar mensaxes nesta canal. - Esta ye una canal d\'enfotu pa noticies de moderación de Revolt. Nun pues unviar mensaxes equí. + Esta ye una canal d\'enfotu pa noticies de moderación de Peptide. Nun pues unviar mensaxes equí. Propiedá camudada Usuariu amestáu %1$s tresfirió la propiedá a %2$s @@ -337,7 +337,7 @@ Van %1$d díes Estáu Nun vas arrecibir notificaciones de mensaxes, pero vas arrecibir notificaciones de @menciones. - Vas poder usar Revolt como siempre, pero nun vas apaecer conectáu pa otres persones. + Vas poder usar Peptide como siempre, pero nun vas apaecer conectáu pa otres persones. Nun tas conectáu al Internet. Por favor, comprueba la to conexón y téntalo otra vez. Copiáu nel portapapeles Esti canal pue ser que s\'esaniciara o nun tengas permisu pa velu. @@ -368,7 +368,7 @@ Acosu o ciberacosu Conteníu inapropriáu (como NSFW) Cualesquier información adicional que puea ayudanos na nuesa investigación. Opcional. - Gracies por ayudar a caltener Revolt seguru. Vamos revisar el to reporte lo enantes posible. + Gracies por ayudar a caltener Peptide seguru. Vamos revisar el to reporte lo enantes posible. Un erru producióse al unviar el to reporte. Porfavor tentalo de nuevu más tarde. Fuisti convidáu pa xunite a esti servidor. ¿Gustaríate xunite\? Nun s\'especificó nengún códigu d\'invitación. diff --git a/app/src/main/res/values-b+es+419/strings.xml b/app/src/main/res/values-b+es+419/strings.xml index 9e101726..690e1051 100644 --- a/app/src/main/res/values-b+es+419/strings.xml +++ b/app/src/main/res/values-b+es+419/strings.xml @@ -5,14 +5,14 @@ Compartir Términos de servicio Directivas de la comunidad - Revolt es una de las mejores formas de mantenerse conectado con tus amigos y la comunidad, en cualquier lugar y en cualquier momento. + Peptide es una de las mejores formas de mantenerse conectado con tus amigos y la comunidad, en cualquier lugar y en cualquier momento. Correo electrónico Contraseña Regístrate Reenviar Vamos a iniciar sesión ¿Usas un gestor de contraseñas\? - Te damos la bienvenida a Revolt + Te damos la bienvenida a Peptide Vamos a configurarlo. Correo electrónico Contraseña @@ -46,7 +46,7 @@ Reenviar un correo electrónico de verificación ¿Olvidaste tu contraseña\? Ingrese su correo electrónico y le enviaremos instrucciones sobre cómo restablecer su contraseña. - Usa Revolt para charlar sobre cosas interesantes. + Usa Peptide para charlar sobre cosas interesantes. Es como un lugar para pasar el rato, reunirse y charlar sobre diversas cosas. Lo mejor de todo, está en internet. Sus datos están a salvo con nosotros. No lo vendemos, y tampoco lo usamos para mostrarte anuncios. Te enviaremos un e-mail de verificación para confirmar su cuenta. @@ -194,7 +194,7 @@ Contenido inapropiado, como material NSFW (No apto para el trabajo) No cumple con la edad mínima requerida para utilizar la plataforma Cualquier información adicional que pueda ayudarnos en nuestra investigación será de utilidad. Opcional. - Gracias por ayudar a mantener Revolt seguro. Revisaremos tu denuncia tan pronto como sea posible. + Gracias por ayudar a mantener Peptide seguro. Revisaremos tu denuncia tan pronto como sea posible. Error Se produjo un error al enviar tu denuncia. Por favor, intenta nuevamente más tarde. Cerrar @@ -211,15 +211,15 @@ Compartir video Compartir imagen Otros - Revolt + Peptide Material You Material You (obsoleto) Comentarios Mensajes Directos Agradecemos a los desarrolladores de estos proyectos por poner a disponibilidad del mundo su trabajo. La siguiente lista fue generada automáticamente. Puede ser imprecisa o estar incompleta. - Revolt está hecho con la ayuda de estos maravillosos proyectos de código abierto. - Revolt en Android + Peptide está hecho con la ayuda de estos maravillosos proyectos de código abierto. + Peptide en Android Concentrado Invisible Ausente @@ -260,7 +260,7 @@ El usuario se ha ido %1$s ha transferido la propiedad a %2$s %1$s ha eliminado a %2$s - Podrás usar Revolt como siempre, pero no aparecerás conectado para otros usuarios. + Podrás usar Peptide como siempre, pero no aparecerás conectado para otros usuarios. Servidor oficial Servidor verificado Puede que este canal haya sido eliminado o no tengas permisos para verlo. @@ -275,7 +275,7 @@ Copiar ID Fundador Adoptador temprano - Descubrir Revolt + Descubrir Peptide Cuéntanos qué está mal con este mensaje Cuéntanos qué está mal con este servidor Cuéntanos qué pasa con este usuario @@ -284,7 +284,7 @@ Violencia extrema, sangre o crueldad animal Estafas o fraude La biografía de este usuario no se pudo obtener. Por favor, verifica que comparten un servidor o son amigos. - Presentado con ❤️ por el equipo de Revolt. + Presentado con ❤️ por el equipo de Peptide. Versión Detalles Elegir emoji @@ -298,7 +298,7 @@ Símbolos Banderas Moderación de la plataforma - Miembro del equipo de Revolt + Miembro del equipo de Peptide Unirse a Jenvolt Jenvolt es el espacio de desarrollo dedicado a la app de Android y más. El soporte y los comentarios se hacen aquí. ¡Puede que tengas la oportunidad de probar nuevas características! 👀 Amigos @@ -309,7 +309,7 @@ Bot de moderación verificado No puedes enviar mensajes en este canal. No tienes permiso para enviar mensajes en este canal. - Este es un canal de confianza para noticias del equipo de moderación de Revolt. No puedes enviar mensajes aquí. + Este es un canal de confianza para noticias del equipo de moderación de Peptide. No puedes enviar mensajes aquí. %1$s se ha ido %1$s se ha unido No vas a recibir notificaciones de mensajes, pero vas a recibir notificaciones de @menciones. diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 614ac6b6..21a69fc8 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -14,18 +14,18 @@ Забылі пароль\? Адаслаць ліст пацвярджэння паўторна Забылі свой пароль\? - Сардэчна запрашаем у Revolt + Сардэчна запрашаем у Peptide Давайце створым уліковы запіс. ← Назад Атрымліваем інфармацыю, пачакайце… Знайдзіце сабе супольнасць, злучыцеся са светам. - Revolt – гэта адын з найлепшых шляхоў заставацца на сувязі з сябрамі і супольнасцю, усюды, заўсёды. + Peptide – гэта адын з найлепшых шляхоў заставацца на сувязі з сябрамі і супольнасцю, усюды, заўсёды. Увайсці Зарэгістравацца Увойдзем у ўліковы запіс Карыстуйцеся мэнэджэрам пароляў\? Увядзіце сваю электроную пошту, мы адашлем вам інструкцыі, як аднавіць ваш пароль. - Выкарыстовывайце Revolt каб вадзіцца пра розныя тэмы. + Выкарыстовывайце Peptide каб вадзіцца пра розныя тэмы. Гэта як месца, дзе можна завіснуць, сабрацца ды паразмаўляць пра розныя рэчы. Найлепшае тое, што гэта ў інтэрнэце. Не атрымалася захаваць аўдыа Абагуліць спасылку @@ -160,7 +160,7 @@ Знешні выгляд Тэма Сістэмная - Revolt + Peptide Светлая Чыста чорная Material You @@ -210,19 +210,19 @@ Дадатковая інфармацыя Любая дадатковая інфармацыя, якая магла бы дапамагчы нам. Не абавязкова. Паведамлена - Дзякуй за тое, што дапамагайце падтрымліваць Revolt бяспечным. Мы разглядзім вашу скаргу як мага хутчэй. + Дзякуй за тое, што дапамагайце падтрымліваць Peptide бяспечным. Мы разглядзім вашу скаргу як мага хутчэй. Вы сапраўды хочаце заблакаваць гэтага карыстальніка\? Вы ўжо ўдзельнік гэтага сервера. Код запрашэння не пазначаны. Узнікла невядомая памылка. Прайграць Мы ўдзячны распрацоўшчыкам гэтых праектаў за тое, што зрабілі іх даступнымі да свету. - Revolt створан з дапамогай гэтых цудоўных праэктаў з адкрытым зыходным кодам. - Revolt для Android - Створана з ❤️ камандай Revolt. + Peptide створан з дапамогай гэтых цудоўных праэктаў з адкрытым зыходным кодам. + Peptide для Android + Створана з ❤️ камандай Peptide. Версія Падрабязнасці - Вы зможаце выкарыстовываць Revolt як заўсёды, але для іншых вы будзеце па-за сеткай. + Вы зможаце выкарыстовываць Peptide як заўсёды, але для іншых вы будзеце па-за сеткай. Гэты канал быў выдалены, або вы не маеце дазволу на яго прагляд. Jenvolt — гэта месца пад кіраваннем распрацоўшчыкаў для ўсіх рэчаў, звязаных з праграмай на Android і іншым. Тут можна атрымаць падтрымку або пакінуць водгук. Мабыць вы паспрабуйце новыя функцыі! 👀 Заблакіраваныя @@ -255,7 +255,7 @@ Сімвалы Сцягі Мадэрацыя платформы - Член каманды Revolt + Член каманды Peptide Далучыцца да Jenvolt Сябры Запыты да сяброўства @@ -381,7 +381,7 @@ Спіс змен гэту версію Даследаванне - Даследаваць Revolt + Даследаваць Peptide Паведаміце, што не так с гэтым паведамленнем Паведаміце, што не так с гэтым серверам Паведаміце, што не так з гэтым карыстальнікам @@ -413,10 +413,10 @@ Гэты канал пазначаны як NSFW Вы павінны быць старэйшымі за 18 гадоў, каб праглядзець гэты канал. Вы павінны быць старэйшымі за 18 гадоў, каб праглядваць гэты канал. - Абагуліць да Revolt - Калі ласка, увайдзіце ў уліковы запіс, каб абагуліць да Revolt. + Абагуліць да Peptide + Калі ласка, увайдзіце ў уліковы запіс, каб абагуліць да Peptide. Гэта не падыходзіць да абагульнення. - Гэтае далучэнне занадта вялікае для Revolt (макс. $1$s). + Гэтае далучэнне занадта вялікае для Peptide (макс. $1$s). Пошук каналаў Калі ласка, абярыце канал, ў які вы хочаце абагуліць паведамленне. Дата нараджэння @@ -433,7 +433,7 @@ Выдаліць Пакінуць Паскардзіцца - Далучыцеся да сервера Revolt, каб пакінуць водгук або пракановы і паведаміць аб памылках. + Далучыцеся да сервера Peptide, каб пакінуць водгук або пракановы і паведаміць аб памылках. Новая група Стварыць новую групу Збярыце сваю каманду ў групавым чаце. Вы можаце дадаць да %1$d чалавек. @@ -552,13 +552,13 @@ Не ўдалося загрузіць ваш агляд Абагуліць профіль Праглядзіце вашу картку і атрымайце спецыяльную спасылку для абагульнення - Revolt ніколі не спіць, паглядзіце, над чым зараз ідзе праца + Peptide ніколі не спіць, паглядзіце, над чым зараз ідзе праца Ёсць штосьці сказаць\? Мы гатовыя слухаць Вы знайшлі вэбхук! Націсніце, каб скапіраваць Узнікла памылка пры абагульненні вашай карткі. %1$d.Імя - %1$d.На Revolt з + %1$d.На Peptide з %1$d.Імя Карыстальніка %1$d.QR-код %1$d.Фота @@ -571,7 +571,7 @@ [Фрагмент кода] Даведацца больш Выкарыстоўвайце клавіятуру? - У Revolt ёсць спалучэнні клавіш! Націсніце %1$s, каб іх убачыць. + У Peptide ёсць спалучэнні клавіш! Націсніце %1$s, каб іх убачыць. Адкрыць спалучэнні клавіш Добра Новы абзац @@ -580,19 +580,19 @@ Налады сістэмы Вітаем у раннім доступе! 🚀 Вы адні з тых, хто першымі спрабуюць нашу новую праграму для Android. Мы радыя бачыць вас тут! - Таму што гэта ранні доступ, рэчы пакуль што могуць быць неідэальнымі. Вы можаце наткнуцца на памылку, праграма можа вылецець, ці вы ўбачыце якое-небудзь іншае дзівацтва. Ваш водгук дапаможа адпаліраваць праграму і зрабіць Revolt яшчэ больш здатным. + Таму што гэта ранні доступ, рэчы пакуль што могуць быць неідэальнымі. Вы можаце наткнуцца на памылку, праграма можа вылецець, ці вы ўбачыце якое-небудзь іншае дзівацтва. Ваш водгук дапаможа адпаліраваць праграму і зрабіць Peptide яшчэ больш здатным. Мы радыя, што вы цяпер з намі. Давайце разам зробім штосьці выдатнае! Зразумела Мы любім водгукі! - Калі вы хочаце пакінуць аніякі водгук, у вас ёсць прапановы ці вы знайшлі памылку, калі ласка, паведаміце нам аб гэтым. Мы заўжды хочам палепшыць Revolt. + Калі вы хочаце пакінуць аніякі водгук, у вас ёсць прапановы ці вы знайшлі памылку, калі ласка, паведаміце нам аб гэтым. Мы заўжды хочам палепшыць Peptide. Ацаніць у Google Play Далучыцца да сервера тэсціроўшчыкаў Гатова Падказка - Некаторыя з вашых налад Revolt пашкоджаныя. Гэта можа быць з-за старонняга кліента. Налады, на якія гэта ўплыло: + Некаторыя з вашых налад Peptide пашкоджаныя. Гэта можа быць з-за старонняга кліента. Налады, на якія гэта ўплыло: Апавяшчэнні Парадак сервероў - Revolt для Android + Peptide для Android %1$s (невядома) Скінуць налады %1$s \ No newline at end of file diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index e09c8005..8f39b5f6 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -12,7 +12,7 @@ Намерете своята общност, свържете се със света. Извличаме информация, моля изчакайте… Нека ви впишем - Revolt е един от най-добрите начини да поддържате връзка с вашите приятели и общност, навсякъде и по всяко време. + Peptide е един от най-добрите начини да поддържате връзка с вашите приятели и общност, навсякъде и по всяко време. Имейл Парола Влез @@ -24,8 +24,8 @@ Използвате мениджър на пароли\? Забравена парола\? Въведете вашия имейл и ние ще ви изпратим инструкции как да нулирате паролата си. - Добре дошли в Revolt - Използвай Revolt, за да говориш за различни неща. + Добре дошли в Peptide + Използвай Peptide, за да говориш за различни неща. Това е като място за висене, събиране и разговаряне. Най-хубавото е, че е в интернет. Нека да ви настроим. Вашите лични данни са в безопасност при нас. Ние не ги продаваме и не ги използваме, за да ви показваме реклами. diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index e6c88a43..bf8de7ad 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -1,13 +1,13 @@ - Revolt হল আপনার বন্ধুদের এবং সম্প্রদায়ের (কমিউনিটির) সাথে, যেকোনো জায়গায়, যে কোনো সময় যুক্ত থাকার এক অন্যতম সেরা উপায়। + Peptide হল আপনার বন্ধুদের এবং সম্প্রদায়ের (কমিউনিটির) সাথে, যেকোনো জায়গায়, যে কোনো সময় যুক্ত থাকার এক অন্যতম সেরা উপায়। যাচাইকরণ ই-মেইল আবার পাঠানোর জন্য অনুরোধ পাঠান ← ফিরে যান এরপর → ঠিক আছে বাতিল করুন শেয়ার করুন - Revolt এর সার্ভিসের শর্তাবলী + Peptide এর সার্ভিসের শর্তাবলী গোপনীয়তা নীতি ই-মেইল পাসওয়ার্ড @@ -21,8 +21,8 @@ আপনার অ্যাকাউন্টকে আরো নিরাপদ রাখতে আপনি 2FA চালু করেছেন। চলুন আপনার ইমেল লিখুন এবং আমরা আপনাকে আপনার পাসওয়ার্ড রিসেট করার নির্দেশাবলী পাঠাব। - Revolt-এ আপনাকে স্বাগত জানাই - যে কোনো কিছু সম্পর্কে কথা বলার জন্য Revolt -কে ব্যবহার করুন। + Peptide-এ আপনাকে স্বাগত জানাই + যে কোনো কিছু সম্পর্কে কথা বলার জন্য Peptide -কে ব্যবহার করুন। এটি আড্ডা দেওয়ার, একত্রিত হওয়ার এবং যে কোনো কিছুর বিষয়ে আলোচনা করার মতো জায়গা৷ এটি হলো ইন্টারনেটের এক অন্যতম সেরা জায়গা। চলুন, আপনাকে সমস্ত কিছু সেট আপ করানো যাক। আপনার তথ্য আমাদের কাছে নিরাপদ। আমরা এটি কারোর কাছেই বিক্রি করি না, নাতো আমরা আপনাকে বিজ্ঞাপন দেখানোর জন্য এর ব্যবহার করি। @@ -169,7 +169,7 @@ অন্যান্য কোনো অতিরিক্ত তথ্য যা আমাদের তদন্তে সাহায্য করতে পারে। (প্রয়োজনীয় নয়)। রিপোর্ট করা হয়ে গেছে - Revolt-কে নিরাপদ রাখতে সাহায্য করার জন্য আপনাকে ধন্যবাদ। আমরা যত তাড়াতাড়ি সম্ভব আপনার রিপোর্ট দেখব ও তার উপর পুনর্বিবেচনা করব। + Peptide-কে নিরাপদ রাখতে সাহায্য করার জন্য আপনাকে ধন্যবাদ। আমরা যত তাড়াতাড়ি সম্ভব আপনার রিপোর্ট দেখব ও তার উপর পুনর্বিবেচনা করব। আপনি কি এই ইউজারকে ব্লক করতে চান\? আপনাকে এই সার্ভারে যোগদানের জন্য আমন্ত্রণ জানানো হয়েছে। আপনি কি এই সার্ভারে যুক্ত হতে চান\? চালান @@ -180,7 +180,7 @@ রুপ থিম সিস্টেম - Revolt + Peptide Material You মতামত লাইট @@ -194,7 +194,7 @@ Material You (সমর্থিত নয়) Material You এই ডিভাইসের জন্য সমর্থিত নয়। কিছু তথ্য আনা হচ্ছে, ওখানেই অপেক্ষা করুন… - Revolt সম্পর্কে জানুন + Peptide সম্পর্কে জানুন কোনো আমন্ত্রণ কোড পাওয়া যায়নি। নির্দিষ্ট কোড সহ কোনো আমন্ত্রণ লিঙ্ক খুঁজে পাওয়া যায়নি। একটি অজানা ত্রুটি ঘটেছে। @@ -213,7 +213,7 @@ কনটেন্ট এমন কিছুকে উৎসাহিত/প্রচার করছে যা নিজ বা অন্যের ক্ষতি করতে পারে এটি স্প্যাম বা প্ল্যাটফর্মের অপব্যবহার/দুর্ব্যবহার অন্যকে নকল করছেন - এই দুর্দান্ত ওপেন সোর্স প্রকল্পগুলির সাহায্যে Revolt তৈরি করা হয়েছে। + এই দুর্দান্ত ওপেন সোর্স প্রকল্পগুলির সাহায্যে Peptide তৈরি করা হয়েছে। শেষবারের মতো আপডেট হয়েছে: %1$s নীচের তালিকাটি স্বয়ংক্রিয়ভাবে তৈরি। এটা অসম্পূর্ণ বা ভুল হতে পারে। লাইসেন্স দেখতে এখানে টিপুন @@ -225,7 +225,7 @@ পশুপাখি ও প্রকৃতি কার্যকলাপ প্রতীক - Revolt দলের সদস্য + Peptide দলের সদস্য Jenvolt -এ যুক্ত হোন লিঙ্ক করা চ্যানেল থেকে সমস্ত @@ -251,7 +251,7 @@ সিস্টেম মেসেজ %1$s চলে গেছে স্ট্যাটাস - অ্যান্ড্রয়েডের (Android) এর জন্য Revolt + অ্যান্ড্রয়েডের (Android) এর জন্য Peptide স্মাইলি এবং আবেগ ব্যক্তি এবং শরীর খাবার এবং পানীয় @@ -280,7 +280,7 @@ আপনি মেসেজ এবং @উল্লেখ সহ কোনোরকম নোটিফিকেশন পাবেন না। অফলাইন অদৃশ্য - আপনি স্বাভাবিক ভাবেই Revolt ব্যবহার করতে পারবেন, কিন্তু অন্য কেউ আপনাকে অনলাইন হিসেবে দেখতে পারবে না। + আপনি স্বাভাবিক ভাবেই Peptide ব্যবহার করতে পারবেন, কিন্তু অন্য কেউ আপনাকে অনলাইন হিসেবে দেখতে পারবে না। %1$s চ্যানেলের আইকন পরিবর্তন করেছে অলস অফিসিয়াল সার্ভার @@ -342,7 +342,7 @@ এই ডিভাইসে এই ডিভাইসের সেশন আর উপলব্ধ নেই। আপনার বর্তমান সেশন দেখার জন্য দয়া করে **আবার লগ ইন করুন**। অন্যান্য সক্রিয় সেশনগুলো - Revolt কখনও থেমে থাকে না, একবার দেখুন আমরা কিসের উপর কাজ করছিলাম + Peptide কখনও থেমে থাকে না, একবার দেখুন আমরা কিসের উপর কাজ করছিলাম আইডি কপি করুন এই ইউজার হলো একটি বট। স্ট্যাটাস @@ -380,5 +380,5 @@ ডেভেলপার নতুন লাইন মেসেজ পাঠান - %1$d. Revolt -এ আছেন + %1$d. Peptide -এ আছেন \ No newline at end of file diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 2ebd3090..06fc7435 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -19,7 +19,7 @@ Reenviar un correu de verificació Estàs fent servir un gestor de contrassenyes\? Has oblidat la teva contrassenya\? - Benvingut/da a Revolt + Benvingut/da a Peptide Anem a configurar-te. Correu electrònic T\'enviarem un correu de verificació per confirmar el teu compte. @@ -160,7 +160,7 @@ Aparença Tema Sistema - Revolt + Peptide Clar Totalment fosc Material You @@ -177,10 +177,10 @@ Compartir imatge Bot Obtenint informació, espera\'t… - Revolt és una de les millors maneres de romandre connectat amb els teus amics i la teva comunitat, a qualsevol lloc, en qualsevol moment. + Peptide és una de les millors maneres de romandre connectat amb els teus amics i la teva comunitat, a qualsevol lloc, en qualsevol moment. Has oblidat la teva contrassenya\? Escriu el teu correu electrònic i t\'enviarem les instruccions sobre com restablir la teva contrassenya. - Fes servir Revolt per mantenir converses. + Fes servir Peptide per mantenir converses. És com un lloc per quedar, ajuntar-se i mantenir converses. La millor part és que és a internet. La teva informació és segura amb nosaltres. No la venem, ni la utilitzem per mostrar-te anuncis. Vuit o més, les freqüents són dolentes. Es recomana fer servir símbols i números. @@ -212,19 +212,19 @@ Assetjament o ciber-assetjament Contingut inapropiat (com NSFW) Qualsevol informació addicional que podria ajudar-nos en la nostra investigació. Opcional. - Gràcies per ajudar a mantenir Revolt segur. Revisarem la teva denúncia el més aviat possible. + Gràcies per ajudar a mantenir Peptide segur. Revisarem la teva denúncia el més aviat possible. Has sigut invitat a unir-te a aquest servidor. T\'agradaria unir-te\? S\'ha produït un error desconegut. Material You (sense suport) Estem agraïts als desenvolupadors d\'aquests projectes per fer que el seu treball estigui disponible al món. - Revolt es construeix amb l\'ajuda d\'aquests fantàstics projectes de codi obert. + Peptide es construeix amb l\'ajuda d\'aquests fantàstics projectes de codi obert. La llista següent es genera automàticament. Pot ser incomplet o inexacte. Última actualització: %1$s - Portat amb ❤️ per l\'equip de Revolt. + Portat amb ❤️ per l\'equip de Peptide. Versió Detalls Toqueu per veure la llicència - Revolt a Android + Peptide a Android Tria emoji Amaga la contrasenya Mostra la contrasenya diff --git a/app/src/main/res/values-ckb/strings.xml b/app/src/main/res/values-ckb/strings.xml index a4016d72..92f5590d 100644 --- a/app/src/main/res/values-ckb/strings.xml +++ b/app/src/main/res/values-ckb/strings.xml @@ -3,7 +3,7 @@ ڕەتکردنەوە هێنانی هەندێک زانیاری، کەمێک بوەستە… کۆمەڵگاکەت بدۆزەرەوە، پەیوەندی بە جیهانەوە بکە. - Revolt یەکێکە لە باشترین ڕێگاکان بۆ ئەوەی پەیوەندیت لەگەڵ هاوڕێ و کۆمەڵگاکەت هەبێت، لە هەر شوێنێک، لە هەر کاتێکدا. + Peptide یەکێکە لە باشترین ڕێگاکان بۆ ئەوەی پەیوەندیت لەگەڵ هاوڕێ و کۆمەڵگاکەت هەبێت، لە هەر شوێنێک، لە هەر کاتێکدا. ئیمەیڵەکەت بنووسە و ئێمە ڕێنماییت بۆ دەنێرین سەبارەت بە چۆنیەتی ڕێستکردنی وشەی نهێنی. ← گەڕانەوە دواتر ← @@ -24,5 +24,5 @@ ئیمێڵێکی پشتڕاستکردنەوە بنێرە بەڕێوەبەری وشەی نهێنی بەکاردەهێنیت؟ وشەی نهێنیت لەبیر كردووە ؟ - بەخێربێیت بۆ Revolt + بەخێربێیت بۆ Peptide \ No newline at end of file diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index d48a3a5a..860e4a6f 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -9,7 +9,7 @@ Načítání informací, vydržte… Ochrana údajů Pravidla komunity - Revolt je jedním z nejlepších způsobů, jak můžete zůstat ve spojení se svými přáteli a komunitou, kdekoli, kdykoli. + Peptide je jedním z nejlepších způsobů, jak můžete zůstat ve spojení se svými přáteli a komunitou, kdekoli, kdykoli. Heslo Přihlásit se Registrace @@ -19,14 +19,14 @@ Používáte správce hesel\? Zapomněli jste heslo\? Zadejte svůj e-mail, my vám na něj pošleme návod, jak můžete resetovat své heslo. - Víteje v Revoltu + Víteje v Peptideu Podmínky služby E-mail Pojďme se přihlásit Najděte svou komunitu, spojte se se světem. Znovu poslat ověřovací e-mail - Chatujte s ostatními na Revoltu. - Revolt je místo, kde se můžete scházet, setkávat a povídat si o čemkoli. A to nejlepší\? Je to na internetu. + Chatujte s ostatními na Peptideu. + Peptide je místo, kde se můžete scházet, setkávat a povídat si o čemkoli. A to nejlepší\? Je to na internetu. Pojďme vás připravit. Vaše údaje jsou u nás v bezpečí. Neprodáváme je a nepoužíváme je ani k zobrazování reklam. E-mail @@ -112,7 +112,7 @@ ze serveru %1$s z soukromého serveru Možnosti - Revolt byl vytvořen s pomocí těchto úžasných open-source projektů. + Peptide byl vytvořen s pomocí těchto úžasných open-source projektů. Jsme vděční vývojářům těchto projektů za to, že svou práci zpřístupnili světu. Níže uvedený seznam je generován automaticky. Může být neúplný nebo nepřesný. Poslední aktualizace: %1$s @@ -122,8 +122,8 @@ Neznámé Nabídka před %1$d dny - Revolt na Androidu - Vyvinuto s ❤️ týmem Revolt. + Peptide na Androidu + Vyvinuto s ❤️ týmem Peptide. Verze Podrobnosti Klepnutím na zobrazíte licenci @@ -148,7 +148,7 @@ Bot Z odkazovaného kanálu Moderace platformy - Člen týmu Revolt + Člen týmu Peptide Odhlásit se Připojit se do Jenvolt Přátelé @@ -193,7 +193,7 @@ Soustředěný Nebudete dostávat žádná oznámení o zprávách, ale budete dostávat oznámení o @zmínkách. Nebudete dostávat žádná oznámení, včetně zpráv a @zmínek. - Revolt budete moci používat jako obvykle, ale pro ostatní lidi se budete vypadat offline. + Peptide budete moci používat jako obvykle, ale pro ostatní lidi se budete vypadat offline. Tento kanál nelze zobrazit Správa oznámení Nová skupina @@ -219,7 +219,7 @@ Aktivní podporovatel Připojit se Vytvořit nový server - Prozkoumejte Revolt + Prozkoumejte Peptide Nahlásit Zrušit Vybraná zpráva: @@ -287,12 +287,12 @@ Import Tento soubor není platným souborem přepsání barev. Zpětná vazba - Připojte se k serveru Revoltu pro udělení zpětné vazby nebo nápadů a nahlášení chyb. + Připojte se k serveru Peptideu pro udělení zpětné vazby nebo nápadů a nahlášení chyb. Co jsme uvařili ✨ Seznam změn pro %1$s tamta verze - Sdílet na Revoltu - Tato příloha je pro Revolt příliš velká (max. $1$s). + Sdílet na Peptideu + Tato příloha je pro Peptide příliš velká (max. $1$s). Prohledat kanály Vytvořit Pro zobrazení tohoto kanálu vám musí být alespoň 18 let. @@ -321,7 +321,7 @@ Material You (nepodporovaný) Na kontejneru chyby Seznam změn - Před sdílením na Revoltu se prosím přihlaste. + Před sdílením na Peptideu se prosím přihlaste. Toto není platný intent sdílení. Vyberte kanál, do kterého chcete sdílet. Otevřít @@ -340,7 +340,7 @@ Vlastní pozadí Uložit Relace - Revolt + Peptide Světlý Čistě černá Material You @@ -392,7 +392,7 @@ Jakékoli další informace, které by nám mohly pomoci při vyšetřování. Nepovinné. Nahlašování… Nahlášeno - Děkujeme, že pomáháte s udržením bezpečnosti na Revoltu. Vaše nahlášení co nejdříve prověříme. + Děkujeme, že pomáháte s udržením bezpečnosti na Peptideu. Vaše nahlášení co nejdříve prověříme. Chyba Při odesílání vašeho nahlášení došlo k chybě. Zkuste to prosím znovu později. Zavřít diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 57d88be3..c1826db1 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -23,11 +23,11 @@ Kom i gang Klap lige hesten! Det gør du for ofte på kort tid. Find dit fællesskab, forbind med verden. - Revolt er en af de bedste måder at holde forbindelsen med dine venner og samfund på, hvor som helst og når som helst. + Peptide er en af de bedste måder at holde forbindelsen med dine venner og samfund på, hvor som helst og når som helst. Log på Igangværende i øjeblikket Vi oplever i øjeblikket problemer med vores tjenester. Se venligst vores statusside for mere information. Send bekræftelsesmail igen Indtast din mail, og vi sender dig instruktioner om, hvordan du nulstiller din adgangskode. - Velkommen til Revolt + Velkommen til Peptide \ No newline at end of file diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index f4e453ff..3d96d8e3 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -11,7 +11,7 @@ Anderes Spam oder ähnlicher Missbrauch Weitere Informationen, die uns bei unseren Ermittlungen helfen können. Optional. - Danke für deine Mithilfe dabei, Revolt so sicher wie möglich zu halten. Wir werden uns um deine Meldung so schnell wie möglich kümmern. + Danke für deine Mithilfe dabei, Peptide so sicher wie möglich zu halten. Wir werden uns um deine Meldung so schnell wie möglich kümmern. Konnte für diesen Einladungscode keine Einladung finden. Konnte Video nicht speichern System @@ -38,9 +38,9 @@ Hinweis: Diese Nachricht könnte von einer anderen Plattform stammen. Es wird empfohlen, die Nachricht auch auf der Plattform zu melden, von der sie stammt. Abbrechen Nutzungsbedingungen - Revolt ist eine der besten Möglichkeiten, überall und jederzeit mit deinen Freund:innen und deiner Community in Verbindung zu bleiben. + Peptide ist eine der besten Möglichkeiten, überall und jederzeit mit deinen Freund:innen und deiner Community in Verbindung zu bleiben. E-Mail senden - Rede auf Revolt über Dinge. + Rede auf Peptide über Dinge. Wir senden dir eine Verifizierungs-E-Mail, um deinen Account zu bestätigen. Willkommen! Andere werden dich mit diesem Namen finden, erkennen und erwähnen. @@ -54,7 +54,7 @@ Los geht\'s Datenschutzbedingungen Registrieren - Willkommen bei Revolt + Willkommen bei Peptide Lass uns alles einrichten. Deine Daten sind bei uns sicher. Wir verkaufen sie nicht und verwenden sie auch nicht, um dir Werbung anzuzeigen. Passwort @@ -204,7 +204,7 @@ Verschiedenes Erscheinungsbild Thema - Revolt + Peptide Hell Pures Schwarz Material You @@ -222,7 +222,7 @@ Wir sind den Entwickler:innen dieser Projekte dafür dankbar, dass sie ihre Arbeit der Welt verfügbar machen. Die untere Liste ist automatisch generiert. Sie könnte unvollständig oder inakkurat sein. Zuletzt aktualisiert: %1$s - Revolt wird durch diese fantastischen Open-Source-Projekte ermöglicht. + Peptide wird durch diese fantastischen Open-Source-Projekte ermöglicht. Besitzer:in geändert Das ist ein vertrauenswürdiger Kanal für Hinweise von unserem Moderationsteam. Du kannst hier keine Nachrichten senden. Nutzer:in ist beigetreten @@ -239,8 +239,8 @@ Mittlere Hautfarbe Du hat einen wichtigen Hinweis zu deinem Account von unserem Moderationsteam bekommen. Bitte lese ihn sorgfältig durch. Dieses Gerät wird angemeldet bleiben. - Revolt auf Android - Mit ❤️ vom Revolt-Team gemacht. + Peptide auf Android + Mit ❤️ vom Peptide-Team gemacht. Version Details Tippe, um die Lizenz anzuschauen @@ -255,7 +255,7 @@ Symbole Flaggen Plattform-Moderation - Revolt-Teammitglied + Peptide-Teammitglied Trete Jenvolt bei Jenvolt ist der Entwickler:innen-geführte Ort für alles, was mit der Android-App zu tun hat. Support und Feedback gehören hierhin. Vielleicht kannst du auch neue Funktionen ausprobieren! 👀 Freund:innen @@ -289,7 +289,7 @@ Du wirst gar keine Benachrichtigungen bekommen, einschließlich Nachrichten oder @Erwähnungen. Offline Unsichtbar - Du wirst Revolt wie üblich nutzen können, wirst für alle anderen aber als Offline angezeigt. + Du wirst Peptide wie üblich nutzen können, wirst für alle anderen aber als Offline angezeigt. Offizieller Server Verifizierter Server Dieser Kanal wurde möglicherweise gelöscht oder du hast nicht die nötige Berechtigung. @@ -382,7 +382,7 @@ Änderungsprotokoll für %1$s diese Version Entdecken - Entdecke Revolt + Entdecke Peptide Sag uns, was mit diesem Server nicht stimmt Sag uns, was mit diesem:dieser Nutzer:in nicht stimmt Erpressung oder Drohung @@ -412,11 +412,11 @@ Kopieren Schließen Dies ist kein gültiger Teilen-Intent. - Dieser Anhang ist zu groß für Revolt (maximal 1$s). + Dieser Anhang ist zu groß für Peptide (maximal 1$s). Kanäle suchen Bitte wähle einen Kanal zum Teilen aus. - Mit Revolt teilen - Du musst angemeldet sein, um auf Revolt etwas teilen zu können. + Mit Peptide teilen + Du musst angemeldet sein, um auf Peptide etwas teilen zu können. Du musst mindestens 18 Jahre alt sein, um diesen Kanal anzusehen. Du musst mindestens 18 Jahre alt sein, um diesen Kanal anzusehen. Dieser Kanal ist als NSFW gekennzeichnet @@ -434,7 +434,7 @@ Löschen Behalten Melden - Tritt dem Revolt-Server bei, um Feedback und Vorschläge zu geben oder Fehler zu melden. + Tritt dem Peptide-Server bei, um Feedback und Vorschläge zu geben oder Fehler zu melden. Neue Gruppe Bring deine Crew in einem Gruppenchat zusammen. Du kannst bis zu %1$d Personen hinzufügen. Das ist ein Bot. Er hat einen Plan. @@ -544,9 +544,9 @@ Status Passwort anzeigen Passwort verbergen - Revolt schläft nie, schau her, um zu entdecken, was wir gemacht haben + Peptide schläft nie, schau her, um zu entdecken, was wir gemacht haben Beim Teilen deiner Profilkarte ist ein Fehler aufgetreten. - %1$d.Nutzt Revolt Seit + %1$d.Nutzt Peptide Seit Webhook Webhooks sind automatisierte Übertragungen von anderen Diensten im Internet. Sie können nichts sagen, aber du kannst trotzdem sehen, was sie zu sagen haben. Überblick @@ -574,7 +574,7 @@ [%1$s-Snippet] [Codesnippet] Nutzt du eine Tastatur? - Revolt hat Tastenkürzel! Sieh sie dir mit %1$s an. + Peptide hat Tastenkürzel! Sieh sie dir mit %1$s an. Kürzelübersicht öffnen Alles klar Nachrichten @@ -582,19 +582,19 @@ Nachricht senden Willkommen beim Early Access! 🚀 Du gehörst zu den ersten, die unsere neue Android-App ausprobieren können. Wir freuen uns, dich hier zu haben! - Da es sich um eine Early-Access-Version handelt, kann es sein, dass noch nicht alles perfekt ist. Es kann sein, dass du gelegentlich auf einen Fehler, einen Absturz oder eine seltsame Macke stößt. Euer Feedback hilft uns, die rauen Kanten zu glätten und Revolt noch besser zu machen. + Da es sich um eine Early-Access-Version handelt, kann es sein, dass noch nicht alles perfekt ist. Es kann sein, dass du gelegentlich auf einen Fehler, einen Absturz oder eine seltsame Macke stößt. Euer Feedback hilft uns, die rauen Kanten zu glätten und Peptide noch besser zu machen. Wir freuen uns sehr darüber, dich an Bord zu haben. Lass uns gemeinsam etwas Großartiges schaffen! Alles Klar Wir lieben Feedback! - Wenn du Feedback, Vorschläge oder Fehlerberichte hast, lass es uns bitte wissen. Wir sind immer bemüht, Revolt zu verbessern. + Wenn du Feedback, Vorschläge oder Fehlerberichte hast, lass es uns bitte wissen. Wir sind immer bemüht, Peptide zu verbessern. Auf Google Play bewerten Testerserver beitreten Fertig Hinweis - Einige deiner Revolt-Einstellungen sind beschädigt. Dies kann auf die Verwendung von Drittanbieter-Clients zurückzuführen sein. Die betroffenen Einstellungen sind: + Einige deiner Peptide-Einstellungen sind beschädigt. Dies kann auf die Verwendung von Drittanbieter-Clients zurückzuführen sein. Die betroffenen Einstellungen sind: Benachrichtigungen Serverreihenfolge %1$s (unbekannt) %1$s-Einstellungen zurücksetzen - Revolt auf Android + Peptide auf Android \ No newline at end of file diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 80bfff46..4490dd4c 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -11,8 +11,8 @@ Αποστολή email Ας σε συνδέσουμε Αποστολή email επαλήθευσης ξανά - Καλωσόρισες στο Revolt - Χρησιμοποίησε το Revolt για να συζητάς διάφορα. + Καλωσόρισες στο Peptide + Χρησιμοποίησε το Peptide για να συζητάς διάφορα. Ας σε ετοιμάσουμε. Εmail Θα σου στείλουμε ένα email επαλήθευσης για την επιβεβαίωση του λογαριασμού σου. @@ -43,7 +43,7 @@ Όροι Χρήσης Πολιτική Απορρήτου Βρες την κοινότητά σου, συνδέσου με τον κόσμο. - Το Revolt είναι ένας από τους καλύτερους τρόπους για να μείνεις συνδεδεμένος με τους φίλους και την κοινότητά σου, οπουδήποτε και οποτεδήποτε. + Το Peptide είναι ένας από τους καλύτερους τρόπους για να μείνεις συνδεδεμένος με τους φίλους και την κοινότητά σου, οπουδήποτε και οποτεδήποτε. Εγγραφή Ξέχασες τον κωδικό πρόσβασης; Χρησιμοποιείς διαχειριστή κωδικών πρόσβασης; @@ -62,8 +62,8 @@ Πληκτρολόγησε τον κωδικό πρόσβασής σου για να συνεχίσεις. Λυπούμαστε, αυτή η λειτουργία δεν είναι ακόμα έτοιμη. Ελέγξτε τα mail σας! - Το Revolt δημιουργείται με τη βοήθεια έργων ανοιχτού κώδικα. - Με ❤️ από την ομάδα της Revolt. + Το Peptide δημιουργείται με τη βοήθεια έργων ανοιχτού κώδικα. + Με ❤️ από την ομάδα της Peptide. Έκδοση Λεπτομέριες Αφαίρεση απάντησης @@ -82,11 +82,11 @@ Bot Από συνδεδεμένο κανάλι Διαχείριση πλατφόρμας - Μέλος ομάδας Revolt + Μέλος ομάδας Peptide Άγνωστο Μενού Αποσύνδεση - Revolt στο Android + Peptide στο Android Όνομα ομάδας Το εικονίδιο καναλιού άλλαξε Οι %1$s επανονόμασε το κανάλι σε %2$s @@ -97,7 +97,7 @@ Επανασυνδέεστε… Εστίαση Αόρατοι - Θα μπορείτε να χρησιμοποιήσετε το Revolt ως συνήθως, αλλά δεν θα εμφανίζεστε ως συνδεδεμένοι σε άλλα άτομα. + Θα μπορείτε να χρησιμοποιήσετε το Peptide ως συνήθως, αλλά δεν θα εμφανίζεστε ως συνδεδεμένοι σε άλλα άτομα. Επικυρωμένος Server Πρόσθεσε μέλη Σύνδεσμος μηνύματος αντιγράφτηκε στο πρόχειρο @@ -185,7 +185,7 @@ Δημιούργησε νέο server Δημιούργησε νέο server Αυτό το χαρακτηριστικό είναι υπό κατασκευή. - Discover Revolt + Discover Peptide Ακύρωση Πείτε μας τι συμβαίνει με αυτό το μήνυμα Πείτε μας τι συμβαίνει με αυτόν τον server @@ -259,7 +259,7 @@ Εμφάνιση Θέμα Σύστημα - Revolt + Peptide Ανοικτόχρωμο Καθαρό Μαύρο Το Material You δεν υποστηρίζεται σε αυτή τη συσκευή. @@ -454,8 +454,8 @@ Διαγραφή καναλιού Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτό το κανάλι; Διατήρηση - Κοινοποίηση στο Revolt - Συνδεθείτε πριν από την κοινοποίηση στο Revolt. + Κοινοποίηση στο Peptide + Συνδεθείτε πριν από την κοινοποίηση στο Peptide. Αυτή δεν είναι μια έγκυρη πρόθεση κοινοποίησης. Επιλέξτε ένα κανάλι για κοινοποίηση. Αιτήματα φιλίας @@ -506,7 +506,7 @@ Στο Τριτογενές Οι διαδραστικές ενσωματώσεις σάς επιτρέπουν να αλληλεπιδράτε με ορισμένους τύπους συνδέσμων απευθείας μέσα στη συνομιλία. Για παράδειγμα, μπορείτε να αναπαράγετε βίντεο YouTube ή να κάνετε προεπισκόπηση άλμπουμ από το Apple Music. Apple Music - Εγγραφείτε στον server του Revolt για να κάνετε σχόλια ή προτάσεις και να αναφέρετε σφάλματα. + Εγγραφείτε στον server του Peptide για να κάνετε σχόλια ή προτάσεις και να αναφέρετε σφάλματα. Τι μαγειρεύεται ✨ Κατάλογος αλλαγών για %1$s Παρουσιάστηκε σφάλμα κατά την ενημέρωση του καναλιού. @@ -515,11 +515,11 @@ Κατάργηση σήμανσης ως NSFW Κρατήστε ως έχει Όλα τα μηνύματα και οι ρυθμίσεις για αυτό το κανάλι θα εξαφανιστούν για πάντα (πολύ καιρό!) - Αυτή η επισύναψη είναι πολύ μεγάλη για το Revolt (μέγιστο $1$s). + Αυτή η επισύναψη είναι πολύ μεγάλη για το Peptide (μέγιστο $1$s). Αυτό είναι bot. Άλλο Αναφέρθηκε - Σας ευχαριστούμε που βοηθήσατε να κρατήσουμε το Revolt ασφαλές. Θα εξετάσουμε την αναφορά σας το συντομότερο δυνατό. + Σας ευχαριστούμε που βοηθήσατε να κρατήσουμε το Peptide ασφαλές. Θα εξετάσουμε την αναφορά σας το συντομότερο δυνατό. Σφάλμα Παρουσιάστηκε σφάλμα κατά την υποβολή της αναφοράς σας. Προσπαθήστε ξανά αργότερα. Κλείσιμο diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml index e7afd3ad..86527bc6 100644 --- a/app/src/main/res/values-eo/strings.xml +++ b/app/src/main/res/values-eo/strings.xml @@ -16,8 +16,8 @@ Resendi konfirman retpoŝton Ĉu vi uzas pasvortadministrilon\? Ĉu vi forgesis vian pasvorton\? - Bonvenon al Revolt - Uzu Revolt por babili pri aferoj. + Bonvenon al Peptide + Uzu Peptide por babili pri aferoj. Retpoŝto Pasvorto Ok aŭ pli, komunoj estas malbonaj. Simboloj kaj nombroj estas rekomenditaj. @@ -41,7 +41,7 @@ Ŝarĝante iujn informojn, restu tie… Uzokondiĉoj Privateca Politiko - Revolt estas unu el la plej bonaj manieroj resti konektita kun viaj amikoj kaj komunumo, ie ajn, iam ajn. + Peptide estas unu el la plej bonaj manieroj resti konektita kun viaj amikoj kaj komunumo, ie ajn, iam ajn. Enigu vian retpoŝton kaj ni sendos al vi instrukciojn pri kiel reagordi vian pasvorton. Ĝi estas kiel loko por malstreĉiĝi, kunveni kaj paroli pri aferoj. Plej bona parto, ĝi estas en la interreto. Ni agordu vin. @@ -56,9 +56,9 @@ Enigu realiran kodon Enigu vian pasvorton Enigu vian pasvorton por daŭrigi. - Alportis al vi kun ❤️ de la Revolt teamo. - Revolt estas konstruita per la helpo de ĉi tiuj mirindaj malfermitkodaj projektoj. - Revolt en Android + Alportis al vi kun ❤️ de la Peptide teamo. + Peptide estas konstruita per la helpo de ĉi tiuj mirindaj malfermitkodaj projektoj. + Peptide en Android Versio Detaloj Atribuo de OSS @@ -165,7 +165,7 @@ Ne Disturbi Senkonekte Nevidebla - Vi povos uzi Revolt kiel ordinare, sed vi ne aperos konektite al aliaj personoj. + Vi povos uzi Peptide kiel ordinare, sed vi ne aperos konektite al aliaj personoj. Neniu retkonekto Premu por reprovi Rulumi ĝis malsupre @@ -224,7 +224,7 @@ Aldoni servilon Krei novan servilon Tiu funciado aktuale estas sub konstruo. - Malkovri Revolt + Malkovri Peptide Raporti Nuligi Selektita mesaĝo : @@ -234,7 +234,7 @@ \@ ŝaltita \@ malŝaltita Roboto - Revolt teamo membro + Peptide teamo membro Elirantaj Petoj Alvenintaj Petoj Forigi ĉiojn alvenintajn petojn diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 22f266a8..2c729bb5 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -7,7 +7,7 @@ Otras personas te encontrarán, reconocerán y te mencionarán con este nombre. No se pudo guardar el vídeo No se pudo guardar la imagen - Revolt es una de las mejores formas de mantenerse conectado con tus amigos y la comunidad, en cualquier lugar y en cualquier momento. + Peptide es una de las mejores formas de mantenerse conectado con tus amigos y la comunidad, en cualquier lugar y en cualquier momento. Vamos Correo electrónico Contraseña @@ -20,8 +20,8 @@ Reenviar un correo electrónico de verificación ¿Usas un administrador de contraseñas\? Introduce tu correo electrónico y te enviaremos instrucciones sobre cómo restablecer tu contraseña. - Te damos la bienvenida a Revolt - Usa Revolt para chatear sobre cosas. + Te damos la bienvenida a Peptide + Usa Peptide para chatear sobre cosas. Vamos a configurarlo. Tus datos están a salvo con nosotros. No los vendemos, y tampoco los usamos para mostrarte anuncios. Correo electrónico @@ -148,7 +148,7 @@ Enviar Denunciando… Denunciado - Gracias por ayudar a mantener Revolt seguro. Revisaremos tu denuncia lo antes posible. + Gracias por ayudar a mantener Peptide seguro. Revisaremos tu denuncia lo antes posible. Error Cerrar ¿Te gustaría bloquear a este usuario\? @@ -180,7 +180,7 @@ Apariencia Temas Sistema - Revolt + Peptide Claro Material You (sin soporte) Material You no es compatible con este dispositivo. @@ -238,7 +238,7 @@ Símbolos Banderas Plataforma de moderación - Miembro del equipo de Revolt + Miembro del equipo de Peptide Unirse a Jenvolt Jenvolt es el espacio de desarrollo dedicado a la app de Android y más. El soporte y los comentarios se hacen aquí. ¡Quizás tengas la oportunidad de probar nuevas características! 👀 Amigos @@ -249,7 +249,7 @@ Bot de moderación verificado No puedes enviar mensajes en este canal. No tienes permisos para enviar mensajes en este canal. - Este es un canal de confianza para noticias de moderación de Revolt. No puedes enviar mensajes aquí. + Este es un canal de confianza para noticias de moderación de Peptide. No puedes enviar mensajes aquí. Usuario eliminado Usuario añadido Usuario baneado @@ -278,15 +278,15 @@ de %1$s desde un servidor privado Añadir miembros - Revolt en Android - Revolt está hecho con la ayuda de esos maravillosos proyectos de código abierto. + Peptide en Android + Peptide está hecho con la ayuda de esos maravillosos proyectos de código abierto. La lista de abajo ha sido generada automáticamente. Puede estar incompleta o errónea. Última actualización: %1$s %1$s ha renombrado el canal a %2$s No recibirás notificaciones de mensajes, pero recibirás notificaciones de @menciones. No recibirás ninguna notificación, incluido mensajes y @menciones. - Podrás usar Revolt como siempre, pero no aparecerás como conectado para otras personas. - Presentado con ❤️ por el equipo de Revolt. + Podrás usar Peptide como siempre, pero no aparecerás como conectado para otras personas. + Presentado con ❤️ por el equipo de Peptide. Descubrir dejar dejar @@ -327,7 +327,7 @@ Moderacion de Plataforma Partidario Activo Adoptante Temprano - Descubre Revolt + Descubre Peptide Díganos qué hay de malo en este mensaje Dinos qué esta mal con este usuario Este canal está marcado como NSFW @@ -395,10 +395,10 @@ En el Fondo Superficie Error - Compartir a Revolt - Por favor, inicia sesión antes de compartir a Revolt. + Compartir a Peptide + Por favor, inicia sesión antes de compartir a Peptide. Intento de compartir no válido. - Este archivo es muy grande para Revolt (max. $1$s). + Este archivo es muy grande para Peptide (max. $1$s). Buscar canales Por favor, elige un canal para compartir. Adjuntar un archivo @@ -434,7 +434,7 @@ Que se ha estado cocinando ✨ Registro de Cambios para %1$s esa versión - Unete al servidor de Revolt para dar una opinion o sugerencia y reportar bugs. + Unete al servidor de Peptide para dar una opinion o sugerencia y reportar bugs. Nuevo Grupo Crear un nuevo grupo Crear @@ -476,7 +476,7 @@ Webhook Registro de cambios Proporcionar comentarios - Revolt nunca duerme, echa un vistazo para ver lo que está en proceso + Peptide nunca duerme, echa un vistazo para ver lo que está en proceso Cambia tu apariencia, administra tu cuenta y más Compartir perfil Por favor, inténtelo de nuevo más tarde. @@ -560,15 +560,15 @@ ¡Bienvenido al acceso anticipado! 🚀 Eres uno de los primeros en probar nuestra nueva aplicación para Android. ¡Estamos encantados de tenerte aquí! ¡Nos encanta recibir comentarios! - Si tienes algún comentario, sugerencia o informe de errores, háznoslo saber. Siempre buscamos mejorar Revolt. + Si tienes algún comentario, sugerencia o informe de errores, háznoslo saber. Siempre buscamos mejorar Peptide. Calificar en Google Play Unirse al servidor de Testers Terminado Hint - Algunas de las configuraciones de Revolt están dañadas. Esto puede deberse al uso de clientes de terceros. Las configuraciones afectadas son: + Algunas de las configuraciones de Peptide están dañadas. Esto puede deberse al uso de clientes de terceros. Las configuraciones afectadas son: Notificaciones Pedido de servidores - Revolt para Android + Peptide para Android %1$s (desconocido) Restablecer %1$s configuraciones Mensajería @@ -583,9 +583,9 @@ Es posible que hayas cerrado sesión en otro dispositivo o que tu conexión a Internet no funcione. Finalizar la sesión ¿Utiliza un teclado? - ¡Revolt tiene atajos de teclado! Pulsa %1$s para verlos. + ¡Peptide tiene atajos de teclado! Pulsa %1$s para verlos. De acuerdo - Dado que se trata de un acceso anticipado, es posible que las cosas aún no sean perfectas. Puede que te encuentres con algún error, fallo o peculiaridad. Tus comentarios nos ayudarán a limar asperezas y a mejorar Revolt. + Dado que se trata de un acceso anticipado, es posible que las cosas aún no sean perfectas. Puede que te encuentres con algún error, fallo o peculiaridad. Tus comentarios nos ayudarán a limar asperezas y a mejorar Peptide. Estamos encantados de tenerte a bordo. ¡Hagamos algo grande juntos! Entendido [fragmento de %1$s] diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index a6a73c2d..361c2163 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -466,7 +466,7 @@ از سایر نشست ها خارج شوید این دستگاه وارد خواهد ماند. تم - ریولت + ریولت روشن مشکی خالص Material You (پشتیبانی نشده) diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 5324574c..1a1747f5 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -13,8 +13,8 @@ Lähetä vahvistussähköposti uudelleen Käytätkö salasanojen hallintasovellusta\? Unohditko salasanasi\? - Tervetuloa Revoltiin - Käytä Revoltia muiden kanssa keskustelemiseen. + Tervetuloa Peptideiin + Käytä Peptideia muiden kanssa keskustelemiseen. Sähköposti Salasana Katso sähköpostisi! @@ -123,7 +123,7 @@ Haetaan tietoa, odota hetki… Tietosuojakäytäntö Löydä yhteisösi, liity maailman kanssa. - Revolt on yksi parhaimmista tavoista pysyä yhteydessä kavereidesi ja yhteisösi kanssa, missä vain, milloin vain. + Peptide on yksi parhaimmista tavoista pysyä yhteydessä kavereidesi ja yhteisösi kanssa, missä vain, milloin vain. Kirjaudutaan sinut sisään Laita sähköpostisi tähän, ja me laitamme sinulle ohjeen salasanan vaihtamiseen. Tietosi ovat turvassa meidän kanssa. Me emme myy niitä, ja me emme myöskään käytä niitä mainostukseen. @@ -180,7 +180,7 @@ Muu Mitä tahansa lisätietoa joka saattaa auttaa meitä tutkimisessa. Vapaaehtoinen. Lähetä - Kiitoksia että pidät Revoltin turvallisena. Me katsomme raporttisi läpi mahdollisimman pian. + Kiitoksia että pidät Peptidein turvallisena. Me katsomme raporttisi läpi mahdollisimman pian. Raporttisi lähettämisessä tapahtui virhe. Yritä myöhemmin uudelleen. Sinut on kutsuttu liittymään tälle palvelimelle. Haluaisitko liittyä\? Olet jo osana tätä palvelinta. @@ -211,7 +211,7 @@ Sekalaista Ulkoasu Teema - Revolt + Peptide Vaalea Material You -teema Material You -teemaa ei tueta tällä laitteella. @@ -221,14 +221,14 @@ Viimeksi päivitetty: %1$s Sinulla ei ole oikeuksia lähettää viestejä tähän kanavaan. Älä häiritse - Revolt Androidilla + Peptide Androidilla Versio Valitse emoji Eläimet & Luonto Aktiviteetit Symbolit Liput - Revolt tiimin jäsen + Peptide tiimin jäsen Ystävät Et voi lähettää viestejä tässä kanavassa. Paikalla diff --git a/app/src/main/res/values-fil/strings.xml b/app/src/main/res/values-fil/strings.xml index c087d65d..687cfd68 100644 --- a/app/src/main/res/values-fil/strings.xml +++ b/app/src/main/res/values-fil/strings.xml @@ -12,8 +12,8 @@ Magpadala ng email Ipadala muli ang verification email Gumamit ng password manager\? - Maligayang pagdating sa Revolt - Gamitin ang Revolt para mag-chat tungkol sa iba\'t ibang bagay. + Maligayang pagdating sa Peptide + Gamitin ang Peptide para mag-chat tungkol sa iba\'t ibang bagay. I-set up ka na natin. Password Suriin ang iyong mail! @@ -68,7 +68,7 @@ Ibahagi Kumukuha ng mga impormasyon, maghintay lamang… Hanapin ang iyong komunidad, kumonekta sa buong mundo. - Ang Revolt ay isa sa mga pinakamahusay na paraan upang manatiling konektado sa iyong mga kaibigan at komunidad, kahit saan, anumang oras. + Ang Peptide ay isa sa mga pinakamahusay na paraan upang manatiling konektado sa iyong mga kaibigan at komunidad, kahit saan, anumang oras. Mag-login Nakalimutan ang password\? Nakalimutan ang password\? @@ -106,7 +106,7 @@ I-log in na kita Email Mag-reply - Revolt + Peptide Mga Opsyon Description ng Channel Mga Opsyon @@ -205,7 +205,7 @@ Salamat sa paglalaan ng oras upang iulat ang user na ito. Hindi ibabahagi ang iyong ulat sa user o sa mga moderator ng server. Hindi naaangkop na nilalaman (tulad ng NSFW) Anumang karagdagang impormasyon na maaaring makatulong sa amin sa aming pagsisiyasat. Opsyonal. - Salamat sa pagtulong na panatilihing ligtas ang Revolt. Susuriin namin ang iyong ulat sa lalong madaling panahon. + Salamat sa pagtulong na panatilihing ligtas ang Peptide. Susuriin namin ang iyong ulat sa lalong madaling panahon. Inimbitahan kang sumali sa server na ito. Gusto mo bang sumali\? Walang tinukoy na code ng imbitasyon. Ipinagbawal ka sa server na ito. @@ -221,11 +221,11 @@ On Background Tinanggal ang user Nagpapasalamat kami sa mga nag-develop ng mga proyektong ito sa paggawa ng kanilang mga gawa available sa buong mundo. - Ang Revolt ay binuo sa tulong ng mga kahanga-hangang open-source na proyektong ito. + Ang Peptide ay binuo sa tulong ng mga kahanga-hangang open-source na proyektong ito. Umalis ang user Sumali ang user - Revolt sa Android - Ibinahagi sa iyo na may ❤️ ng koponan ng Revolt. + Peptide sa Android + Ibinahagi sa iyo na may ❤️ ng koponan ng Peptide. Bersyon Mga detalye Ang listahan sa ibaba ay awtomatikong nabuo. Maaaring ito ay hindi kumpleto o hindi tumpak. @@ -241,7 +241,7 @@ Mga Bagay Mga Symbol Mga Bandila - Miyembro ng koponan ng Revolt + Miyembro ng koponan ng Peptide Mga kaibigan Mga Papasok na Kahilingan Mga Papalabas na Kahilingan @@ -276,7 +276,7 @@ Hindi ka magkakaroon ng mga abiso, kasama ang mga mensahe at @mention. Offline Invisible - Magagamit mo pa rin ang Revolt gaya ng dati, pero hindi ka lalabas ng online sa ibang tao. + Magagamit mo pa rin ang Peptide gaya ng dati, pero hindi ka lalabas ng online sa ibang tao. Opisyal na Server Naka-verify na Server Hindi mo maaring tignan ang channel @@ -369,7 +369,7 @@ Deskubrehin Hindi hinihingi na pag-advertise o pag-spam Mga override sa kulay - Deskubrehin ang Revolt + Deskubrehin ang Peptide Sabihin sa amin kung ano ang problema sa user na ito Sabihin sa amin kung ano ang problema sa server na ito Sabihin sa amin kung ano ang problema sa mensahe na ito @@ -410,10 +410,10 @@ Kopyahin Isara Ibahagi ang link na ito para imbitahan ang mga tao sa channel na ito. - Ibahagi sa Revolt - Paki-log in bago magbahagi sa Revolt. + Ibahagi sa Peptide + Paki-log in bago magbahagi sa Peptide. Hindi ito isang wastong share intent. - Masyadong malaki ang attachment na ito para sa Revolt (max. $1$s). + Masyadong malaki ang attachment na ito para sa Peptide (max. $1$s). Maghanap ng mga channel pumili ng channel na pagbabahagian. Minarkahang NSFW ang channel na ito @@ -456,7 +456,7 @@ Ito ay isang bot. Ito ay isang bot. Meron siyang plano. Gumawa - Sumali sa server ng Revolt upang makapagbigay ng puna at mag-ulat ng mga bug. + Sumali sa server ng Peptide upang makapagbigay ng puna at mag-ulat ng mga bug. Hinay-hinay lang! Madalas mong ginagawa yan sa maikling panahon. Isara Pagsama-samahin ang iyong kasama sa isang panggrupong chat. Pwede kang mag dagdag ng hanggang %1$d tao. @@ -535,22 +535,22 @@ Kami ay nasasabik na nakasakay ka. Magkasama tayong gumawa ng isang magandang bagay! Nakuha ko Gustung-gusto namin ang feedback! - Kung ikaw ay mayroong anumang puna, mungkahi, o ulat ng bug, mangyaring ipaalam sa amin. Palagi kaming naghahanap upang mapabuti ang Revolt. + Kung ikaw ay mayroong anumang puna, mungkahi, o ulat ng bug, mangyaring ipaalam sa amin. Palagi kaming naghahanap upang mapabuti ang Peptide. I-rate sa Google Play Sumali sa Testers Server Tapos na Pahiwatig - Mukhang sira ang ilan sa iyong mga setting ng Revolt. Maari itong sanhi ng paggamit ng mga third-party na client. Ang mga nakaapektong setting ay: + Mukhang sira ang ilan sa iyong mga setting ng Peptide. Maari itong sanhi ng paggamit ng mga third-party na client. Ang mga nakaapektong setting ay: Mga Abiso Pagaayos ng Server - Revolt para sa Android + Peptide para sa Android %1$s (hindi alam) I-reset ang %1$s mga setting Bagong Linya Itago ang password Ipakita ang password Nagkaroon ng error habang binabahagi ang iyong user card. - Dahil ito ay maagang pag-access, hindi perpekto ang ilang mga bagay sa ngayon. Maaari kang makaranas ng paminsan-minsang bug, pag-crash, o kakaibang quirk. Ang iyong feedback ay tumutulong sa amin na pakinisin ang mga magaspang na gilid at gawing mas mahusay ang Revolt. + Dahil ito ay maagang pag-access, hindi perpekto ang ilang mga bagay sa ngayon. Maaari kang makaranas ng paminsan-minsang bug, pag-crash, o kakaibang quirk. Ang iyong feedback ay tumutulong sa amin na pakinisin ang mga magaspang na gilid at gawing mas mahusay ang Peptide. Maligayang Pagdating sa Maagang Pag-access! 🚀 Isa ka sa mga unang sumubok ng aming bagong Android app. Nasasabik kaming makasama ka rito! Nagkaroon ng problema habang naglo-log in @@ -566,13 +566,13 @@ Ibahagi ang Profile Tignan ang iyong user card at magkaroon ng espesyal na link na ibabahagi Log ng mga binago - Hindi natutulog ang Revolt, tingnan kung ano mga ginagawa + Hindi natutulog ang Peptide, tingnan kung ano mga ginagawa Magbigay ng Puna May gustong sabihin? Kami ay nakikinig I-tap para kopyahin %1$d.Username %1$d.Pangalan - %1$d.Nasa Revolt Noong + %1$d.Nasa Peptide Noong %1$d.QR Code %1$d.Larawan [%1$s na snippet] @@ -583,7 +583,7 @@ Status %1$d° Gumagamit ng keyboard? - May mga keyboard shortcut ang Revolt! Pindutin ang %1$s para makita sila. + May mga keyboard shortcut ang Peptide! Pindutin ang %1$s para makita sila. Buksan ang mga shortcut Sige Wika diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 329d0a91..75a54097 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -32,7 +32,7 @@ Toutes informations supplémentaires susceptibles de nous aider dans notre enquête. Optionnel. Signalement… Signalé avec succès - Merci de nous aider à maintenir Revolt en sécurité. Nous examinerons votre rapport dès que possible. + Merci de nous aider à maintenir Peptide en sécurité. Nous examinerons votre rapport dès que possible. %1$s Partager l\'audio Messages directs @@ -124,8 +124,8 @@ Système Noir pur Material You n\'est pas pris en charge sur cet appareil. - Revolt - Utilisez Revolt pour discuter de tout et de rien. + Peptide + Utilisez Peptide pour discuter de tout et de rien. Ouvrir l\'application de messagerie Vous avez activé la fonction 2FA pour que votre compte soit encore plus sûr. Utiliser un mot de passe à usage unique @@ -203,13 +203,13 @@ Vous êtes banni de ce serveur. Une erreur inconnue s\'est produite. Mot de passe oublié \? - Bienvenue sur Revolt + Bienvenue sur Peptide S\'inscrire Connectez-vous E-mail Saisissez votre adresse e-mail et nous vous enverrons des instructions sur la manière de réinitialiser votre mot de passe. Se connecter - Revolt est l\'un des meilleurs moyens de rester en contact avec vos amis et votre communauté, partout et à tout moment. + Peptide est l\'un des meilleurs moyens de rester en contact avec vos amis et votre communauté, partout et à tout moment. Renvoyer Envoyer un e-mail Renvoyer un e-mail de vérification @@ -219,9 +219,9 @@ Vous avez oublié votre mot de passe \? cette version Contour - Revolt est construit avec l\'aide de ces formidables projets open source. - Revolt sur Android - "Présenté avec ❤️ par l\'équipe Revolt." + Peptide est construit avec l\'aide de ces formidables projets open source. + Peptide sur Android + "Présenté avec ❤️ par l\'équipe Peptide." Version Détails Dernière mise à jour : %1$s @@ -231,7 +231,7 @@ Activités Objets Symboles - Membre de l’équipe Revolt + Membre de l’équipe Peptide Bloqués Erreur Surface @@ -305,7 +305,7 @@ Vous ne recevrez aucune notification, y compris pour les messages et les @mentions. Hors ligne Invisible - Vous pourrez utiliser Revolt comme d\'habitude, mais vous n\'apparaîtrez pas en ligne pour les autres utilisateurs. + Vous pourrez utiliser Peptide comme d\'habitude, mais vous n\'apparaîtrez pas en ligne pour les autres utilisateurs. Serveur officiel Serveur vérifié Vous ne pouvez pas voir ce salon @@ -362,7 +362,7 @@ Copie Fermer Fondateur - Rejoins le Serveur Revolt pour nous donnez votre avis et signaler des bugs. + Rejoins le Serveur Peptide pour nous donnez votre avis et signaler des bugs. Supprimer le message \? Garder Violence extrême, sang ou violences animales @@ -390,12 +390,12 @@ Teinture de la Surface Surface Inversée Inversé sur la Surface - Découvrir Revolt - Cette pièce-jointe est trop large pour Revolt (max. $1$s). + Découvrir Peptide + Cette pièce-jointe est trop large pour Peptide (max. $1$s). Rechercher des salons M de sélectionner un salon où partager. - Partager sur Revolt - Merci de vous connecter avant de partager sur Revolt. + Partager sur Peptide + Merci de vous connecter avant de partager sur Peptide. Ce salon contient du Contenu Explicite Vous devez avoir 18 ans ou plus pour voir ce salon. Date de naissance @@ -546,7 +546,7 @@ Vous avez quelque chose à dire \? Nous sommes tous ouïes Jetez un œil à votre carte d\'utilisateur et obtenez un lien spécial à partager Journal des modifications - Revolt ne dort jamais, jetez un oeil pour voir ce qui se prépare + Peptide ne dort jamais, jetez un oeil pour voir ce qui se prépare Masquer le mot de passe Montrer le mot de passe Langage @@ -555,7 +555,7 @@ Une erreur s\'est produite lors du partage de votre carte utilisateur. %1$d.Nom %1$d.Nom d\'utilisateur - %1$d.Sur Revolt depuis + %1$d.Sur Peptide depuis %1$d.QR Code Vous avez trouvé un Webhook ! En aprendre plus @@ -573,7 +573,7 @@ Se déconnecter [%1$s extrait] Vous utilisez un clavier ? - Revolt a des raccourcis clavier ! Appuyez sur %1$s pour les voir. + Peptide a des raccourcis clavier ! Appuyez sur %1$s pour les voir. Ouvrir les raccourcis D\'accord Nouvelle Ligne diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index 1be71244..9c2e9721 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -17,23 +17,23 @@ Esqueciches o teu contrasinal? Reenviar un correo electrónico de verificación Usas un xestor de contrasinais\? - Dámoste a benvida a Revolt + Dámoste a benvida a Peptide É como un lugar para pasar o rato, reunirse e falar. O mellor de todo é que está en internet. Seguinte → Política de Privacidade Busca a túa comunidade, conecta co mundo. - Revolt é unha das mellores formas de estar conectado cos teus amigos e comunidade, en calquera lugar e en calquera momento. + Peptide é unha das mellores formas de estar conectado cos teus amigos e comunidade, en calquera lugar e en calquera momento. Imos iniciar sesión Esqueciches o teu contrasinal\? Introduce o teu correo electrónico e enviarémosche instrucións para restablecer o teu contrasinal. - Usa Revolt para manter conversacións. + Usa Peptide para manter conversacións. Imos configurar todo. Enviarémosche un correo de verificación para confirmar a túa conta. Código Contrasinal Verifica o teu correo electrónico, despois elixiremos o nome de usuario. Pechouse a sesión. Inicia sesión de novo. - Traído con ❤️ polo equipo de Revolt. + Traído con ❤️ polo equipo de Peptide. Usa un contrasinal de un só uso Escribe un dos teus códigos de recuperación. Escribe o teu contrasinal @@ -62,12 +62,12 @@ Código Escribe un código de recuperación Escribe o teu contrasinal para continuar. - Revolt en Android + Peptide en Android Sobre nós Versión Detalles Atribución de código aberto - Revolt está feito coa axuda destes marabillosos proxectos de código aberto. + Peptide está feito coa axuda destes marabillosos proxectos de código aberto. A lista de embaixo xerouse automaticamente. Pode estar incompleta ou ter erros. Última actualización: %1$s Toca para ver a licenza diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index f093a6de..bb1128da 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -35,7 +35,7 @@ Podijeli sliku Tema Sistem - Revolt + Peptide Povratne informacije Vrijeme je da izabereš korisničko ime! Oprosti, ova značajka nije još spremna. @@ -87,7 +87,7 @@ Drugo Dodatne informacije Sve dodatne informacije koje bi mogle pomoći našoj istrazi. Neobavezno. - Hvala za pomoći da držimo Revolt sigurnim. Pogledati ćemo vašu prijavu u najbržem mogućem roku. + Hvala za pomoći da držimo Peptide sigurnim. Pogledati ćemo vašu prijavu u najbržem mogućem roku. Greška Zatvori Blokiraj @@ -130,7 +130,7 @@ Uvjeti pružanja usluge Polica privatnosti Pronađi svoju zajednicu, spoji se sa svijetom. - Revolt je jedan od najboljih načina da ostaneš u kontaktu sa svojim prijateljima i svojom zajednicom, bilo gdje, bilo kad. + Peptide je jedan od najboljih načina da ostaneš u kontaktu sa svojim prijateljima i svojom zajednicom, bilo gdje, bilo kad. E-pošta Lozinka Prijava @@ -146,8 +146,8 @@ Ponovo pošalji verifikacijsku e-poštu Zaboravili ste lozinku\? Unesite svoju e-poštu i poslati ćemo vam upute kako resetirati svoju lozinku. - Dobrodošli na Revolt - Koristite Revolt da razgovarate o stvarima. + Dobrodošli na Peptide + Koristite Peptide da razgovarate o stvarima. Vaši podatci su sigurni sa nama. Ne prodajemo ih, niti ih koristimo da bi vam prikazali oglase. E-pošta Poslati će mo vam verifikacijsku e-poštu da bi potvrdili vaš račun. diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 93dd663a..a9e2e483 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -8,7 +8,7 @@ Szolgáltatási feltételek Adatvédelmi szabályzat Közösségi aranyszabályok - A Revolt az egyik legjobb módja annak, hogy bárhol, bármikor tudd tartani a közösségeddel, ismerőseiddel a kapcsolatot. + A Peptide az egyik legjobb módja annak, hogy bárhol, bármikor tudd tartani a közösségeddel, ismerőseiddel a kapcsolatot. E-mail Jelszó Bejelentkezés @@ -18,8 +18,8 @@ Visszaigazoló e-mail újraküldése Használsz jelszókezelőt\? Nem emlékszel a jelszavadra\? - Üdvözöl a Revolt - A dolgaid megbeszéléséhez gyere a Revoltra. + Üdvözöl a Peptide + A dolgaid megbeszéléséhez gyere a Peptidera. Állítsuk be a dolgaidat! Regisztrálás Az adataidat biztonságban tudhatod nálunk. Nem adjuk el és nem használjuk fel, hogy reklámokat mutogassunk neked. @@ -43,9 +43,9 @@ Kód Add meg az egyik helyreállító kódod Kód - A Revolt-jelszavad helye - A folytatáshoz add meg a Revolt-jelszavad - A Revoltról + A Peptide-jelszavad helye + A folytatáshoz add meg a Peptide-jelszavad + A Peptideról Sajnáljuk, de ez a lehetőség még nem áll készen a használatra. %1$s éppen gépel… %1$s éppen gépelnek… @@ -177,7 +177,7 @@ Különféleségek Színséma Rendszer - Revolt + Peptide Világos Tisztán fekete Visszajelzés @@ -187,7 +187,7 @@ Találj rá a közösségedre, lépj kapcsolatba a világgal! Nem emlékszel a jelszavadra\? Miután megadtad az e-mail-címed, levelet küldünk a jelszó megváltoztatásának mikéntjéről. - A Revolt olyan hely, ahol össze tudtok jönni, meg tudjátok beszélni a dolgaitokat. A legjobb ebben az, hogy mindezt az Interneten lógva tudjátok csinálni. + A Peptide olyan hely, ahol össze tudtok jönni, meg tudjátok beszélni a dolgaitokat. A legjobb ebben az, hogy mindezt az Interneten lógva tudjátok csinálni. Ha meggondolnád magad, később a felhasználónevedet a beállításokban bármikor megváltoztathatod. A Material You-t nem támogatja a készüléked. Álljon nyolcból, vagy többől. A gyakoriak nem jók. Ajánlott szimbólumokat és számokat használni. @@ -212,7 +212,7 @@ Spam vagy egyéb visszaélés a platformmal Nem helyénvaló tartalom (például NSFW) Kiegészítő információ - Köszönjük, amiért segíted megőrizni a Revolt biztonságát. Amint lehetséges, felülvizsgáljuk jelentésed. + Köszönjük, amiért segíted megőrizni a Peptide biztonságát. Amint lehetséges, felülvizsgáljuk jelentésed. Meghívtak erre a szerverre. Csatlakozol\? Nem ismert hiba történt Hang megosztása @@ -224,13 +224,13 @@ Visszavonom a jelölést Egyéni háttér Aktív elsődleges - A Revoltot ezeknek a remek, nyílt foráskódú projekteknek köszönhetően készítettük el. + A Peptideot ezeknek a remek, nyílt foráskódú projekteknek köszönhetően készítettük el. Hálásak vagyunk a fejlesztőiknek, hogy elérhetővé tették munkájukat a világ számára. Az alábbi listát automatikusan hozták létre, ezért hiányos vagy pontatlan lehet. Legutóbb frissítve: %1$s Koppints a licenchez - Androidos Revolt - ❤️-tel készítette el Neked a Revolt csapata. + Androidos Peptide + ❤️-tel készítette el Neked a Peptide csapata. Verzió Részletek Válassz emodzsit @@ -242,7 +242,7 @@ Jelképek Zászlók Platformmoderáció - Revolt-csapattag + Peptide-csapattag Csatlakozz a Jenvolthoz Ismerősök Ismerősnek jelölt meg @@ -373,7 +373,7 @@ A Jenvolt a fejlesztők által vitt, androidos appal és minden mással kapcsolatos hely. Itt kérhetsz segítséget és jelezhetsz vissza nekünk. Lehet, új feature-öket is kipróbálhatsz majd! 👀 Ez egy bizalmas csatorna, ahonnan a moderáló csapatunk küld értesítéseket. Ide nem tudsz üzenetet írni. Nem kapsz értesítéseket az üzenetekről, viszont az @említésekről szólóakat megkapod. - Szokás szerint használhatod a Revoltot, viszont a többiek offlineként fognak Téged látni. + Szokás szerint használhatod a Peptideot, viszont a többiek offlineként fognak Téged látni. Végleg elhagyod ezt a helyet\? „%1$s” Vagy már törölték a tagot, vagy pedig nincs engedélyed őt megtekinteni. Közepesen sötét bőrszín @@ -382,7 +382,7 @@ A felület fordítottja Hibás ez a színsémát felülíró fájl. Fedezd fel - Fedezd fel a Revoltot + Fedezd fel a Peptideot Oszd meg velünk, mi baj van ezzel a szerverrel Oszd meg velünk, mi baj van ezzel az üzenettel Oszd meg velünk, mi baj van ezzel a taggal @@ -412,11 +412,11 @@ Bezár #%1$s meghívója Csatonák keresése - Jelentkezz be, mielőtt megosztanád a Revolton! + Jelentkezz be, mielőtt megosztanád a Peptideon! Válaszd ki, hova szeretnéd megosztani! - Megosztás a Revolton + Megosztás a Peptideon Nem oszthatsz meg érvénytelen „intentet” - A Revolttal legfeljebb $1$s méretű csatolmányt tudsz megosztani + A Peptidetal legfeljebb $1$s méretű csatolmányt tudsz megosztani Ez a csatorna NSFW-ként van jelölve 18 évnél idősebbnek kell lenned a csatorna megtekintéséhez. Születési időd @@ -434,7 +434,7 @@ Örökre el fog veszni (ami sok idő)! Törlés Mégsem törlöm - Csatlakozz a Revolt szerveréhez – itt jelezhetsz vissza nekünk és tudsz minket elérni, jelentheted a hibákat. + Csatlakozz a Peptide szerveréhez – itt jelezhetsz vissza nekünk és tudsz minket elérni, jelentheted a hibákat. Új csoport Szedd össze a csapatodat csoportos chatbe. Legfeljebb %1$d személyt adhatsz hozzá. Ez egy Robi 🤖 diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index 387b02fa..658667b5 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -5,7 +5,7 @@ Kami akan mengirimkan email verifikasi untuk mengonfirmasi akunmu. ← Kembali Ketentuan Layanan - Revolt adalah salah satu cara terbaik untuk tetap terhubung dengan teman dan komunitas, di mana saja dan kapan saja. + Peptide adalah salah satu cara terbaik untuk tetap terhubung dengan teman dan komunitas, di mana saja dan kapan saja. Masukkan email-mu dan kami akan mengirimkan instruksi mengatur ulang sandimu. Seperti tempat nongkrong, berkumpul dan mengobrol. Hal kerennya, tempatnya di internet. Verifikasi email-mu, kemudian kita bisa pilih nama penggunamu. @@ -17,10 +17,10 @@ Daftar Kirim Ulang Lupa sandimu\? - Selamat datang di Revolt + Selamat datang di Peptide Memuat sejumlah informasi, tunggu sebentar… OK - Gunakan Revolt untuk mengobrol. + Gunakan Peptide untuk mengobrol. Sandi Kebijakan Privasi Data kamu aman di kami. Kami tidak menjualnya atau menggunakannya untuk menampilkan iklan. @@ -137,7 +137,7 @@ Informasi tambahan Kirim Melaporkan… - Terima kasih telah menjaga Revolt tetap aman. Kami akan meninjau laporanmu segera. + Terima kasih telah menjaga Peptide tetap aman. Kami akan meninjau laporanmu segera. Kesalahan Terjadi kesalahan ketika mengirimkan laporanmu. Silakan coba lagi nanti. Apa kamu ingin memblokir pengguna ini\? @@ -180,7 +180,7 @@ Tampilan Tema Sistem - Revolt + Peptide Cerah Material You Material You (tidak didukung) @@ -210,8 +210,8 @@ Terakhir diperbarui: %1$s Ketuk untuk melihat lisensi Mari kita siapkan. - Revolt untuk Android - Dipersembahkan dengan ❤️ oleh tim Revolt. + Peptide untuk Android + Dipersembahkan dengan ❤️ oleh tim Peptide. Versi Pilih emoji Hewan & Alam @@ -220,7 +220,7 @@ Objek Simbol Bendera - Anggota tim Revolt + Anggota tim Peptide Gabung ke Jenvolt Teman Diblokir @@ -281,7 +281,7 @@ Rincian Emosi Kamu harus berusia setidaknya 18 tahun untuk melihat saluran ini. - Revolt dibuat dengan bantuan dari proyek sumber terbuka yang luar biasa ini. + Peptide dibuat dengan bantuan dari proyek sumber terbuka yang luar biasa ini. Kami berterima kasih kepada pengembang proyek ini atas pekerjaannya. Daftar di bawah dihasilkan secara otomatis. Mungkin tidak lengkap atau akurat. Semua @@ -307,7 +307,7 @@ Tambah anggota Kamu tidak akan menerima notifikasi, termasuk pesan dan @sebutan. Kamu tidak akan menerima notifikasi pesan, namun kamu akan menerima notifikasi @sebutan. - Kamu bisa menggunakan Revolt seperti biasa, namun kamu tidak akan terlihat daring oleh orang lain. + Kamu bisa menggunakan Peptide seperti biasa, namun kamu tidak akan terlihat daring oleh orang lain. Luring Emoji bawaan yang bisa digunakan di mana saja Grup Baru diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 4906a0cf..c4f868cf 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -13,15 +13,15 @@ Codice Codice Inserisci la tua password per continuare. - Revolt su Android + Peptide su Android Versione - Revolt è stato sviluppato con l\'aiuto di questi fantastici progetti open-source. + Peptide è stato sviluppato con l\'aiuto di questi fantastici progetti open-source. Ci dispiace, ma questa funzione non è ancora pronta. Diverse persone stanno scrivendo Rimuovi risposta Persone e Corpo Oggetti - Membro del team Revolt + Membro del team Peptide Richieste in uscita Aggiungi server Non puoi essere nato nel futuro, da quando esistono le macchine del tempo\? @@ -158,8 +158,8 @@ Hai dimenticato la password\? Reinvia una email di verifica Stai usando un gestore per le password\? - Benvenuto/a su Revolt - Usa Revolt per chattare. + Benvenuto/a su Peptide + Usa Peptide per chattare. È tipo un posto dove incontrarsi, stare assieme e parlare di qualcosa, ma su internet. Facciamoti sistemare. I tuoi dati sono al sicuro qui. Non li venderemo e nemmeno noi li useremo per mostrarti pubblicità. @@ -182,7 +182,7 @@ Inserisci uno dei tuoi codici di recupero. Inserisci la tua password A riguardo - Portato fino a te con ❤️ dal team di Revolt. + Portato fino a te con ❤️ dal team di Peptide. Dettagli Attribuzioni Open Source Siamo grati agli sviluppatori di questi progetti per aver reso il loro lavoro disponibile al mondo. @@ -191,7 +191,7 @@ Inserisci la tua email e ti invieremo le istruzioni su come resettare la tua password. ← Indietro Trova la tua community, connettiti con il mondo. - Revolt è uno dei migliori modi per restare connesso con i tuoi amici e community, sempre ed ovunque. + Peptide è uno dei migliori modi per restare connesso con i tuoi amici e community, sempre ed ovunque. Registrati Facciamo l\'accesso Email @@ -274,7 +274,7 @@ Non Disturbare Non riceverai nessun messaggio, manco le @menzioni. Invisibile - Potrai usare Revolt come al solito, ma non apparirai online alle altre persone. + Potrai usare Peptide come al solito, ma non apparirai online alle altre persone. Non sei connesso/a ad internet. Per favore, controlla la tua connessione e riprova. Copia Server Verificato @@ -304,7 +304,7 @@ Inserisci un link tipo \"rvlt.gg/Testers\" o un codice invito come \"Testers\" Partecipa Crea un nuovo server - Scopri Revolt + Scopri Peptide Annulla Grazie per aver dedicato tempo per segnalare questo messaggio. La tua segnalazione non verrà condivisa con l\'utente che ha inviato il messaggio e non verrà ricevuta nemmeno dai moderatori del server. Nota: Questo messaggio può essere stato inviato da un\'altra piattaforma. È raccomandata la segnalazione anche sulla piattaforma sulla quale è stato inviato. @@ -332,7 +332,7 @@ Qualsiasi informazione aggiuntiva che possa aiutarci nella nostra indagine (opzionale). Invia Segnalato! - Grazie per aiutarci a tenere Revolt un posto sicuro. Guarderemo la tua segnalazione il prima possibile. + Grazie per aiutarci a tenere Peptide un posto sicuro. Guarderemo la tua segnalazione il prima possibile. Ci dispiace, ma c\'è stato un errore durante la segnalazione. Per favore, riprova. Vorresti anche bloccare questo utente\? No, non bloccarlo @@ -382,7 +382,7 @@ Esci Aspetto Tema - Revolt + Peptide No, non uscire Sistema Chiaro @@ -428,13 +428,13 @@ Cerca canali Lista dei cambiamenti Cosa sta bollendo in pentola ✨ - Questo allegato è troppo grande per Revolt (massimo $1$s). + Questo allegato è troppo grande per Peptide (massimo $1$s). Lista dei cambiamenti per %1$s quella versione - Condividi su Revolt - Per favore effettua l\'accesso prima di condividere su Revolt. + Condividi su Peptide + Per favore effettua l\'accesso prima di condividere su Peptide. Questa non è una funzione valida per la condivisione. - Entra nel server di Revolt per dare dei feedback, dei suggerimenti o dei bug report. + Entra nel server di Peptide per dare dei feedback, dei suggerimenti o dei bug report. Crea un nuovo gruppo Raduna il tuo gruppo in una sola chat. Puoi aggiungere fino a %1$d persone. Questo è un bot. @@ -496,7 +496,7 @@ Condividi Profilo Dai un\'occhiata al tuo profilo e ricevi un link speciale per condividerlo Registro modifiche - Revolt non dorme mai, dai un\'occhiata per vedere i cambiamenti + Peptide non dorme mai, dai un\'occhiata per vedere i cambiamenti Dacci un Feedback Hai da dire qualcosa\? Siamo tutto orecchie! Annulla modifiche @@ -538,7 +538,7 @@ Usa %1$d.Nome %1$d.Nome Utente - %1$d. Su Revolt Da + %1$d. Su Peptide Da %1$d.QR Code %1$d.Foto Testo Normale diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 90864ad0..7099d58f 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -19,8 +19,8 @@ ログインしましょう パスワードをお忘れですか? パスワードマネージャーを使用していますか? - Revoltへようこそ - Revoltを使って物事について話す。 + Peptideへようこそ + Peptideを使って物事について話す。 設定しましょう。 私たちはあなたの情報を守ります。あなたの情報を販売したり、広告を表示するために使用することはありません。 パスワード @@ -193,7 +193,7 @@ プラットフォームを使うための対象年齢未満のユーザー 調査に役立つ追加情報。オプション。 エラー - Revoltを安全に保つために手助けしていただきありがとうございます。できるだけ早くあなたのレポートを見直します。 + Peptideを安全に保つために手助けしていただきありがとうございます。できるだけ早くあなたのレポートを見直します。 このユーザーをブロックしますか? ブロック あなたはこのサーバーに招待されました。参加しますか? @@ -208,13 +208,13 @@ 画像の保存に失敗しました URLを共有 外観 - Revolt + Peptide ライト ピュアブラック マテリアル ユー (未対応) マテリアル ユーはこのデバイスでサポートされていません。 レポートの送信中にエラーが発生しました。後でやり直してください。 - Revoltは、いつでもどこでも、友人やコミュニティとのつながりを維持するための最良の方法の1つです。 + Peptideは、いつでもどこでも、友人やコミュニティとのつながりを維持するための最良の方法の1つです。 たむろしたり、集まったり、話したりするための場所のようなものです。インターネット上にあることが素晴らしいです。 %1$sにさらなる指示を送りました。 パスワードを非表示 @@ -228,11 +228,11 @@ もう一度お試し下さい ログアウト バージョン - Revoltチームが❤️を込めてお届けします。 - Revoltは、これらの素晴らしいオープンソースプロジェクトの助けを借りて構築されています。 + Peptideチームが❤️を込めてお届けします。 + Peptideは、これらの素晴らしいオープンソースプロジェクトの助けを借りて構築されています。 シンボル JenvoltはAndroidアプリなどあらゆるものを扱う開発者が運営するスペースです。サポートやフィードバックはこちらです。新しい機能を試すことができるかもしれません! 👀 - Android版 Revolt + Android版 Peptide 詳細 以下のリストは自動生成されたものです。不完全または不正確な可能性があります。 最後のアップデート:%1$s @@ -249,7 +249,7 @@ オブジェクト プラットフォームのモデレーション - Revoltチームのメンバー + Peptideチームのメンバー ウェブフック Jenvoltに参加する 概要を読み込めませんでした diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 6aee22c1..5b52ab0b 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -10,7 +10,7 @@ Registruotis Siųsti el. laišką Pamiršote slaptažodį\? - Sveiki atvykę į Revolt + Sveiki atvykę į Peptide El. paštas Sveiki! Pirmyn → @@ -27,8 +27,8 @@ Norėdami pradėti, pasirinkite serverį iš kairės. Jei jaučiatės drąsiai, galite sukurti naują serverį. Iškilo problema jus prisijungiant Keliaukime - Revolt yra vienas geriausių būdų palaikyti ryšį su draugais ir bendruomene bet kur ir bet kada. - Revolt sukurta naudojant šiuos nuostabius atvirojo kodo projektus. + Peptide yra vienas geriausių būdų palaikyti ryšį su draugais ir bendruomene bet kur ir bet kada. + Peptide sukurta naudojant šiuos nuostabius atvirojo kodo projektus. Įvesti šešiaženklį kodą Įveskite slaptažodį Iš susieto kanalo @@ -37,7 +37,7 @@ Vienu metu galite atsakyti tik į %1$d pranešimus. Raskite savo bendruomenę, susisiekite su pasauliu. Jenvolt yra kūrėjų valdoma erdvė, skirta visiems Android programėlių ir daugiau. Parama ir atsiliepimai pateikiami čia. Galbūt galėsite išbandyti naujas funkcijas! 👀 - Revolt komandos narys + Peptide komandos narys Turite ką pasakyti? Jus išklausysime Išvalyti visus gaunamus prašymus Šiek tiek nepatogu. @@ -57,7 +57,7 @@ Pakartotinai išsiųsti patvirtinimo el. laišką Naudojate slaptažodžių tvarkyklę? Įveskite savo el. pašto adresą ir mes jums atsiųsime instrukcijas, kaip iš naujo nustatyti slaptažodį. - Naudokite „Revolt“ pokalbiams apie dalykus. + Naudokite „Peptide“ pokalbiams apie dalykus. Tai tarsi vieta, kur galima pabūti kartu, susitikti ir pasikalbėti apie įvairius dalykus. Geriausia, kad tai vyksta internete. Nustatykime jus. Jūsų duomenys pas mus yra saugūs. Mes jų neparduodame ir nenaudojame, kad rodytume jums reklamas. @@ -81,8 +81,8 @@ Kodas Norėdami tęsti, įveskite slaptažodį. Apie - Revolt ant Android - Su ❤️ pristato „Revolt“ komanda. + Peptide ant Android + Su ❤️ pristato „Peptide“ komanda. Versija Išsami informacija OSS priskyrimas @@ -122,13 +122,13 @@ Dalytis profiliu Pažvelkite į savo naudotojo kortelę ir gaukite specialią nuorodą, kuria galėsite dalytis Pakeitimų sąrašas - Revolt niekada nemiega, pažiūrėkite, kas buvo kuriama + Peptide niekada nemiega, pažiūrėkite, kas buvo kuriama Pateikite atsiliepimus Bakstelėkite , kad nukopijuotumėte Dalijantis naudotojo kortele įvyko klaida. %1$d.Vardas %1$d.Vartotojo vardas - %1$d.Ant Revolt nuo + %1$d.Ant Peptide nuo %1$d.QR kodas %1$d.Nuotrauka Draugai @@ -181,7 +181,7 @@ Šlamštas ar panašus piktnaudžiavimas platforma Nepavyksta surasti šio naudotojo Dėkojame, kad skyrėte laiko pranešti apie šį serverį. Jūsų pranešimas nebus perduotas serverio moderatoriams. - Dėkojame, kad padedate užtikrinti Revolt saugumą. Mes kuo greičiau peržiūrėsime jūsų pranešimą. + Dėkojame, kad padedate užtikrinti Peptide saugumą. Mes kuo greičiau peržiūrėsime jūsų pranešimą. Atidaryti nario nustatymus Dėkojame, kad skyrėte laiko pranešti apie šia žinutę. Jūsų pranešimas nebus perduotas nei žinutę siuntusiam naudotojui, nei serverio moderatoriams. Webhooks yra automatinės transliacijos iš kitų paslaugų internete. Jos negali atsakyti į pokalbį, bet vis tiek galite matyti, ką jos nori pasakyti. @@ -259,7 +259,7 @@ Negausite jokių pranešimų, įskaitant žinutes ir @ paminėjimus. Atsijungę Nematomi - Galėsite naudotis Revolt kaip įprastai, tačiau kitiems žmonėms atrodysite neprisijungę. + Galėsite naudotis Peptide kaip įprastai, tačiau kitiems žmonėms atrodysite neprisijungę. Nėra ryšio Bakstelėkite, kad bandytumėte dar kartą Nustatymai @@ -351,7 +351,7 @@ Sukurti naują serverį Sukurti naują serverį Ši funkcija šiuo metu kuriama. - Atraskite Revolt + Atraskite Peptide Pranešti Atšaukti Pasakykite, kas šiame pranešime yra negerai @@ -474,7 +474,7 @@ Įjungti pranešimus Ne dabar Naudojate klaviatūrą? - Revolt turi sparčiuosius klavišus! Paspauskite %1$s, kad juos pamatytumėte. + Peptide turi sparčiuosius klavišus! Paspauskite %1$s, kad juos pamatytumėte. Atidaryti sparčiuosius klavišus Gerai Peržiūrėti @@ -494,7 +494,7 @@ Išvaizda Tema Sistema - Revolt + Peptide Šviesi Grynai juoda Material You @@ -521,7 +521,7 @@ YouTube Apple Music Atsiliepimai - Prisijunkite prie Revolt serverio ir pateikite atsiliepimų ar pasiūlymų bei praneškite apie klaidas. + Prisijunkite prie Peptide serverio ir pateikite atsiliepimų ar pasiūlymų bei praneškite apie klaidas. Keitimų sąrašai Kas buvo ruošiama ✨ %1$s pakeitimų sąrašas @@ -568,10 +568,10 @@ Visi šio kanalo pranešimai ir nustatymai dings visiems laikams (ilgam!) Ištrinti Laikyti - Dalytis į Revolt - Prieš dalydamiesi su Revolt, prisijunkite. + Dalytis į Peptide + Prieš dalydamiesi su Peptide, prisijunkite. Tai nėra galiojantis dalinimo ketinimas. - Šis priedas yra per didelis Revolt (ne daugiau kaip $1$s). + Šis priedas yra per didelis Peptide (ne daugiau kaip $1$s). Ieškoti kanalų m pasirinkite kanalą, į kurį norite bendrinti. Pokalbiai diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml index f493246f..a5ba7530 100644 --- a/app/src/main/res/values-lv/strings.xml +++ b/app/src/main/res/values-lv/strings.xml @@ -15,7 +15,7 @@ Uzziniet vairāk Atlaist Aizmirsāt paroli\? - Izmantojiet Revolt, lai tērzētu par lietām. + Izmantojiet Peptide, lai tērzētu par lietām. Sāksim jūs iestatīšanu. E-pasts Mēs nosūtīsim jums verifikācijas e-pastu, lai apstiprinātu jūsu kontu. @@ -35,7 +35,7 @@ Kods Ievadiet savu paroli Par - Ar ❤️ jums atnesa Revolt komanda. + Ar ❤️ jums atnesa Peptide komanda. Versija Sīkāka informācija OSS attiecinājums @@ -58,7 +58,7 @@ Ejam Turiet savus zirgus! Jūs to darāt pārāk bieži īsā laikā. Atrodiet savu kopienu, sazinieties ar pasauli. - Revolt ir viens no labākajiem veidiem, kā sazināties ar draugiem un kopienu jebkurā vietā un laikā. + Peptide ir viens no labākajiem veidiem, kā sazināties ar draugiem un kopienu jebkurā vietā un laikā. E-pasts Reģistrēties Pašlaik notiek @@ -70,11 +70,11 @@ Ievadiet sešciparu kodu no savas autentifikācijas lietotnes. Ievadiet atkopšanas kodu Lai turpinātu, ievadiet savu paroli. - Revolt operētājsistēmā Android - Revolt tiek veidots, izmantojot šos lieliskos atvērtā pirmkoda projektus. + Peptide operētājsistēmā Android + Peptide tiek veidots, izmantojot šos lieliskos atvērtā pirmkoda projektus. Mēs esam pateicīgi šo projektu izstrādātājiem par to, ka viņu darbs ir pieejams pasaulei. Tālāk esošais saraksts tiek ģenerēts automātiski. Tas var būt nepilnīgs vai neprecīzs. - Laipni lūdzam Revolt + Laipni lūdzam Peptide Tā ir kā vieta, kur pavadīt laiku, sanākt kopā un runāt par lietām. Labākā daļa, tas ir internetā. Pie mums jūsu dati ir drošībā. Mēs to nepārdodam un neizmantojam, lai rādītu jums reklāmas. Astoņi vai vairāk, parastie ir slikti. Ieteicami simboli un cipari. @@ -87,7 +87,7 @@ Aizvērt Objekti Platformas moderēšana - Revolt komandas dalībnieks + Peptide komandas dalībnieks Aizmirsāt paroli\? Ievadiet savu e-pastu, un mēs jums nosūtīsim norādījumus par paroles atiestatīšanu. Pēdējo reizi atjaunināts: %1$s @@ -212,7 +212,7 @@ Fokuss Jūs nesaņemsit paziņojumus par ziņām, bet saņemsiet paziņojumus par @minējumiem. Jūs nesaņemsit nekādus paziņojumus, tostarp ziņojumus un @minējumus. - Jūs varēsiet izmantot Revolt kā parasti, taču citiem cilvēkiem jūs neparādīsies kā tiešsaistē. + Jūs varēsiet izmantot Peptide kā parasti, taču citiem cilvēkiem jūs neparādīsies kā tiešsaistē. Jums nav izveidots savienojums ar internetu. Lūdzu, pārbaudiet savienojumu un mēģiniet vēlreiz. Ritiniet līdz apakšai Kopēts starpliktuvē @@ -254,7 +254,7 @@ Dzēst Paturēt Apskatiet savu lietotāja karti un saņemiet īpašu saiti, ko kopīgot - Revolt nekad neguļ, paskatieties, lai redzētu, kas ir bijis darbos + Peptide nekad neguļ, paskatieties, lai redzētu, kas ir bijis darbos Ziņojums ir tukšs, nav ko kopēt Ziņojuma ID ir kopēts starpliktuvē Ziņojuma saite ir kopēta starpliktuvē @@ -317,7 +317,7 @@ Agrīnais adoptētājs Ievadiet saiti, piemēram, rvlt.gg/Testers, vai ielūguma kodu, piemēram, Testētāji Izveidojiet jaunu serveri - Atklājiet Revolt + Atklājiet Peptide Atcelt Pastāstiet mums, kas ar šo ziņojumu ir nepareizi Pievienojās @@ -348,7 +348,7 @@ Koplietojot jūsu lietotāja karti, radās kļūda. %1$d.Vārds %1$d.Lietotājvārds - %1$d.Par Revolt kopš + %1$d.Par Peptide kopš %1$d.QR kods %1$d.Foto [Koda fragments] diff --git a/app/src/main/res/values-mwl/strings.xml b/app/src/main/res/values-mwl/strings.xml index 7547ae78..8ce22cf2 100644 --- a/app/src/main/res/values-mwl/strings.xml +++ b/app/src/main/res/values-mwl/strings.xml @@ -17,13 +17,13 @@ Reambiar un email de berificaçon Ousando un gerenciador de palabras passe\? Se t’olbidou la tue palabra passe\? - Bienbenido/a al Revolt + Bienbenido/a al Peptide Bamos a ampeçar la tue sesson ← Atrás Seguinte → Cancelar Cumpartir - Ousa\'l Revolt pa cumbersar subre cousas. + Ousa\'l Peptide pa cumbersar subre cousas. Ye cumo un sítio pa remansar, ajuntar-te cun outros, i falar subre cousas. Melhor parte, ye na internet. Bamos a amponer-te. La tue data stá assegurada cun nós. Nós nun la bendimos, i tamien nun la ousamos pa t’amostrar anúncios. @@ -41,7 +41,7 @@ Tenes 2FA lhigado pa mantener la tue conta extra-segura. Ousa ũa palabra passe d\'ouso único Pon un código de seis númaros - Revolt ye un de ls melhores modos de te manteneres conetado culs tous amios i quemunidade, an qualquiera sítio i hora. + Peptide ye un de ls melhores modos de te manteneres conetado culs tous amios i quemunidade, an qualquiera sítio i hora. Pon l tou email i nós t’ambiamos anstruçones an cumo redefenir la tue password. Berifica\'l tou email, i açpuis bamos a ber l tou nome d\'outelizador. Outros ban a ancuntrar, recoincer I amentar-te custe nome. @@ -58,8 +58,8 @@ Pon la tue palabra passe Pon la tue palabra passe pa acuntinar. Subre - Revolt an Android - Traído pa ti cun ❤️ pula eiquipa Revolt. + Peptide an Android + Traído pa ti cun ❤️ pula eiquipa Peptide. Verson Stamos gratos puls zambolbedores destes porjetos por çponibilizaren sou trabalho pa\'l mundo. Atualizado pula redadeira beç: %1$s @@ -86,15 +86,15 @@ Bandeiras Bot Zde un canal binculado - Nembro de l’eiquipa Revolt + Nembro de l’eiquipa Peptide Çcoincido Menu Ancerrar sesson - Ajuntar-te al Revolt + Ajuntar-te al Peptide Amios Solicitaçones Recibidas Bloqueado - Revolt ye custruido cula upa destes ancribles porjetos open-source. + Peptide ye custruido cula upa destes ancribles porjetos open-source. La lhista ambaixo ye outomaticamente generada. Puode ser ancumpleta ó ancorreta. Solo puodes arrespunder a %1$d mensaiges por beç. Moderaçon de Plataforma @@ -218,7 +218,7 @@ Ambiar Reportando… Reportado - Oubrigado por mos dares ũa upa pa mantener l Revolt assegurado. Bamos a reber l tou relatoiro\'l más temprano possible. + Oubrigado por mos dares ũa upa pa mantener l Peptide assegurado. Bamos a reber l tou relatoiro\'l más temprano possible. Arro Un arro acunteceu mentes ambiando\'l tou relatoiro. Antente outra beç açpuis fai fabor. Cerrar @@ -243,7 +243,7 @@ %1$s fui spulsado Outelizador saliu-se Nun bás a recibir qualquieras notificaçones pa mensaiges, mas bás a recibir-las pa @amentos. - Bás a poder ousar l Revolt cumo siempre, mas nun bás a aparecer online pa outras pessonas. + Bás a poder ousar l Peptide cumo siempre, mas nun bás a aparecer online pa outras pessonas. Este canal puode tener sido apagado ó tu puodes nun tener permisson pa lo ber. Apagar Seguro que quieres apagar esta mensaige\? @@ -293,7 +293,7 @@ Ajuntar Criar un nuobo serbidor Este recurso stá atualmente an custruçon. - Çcobrir l Revolt + Çcobrir l Peptide Reportar Cancelar Diç-mos l que stá arrado custa mensaige @@ -359,7 +359,7 @@ Aparença Tema Sistema - Revolt + Peptide Claro Negro Puro Material You (sien suporte) @@ -414,10 +414,10 @@ Cancelar Nun puodes tener-te nacido al feturo. Apagar mensaige\? - Cumpartir pa Revolt - Por fabor ampeça tue sesson antes de cumpartires pa Revolt. + Cumpartir pa Peptide + Por fabor ampeça tue sesson antes de cumpartires pa Peptide. Esto nun ye ũa tencion bálida pa cumpartir. - Este aneixo ye smasiado lhargo pa\'l Revolt (máss. $1$s). + Este aneixo ye smasiado lhargo pa\'l Peptide (máss. $1$s). Apercurar canales Seleciona un canal pa cumpartir. Debes tener 18 ó más anhos pa ber este canal. @@ -437,7 +437,7 @@ Criar un nuobo grupo Esto ye un bot. Ten un plano. Esto ye un bot. - Oune-te al serbidor de\'l Revolt pa dar feedback ó sugestones i reportaiges de bugs. + Oune-te al serbidor de\'l Peptide pa dar feedback ó sugestones i reportaiges de bugs. Nome de Grupo Apercurar Amios Criar @@ -544,7 +544,7 @@ Cumpartir perfil Bei la tue carta d’outelizador i obten un link special pa cumpartir Registro de demudáncias - Revolt nunca duorme, bei l que stá sendo fazido + Peptide nunca duorme, bei l que stá sendo fazido Dar feedback Tenes algo pa dezir? Somos todo oubidos Ancuntreste un Webhook! @@ -552,7 +552,7 @@ Amostrar palabra-passe %1$d.Nome %1$d.Nome d’Outelizador - %1$d.Ne l Revolt Zde + %1$d.Ne l Peptide Zde %1$d.Código QR %1$d.Fotografie Que tal? @@ -570,7 +570,7 @@ Ye possible qu’habas terminado la tue sesson n’outro çpositibo, ó puodes star sien coneçon. Ousando un teclado? [%1$s snippet] - L Revolt ten atalhos de teclado! Clica %1$s pa ls beres. + L Peptide ten atalhos de teclado! Clica %1$s pa ls beres. Ambiar mensaiges Antentar outra beç Terminar sesson @@ -583,17 +583,17 @@ Stamos ancantados por te tener a bordo. Bamos a fazer algo ancrible! Dantendi Amamos feedback! - Se tenes dalgun feedback, sugeston ó reporte de bugs, por fabor di-mos. Stamos siempre antentando melhorar l Revolt. + Se tenes dalgun feedback, sugeston ó reporte de bugs, por fabor di-mos. Stamos siempre antentando melhorar l Peptide. Culificar an Google Play Ajunta-te als Serbidores de Testers Fazido Notificaçones Pedido de serbidores - Revolt pa Android + Peptide pa Android %1$s (çcoincido) Reiniciar %1$s configuraçones Bienbenido al acesso antecipado! 🚀 - Yá que esto ye l’acesso antecipado, ye possible que cousas inda nun steian purfeitas. Puodes ancuntrar-te c’un dalgun bug, crash ó peculiaridade. L tou feedback ajuda-mos a melhorar las partes inda nó tan buonas pa fazer l Revolt inda melhor. + Yá que esto ye l’acesso antecipado, ye possible que cousas inda nun steian purfeitas. Puodes ancuntrar-te c’un dalgun bug, crash ó peculiaridade. L tou feedback ajuda-mos a melhorar las partes inda nó tan buonas pa fazer l Peptide inda melhor. Hint - Dalgues de las tues cunfiguraçones de l Revolt stán danhadas. Esto puode ser porque outelizeste clientes de terceiros. Las cunfiguraçones danhadas son: + Dalgues de las tues cunfiguraçones de l Peptide stán danhadas. Esto puode ser porque outelizeste clientes de terceiros. Las cunfiguraçones danhadas son: \ No newline at end of file diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index c622bfea..770bd663 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -23,8 +23,8 @@ Bruker du en passordbank\? Har du glemt passordet ditt\? Skriv inn e-posten din, så skal vi sende deg instruksjoner for å tilbakestille passordet ditt. - Velkommen til Revolt - Du kan bruke Revolt til å snakke om ting. + Velkommen til Peptide + Du kan bruke Peptide til å snakke om ting. Informasjonen din er trygg hos oss. Vi selger det ikke, og vi bruker det heller ikke til å vise deg reklamer. E-post Passord @@ -190,14 +190,14 @@ Utseende Drakt System - Revolt + Peptide Lys Helt Svart Material You Material You (ikke støttet) Material You er ikke støttet på denne enheten. Tilbakemelding - Revolt er en av de beste måtene å holde kontakt med vennene og felleskapene dine, fra hvor som helst, når som helst. + Peptide er en av de beste måtene å holde kontakt med vennene og felleskapene dine, fra hvor som helst, når som helst. La oss sette deg opp. Vi kommer til å sende deg en bekreftelses-e-post for å bekrefte kontoen din. Bekreft e-posten din, så kan vi begynne med å velge brukernavnet ditt. @@ -211,7 +211,7 @@ Melding er tom, det er ingenting til å kopiere Tast inn en lenke som rvlt.gg/Testers eller en invitasjonskode som Testers NB: Denne meldingen kan ha blitt sendt fra en annen tjeneste. Det er anbefalt at du rapporterer meldingen på tjenesten den ble sendt fra i tillegg. - Tusen takk for at du hjelper å holde Revolt trygt. Vi vil se igjennom rapporten din så snart som mulig. + Tusen takk for at du hjelper å holde Peptide trygt. Vi vil se igjennom rapporten din så snart som mulig. Ingen invitasjonskode ble gitt. Kunne ikke lagre lyd \ No newline at end of file diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 9f119e49..9045d2c8 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -20,13 +20,13 @@ Stuur opnieuw een verificatie-e-mail Gebruik je een wachtwoordmanager\? Je wachtwoord vergeten\? - Welkom bij Revolt - Gebruik Revolt om over dingen te praten. + Welkom bij Peptide + Gebruik Peptide om over dingen te praten. Laten we je opzetten. Uw gegevens zijn veilig bij ons. We verkopen het niet en we gebruiken het ook niet om u advertenties te laten zien. Even wat info ophalen, momentje… Vind uw gemeenschap, maak contact met de wereld. - Revolt is een van de beste manieren om altijd en overal in contact te blijven met je vrienden en de gemeenschap. + Peptide is een van de beste manieren om altijd en overal in contact te blijven met je vrienden en de gemeenschap. Voer je e-mailadres in en we sturen je instructies om je wachtwoord opnieuw in te stellen. Het is als een plek om rond te hangen, samen te komen en over dingen te praten. Het beste deel is dat het op internet staat. Email diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 50f8ddb4..fe3a7f25 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -20,8 +20,8 @@ Wyślij ponownie weryfikacyjną wiadomość na email Korzystasz z menedżera haseł\? Zapomniałeś hasła\? - Witamy na Revolt - Użyj Revolt, aby porozmawiać o różnych rzeczach. + Witamy na Peptide + Użyj Peptide, aby porozmawiać o różnych rzeczach. Skonfigurujmy twoje konto. Twoje dane są u nas bezpieczne. Nie sprzedajemy ich ani nie wykorzystujemy do wyświetlania reklam. Email @@ -147,7 +147,7 @@ Prześlij Zgłaszanie… Zgłoszono - Dziękujemy za pomoc w zapewnieniu bezpieczeństwa na Revolt. Przeanalizujemy twoje zgłoszenie tak szybko, jak to możliwe. + Dziękujemy za pomoc w zapewnieniu bezpieczeństwa na Peptide. Przeanalizujemy twoje zgłoszenie tak szybko, jak to możliwe. Błąd Wystąpił błąd podczas przesyłania zgłoszenia. Spróbuj ponownie później. Zamknij @@ -183,7 +183,7 @@ Wygląd Motyw System - Revolt + Peptide Jasny Czysta czerń Twój Materiał @@ -192,7 +192,7 @@ Opinie ← Cofnij Zbieranie informacji, poczekaj chwilę… - Revolt to jeden z najlepszych sposobów na pozostanie w kontakcie ze znajomymi i społecznością, w dowolnym miejscu i czasie. + Peptide to jeden z najlepszych sposobów na pozostanie w kontakcie ze znajomymi i społecznością, w dowolnym miejscu i czasie. Wprowadź swój adres email, a my wyślemy Ci instrukcje dotyczące resetowania hasła. To jak miejsce, w którym można spędzać czas, spotykać się i rozmawiać o różnych rzeczach. Najlepsze jest to, że jest w Internecie. Zweryfikuj swój adres email, a następnie zajmiemy się wyborem nazwy użytkownika. @@ -217,7 +217,7 @@ Złośliwe oprogramowanie lub phishing Podszywanie się Wszelkie dodatkowe informacje, które mogą nam pomóc w dochodzeniu. Opcjonalne. - Revolt na Android + Peptide na Android Ostatnia aktualizacja: %1$s Aktywność Jenvolt to przestrzeń zarządzana przez deweloperów dla wszystkich aplikacji na Androida i nie tylko. Wsparcie i opinie można znaleźć tutaj. Może będziesz mógł wypróbować nowe funkcje! 👀 @@ -227,17 +227,17 @@ %1$s wyszedł Aktywny Nie będziesz otrzymywać powiadomień o wiadomościach, ale będziesz otrzymywać powiadomienia o @wzmiankach. - Będziesz mógł normalnie korzystać z Revolt, ale nie będziesz widoczny online dla innych osób. + Będziesz mógł normalnie korzystać z Peptide, ale nie będziesz widoczny online dla innych osób. Oficjalny serwer Zweryfikowany serwer Ten kanał mógł zostać usunięty lub nie masz uprawnień do jego wyświetlania. Opuść Dopóki nie zostaniesz ponownie zaproszony, nie będziesz mógł ponownie dołączyć. Nie można pobrać biografii tego użytkownika. Sprawdź, czy dzielicie serwer lub jesteście znajomymi. - Revolt jest zbudowany przy pomocy tych niesamowitych projektów open-source. + Peptide jest zbudowany przy pomocy tych niesamowitych projektów open-source. Jesteśmy wdzięczni twórcom tych projektów za udostępnienie ich pracy światu. Poniższa lista jest generowana automatycznie. Może być niekompletna lub niedokładna. - Dostarczone z ❤️ przez zespół Revolt. + Dostarczone z ❤️ przez zespół Peptide. Wersja Szczegóły Dotknij, aby wyświetlić licencję @@ -251,7 +251,7 @@ Symbole Flagi Moderacja platformy - Członek zespołu Revolt + Członek zespołu Peptide Dołącz do Jenvolt Przyjaciele Przychodzące żądania @@ -382,7 +382,7 @@ Ten plik nie jest prawidłowym plikiem zastępującym kolor. Co tam słychać ✨ Odkrywaj - Odkrywaj Revolt + Odkrywaj Peptide Powiedz, co jest nie tak z tym użytkownikiem Ekstremalna przemoc, gore lub okrucieństwo wobec zwierząt Powiedz, co jest nie tak z tą wiadomością @@ -412,11 +412,11 @@ Zamknij Zaproszenie do #%1$s Nie jest to ważna intencja udostępniania. - Ten załącznik jest zbyt duży dla Revolt (maks. $1$s). + Ten załącznik jest zbyt duży dla Peptide (maks. $1$s). Wyszukiwanie kanałów Wybierz kanał do udostępnienia. - Udostępnij na Revolt - Zaloguj się przed udostępnieniem na Revolt. + Udostępnij na Peptide + Zaloguj się przed udostępnieniem na Peptide. Ten kanał jest oznaczony jako NSFW Musisz mieć ukończone 18 lat, aby zobaczyć ten kanał. Nie można urodzić się w przyszłości. @@ -434,7 +434,7 @@ Zniknie na zawsze (na długo!) Usuń Zachowaj - Dołącz do serwera Revolt, aby przekazywać opinie i sugestie oraz zgłaszać błędy. + Dołącz do serwera Peptide, aby przekazywać opinie i sugestie oraz zgłaszać błędy. Nowa grupa Zbierz załogę na czacie grupowym. Możesz dodać do %1$d osób. To jest bot. @@ -546,7 +546,7 @@ Stuknij, aby skopiować %1$d.Nazwa %1$d.Nazwa użytkownika - %1$d.Na Revolt od + %1$d.Na Peptide od %1$d.Zdjęcie Wystąpił błąd podczas udostępniania karty użytkownika. %1$d.Kod QR @@ -559,7 +559,7 @@ Udostępnij profil Spójrz na swoją kartę użytkownika i uzyskaj specjalny link do udostępnienia Dziennik zmian - Revolt nigdy nie śpi, spójrz, aby zobaczyć, co jest w przygotowaniu + Peptide nigdy nie śpi, spójrz, aby zobaczyć, co jest w przygotowaniu Przekazywanie opinii Masz coś do powiedzenia\? Zamieniamy się w słuch Webhook został znaleziony! @@ -569,7 +569,7 @@ Domyślny system [%1$s snippet] Używasz klawiatury? - Revolt ma skróty klawiszowe! Naciśnij %1$s, aby je zobaczyć. + Peptide ma skróty klawiszowe! Naciśnij %1$s, aby je zobaczyć. Wystąpił problem z zalogowaniem Być może wylogowałeś się z innego urządzenia lub połączenie internetowe nie działa. Spróbuj ponownie @@ -588,13 +588,13 @@ Wskazówka Powiadomienia Zamówienie Serwera - Revolt na Androida + Peptide na Androida %1$s (nieznane) Zresetuj ustawienia %1$s Witamy we wczesnej dostępie! 🚀 Jesteś jednym z pierwszych, którzy wypróbowali naszą nową aplikację na Androida. Cieszymy się, że tu jesteś! - Ponieważ jest to wczesny dostęp, wszystko może nie być jeszcze idealne. Możesz natknąć się na sporadyczne błędy, awarie lub dziwne dziwactwa. Twoja opinia pomoże nam wygładzić nierówne krawędzie i uczynić Revolt jeszcze lepszym. + Ponieważ jest to wczesny dostęp, wszystko może nie być jeszcze idealne. Możesz natknąć się na sporadyczne błędy, awarie lub dziwne dziwactwa. Twoja opinia pomoże nam wygładzić nierówne krawędzie i uczynić Peptide jeszcze lepszym. Cieszymy się, że mamy cię na pokładzie. Stwórzmy razem coś wspaniałego! - Niektóre ustawienia Revolt są uszkodzone. Może to być spowodowane korzystaniem z klientów innych firm. Dotyczy to następujących ustawień: - Jeśli masz jakieś uwagi, sugestie lub raporty o błędach, daj nam znać. Zawsze staramy się ulepszać Revolt. + Niektóre ustawienia Peptide są uszkodzone. Może to być spowodowane korzystaniem z klientów innych firm. Dotyczy to następujących ustawień: + Jeśli masz jakieś uwagi, sugestie lub raporty o błędach, daj nam znać. Zawsze staramy się ulepszać Peptide. \ No newline at end of file diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 4ccc1add..0c3f731a 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -36,7 +36,7 @@ Salvo Feedback Aparência - Revolt + Peptide Sistema Claro Material You @@ -62,7 +62,7 @@ Reenviar Reenviar e-mail de verificação %1$s estão digitando… - Bem-vindo(a) ao Revolt + Bem-vindo(a) ao Peptide Esqueceu sua senha\? Bem-vindo(a)! Nome de usuário @@ -94,11 +94,11 @@ Vamos lá Reunindo algumas informações, aguenta aí… Encontre sua comunidade, conecte-se com o mundo. - Revolt é uma das melhores maneiras de se manter conectado com seus amigos e comunidade, em qualquer lugar, a qualquer hora. + Peptide é uma das melhores maneiras de se manter conectado com seus amigos e comunidade, em qualquer lugar, a qualquer hora. Vamos logar você Usando um gerenciador de senhas\? Insira seu email e nós enviaremos instruções para redefinir sua senha. - Use o Revolt para conversar sobre coisas. + Use o Peptide para conversar sobre coisas. É como um lugar para curtir, se reunir e falar sobre qualquer coisa. E a melhor parte: é na internet. Vamos preparar as coisas para você. Seus dados estão seguros com a gente. Não vendemos e nem os utilizamos para te mostrar anúncios. @@ -207,7 +207,7 @@ Usuário selecionado: Incentivo à violência Não possui a idade mínima para usar a plataforma - Obrigado por nos ajudar a manter o Revolt seguro. Vamos analisar sua denúncia assim que possível. + Obrigado por nos ajudar a manter o Peptide seguro. Vamos analisar sua denúncia assim que possível. Esta funcionalidade está em desenvolvimento. Gostaria de bloquear este usuário\? Nenhum código de convite fornecido. @@ -216,15 +216,15 @@ Material You (não suportado) Material You não é suportado neste dispositivo. De canal vinculado - O Revolt é feito com a ajuda desses incríveis projetos de código-aberto. + O Peptide é feito com a ajuda desses incríveis projetos de código-aberto. Nós agradecemos aos desenvolvedores desses projetos por fazerem o seu trabalho disponível ao mundo. A lista abaixo é gerada automaticamente. Ela pode estar incompleta ou imprecisa. Última atualização: %1$s Toque para ver a licença O canal foi renomeado A posse foi alterada - Revolt no Android - Trazido até você com ❤️ pelo time do Revolt. + Peptide no Android + Trazido até você com ❤️ pelo time do Peptide. Versão Detalhes Escolher emoji @@ -236,7 +236,7 @@ Objetos Símbolos Bandeiras - Membro do time do Revolt + Membro do time do Peptide Junte-se ao Jenvolt Amigos Solicitações Recebidas @@ -262,7 +262,7 @@ Este canal pode ter sido deletado ou você pode não ter permissão para vê-lo. Adicionar membros A bio deste usuário não pode ser alcançada. Por favor tenha a certeza de que compartilham um servidor ou de que são amigos. - Descobrir o Revolt + Descobrir o Peptide Diga-nos o que há de errado com esta mensagem Hacking ou cracking ilegais Notícia importante tratando da sua conta @@ -308,7 +308,7 @@ Você não vai receber qualquer notificação, incluindo mensagens e @menções. Offline Invisível - Você vai poder usar o Revolt normalmente, mas não vai aparecer como online para os outros. + Você vai poder usar o Peptide normalmente, mas não vai aparecer como online para os outros. Servidor Oficial Servidor Verificado Você não pode ver este canal @@ -405,10 +405,10 @@ Envie este link para convidar pessoas para este canal. Copiar Fechar - Compartilhar para  Revolt - Por favor, faça login antes de compartilhar para  Revolt . + Compartilhar para  Peptide + Por favor, faça login antes de compartilhar para  Peptide . Esta não é uma tentativa de compartilhamento válida. - Este anexo é muito grande para  Revolt (max. $1$s). + Este anexo é muito grande para  Peptide (max. $1$s). Buscar canais Selecione um canal para compartilhar. Um emoji padrão que você pode usar em qualquer lugar @@ -438,7 +438,7 @@ Deslize para responder Resposta rápida Toque duas vezes para responder - Participe do servidor Revolt para dar feedback ou sugestões e relatar bugs. + Participe do servidor Peptide para dar feedback ou sugestões e relatar bugs. Configurações do canal #%1$s Visão geral @@ -555,7 +555,7 @@ Abrir Configurações Compartilhar Perfil Dê uma olhada no seu cartão de usuário e obtenha um link para compartilhar - Revolt nunca para, dê uma olhada no que estamos preparando + Peptide nunca para, dê uma olhada no que estamos preparando Enviar Feedback Tem algo a dizer\? Estamos aqui para ouvir Webhooks são automatizados por outros serviços na internet. Não podem paper de volta, mas você ainda pode ver o que eles tem a dizer. @@ -563,7 +563,7 @@ Ocorreu um erro ao compartilhar seu cartão de usuário. %1$d.Nome %1$d.Nome de Usuário - %1$d.No Revolt Desde + %1$d.No Peptide Desde %1$d.Código QR %1$d.Foto Ocorreu um erro ao fazer o seu login @@ -573,7 +573,7 @@ Tentar novamente Encerrar Sessão [Bloco de código] - Revolt tem atalhos! Pressione %1$s para vê-los. + Peptide tem atalhos! Pressione %1$s para vê-los. Abrir atalhos Tudo bem Mensagens @@ -581,7 +581,7 @@ Enviar Mensagem Bem-vindo(a) ao Acesso Antecipado! 🚀 Você é um dos primeiros a testar nosso novo app Android. Estamos entusiasmados em ter você aqui! - Por ser um acesso antecipado, as coisas podem não estar perfeitas ainda. Você pode encontrar um bug, crash ou peculiariedade estranha ocasionalmente. O seu feedback nos ajuda a suavizar as arestas e fazer o Revolt ainda melhor. + Por ser um acesso antecipado, as coisas podem não estar perfeitas ainda. Você pode encontrar um bug, crash ou peculiariedade estranha ocasionalmente. O seu feedback nos ajuda a suavizar as arestas e fazer o Peptide ainda melhor. Estamos emocionados por ter você a bordo. Vamos fazer algo grande juntos! Entendi Amamos feedback! @@ -590,10 +590,10 @@ Feito Notificações Ordem dos Servidores - Revolt para Android + Peptide para Android Redefinir configurações de %1$s Dica %1$s (desconhecido) - Se você tiver quaisquer feedbacks, sugestões ou reportes de bug, deixe-nos saber. Estamos sempre procurando melhorar o Revolt. - Algumas das suas configurações do Revolt estão corruptas. Isso pode ser devido ao uso de clientes de terceiros. As configurações afetadas são: + Se você tiver quaisquer feedbacks, sugestões ou reportes de bug, deixe-nos saber. Estamos sempre procurando melhorar o Peptide. + Algumas das suas configurações do Peptide estão corruptas. Isso pode ser devido ao uso de clientes de terceiros. As configurações afetadas são: \ No newline at end of file diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 2a1075f1..93c976c8 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -17,8 +17,8 @@ Vamos iniciar a tua sessão Esqueceste-te da tua palavra-passe\? A utilizar um gestor de palavras-passe\? - Bem-vindo(a) ao Revolt - Usa o Revolt para falares sobre coisas. + Bem-vindo(a) ao Peptide + Usa o Peptide para falares sobre coisas. Vamos preparar você. Os teus dados estão seguros connosco. Nós não os vendemos nem os usamos para te mostrar anúncios. E-mail @@ -152,7 +152,7 @@ Aparência Tema Sistema - Revolt + Peptide Claro Preto puro Material você @@ -160,7 +160,7 @@ ← Voltar A pedir informação, aguenta aí… Encontra a tua comunidade, liga-te ao mundo. - O Revolt é uma das melhores formas de te manteres em contacto com os teus amigos e comunidade, em qualquer lugar, a qualquer hora. + O Peptide é uma das melhores formas de te manteres em contacto com os teus amigos e comunidade, em qualquer lugar, a qualquer hora. Reenviar e-mail de verificação Esqueceste-te da tua palavra-passe\? Insere o teu e-mail e nós enviamos-te as instruções para redefinires a tua palavra-passe. @@ -203,7 +203,7 @@ Malware (vírus) ou phishing (burla) Assédio ou ciberbullying Qualquer informação adicional que possa auxiliar a nossa investigação. Opcional. - Obrigado por nos ajudares a manter o Revolt seguro. Iremos rever a tua denúncia assim que possível. + Obrigado por nos ajudares a manter o Peptide seguro. Iremos rever a tua denúncia assim que possível. Ocorreu um erro enquanto se tentava submeter a tua denúncia. Por favor, tenta novamente mais tard. Já és membro deste servidor. Não foi possível encontrar nenhum convite com o código fornecido. @@ -217,8 +217,8 @@ Mas se mudares de ideias, podes sempre mudá-lo nas tuas Definições de Utilizador. Mensagens diretas Descobrir servidores - Revolt no Android - Trazido a ti com ❤️ pela equipa do Revolt. + Peptide no Android + Trazido a ti com ❤️ pela equipa do Peptide. Versão Detalhes Última atualização: %1$s @@ -229,8 +229,8 @@ Pressione e segure para responder Resposta Rápida Bater papo - Faça login antes de compartilhar no Revolt. - Compartilhar na Revolt + Faça login antes de compartilhar no Peptide. + Compartilhar na Peptide Manter Excluir Tem certeza de que deseja excluir este canal\? @@ -262,7 +262,7 @@ Diganos o que há de errado com esta mensagem Vingança ou pornografia de menores Golpes ou fraude - Este arquivo é muito grande para o Revolt (máx. $1$s). + Este arquivo é muito grande para o Peptide (máx. $1$s). Esta não é uma intenção de compartilhamento válida. Todas as mensagens e configurações deste canal desaparecerão para sempre (muito tempo!) Tom de pele escuro @@ -278,7 +278,7 @@ Apagar mensagem\? A lista abaixo é gerada automaticamente. Pode estar incompleto ou impreciso. Toque para ver a licença - Revolt é construído com a ajuda desses incríveis projetos de código aberto. + Peptide é construído com a ajuda desses incríveis projetos de código aberto. Somos gratos aos desenvolvedores desses projetos por disponibilizarem seu trabalho para o mundo. Canal renomeado Usuário removido @@ -291,7 +291,7 @@ %1$s transferiu a propriedade para %2$s %1$s renomeou o canal para %2$s Sair silenciosamente - Descubra a revolt + Descubra a peptide Treino Escolha emoji Emoticons e Emoções @@ -304,7 +304,7 @@ Símbolos Bandeiras Moderação da plataforma - Membro da equipe Revolt + Membro da equipe Peptide Junte-se à Jenvolt Amigos Solicitações recebidas @@ -365,7 +365,7 @@ %1$s removido %2$s %1$s adicionou %2$s %1$s foi banido - Você poderá usar o Revolt normalmente, mas não aparecerá online para outras pessoas. + Você poderá usar o Peptide normalmente, mas não aparecerá online para outras pessoas. Você não pode visualizar este canal de %1$s Um emoji padrão que você pode usar em qualquer lugar @@ -446,7 +446,7 @@ Sair Importar Este arquivo não é um arquivo de substituição de cores válido. - Junte-se ao servidor Revolt para dar feedback ou sugestões e relatar bugs. + Junte-se ao servidor Peptide para dar feedback ou sugestões e relatar bugs. Variante de esboço Contorno No contêiner de erros @@ -510,14 +510,14 @@ Compartilhar Perfil Dê uma olhada no seu cartão e obtenha um link especial para compartilhar Registro de Mudanças - O Revolt nunca para, veja o que esteve sendo trabalhado + O Peptide nunca para, veja o que esteve sendo trabalhado Providenciar Feedback Tem algo a dizer? Estamos todos ouvidos Toque para copiar Um erro ocorreu ao compartilhar seu cartão. %1$d.Nome %1$d.Nome de Usuário - %1$d.No Revolt Desde + %1$d.No Peptide Desde %1$d.Foto Falha ao enviar, segure um toque para opções Toque para tocar o video do YouTube @@ -561,7 +561,7 @@ Dica Notificações Pedido de servidor - Revolt para Android + Peptide para Android %1$s (desconhecido) Redefinir configurações de %1$s Padrão do sistema @@ -572,13 +572,13 @@ Mensagens Nova linha Enviar mensagem - Como se trata de acesso antecipado, as coisas podem não estar perfeitas ainda. Você pode encontrar bugs, travamentos ou peculiaridades estranhas ocasionais. Seu feedback nos ajuda a suavizar as arestas e tornar o Revolt ainda melhor. + Como se trata de acesso antecipado, as coisas podem não estar perfeitas ainda. Você pode encontrar bugs, travamentos ou peculiaridades estranhas ocasionais. Seu feedback nos ajuda a suavizar as arestas e tornar o Peptide ainda melhor. As incorporações interativas permitem que você interaja com alguns tipos de links diretamente no chat. Por exemplo, você pode reproduzir vídeos do YouTube ou visualizar álbuns do Apple Music. - Se você tiver algum comentário, sugestão ou relatório de bug, informe-nos. Estamos sempre procurando melhorar o Revolt. + Se você tiver algum comentário, sugestão ou relatório de bug, informe-nos. Estamos sempre procurando melhorar o Peptide. Incorporações interativas Idioma Música da Apple - Algumas das configurações do Revolt estão corrompidas. Isso pode ser devido ao uso de clientes de terceiros. As configurações afetadas são: + Algumas das configurações do Peptide estão corrompidas. Isso pode ser devido ao uso de clientes de terceiros. As configurações afetadas são: %1$d.Código QR Selecionar fotos Falha ao abrir a câmera @@ -593,7 +593,7 @@ Habilitar notificações Agora não Usando um teclado? - Revolt tem atalhos de teclado! Pressione %1$s para vê-los. + Peptide tem atalhos de teclado! Pressione %1$s para vê-los. Abrir atalhos Tudo certo circular diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 97de78b7..c54a2d3c 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -6,7 +6,7 @@ Ai uitat parola\? Retrimite e-mailul de verificare Ți-ai uitat parola\? - Bun venit la Revolt + Bun venit la Peptide Hai să te pregătim. Parolă Verifică-ți e-mailul! @@ -103,7 +103,7 @@ Diverse Aspect Temă - Revolt + Peptide Luminos Material You Material You (nu este acceptat) @@ -118,7 +118,7 @@ Politica de confidențialitate Orientări comunitare Găsește-ți comunitatea, conectează-te cu lumea. - Revolt este una dintre cele mai bune modalități de a rămâne conectat cu prietenii și comunitatea ta, oriunde și oricând. + Peptide este una dintre cele mai bune modalități de a rămâne conectat cu prietenii și comunitatea ta, oriunde și oricând. E-mail Parolă Autentificare @@ -126,7 +126,7 @@ Să te autentificăm Folosești un manager de parole\? Introdu-ți adresa de e-mail și îți vom trimite instrucțiuni despre cum să-ți resetezi parola. - Folosește Revolt pentru a discuta despre lucruri. + Folosește Peptide pentru a discuta despre lucruri. Este un loc în care să stai, să te distrezi și să vorbești despre lucruri. Partea cea mai bună este că este pe internet. Datele tale sunt în siguranță cu noi. Nu le vindem și nici nu le folosim pentru a-ți arăta reclame. E-mail @@ -192,7 +192,7 @@ Orice informații suplimentare care ne pot ajuta în investigația noastră. Opțional. Trimitere Se face reclamația… - Îți mulțumi că ne ajuți să păstrăm Revolt în siguranță. Vom analiza reclamația ta cât mai curând posibil. + Îți mulțumi că ne ajuți să păstrăm Peptide în siguranță. Vom analiza reclamația ta cât mai curând posibil. S-a produs o eroare în timpul trimiterii reclamării. Te rugăm să încerci din nou mai târziu. Închidere Ai dori să blochezi acest utilizator\? @@ -217,17 +217,17 @@ Îți mulțumim pentru timpul acordat reclamării acestui utilizator. Te rugăm să precizezi motivul reclamației acestui utilizator. Promovează vătămarea Spam sau abuz de platformă similar - Revolt pe Android + Peptide pe Android Lista de mai jos este generată automat. Aceasta poate fi incompletă sau inexactă. - Oferit cu ❤️ de către echipa Revolt. - Revolt este construit cu ajutorul acestor minunate proiecte open-source. + Oferit cu ❤️ de către echipa Peptide. + Peptide este construit cu ajutorul acestor minunate proiecte open-source. Suntem recunoscători dezvoltatorilor acestor proiecte pentru că și-au pus munca la dispoziția lumii. Versiunea Detalii %1$s a adăugat %2$s Bun venit la Accesul timpuriu! 🚀 Ești unul dintre primii care au încercat noua noastră aplicație Android. Suntem încântați să te avem aici! - Deoarece suntem în faza de acces timpuriu, este posibil ca lucrurile să nu fie perfecte încă. S-ar putea să întâmpini din când în când o eroare, un accident sau o ciudățenie. Feedback-ul tău ne ajută să șlefuim și să facem Revolt mai bun. + Deoarece suntem în faza de acces timpuriu, este posibil ca lucrurile să nu fie perfecte încă. S-ar putea să întâmpini din când în când o eroare, un accident sau o ciudățenie. Feedback-ul tău ne ajută să șlefuim și să facem Peptide mai bun. Suntem încântați să te avem alături de noi. Hai să facem ceva minunat împreună! Am înțeles Iubim feedback-ul! @@ -283,7 +283,7 @@ Obiecte Simboluri Steaguri - Membru al echipei Revolt + Membru al echipei Peptide Alătură-te Jenvolt Pagina mea Nu s-a putut încărca pagina ta @@ -292,14 +292,14 @@ Schimbă-ți aspectul, gestionează-ți contul și multe altele Distribuie profilul Jurnal de schimbări - Revolt nu doarme, aruncă o privire la ceea ce am lucrat + Peptide nu doarme, aruncă o privire la ceea ce am lucrat Oferă părerea Ai ceva de zis? Suntem doar urechi Apasă pentru a copia Am întâmpinat o eroare la partajarea cardului de utilizator %1$d.Nume %1$d.Nume de utilizator - %1$d.Pe Revolt din data de + %1$d.Pe Peptide din data de %1$d.Cod QR %1$d.Fotografie Prieteni @@ -357,7 +357,7 @@ Nu vei primi nicio notificare, inclusiv mesaje și @mențiuni. Offline Invizibil - Vei putea să folosești Revolt ca de obicei, dar nu vei apărea online pentru alte persoane. + Vei putea să folosești Peptide ca de obicei, dar nu vei apărea online pentru alte persoane. Mesajul din stare va fi vizibil tuturor. Ține-l scurt și dulce. Mesajul stării Spune lumii ce pui la cale @@ -423,7 +423,7 @@ Moderarea platformei Susținător activ Utilizator timpuriu - Descoperă Revolt + Descoperă Peptide Spune-ne ce este în neregulă cu acest mesaj Spune-ne ce este în neregulă cu acest utilizator Șantaj @@ -476,7 +476,7 @@ Activează notificările Nu acum Folosești o tastatură? - Revolt are scurtături de taste! Apasă %1$s pentru a le vedea. + Peptide are scurtături de taste! Apasă %1$s pentru a le vedea. Deschide scurtăturile În regulă \ No newline at end of file diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 19b18ca5..3f874f7d 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -11,11 +11,11 @@ Правила сообщества Начнём Отправить письмо - Приветствуем в Revolt + Приветствуем в Peptide Войдём в аккаунт Используете менеджер паролей\? Забыли свой пароль\? - Используйте Revolt для общения на различные темы. + Используйте Peptide для общения на различные темы. Давайте создадим аккаунт. Проверьте свою почту! Мы отправили дальнейшие действия на %1$s. @@ -118,7 +118,7 @@ Общее Внешний вид Системная - Revolt + Peptide Отзыв ← Назад Забыли пароль\? @@ -127,7 +127,7 @@ Поделиться Получаем информацию, подождите… Найди себе сообщество, соединись с миром. - Revolt - это один из лучших способов оставаться на связи с друзями и сообществом, везде, всегда. + Peptide - это один из лучших способов оставаться на связи с друзями и сообществом, везде, всегда. Пароль Восемь или больше, те, что частые - плохие. Символы и цифры рекомендованы. Подтвердите свою почту, после чего вы перейдёте к выбору имени пользователя. @@ -195,7 +195,7 @@ Спам или подобное злоупотребление платформой Недостаточный возраст для использования платформы Любая дополнительная информация которая могла бы помочь в нашем расследовании. Не обязательно. - Спасибо за то, что помогаете поддерживать Revolt в безопасности. Мы рассмотрим вашу жалобу как можно скорее. + Спасибо за то, что помогаете поддерживать Peptide в безопасности. Мы рассмотрим вашу жалобу как можно скорее. Ошибка Возникла ошибка при получении вашей жалобы. Пожалуйста, попробуйте ещё раз позже. Вас пригласили вступить в данный сервер. Вы хотите присоединиться\? @@ -227,7 +227,7 @@ Вы не будете получать никаких уведомлений, включая сообщения и @упоминания. Версия Нажмите, чтобы просмотреть лицензию - Revolt разработан с помощью этих замечательных проектов с открытым исходным кодом. + Peptide разработан с помощью этих замечательных проектов с открытым исходным кодом. Символы Друзья Вы не можете отправлять сообщения в этом канале. @@ -252,11 +252,11 @@ Ошибка Вариант контура Этот файл не является допустимым файлом переопределения цветов. - Revolt на Android + Peptide на Android Мы благодарны разработчикам этих проектов за то, что они сделали свою работу доступной всему миру. Модерация платформы Выбрать эмодзи - Создано с ❤️ командой Revolt. + Создано с ❤️ командой Peptide. Подробности Последнее обновление: %1$s Смайлики и эмоции @@ -265,7 +265,7 @@ Еда и напитки Путешествия и места Флаги - Член команды Revolt + Член команды Peptide Активности Объекты Присоединиться к Jenvolt @@ -374,7 +374,7 @@ Возможно, этот канал был удалён или у вас нет прав на его просмотр. Вы получили важное уведомление касательно вашего аккаунта от нашей команды модераторов. Пожалуйста, прочтите его внимательно. Возможно, этот пользователь был удалён, или у вас нет прав на его просмотр. - Вы сможете использовать Revolt как обычно, но вы не будете отображаться в сети для других людей. + Вы сможете использовать Peptide как обычно, но вы не будете отображаться в сети для других людей. Проверенный сервер с приватного сервера Добавить участников @@ -384,7 +384,7 @@ Чрезмерное насилие, кровавые сцены или жестокое обращение с животными Расскажите нам, что не так с этим сообщением Исследуйте - Исследовать Revolt + Исследовать Peptide Наркотики или другие нелегальные товары Вымогательство или шантаж Порноместь или порнография с участием несовершеннолетних @@ -417,10 +417,10 @@ Пожаловаться Пожалуйста, выберите канал, в который хотите поделиться. Отправьте эту ссылку, чтобы пригласить людей к этому каналу. - Поделиться на Revolt - Пожалуйста, войдите в аккаунт, чтобы поделиться в Revolt. + Поделиться на Peptide + Пожалуйста, войдите в аккаунт, чтобы поделиться в Peptide. Это недействительное намерение. - Это вложение слишком большое для Revolt (макс. $1$s). + Это вложение слишком большое для Peptide (макс. $1$s). Поиск каналов Дата рождения День @@ -434,7 +434,7 @@ Оно исчезнет навсегда (это надолго!) Удалить Оставить - Присоединяйтесь к серверу Revolt, чтобы оставлять отзывы и предложения и сообщать об ошибках. + Присоединяйтесь к серверу Peptide, чтобы оставлять отзывы и предложения и сообщать об ошибках. Новая группа Соберите свою команду в групповом чате. Вы можете добавить до %1$d человек. Это бот. @@ -513,7 +513,7 @@ Меняйте ваш образ, управляйте аккаунтом и многое другое Поделится профилем Список изменений - Revolt никогда не спит, взгляните, над чем мы работали + Peptide никогда не спит, взгляните, над чем мы работали Есть что сказать\? Мы все во внимании Оставить отзыв Узнать больше @@ -567,11 +567,11 @@ %1$d.QR Код %1$d.Фотография Возможно, вы вышли из системы с другого устройства или у вас отключено интернет-соединение. - "В Revolt есть сочетания клавиш! Нажмите %1$s, чтобы увидеть их." + "В Peptide есть сочетания клавиш! Нажмите %1$s, чтобы увидеть их." Фрагмент кода Использовать клавиатуру? Печатать - %1$d.Появился в Revolt + %1$d.Появился в Peptide Возникла проблема при вашем входе Попробуйте снова Выйти @@ -583,7 +583,7 @@ Мы очень рады видеть вас в команде. Давайте вместе создадим нечто великое! Понятно Мы любим обратную связь! - Если у вас есть обратная связь, предложения или отчеты об ошибках, пожалуйста, дайте нам знать. Мы всегда стремимся улучшить Revolt. + Если у вас есть обратная связь, предложения или отчеты об ошибках, пожалуйста, дайте нам знать. Мы всегда стремимся улучшить Peptide. Оценить в Google Play Присоединиться к серверу тестировщиков Готово @@ -593,8 +593,8 @@ Добро пожаловать в Ранний Доступ! 🚀 Вы один из первых, кто попробовал наше Android приложение. Мы рады видеть Вас здесь! Порядок серверов - Поскольку это ранний доступ, все может быть не совсем идеально. Вы можете столкнуться со случайными ошибками, сбоями или странными причудами. Ваша обратная связь поможет нам сгладить неровности и сделать Revolt еще лучше. + Поскольку это ранний доступ, все может быть не совсем идеально. Вы можете столкнуться со случайными ошибками, сбоями или странными причудами. Ваша обратная связь поможет нам сгладить неровности и сделать Peptide еще лучше. Подсказка - Некоторые из ваших настройек Revolt повреждены. Это может быть связано с использованием сторонних клиентов. К затронутым настройкам относятся: - Revolt для Android + Некоторые из ваших настройек Peptide повреждены. Это может быть связано с использованием сторонних клиентов. К затронутым настройкам относятся: + Peptide для Android \ No newline at end of file diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml index 51efa331..f3c2c402 100644 --- a/app/src/main/res/values-th/strings.xml +++ b/app/src/main/res/values-th/strings.xml @@ -12,8 +12,8 @@ ส่งอีเมล ลืมรหัสผ่าน\? ส่งอีเมลยืนยันอีกครั้ง - ยินดีต้อนรับสู้ Revolt - ใช้ Revolt ในการคุยถึงเรื่องต่างๆ + ยินดีต้อนรับสู้ Peptide + ใช้ Peptide ในการคุยถึงเรื่องต่างๆ อีเมล รหัสผ่าน เช็คอีเมลของคุณ! @@ -31,7 +31,7 @@ โค้ด ใส่รหัสผ่านของคุณเพื่อจะไปต่อ เกี่ยวกับ - Revolt บน Android + Peptide บน Android เวอร์ชั่น รายละเอียด เวอร์ชั้นนั้น @@ -40,7 +40,7 @@ กำลังรับข้อมูล, รอสักพักนะ… เงื่อนไขการใช้บริการ นโยบายความเป็นส่วนตัว - Revolt คือหนึ่งในวิธีที่ดีที่สุดเพื่อเชื่อมต่อกับเพื่อนๆ และชุมชนของคุณ ทุกที่ ทุกเวลา + Peptide คือหนึ่งในวิธีที่ดีที่สุดเพื่อเชื่อมต่อกับเพื่อนๆ และชุมชนของคุณ ทุกที่ ทุกเวลา รหัสผ่าน เรามาล็องอินกัน ลืมรหัสผ่าน\? @@ -54,9 +54,9 @@ แต่ถ้าคุณเปลี่ยนใจ คุณสามารถเปลี่ยนชื่อผู้ใช้ได้ตลอดในการตั้งค่าผู้ใช้ ใส่โค้ดการกู้คืน ใส่รหัสผ่านของคุณ - ให้คุณด้วย ❤️ โดยทีมงาน Revolt + ให้คุณด้วย ❤️ โดยทีมงาน Peptide การระบุแหล่งที่มาของ OSS - Revolt ได้ถูกสร้างโดยใช้ผลงานโปรแกรมโอเพนซอร์สสุดเจ๋งมากมาย ดังนี้ + Peptide ได้ถูกสร้างโดยใช้ผลงานโปรแกรมโอเพนซอร์สสุดเจ๋งมากมาย ดังนี้ มาตรฐานชุมชน มาลงทะเบียนกันเถอะ คุณได้เปิดใช้ระบบยืนยันตัวตนแบบสองขั้นตอนเพื่อเสริมความปลอดภัยให้บัญชีแล้ว @@ -98,7 +98,7 @@ เพื่อน ถูกบล็อก ค้นพบ - สมาชิกทีม Revolt + สมาชิกทีม Peptide เมนู คำขอเป็นเพื่อนขาเข้า คำขอเป็นเพื่อนขาออก diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index d2157815..50ccc727 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -7,13 +7,13 @@ Yeniden bağlanmak için dokun Taciz veya siber zorbalık Soruşturmamızda bize yardımcı olabilecek ek bilgiler. İsteğe bağlı. - Revolt\'u güvende tutmaya yardım ettiğiniz için teşekkür ederiz. Raporunuzu en kısa sürede inceleyeceğiz. + Peptide\'u güvende tutmaya yardım ettiğiniz için teşekkür ederiz. Raporunuzu en kısa sürede inceleyeceğiz. Belirtilen koda sahip bir davet bulunamadı. Material You bu cihazda desteklenmiyor. Takılmak, bir araya gelmek ve bir şeyler hakkında konuşmak için bir yer gibi. En iyi tarafı, internette olması. Üzgünüz, bu özellik henüz hazır değil. Bu kullanıcıyı raporlamak için zaman ayırdığınız için teşekkür ederiz. Raporunuz, kullanıcıyla veya sunucunun moderatörleriyle paylaşılmayacaktır. - Revolt, arkadaşlarınız ve topluluğunuzla her yerde, her zaman bağlantıda kalmanın en iyi yollarından biridir. + Peptide, arkadaşlarınız ve topluluğunuzla her yerde, her zaman bağlantıda kalmanın en iyi yollarından biridir. Diğerleri sizi bu isimle bulacak, tanıyacak ve anacaktır. Metin Kanalı Çıkış yaptın. Lütfen tekrar giriş yap. @@ -38,7 +38,7 @@ Tekrar Gönder E-posta gönder Şifreni mi unuttun\? - Revolt\'a Hoş Geldin + Peptide\'a Hoş Geldin E-posta Şifre Mailini kontrol et! @@ -50,7 +50,7 @@ Topluluk İlkeleri Topluluğunu bul, dünyayla bağlantı kur. Hadi gidelim - Bir şeyler hakkında sohbet etmek için Revolt\'u kullan. + Bir şeyler hakkında sohbet etmek için Peptide\'u kullan. Hadi seni hazırlayalım. E-posta adresini doğrula, ardından kullanıcı adını seçmeye geçelim. Kullanıcı adı seçme zamanı! @@ -203,7 +203,7 @@ Görünüm Tema Sistem - Revolt + Peptide Aydınlık Material You Materyal You (desteklenmeyen) @@ -229,18 +229,18 @@ Hayvanlar & Doğa Semboller Jenvolt\'a Katıl - Android\'te Revolt + Android\'te Peptide Bu projelerin geliştiricilerine, projelerini dünyaya sundukları için minnettarız. İnsanlar & Haller Arkadaşlar Gelen İstekler Giden İstekler Aktif Değil - Revolt bu harika açık kaynaklı projelerin yardımı ile oluşturuldu. + Peptide bu harika açık kaynaklı projelerin yardımı ile oluşturuldu. Aşağıdaki liste otomatik olarak oluşturulmuştur. Eksik veya hatalı bilgi içeriyor olabilir. Lisansı görüntülemek için dokunun Yüzler & Duygular - Revolt ekip üyesi + Peptide ekip üyesi Arkadaşlarda Ara Gün Doğum tarihini gir @@ -251,7 +251,7 @@ Aktif Bu linki insanlara gönder ve onları bu kanala davet et. Sil - Revolt ekibi tarafından ❤️ ile geliştirildi. + Peptide ekibi tarafından ❤️ ile geliştirildi. Görünmez Odak Rahatsız Etme @@ -314,7 +314,7 @@ %1$s\'den Özel bir sunucudan %1$s kanalının adı %2$s olarak değiştirildi - Revolt\'u her zamanki gibi kullanabileceksiniz, ancak diğer insanlara çevrimiçi olarak görünmeyeceksiniz. + Peptide\'u her zamanki gibi kullanabileceksiniz, ancak diğer insanlara çevrimiçi olarak görünmeyeceksiniz. Düz Metin Bu kanal silinmiş olabilir veya görüntüleme izniniz olmayabilir. Mesajlar için herhangi bir bildirim almayacaksınız, ancak @bahsetmeler için bildirim alacaksınız. @@ -350,7 +350,7 @@ Engelle Rapor et ID\'yi Kopyala - Revolt\'u Keşfet + Peptide\'u Keşfet Tut Açık kanal eylemleri Bu sunucu için henüz bir açıklama belirlenmemiş. @@ -391,8 +391,8 @@ Kanal Ayarları bu versiyon Kanalları ara - Lütfen Revolt\'ta paylaşmadan önce oturum açın. - Revolt\'ta paylaş + Lütfen Peptide\'ta paylaşmadan önce oturum açın. + Peptide\'ta paylaş Genel Bakış Dışa aktar Hata @@ -426,10 +426,10 @@ Birincil Olarak Birincil Kapsayıcı Sohbet - Geri bildirim veya önerilerde bulunmak ve hataları bildirmek için Revolt sunucusuna katılın. + Geri bildirim veya önerilerde bulunmak ve hataları bildirmek için Peptide sunucusuna katılın. Ne pişiriyor ✨ İzinler - Bu ek, Revolt için çok büyük (maks. $1$s). + Bu ek, Peptide için çok büyük (maks. $1$s). Kanalı Sil Bu kanalı silmek istediğinize emin misiniz\? Tüm mesajlar ve ayarlar bu kanal için sonsuza dek gidecek (uzun bir süre!) @@ -541,7 +541,7 @@ Profili paylaş Kullanıcı kartına bir göz at ve paylaşmak için özel bir bağlantı edin Değişiklik Günlüğü - Revolt asla uyumaz, nelerin yapıldığını görmek için bir göz at + Peptide asla uyumaz, nelerin yapıldığını görmek için bir göz at Geri bildirim sağlayın Söyleyecek bir şeyin mi var\? Hepimizin kulakları sende Genel bakış @@ -574,9 +574,9 @@ %1$d.Fotoğraf %1$d.Ad %1$d.Soyad - Revolt\'a şu tarihten beri üye: %1$d + Peptide\'a şu tarihten beri üye: %1$d [%1$s parçası] - Revolt klavye kısayollarına sahip! Onları görmek için %1$s tuşuna basınız. + Peptide klavye kısayollarına sahip! Onları görmek için %1$s tuşuna basınız. Kısayolları aç Pekâlâ Yeni Hat @@ -586,7 +586,7 @@ Test Kullanıcıları Sunucusuna Katılın Tamam Yeni Android uygulamamızı ilk deneyenlerden birisiniz Burada olmanızdan heyecan duyuyoruz! - Bu erken erişim olduğundan, işler henüz mükemmel olmayabilir. Ara sıra hatalarla karşılaşabilirsiniz. Geri bildiriminiz hataları düzeltmemize ve Revolt\'u daha da iyi hale getirmemize yardımcı olur. + Bu erken erişim olduğundan, işler henüz mükemmel olmayabilir. Ara sıra hatalarla karşılaşabilirsiniz. Geri bildiriminiz hataları düzeltmemize ve Peptide\'u daha da iyi hale getirmemize yardımcı olur. Anladım - Herhangi bir geri bildirimin, önerin veya hata bildirimin varsa lütfen bizi bundan haberdar et. Her zaman Revolt\'u iyileştirme peşindeyiz. + Herhangi bir geri bildirimin, önerin veya hata bildirimin varsa lütfen bizi bundan haberdar et. Her zaman Peptide\'u iyileştirme peşindeyiz. \ No newline at end of file diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index f6e91c9b..3d23584d 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -11,7 +11,7 @@ Натисніть для перепідключення Недостатній вік для використання платформи Будь-яка додаткова інформація, що може допомогти нам у розслідування. Не обов\'язково. - Дякуємо за те, що допомагаєте тримати Revolt в безпеці. Ми розглянемо вашу скаргу якнайшвидше. + Дякуємо за те, що допомагаєте тримати Peptide в безпеці. Ми розглянемо вашу скаргу якнайшвидше. Ви вже учасник цього серверу. Не вдалося знайти запрошення з таким кодом. Поділитися зображенням @@ -24,7 +24,7 @@ ID повідомлення скопійовано ID каналу скопійовано ID сервера скопійовано - Revolt — це один з найкращих шляхів залишатися на зв\'язку з друзями та спільнотою будь-де та будь-коли. + Peptide — це один з найкращих шляхів залишатися на зв\'язку з друзями та спільнотою будь-де та будь-коли. Проте, якщо ви зміните свою думку, ви завжди можете змінити його у своїх налаштуваннях. Це як місце, де можна позависати, зібратися гуртом та побалакати про всеньке. Найкраще те, що це в інтернеті. На цьому сервері зовсім відсутні канали. Нема навіть каналу з вітанням. Як грубо. @@ -57,9 +57,9 @@ Забули пароль\? Використовуєте менеджер паролів\? Забули свій пароль\? - Вітаємо у Revolt + Вітаємо у Peptide Отримуємо деяку інформацію, зачекайте… - Використовуйте Revolt для спілкування про будь-що. + Використовуйте Peptide для спілкування про будь-що. Електронна пошта Пароль Перевірте свою пошту! @@ -208,7 +208,7 @@ Загальне Зовнішній вигляд Тема - Revolt + Peptide Світла Чисто чорна Material You @@ -217,7 +217,7 @@ Невідоме повідомлення Особисті повідомлення Знайти сервери - Revolt побудований за допомогою цих чудових проєктів із відкритим вихідним кодом. + Peptide побудований за допомогою цих чудових проєктів із відкритим вихідним кодом. Останнє оновлення: %1$s Ми вдячні розробникам цих проєктів за те, що вони зробили свою роботу доступною для світу. Натисніть, щоб переглянути ліцензію @@ -233,7 +233,7 @@ Користувач приєднався Системне повідомлення Невидимий - Revolt на Android + Peptide на Android Версія Подробиці Вибір емодзі @@ -243,7 +243,7 @@ Об\'єкти Символи Прапори - Член команди Revolt + Член команди Peptide Друзі Вхідні запити Вихідні запити @@ -263,7 +263,7 @@ Не турбувати Ви не отримуватимете жодних повідомлень, в тому числі @згадування. Не в мережі - Ви зможете користуватися Revolt як зазвичай, але ви не будете відображатись онлайн для інших людей. + Ви зможете користуватися Peptide як зазвичай, але ви не будете відображатись онлайн для інших людей. Офіційний сервер Перевірений сервер Ви не можете переглядати цей канал @@ -320,7 +320,7 @@ ця версія Список змін для %1$s Значок каналу змінено - Створено з ❤️ для вас командою Revolt. + Створено з ❤️ для вас командою Peptide. Смайлики та емоції Люди та тіла Подорожі та місця @@ -367,7 +367,7 @@ Основний контейнер Сесія цього пристрою недоступна. Будь ласка, **увійдіть ще раз**, щоб побачити поточну сесію. Відкрийте для себе - Відкрийте Revolt + Відкрийте Peptide Розкажіть нам, що не так із цим сервером Вимагання чи шантаж Насильство, кроваві сцени або жорстоке поводження з тваринами @@ -392,7 +392,7 @@ Зворотна поверхня Зворотна поверхня При Помилці - Приєднуйтесь до сервера Revolt, щоб залишати відгуки, пропозиції та повідомляти про помилки. + Приєднуйтесь до сервера Peptide, щоб залишати відгуки, пропозиції та повідомляти про помилки. Позначити цей канал як NSFW\? Користувачам буде запропоновано підтвердити свій вік перед тим, як приєднатися до цього каналу. Позначити як NSFW @@ -434,7 +434,7 @@ Опис каналу Цей канал призначений виключно для розмови про… Позначити як NSFW - Це вкладення занадто велике для Revolt (максимум $1$). + Це вкладення занадто велике для Peptide (максимум $1$). Скрім Чат Смайлик за замовчуванням, який можна використовувати будь-де @@ -474,7 +474,7 @@ Залишити Приєднався Значки - Поділіться на Revolt - Будь ласка, авторизуйтесь, перш ніж ділитися на Revolt. + Поділіться на Peptide + Будь ласка, авторизуйтесь, перш ніж ділитися на Peptide. Це не є дійсним наміром поділитися. \ No newline at end of file diff --git a/app/src/main/res/values-v31/themes.xml b/app/src/main/res/values-v31/themes.xml index 8ecf0af9..bfa994a3 100644 --- a/app/src/main/res/values-v31/themes.xml +++ b/app/src/main/res/values-v31/themes.xml @@ -1,7 +1,7 @@ - \ No newline at end of file diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 0896eff1..48030049 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -16,8 +16,8 @@ 忘记密码? 正在使用密码管理器? 忘记密码了吗? - 欢迎来到 Revolt - 使用 Revolt 来谈天说地。 + 欢迎来到 Peptide + 使用 Peptide 来谈天说地。 这里是闲逛、聚会和聊天的场所。最棒的一点是,一切都在互联网上。 电子邮箱 我们会给您发送一封验证邮件以确认您的账户。 @@ -135,7 +135,7 @@ 提交 正在举报… 已举报 - 感谢您协助保护 Revolt 的安全。我们将尽快审核您的举报。 + 感谢您协助保护 Peptide 的安全。我们将尽快审核您的举报。 错误 在提交您的举报时,发生了一个错误。请稍后再试。 您要屏蔽这个用户吗? @@ -164,14 +164,14 @@ 杂项 主题 系统 - Revolt + Peptide 明亮 纯黑 Material You(不支持) 此设备不支持“Material You”。 服务条款 寻找您的社区,与世界相连接。 - Revolt 是与您的朋友和社区随时随地保持联络的最佳方式之一。 + Peptide 是与您的朋友和社区随时随地保持联络的最佳方式之一。 密码 重新发送 让我们为您登录 @@ -217,7 +217,7 @@ 外观 Material You 反馈 - 由 Revolt 团队用 ❤️ 为您呈现。 + 由 Peptide 团队用 ❤️ 为您呈现。 版本 详情 下面的列表是自动生成的。可能会不完整或不准确。 @@ -231,7 +231,7 @@ 符号 旗帜 平台管理员 - Revolt 团队成员 + Peptide 团队成员 加入 Jenvolt 好友 收到的请求 @@ -294,7 +294,7 @@ 无法向此用户发送私信。 此用户可能已被删除或者您没有权限查看。 复制 ID - Revolt on Android + Peptide on Android 笑脸和表情 食品与饮料 Jenvolt 是由开发者运营的空间,包含有关 Android 应用的各种内容。也用于提供支持和反馈。也许您还能体验到新功能!👀 @@ -303,12 +303,12 @@ 用户已踢出 离开 您不会收到任何消息的通知,但可以收到 @提及 的通知。 - 您可以照常使用 Revolt,但其他人不会看到您在线。 + 您可以照常使用 Peptide,但其他人不会看到您在线。 添加成员 %1$s 更改了频道简介 此服务器还没有设置简介。 悄悄离开 - Revolt 的诞生离不开这些优秀开源项目的帮助。 + Peptide 的诞生离不开这些优秀开源项目的帮助。 我们非常感谢这些项目的开发者将他们的工作成果奉献给全世界。 最后更新:%1$s 系统消息 @@ -384,7 +384,7 @@ 发现 告诉我们这条消息有什么问题 未经允许的广告或垃圾信息 - 发现 Revolt + 发现 Peptide 告诉我们这个服务器有什么问题 告诉我们这名用户有什么问题 毒品或其他违禁品 @@ -411,11 +411,11 @@ 关闭 邀请至 #%1$s 发送此链接以邀请其他人到此频道。 - 请先登录再分享到 Revolt。 - 此附件对于 Revolt 来说过大(最大为 $1$s)。 + 请先登录再分享到 Peptide。 + 此附件对于 Peptide 来说过大(最大为 $1$s)。 搜索频道 请选择要分享到的频道。 - 分享到 Revolt + 分享到 Peptide 这不是有效的分享 Intent。 此频道被标记为工作场所不宜 继续 @@ -434,7 +434,7 @@ 您不能在 %1$d 之前出生。 删除 保留 - 加入 Revolt 服务器来提出反馈建议和报告错误。 + 加入 Peptide 服务器来提出反馈建议和报告错误。 新群组 创建新群组 这是个机器人。它很有主见。 @@ -550,7 +550,7 @@ 分享个人资料 查看您的用户卡片并获取特殊的分享链接 更新记录 - Revolt 从未停歇,看看我们更新了什么 + Peptide 从未停歇,看看我们更新了什么 提供反馈 想表达看法?我们在倾听 您发现了一个 Webhook! @@ -564,14 +564,14 @@ 分享您的用户卡片时发生了一个错误。 %1$d.名称 %1$d.用户名 - %1$d.加入 Revolt 时间 + %1$d.加入 Peptide 时间 %1$d.二维码 %1$d.照片 在您登录时出现了问题 您可能已经在另一个设备上登出,或者您的互联网连接已断开。 [%1$s 片段] 正在使用键盘? - Revolt 支持键盘快捷键!按下 %1$s 来查看。 + Peptide 支持键盘快捷键!按下 %1$s 来查看。 消息 发送消息 打开快捷键 @@ -582,19 +582,19 @@ 换行 欢迎参与抢先体验!🚀 您是第一批试用我们全新 Android 应用程序的用户。很高兴有您的参与! - 因为是抢先体验,所以一些功能还不完善。您可能会偶尔遇到错误、崩溃或奇怪的行为。您的反馈能帮助我们打磨 Revolt,让它变得更好。 + 因为是抢先体验,所以一些功能还不完善。您可能会偶尔遇到错误、崩溃或奇怪的行为。您的反馈能帮助我们打磨 Peptide,让它变得更好。 我们很荣幸有您的加入。我们可以一起取得成就! 了解 我们热爱反馈! - 如果您有任何反馈、建议或错误报告,请告诉我们。我们始终致力于改进 Revolt。 + 如果您有任何反馈、建议或错误报告,请告诉我们。我们始终致力于改进 Peptide。 在 Google Play 上评价 加入测试者服务器 完成 通知 服务器排序 - Revolt for Android + Peptide for Android %1$s(未知) 提示 - 您的部分 Revolt 设置已损坏。这可能是第三方客户端导致的。受影响的设置有: + 您的部分 Peptide 设置已损坏。这可能是第三方客户端导致的。受影响的设置有: 重置 %1$s 设置 \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index cee96118..7e10feee 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,5 +1,5 @@ - Revolt + Peptide ← Back Next → @@ -17,6 +17,7 @@ Privacy Policy Community Guidelines Message Friends + Message Empty Messages Sad Image It\'s Quiet Here... Find friends to chat with or create a group conversation. @@ -54,8 +55,8 @@ Forgot your password? Enter your email and we\'ll send you instructions on how to reset your password. - Welcome to Revolt - Use Revolt to chat about stuff. + Welcome to Peptide + Use Peptide to chat about stuff. It\'s like a place to hang out, get together, and talk about stuff. Best part, it\'s on the internet. Make it Official! New Here? Let’s Get You Set Up! @@ -93,13 +94,13 @@ Enter your password to continue. About - Revolt on Android - Brought to you with ❤️ by the Revolt team. + Peptide on Android + Brought to you with ❤️ by the Peptide team. Version Details OSS Attribution - Revolt is built with the help of these awesome open-source projects. + Peptide is built with the help of these awesome open-source projects. We\'re grateful to the developers of these projects for making their work available to the world. The list below is automatically generated. It may be incomplete or inaccurate. Last updated: %1$s @@ -141,7 +142,7 @@ Bot From linked channel Platform moderation - Revolt team member + Peptide team member Webhook Unknown @@ -161,7 +162,7 @@ Share Profile Take a look at your user card and get a special link to share Changelog - Revolt never sleeps, take a look to see what\'s been in the works + Peptide never sleeps, take a look to see what\'s been in the works Provide Feedback Got something to say? We\'re all ears @@ -169,7 +170,7 @@ An error occurred while sharing your user card. %1$d.Name %1$d.Username - %1$d.On Revolt Since + %1$d.On Peptide Since %1$d.QR Code %1$d.Photo @@ -182,7 +183,7 @@ New group Scan QR code Invalid QR code - This is not a valid Revolt QR code. + This is not a valid Peptide QR code. Missing camera permission You need to grant the camera permission to scan QR codes. Add friend? @@ -312,7 +313,7 @@ You will not receive any notifications, including messages and @mentions. Offline Invisible - You will be able to use Revolt as usual, but you will not appear as online to other people. + You will be able to use Peptide as usual, but you will not appear as online to other people. What\'s up? Status text Your status text will be visible to everyone. Keep it short and sweet. @@ -429,7 +430,7 @@ This user\'s bio could not be fetched. Please verify you share a server or are friends. Roles Joined - Revolt + Peptide Badges Owner Could not fetch owner information @@ -475,7 +476,7 @@ Examples of invite codes include: rvlt.gg/Testers Testers - app.revolt.chat/invite/Testers + app.peptide.chat/invite/Testers Invite code or link Join Create a Server @@ -485,8 +486,15 @@ Server name can be up to %1$d characters in length. An error occurred while creating your server. Please try again later. Create + Add to server + Invite code or link + Invite code or link + Join + Create a new server + Create a new server + This feature is currently under construction. - Discover Revolt + Discover Peptide Report Cancel @@ -534,7 +542,7 @@ Reporting… Reported - Thank you for helping to keep Revolt safe. We will review your report as soon as possible. + Thank you for helping to keep Peptide safe. We will review your report as soon as possible. Error An error occurred while submitting your report. Please try again later. @@ -643,23 +651,30 @@ Not now Using a keyboard? - Revolt has keyboard shortcuts! Press %1$s to see them. + Peptide has keyboard shortcuts! Press %1$s to see them. Open shortcuts Alright Welcome to Early Access! 🚀 You\'re one of the first to try out our new Android app. We\'re excited to have you here! - Since this is early access, things might not be perfect just yet. You might run into the occasional bug, crash, or weird quirk. Your feedback helps us smooth out the rough edges and make Revolt even better. + Since this is early access, things might not be perfect just yet. You might run into the occasional bug, crash, or weird quirk. Your feedback helps us smooth out the rough edges and make Peptide even better. We\'re thrilled to have you on board. Let\'s make something great together! Got it + + Use default + Muted + All messages + Mentions only + None + Swipe to Reply is here. Making message threads has never been easier.\nJust swipe to the left on any message.\nReply up to five messages at once. Got it Customise Quick Reply We love feedback! - If you have any feedback, suggestions, or bug reports, please let us know. We\'re always looking to improve Revolt. + If you have any feedback, suggestions, or bug reports, please let us know. We\'re always looking to improve Peptide. Rate on Google Play Join Testers Server Done @@ -671,7 +686,7 @@ Account General Miscellaneous - Revolt v%1$s + Peptide v%1$s Profile Profile picture @@ -692,10 +707,10 @@ Appearance Theme System - Revolt + Peptide Light Pure Black - Material You + Material Material You (unsupported) Material You is not supported on this device. @@ -747,15 +762,15 @@ YouTube Apple Music Hint - Some of your Revolt settings are corrupted. This may be due to the use of third-party clients. The affected settings are: + Some of your Peptide settings are corrupted. This may be due to the use of third-party clients. The affected settings are: Notifications Server Ordering - Revolt for Android + Peptide for Android %1$s (unknown) Reset %1$s settings Feedback - Join the Revolt server to give feedback or suggestions and report bugs. + Join the Peptide server to give feedback or suggestions and report bugs. Changelogs What\'s been cooking ✨ @@ -791,10 +806,10 @@ Delete Keep - Share to Revolt - Please log in before sharing to Revolt. + Share to Peptide + Please log in before sharing to Peptide. This is not a valid share intent. - This attachment is too large for Revolt (max. $1$s). + This attachment is too large for Peptide (max. $1$s). Search channels Select a channel to share to. @@ -809,7 +824,7 @@ Not available in your region Unavailable channel - Revolt may block content in certain jurisdictions in response to legislation or legal notices + Peptide may block content in certain jurisdictions in response to legislation or legal notices This channel is not available in your region while we review options on legal compliance. Acknowledge diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 27cdad54..3b0ff957 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -1,27 +1,27 @@ - - - - \ No newline at end of file diff --git a/app/src/main/sqldelight/chat/revolt/persistence/cache/Channel.sq b/app/src/main/sqldelight/chat/peptide/persistence/cache/Channel.sq similarity index 100% rename from app/src/main/sqldelight/chat/revolt/persistence/cache/Channel.sq rename to app/src/main/sqldelight/chat/peptide/persistence/cache/Channel.sq diff --git a/app/src/main/sqldelight/chat/revolt/persistence/cache/Server.sq b/app/src/main/sqldelight/chat/peptide/persistence/cache/Server.sq similarity index 100% rename from app/src/main/sqldelight/chat/revolt/persistence/cache/Server.sq rename to app/src/main/sqldelight/chat/peptide/persistence/cache/Server.sq diff --git a/docs/astro.config.mjs b/docs/astro.config.mjs index 9d925410..5005be3d 100644 --- a/docs/astro.config.mjs +++ b/docs/astro.config.mjs @@ -4,13 +4,13 @@ import markdownIntegration from "@astropub/md" // https://astro.build/config export default defineConfig({ - site: "https://revoltchat.github.io", + site: "https://peptidechat.github.io", base: "/android", integrations: [ starlight({ - title: "Revolt on Android Technical Documentation", + title: "Peptide on Android Technical Documentation", social: { - github: "https://github.com/revoltchat/android", + github: "https://github.com/peptidechat/android", }, sidebar: [ { diff --git a/docs/src/content/changelogs/1002000.md b/docs/src/content/changelogs/1002000.md index 3ef89e73..763dcc11 100644 --- a/docs/src/content/changelogs/1002000.md +++ b/docs/src/content/changelogs/1002000.md @@ -26,7 +26,7 @@ version. You might have noticed that the good ol' grid-o-images that we used to have for picking images has suddenly disappeared by a new and confusing picker picker, something like this: -![Image Picker](https://autumn.revolt.chat/attachments/DH2pQiE_XbyUE5gpQYTIgPcUmVZ49xSaR3jrloELY9) +![Image Picker](https://autumn.peptide.chat/attachments/DH2pQiE_XbyUE5gpQYTIgPcUmVZ49xSaR3jrloELY9) Sure enough, the rightmost two buttons seem self-explanatory. **Files** lets you pick any file on your device, and **Camera** lets you take a picture. But what about the leftmost button? The big @@ -67,7 +67,7 @@ that tablets exist, and the sidebar is optimized for them too. Here's a screenshot of the new sidebar: -![Sidebar](https://autumn.revolt.chat/attachments/rqo986CIx22IE_Z6fRx-UP1rLpQQBCJX9uxqnnlhUx) +![Sidebar](https://autumn.peptide.chat/attachments/rqo986CIx22IE_Z6fRx-UP1rLpQQBCJX9uxqnnlhUx) ## Bottom Sheet Aesthetic Fix @@ -81,6 +81,6 @@ came rather than chilling at the bottom of the screen for a second. That's all for this update. We hope you enjoy the new features and improvements. As always, if you have any feedback, feel free to let us know in the channels on Jenvolt (the invite you shall find on the app's "Home" screen or [by clicking here for free](https://rvlt.gg/jen)). We're always -listening and we're always working to make Revolt on Android better. +listening and we're always working to make Peptide on Android better. We'll see you in the next update! \ No newline at end of file diff --git a/docs/src/content/changelogs/1002001.md b/docs/src/content/changelogs/1002001.md index 1cd6d841..89c2b7ad 100644 --- a/docs/src/content/changelogs/1002001.md +++ b/docs/src/content/changelogs/1002001.md @@ -15,7 +15,7 @@ This update brings you a brand new colour picker, and it's a doozy. ## Colour Picker -At Revolt, we've always been a bit more about customisation than the other guys. And what's more +At Peptide, we've always been a bit more about customisation than the other guys. And what's more customisable than colours? This is why we've been shipping Material You support since our very first internal builds. @@ -30,13 +30,13 @@ ground up, built to compete with what the iOS team has recently built into their Of course, team iOS is at an advantage here, because they have a system-wide colour picker. Android historically hasn't had one, so we had to build our own. Here's our new colour picker: -![Sliders tab](https://autumn.revolt.chat/attachments/fFmNZinvfdWroWWfLEEC5yF7G3MrIS0x09K2AN6DeT) +![Sliders tab](https://autumn.peptide.chat/attachments/fFmNZinvfdWroWWfLEEC5yF7G3MrIS0x09K2AN6DeT) The new colour picker has three tabs: **Sliders**, **Palette**, and **Hex**. The **Sliders** tab lets you pick colours using HSV sliders, which is especially helpful for picking colours that are harmonious with each other, which you probably want to do if you're customising the app's colours. -![Palette tab](https://autumn.revolt.chat/attachments/vQXKvZikyoEBN6fBGLjHj_DKQJ9XN12s_H9-7hMrB4) +![Palette tab](https://autumn.peptide.chat/attachments/vQXKvZikyoEBN6fBGLjHj_DKQJ9XN12s_H9-7hMrB4) The **Palette** tab lets you pick colours from a predefined palette. This is especially helpful if you're not sure what colours you want to use, or if you're just looking for a quick colour to use. @@ -44,7 +44,7 @@ Our palette is from the fine folks at [Tailwind CSS](https://tailwindcss.com/) a carefully curated to give you a wide range of colours to choose from. Round of applause for Team Tailwind! 👏 -![Hex tab](https://autumn.revolt.chat/attachments/-fA87N8uDyytFTDQ2eEG_22M3n9SyaBsWA_5Z63WwV) +![Hex tab](https://autumn.peptide.chat/attachments/-fA87N8uDyytFTDQ2eEG_22M3n9SyaBsWA_5Z63WwV) The **Hex** tab lets you input colours using hex codes. This is especially helpful if you have a specific colour in mind, or if you're importing a theme from elsewhere. diff --git a/docs/src/content/changelogs/1003000.md b/docs/src/content/changelogs/1003000.md index d659a33e..3143e4e4 100644 --- a/docs/src/content/changelogs/1003000.md +++ b/docs/src/content/changelogs/1003000.md @@ -19,4 +19,4 @@ Highlights include: has been fixed. For a full list of changes, see -the [complete changelog](https://revolt.chat/updates/android-january2025) on our revamped website! \ No newline at end of file +the [complete changelog](https://peptide.chat/updates/android-january2025) on our revamped website! \ No newline at end of file diff --git a/docs/src/content/docs/beta/availability-regions.md b/docs/src/content/docs/beta/availability-regions.md index 11b658b4..b065bcfa 100644 --- a/docs/src/content/docs/beta/availability-regions.md +++ b/docs/src/content/docs/beta/availability-regions.md @@ -1,10 +1,10 @@ --- title: Geographic Availability of the Beta Test -description: Find out where you can join the beta test for Revolt on Android. +description: Find out where you can join the beta test for Peptide on Android. template: doc --- -The beta test for Revolt on Android is available for testers in the following jurisdictions: +The beta test for Peptide on Android is available for testers in the following jurisdictions: - Armenia - Australia diff --git a/docs/src/content/docs/beta/joining-the-public-beta-test.md b/docs/src/content/docs/beta/joining-the-public-beta-test.md index 75754a0b..2f98d56b 100644 --- a/docs/src/content/docs/beta/joining-the-public-beta-test.md +++ b/docs/src/content/docs/beta/joining-the-public-beta-test.md @@ -1,20 +1,20 @@ --- title: Joining the Public Beta Test -description: Learn how to join the public beta test for Revolt for Android. +description: Learn how to join the public beta test for Peptide for Android. template: doc --- -The public beta test for Revolt for Android is available to anyone with an Android device -in [those jurisdictions](https://revoltchat.github.io/android/beta/availability-regions/) where the +The public beta test for Peptide for Android is available to anyone with an Android device +in [those jurisdictions](https://peptidechat.github.io/android/beta/availability-regions/) where the beta test is available. The beta test is open to everyone, and you can join the beta test by following these steps: -1. [Join the Revolt for Android Alpha Track on Google Groups](https://groups.google.com/g/revolt-android-alpha-track). -2. [Opt-in to the Revolt for Android Beta Test on Google Play](https://play.google.com/apps/testing/chat.revolt). -3. [Download Revolt for Android from Google Play](https://play.google.com/store/apps/details?id=chat.revolt). +1. [Join the Peptide for Android Alpha Track on Google Groups](https://groups.google.com/g/peptide-android-alpha-track). +2. [Opt-in to the Peptide for Android Beta Test on Google Play](https://play.google.com/apps/testing/chat.peptide). +3. [Download Peptide for Android from Google Play](https://play.google.com/store/apps/details?id=chat.peptide). -You're all set! You can now use Revolt on Android and help us test new features and improvements. +You're all set! You can now use Peptide on Android and help us test new features and improvements. If you encounter any issues or have any feedback, please let us know by [reporting an issue](https://androidtasks.starlightjen.com/) -or [joining the Revolt Developers server](https://rvlt.gg/api). \ No newline at end of file +or [joining the Peptide Developers server](https://rvlt.gg/api). \ No newline at end of file diff --git a/docs/src/content/docs/contributing/guidelines.md b/docs/src/content/docs/contributing/guidelines.md index faa5727c..77b6a2fe 100644 --- a/docs/src/content/docs/contributing/guidelines.md +++ b/docs/src/content/docs/contributing/guidelines.md @@ -1,21 +1,21 @@ --- title: Contribution Guidelines -description: Read the guidelines before setting out to contribute to Revolt on Android. +description: Read the guidelines before setting out to contribute to Peptide on Android. template: doc --- -This page contains the guidelines for contributing to Revolt on Android. These guidelines are +This page contains the guidelines for contributing to Peptide on Android. These guidelines are important to ensure that your contribution is accepted and merged into the main codebase. :::danger -Make sure you read these guidelines _before starting to contribute_ to Revolt on Android. +Make sure you read these guidelines _before starting to contribute_ to Peptide on Android. If you do not follow these guidelines, your contribution may be rejected! ::: ## Before You Start - Make sure you have read - the [Code of Conduct](https://github.com/revoltchat/.github/blob/master/.github/CODE_OF_CONDUCT.md) + the [Code of Conduct](https://github.com/peptidechat/.github/blob/master/.github/CODE_OF_CONDUCT.md) before contributing. You must follow it at all times. Before you start contributing, you first need to know what to contribute. Based on that, you must @@ -23,7 +23,7 @@ make a decision: :::tip[Translation] If you want to contribute to translations, you can do so by -visiting [Weblate](https://translate.revolt.chat/projects/revolt/android/). +visiting [Weblate](https://translate.peptide.chat/projects/peptide/android/). ::: #### I want to fix a bug @@ -42,13 +42,13 @@ If you are fixing a bug, you must follow these guidelines: you are adding a feature, you must follow these guidelines: - The feature must be useful to a wide variety of users. -- UI/UX is centrally managed by Revolt's design team. Make sure your feature aligns closely with the +- UI/UX is centrally managed by Peptide's design team. Make sure your feature aligns closely with the current design as well as [Material 3](https://m3.material.io/). - If you need any new UI, you are recommended to request a design from the design team and implement it as per the design. If your UI/UX is not up to the mark, your PR may be rejected by the design team. - The feature must not be a duplicate of an existing feature. -- If you are adding a new feature, you should consult with the Android team at Revolt to make sure +- If you are adding a new feature, you should consult with the Android team at Peptide to make sure that the feature is not already in development or planned for the future. Conflicting features will not be merged. diff --git a/docs/src/content/docs/contributing/setup.mdx b/docs/src/content/docs/contributing/setup.mdx index e69c28a3..d01dba45 100644 --- a/docs/src/content/docs/contributing/setup.mdx +++ b/docs/src/content/docs/contributing/setup.mdx @@ -1,10 +1,10 @@ --- title: Setting up your Development Environment -description: A guide to setting up your development environment for Revolt on Android. +description: A guide to setting up your development environment for Peptide on Android. template: doc --- -This page contains the guidelines for setting up your development environment for Revolt on Android. These guidelines are important to ensure that your development environment is set up correctly and you can start contributing to the project. +This page contains the guidelines for setting up your development environment for Peptide on Android. These guidelines are important to ensure that your development environment is set up correctly and you can start contributing to the project. If you want to compile the app for yourself, you can also follow these guidelines, however you may not need Android Studio and it may be possible to build the app using the command line, out of the scope of this guide. @@ -85,7 +85,7 @@ import { Tabs, TabItem, Steps } from "@astrojs/starlight/components" 4. Clone the repository. ```sh - git clone --recursive https://github.com/revoltchat/android.git + git clone --recursive https://github.com/peptidechat/android.git ``` Specify `--recursive` to ensure that submodules are cloned as well. @@ -105,13 +105,13 @@ import { Tabs, TabItem, Steps } from "@astrojs/starlight/components" deno run -A scripts/download_deps.ts ``` -8. Copy the `revoltbuild.properties.example` file to `revoltbuild.properties` and fill in the required values. +8. Copy the `peptidebuild.properties.example` file to `peptidebuild.properties` and fill in the required values. ```sh - cp revoltbuild.properties.example revoltbuild.properties + cp peptidebuild.properties.example peptidebuild.properties ``` - The `revoltbuild.properties` file contains the following properties: + The `peptidebuild.properties` file contains the following properties: | Property | Description | | ------------------------ | ---------------------------------------------- | @@ -142,6 +142,6 @@ import { Tabs, TabItem, Steps } from "@astrojs/starlight/components" You can build the project by clicking on the 'Run' button in Android Studio. If asked, build the `:app` module. -11. **You're all set!** You can now start contributing to Revolt on Android. +11. **You're all set!** You can now start contributing to Peptide on Android. diff --git a/docs/src/content/docs/index.mdx b/docs/src/content/docs/index.mdx index 3acfc02a..0e50c2e1 100644 --- a/docs/src/content/docs/index.mdx +++ b/docs/src/content/docs/index.mdx @@ -1,6 +1,6 @@ --- -title: Revolt on Android — Technical Documentation -description: A guide to getting started with Revolt on Android. +title: Peptide on Android — Technical Documentation +description: A guide to getting started with Peptide on Android. template: splash hero: image: diff --git a/sentry.properties.example b/sentry.properties.example index ada0775e..fe482266 100644 --- a/sentry.properties.example +++ b/sentry.properties.example @@ -1,4 +1,4 @@ defaults.url=https://sentry.actual.tld -defaults.project=not-revolt +defaults.project=not-peptide defaults.org=generic-chat-platform-inc auth.token= \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 88c92ff9..be0ef9cc 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -27,5 +27,5 @@ dependencyResolutionManagement { } } } -rootProject.name = "Revolt" +rootProject.name = "PepChat" include(":app")