Merge pull request #73 from rebelonion/dev

Dev
This commit is contained in:
rebelonion 2023-12-05 21:34:08 -06:00 committed by GitHub
commit 1d4257b1b3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
33 changed files with 467 additions and 112 deletions

View file

@ -13,9 +13,12 @@ import kotlinx.coroutines.launch
import kotlin.math.roundToInt import kotlin.math.roundToInt
fun updateProgress(media: Media, number: String) { fun updateProgress(media: Media, number: String) {
val incognito = currContext()?.getSharedPreferences("Dantotsu", 0)
?.getBoolean("incognito", false) ?: false
if (!incognito) {
if (Anilist.userid != null) { if (Anilist.userid != null) {
CoroutineScope(Dispatchers.IO).launch { CoroutineScope(Dispatchers.IO).launch {
val a = number.toFloatOrNull()?.roundToInt() val a = number.toFloatOrNull()?.toInt()
if ((a ?: 0) > (media.userProgress ?: 0)) { if ((a ?: 0) > (media.userProgress ?: 0)) {
Anilist.mutation.editList( Anilist.mutation.editList(
media.id, media.id,
@ -36,4 +39,7 @@ fun updateProgress(media: Media, number: String) {
} else { } else {
toast(currContext()?.getString(R.string.login_anilist_account)) toast(currContext()?.getString(R.string.login_anilist_account))
} }
} else {
toast("Sneaky sneaky :3")
}
} }

View file

@ -69,11 +69,75 @@ class DownloadsManager(private val context: Context) {
} }
} else { } else {
Toast.makeText(context, "Directory does not exist", Toast.LENGTH_SHORT).show() Toast.makeText(context, "Directory does not exist", Toast.LENGTH_SHORT).show()
cleanDownloads()
} }
downloadsList.removeAll { it.title == title } downloadsList.removeAll { it.title == title }
saveDownloads() saveDownloads()
} }
private fun cleanDownloads() {
cleanDownload(Download.Type.MANGA)
cleanDownload(Download.Type.ANIME)
cleanDownload(Download.Type.NOVEL)
}
private fun cleanDownload(type: Download.Type) {
// remove all folders that are not in the downloads list
val subDirectory = if (type == Download.Type.MANGA) {
"Manga"
} else if (type == Download.Type.ANIME) {
"Anime"
} else {
"Novel"
}
val directory = File(
context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS),
"Dantotsu/$subDirectory"
)
val downloadsSubList = if (type == Download.Type.MANGA) {
mangaDownloads
} else if (type == Download.Type.ANIME) {
animeDownloads
} else {
novelDownloads
}
if (directory.exists()) {
val files = directory.listFiles()
if (files != null) {
for (file in files) {
if (!downloadsSubList.any { it.title == file.name }) {
val deleted = file.deleteRecursively()
}
}
}
}
//now remove all downloads that do not have a folder
val iterator = downloadsList.iterator()
while (iterator.hasNext()) {
val download = iterator.next()
val downloadDir = File(directory, download.title)
if ((!downloadDir.exists() && download.type == type) || download.title.isBlank()) {
iterator.remove()
}
}
}
fun saveDownloadsListToJSONFileInDownloadsFolder(downloadsList: List<Download>) //for debugging
{
val jsonString = gson.toJson(downloadsList)
val file = File(
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS),
"Dantotsu/downloads.json"
)
if (file.parentFile?.exists() == false) {
file.parentFile?.mkdirs()
}
if (!file.exists()) {
file.createNewFile()
}
file.writeText(jsonString)
}
fun queryDownload(download: Download): Boolean { fun queryDownload(download: Download): Boolean {
return downloadsList.contains(download) return downloadsList.contains(download)
} }

View file

@ -136,7 +136,8 @@ class OfflineMangaFragment : Fragment(), OfflineMangaSearchListener {
builder.setNegativeButton("No") { _, _ -> builder.setNegativeButton("No") { _, _ ->
// Do nothing // Do nothing
} }
builder.show() val dialog = builder.show()
dialog.window?.setDimAmount(0.8f)
true true
} }
@ -284,7 +285,7 @@ class OfflineMangaFragment : Fragment(), OfflineMangaSearchListener {
} else { } else {
null null
} }
val title = mediaModel.nameMAL ?: "unknown" val title = mediaModel.nameMAL ?: mediaModel.nameRomaji
val score = ((if (mediaModel.userScore == 0) (mediaModel.meanScore val score = ((if (mediaModel.userScore == 0) (mediaModel.meanScore
?: 0) else mediaModel.userScore) / 10.0).toString() ?: 0) else mediaModel.userScore) / 10.0).toString()
val isOngoing = false val isOngoing = false

View file

@ -300,6 +300,19 @@ class MediaAdaptor(
return type return type
} }
fun randomOptionClick() { //used for user list
val media = mediaList?.random()
if (media != null) {
mediaList?.let {
clicked(
it.indexOf(media),
null
)
}
}
}
inner class MediaViewHolder(val binding: ItemMediaCompactBinding) : inner class MediaViewHolder(val binding: ItemMediaCompactBinding) :
RecyclerView.ViewHolder(binding.root) { RecyclerView.ViewHolder(binding.root) {
init { init {

View file

@ -204,6 +204,7 @@ class AnimeWatchAdapter(
fragment.onIconPressed(style, reversed) fragment.onIconPressed(style, reversed)
} }
binding.animeScanlatorTop.visibility = View.GONE binding.animeScanlatorTop.visibility = View.GONE
binding.animeDownloadTop.visibility = View.GONE
//Episode Handling //Episode Handling
handleEpisodes() handleEpisodes()
} }

View file

@ -318,7 +318,7 @@ class AnimeWatchFragment : Fragment() {
if (allSettings.size > 1) { if (allSettings.size > 1) {
val names = allSettings.map { it.lang }.toTypedArray() val names = allSettings.map { it.lang }.toTypedArray()
var selectedIndex = 0 var selectedIndex = 0
AlertDialog.Builder(requireContext()) val dialog = AlertDialog.Builder(requireContext())
.setTitle("Select a Source") .setTitle("Select a Source")
.setSingleChoiceItems(names, selectedIndex) { _, which -> .setSingleChoiceItems(names, selectedIndex) { _, which ->
selectedIndex = which selectedIndex = which
@ -347,6 +347,7 @@ class AnimeWatchFragment : Fragment() {
return@setNegativeButton return@setNegativeButton
} }
.show() .show()
dialog.window?.setDimAmount(0.8f)
} else { } else {
// If there's only one setting, proceed with the fragment transaction // If there's only one setting, proceed with the fragment transaction
requireActivity().runOnUiThread { requireActivity().runOnUiThread {

View file

@ -14,6 +14,7 @@ import android.content.pm.PackageManager
import android.content.res.Configuration import android.content.res.Configuration
import android.graphics.Color import android.graphics.Color
import android.graphics.drawable.Animatable import android.graphics.drawable.Animatable
import android.hardware.Sensor
import android.hardware.SensorManager import android.hardware.SensorManager
import android.media.AudioManager import android.media.AudioManager
import android.media.AudioManager.* import android.media.AudioManager.*
@ -186,8 +187,6 @@ class ExoplayerView : AppCompatActivity(), Player.Listener {
var rotation = 0 var rotation = 0
private var rpc: RPC? = null
override fun onAttachedToWindow() { override fun onAttachedToWindow() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
val displayCutout = window.decorView.rootWindowInsets.displayCutout val displayCutout = window.decorView.rootWindowInsets.displayCutout
@ -385,14 +384,10 @@ class ExoplayerView : AppCompatActivity(), Player.Listener {
}, AUDIO_CONTENT_TYPE_MOVIE, AUDIOFOCUS_GAIN) }, AUDIO_CONTENT_TYPE_MOVIE, AUDIOFOCUS_GAIN)
if (System.getInt(contentResolver, System.ACCELEROMETER_ROTATION, 0) != 1) { if (System.getInt(contentResolver, System.ACCELEROMETER_ROTATION, 0) != 1) {
requestedOrientation = rotation
exoRotate.setOnClickListener {
requestedOrientation = rotation
it.visibility = View.GONE
}
orientationListener = orientationListener =
object : OrientationEventListener(this, SensorManager.SENSOR_DELAY_UI) { object : OrientationEventListener(this, SensorManager.SENSOR_DELAY_UI) {
override fun onOrientationChanged(orientation: Int) { override fun onOrientationChanged(orientation: Int) {
println(orientation)
if (orientation in 45..135) { if (orientation in 45..135) {
if (rotation != ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE) exoRotate.visibility = if (rotation != ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE) exoRotate.visibility =
View.VISIBLE View.VISIBLE
@ -405,6 +400,12 @@ class ExoplayerView : AppCompatActivity(), Player.Listener {
} }
} }
orientationListener?.enable() orientationListener?.enable()
requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE
exoRotate.setOnClickListener {
requestedOrientation = rotation
it.visibility = View.GONE
}
} }
setupSubFormatting(playerView, settings) setupSubFormatting(playerView, settings)
@ -998,6 +999,9 @@ class ExoplayerView : AppCompatActivity(), Player.Listener {
preloading = false preloading = false
val context = this val context = this
val incognito = baseContext.getSharedPreferences("Dantotsu", MODE_PRIVATE)
.getBoolean("incognito", false)
if (isOnline(context) && Discord.token != null && !incognito) {
lifecycleScope.launch { lifecycleScope.launch {
val presence = RPC.createPresence(RPC.Companion.RPCData( val presence = RPC.createPresence(RPC.Companion.RPCData(
applicationId = Discord.application_Id, applicationId = Discord.application_Id,
@ -1008,7 +1012,12 @@ class ExoplayerView : AppCompatActivity(), Player.Listener {
ep.number ep.number
), ),
state = "Episode : ${ep.number}/${media.anime?.totalEpisodes ?: "??"}", state = "Episode : ${ep.number}/${media.anime?.totalEpisodes ?: "??"}",
largeImage = media.cover?.let { RPC.Link(media.userPreferredName, it) }, largeImage = media.cover?.let {
RPC.Link(
media.userPreferredName,
it
)
},
smallImage = RPC.Link( smallImage = RPC.Link(
"Dantotsu", "Dantotsu",
Discord.small_Image Discord.small_Image
@ -1029,6 +1038,7 @@ class ExoplayerView : AppCompatActivity(), Player.Listener {
DiscordServiceRunningSingleton.running = true DiscordServiceRunningSingleton.running = true
startService(intent) startService(intent)
} }
}
updateProgress() updateProgress()
} }
@ -1101,7 +1111,7 @@ class ExoplayerView : AppCompatActivity(), Player.Listener {
val speedDialog = val speedDialog =
AlertDialog.Builder(this, R.style.DialogTheme).setTitle(getString(R.string.speed)) AlertDialog.Builder(this, R.style.DialogTheme).setTitle(getString(R.string.speed))
exoSpeed.setOnClickListener { exoSpeed.setOnClickListener {
speedDialog.setSingleChoiceItems(speedsName, curSpeed) { dialog, i -> val dialog = speedDialog.setSingleChoiceItems(speedsName, curSpeed) { dialog, i ->
if (isInitialized) { if (isInitialized) {
saveData("${media.id}_speed", i, this) saveData("${media.id}_speed", i, this)
speed = speeds[i] speed = speeds[i]
@ -1112,6 +1122,7 @@ class ExoplayerView : AppCompatActivity(), Player.Listener {
hideSystemBars() hideSystemBars()
} }
}.show() }.show()
dialog.window?.setDimAmount(0.8f)
} }
speedDialog.setOnCancelListener { hideSystemBars() } speedDialog.setOnCancelListener { hideSystemBars() }
@ -1151,6 +1162,7 @@ class ExoplayerView : AppCompatActivity(), Player.Listener {
if (showProgressDialog && Anilist.userid != null && if (media.isAdult) settings.updateForH else true) if (showProgressDialog && Anilist.userid != null && if (media.isAdult) settings.updateForH else true)
AlertDialog.Builder(this, R.style.MyPopup) AlertDialog.Builder(this, R.style.MyPopup)
.setTitle(getString(R.string.auto_update, media.userPreferredName)) .setTitle(getString(R.string.auto_update, media.userPreferredName))
.setMessage(getString(R.string.incognito_will_not_update))
.apply { .apply {
setOnCancelListener { hideSystemBars() } setOnCancelListener { hideSystemBars() }
setCancelable(false) setCancelable(false)
@ -1349,7 +1361,7 @@ class ExoplayerView : AppCompatActivity(), Player.Listener {
) )
) )
) )
AlertDialog.Builder(this, R.style.DialogTheme) val dialog = AlertDialog.Builder(this, R.style.DialogTheme)
.setTitle(getString(R.string.continue_from, time)).apply { .setTitle(getString(R.string.continue_from, time)).apply {
setCancelable(false) setCancelable(false)
setPositiveButton(getString(R.string.yes)) { d, _ -> setPositiveButton(getString(R.string.yes)) { d, _ ->
@ -1362,6 +1374,7 @@ class ExoplayerView : AppCompatActivity(), Player.Listener {
d.dismiss() d.dismiss()
} }
}.show() }.show()
dialog.window?.setDimAmount(0.8f)
} else buildExoplayer() } else buildExoplayer()
} }
@ -1394,7 +1407,7 @@ class ExoplayerView : AppCompatActivity(), Player.Listener {
exoPlayer.addAnalyticsListener(EventLogger()) exoPlayer.addAnalyticsListener(EventLogger())
isInitialized = true isInitialized = true
} }
/*private fun selectSubtitleTrack() { /*private fun selectSubtitleTrack() { saving this for later
// Get the current track groups // Get the current track groups
val trackGroups = exoPlayer.currentTrackGroups val trackGroups = exoPlayer.currentTrackGroups
@ -1426,9 +1439,11 @@ class ExoplayerView : AppCompatActivity(), Player.Listener {
exoPlayer.release() exoPlayer.release()
VideoCache.release() VideoCache.release()
mediaSession?.release() mediaSession?.release()
if(DiscordServiceRunningSingleton.running) {
val stopIntent = Intent(this, DiscordService::class.java) val stopIntent = Intent(this, DiscordService::class.java)
DiscordServiceRunningSingleton.running = false DiscordServiceRunningSingleton.running = false
stopService(stopIntent) stopService(stopIntent)
}
} }
@ -1532,6 +1547,12 @@ class ExoplayerView : AppCompatActivity(), Player.Listener {
if (exoPlayer.duration < playbackPosition) if (exoPlayer.duration < playbackPosition)
exoPlayer.seekTo(0) exoPlayer.seekTo(0)
//if playbackPosition is within 92% of the episode length, reset it to 0
if (playbackPosition > exoPlayer.duration.toFloat() * 0.92) {
playbackPosition = 0
exoPlayer.seekTo(0)
}
if (!isTimeStampsLoaded && settings.timeStampsEnabled) { if (!isTimeStampsLoaded && settings.timeStampsEnabled) {
val dur = exoPlayer.duration val dur = exoPlayer.duration
lifecycleScope.launch(Dispatchers.IO) { lifecycleScope.launch(Dispatchers.IO) {

View file

@ -1,10 +1,12 @@
package ani.dantotsu.media.manga package ani.dantotsu.media.manga
import android.app.AlertDialog
import android.util.TypedValue import android.util.TypedValue
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.view.animation.LinearInterpolator import android.view.animation.LinearInterpolator
import android.widget.NumberPicker
import androidx.lifecycle.coroutineScope import androidx.lifecycle.coroutineScope
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import ani.dantotsu.R import ani.dantotsu.R
@ -114,6 +116,49 @@ class MangaChapterAdapter(
} }
} }
fun downloadNextNChapters(n: Int) {
//find last viewed chapter
var lastViewedChapter = arr.indexOfFirst { MangaNameAdapter.findChapterNumber(it.number)?.toInt() == media.userProgress }
if (lastViewedChapter == -1) {
lastViewedChapter = 0
}
//download next n chapters
for (i in 1..n) {
if (lastViewedChapter + i < arr.size) {
val chapterNumber = arr[lastViewedChapter + i].number
if (activeDownloads.contains(chapterNumber)) {
//do nothing
continue
} else if (downloadedChapters.contains(chapterNumber)) {
//do nothing
continue
} else {
fragment.onMangaChapterDownloadClick(chapterNumber)
startDownload(chapterNumber)
}
}
}
}
fun downloadNChaptersFrom(position: Int, n: Int) {
//download next n chapters
for (i in 0..<n) {
if (position + i < arr.size) {
val chapterNumber = arr[position + i].number
if (activeDownloads.contains(chapterNumber)) {
//do nothing
continue
} else if (downloadedChapters.contains(chapterNumber)) {
//do nothing
continue
} else {
fragment.onMangaChapterDownloadClick(chapterNumber)
startDownload(chapterNumber)
}
}
}
}
inner class ChapterListViewHolder(val binding: ItemChapterListBinding) : inner class ChapterListViewHolder(val binding: ItemChapterListBinding) :
RecyclerView.ViewHolder(binding.root) { RecyclerView.ViewHolder(binding.root) {
private val activeCoroutines = mutableSetOf<String>() private val activeCoroutines = mutableSetOf<String>()
@ -200,6 +245,24 @@ class MangaChapterAdapter(
} }
} }
} }
binding.itemDownload.setOnLongClickListener {
//Alert dialog asking for the number of chapters to download
val alertDialog = AlertDialog.Builder(currContext(), R.style.MyPopup)
alertDialog.setTitle("Multi Chapter Downloader")
alertDialog.setMessage("Enter the number of chapters to download")
val input = NumberPicker(currContext())
input.minValue = 1
input.maxValue = itemCount - bindingAdapterPosition
input.value = 1
alertDialog.setView(input)
alertDialog.setPositiveButton("OK") { dialog, which ->
downloadNChaptersFrom(bindingAdapterPosition, input.value)
}
alertDialog.setNegativeButton("Cancel") { dialog, _ -> dialog.cancel() }
val dialog = alertDialog.show()
dialog.window?.setDimAmount(0.8f)
true
}
} }
} }

View file

@ -5,10 +5,12 @@ import android.app.AlertDialog
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.view.WindowManager
import android.widget.ArrayAdapter import android.widget.ArrayAdapter
import android.widget.CheckBox import android.widget.CheckBox
import android.widget.ImageView import android.widget.ImageView
import android.widget.LinearLayout import android.widget.LinearLayout
import android.widget.NumberPicker
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
@ -167,7 +169,7 @@ class MangaReadAdapter(
} }
// Create AlertDialog // Create AlertDialog
AlertDialog.Builder(currContext()) val dialog = AlertDialog.Builder(currContext(), R.style.MyPopup)
.setView(dialogView) .setView(dialogView)
.setPositiveButton("OK") { dialog, which -> .setPositiveButton("OK") { dialog, which ->
//add unchecked to hidden //add unchecked to hidden
@ -183,6 +185,25 @@ class MangaReadAdapter(
} }
.setNegativeButton("Cancel", null) .setNegativeButton("Cancel", null)
.show() .show()
dialog.window?.setDimAmount(0.8f)
}
binding.animeDownloadTop.setOnClickListener {
//Alert dialog asking for the number of chapters to download
val alertDialog = AlertDialog.Builder(currContext(), R.style.MyPopup)
alertDialog.setTitle("Multi Chapter Downloader")
alertDialog.setMessage("Enter the number of chapters to download")
val input = NumberPicker(currContext())
input.minValue = 1
input.maxValue = 20
input.value = 1
alertDialog.setView(input)
alertDialog.setPositiveButton("OK") { dialog, which ->
fragment.multiDownload(input.value)
}
alertDialog.setNegativeButton("Cancel") { dialog, _ -> dialog.cancel() }
val dialog = alertDialog.show()
dialog.window?.setDimAmount(0.8f)
} }
var selected = when (style) { var selected = when (style) {
@ -238,7 +259,20 @@ class MangaReadAdapter(
0 0
) )
} }
chip.text = "${names[limit * (position)]} - ${names[last - 1]}" val startChapter = MangaNameAdapter.findChapterNumber(names[limit * (position)])
val endChapter = MangaNameAdapter.findChapterNumber(names[last - 1])
val startChapterString = if (startChapter != null) {
"Ch.$startChapter"
} else {
names[limit * (position)]
}
val endChapterString = if (endChapter != null) {
"Ch.$endChapter"
} else {
names[last - 1]
}
//chip.text = "${names[limit * (position)]} - ${names[last - 1]}"
chip.text = "$startChapterString - $endChapterString"
chip.setTextColor( chip.setTextColor(
ContextCompat.getColorStateList( ContextCompat.getColorStateList(
fragment.requireContext(), fragment.requireContext(),

View file

@ -197,6 +197,10 @@ open class MangaReadFragment : Fragment(), ScanlatorSelectionListener {
updateChapters() updateChapters()
} }
fun multiDownload(n: Int) {
chapterAdapter.downloadNextNChapters(n)
}
private fun updateChapters() { private fun updateChapters() {
val loadedChapters = model.getMangaChapters().value val loadedChapters = model.getMangaChapters().value
if (loadedChapters != null) { if (loadedChapters != null) {
@ -334,7 +338,7 @@ open class MangaReadFragment : Fragment(), ScanlatorSelectionListener {
if (allSettings.size > 1) { if (allSettings.size > 1) {
val names = allSettings.map { it.lang }.toTypedArray() val names = allSettings.map { it.lang }.toTypedArray()
var selectedIndex = 0 var selectedIndex = 0
AlertDialog.Builder(requireContext()) val dialog = AlertDialog.Builder(requireContext())
.setTitle("Select a Source") .setTitle("Select a Source")
.setSingleChoiceItems(names, selectedIndex) { _, which -> .setSingleChoiceItems(names, selectedIndex) { _, which ->
selectedIndex = which selectedIndex = which
@ -361,6 +365,7 @@ open class MangaReadFragment : Fragment(), ScanlatorSelectionListener {
return@setNegativeButton return@setNegativeButton
} }
.show() .show()
dialog.window?.setDimAmount(0.8f)
} else { } else {
// If there's only one setting, proceed with the fragment transaction // If there's only one setting, proceed with the fragment transaction
val fragment = MangaSourcePreferencesFragment().getInstance(selectedSetting.id) { val fragment = MangaSourcePreferencesFragment().getInstance(selectedSetting.id) {

View file

@ -12,6 +12,7 @@ import android.view.*
import android.view.KeyEvent.* import android.view.KeyEvent.*
import android.view.animation.OvershootInterpolator import android.view.animation.OvershootInterpolator
import android.widget.AdapterView import android.widget.AdapterView
import android.widget.CheckBox
import androidx.activity.addCallback import androidx.activity.addCallback
import androidx.activity.viewModels import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
@ -124,7 +125,7 @@ class MangaReaderActivity : AppCompatActivity() {
override fun onDestroy() { override fun onDestroy() {
mangaCache.clear() mangaCache.clear()
if (isOnline(baseContext)) { //TODO: if (DiscordServiceRunningSingleton.running) {
DiscordServiceRunningSingleton.running = false DiscordServiceRunningSingleton.running = false
val stopIntent = Intent(this, DiscordService::class.java) val stopIntent = Intent(this, DiscordService::class.java)
stopService(stopIntent) stopService(stopIntent)
@ -253,20 +254,22 @@ class MangaReaderActivity : AppCompatActivity() {
showProgressDialog = showProgressDialog =
if (settings.askIndividual) loadData<Boolean>("${media.id}_progressDialog") != true else false if (settings.askIndividual) loadData<Boolean>("${media.id}_progressDialog") != true else false
progressDialog = progressDialog =
if (showProgressDialog && Anilist.userid != null && if (media.isAdult) settings.updateForH else true) if (showProgressDialog && Anilist.userid != null && if (media.isAdult) settings.updateForH else true) {
AlertDialog.Builder(this, R.style.MyPopup) val dialogView = layoutInflater.inflate(R.layout.item_custom_dialog, null)
.setTitle(getString(R.string.title_update_progress)).apply { val checkbox = dialogView.findViewById<CheckBox>(R.id.dialog_checkbox)
setMultiChoiceItems( checkbox.text = getString(R.string.dont_ask_again, media.userPreferredName)
arrayOf(getString(R.string.dont_ask_again, media.userPreferredName)), checkbox.setOnCheckedChangeListener { _, isChecked ->
booleanArrayOf(false)
) { _, _, isChecked ->
if (isChecked) progressDialog = null if (isChecked) progressDialog = null
saveData("${media.id}_progressDialog", isChecked) saveData("${media.id}_progressDialog", isChecked)
showProgressDialog = isChecked showProgressDialog = isChecked
} }
AlertDialog.Builder(this, R.style.MyPopup)
.setTitle(getString(R.string.title_update_progress))
.setView(dialogView)
.apply {
setOnCancelListener { hideBars() } setOnCancelListener { hideBars() }
} }
else null } else null
//Chapter Change //Chapter Change
fun change(index: Int) { fun change(index: Int) {
@ -329,7 +332,9 @@ class MangaReaderActivity : AppCompatActivity() {
chaptersTitleArr.getOrNull(currentChapterIndex - 1) ?: "" chaptersTitleArr.getOrNull(currentChapterIndex - 1) ?: ""
applySettings() applySettings()
val context = this val context = this
if (isOnline(context)) { val incognito = context.getSharedPreferences("Dantotsu", 0)
?.getBoolean("incognito", false) ?: false
if (isOnline(context) && Discord.token != null && !incognito) {
lifecycleScope.launch { lifecycleScope.launch {
val presence = RPC.createPresence( val presence = RPC.createPresence(
RPC.Companion.RPCData( RPC.Companion.RPCData(

View file

@ -167,9 +167,9 @@ class Swipy @JvmOverloads constructor(
val totalDragDistance = val totalDragDistance =
Resources.getSystem().displayMetrics.heightPixels / dragDivider Resources.getSystem().displayMetrics.heightPixels / dragDivider
if (verticalPos == VerticalPosition.Top) if (verticalPos == VerticalPosition.Top)
topBeingSwiped.invoke(overscroll / totalDragDistance) topBeingSwiped.invoke(overscroll * 2 / totalDragDistance)
else else
bottomBeingSwiped.invoke(overscroll / totalDragDistance) bottomBeingSwiped.invoke(overscroll * 2 / totalDragDistance)
} else { } else {
val totalDragDistance = val totalDragDistance =
Resources.getSystem().displayMetrics.widthPixels / dragDivider Resources.getSystem().displayMetrics.widthPixels / dragDivider
@ -243,7 +243,7 @@ class Swipy @JvmOverloads constructor(
if (vertical) { if (vertical) {
val totalDragDistance = Resources.getSystem().displayMetrics.heightPixels / dragDivider val totalDragDistance = Resources.getSystem().displayMetrics.heightPixels / dragDivider
if (overscrollDistance > totalDragDistance) if (overscrollDistance * 2 > totalDragDistance)
if (verticalPos == VerticalPosition.Top) if (verticalPos == VerticalPosition.Top)
onTopSwiped.invoke() onTopSwiped.invoke()
else else

View file

@ -112,7 +112,8 @@ class NovelResponseAdapter(
builder.setNegativeButton("No") { _, _ -> builder.setNegativeButton("No") { _, _ ->
// Do nothing // Do nothing
} }
builder.show() val dialog = builder.show()
dialog.window?.setDimAmount(0.8f)
true true
} }
} }

View file

@ -162,5 +162,15 @@ class ListActivity : AppCompatActivity() {
popup.inflate(R.menu.list_sort_menu) popup.inflate(R.menu.list_sort_menu)
popup.show() popup.show()
} }
binding.random.setOnClickListener {
//get the current tab
val currentTab =
binding.listTabLayout.getTabAt(binding.listTabLayout.selectedTabPosition)
val currentViewePager = binding.listViewPager.getChildAt(0)
val currentFragment =
supportFragmentManager.findFragmentByTag("f" + currentTab?.position.toString()) as? ListFragment
currentFragment?.randomOptionClick()
}
} }
} }

View file

@ -76,6 +76,11 @@ class ListFragment : Fragment() {
} }
} }
fun randomOptionClick() {
val adapter = binding.listRecyclerView.adapter as MediaAdaptor
adapter.randomOptionClick()
}
companion object { companion object {
fun newInstance(pos: Int, calendar: Boolean = false): ListFragment = fun newInstance(pos: Int, calendar: Boolean = false): ListFragment =
ListFragment().apply { ListFragment().apply {

View file

@ -55,7 +55,7 @@ class InstalledAnimeExtensionsFragment : Fragment(), SearchQueryHandler {
if (allSettings.size > 1) { if (allSettings.size > 1) {
val names = allSettings.map { it.lang }.toTypedArray() val names = allSettings.map { it.lang }.toTypedArray()
var selectedIndex = 0 var selectedIndex = 0
AlertDialog.Builder(requireContext(), R.style.MyPopup) val dialog = AlertDialog.Builder(requireContext(), R.style.MyPopup)
.setTitle("Select a Source") .setTitle("Select a Source")
.setSingleChoiceItems(names, selectedIndex) { dialog, which -> .setSingleChoiceItems(names, selectedIndex) { dialog, which ->
selectedIndex = which selectedIndex = which
@ -85,6 +85,7 @@ class InstalledAnimeExtensionsFragment : Fragment(), SearchQueryHandler {
} }
} }
.show() .show()
dialog.window?.setDimAmount(0.8f)
} else { } else {
// If there's only one setting, proceed with the fragment transaction // If there's only one setting, proceed with the fragment transaction
val eActivity = requireActivity() as ExtensionsActivity val eActivity = requireActivity() as ExtensionsActivity

View file

@ -62,7 +62,7 @@ class InstalledMangaExtensionsFragment : Fragment(), SearchQueryHandler {
if (allSettings.size > 1) { if (allSettings.size > 1) {
val names = allSettings.map { it.lang }.toTypedArray() val names = allSettings.map { it.lang }.toTypedArray()
var selectedIndex = 0 var selectedIndex = 0
AlertDialog.Builder(requireContext(), R.style.MyPopup) val dialog = AlertDialog.Builder(requireContext(), R.style.MyPopup)
.setTitle("Select a Source") .setTitle("Select a Source")
.setSingleChoiceItems(names, selectedIndex) { dialog, which -> .setSingleChoiceItems(names, selectedIndex) { dialog, which ->
selectedIndex = which selectedIndex = which
@ -81,6 +81,7 @@ class InstalledMangaExtensionsFragment : Fragment(), SearchQueryHandler {
.commit() .commit()
} }
.show() .show()
dialog.window?.setDimAmount(0.8f)
} else { } else {
// If there's only one setting, proceed with the fragment transaction // If there's only one setting, proceed with the fragment transaction
val fragment = MangaSourcePreferencesFragment().getInstance(selectedSetting.id) { val fragment = MangaSourcePreferencesFragment().getInstance(selectedSetting.id) {

View file

@ -106,13 +106,14 @@ class PlayerSettingsActivity : AppCompatActivity() {
val speedDialog = AlertDialog.Builder(this, R.style.DialogTheme) val speedDialog = AlertDialog.Builder(this, R.style.DialogTheme)
.setTitle(getString(R.string.default_speed)) .setTitle(getString(R.string.default_speed))
binding.playerSettingsSpeed.setOnClickListener { binding.playerSettingsSpeed.setOnClickListener {
speedDialog.setSingleChoiceItems(speedsName, settings.defaultSpeed) { dialog, i -> val dialog = speedDialog.setSingleChoiceItems(speedsName, settings.defaultSpeed) { dialog, i ->
settings.defaultSpeed = i settings.defaultSpeed = i
binding.playerSettingsSpeed.text = binding.playerSettingsSpeed.text =
getString(R.string.default_playback_speed, speedsName[i]) getString(R.string.default_playback_speed, speedsName[i])
saveData(player, settings) saveData(player, settings)
dialog.dismiss() dialog.dismiss()
}.show() }.show()
dialog.window?.setDimAmount(0.8f)
} }
binding.playerSettingsCursedSpeeds.isChecked = settings.cursedSpeeds binding.playerSettingsCursedSpeeds.isChecked = settings.cursedSpeeds
@ -255,11 +256,12 @@ class PlayerSettingsActivity : AppCompatActivity() {
val resizeDialog = AlertDialog.Builder(this, R.style.DialogTheme) val resizeDialog = AlertDialog.Builder(this, R.style.DialogTheme)
.setTitle(getString(R.string.default_resize_mode)) .setTitle(getString(R.string.default_resize_mode))
binding.playerResizeMode.setOnClickListener { binding.playerResizeMode.setOnClickListener {
resizeDialog.setSingleChoiceItems(resizeModes, settings.resize) { dialog, count -> val dialog = resizeDialog.setSingleChoiceItems(resizeModes, settings.resize) { dialog, count ->
settings.resize = count settings.resize = count
saveData(player, settings) saveData(player, settings)
dialog.dismiss() dialog.dismiss()
}.show() }.show()
dialog.window?.setDimAmount(0.8f)
} }
fun restartApp() { fun restartApp() {
Snackbar.make( Snackbar.make(
@ -339,7 +341,7 @@ class PlayerSettingsActivity : AppCompatActivity() {
val primaryColorDialog = AlertDialog.Builder(this, R.style.DialogTheme) val primaryColorDialog = AlertDialog.Builder(this, R.style.DialogTheme)
.setTitle(getString(R.string.primary_sub_color)) .setTitle(getString(R.string.primary_sub_color))
binding.videoSubColorPrimary.setOnClickListener { binding.videoSubColorPrimary.setOnClickListener {
primaryColorDialog.setSingleChoiceItems( val dialog = primaryColorDialog.setSingleChoiceItems(
colorsPrimary, colorsPrimary,
settings.primaryColor settings.primaryColor
) { dialog, count -> ) { dialog, count ->
@ -347,6 +349,7 @@ class PlayerSettingsActivity : AppCompatActivity() {
saveData(player, settings) saveData(player, settings)
dialog.dismiss() dialog.dismiss()
}.show() }.show()
dialog.window?.setDimAmount(0.8f)
} }
val colorsSecondary = arrayOf( val colorsSecondary = arrayOf(
"Black", "Black",
@ -365,7 +368,7 @@ class PlayerSettingsActivity : AppCompatActivity() {
val secondaryColorDialog = AlertDialog.Builder(this, R.style.DialogTheme) val secondaryColorDialog = AlertDialog.Builder(this, R.style.DialogTheme)
.setTitle(getString(R.string.outline_sub_color)) .setTitle(getString(R.string.outline_sub_color))
binding.videoSubColorSecondary.setOnClickListener { binding.videoSubColorSecondary.setOnClickListener {
secondaryColorDialog.setSingleChoiceItems( val dialog = secondaryColorDialog.setSingleChoiceItems(
colorsSecondary, colorsSecondary,
settings.secondaryColor settings.secondaryColor
) { dialog, count -> ) { dialog, count ->
@ -373,16 +376,18 @@ class PlayerSettingsActivity : AppCompatActivity() {
saveData(player, settings) saveData(player, settings)
dialog.dismiss() dialog.dismiss()
}.show() }.show()
dialog.window?.setDimAmount(0.8f)
} }
val typesOutline = arrayOf("Outline", "Shine", "Drop Shadow", "None") val typesOutline = arrayOf("Outline", "Shine", "Drop Shadow", "None")
val outlineDialog = AlertDialog.Builder(this, R.style.DialogTheme) val outlineDialog = AlertDialog.Builder(this, R.style.DialogTheme)
.setTitle(getString(R.string.outline_type)) .setTitle(getString(R.string.outline_type))
binding.videoSubOutline.setOnClickListener { binding.videoSubOutline.setOnClickListener {
outlineDialog.setSingleChoiceItems(typesOutline, settings.outline) { dialog, count -> val dialog = outlineDialog.setSingleChoiceItems(typesOutline, settings.outline) { dialog, count ->
settings.outline = count settings.outline = count
saveData(player, settings) saveData(player, settings)
dialog.dismiss() dialog.dismiss()
}.show() }.show()
dialog.window?.setDimAmount(0.8f)
} }
val colorsSubBackground = arrayOf( val colorsSubBackground = arrayOf(
"Transparent", "Transparent",
@ -401,7 +406,7 @@ class PlayerSettingsActivity : AppCompatActivity() {
val subBackgroundDialog = AlertDialog.Builder(this, R.style.DialogTheme) val subBackgroundDialog = AlertDialog.Builder(this, R.style.DialogTheme)
.setTitle(getString(R.string.outline_sub_color)) .setTitle(getString(R.string.outline_sub_color))
binding.videoSubColorBackground.setOnClickListener { binding.videoSubColorBackground.setOnClickListener {
subBackgroundDialog.setSingleChoiceItems( val dialog = subBackgroundDialog.setSingleChoiceItems(
colorsSubBackground, colorsSubBackground,
settings.subBackground settings.subBackground
) { dialog, count -> ) { dialog, count ->
@ -409,6 +414,7 @@ class PlayerSettingsActivity : AppCompatActivity() {
saveData(player, settings) saveData(player, settings)
dialog.dismiss() dialog.dismiss()
}.show() }.show()
dialog.window?.setDimAmount(0.8f)
} }
val colorsSubWindow = arrayOf( val colorsSubWindow = arrayOf(
@ -428,7 +434,7 @@ class PlayerSettingsActivity : AppCompatActivity() {
val subWindowDialog = AlertDialog.Builder(this, R.style.DialogTheme) val subWindowDialog = AlertDialog.Builder(this, R.style.DialogTheme)
.setTitle(getString(R.string.outline_sub_color)) .setTitle(getString(R.string.outline_sub_color))
binding.videoSubColorWindow.setOnClickListener { binding.videoSubColorWindow.setOnClickListener {
subWindowDialog.setSingleChoiceItems( val dialog = subWindowDialog.setSingleChoiceItems(
colorsSubWindow, colorsSubWindow,
settings.subWindow settings.subWindow
) { dialog, count -> ) { dialog, count ->
@ -436,6 +442,7 @@ class PlayerSettingsActivity : AppCompatActivity() {
saveData(player, settings) saveData(player, settings)
dialog.dismiss() dialog.dismiss()
}.show() }.show()
dialog.window?.setDimAmount(0.8f)
} }
val fonts = arrayOf( val fonts = arrayOf(
"Poppins Semi Bold", "Poppins Semi Bold",
@ -448,11 +455,12 @@ class PlayerSettingsActivity : AppCompatActivity() {
val fontDialog = AlertDialog.Builder(this, R.style.DialogTheme) val fontDialog = AlertDialog.Builder(this, R.style.DialogTheme)
.setTitle(getString(R.string.subtitle_font)) .setTitle(getString(R.string.subtitle_font))
binding.videoSubFont.setOnClickListener { binding.videoSubFont.setOnClickListener {
fontDialog.setSingleChoiceItems(fonts, settings.font) { dialog, count -> val dialog = fontDialog.setSingleChoiceItems(fonts, settings.font) { dialog, count ->
settings.font = count settings.font = count
saveData(player, settings) saveData(player, settings)
dialog.dismiss() dialog.dismiss()
}.show() }.show()
dialog.window?.setDimAmount(0.8f)
} }
binding.subtitleFontSize.setText(settings.fontSize.toString()) binding.subtitleFontSize.setText(settings.fontSize.toString())
binding.subtitleFontSize.setOnEditorActionListener { _, actionId, _ -> binding.subtitleFontSize.setOnEditorActionListener { _, actionId, _ ->

View file

@ -199,8 +199,7 @@ class SettingsActivity : AppCompatActivity() {
passedColor = color passedColor = color
linearLayout.setBackgroundColor(color) linearLayout.setBackgroundColor(color)
}) })
alertDialog.window?.setDimAmount(0.8f)
alertDialog.show()
} }
//val animeSource = loadData<Int>("settings_def_anime_source_s")?.let { if (it >= AnimeSources.names.size) 0 else it } ?: 0 //val animeSource = loadData<Int>("settings_def_anime_source_s")?.let { if (it >= AnimeSources.names.size) 0 else it } ?: 0
@ -237,11 +236,12 @@ class SettingsActivity : AppCompatActivity() {
AlertDialog.Builder(this, R.style.DialogTheme).setTitle("Download Manager") AlertDialog.Builder(this, R.style.DialogTheme).setTitle("Download Manager")
var downloadManager = loadData<Int>("settings_download_manager") ?: 0 var downloadManager = loadData<Int>("settings_download_manager") ?: 0
binding.settingsDownloadManager.setOnClickListener { binding.settingsDownloadManager.setOnClickListener {
downloadManagerDialog.setSingleChoiceItems(managers, downloadManager) { dialog, count -> val dialog = downloadManagerDialog.setSingleChoiceItems(managers, downloadManager) { dialog, count ->
downloadManager = count downloadManager = count
saveData("settings_download_manager", downloadManager) saveData("settings_download_manager", downloadManager)
dialog.dismiss() dialog.dismiss()
}.show() }.show()
dialog.window?.setDimAmount(0.8f)
} }
binding.settingsForceLegacyInstall.isChecked = binding.settingsForceLegacyInstall.isChecked =
@ -287,6 +287,7 @@ class SettingsActivity : AppCompatActivity() {
.create() .create()
alertDialog.show() alertDialog.show()
alertDialog.window?.setDimAmount(0.8f)
} }
@ -416,6 +417,16 @@ class SettingsActivity : AppCompatActivity() {
uiTheme(true, it) uiTheme(true, it)
} }
binding.settingsIncognito.isChecked =
getSharedPreferences("Dantotsu", Context.MODE_PRIVATE).getBoolean(
"incognito",
false
)
binding.settingsIncognito.setOnCheckedChangeListener { _, isChecked ->
getSharedPreferences("Dantotsu", Context.MODE_PRIVATE).edit()
.putBoolean("incognito", isChecked).apply()
}
var previousStart: View = when (uiSettings.defaultStartUpTab) { var previousStart: View = when (uiSettings.defaultStartUpTab) {
0 -> binding.uiSettingsAnime 0 -> binding.uiSettingsAnime
1 -> binding.uiSettingsHome 1 -> binding.uiSettingsHome
@ -582,7 +593,7 @@ class SettingsActivity : AppCompatActivity() {
val speedDialog = AlertDialog.Builder(this, R.style.DialogTheme) val speedDialog = AlertDialog.Builder(this, R.style.DialogTheme)
.setTitle(R.string.subscriptions_checking_time) .setTitle(R.string.subscriptions_checking_time)
binding.settingsSubscriptionsTime.setOnClickListener { binding.settingsSubscriptionsTime.setOnClickListener {
speedDialog.setSingleChoiceItems(timeNames, curTime) { dialog, i -> val dialog = speedDialog.setSingleChoiceItems(timeNames, curTime) { dialog, i ->
curTime = i curTime = i
binding.settingsSubscriptionsTime.text = binding.settingsSubscriptionsTime.text =
getString(R.string.subscriptions_checking_time_s, timeNames[i]) getString(R.string.subscriptions_checking_time_s, timeNames[i])
@ -590,6 +601,7 @@ class SettingsActivity : AppCompatActivity() {
dialog.dismiss() dialog.dismiss()
startSubscription(true) startSubscription(true)
}.show() }.show()
dialog.window?.setDimAmount(0.8f)
} }
binding.settingsSubscriptionsTime.setOnLongClickListener { binding.settingsSubscriptionsTime.setOnLongClickListener {

View file

@ -42,7 +42,7 @@ class UserInterfaceSettingsActivity : AppCompatActivity() {
val views = resources.getStringArray(R.array.home_layouts) val views = resources.getStringArray(R.array.home_layouts)
binding.uiSettingsHomeLayout.setOnClickListener { binding.uiSettingsHomeLayout.setOnClickListener {
AlertDialog.Builder(this, R.style.DialogTheme) val dialog = AlertDialog.Builder(this, R.style.DialogTheme)
.setTitle(getString(R.string.home_layout_show)).apply { .setTitle(getString(R.string.home_layout_show)).apply {
setMultiChoiceItems( setMultiChoiceItems(
views, views,
@ -52,6 +52,7 @@ class UserInterfaceSettingsActivity : AppCompatActivity() {
saveData(ui, settings) saveData(ui, settings)
} }
}.show() }.show()
dialog.window?.setDimAmount(0.8f)
} }
binding.uiSettingsSmallView.isChecked = settings.smallView binding.uiSettingsSmallView.isChecked = settings.smallView

View file

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Color when the chip is selected -->
<item android:color="@color/chip" android:state_selected="true"/>
<!-- Color when the chip is not selected -->
<item android:color="?attr/colorSurface"/>
</selector>

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Color when the chip is selected --> <!-- Color when the chip is selected -->
<item android:color="#ffffff" android:state_selected="true"/> <item android:color="?attr/colorSurface" android:state_selected="true"/>
<!-- Color when the chip is not selected --> <!-- Color when the chip is not selected -->
<item android:color="#aaadab"/> <item android:color="#858585"/>
</selector> </selector>

View file

@ -0,0 +1,6 @@
<vector android:height="24dp" android:viewportHeight="24"
android:viewportWidth="24" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#212121" android:fillType="nonZero"
android:pathData="M17.5,12C19.985,12 22,14.015 22,16.5C22,18.985 19.985,21 17.5,21C15.359,21 13.567,19.505 13.112,17.502L10.888,17.502C10.433,19.505 8.641,21 6.5,21C4.015,21 2,18.985 2,16.5C2,14.015 4.015,12 6.5,12C8.816,12 10.724,13.75 10.973,16L13.027,16C13.276,13.75 15.184,12 17.5,12ZM6.5,13.5C4.843,13.5 3.5,14.843 3.5,16.5C3.5,18.157 4.843,19.5 6.5,19.5C8.157,19.5 9.5,18.157 9.5,16.5C9.5,14.843 8.157,13.5 6.5,13.5ZM17.5,13.5C15.843,13.5 14.5,14.843 14.5,16.5C14.5,18.157 15.843,19.5 17.5,19.5C19.157,19.5 20.5,18.157 20.5,16.5C20.5,14.843 19.157,13.5 17.5,13.5ZM12,9.25C15.389,9.25 18.53,9.59 21.422,10.27C21.825,10.365 22.075,10.769 21.98,11.172C21.885,11.575 21.481,11.825 21.078,11.73C18.303,11.077 15.277,10.75 12,10.75C8.723,10.75 5.697,11.077 2.922,11.73C2.519,11.825 2.115,11.575 2.02,11.172C1.925,10.769 2.175,10.365 2.578,10.27C5.47,9.59 8.611,9.25 12,9.25ZM15.7,3.25C16.723,3.25 17.656,3.817 18.13,4.712L18.213,4.883L19.685,8.195C19.854,8.574 19.683,9.017 19.305,9.185C18.958,9.34 18.556,9.209 18.362,8.895L18.315,8.805L16.843,5.492C16.66,5.082 16.274,4.804 15.834,4.757L15.7,4.75L8.3,4.75C7.851,4.75 7.44,4.99 7.218,5.373L7.157,5.492L5.685,8.805C5.517,9.183 5.074,9.354 4.695,9.185C4.348,9.031 4.176,8.646 4.28,8.291L4.315,8.195L5.787,4.883C6.202,3.948 7.099,3.327 8.109,3.257L8.3,3.25L15.7,3.25Z"
android:strokeColor="#00000000" android:strokeWidth="1"/>
</vector>

View file

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="960"
android:viewportHeight="960"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M560,800v-80h104L537,593l57,-57 126,126v-102h80v240L560,800ZM216,800 L160,744 664,240L560,240v-80h240v240h-80v-104L216,800ZM367,423L160,216l56,-56 207,207 -56,56Z"/>
</vector>

View file

@ -44,12 +44,21 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="1" /> android:layout_weight="1" />
<ImageButton
android:id="@+id/random"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_marginStart="8dp"
android:background="?android:attr/selectableItemBackground"
android:contentDescription="@string/random_selection"
app:tint="?attr/colorOnBackground"
app:srcCompat="@drawable/ic_shuffle_24" />
<ImageButton <ImageButton
android:id="@+id/listSort" android:id="@+id/listSort"
android:layout_width="48dp" android:layout_width="48dp"
android:layout_height="48dp" android:layout_height="48dp"
android:layout_marginLeft="16dp" android:layout_marginEnd="16dp"
android:layout_marginRight="16dp"
android:background="?android:attr/selectableItemBackground" android:background="?android:attr/selectableItemBackground"
android:contentDescription="@string/sort_by" android:contentDescription="@string/sort_by"
app:tint="?attr/colorOnBackground" app:tint="?attr/colorOnBackground"

View file

@ -341,6 +341,25 @@
app:drawableEndCompat="@drawable/ic_round_arrow_drop_down_24" app:drawableEndCompat="@drawable/ic_round_arrow_drop_down_24"
tools:ignore="TextContrastCheck" /> tools:ignore="TextContrastCheck" />
<com.google.android.material.switchmaterial.SwitchMaterial
android:id="@+id/settingsIncognito"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:checked="false"
android:drawableStart="@drawable/ic_incognito_24"
android:drawablePadding="16dp"
android:elegantTextHeight="true"
android:fontFamily="@font/poppins_bold"
android:minHeight="64dp"
android:text="@string/incognito_mode"
android:textAlignment="viewStart"
android:textColor="?attr/colorOnBackground"
android:layout_marginStart="4dp"
app:cornerRadius="0dp"
app:drawableTint="?attr/colorPrimary"
app:showText="false"
app:thumbTint="@color/button_switch_track" />
<LinearLayout <LinearLayout
android:id="@+id/settingsAnilistLoginContainer" android:id="@+id/settingsAnilistLoginContainer"
android:layout_width="match_parent" android:layout_width="match_parent"
@ -353,6 +372,7 @@
android:layout_marginStart="4dp" android:layout_marginStart="4dp"
android:layout_marginEnd="20dp" android:layout_marginEnd="20dp"
android:contentDescription="@string/anilist" android:contentDescription="@string/anilist"
app:tint="?attr/colorPrimary"
app:srcCompat="@drawable/ic_anilist" /> app:srcCompat="@drawable/ic_anilist" />
<LinearLayout <LinearLayout
@ -371,7 +391,8 @@
android:fontFamily="@font/poppins_bold" android:fontFamily="@font/poppins_bold"
android:gravity="center" android:gravity="center"
android:text="@string/username" android:text="@string/username"
android:textSize="16sp" /> android:textSize="16sp"
android:textColor="?attr/colorSecondary"/>
<TextView <TextView
android:id="@+id/settingsAnilistLogin" android:id="@+id/settingsAnilistLogin"
@ -383,7 +404,6 @@
android:fontFamily="@font/poppins_bold" android:fontFamily="@font/poppins_bold"
android:padding="16dp" android:padding="16dp"
android:text="@string/logout" android:text="@string/logout"
android:textColor="?attr/colorSecondary"
android:textSize="14sp" /> android:textSize="14sp" />
</LinearLayout> </LinearLayout>
@ -419,6 +439,7 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_marginEnd="16dp" android:layout_marginEnd="16dp"
android:contentDescription="@string/myanimelist" android:contentDescription="@string/myanimelist"
app:tint="?attr/colorPrimary"
app:srcCompat="@drawable/ic_myanimelist" /> app:srcCompat="@drawable/ic_myanimelist" />
<LinearLayout <LinearLayout
@ -447,7 +468,8 @@
android:fontFamily="@font/poppins_bold" android:fontFamily="@font/poppins_bold"
android:gravity="center" android:gravity="center"
android:text="@string/username" android:text="@string/username"
android:textSize="16sp" /> android:textSize="16sp"
android:textColor="?attr/colorSecondary"/>
<TextView <TextView
android:id="@+id/settingsMALLogin" android:id="@+id/settingsMALLogin"
@ -459,7 +481,6 @@
android:fontFamily="@font/poppins_bold" android:fontFamily="@font/poppins_bold"
android:padding="16dp" android:padding="16dp"
android:text="@string/logout" android:text="@string/logout"
android:textColor="?attr/colorSecondary"
android:textSize="14sp" /> android:textSize="14sp" />
</LinearLayout> </LinearLayout>
@ -495,7 +516,7 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_marginEnd="16dp" android:layout_marginEnd="16dp"
android:src="@drawable/ic_discord" android:src="@drawable/ic_discord"
app:tint="?attr/colorOnBackground" app:tint="?attr/colorPrimary"
tools:ignore="ContentDescription" /> tools:ignore="ContentDescription" />
<LinearLayout <LinearLayout
@ -515,7 +536,8 @@
android:gravity="center" android:gravity="center"
android:maxLines="1" android:maxLines="1"
android:text="@string/username" android:text="@string/username"
android:textSize="16sp" /> android:textSize="16sp"
android:textColor="?attr/colorSecondary"/>
<TextView <TextView
android:id="@+id/settingsDiscordLogin" android:id="@+id/settingsDiscordLogin"
@ -527,7 +549,6 @@
android:fontFamily="@font/poppins_bold" android:fontFamily="@font/poppins_bold"
android:padding="16dp" android:padding="16dp"
android:text="@string/logout" android:text="@string/logout"
android:textColor="?attr/colorSecondary"
android:textSize="14sp" /> android:textSize="14sp" />
</LinearLayout> </LinearLayout>
@ -573,7 +594,6 @@
app:drawableStartCompat="@drawable/ic_round_help_24" app:drawableStartCompat="@drawable/ic_round_help_24"
app:drawableTint="?attr/colorPrimary" /> app:drawableTint="?attr/colorPrimary" />
</ani.dantotsu.others.Xpandable> </ani.dantotsu.others.Xpandable>
<ani.dantotsu.others.Xpandable <ani.dantotsu.others.Xpandable

View file

@ -246,6 +246,16 @@
app:tint="?attr/colorOnBackground" app:tint="?attr/colorOnBackground"
tools:ignore="ContentDescription,ImageContrastCheck" /> tools:ignore="ContentDescription,ImageContrastCheck" />
<ImageView
android:id="@+id/animeDownloadTop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:alpha="1"
android:padding="8dp"
app:srcCompat="@drawable/ic_round_download_24"
app:tint="?attr/colorOnBackground"
tools:ignore="ContentDescription,ImageContrastCheck" />
<ImageView <ImageView
android:id="@+id/animeScanlatorTop" android:id="@+id/animeScanlatorTop"
android:layout_width="wrap_content" android:layout_width="wrap_content"

View file

@ -7,7 +7,7 @@
android:layout_marginTop="-4dp" android:layout_marginTop="-4dp"
android:layout_marginEnd="4dp" android:layout_marginEnd="4dp"
android:layout_marginBottom="-4dp" android:layout_marginBottom="-4dp"
app:chipBackgroundColor="@color/bg_black" app:chipBackgroundColor="@color/chip_background_color"
android:elegantTextHeight="true" android:elegantTextHeight="true"
android:textAppearance="@style/Suffix" android:textAppearance="@style/Suffix"
app:chipStrokeColor="?attr/colorPrimaryContainer" app:chipStrokeColor="?attr/colorPrimaryContainer"

View file

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="16dp">
<TextView
android:id="@+id/dialog_message"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/incognito_will_not_update"
android:paddingBottom="16dp"
android:textSize="12sp"
android:fontFamily="@font/poppins_bold"/>
<CheckBox
android:id="@+id/dialog_checkbox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/dont_ask_again"
android:textSize="12sp"
android:fontFamily="@font/poppins_bold"/>
</LinearLayout>

View file

@ -493,6 +493,7 @@
<string name="auto_update">Auto Update progress for %1$s?</string> <string name="auto_update">Auto Update progress for %1$s?</string>
<string name="continue_from">Continue from %1$s?</string> <string name="continue_from">Continue from %1$s?</string>
<string name="title_update_progress">Update progress on anilist?</string> <string name="title_update_progress">Update progress on anilist?</string>
<string name="incognito_will_not_update">Incognito mode will still ignore progress.</string>
<string name="dont_ask_again">"Don\'t ask again for %1$s"</string> <string name="dont_ask_again">"Don\'t ask again for %1$s"</string>
<string name="default_speed">Default Speed</string> <string name="default_speed">Default Speed</string>
<string name="default_resize_mode">Default Resize Mode</string> <string name="default_resize_mode">Default Resize Mode</string>
@ -628,9 +629,19 @@
<string name="extensions_settings">Extensions</string> <string name="extensions_settings">Extensions</string>
<string name="NSFWExtention">NSFW Extensions</string> <string name="NSFWExtention">NSFW Extensions</string>
<string name="skip_loading_extension_icons">Skip loading extension icons</string> <string name="skip_loading_extension_icons">Skip loading extension icons</string>
<string name="use_material_you">Use Material You</string> <string name="use_material_you">Material You</string>
<string name="extension_specific_dns">Extension-specific DNS</string> <string name="extension_specific_dns">Extension-specific DNS</string>
<string name="theme_">Theme:</string> <string name="theme_">Theme:</string>
<string name="user_agent">User Agent</string> <string name="user_agent">User Agent</string>
<string name="custom_theme">Custom Theme</string>
<string name="use_custom_theme">Custom theme</string>
<string name="use_unique_theme_for_each_item">Color same as Anime/Manga cover</string>
<string name="oled_theme_variant">OLED theme variant</string>
<string name="installed_anime">Installed Anime</string>
<string name="available_anime">Available Anime</string>
<string name="installed_manga">Installed Manga</string>
<string name="color_picker">Color Picker</string>
<string name="random_selection">Random Selection</string>
<string name="incognito_mode">Incognito Mode</string>
</resources> </resources>

View file

@ -10,6 +10,6 @@
<color name="status">#54000000</color> <color name="status">#54000000</color>
<color name="nav_status">#80000000</color> <color name="nav_status">#80000000</color>
<color name="filler">#29FF6B08</color> <color name="filler">#29FF6B08</color>
<color name="chip">#b3aead</color>
<color name="grey_nav">#E8222222</color> <color name="grey_nav">#E8222222</color>
</resources> </resources>

View file

@ -22,7 +22,7 @@
<color name="grey_60">#999999</color> <color name="grey_60">#999999</color>
<color name="darkest_Black">#000000</color> <color name="darkest_Black">#000000</color>
<color name="yt_red">#CD201F</color> <color name="yt_red">#CD201F</color>
<color name="chip">#a3a2a2</color>
<color name="grey_nav">#E8EDEDED</color> <color name="grey_nav">#E8EDEDED</color>
<!-- theme 1 --> <!-- theme 1 -->

View file

@ -493,6 +493,7 @@
<string name="auto_update">Auto Update progress for %1$s?</string> <string name="auto_update">Auto Update progress for %1$s?</string>
<string name="continue_from">Continue from %1$s?</string> <string name="continue_from">Continue from %1$s?</string>
<string name="title_update_progress">Update progress on anilist?</string> <string name="title_update_progress">Update progress on anilist?</string>
<string name="incognito_will_not_update">Incognito mode will still ignore progress.</string>
<string name="dont_ask_again">"Don\'t ask again for %1$s"</string> <string name="dont_ask_again">"Don\'t ask again for %1$s"</string>
<string name="default_speed">Default Speed</string> <string name="default_speed">Default Speed</string>
<string name="default_resize_mode">Default Resize Mode</string> <string name="default_resize_mode">Default Resize Mode</string>
@ -640,5 +641,7 @@
<string name="available_anime">Available Anime</string> <string name="available_anime">Available Anime</string>
<string name="installed_manga">Installed Manga</string> <string name="installed_manga">Installed Manga</string>
<string name="color_picker">Color Picker</string> <string name="color_picker">Color Picker</string>
<string name="random_selection">Random Selection</string>
<string name="incognito_mode">Incognito Mode</string>
</resources> </resources>