From aabbe9198a3d984d1b148b1b0a677a5bbba67eef Mon Sep 17 00:00:00 2001 From: ibo <41344259+sneazy-ibo@users.noreply.github.com> Date: Tue, 2 Apr 2024 05:09:52 +0200 Subject: [PATCH] feat(discord): custom buttons (#295) * feat(discord): custom buttons * feat(discord): added haptics * fine... * fix(strings): my genius is frightening * feat: add option to only show the first button * feat: discord rpc menu * feat(link): add button preview back --------- Co-authored-by: aayush262 --- .../ani/dantotsu/media/anime/ExoplayerView.kt | 56 +++---- .../manga/mangareader/MangaReaderActivity.kt | 48 +++--- .../settings/DiscordDialogFragment.kt | 60 ++++++++ .../ani/dantotsu/settings/SettingsActivity.kt | 21 ++- .../res/layout/activity_settings_accounts.xml | 3 +- .../res/layout/bottom_sheet_discord_rpc.xml | 145 ++++++++++++++++++ .../res/layout/bottom_sheet_search_filter.xml | 4 +- .../main/res/layout/bottom_sheet_users.xml | 2 +- app/src/main/res/values/strings.xml | 12 ++ 9 files changed, 292 insertions(+), 59 deletions(-) create mode 100644 app/src/main/java/ani/dantotsu/settings/DiscordDialogFragment.kt create mode 100644 app/src/main/res/layout/bottom_sheet_discord_rpc.xml diff --git a/app/src/main/java/ani/dantotsu/media/anime/ExoplayerView.kt b/app/src/main/java/ani/dantotsu/media/anime/ExoplayerView.kt index 1833ada8..7daf8138 100644 --- a/app/src/main/java/ani/dantotsu/media/anime/ExoplayerView.kt +++ b/app/src/main/java/ani/dantotsu/media/anime/ExoplayerView.kt @@ -1084,35 +1084,40 @@ class ExoplayerView : AppCompatActivity(), Player.Listener, SessionAvailabilityL val incognito: Boolean = PrefManager.getVal(PrefName.Incognito) if ((isOnline(context) && !offline) && Discord.token != null && !incognito) { lifecycleScope.launch { - val presence = RPC.createPresence(RPC.Companion.RPCData( - applicationId = Discord.application_Id, - type = RPC.Type.WATCHING, - activityName = media.userPreferredName, - details = ep.title?.takeIf { it.isNotEmpty() } ?: getString( - R.string.episode_num, - ep.number - ), - state = "Episode : ${ep.number}/${media.anime?.totalEpisodes ?: "??"}", - largeImage = media.cover?.let { - RPC.Link( - media.userPreferredName, - it - ) - }, - smallImage = RPC.Link( - "Dantotsu", - Discord.small_Image - ), - buttons = mutableListOf( + val discordMode = PrefManager.getCustomVal("discord_mode", "dantotsu") + val buttons = when (discordMode) { + "nothing" -> mutableListOf( RPC.Link(getString(R.string.view_anime), media.shareLink ?: ""), - RPC.Link( - "Stream on Dantotsu", - getString(R.string.github) + ) + "dantotsu" -> mutableListOf( + RPC.Link(getString(R.string.view_anime), media.shareLink ?: ""), + RPC.Link("Watch on Dantotsu", getString(R.string.dantotsu)) + ) + "anilist" -> { + val userId = PrefManager.getVal(PrefName.AnilistUserId) + val anilistLink = "https://anilist.co/user/$userId/" + mutableListOf( + RPC.Link(getString(R.string.view_anime), media.shareLink ?: ""), + RPC.Link("View My AniList", anilistLink) ) + } + else -> mutableListOf() + } + val presence = RPC.createPresence( + RPC.Companion.RPCData( + applicationId = Discord.application_Id, + type = RPC.Type.WATCHING, + activityName = media.userPreferredName, + details = ep.title?.takeIf { it.isNotEmpty() } ?: getString( + R.string.episode_num, + ep.number + ), + state = "Episode : ${ep.number}/${media.anime?.totalEpisodes ?: "??"}", + largeImage = media.cover?.let { RPC.Link(media.userPreferredName, it) }, + smallImage = RPC.Link("Dantotsu", Discord.small_Image), + buttons = buttons ) ) - ) - val intent = Intent(context, DiscordService::class.java).apply { putExtra("presence", presence) } @@ -1120,7 +1125,6 @@ class ExoplayerView : AppCompatActivity(), Player.Listener, SessionAvailabilityL startService(intent) } } - updateProgress() } } diff --git a/app/src/main/java/ani/dantotsu/media/manga/mangareader/MangaReaderActivity.kt b/app/src/main/java/ani/dantotsu/media/manga/mangareader/MangaReaderActivity.kt index a7d45778..1a4bcade 100644 --- a/app/src/main/java/ani/dantotsu/media/manga/mangareader/MangaReaderActivity.kt +++ b/app/src/main/java/ani/dantotsu/media/manga/mangareader/MangaReaderActivity.kt @@ -362,15 +362,11 @@ class MangaReaderActivity : AppCompatActivity() { currentChapterIndex = chaptersArr.indexOf(chap.number) binding.mangaReaderChapterSelect.setSelection(currentChapterIndex) if (defaultSettings.direction == RIGHT_TO_LEFT || defaultSettings.direction == BOTTOM_TO_TOP) { - binding.mangaReaderNextChap.text = - chaptersTitleArr.getOrNull(currentChapterIndex - 1) ?: "" - binding.mangaReaderPrevChap.text = - chaptersTitleArr.getOrNull(currentChapterIndex + 1) ?: "" + binding.mangaReaderNextChap.text = chaptersTitleArr.getOrNull(currentChapterIndex - 1) ?: "" + binding.mangaReaderPrevChap.text = chaptersTitleArr.getOrNull(currentChapterIndex + 1) ?: "" } else { - binding.mangaReaderNextChap.text = - chaptersTitleArr.getOrNull(currentChapterIndex + 1) ?: "" - binding.mangaReaderPrevChap.text = - chaptersTitleArr.getOrNull(currentChapterIndex - 1) ?: "" + binding.mangaReaderNextChap.text = chaptersTitleArr.getOrNull(currentChapterIndex + 1) ?: "" + binding.mangaReaderPrevChap.text = chaptersTitleArr.getOrNull(currentChapterIndex - 1) ?: "" } applySettings() val context = this @@ -378,6 +374,25 @@ class MangaReaderActivity : AppCompatActivity() { val incognito: Boolean = PrefManager.getVal(PrefName.Incognito) if ((isOnline(context) && !offline) && Discord.token != null && !incognito) { lifecycleScope.launch { + val discordMode = PrefManager.getCustomVal("discord_mode", "dantotsu") + val buttons = when (discordMode) { + "nothing" -> mutableListOf( + RPC.Link(getString(R.string.view_manga), media.shareLink ?: ""), + ) + "dantotsu" -> mutableListOf( + RPC.Link(getString(R.string.view_manga), media.shareLink ?: ""), + RPC.Link("Read on Dantotsu", getString(R.string.dantotsu)) + ) + "anilist" -> { + val userId = PrefManager.getVal(PrefName.AnilistUserId) + val anilistLink = "https://anilist.co/user/$userId/" + mutableListOf( + RPC.Link(getString(R.string.view_manga), media.shareLink ?: ""), + RPC.Link("View My AniList", anilistLink) + ) + } + else -> mutableListOf() + } val presence = RPC.createPresence( RPC.Companion.RPCData( applicationId = Discord.application_Id, @@ -386,20 +401,9 @@ class MangaReaderActivity : AppCompatActivity() { details = chap.title?.takeIf { it.isNotEmpty() } ?: getString(R.string.chapter_num, chap.number), state = "${chap.number}/${media.manga?.totalChapters ?: "??"}", - largeImage = media.cover?.let { cover -> - RPC.Link(media.userPreferredName, cover) - }, - smallImage = RPC.Link( - "Dantotsu", - Discord.small_Image - ), - buttons = mutableListOf( - RPC.Link(getString(R.string.view_manga), media.shareLink ?: ""), - RPC.Link( - "Stream on Dantotsu", - getString(R.string.github) - ) - ) + largeImage = media.cover?.let { cover -> RPC.Link(media.userPreferredName, cover) }, + smallImage = RPC.Link("Dantotsu", Discord.small_Image), + buttons = buttons ) ) val intent = Intent(context, DiscordService::class.java).apply { diff --git a/app/src/main/java/ani/dantotsu/settings/DiscordDialogFragment.kt b/app/src/main/java/ani/dantotsu/settings/DiscordDialogFragment.kt new file mode 100644 index 00000000..ded5db8e --- /dev/null +++ b/app/src/main/java/ani/dantotsu/settings/DiscordDialogFragment.kt @@ -0,0 +1,60 @@ +package ani.dantotsu.settings + +import android.annotation.SuppressLint +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.RadioButton +import android.widget.RadioGroup +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import ani.dantotsu.BottomSheetDialogFragment +import ani.dantotsu.R +import ani.dantotsu.connections.anilist.Anilist +import ani.dantotsu.databinding.BottomSheetDiscordRpcBinding +import ani.dantotsu.profile.activity.UsersAdapter +import ani.dantotsu.settings.saving.PrefManager +import ani.dantotsu.settings.saving.PrefName +import com.google.android.material.bottomsheet.BottomSheetDialog + +class DiscordDialogFragment: BottomSheetDialogFragment() { + private var _binding: BottomSheetDiscordRpcBinding? = null + private val binding get() = _binding!! + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + _binding = BottomSheetDiscordRpcBinding.inflate(inflater, container, false) + return binding.root + } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + when (PrefManager.getCustomVal("discord_mode", "dantotsu")) { + "nothing" -> binding.radioNothing.isChecked= true + "dantotsu" -> binding.radioDantotsu.isChecked = true + "anilist" -> binding.radioAnilist.isChecked = true + else -> binding.radioAnilist.isChecked = true + } + + binding.anilistLinkPreview.text = getString(R.string.anilist_link, PrefManager.getVal(PrefName.AnilistUserName)) + + binding.radioGroup.setOnCheckedChangeListener { _, checkedId -> + val mode = when (checkedId) { + binding.radioNothing.id -> "nothing" + binding.radioDantotsu.id -> "dantotsu" + binding.radioAnilist.id -> "anilist" + else -> "dantotsu" + } + PrefManager.setCustomVal("discord_mode", mode) + } + } + + override fun onDestroy() { + _binding = null + super.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/ani/dantotsu/settings/SettingsActivity.kt b/app/src/main/java/ani/dantotsu/settings/SettingsActivity.kt index 7950d282..e96f0edf 100644 --- a/app/src/main/java/ani/dantotsu/settings/SettingsActivity.kt +++ b/app/src/main/java/ani/dantotsu/settings/SettingsActivity.kt @@ -19,12 +19,15 @@ import android.view.ViewGroup import android.view.animation.AnimationUtils import android.view.inputmethod.EditorInfo import android.widget.ArrayAdapter +import android.widget.RadioButton +import android.widget.RadioGroup import android.widget.TextView import androidx.activity.OnBackPressedCallback import androidx.activity.result.contract.ActivityResultContracts import androidx.annotation.OptIn import androidx.appcompat.app.AppCompatActivity import androidx.core.content.ContextCompat +import android.view.HapticFeedbackConstants import androidx.core.view.updateLayoutParams import androidx.documentfile.provider.DocumentFile import androidx.lifecycle.lifecycleScope @@ -79,6 +82,7 @@ import ani.dantotsu.statusBarHeight import ani.dantotsu.themes.ThemeManager import ani.dantotsu.toast import ani.dantotsu.util.Logger +import com.google.android.material.bottomsheet.BottomSheetDialog import com.google.android.material.textfield.TextInputEditText import eltos.simpledialogfragment.SimpleDialog import eltos.simpledialogfragment.SimpleDialog.OnDialogResultListener.BUTTON_POSITIVE @@ -259,18 +263,18 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene reload() } - imageSwitcher.visibility = View.VISIBLE + settingsImageSwitcher.visibility = View.VISIBLE var initialStatus = when (PrefManager.getVal(PrefName.DiscordStatus)) { "online" -> R.drawable.discord_status_online "idle" -> R.drawable.discord_status_idle "dnd" -> R.drawable.discord_status_dnd else -> R.drawable.discord_status_online } - imageSwitcher.setImageResource(initialStatus) + settingsImageSwitcher.setImageResource(initialStatus) val zoomInAnimation = AnimationUtils.loadAnimation(this@SettingsActivity, R.anim.bounce_zoom) - imageSwitcher.setOnClickListener { + settingsImageSwitcher.setOnClickListener { var status = "online" initialStatus = when (initialStatus) { R.drawable.discord_status_online -> { @@ -292,11 +296,16 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene } PrefManager.setVal(PrefName.DiscordStatus, status) - imageSwitcher.setImageResource(initialStatus) - imageSwitcher.startAnimation(zoomInAnimation) + settingsImageSwitcher.setImageResource(initialStatus) + settingsImageSwitcher.startAnimation(zoomInAnimation) + } + settingsImageSwitcher.setOnLongClickListener { + it.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS) + DiscordDialogFragment().show(supportFragmentManager, "dialog") + true } } else { - imageSwitcher.visibility = View.GONE + settingsImageSwitcher.visibility = View.GONE settingsDiscordAvatar.setImageResource(R.drawable.ic_round_person_24) settingsDiscordUsername.visibility = View.GONE settingsDiscordLogin.setText(R.string.login) diff --git a/app/src/main/res/layout/activity_settings_accounts.xml b/app/src/main/res/layout/activity_settings_accounts.xml index 41f2b5ec..cf3765cf 100644 --- a/app/src/main/res/layout/activity_settings_accounts.xml +++ b/app/src/main/res/layout/activity_settings_accounts.xml @@ -213,11 +213,10 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/bottom_sheet_search_filter.xml b/app/src/main/res/layout/bottom_sheet_search_filter.xml index 8ca02366..916a2e72 100644 --- a/app/src/main/res/layout/bottom_sheet_search_filter.xml +++ b/app/src/main/res/layout/bottom_sheet_search_filter.xml @@ -2,9 +2,9 @@ + android:layout_height="wrap_content" + android:background="@drawable/bottom_sheet_background"> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9004d379..085c140e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -9,10 +9,14 @@ Login Logout + https://dantotsu.app/ https://discord.gg/4HPZ5nAWwM https://github.com/rebelonion/Dantotsu https://t.me/+gzBCQExtLQo1YTNh https://www.buymeacoffee.com/rebelonion + + https://anilist.co/user/%1$s/ + https://discord.com/users/%1$s/ Home Anime @@ -421,6 +425,13 @@ Step: %1$s Review + Display only the first button + Display dantotsu in the second button + Display your AniList profile instead + Discord Rich Presence + Stream on Dantotsu + View My AniList + DAMN! YOU TRULY ARE JOBLESS\nYOU REACHED THE END Couldn\'t find any File Manager to open SD card Error loading data %1$s @@ -848,5 +859,6 @@ Non quae tempore quo provident laudantium qui illo dolor vel quia dolor et exerc Top rated Most Favourite Trending Manhwa + Liked By Adult only content