diff --git a/app/src/main/java/ani/dantotsu/settings/Settings.kt b/app/src/main/java/ani/dantotsu/settings/Settings.kt new file mode 100644 index 00000000..742650ff --- /dev/null +++ b/app/src/main/java/ani/dantotsu/settings/Settings.kt @@ -0,0 +1,10 @@ +package ani.dantotsu.settings + +import android.app.Activity + +data class Settings( + val name : String, + val icon : Int, + val desc: String, + val activity: Class +) diff --git a/app/src/main/java/ani/dantotsu/settings/SettingsActivity.kt b/app/src/main/java/ani/dantotsu/settings/SettingsActivity.kt index 301be833..b7776ad6 100644 --- a/app/src/main/java/ani/dantotsu/settings/SettingsActivity.kt +++ b/app/src/main/java/ani/dantotsu/settings/SettingsActivity.kt @@ -1,12 +1,6 @@ package ani.dantotsu.settings -import android.app.AlarmManager -import android.app.AlertDialog -import android.content.Context -import android.content.Intent import android.graphics.drawable.Animatable -import android.net.Uri -import android.os.Build import android.os.Build.BRAND import android.os.Build.DEVICE import android.os.Build.SUPPORTED_ABIS @@ -14,232 +8,204 @@ import android.os.Build.VERSION.CODENAME import android.os.Build.VERSION.RELEASE import android.os.Build.VERSION.SDK_INT import android.os.Bundle -import android.view.HapticFeedbackConstants -import android.view.KeyEvent -import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup -import android.view.inputmethod.EditorInfo -import android.widget.ArrayAdapter -import android.widget.EditText 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.view.isVisible import androidx.core.view.updateLayoutParams -import androidx.documentfile.provider.DocumentFile import androidx.lifecycle.lifecycleScope -import androidx.media3.common.util.UnstableApi +import androidx.recyclerview.widget.LinearLayoutManager import ani.dantotsu.BuildConfig import ani.dantotsu.R -import ani.dantotsu.connections.anilist.api.NotificationType import ani.dantotsu.copyToClipboard -import ani.dantotsu.databinding.ActivitySettingsAnimeBinding import ani.dantotsu.databinding.ActivitySettingsBinding -import ani.dantotsu.databinding.ActivitySettingsCommonBinding -import ani.dantotsu.databinding.ActivitySettingsExtensionsBinding -import ani.dantotsu.databinding.ActivitySettingsMangaBinding -import ani.dantotsu.databinding.ActivitySettingsNotificationsBinding -import ani.dantotsu.databinding.ActivitySettingsThemeBinding -import ani.dantotsu.databinding.ItemRepositoryBinding -import ani.dantotsu.download.DownloadsManager import ani.dantotsu.initActivity -import ani.dantotsu.media.MediaType import ani.dantotsu.navBarHeight -import ani.dantotsu.notifications.TaskScheduler -import ani.dantotsu.notifications.anilist.AnilistNotificationWorker -import ani.dantotsu.notifications.comment.CommentNotificationWorker -import ani.dantotsu.notifications.subscription.SubscriptionNotificationWorker.Companion.checkIntervals import ani.dantotsu.openLinkInBrowser import ani.dantotsu.openLinkInYouTube -import ani.dantotsu.openSettings import ani.dantotsu.others.AppUpdater import ani.dantotsu.others.CustomBottomDialog import ani.dantotsu.pop -import ani.dantotsu.reloadActivity -import ani.dantotsu.restartApp -import ani.dantotsu.savePrefsToDownloads import ani.dantotsu.setSafeOnClickListener -import ani.dantotsu.settings.saving.PrefManager -import ani.dantotsu.settings.saving.PrefName -import ani.dantotsu.settings.saving.internal.Location -import ani.dantotsu.settings.saving.internal.PreferenceKeystore -import ani.dantotsu.settings.saving.internal.PreferencePackager import ani.dantotsu.snackString import ani.dantotsu.startMainActivity import ani.dantotsu.statusBarHeight import ani.dantotsu.themes.ThemeManager import ani.dantotsu.toast -import ani.dantotsu.util.LauncherWrapper -import ani.dantotsu.util.Logger -import ani.dantotsu.util.StoragePermissions.Companion.downloadsPermission -import com.google.android.material.textfield.TextInputEditText -import eltos.simpledialogfragment.SimpleDialog -import eltos.simpledialogfragment.SimpleDialog.OnDialogResultListener.BUTTON_POSITIVE -import eltos.simpledialogfragment.color.SimpleColorDialog -import eu.kanade.domain.base.BasePreferences -import eu.kanade.tachiyomi.extension.anime.AnimeExtensionManager -import eu.kanade.tachiyomi.extension.manga.MangaExtensionManager -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.DelicateCoroutinesApi import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.delay import kotlinx.coroutines.launch -import uy.kohesive.injekt.Injekt -import uy.kohesive.injekt.api.get -import uy.kohesive.injekt.injectLazy import kotlin.random.Random -class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListener { +class SettingsActivity : AppCompatActivity() { private val restartMainActivity = object : OnBackPressedCallback(false) { override fun handleOnBackPressed() = startMainActivity(this@SettingsActivity) } lateinit var binding: ActivitySettingsBinding private var cursedCounter = 0 - - @OptIn(UnstableApi::class) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) ThemeManager(this).applyTheme() + initActivity(this) + binding = ActivitySettingsBinding.inflate(layoutInflater) setContentView(binding.root) - initActivity(this) - - binding.settingsVersion.text = getString(R.string.version_current, BuildConfig.VERSION_NAME) - binding.settingsVersion.setOnLongClickListener { - copyToClipboard(getDeviceInfo(), false) - toast(getString(R.string.copied_device_info)) - return@setOnLongClickListener true - } - - binding.settingsContainer.updateLayoutParams { - topMargin = statusBarHeight - bottomMargin = navBarHeight - } - - onBackPressedDispatcher.addCallback(this, restartMainActivity) - - binding.settingsBack.setOnClickListener { - onBackPressedDispatcher.onBackPressed() - } - + val context = this binding.apply { - settingsAbout.setOnClickListener { - startActivity(Intent(this@SettingsActivity, SettingsAboutActivity::class.java)) - } - settingsAccount.setOnClickListener { - startActivity(Intent(this@SettingsActivity, SettingsAccountActivity::class.java)) - } - settingsAnime.setOnClickListener { - startActivity(Intent(this@SettingsActivity, SettingsAnimeActivity::class.java)) - } - settingsManga.setOnClickListener { - startActivity(Intent(this@SettingsActivity, SettingsMangaActivity::class.java)) - } - settingsCommon.setOnClickListener { - startActivity(Intent(this@SettingsActivity, SettingsCommonActivity::class.java)) - } - settingsExtension.setOnClickListener { - startActivity(Intent(this@SettingsActivity, SettingsExtensionsActivity::class.java)) - } - settingsNotification.setOnClickListener { - startActivity(Intent(this@SettingsActivity, SettingsNotificationActivity::class.java)) - } - settingsTheme.setOnClickListener { - startActivity(Intent(this@SettingsActivity, SettingsThemeActivity::class.java)) - } - } + settingsVersion.apply { + text = getString(R.string.version_current, BuildConfig.VERSION_NAME) - if (!BuildConfig.FLAVOR.contains("fdroid")) { - binding.settingsLogo.setOnLongClickListener { - lifecycleScope.launch(Dispatchers.IO) { - AppUpdater.check(this@SettingsActivity, true) + settingsVersion.setOnLongClickListener { + copyToClipboard(getDeviceInfo(), false) + toast(getString(R.string.copied_device_info)) + return@setOnLongClickListener true } - true } - } + settingsContainer.updateLayoutParams { + topMargin = statusBarHeight + bottomMargin = navBarHeight + } - binding.settingBuyMeCoffee.setOnClickListener { + onBackPressedDispatcher.addCallback(context, restartMainActivity) + + settingsBack.setOnClickListener { + onBackPressedDispatcher.onBackPressed() + } + + + val settings = arrayListOf( + Settings( + getString(R.string.accounts), + R.drawable.ic_round_person_24, + getString(R.string.accounts_desc), + SettingsAccountActivity::class.java + ), + Settings( + getString(R.string.theme), + R.drawable.ic_palette, + getString(R.string.theme_desc), + SettingsThemeActivity::class.java + ), + Settings( + getString(R.string.common), + R.drawable.ic_lightbulb_24, + getString(R.string.common_desc), + SettingsCommonActivity::class.java + ), + Settings( + getString(R.string.anime), + R.drawable.ic_round_movie_filter_24, + getString(R.string.anime_desc), + SettingsAnimeActivity::class.java + ), + Settings( + getString(R.string.manga), + R.drawable.ic_round_import_contacts_24, + getString(R.string.manga_desc), + SettingsMangaActivity::class.java + ), + Settings( + getString(R.string.extensions), + R.drawable.ic_extension, + getString(R.string.extensions_desc), + SettingsExtensionsActivity::class.java + ), + Settings( + getString(R.string.notifications), + R.drawable.ic_round_notifications_none_24, + getString(R.string.notifications_desc), + SettingsNotificationActivity::class.java + ), + Settings( + getString(R.string.about), + R.drawable.ic_round_info_24, + getString(R.string.about_desc), + SettingsAboutActivity::class.java + ), + ) + + settingsRecyclerView.apply { + layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false) + adapter = SettingsAdapter(settings) + setHasFixedSize(true) + } + + if (!BuildConfig.FLAVOR.contains("fdroid")) { + settingsLogo.setOnLongClickListener { + lifecycleScope.launch(Dispatchers.IO) { + AppUpdater.check(this@SettingsActivity, true) + } + true + } + } + + settingBuyMeCoffee.setOnClickListener { + lifecycleScope.launch { + it.pop() + } + openLinkInBrowser(getString(R.string.coffee)) + } lifecycleScope.launch { - it.pop() - } - openLinkInBrowser(getString(R.string.coffee)) - } - lifecycleScope.launch { - binding.settingBuyMeCoffee.pop() - } - - binding.loginDiscord.setOnClickListener { - openLinkInBrowser(getString(R.string.discord)) - } - binding.loginGithub.setOnClickListener { - openLinkInBrowser(getString(R.string.github)) - } - binding.loginTelegram.setOnClickListener { - openLinkInBrowser(getString(R.string.telegram)) - } - - - (binding.settingsLogo.drawable as Animatable).start() - val array = resources.getStringArray(R.array.tips) - - binding.settingsLogo.setSafeOnClickListener { - cursedCounter++ - (binding.settingsLogo.drawable as Animatable).start() - if (cursedCounter % 7 == 0) { - toast(R.string.you_cursed) - openLinkInYouTube(getString(R.string.cursed_yt)) - //PrefManager.setVal(PrefName.ImageUrl, !PrefManager.getVal(PrefName.ImageUrl, false)) - } else { - snackString(array[(Math.random() * array.size).toInt()], this) + settingBuyMeCoffee.pop() } - } + loginDiscord.setOnClickListener { + openLinkInBrowser(getString(R.string.discord)) + } + loginGithub.setOnClickListener { + openLinkInBrowser(getString(R.string.github)) + } + loginTelegram.setOnClickListener { + openLinkInBrowser(getString(R.string.telegram)) + } - lifecycleScope.launch(Dispatchers.IO) { - delay(2000) - runOnUiThread { - if (Random.nextInt(0, 100) > 69) { - CustomBottomDialog.newInstance().apply { - title = this@SettingsActivity.getString(R.string.enjoying_app) - addView(TextView(this@SettingsActivity).apply { - text = context.getString(R.string.consider_donating) - }) - setNegativeButton(this@SettingsActivity.getString(R.string.no_moners)) { - snackString(R.string.you_be_rich) - dismiss() + (settingsLogo.drawable as Animatable).start() + val array = resources.getStringArray(R.array.tips) + + settingsLogo.setSafeOnClickListener { + cursedCounter++ + (settingsLogo.drawable as Animatable).start() + if (cursedCounter % 7 == 0) { + toast(R.string.you_cursed) + openLinkInYouTube(getString(R.string.cursed_yt)) + //PrefManager.setVal(PrefName.ImageUrl, !PrefManager.getVal(PrefName.ImageUrl, false)) + } else { + snackString(array[(Math.random() * array.size).toInt()], context) + } + + } + + lifecycleScope.launch(Dispatchers.IO) { + delay(2000) + runOnUiThread { + if (Random.nextInt(0, 100) > 69) { + CustomBottomDialog.newInstance().apply { + title = this@SettingsActivity.getString(R.string.enjoying_app) + addView(TextView(this@SettingsActivity).apply { + text = context.getString(R.string.consider_donating) + }) + + setNegativeButton(this@SettingsActivity.getString(R.string.no_moners)) { + snackString(R.string.you_be_rich) + dismiss() + } + + setPositiveButton(this@SettingsActivity.getString(R.string.donate)) { + settingBuyMeCoffee.performClick() + dismiss() + } + show(supportFragmentManager, "dialog") } - - setPositiveButton(this@SettingsActivity.getString(R.string.donate)) { - binding.settingBuyMeCoffee.performClick() - dismiss() - } - show(supportFragmentManager, "dialog") } } } } } - override fun onResult(dialogTag: String, which: Int, extras: Bundle): Boolean { - if (which == BUTTON_POSITIVE) { - if (dialogTag == "colorPicker") { - val color = extras.getInt(SimpleColorDialog.COLOR) - PrefManager.setVal(PrefName.CustomThemeInt, color) - Logger.log("Custom Theme: $color") - } - } - return true - } - - companion object { fun getDeviceInfo(): String { return """ diff --git a/app/src/main/java/ani/dantotsu/settings/SettingsAdapter.kt b/app/src/main/java/ani/dantotsu/settings/SettingsAdapter.kt new file mode 100644 index 00000000..bf665740 --- /dev/null +++ b/app/src/main/java/ani/dantotsu/settings/SettingsAdapter.kt @@ -0,0 +1,44 @@ +package ani.dantotsu.settings + +import android.content.Intent +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.RecyclerView +import ani.dantotsu.databinding.ItemSettingsBinding +import ani.dantotsu.setAnimation + +class SettingsAdapter(private val settings: ArrayList) : RecyclerView.Adapter(){ + inner class SettingsViewHolder(val binding: ItemSettingsBinding) : + RecyclerView.ViewHolder(binding.root) { + init { + itemView.setOnClickListener { + ContextCompat.startActivity( + binding.root.context, Intent(binding.root.context, settings[bindingAdapterPosition].activity), + null + ) + } + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SettingsViewHolder { + return SettingsViewHolder( + ItemSettingsBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ) + ) + } + + override fun onBindViewHolder(holder: SettingsViewHolder, position: Int) { + val b = holder.binding + setAnimation(b.root.context, b.root) + val settings = settings[position] + b.settingsTitle.text = settings.name + b.settingsDesc.text = settings.desc + b.settingsIcon.setImageDrawable(ContextCompat.getDrawable(b.root.context, settings.icon)) + } + + override fun getItemCount(): Int = settings.size +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml index bb6ff228..9e3a9897 100644 --- a/app/src/main/res/layout/activity_settings.xml +++ b/app/src/main/res/layout/activity_settings.xml @@ -66,6 +66,7 @@ + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:nestedScrollingEnabled="true" + android:requiresFadingEdge="vertical" + tools:itemCount="5" + tools:listitem="@layout/item_settings" /> + + + + + + + + + + + +