diff --git a/app/build.gradle b/app/build.gradle
index eac864f1..5caa29de 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -28,9 +28,11 @@ android {
buildTypes {
debug {
applicationIdSuffix ".beta"
+ manifestPlaceholders = [icon_placeholder: "@mipmap/ic_launcher_beta"]
debuggable true
}
release {
+ manifestPlaceholders = [icon_placeholder: "@mipmap/ic_launcher"]
debuggable false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
@@ -76,11 +78,11 @@ dependencies {
// FireBase
implementation platform('com.google.firebase:firebase-bom:32.2.3')
- implementation 'com.google.firebase:firebase-analytics-ktx:21.3.0'
- implementation 'com.google.firebase:firebase-crashlytics-ktx:18.4.3'
+ implementation 'com.google.firebase:firebase-analytics-ktx:21.5.0'
+ implementation 'com.google.firebase:firebase-crashlytics-ktx:18.6.0'
// Exoplayer
- ext.exo_version = '1.1.1'
+ ext.exo_version = '1.2.0'
implementation "androidx.media3:media3-exoplayer:$exo_version"
implementation "androidx.media3:media3-ui:$exo_version"
implementation "androidx.media3:media3-exoplayer-hls:$exo_version"
diff --git a/app/src/debug/res/values/strings.xml b/app/src/debug/res/values/strings.xml
index e74ebc2f..ef58c36a 100644
--- a/app/src/debug/res/values/strings.xml
+++ b/app/src/debug/res/values/strings.xml
@@ -1,4 +1,4 @@
- Dantotsu
+ Dantotsu ß
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 6647fea0..b3e07cea 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -47,7 +47,7 @@
(null)
fun getMangaChapter(): LiveData = mangaChapter
suspend fun loadMangaChapterImages(chapter: MangaChapter, selected: Selected, series: String, post: Boolean = true): Boolean {
- //check if the chapter has been downloaded already
- val downloadsManager = Injekt.get()
- if(downloadsManager.mangaDownloads.contains(Download(series, chapter.title!!, Download.Type.MANGA))) {
- val download = downloadsManager.mangaDownloads.find { it.title == series && it.chapter == chapter.title!! } ?: return false
- //look in the downloads folder for the chapter and add all the numerically named images to the chapter
- val directory = File(
- currContext()?.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS),
- "Dantotsu/Manga/$series/${chapter.title!!}"
- )
- val images = mutableListOf()
- directory.listFiles()?.forEach {
- if (it.nameWithoutExtension.toIntOrNull() != null) {
- images.add(MangaImage(FileUrl(it.absolutePath), false))
- }
- }
- //sort the images by name
- images.sortBy { it.url.url }
- chapter.addImages(images)
- if (post) mangaChapter.postValue(chapter)
- return true
- }
+
return tryWithSuspend(true) {
chapter.addImages(
mangaReadSources?.get(selected.sourceIndex)?.loadImages(chapter.link, chapter.sChapter) ?: return@tryWithSuspend false
diff --git a/app/src/main/java/ani/dantotsu/media/anime/AnimeWatchFragment.kt b/app/src/main/java/ani/dantotsu/media/anime/AnimeWatchFragment.kt
index 0613eceb..0dc1fda7 100644
--- a/app/src/main/java/ani/dantotsu/media/anime/AnimeWatchFragment.kt
+++ b/app/src/main/java/ani/dantotsu/media/anime/AnimeWatchFragment.kt
@@ -321,16 +321,18 @@ class AnimeWatchFragment : Fragment() {
dialog.dismiss()
// Move the fragment transaction here
- val fragment =
- AnimeSourcePreferencesFragment().getInstance(selectedSetting.id){
- changeUIVisibility(true)
- loadEpisodes(media.selected!!.sourceIndex, true)
- }
- parentFragmentManager.beginTransaction()
- .setCustomAnimations(R.anim.slide_up, R.anim.slide_down)
- .replace(R.id.fragmentExtensionsContainer, fragment)
- .addToBackStack(null)
- .commit()
+ requireActivity().runOnUiThread {
+ val fragment =
+ AnimeSourcePreferencesFragment().getInstance(selectedSetting.id) {
+ changeUIVisibility(true)
+ loadEpisodes(media.selected!!.sourceIndex, true)
+ }
+ parentFragmentManager.beginTransaction()
+ .setCustomAnimations(R.anim.slide_up, R.anim.slide_down)
+ .replace(R.id.fragmentExtensionsContainer, fragment)
+ .addToBackStack(null)
+ .commit()
+ }
}
.setNegativeButton("Cancel") { dialog, _ ->
dialog.cancel()
@@ -340,15 +342,18 @@ class AnimeWatchFragment : Fragment() {
.show()
} else {
// If there's only one setting, proceed with the fragment transaction
- val fragment = AnimeSourcePreferencesFragment().getInstance(selectedSetting.id){
- changeUIVisibility(true)
- loadEpisodes(media.selected!!.sourceIndex, true)
+ requireActivity().runOnUiThread {
+ val fragment =
+ AnimeSourcePreferencesFragment().getInstance(selectedSetting.id) {
+ changeUIVisibility(true)
+ loadEpisodes(media.selected!!.sourceIndex, true)
+ }
+ parentFragmentManager.beginTransaction()
+ .setCustomAnimations(R.anim.slide_up, R.anim.slide_down)
+ .replace(R.id.fragmentExtensionsContainer, fragment)
+ .addToBackStack(null)
+ .commit()
}
- parentFragmentManager.beginTransaction()
- .setCustomAnimations(R.anim.slide_up, R.anim.slide_down)
- .replace(R.id.fragmentExtensionsContainer, fragment)
- .addToBackStack(null)
- .commit()
}
changeUIVisibility(false)
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 2617907a..abf500ce 100644
--- a/app/src/main/java/ani/dantotsu/media/anime/ExoplayerView.kt
+++ b/app/src/main/java/ani/dantotsu/media/anime/ExoplayerView.kt
@@ -323,7 +323,7 @@ class ExoplayerView : AppCompatActivity(), Player.Listener {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
LangSet.setLocale(this)
-ThemeManager(this).applyTheme()
+ ThemeManager(this).applyTheme()
binding = ActivityExoplayerBinding.inflate(layoutInflater)
setContentView(binding.root)
@@ -1450,6 +1450,7 @@ ThemeManager(this).applyTheme()
override fun onResume() {
super.onResume()
+ LangSet.setLocale(this)
orientationListener?.enable()
hideSystemBars()
if (isInitialized) {
diff --git a/app/src/main/java/ani/dantotsu/media/manga/MangaChapterAdapter.kt b/app/src/main/java/ani/dantotsu/media/manga/MangaChapterAdapter.kt
index cfce2642..b14a81f1 100644
--- a/app/src/main/java/ani/dantotsu/media/manga/MangaChapterAdapter.kt
+++ b/app/src/main/java/ani/dantotsu/media/manga/MangaChapterAdapter.kt
@@ -139,7 +139,7 @@ class MangaChapterAdapter(
binding.itemDownload.postDelayed({
binding.itemDownload.setImageResource(R.drawable.ic_circle_cancel)
binding.itemDownload.setColorFilter(typedValue2.data)
- }, 5000)
+ }, 1000)
} else {
// Show download icon
binding.itemDownload.setImageResource(R.drawable.ic_circle_add)
diff --git a/app/src/main/java/ani/dantotsu/parsers/OfflineMangaParser.kt b/app/src/main/java/ani/dantotsu/parsers/OfflineMangaParser.kt
index 50e3fed3..3684ee8b 100644
--- a/app/src/main/java/ani/dantotsu/parsers/OfflineMangaParser.kt
+++ b/app/src/main/java/ani/dantotsu/parsers/OfflineMangaParser.kt
@@ -3,6 +3,7 @@ package ani.dantotsu.parsers
import android.os.Environment
import ani.dantotsu.currContext
import ani.dantotsu.download.DownloadsManager
+import ani.dantotsu.logger
import ani.dantotsu.media.manga.MangaNameAdapter
import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga
@@ -47,6 +48,7 @@ class OfflineMangaParser: MangaParser() {
"Dantotsu/Manga/$chapterLink"
)
val images = mutableListOf()
+ val imageNumberRegex = Regex("""(\d+)\.jpg$""")
if (directory.exists()) {
directory.listFiles()?.forEach {
if (it.isFile) {
@@ -54,6 +56,13 @@ class OfflineMangaParser: MangaParser() {
images.add(image)
}
}
+ images.sortBy { image ->
+ val matchResult = imageNumberRegex.find(image.url.url)
+ matchResult?.groups?.get(1)?.value?.toIntOrNull() ?: Int.MAX_VALUE
+ }
+ for (image in images) {
+ logger("imageNumber: ${image.url.url}")
+ }
return images
}
return emptyList()
diff --git a/app/src/main/java/ani/dantotsu/settings/InstalledAnimeExtensionsFragment.kt b/app/src/main/java/ani/dantotsu/settings/InstalledAnimeExtensionsFragment.kt
index 980fa019..b668cf2a 100644
--- a/app/src/main/java/ani/dantotsu/settings/InstalledAnimeExtensionsFragment.kt
+++ b/app/src/main/java/ani/dantotsu/settings/InstalledAnimeExtensionsFragment.kt
@@ -63,19 +63,26 @@ class InstalledAnimeExtensionsFragment : Fragment() {
dialog.dismiss()
// Move the fragment transaction here
- val fragment = AnimeSourcePreferencesFragment().getInstance(selectedSetting.id){
- val activity = requireActivity() as ExtensionsActivity
- activity.findViewById(R.id.viewPager).visibility = View.VISIBLE
- activity.findViewById(R.id.tabLayout).visibility = View.VISIBLE
- activity.findViewById(R.id.searchView).visibility = View.VISIBLE
- activity.findViewById(R.id.fragmentExtensionsContainer).visibility =
- View.GONE
+ val eActivity = requireActivity() as ExtensionsActivity
+ eActivity.runOnUiThread {
+ val fragment =
+ AnimeSourcePreferencesFragment().getInstance(selectedSetting.id) {
+
+ eActivity.findViewById(R.id.viewPager).visibility =
+ View.VISIBLE
+ eActivity.findViewById(R.id.tabLayout).visibility =
+ View.VISIBLE
+ eActivity.findViewById(R.id.searchView).visibility =
+ View.VISIBLE
+ eActivity.findViewById(R.id.fragmentExtensionsContainer).visibility =
+ View.GONE
+ }
+ parentFragmentManager.beginTransaction()
+ .setCustomAnimations(R.anim.slide_up, R.anim.slide_down)
+ .replace(R.id.fragmentExtensionsContainer, fragment)
+ .addToBackStack(null)
+ .commit()
}
- parentFragmentManager.beginTransaction()
- .setCustomAnimations(R.anim.slide_up, R.anim.slide_down)
- .replace(R.id.fragmentExtensionsContainer, fragment)
- .addToBackStack(null)
- .commit()
}
.setNegativeButton("Cancel") { dialog, _ ->
dialog.cancel()
@@ -84,19 +91,26 @@ class InstalledAnimeExtensionsFragment : Fragment() {
.show()
} else {
// If there's only one setting, proceed with the fragment transaction
- val fragment = AnimeSourcePreferencesFragment().getInstance(selectedSetting.id){
- val activity = requireActivity() as ExtensionsActivity
- activity.findViewById(R.id.viewPager).visibility = View.VISIBLE
- activity.findViewById(R.id.tabLayout).visibility = View.VISIBLE
- activity.findViewById(R.id.searchView).visibility = View.VISIBLE
- activity.findViewById(R.id.fragmentExtensionsContainer).visibility =
- View.GONE
+ val eActivity = requireActivity() as ExtensionsActivity
+ eActivity.runOnUiThread {
+ val fragment =
+ AnimeSourcePreferencesFragment().getInstance(selectedSetting.id) {
+
+ eActivity.findViewById(R.id.viewPager).visibility =
+ View.VISIBLE
+ eActivity.findViewById(R.id.tabLayout).visibility =
+ View.VISIBLE
+ eActivity.findViewById(R.id.searchView).visibility =
+ View.VISIBLE
+ eActivity.findViewById(R.id.fragmentExtensionsContainer).visibility =
+ View.GONE
+ }
+ parentFragmentManager.beginTransaction()
+ .setCustomAnimations(R.anim.slide_up, R.anim.slide_down)
+ .replace(R.id.fragmentExtensionsContainer, fragment)
+ .addToBackStack(null)
+ .commit()
}
- parentFragmentManager.beginTransaction()
- .setCustomAnimations(R.anim.slide_up, R.anim.slide_down)
- .replace(R.id.fragmentExtensionsContainer, fragment)
- .addToBackStack(null)
- .commit()
}
// Hide ViewPager2 and TabLayout
@@ -149,7 +163,7 @@ class InstalledAnimeExtensionsFragment : Fragment() {
context,
Notifications.CHANNEL_DOWNLOADER_PROGRESS
)
- .setSmallIcon(androidx.media3.ui.R.drawable.exo_ic_check)
+ .setSmallIcon(R.drawable.ic_circle_check)
.setContentTitle("Update complete")
.setContentText("The extension has been successfully updated.")
.setPriority(NotificationCompat.PRIORITY_LOW)
@@ -192,13 +206,11 @@ class InstalledAnimeExtensionsFragment : Fragment() {
private class AnimeExtensionsAdapter(
private val onSettingsClicked: (AnimeExtension.Installed) -> Unit,
private val onUninstallClicked: (AnimeExtension.Installed) -> Unit,
- skipIcons: Boolean
+ val skipIcons: Boolean
) : ListAdapter(
DIFF_CALLBACK_INSTALLED
) {
- val skipIcons = skipIcons
-
fun updateData(newExtensions: List) {
submitList(newExtensions) // Use submitList instead of manual list handling
}
diff --git a/app/src/main/java/ani/dantotsu/settings/extensionprefs/AnimePreferenceFragmentCompat.kt b/app/src/main/java/ani/dantotsu/settings/extensionprefs/AnimePreferenceFragmentCompat.kt
index b4f93561..b82629f5 100644
--- a/app/src/main/java/ani/dantotsu/settings/extensionprefs/AnimePreferenceFragmentCompat.kt
+++ b/app/src/main/java/ani/dantotsu/settings/extensionprefs/AnimePreferenceFragmentCompat.kt
@@ -44,7 +44,7 @@ class AnimeSourcePreferencesFragment : PreferenceFragmentCompat() {
onCloseAction?.invoke()
}
- fun populateAnimePreferenceScreen(): PreferenceScreen {
+ private fun populateAnimePreferenceScreen(): PreferenceScreen {
val sourceId = requireArguments().getLong(SOURCE_ID)
val source = Injekt.get().get(sourceId)!!
check(source is ConfigurableAnimeSource)
@@ -57,11 +57,11 @@ class AnimeSourcePreferencesFragment : PreferenceFragmentCompat() {
pref.isIconSpaceReserved = false
if (pref is DialogPreference) {
pref.dialogTitle = pref.title
- println("pref.dialogTitle: ${pref.dialogTitle}")
+ //println("pref.dialogTitle: ${pref.dialogTitle}")
}
- for (entry in sharedPreferences.all.entries) {
+ /*for (entry in sharedPreferences.all.entries) {
Log.d("Preferences", "Key: ${entry.key}, Value: ${entry.value}")
- }
+ }*/
// Apply incognito IME for EditTextPreference
if (pref is EditTextPreference) {
diff --git a/app/src/main/res/drawable/anim_splash_beta.xml b/app/src/main/res/drawable/anim_splash_beta.xml
new file mode 100644
index 00000000..3338cb41
--- /dev/null
+++ b/app/src/main/res/drawable/anim_splash_beta.xml
@@ -0,0 +1,377 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_launcher_beta_background.xml b/app/src/main/res/drawable/ic_launcher_beta_background.xml
new file mode 100644
index 00000000..657fc674
--- /dev/null
+++ b/app/src/main/res/drawable/ic_launcher_beta_background.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_launcher_beta_foreground.xml b/app/src/main/res/drawable/ic_launcher_beta_foreground.xml
new file mode 100644
index 00000000..f19b9a98
--- /dev/null
+++ b/app/src/main/res/drawable/ic_launcher_beta_foreground.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/splash_screen.xml b/app/src/main/res/layout/splash_screen.xml
index eac727b5..28b6cc3a 100644
--- a/app/src/main/res/layout/splash_screen.xml
+++ b/app/src/main/res/layout/splash_screen.xml
@@ -3,7 +3,7 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:background="@color/bg_black">
+ android:background="?android:colorBackground">
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_beta_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_beta_round.xml
new file mode 100644
index 00000000..4b4e6996
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_beta_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_beta.webp b/app/src/main/res/mipmap-hdpi/ic_launcher_beta.webp
new file mode 100644
index 00000000..f8f3052a
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_beta.webp differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_beta_round.webp b/app/src/main/res/mipmap-hdpi/ic_launcher_beta_round.webp
new file mode 100644
index 00000000..f8f3052a
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_beta_round.webp differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_beta.webp b/app/src/main/res/mipmap-mdpi/ic_launcher_beta.webp
new file mode 100644
index 00000000..587346da
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_beta.webp differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_beta_round.webp b/app/src/main/res/mipmap-mdpi/ic_launcher_beta_round.webp
new file mode 100644
index 00000000..587346da
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_beta_round.webp differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_beta.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher_beta.webp
new file mode 100644
index 00000000..489d7184
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_beta.webp differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_beta_round.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher_beta_round.webp
new file mode 100644
index 00000000..489d7184
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_beta_round.webp differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_beta.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher_beta.webp
new file mode 100644
index 00000000..572b138d
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_beta.webp differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_beta_round.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher_beta_round.webp
new file mode 100644
index 00000000..572b138d
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_beta_round.webp differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_beta.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_beta.webp
new file mode 100644
index 00000000..74847160
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_beta.webp differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_beta_round.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_beta_round.webp
new file mode 100644
index 00000000..74847160
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_beta_round.webp differ
diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml
index e810dfc0..73a2114d 100644
--- a/app/src/main/res/values-night/themes.xml
+++ b/app/src/main/res/values-night/themes.xml
@@ -1,4 +1,4 @@
-
+