From 9332dfddc62a212f38ff674f3381fc7161fb4829 Mon Sep 17 00:00:00 2001 From: sneazy-ibo <41344259+sneazy-ibo@users.noreply.github.com> Date: Thu, 13 Jun 2024 03:18:04 +0200 Subject: [PATCH] fix: mutation variable --- .../connections/anilist/AnilistMutations.kt | 27 +++++++++--- .../ani/dantotsu/profile/ProfileActivity.kt | 44 +++++++++++-------- 2 files changed, 45 insertions(+), 26 deletions(-) diff --git a/app/src/main/java/ani/dantotsu/connections/anilist/AnilistMutations.kt b/app/src/main/java/ani/dantotsu/connections/anilist/AnilistMutations.kt index e207eee9..497b59e0 100644 --- a/app/src/main/java/ani/dantotsu/connections/anilist/AnilistMutations.kt +++ b/app/src/main/java/ani/dantotsu/connections/anilist/AnilistMutations.kt @@ -154,16 +154,29 @@ class AnilistMutations { } suspend fun saveUserAvatar(base64Avatar: String): JsonObject? { - val query = "mutation(\$avatar: String) { SaveUserAvatar(avatar: \$avatar) { id avatar { large medium } } }" - val variables = """{"avatar":"$base64Avatar"}""" - return executeQuery(query, variables) - } + val imageFormat = getImageFormat(base64Avatar) + val base64WithPrefix = "data:image/$imageFormat;base64,${base64Avatar.removePrefix("data:image/$imageFormat;base64,")}" + val query = "mutation(\$avatar: String) { SaveUserAvatar(avatar: \$avatar) { id avatar { large medium } } }" + val variables = """{"avatar":"$base64WithPrefix"}""" + return executeQuery(query, variables) + } suspend fun saveUserBanner(base64Banner: String): JsonObject? { - val query = "mutation(\$banner: String) { SaveUserBanner(banner: \$banner) { id bannerImage } }" - val variables = """{"banner":"$base64Banner"}""" - return executeQuery(query, variables) + val imageFormat = getImageFormat(base64Banner) + val base64WithPrefix = "data:image/$imageFormat;base64,${base64Banner.removePrefix("data:image/$imageFormat;base64,")}" + val query = "mutation(\$banner: String) { SaveUserBanner(banner: \$banner) { id bannerImage } }" + val variables = """{"banner":"$base64WithPrefix"}""" + return executeQuery(query, variables) + } + + private fun getImageFormat(base64String: String): String { + val prefix = base64String.substringBefore(",").substringAfterLast(":") + return when (prefix) { + "jpeg" -> "jpeg" + "png" -> "png" + else -> "jpeg" } + } private fun String.stringSanitizer(): String { val sb = StringBuilder() diff --git a/app/src/main/java/ani/dantotsu/profile/ProfileActivity.kt b/app/src/main/java/ani/dantotsu/profile/ProfileActivity.kt index e74868d4..2275c8f4 100644 --- a/app/src/main/java/ani/dantotsu/profile/ProfileActivity.kt +++ b/app/src/main/java/ani/dantotsu/profile/ProfileActivity.kt @@ -28,7 +28,6 @@ import androidx.viewpager2.adapter.FragmentStateAdapter import ani.dantotsu.R import ani.dantotsu.blurImage import ani.dantotsu.connections.anilist.Anilist -import ani.dantotsu.connections.anilist.Anilist.executeQuery import ani.dantotsu.connections.anilist.api.Query import ani.dantotsu.databinding.ActivityProfileBinding import ani.dantotsu.databinding.ItemProfileAppBarBinding @@ -47,7 +46,6 @@ import ani.dantotsu.statusBarHeight import ani.dantotsu.themes.ThemeManager import ani.dantotsu.toast import com.google.android.material.appbar.AppBarLayout -import com.google.gson.JsonObject import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -308,7 +306,7 @@ class ProfileActivity : AppCompatActivity(), AppBarLayout.OnOffsetChangedListene registerForActivityResult(ActivityResultContracts.PickVisualMedia()) { uri: Uri? -> if (uri != null) { val bitmap = getBitmapFromUri(uri) - uploadAvatar(bitmap) + bindingProfileAppBar.profileUserAvatar.setImageBitmap(bitmap) } } @@ -316,7 +314,7 @@ class ProfileActivity : AppCompatActivity(), AppBarLayout.OnOffsetChangedListene registerForActivityResult(ActivityResultContracts.PickVisualMedia()) { uri: Uri? -> if (uri != null) { val bitmap = getBitmapFromUri(uri) - uploadBanner(bitmap) + bindingProfileAppBar.profileBannerImage.setImageBitmap(bitmap) } } @@ -336,8 +334,19 @@ class ProfileActivity : AppCompatActivity(), AppBarLayout.OnOffsetChangedListene return image } + private fun saveProfileImages() { + val avatarBitmap = (bindingProfileAppBar.profileUserAvatar.drawable as? BitmapDrawable)?.bitmap + val bannerBitmap = (bindingProfileAppBar.profileBannerImage.drawable as? BitmapDrawable)?.bitmap + + if (avatarBitmap != null && bannerBitmap != null) { + uploadAvatar(avatarBitmap) + uploadBanner(bannerBitmap) + } else { + toast("Please select both avatar and banner images") + } + } + private fun uploadAvatar(bitmap: Bitmap) { - bindingProfileAppBar.profileUserAvatar.setImageBitmap(bitmap) val base64Avatar = bitmapToBase64(bitmap) lifecycleScope.launch(Dispatchers.IO) { val response = Anilist.mutation.saveUserAvatar(base64Avatar) @@ -348,7 +357,6 @@ class ProfileActivity : AppCompatActivity(), AppBarLayout.OnOffsetChangedListene } private fun uploadBanner(bitmap: Bitmap) { - bindingProfileAppBar.profileBannerImage.setImageBitmap(bitmap) val base64Banner = bitmapToBase64(bitmap) lifecycleScope.launch(Dispatchers.IO) { val response = Anilist.mutation.saveUserBanner(base64Banner) @@ -358,12 +366,17 @@ class ProfileActivity : AppCompatActivity(), AppBarLayout.OnOffsetChangedListene } } - private fun saveProfileImages() { - val avatarBitmap = (bindingProfileAppBar.profileUserAvatar.drawable as BitmapDrawable).bitmap - val bannerBitmap = (bindingProfileAppBar.profileBannerImage.drawable as BitmapDrawable).bitmap - uploadAvatar(avatarBitmap) - uploadBanner(bannerBitmap) - toast("Uploading avatar and banner images...") + private fun bitmapToBase64(bitmap: Bitmap): String { + val outputStream = ByteArrayOutputStream() + bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream) + val base64 = Base64.encodeToString(outputStream.toByteArray(), Base64.NO_WRAP) + val imageFormat = when (bitmap.config) { + Bitmap.Config.ARGB_8888 -> "png" + Bitmap.Config.RGB_565 -> "png" + Bitmap.Config.ALPHA_8 -> "png" + else -> "jpeg" + } + return "data:image/$imageFormat;base64,$base64" } private fun handleApiResponse(response: kotlinx.serialization.json.JsonObject?, type: String) { @@ -376,13 +389,6 @@ class ProfileActivity : AppCompatActivity(), AppBarLayout.OnOffsetChangedListene } } - private fun bitmapToBase64(bitmap: Bitmap): String { - val outputStream = ByteArrayOutputStream() - bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream) - return Base64.encodeToString(outputStream.toByteArray(), Base64.NO_WRAP) - } - - private var isCollapsed = false private val percent = 65 private var mMaxScrollSize = 0