From fa55acf7709c7171fce7138019333180aeff87ac Mon Sep 17 00:00:00 2001 From: sneazy-ibo <41344259+sneazy-ibo@users.noreply.github.com> Date: Mon, 1 Jul 2024 22:53:08 +0200 Subject: [PATCH] feat(ALsettings): functional backend --- app/src/main/AndroidManifest.xml | 3 + .../connections/anilist/AnilistMutations.kt | 275 +++++++++++++++--- .../connections/anilist/AnilistQueries.kt | 38 ++- .../dantotsu/connections/anilist/api/User.kt | 32 +- .../settings/SettingsAnilistActivity.kt | 132 +++++++-- .../dantotsu/settings/saving/Preferences.kt | 10 + .../res/layout/activity_settings_anilist.xml | 41 ++- app/src/main/res/values/strings.xml | 12 +- 8 files changed, 470 insertions(+), 73 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4c267042..ce03636e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -159,6 +159,9 @@ + 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 3d7ac85e..6d3256de 100644 --- a/app/src/main/java/ani/dantotsu/connections/anilist/AnilistMutations.kt +++ b/app/src/main/java/ani/dantotsu/connections/anilist/AnilistMutations.kt @@ -10,9 +10,80 @@ import kotlinx.serialization.json.JsonObject class AnilistMutations { + suspend fun updateSettings( + timezone: String? = null, + titleLanguage: String? = null, + staffNameLanguage: String? = null, + activityMergeTime: Int? = null, + airingNotifications: Boolean? = null, + displayAdultContent: Boolean? = null, + restrictMessagesToFollowing: Boolean? = null + ) { + val query = """ + mutation ( + ${"$"}timezone: String, + ${"$"}titleLanguage: UserTitleLanguage, + ${"$"}staffNameLanguage: UserStaffNameLanguage, + ${"$"}activityMergeTime: Int, + ${"$"}airingNotifications: Boolean, + ${"$"}displayAdultContent: Boolean + ${"$"}restrictMessagesToFollowing: Boolean + ) { + UpdateUser( + timezone: ${"$"}timezone, + titleLanguage: ${"$"}titleLanguage, + staffNameLanguage: ${"$"}staffNameLanguage, + activityMergeTime: ${"$"}activityMergeTime, + airingNotifications: ${"$"}airingNotifications, + displayAdultContent: ${"$"}displayAdultContent + restrictMessagesToFollowing: ${"$"}restrictMessagesToFollowing + ) { + id + options { + timezone + titleLanguage + staffNameLanguage + activityMergeTime + airingNotifications + displayAdultContent + restrictMessagesToFollowing + } + } + } + """.trimIndent() + + val variables = """ + { + ${timezone?.let { """"timezone":"$it"""" } ?: ""} + ${titleLanguage?.let { """"titleLanguage":"$it"""" } ?: ""} + ${staffNameLanguage?.let { """"staffNameLanguage":"$it"""" } ?: ""} + ${activityMergeTime?.let { """"activityMergeTime":$it""" } ?: ""} + ${airingNotifications?.let { """"airingNotifications":$it""" } ?: ""} + ${displayAdultContent?.let { """"displayAdultContent":$it""" } ?: ""} + ${restrictMessagesToFollowing?.let { """"restrictMessagesToFollowing":$it""" } ?: ""} + } + """.trimIndent().replace("\n", "").replace(""" """, "").replace(",}", "}") + + executeQuery(query, variables) + } + suspend fun toggleFav(anime: Boolean = true, id: Int) { - val query = - """mutation (${"$"}animeId: Int,${"$"}mangaId:Int) { ToggleFavourite(animeId:${"$"}animeId,mangaId:${"$"}mangaId){ anime { edges { id } } manga { edges { id } } } }""" + val query = """ + mutation (${"$"}animeId: Int, ${"$"}mangaId: Int) { + ToggleFavourite(animeId: ${"$"}animeId, mangaId: ${"$"}mangaId) { + anime { + edges { + id + } + } + manga { + edges { + id + } + } + } + } + """.trimIndent() val variables = if (anime) """{"animeId":"$id"}""" else """{"mangaId":"$id"}""" executeQuery(query, variables) } @@ -25,7 +96,17 @@ class AnilistMutations { FavType.STAFF -> "staffId" FavType.STUDIO -> "studioId" } - val query = """mutation{ToggleFavourite($filter:$id){anime{pageInfo{total}}}}""" + val query = """ + mutation { + ToggleFavourite($filter: $id) { + anime { + pageInfo { + total + } + } + } + } + """.trimIndent() val result = executeQuery(query) return result?.get("errors") == null && result != null } @@ -46,14 +127,45 @@ class AnilistMutations { completedAt: FuzzyDate? = null, customList: List? = null ) { - val query = """ - mutation ( ${"$"}mediaID: Int, ${"$"}progress: Int,${"$"}private:Boolean,${"$"}repeat: Int, ${"$"}notes: String, ${"$"}customLists: [String], ${"$"}scoreRaw:Int, ${"$"}status:MediaListStatus, ${"$"}start:FuzzyDateInput${if (startedAt != null) "=" + startedAt.toVariableString() else ""}, ${"$"}completed:FuzzyDateInput${if (completedAt != null) "=" + completedAt.toVariableString() else ""} ) { - SaveMediaListEntry( mediaId: ${"$"}mediaID, progress: ${"$"}progress, repeat: ${"$"}repeat, notes: ${"$"}notes, private: ${"$"}private, scoreRaw: ${"$"}scoreRaw, status:${"$"}status, startedAt: ${"$"}start, completedAt: ${"$"}completed , customLists: ${"$"}customLists ) { - score(format:POINT_10_DECIMAL) startedAt{year month day} completedAt{year month day} + mutation ( + ${"$"}mediaID: Int, + ${"$"}progress: Int, + ${"$"}private: Boolean, + ${"$"}repeat: Int, + ${"$"}notes: String, + ${"$"}customLists: [String], + ${"$"}scoreRaw: Int, + ${"$"}status: MediaListStatus, + ${"$"}start: FuzzyDateInput${if (startedAt != null) "=" + startedAt.toVariableString() else ""}, + ${"$"}completed: FuzzyDateInput${if (completedAt != null) "=" + completedAt.toVariableString() else ""} + ) { + SaveMediaListEntry( + mediaId: ${"$"}mediaID, + progress: ${"$"}progress, + repeat: ${"$"}repeat, + notes: ${"$"}notes, + private: ${"$"}private, + scoreRaw: ${"$"}scoreRaw, + status: ${"$"}status, + startedAt: ${"$"}start, + completedAt: ${"$"}completed, + customLists: ${"$"}customLists + ) { + score(format: POINT_10_DECIMAL) + startedAt { + year + month + day + } + completedAt { + year + month + day + } } } - """.replace("\n", "").replace(""" """, "") + """.trimIndent() val variables = """{"mediaID":$mediaID ${if (private != null) ""","private":$private""" else ""} @@ -69,91 +181,168 @@ class AnilistMutations { } suspend fun deleteList(listId: Int) { - val query = "mutation(${"$"}id:Int){DeleteMediaListEntry(id:${"$"}id){deleted}}" + val query = """ + mutation(${"$"}id: Int) { + DeleteMediaListEntry(id: ${"$"}id) { + deleted + } + } + """.trimIndent() val variables = """{"id":"$listId"}""" executeQuery(query, variables) } - suspend fun rateReview(reviewId: Int, rating: String): Query.RateReviewResponse? { - val query = - "mutation{RateReview(reviewId:$reviewId,rating:$rating){id mediaId mediaType summary body(asHtml:true)rating ratingAmount userRating score private siteUrl createdAt updatedAt user{id name bannerImage avatar{medium large}}}}" + val query = """ + mutation { + RateReview(reviewId: $reviewId, rating: $rating) { + id + mediaId + mediaType + summary + body(asHtml: true) + rating + ratingAmount + userRating + score + private + siteUrl + createdAt + updatedAt + user { + id + name + bannerImage + avatar { + medium + large + } + } + } + } + """.trimIndent() return executeQuery(query) } suspend fun toggleFollow(id: Int): Query.ToggleFollow? { - return executeQuery( - """mutation{ToggleFollow(userId:$id){id, isFollowing, isFollower}}""" - ) + return executeQuery(""" + mutation { + ToggleFollow(userId: $id) { + id + isFollowing + isFollower + } + } + """.trimIndent()) } suspend fun toggleLike(id: Int, type: String): ToggleLike? { - return executeQuery( - """mutation Like{ToggleLikeV2(id:$id,type:$type){__typename}}""" - ) + return executeQuery(""" + mutation Like { + ToggleLikeV2(id: $id, type: $type) { + __typename + } + } + """.trimIndent()) } suspend fun postActivity(text: String, edit: Int? = null): String { val encodedText = text.stringSanitizer() - val query = - "mutation{SaveTextActivity(${if (edit != null) "id:$edit," else ""} text:$encodedText){siteUrl}}" + val query = """ + mutation { + SaveTextActivity(${if (edit != null) "id: $edit," else ""} text: $encodedText) { + siteUrl + } + } + """.trimIndent() val result = executeQuery(query) val errors = result?.get("errors") - return errors?.toString() - ?: (currContext()?.getString(ani.dantotsu.R.string.success) ?: "Success") + return errors?.toString() ?: (currContext()?.getString(ani.dantotsu.R.string.success) ?: "Success") } - suspend fun postMessage( - userId: Int, - text: String, - edit: Int? = null, - isPrivate: Boolean = false - ): String { + suspend fun postMessage(userId: Int, text: String, edit: Int? = null, isPrivate: Boolean = false): String { val encodedText = text.replace("", "").stringSanitizer() - val query = - "mutation{SaveMessageActivity(${if (edit != null) "id:$edit," else ""} recipientId:$userId,message:$encodedText,private:$isPrivate){id}}" + val query = """ + mutation { + SaveMessageActivity( + ${if (edit != null) "id: $edit," else ""} + recipientId: $userId, + message: $encodedText, + private: $isPrivate + ) { + id + } + } + """.trimIndent() val result = executeQuery(query) val errors = result?.get("errors") - return errors?.toString() - ?: (currContext()?.getString(ani.dantotsu.R.string.success) ?: "Success") + return errors?.toString() ?: (currContext()?.getString(ani.dantotsu.R.string.success) ?: "Success") } suspend fun postReply(activityId: Int, text: String, edit: Int? = null): String { val encodedText = text.stringSanitizer() - val query = - "mutation{SaveActivityReply(${if (edit != null) "id:$edit," else ""} activityId:$activityId,text:$encodedText){id}}" + val query = """ + mutation { + SaveActivityReply( + ${if (edit != null) "id: $edit," else ""} + activityId: $activityId, + text: $encodedText + ) { + id + } + } + """.trimIndent() val result = executeQuery(query) val errors = result?.get("errors") - return errors?.toString() - ?: (currContext()?.getString(ani.dantotsu.R.string.success) ?: "Success") + return errors?.toString() ?: (currContext()?.getString(ani.dantotsu.R.string.success) ?: "Success") } suspend fun postReview(summary: String, body: String, mediaId: Int, score: Int): String { val encodedSummary = summary.stringSanitizer() val encodedBody = body.stringSanitizer() - val query = - "mutation{SaveReview(mediaId:$mediaId,summary:$encodedSummary,body:$encodedBody,score:$score){siteUrl}}" + val query = """ + mutation { + SaveReview( + mediaId: $mediaId, + summary: $encodedSummary, + body: $encodedBody, + score: $score + ) { + siteUrl + } + } + """.trimIndent() val result = executeQuery(query) val errors = result?.get("errors") - return errors?.toString() - ?: (currContext()?.getString(ani.dantotsu.R.string.success) ?: "Success") + return errors?.toString() ?: (currContext()?.getString(ani.dantotsu.R.string.success) ?: "Success") } suspend fun deleteActivityReply(activityId: Int): Boolean { - val query = "mutation{DeleteActivityReply(id:$activityId){deleted}}" + val query = """ + mutation { + DeleteActivityReply(id: $activityId) { + deleted + } + } + """.trimIndent() val result = executeQuery(query) val errors = result?.get("errors") return errors == null } suspend fun deleteActivity(activityId: Int): Boolean { - val query = "mutation{DeleteActivity(id:$activityId){deleted}}" + val query = """ + mutation { + DeleteActivity(id: $activityId) { + deleted + } + } + """.trimIndent() val result = executeQuery(query) val errors = result?.get("errors") return errors == null } - private fun String.stringSanitizer(): String { val sb = StringBuilder() var i = 0 diff --git a/app/src/main/java/ani/dantotsu/connections/anilist/AnilistQueries.kt b/app/src/main/java/ani/dantotsu/connections/anilist/AnilistQueries.kt index 75ab4ee1..bd1dd145 100644 --- a/app/src/main/java/ani/dantotsu/connections/anilist/AnilistQueries.kt +++ b/app/src/main/java/ani/dantotsu/connections/anilist/AnilistQueries.kt @@ -42,8 +42,34 @@ class AnilistQueries { suspend fun getUserData(): Boolean { val response: Query.Viewer? measureTimeMillis { - response = - executeQuery("""{Viewer{name options{displayAdultContent}avatar{medium}bannerImage id mediaListOptions{rowOrder animeList{sectionOrder customLists}mangaList{sectionOrder customLists}}statistics{anime{episodesWatched}manga{chaptersRead}}unreadNotificationCount}}""") + response = executeQuery(""" + { + Viewer { + name + options { + restrictMessagesToFollowing + displayAdultContent + airingNotifications + staffNameLanguage + titleLanguage + timezone + } + avatar { medium } + bannerImage + id + mediaListOptions { + rowOrder + animeList { sectionOrder customLists } + mangaList { sectionOrder customLists } + } + statistics { + anime { episodesWatched } + manga { chaptersRead } + } + unreadNotificationCount + } + } + """) }.also { println("time : $it") } val user = response?.data?.user ?: return false @@ -60,6 +86,14 @@ class AnilistQueries { val unread = PrefManager.getVal(PrefName.UnreadCommentNotifications) Anilist.unreadNotificationCount += unread Anilist.initialized = true + + user.options?.let { + PrefManager.setVal(PrefName.AnilistTitleLanguage, it.titleLanguage) + PrefManager.setVal(PrefName.AnilistStaffNameLanguage, it.staffNameLanguage) + PrefManager.setVal(PrefName.AnilistDisplayAdultContent, it.displayAdultContent) + PrefManager.setVal(PrefName.AnilistAiringNotifications, it.airingNotifications) + PrefManager.setVal(PrefName.AnilistRestrictMessagesToFollowing, it.restrictMessagesToFollowing) + } return true } diff --git a/app/src/main/java/ani/dantotsu/connections/anilist/api/User.kt b/app/src/main/java/ani/dantotsu/connections/anilist/api/User.kt index 9117c144..35b5b54a 100644 --- a/app/src/main/java/ani/dantotsu/connections/anilist/api/User.kt +++ b/app/src/main/java/ani/dantotsu/connections/anilist/api/User.kt @@ -74,7 +74,7 @@ data class User( @Serializable data class UserOptions( // The language the user wants to see media titles in - // @SerialName("titleLanguage") var titleLanguage: UserTitleLanguage?, + @SerialName("titleLanguage") var titleLanguage: UserTitleLanguage?, // Whether the user has enabled viewing of 18+ content @SerialName("displayAdultContent") var displayAdultContent: Boolean?, @@ -94,11 +94,11 @@ data class UserOptions( // // Minutes between activity for them to be merged together. 0 is Never, Above 2 weeks (20160 mins) is Always. // @SerialName("activityMergeTime") var activityMergeTime: Int?, // - // // The language the user wants to see staff and character names in - // // @SerialName("staffNameLanguage") var staffNameLanguage: UserStaffNameLanguage?, + // The language the user wants to see staff and character names in + @SerialName("staffNameLanguage") var staffNameLanguage: UserStaffNameLanguage?, // - // // Whether the user only allow messages from users they follow - // @SerialName("restrictMessagesToFollowing") var restrictMessagesToFollowing: Boolean?, + // Whether the user only allow messages from users they follow + @SerialName("restrictMessagesToFollowing") var restrictMessagesToFollowing: Boolean?, // The list activity types the user has disabled from being created from list updates // @SerialName("disabledListActivity") var disabledListActivity: List?, @@ -119,6 +119,28 @@ data class UserStatisticTypes( @SerialName("manga") var manga: UserStatistics? ) +@Serializable +enum class UserTitleLanguage { + @SerialName("ENGLISH") + ENGLISH, + + @SerialName("ROMAJI") + ROMAJI, + + @SerialName("NATIVE") + NATIVE +} + +@Serializable +enum class UserStaffNameLanguage { + @SerialName("ENGLISH") + ENGLISH, + @SerialName("ROMAJI") + ROMAJI, + @SerialName("NATIVE") + NATIVE +} + @Serializable data class UserStatistics( // diff --git a/app/src/main/java/ani/dantotsu/settings/SettingsAnilistActivity.kt b/app/src/main/java/ani/dantotsu/settings/SettingsAnilistActivity.kt index c56d4ee6..7d7816d2 100644 --- a/app/src/main/java/ani/dantotsu/settings/SettingsAnilistActivity.kt +++ b/app/src/main/java/ani/dantotsu/settings/SettingsAnilistActivity.kt @@ -1,9 +1,7 @@ package ani.dantotsu.settings -import android.content.Context import android.os.Bundle import android.view.ViewGroup -import android.view.animation.LinearInterpolator import android.widget.ArrayAdapter import androidx.appcompat.app.AppCompatActivity import androidx.core.view.updateLayoutParams @@ -11,18 +9,18 @@ import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager import ani.dantotsu.R import ani.dantotsu.databinding.ActivitySettingsAnilistBinding -import ani.dantotsu.databinding.ItemSettingsBinding import ani.dantotsu.initActivity import ani.dantotsu.navBarHeight -import ani.dantotsu.restartApp -import ani.dantotsu.settings.saving.PrefManager -import ani.dantotsu.settings.saving.PrefName import ani.dantotsu.statusBarHeight import ani.dantotsu.themes.ThemeManager -import ani.dantotsu.util.Logger +import ani.dantotsu.connections.anilist.AnilistMutations +import ani.dantotsu.settings.saving.PrefManager +import ani.dantotsu.settings.saving.PrefName +import kotlinx.coroutines.launch class SettingsAnilistActivity : AppCompatActivity() { private lateinit var binding: ActivitySettingsAnilistBinding + private lateinit var anilistMutations: AnilistMutations override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -32,6 +30,8 @@ class SettingsAnilistActivity : AppCompatActivity() { binding = ActivitySettingsAnilistBinding.inflate(layoutInflater) setContentView(binding.root) + anilistMutations = AnilistMutations() + binding.apply { settingsAnilistLayout.updateLayoutParams { topMargin = statusBarHeight @@ -41,32 +41,128 @@ class SettingsAnilistActivity : AppCompatActivity() { onBackPressedDispatcher.onBackPressed() } + val timeZone = listOf( + "(GMT-06:00) Central Time", + "(GMT-05:00) Eastern Time", + "(GMT-04:00) Atlantic Time", + "(GMT-01:00) Central Time", + "(GMT+00:00) London", + "(GMT+01:00) Berlin", + "(GMT+04:00) Dubai", + "(GMT+05:30) India Standard Time", + "(GMT+06:00) Dhaka", + "(GMT+07:00) Bangkok", + "(GMT+09:00) Tokyo", + ) + val titleLang = listOf( "English (Attack on Titan)", "Romaji (Shingeki no Kyojin)", "Native (進撃の巨人)" ) - settingsAnilistLanguage.setText(titleLang[PrefManager.getVal(PrefName.SelectedLanguage)]) - settingsAnilistLanguage.setAdapter( - ArrayAdapter( - context, R.layout.item_dropdown, titleLang - ) + + val staffNameLang = listOf( + "Romaji, Western Order (Killua Zoldyck)", + "Romaji (Zoldyck Killua)", + "Native (キルア=ゾルディック)" ) - settingsAnilistLanguage.setOnItemClickListener { _, _, i, _ -> - PrefManager.setVal(PrefName.SelectedLanguage, i) - settingsAnilistLanguage.clearFocus() + + val currentTitleLang = PrefManager.getVal(PrefName.AnilistTitleLanguage, "ENGLISH") + val currentStaffNameLang = PrefManager.getVal(PrefName.AnilistStaffNameLanguage, "ENGLISH") + + val titleLangIndex = when (currentTitleLang) { + "ENGLISH" -> 0 + "ROMAJI" -> 1 + "NATIVE" -> 2 + else -> 0 } + val staffNameLangIndex = when (currentStaffNameLang) { + "ENGLISH" -> 0 + "ROMAJI" -> 1 + "NATIVE" -> 2 + else -> 0 + } + + settingsAnilistTitleLanguage.setText(titleLang[titleLangIndex]) + settingsAnilistTitleLanguage.setAdapter( + ArrayAdapter(context, R.layout.item_dropdown, titleLang) + ) + settingsAnilistTitleLanguage.setOnItemClickListener { _, _, i, _ -> + val selectedLanguage = when (i) { + 0 -> "ENGLISH" + 1 -> "ROMAJI" + 2 -> "NATIVE" + else -> "ENGLISH" + } + lifecycleScope.launch { + anilistMutations.updateSettings(titleLanguage = selectedLanguage) + PrefManager.setVal(PrefName.AnilistTitleLanguage, selectedLanguage) + } + settingsAnilistTitleLanguage.clearFocus() + } + + settingsAnilistStaffLanguage.setText(staffNameLang[staffNameLangIndex]) + settingsAnilistStaffLanguage.setAdapter( + ArrayAdapter(context, R.layout.item_dropdown, staffNameLang) + ) + settingsAnilistStaffLanguage.setOnItemClickListener { _, _, i, _ -> + val selectedLanguage = when (i) { + 0 -> "ENGLISH" + 1 -> "ROMAJI" + 2 -> "NATIVE" + else -> "ENGLISH" + } + lifecycleScope.launch { + anilistMutations.updateSettings(staffNameLanguage = selectedLanguage) + PrefManager.setVal(PrefName.AnilistStaffNameLanguage, selectedLanguage) + } + settingsAnilistStaffLanguage.clearFocus() + } + + // Fetch and set other settings + val displayAdultContent = PrefManager.getVal(PrefName.AnilistDisplayAdultContent, false) + val airingNotifications = PrefManager.getVal(PrefName.AnilistAiringNotifications, false) + val restrictMessagesToFollowing = PrefManager.getVal(PrefName.AnilistRestrictMessagesToFollowing, false) binding.settingsRecyclerView.adapter = SettingsAdapter( arrayListOf( + Settings( + type = 2, + name = getString(R.string.airing_notifications), + desc = getString(R.string.airing_notifications_desc), + icon = R.drawable.ic_round_notifications_active_24, + isChecked = airingNotifications, + switch = { isChecked, _ -> + lifecycleScope.launch { + anilistMutations.updateSettings(airingNotifications = isChecked) + PrefManager.setVal(PrefName.AnilistAiringNotifications, isChecked) + } + } + ), + Settings( + type = 2, + name = getString(R.string.display_adult_content), + desc = getString(R.string.display_adult_content_desc), + icon = R.drawable.ic_round_nsfw_24, + isChecked = displayAdultContent, + switch = { isChecked, _ -> + lifecycleScope.launch { + anilistMutations.updateSettings(displayAdultContent = isChecked) + PrefManager.setVal(PrefName.AnilistDisplayAdultContent, isChecked) + } + } + ), Settings( type = 2, name = getString(R.string.restrict_messages), desc = getString(R.string.restrict_messages_desc), - icon = R.drawable.ic_round_lock_24, - isChecked = PrefManager.getVal(PrefName.SettingsPreferDub), + icon = R.drawable.ic_round_lock_open_24, + isChecked = restrictMessagesToFollowing, switch = { isChecked, _ -> - PrefManager.setVal(PrefName.SettingsPreferDub, isChecked) + lifecycleScope.launch { + anilistMutations.updateSettings(restrictMessagesToFollowing = isChecked) + PrefManager.setVal(PrefName.AnilistRestrictMessagesToFollowing, isChecked) + } } ), ) diff --git a/app/src/main/java/ani/dantotsu/settings/saving/Preferences.kt b/app/src/main/java/ani/dantotsu/settings/saving/Preferences.kt index 6bd425ba..b6bffa16 100644 --- a/app/src/main/java/ani/dantotsu/settings/saving/Preferences.kt +++ b/app/src/main/java/ani/dantotsu/settings/saving/Preferences.kt @@ -47,6 +47,16 @@ enum class PrefName(val data: Pref) { //TODO: Split this into multiple files IncludeMangaList(Pref(Location.General, Boolean::class, true)), AdultOnly(Pref(Location.General, Boolean::class, false)), + // Anilist Settings + AnilistTitleLanguage(Pref(Location.General, String::class, "ENGLISH")), + AnilistDisplayAdultContent(Pref(Location.General, Boolean::class, false)), + AnilistAiringNotifications(Pref(Location.General, Boolean::class, false)), + AnilistTimezone(Pref(Location.General, String::class, "(GMT+00:00) London")), + AnilistActivityMergeTime(Pref(Location.General, Int::class, 0)), + AnilistStaffNameLanguage(Pref(Location.General, String::class, "ROMAJI")), + AnilistRestrictMessagesToFollowing(Pref(Location.General, Boolean::class, false)), + AnilistDisabledListActivity(Pref(Location.General, Set::class, setOf())), + //User Interface UseOLED(Pref(Location.UI, Boolean::class, false)), UseCustomTheme(Pref(Location.UI, Boolean::class, false)), diff --git a/app/src/main/res/layout/activity_settings_anilist.xml b/app/src/main/res/layout/activity_settings_anilist.xml index 4ecfa47e..6ba84080 100644 --- a/app/src/main/res/layout/activity_settings_anilist.xml +++ b/app/src/main/res/layout/activity_settings_anilist.xml @@ -68,7 +68,7 @@ android:layout_marginHorizontal="16dp" android:alpha="0.58" android:fontFamily="@font/poppins_bold" - android:text="@string/selected_language" /> + android:text="@string/selected_title_language" /> + + + + + + + None Selected DNS Change if your ISP blocks any source - Selected Language + Selected Title Language + Selected Staff Language Keep Screen On Layout Spaced Pages @@ -908,6 +909,13 @@ Non quae tempore quo provident laudantium qui illo dolor vel quia dolor et exerc Manage your reliable repositories Get more features out of your app Change your AniList settings + Airing Anime notifications + Get notified whenever a new episode drops + 18+ Content + Enable NSFW content + Restrict messages to following + Allow only users I follow to message me + Customise your news and updates Learn more about Dantotsu General questions about Dantotsu @@ -960,8 +968,6 @@ Non quae tempore quo provident laudantium qui illo dolor vel quia dolor et exerc Add-on update available Install Add-on Add-on not found - Follower only - Restrict Messages to following Image Failed to install extension due to conflict