diff --git a/app/build.gradle b/app/build.gradle index 85f46e77..149ec9e7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -120,7 +120,7 @@ dependencies { implementation 'com.squareup.okhttp3:okhttp-dnsoverhttps' implementation 'com.squareup.okio:okio:3.7.0' implementation 'ch.acra:acra-http:5.11.3' - implementation 'org.jsoup:jsoup:1.17.2' + implementation 'org.jsoup:jsoup:1.15.4' implementation 'org.jetbrains.kotlinx:kotlinx-serialization-json-okio:1.6.2' implementation 'com.jakewharton.rxrelay:rxrelay:1.2.0' implementation 'com.github.tachiyomiorg:unifile:17bec43' diff --git a/app/src/main/java/ani/dantotsu/download/manga/MangaDownloaderService.kt b/app/src/main/java/ani/dantotsu/download/manga/MangaDownloaderService.kt index 95b3e565..0a1337df 100644 --- a/app/src/main/java/ani/dantotsu/download/manga/MangaDownloaderService.kt +++ b/app/src/main/java/ani/dantotsu/download/manga/MangaDownloaderService.kt @@ -309,7 +309,16 @@ class MangaDownloaderService : Service() { val jsonString = gson.toJson(media) withContext(Dispatchers.Main) { - file.writeText(jsonString) + try { + file.writeText(jsonString) + } catch (e: android.system.ErrnoException) { + e.printStackTrace() + Toast.makeText( + this@MangaDownloaderService, + "Error while saving: ${e.localizedMessage}", + Toast.LENGTH_LONG + ).show() + } } } } diff --git a/app/src/main/java/ani/dantotsu/media/Media.kt b/app/src/main/java/ani/dantotsu/media/Media.kt index 3360a94a..ebc4d4f7 100644 --- a/app/src/main/java/ani/dantotsu/media/Media.kt +++ b/app/src/main/java/ani/dantotsu/media/Media.kt @@ -118,6 +118,19 @@ data class Media( fun mangaName() = if (countryOfOrigin != "JP") mainName() else nameRomaji } +fun emptyMedia() = Media( + id = 0, + name = "No media found", + nameRomaji = "No media found", + userPreferredName = "", + isAdult = false, + isFav = false, + isListPrivate = false, + userScore = 0, + userStatus = "", + format = "", +) + object MediaSingleton { var media: Media? = null var bitmap: Bitmap? = null diff --git a/app/src/main/java/ani/dantotsu/media/MediaDetailsActivity.kt b/app/src/main/java/ani/dantotsu/media/MediaDetailsActivity.kt index 6a693ce1..4f1e4c0c 100644 --- a/app/src/main/java/ani/dantotsu/media/MediaDetailsActivity.kt +++ b/app/src/main/java/ani/dantotsu/media/MediaDetailsActivity.kt @@ -72,12 +72,16 @@ class MediaDetailsActivity : AppCompatActivity(), AppBarLayout.OnOffsetChangedLi @SuppressLint("SetTextI18n", "ClickableViewAccessibility") override fun onCreate(savedInstanceState: Bundle?) { - LangSet.setLocale(this) - var media: Media = intent.getSerialized("media") ?: mediaSingleton ?: return + super.onCreate(savedInstanceState) + var media: Media = intent.getSerialized("media") ?: mediaSingleton ?: emptyMedia() + if (media.name == "No media found") { + snackString(media.name) + onBackPressedDispatcher.onBackPressed() + return + } mediaSingleton = null ThemeManager(this).applyTheme(MediaSingleton.bitmap) MediaSingleton.bitmap = null - super.onCreate(savedInstanceState) binding = ActivityMediaBinding.inflate(layoutInflater) setContentView(binding.root) diff --git a/app/src/main/java/ani/dantotsu/media/SearchActivity.kt b/app/src/main/java/ani/dantotsu/media/SearchActivity.kt index 0357ea5f..4c71664b 100644 --- a/app/src/main/java/ani/dantotsu/media/SearchActivity.kt +++ b/app/src/main/java/ani/dantotsu/media/SearchActivity.kt @@ -159,7 +159,7 @@ class SearchActivity : AppCompatActivity() { fun search() { val size = model.searchResults.results.size model.searchResults.results.clear() - runOnUiThread { + binding.searchRecyclerView.post { mediaAdaptor.notifyItemRangeRemoved(0, size) } diff --git a/app/src/main/java/ani/dantotsu/media/anime/AnimeWatchAdapter.kt b/app/src/main/java/ani/dantotsu/media/anime/AnimeWatchAdapter.kt index b7d9c016..2f70a2a9 100644 --- a/app/src/main/java/ani/dantotsu/media/anime/AnimeWatchAdapter.kt +++ b/app/src/main/java/ani/dantotsu/media/anime/AnimeWatchAdapter.kt @@ -31,6 +31,7 @@ import ani.dantotsu.subcriptions.Notifications.Companion.openSettings import ani.dantotsu.subcriptions.Subscription.Companion.getChannelId import com.google.android.material.chip.Chip import eu.kanade.tachiyomi.animesource.online.AnimeHttpSource +import eu.kanade.tachiyomi.util.system.WebViewUtil import kotlinx.coroutines.MainScope import kotlinx.coroutines.launch @@ -245,6 +246,9 @@ class AnimeWatchAdapter( run = true } dialogBinding.animeWebviewContainer.setOnClickListener { + if (!WebViewUtil.supportsWebView(fragment.requireContext())) { + toast("WebView not installed") + } //start CookieCatcher activity if (watchSources.names.isNotEmpty() && source in 0 until watchSources.names.size) { val sourceAHH = watchSources[source] as? DynamicAnimeParser 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 152a5783..f5a1742a 100644 --- a/app/src/main/java/ani/dantotsu/media/anime/ExoplayerView.kt +++ b/app/src/main/java/ani/dantotsu/media/anime/ExoplayerView.kt @@ -1806,6 +1806,7 @@ class ExoplayerView : AppCompatActivity(), Player.Listener, SessionAvailabilityL } super.onDestroy() + Glide.with(this).clear(exoPlay) finishAndRemoveTask() } @@ -1934,6 +1935,8 @@ class ExoplayerView : AppCompatActivity(), Player.Listener, SessionAvailabilityL snackString("Cast API not available") return } + //make sure mediaItem is initialized and castPlayer is not null + if (!this::mediaItem.isInitialized || castPlayer == null) return castPlayer?.setMediaItem(mediaItem) castPlayer?.prepare() playerView.player = castPlayer diff --git a/app/src/main/java/ani/dantotsu/media/manga/MangaReadAdapter.kt b/app/src/main/java/ani/dantotsu/media/manga/MangaReadAdapter.kt index b1e8ee0a..b4364b65 100644 --- a/app/src/main/java/ani/dantotsu/media/manga/MangaReadAdapter.kt +++ b/app/src/main/java/ani/dantotsu/media/manga/MangaReadAdapter.kt @@ -32,6 +32,7 @@ import ani.dantotsu.subcriptions.Notifications.Companion.openSettings import ani.dantotsu.subcriptions.Subscription.Companion.getChannelId import com.google.android.material.chip.Chip import eu.kanade.tachiyomi.source.online.HttpSource +import eu.kanade.tachiyomi.util.system.WebViewUtil import kotlinx.coroutines.MainScope import kotlinx.coroutines.launch @@ -203,6 +204,9 @@ class MangaReadAdapter( run = true } dialogBinding.animeWebviewContainer.setOnClickListener { + if (!WebViewUtil.supportsWebView(fragment.requireContext())) { + toast("WebView not installed") + } //start CookieCatcher activity if (mangaReadSources.names.isNotEmpty() && source in 0 until mangaReadSources.names.size) { val sourceAHH = mangaReadSources[source] as? DynamicMangaParser 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 c3e3b4f4..4caf9e21 100644 --- a/app/src/main/java/ani/dantotsu/settings/extensionprefs/AnimePreferenceFragmentCompat.kt +++ b/app/src/main/java/ani/dantotsu/settings/extensionprefs/AnimePreferenceFragmentCompat.kt @@ -10,6 +10,7 @@ import androidx.preference.EditTextPreference import androidx.preference.PreferenceFragmentCompat import androidx.preference.forEach import androidx.preference.getOnBindEditTextListener +import ani.dantotsu.snackString import eu.kanade.tachiyomi.PreferenceScreen import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource import eu.kanade.tachiyomi.data.preference.SharedPreferencesDataStore @@ -21,7 +22,12 @@ import uy.kohesive.injekt.api.get class AnimeSourcePreferencesFragment : PreferenceFragmentCompat() { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { - preferenceScreen = populateAnimePreferenceScreen() + preferenceScreen = try { + populateAnimePreferenceScreen() + } catch (e: Exception) { + snackString(e.message ?: "Unknown error") + preferenceManager.createPreferenceScreen(requireContext()) + } //set background color val color = TypedValue() requireContext().theme.resolveAttribute( @@ -42,8 +48,8 @@ class AnimeSourcePreferencesFragment : PreferenceFragmentCompat() { private fun populateAnimePreferenceScreen(): PreferenceScreen { val sourceId = requireArguments().getLong(SOURCE_ID) - val source = Injekt.get().get(sourceId)!! - check(source is ConfigurableAnimeSource) + val source = Injekt.get().get(sourceId) as? ConfigurableAnimeSource + ?: error("Source with id: $sourceId not found!") val sharedPreferences = requireContext().getSharedPreferences(source.getPreferenceKey(), Context.MODE_PRIVATE) val dataStore = SharedPreferencesDataStore(sharedPreferences) diff --git a/app/src/main/java/eu/kanade/tachiyomi/network/AndroidCookieJar.kt b/app/src/main/java/eu/kanade/tachiyomi/network/AndroidCookieJar.kt index 82b04be2..055bab09 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/network/AndroidCookieJar.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/network/AndroidCookieJar.kt @@ -7,7 +7,7 @@ import okhttp3.HttpUrl class AndroidCookieJar : CookieJar { - val manager = CookieManager.getInstance() + val manager: CookieManager = CookieManager.getInstance() override fun saveFromResponse(url: HttpUrl, cookies: List) { val urlString = url.toString()