From 4db301ca7a5505f7ff4d8634d7c7efef289e0b5a Mon Sep 17 00:00:00 2001
From: Finnley Somdahl <87634197+rebelonion@users.noreply.github.com>
Date: Mon, 20 Nov 2023 00:39:14 -0600
Subject: [PATCH] more offline stuff/bugfixes
---
app/src/main/AndroidManifest.xml | 1 +
app/src/main/java/ani/dantotsu/Functions.kt | 16 +++-
.../main/java/ani/dantotsu/MainActivity.kt | 6 +-
.../download/DownloadContainerActivity.kt | 23 +++++
.../download/manga/MangaDownloaderService.kt | 4 +-
.../download/manga/OfflineMangaAdapter.kt | 2 +-
.../ani/dantotsu/home/AnimePageAdapter.kt | 2 +-
.../java/ani/dantotsu/home/HomeFragment.kt | 2 +-
.../ani/dantotsu/home/MangaPageAdapter.kt | 2 +-
.../main/java/ani/dantotsu/home/NoInternet.kt | 91 +++++++++++++++++--
.../media/manga/MangaChapterAdapter.kt | 2 +-
.../dantotsu/media/manga/MangaReadAdapter.kt | 4 +-
.../manga/mangareader/BaseImageAdapter.kt | 7 +-
.../ani/dantotsu/offline/OfflineFragment.kt | 29 ++++++
.../java/ani/dantotsu/others/AppUpdater.kt | 7 +-
.../ani/dantotsu/parsers/AniyomiAdapter.kt | 2 +-
.../java/ani/dantotsu/parsers/BaseParser.kt | 2 +-
.../settings/SettingsDialogFragment.kt | 57 +++++++++---
.../PackageInstallerInstallerAnime.kt | 3 +-
.../util/AnimeExtensionInstallReceiver.kt | 3 +-
.../anime/util/AnimeExtensionInstaller.kt | 2 +-
.../PackageInstallerInstallerManga.kt | 3 +-
.../util/MangaExtensionInstallReceiver.kt | 3 +-
.../manga/util/MangaExtensionInstaller.kt | 2 +-
.../main/res/layout/activity_container.xml | 5 +
app/src/main/res/layout/activity_main.xml | 36 +-------
.../main/res/layout/activity_no_internet.xml | 54 +++--------
app/src/main/res/layout/fragment_offline.xml | 55 +++++++++++
app/src/main/res/layout/item_navbar.xml | 35 +++++++
29 files changed, 341 insertions(+), 119 deletions(-)
create mode 100644 app/src/main/java/ani/dantotsu/download/DownloadContainerActivity.kt
create mode 100644 app/src/main/java/ani/dantotsu/offline/OfflineFragment.kt
create mode 100644 app/src/main/res/layout/activity_container.xml
create mode 100644 app/src/main/res/layout/fragment_offline.xml
create mode 100644 app/src/main/res/layout/item_navbar.xml
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 1a751200..991a97c2 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -221,6 +221,7 @@
+
Unit
diff --git a/app/src/main/java/ani/dantotsu/MainActivity.kt b/app/src/main/java/ani/dantotsu/MainActivity.kt
index f3fc77f2..4568daac 100644
--- a/app/src/main/java/ani/dantotsu/MainActivity.kt
+++ b/app/src/main/java/ani/dantotsu/MainActivity.kt
@@ -21,6 +21,7 @@ import android.util.Log
import android.view.View
import android.view.ViewGroup
import android.view.animation.AnticipateInterpolator
+import android.widget.FrameLayout
import android.widget.TextView
import androidx.activity.addCallback
import androidx.activity.viewModels
@@ -40,6 +41,7 @@ import eu.kanade.tachiyomi.extension.anime.AnimeExtensionManager
import ani.dantotsu.connections.anilist.Anilist
import ani.dantotsu.connections.anilist.AnilistHomeViewModel
import ani.dantotsu.databinding.ActivityMainBinding
+import ani.dantotsu.databinding.ItemNavbarBinding
import ani.dantotsu.databinding.SplashScreenBinding
import ani.dantotsu.download.manga.OfflineMangaFragment
import ani.dantotsu.home.AnimeFragment
@@ -160,7 +162,7 @@ class MainActivity : AppCompatActivity() {
initActivity(this)
uiSettings = loadData("ui_settings") ?: uiSettings
selectedOption = uiSettings.defaultStartUpTab
- binding.navbarContainer.updateLayoutParams {
+ binding.includedNavbar.navbarContainer.updateLayoutParams {
bottomMargin = navBarHeight
}
}
@@ -173,7 +175,7 @@ class MainActivity : AppCompatActivity() {
model.genres.observe(this) {
if (it != null) {
if (it) {
- val navbar = binding.navbar
+ val navbar = binding.includedNavbar.navbar
bottomBar = navbar
navbar.visibility = View.VISIBLE
binding.mainProgressBar.visibility = View.GONE
diff --git a/app/src/main/java/ani/dantotsu/download/DownloadContainerActivity.kt b/app/src/main/java/ani/dantotsu/download/DownloadContainerActivity.kt
new file mode 100644
index 00000000..2d34145c
--- /dev/null
+++ b/app/src/main/java/ani/dantotsu/download/DownloadContainerActivity.kt
@@ -0,0 +1,23 @@
+package ani.dantotsu.download
+
+import android.os.Bundle
+import androidx.appcompat.app.AppCompatActivity
+import androidx.fragment.app.Fragment
+import ani.dantotsu.R
+import ani.dantotsu.themes.ThemeManager
+
+class DownloadContainerActivity : AppCompatActivity() {
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ ThemeManager(this).applyTheme()
+ setContentView(R.layout.activity_container)
+
+ val fragmentClassName = intent.getStringExtra("FRAGMENT_CLASS_NAME")
+ val fragment = Class.forName(fragmentClassName).newInstance() as Fragment
+
+ supportFragmentManager.beginTransaction()
+ .replace(R.id.fragment_container, fragment)
+ .commit()
+ }
+}
\ No newline at end of file
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 7266ec53..41a249c2 100644
--- a/app/src/main/java/ani/dantotsu/download/manga/MangaDownloaderService.kt
+++ b/app/src/main/java/ani/dantotsu/download/manga/MangaDownloaderService.kt
@@ -60,7 +60,7 @@ class MangaDownloaderService : Service() {
private val downloadJobs = mutableMapOf()
private val mutex = Mutex()
- var isCurrentlyProcessing = false
+ private var isCurrentlyProcessing = false
override fun onBind(intent: Intent?): IBinder? {
// This is only required for bound services.
@@ -78,7 +78,7 @@ class MangaDownloaderService : Service() {
setProgress(0, 0, false)
}
startForeground(NOTIFICATION_ID, builder.build())
- registerReceiver(cancelReceiver, IntentFilter(ACTION_CANCEL_DOWNLOAD))
+ ContextCompat.registerReceiver(this, cancelReceiver, IntentFilter(ACTION_CANCEL_DOWNLOAD), ContextCompat.RECEIVER_NOT_EXPORTED)
}
override fun onDestroy() {
diff --git a/app/src/main/java/ani/dantotsu/download/manga/OfflineMangaAdapter.kt b/app/src/main/java/ani/dantotsu/download/manga/OfflineMangaAdapter.kt
index fc4240bf..a9933dfa 100644
--- a/app/src/main/java/ani/dantotsu/download/manga/OfflineMangaAdapter.kt
+++ b/app/src/main/java/ani/dantotsu/download/manga/OfflineMangaAdapter.kt
@@ -17,7 +17,7 @@ class OfflineMangaAdapter(private val context: Context, private val items: List<
return items.size
}
- override fun getItem(position: Int): Any? {
+ override fun getItem(position: Int): Any {
return items[position]
}
diff --git a/app/src/main/java/ani/dantotsu/home/AnimePageAdapter.kt b/app/src/main/java/ani/dantotsu/home/AnimePageAdapter.kt
index 1117cf46..8cda9988 100644
--- a/app/src/main/java/ani/dantotsu/home/AnimePageAdapter.kt
+++ b/app/src/main/java/ani/dantotsu/home/AnimePageAdapter.kt
@@ -95,7 +95,7 @@ class AnimePageAdapter : RecyclerView.Adapter {
diff --git a/app/src/main/java/ani/dantotsu/home/MangaPageAdapter.kt b/app/src/main/java/ani/dantotsu/home/MangaPageAdapter.kt
index 7f91aaaf..5103c72b 100644
--- a/app/src/main/java/ani/dantotsu/home/MangaPageAdapter.kt
+++ b/app/src/main/java/ani/dantotsu/home/MangaPageAdapter.kt
@@ -89,7 +89,7 @@ class MangaPageAdapter : RecyclerView.Adapter {
- topMargin = statusBarHeight
- bottomMargin = navBarHeight
+ val _bottomBar = findViewById(R.id.navbar)
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+
+ val backgroundDrawable = _bottomBar.background as GradientDrawable
+ val currentColor = backgroundDrawable.color?.defaultColor ?: 0
+ val semiTransparentColor = (currentColor and 0x00FFFFFF) or 0xE8000000.toInt()
+ backgroundDrawable.setColor(semiTransparentColor)
+ _bottomBar.background = backgroundDrawable
}
- binding.refreshButton.setOnClickListener {
- if (isOnline(this)) {
- startMainActivity(this)
+ val colorOverflow = this.getSharedPreferences("Dantotsu", Context.MODE_PRIVATE)
+ .getBoolean("colorOverflow", false)
+ if (!colorOverflow) {
+ _bottomBar.background = ContextCompat.getDrawable(this, R.drawable.bottom_nav_gray)
+
+ }
+
+ binding.root.doOnAttach {
+ initActivity(this)
+ uiSettings = loadData("ui_settings") ?: uiSettings
+ selectedOption = uiSettings.defaultStartUpTab
+ binding.includedNavbar.navbarContainer.updateLayoutParams {
+ bottomMargin = navBarHeight
}
}
+ val navbar = binding.includedNavbar.navbar
+ ani.dantotsu.bottomBar = navbar
+ navbar.visibility = View.VISIBLE
+ val mainViewPager = binding.viewpager
+ mainViewPager.isUserInputEnabled = false
+ mainViewPager.adapter = ViewPagerAdapter(supportFragmentManager, lifecycle)
+ mainViewPager.setPageTransformer(ZoomOutPageTransformer(uiSettings))
+ navbar.setOnTabSelectListener(object :
+ AnimatedBottomBar.OnTabSelectListener {
+ override fun onTabSelected(
+ lastIndex: Int,
+ lastTab: AnimatedBottomBar.Tab?,
+ newIndex: Int,
+ newTab: AnimatedBottomBar.Tab
+ ) {
+ navbar.animate().translationZ(12f).setDuration(200).start()
+ selectedOption = newIndex
+ mainViewPager.setCurrentItem(newIndex, false)
+ }
+ })
+ navbar.selectTabAt(selectedOption)
+
+ //supportFragmentManager.beginTransaction().replace(binding.fragmentContainer.id, OfflineFragment()).commit()
+
+ }
+
+ private class ViewPagerAdapter(fragmentManager: FragmentManager, lifecycle: Lifecycle) :
+ FragmentStateAdapter(fragmentManager, lifecycle) {
+
+ override fun getItemCount(): Int = 3
+
+ override fun createFragment(position: Int): Fragment {
+ when (position) {
+ 0 -> return OfflineFragment()
+ 1 -> return OfflineFragment()
+ 2 -> return OfflineMangaFragment()
+ }
+ return LoginFragment()
+ }
}
}
\ No newline at end of file
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 60d77b3a..1703336f 100644
--- a/app/src/main/java/ani/dantotsu/media/manga/MangaChapterAdapter.kt
+++ b/app/src/main/java/ani/dantotsu/media/manga/MangaChapterAdapter.kt
@@ -94,7 +94,7 @@ class MangaChapterAdapter(
fun bind(chapterNumber: String) {
if (activeDownloads.contains(chapterNumber)) {
// Show spinner
- binding.itemDownload.setImageResource(R.drawable.spinner_icon_manga)
+ binding.itemDownload.setImageResource(R.drawable.ic_round_refresh_24)
} else if(downloadedChapters.contains(chapterNumber)) {
// Show checkmark
binding.itemDownload.setImageResource(R.drawable.ic_check)
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 8b64057d..4fd43ba8 100644
--- a/app/src/main/java/ani/dantotsu/media/manga/MangaReadAdapter.kt
+++ b/app/src/main/java/ani/dantotsu/media/manga/MangaReadAdapter.kt
@@ -74,7 +74,9 @@ class MangaReadAdapter(
setLanguageList(0,i)
}
subscribeButton(false)
- fragment.loadChapters(i, false)
+ //invalidate if it's the last source
+ val invalidate = i == mangaReadSources.names.size - 1
+ fragment.loadChapters(i, invalidate)
}
binding.animeSourceLanguage.setOnItemClickListener { _, _, i, _ ->
diff --git a/app/src/main/java/ani/dantotsu/media/manga/mangareader/BaseImageAdapter.kt b/app/src/main/java/ani/dantotsu/media/manga/mangareader/BaseImageAdapter.kt
index a23dc970..bae545bb 100644
--- a/app/src/main/java/ani/dantotsu/media/manga/mangareader/BaseImageAdapter.kt
+++ b/app/src/main/java/ani/dantotsu/media/manga/mangareader/BaseImageAdapter.kt
@@ -118,7 +118,7 @@ abstract class BaseImageAdapter(
abstract suspend fun loadImage(position: Int, parent: View): Boolean
companion object {
- suspend fun Context.loadBitmap_old(link: FileUrl, transforms: List): Bitmap? {
+ suspend fun Context.loadBitmap_old(link: FileUrl, transforms: List): Bitmap? { //still used in some places
return tryWithSuspend {
withContext(Dispatchers.IO) {
Glide.with(this@loadBitmap_old)
@@ -154,8 +154,9 @@ abstract class BaseImageAdapter(
.asBitmap()
.let {
val fileUri = Uri.fromFile(File(link.url)).toString()
- if (fileUri.startsWith("file://")) {
- it.load(fileUri)
+ val localFile = File(link.url)
+ if (localFile.exists()) {
+ it.load(localFile.absoluteFile)
.skipMemoryCache(true)
.diskCacheStrategy(DiskCacheStrategy.NONE)
} else {
diff --git a/app/src/main/java/ani/dantotsu/offline/OfflineFragment.kt b/app/src/main/java/ani/dantotsu/offline/OfflineFragment.kt
new file mode 100644
index 00000000..5a5579b1
--- /dev/null
+++ b/app/src/main/java/ani/dantotsu/offline/OfflineFragment.kt
@@ -0,0 +1,29 @@
+package ani.dantotsu.offline
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.core.view.updateLayoutParams
+import androidx.fragment.app.Fragment
+import ani.dantotsu.databinding.FragmentOfflineBinding
+import ani.dantotsu.isOnline
+import ani.dantotsu.navBarHeight
+import ani.dantotsu.startMainActivity
+import ani.dantotsu.statusBarHeight
+
+class OfflineFragment : Fragment() {
+ override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
+ val binding = FragmentOfflineBinding.inflate(inflater, container, false)
+ binding.refreshContainer.updateLayoutParams {
+ topMargin = statusBarHeight
+ bottomMargin = navBarHeight
+ }
+ binding.refreshButton.setOnClickListener {
+ if (isOnline(requireContext())) {
+ startMainActivity(requireActivity())
+ }
+ }
+ return binding.root
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/ani/dantotsu/others/AppUpdater.kt b/app/src/main/java/ani/dantotsu/others/AppUpdater.kt
index 12ec54e9..989ec5c5 100644
--- a/app/src/main/java/ani/dantotsu/others/AppUpdater.kt
+++ b/app/src/main/java/ani/dantotsu/others/AppUpdater.kt
@@ -10,6 +10,7 @@ import android.content.IntentFilter
import android.net.Uri
import android.os.Environment
import android.widget.TextView
+import androidx.core.content.ContextCompat
import androidx.core.content.FileProvider
import androidx.core.content.getSystemService
import androidx.fragment.app.FragmentActivity
@@ -142,7 +143,8 @@ object AppUpdater {
-1
}
if (id == -1L) return true
- registerReceiver(
+ ContextCompat.registerReceiver(
+ this,
object : BroadcastReceiver() {
@SuppressLint("Range")
override fun onReceive(context: Context?, intent: Intent?) {
@@ -171,7 +173,8 @@ object AppUpdater {
logError(e)
}
}
- }, IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE)
+ }, IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE),
+ ContextCompat.RECEIVER_NOT_EXPORTED
)
return true
}
diff --git a/app/src/main/java/ani/dantotsu/parsers/AniyomiAdapter.kt b/app/src/main/java/ani/dantotsu/parsers/AniyomiAdapter.kt
index 41288e98..ed5901ae 100644
--- a/app/src/main/java/ani/dantotsu/parsers/AniyomiAdapter.kt
+++ b/app/src/main/java/ani/dantotsu/parsers/AniyomiAdapter.kt
@@ -150,7 +150,7 @@ class DynamicAnimeParser(extension: AnimeExtension.Installed) : AnimeParser() {
}
- override suspend fun getVideoExtractor(server: VideoServer): VideoExtractor? {
+ override suspend fun getVideoExtractor(server: VideoServer): VideoExtractor {
return VideoServerPassthrough(server)
}
diff --git a/app/src/main/java/ani/dantotsu/parsers/BaseParser.kt b/app/src/main/java/ani/dantotsu/parsers/BaseParser.kt
index 35b7b98b..f8df772b 100644
--- a/app/src/main/java/ani/dantotsu/parsers/BaseParser.kt
+++ b/app/src/main/java/ani/dantotsu/parsers/BaseParser.kt
@@ -51,7 +51,7 @@ abstract class BaseParser {
* **/
open suspend fun autoSearch(mediaObj: Media): ShowResponse? {
var response: ShowResponse? = null//loadSavedShowResponse(mediaObj.id)
- if (response != null) {
+ if (response != null && this !is OfflineMangaParser) {
saveShowResponse(mediaObj.id, response, true)
} else {
setUserText("Searching : ${mediaObj.mainName()}")
diff --git a/app/src/main/java/ani/dantotsu/settings/SettingsDialogFragment.kt b/app/src/main/java/ani/dantotsu/settings/SettingsDialogFragment.kt
index 5b5c62b0..0b10ca1d 100644
--- a/app/src/main/java/ani/dantotsu/settings/SettingsDialogFragment.kt
+++ b/app/src/main/java/ani/dantotsu/settings/SettingsDialogFragment.kt
@@ -10,14 +10,17 @@ import android.util.TypedValue
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
+import android.widget.Switch
import androidx.core.content.ContextCompat
import ani.dantotsu.*
import ani.dantotsu.connections.anilist.Anilist
import ani.dantotsu.others.imagesearch.ImageSearchActivity
import ani.dantotsu.databinding.BottomSheetSettingsBinding
+import ani.dantotsu.download.DownloadContainerActivity
+import ani.dantotsu.download.manga.OfflineMangaFragment
-class SettingsDialogFragment : BottomSheetDialogFragment() {
+class SettingsDialogFragment(val pageType: PageType) : BottomSheetDialogFragment() {
private var _binding: BottomSheetSettingsBinding? = null
private val binding get() = _binding!!
@@ -70,18 +73,42 @@ class SettingsDialogFragment : BottomSheetDialogFragment() {
dismiss()
}
binding.settingsDownloads.setSafeOnClickListener {
- try {
- val arrayOfFiles = ContextCompat.getExternalFilesDirs(requireContext(), null)
- startActivity(
- if (loadData("sd_dl") == true && arrayOfFiles.size > 1 && arrayOfFiles[0] != null && arrayOfFiles[1] != null) {
- val parentDirectory = arrayOfFiles[1].toString()
- val intent = Intent(Intent.ACTION_VIEW)
- intent.setDataAndType(Uri.parse(parentDirectory), "resource/folder")
- } else Intent(DownloadManager.ACTION_VIEW_DOWNLOADS)
- )
- } catch (e: ActivityNotFoundException) {
- toast(getString(R.string.file_manager_not_found))
+ when(pageType) {
+ PageType.MANGA -> {
+ val intent = Intent(activity, DownloadContainerActivity::class.java)
+ intent.putExtra("FRAGMENT_CLASS_NAME", OfflineMangaFragment::class.java.name)
+ startActivity(intent)
+ }
+ PageType.ANIME -> {
+ try {
+ val arrayOfFiles = ContextCompat.getExternalFilesDirs(requireContext(), null)
+ startActivity(
+ if (loadData("sd_dl") == true && arrayOfFiles.size > 1 && arrayOfFiles[0] != null && arrayOfFiles[1] != null) {
+ val parentDirectory = arrayOfFiles[1].toString()
+ val intent = Intent(Intent.ACTION_VIEW)
+ intent.setDataAndType(Uri.parse(parentDirectory), "resource/folder")
+ } else Intent(DownloadManager.ACTION_VIEW_DOWNLOADS)
+ )
+ } catch (e: ActivityNotFoundException) {
+ toast(getString(R.string.file_manager_not_found))
+ }
+ }
+ PageType.HOME -> {
+ try {
+ val arrayOfFiles = ContextCompat.getExternalFilesDirs(requireContext(), null)
+ startActivity(
+ if (loadData("sd_dl") == true && arrayOfFiles.size > 1 && arrayOfFiles[0] != null && arrayOfFiles[1] != null) {
+ val parentDirectory = arrayOfFiles[1].toString()
+ val intent = Intent(Intent.ACTION_VIEW)
+ intent.setDataAndType(Uri.parse(parentDirectory), "resource/folder")
+ } else Intent(DownloadManager.ACTION_VIEW_DOWNLOADS)
+ )
+ } catch (e: ActivityNotFoundException) {
+ toast(getString(R.string.file_manager_not_found))
+ }
+ }
}
+
dismiss()
}
}
@@ -90,4 +117,10 @@ class SettingsDialogFragment : BottomSheetDialogFragment() {
super.onDestroyView()
_binding = null
}
+
+ companion object{
+ enum class PageType{
+ MANGA, ANIME, HOME
+ }
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/anime/installer/PackageInstallerInstallerAnime.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/anime/installer/PackageInstallerInstallerAnime.kt
index fb6bfb11..a3ae1054 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/extension/anime/installer/PackageInstallerInstallerAnime.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/extension/anime/installer/PackageInstallerInstallerAnime.kt
@@ -8,6 +8,7 @@ import android.content.Intent
import android.content.IntentFilter
import android.content.pm.PackageInstaller
import android.os.Build
+import androidx.core.content.ContextCompat
import eu.kanade.tachiyomi.extension.InstallStep
import eu.kanade.tachiyomi.util.lang.use
import eu.kanade.tachiyomi.util.system.getParcelableExtraCompat
@@ -100,7 +101,7 @@ class PackageInstallerInstallerAnime(private val service: Service) : InstallerAn
}
init {
- service.registerReceiver(packageActionReceiver, IntentFilter(INSTALL_ACTION))
+ ContextCompat.registerReceiver(service, packageActionReceiver, IntentFilter(INSTALL_ACTION), ContextCompat.RECEIVER_NOT_EXPORTED)
}
}
diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/anime/util/AnimeExtensionInstallReceiver.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/anime/util/AnimeExtensionInstallReceiver.kt
index 3f1ef0ea..c4a6de74 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/extension/anime/util/AnimeExtensionInstallReceiver.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/extension/anime/util/AnimeExtensionInstallReceiver.kt
@@ -4,6 +4,7 @@ import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
+import androidx.core.content.ContextCompat
import eu.kanade.tachiyomi.extension.anime.model.AnimeExtension
import eu.kanade.tachiyomi.extension.anime.model.AnimeLoadResult
import kotlinx.coroutines.CoroutineStart
@@ -27,7 +28,7 @@ internal class AnimeExtensionInstallReceiver(private val listener: Listener) :
* Registers this broadcast receiver
*/
fun register(context: Context) {
- context.registerReceiver(this, filter)
+ ContextCompat.registerReceiver(context, this, filter, ContextCompat.RECEIVER_NOT_EXPORTED)
}
/**
diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/anime/util/AnimeExtensionInstaller.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/anime/util/AnimeExtensionInstaller.kt
index 3dbdd8e3..96802b5c 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/extension/anime/util/AnimeExtensionInstaller.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/extension/anime/util/AnimeExtensionInstaller.kt
@@ -216,7 +216,7 @@ internal class AnimeExtensionInstaller(private val context: Context) {
isRegistered = true
val filter = IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE)
- context.registerReceiver(this, filter)
+ ContextCompat.registerReceiver(context, this, filter, ContextCompat.RECEIVER_EXPORTED)
}
/**
diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/manga/installer/PackageInstallerInstallerManga.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/manga/installer/PackageInstallerInstallerManga.kt
index 6eb719ee..c303b49c 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/extension/manga/installer/PackageInstallerInstallerManga.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/extension/manga/installer/PackageInstallerInstallerManga.kt
@@ -8,6 +8,7 @@ import android.content.Intent
import android.content.IntentFilter
import android.content.pm.PackageInstaller
import android.os.Build
+import androidx.core.content.ContextCompat
import eu.kanade.tachiyomi.extension.InstallStep
import eu.kanade.tachiyomi.util.lang.use
import eu.kanade.tachiyomi.util.system.getParcelableExtraCompat
@@ -100,7 +101,7 @@ class PackageInstallerInstallerManga(private val service: Service) : InstallerMa
}
init {
- service.registerReceiver(packageActionReceiver, IntentFilter(INSTALL_ACTION))
+ ContextCompat.registerReceiver(service, packageActionReceiver, IntentFilter(INSTALL_ACTION), ContextCompat.RECEIVER_NOT_EXPORTED)
}
}
diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/manga/util/MangaExtensionInstallReceiver.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/manga/util/MangaExtensionInstallReceiver.kt
index 17dac9b4..3eb90508 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/extension/manga/util/MangaExtensionInstallReceiver.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/extension/manga/util/MangaExtensionInstallReceiver.kt
@@ -4,6 +4,7 @@ import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
+import androidx.core.content.ContextCompat
import eu.kanade.tachiyomi.extension.manga.model.MangaExtension
import eu.kanade.tachiyomi.extension.manga.model.MangaLoadResult
import kotlinx.coroutines.CoroutineStart
@@ -27,7 +28,7 @@ internal class MangaExtensionInstallReceiver(private val listener: Listener) :
* Registers this broadcast receiver
*/
fun register(context: Context) {
- context.registerReceiver(this, filter)
+ ContextCompat.registerReceiver(context, this, filter, ContextCompat.RECEIVER_NOT_EXPORTED)
}
/**
diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/manga/util/MangaExtensionInstaller.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/manga/util/MangaExtensionInstaller.kt
index 88b2b422..4109f9f5 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/extension/manga/util/MangaExtensionInstaller.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/extension/manga/util/MangaExtensionInstaller.kt
@@ -213,7 +213,7 @@ internal class MangaExtensionInstaller(private val context: Context) {
isRegistered = true
val filter = IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE)
- context.registerReceiver(this, filter)
+ ContextCompat.registerReceiver(context, this, filter, ContextCompat.RECEIVER_EXPORTED)
}
/**
diff --git a/app/src/main/res/layout/activity_container.xml b/app/src/main/res/layout/activity_container.xml
new file mode 100644
index 00000000..1d249e3e
--- /dev/null
+++ b/app/src/main/res/layout/activity_container.xml
@@ -0,0 +1,5 @@
+
+
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index bebdb5b3..b73e562b 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -19,39 +19,9 @@
android:layout_width="match_parent"
android:layout_height="match_parent" />
-
-
-
-
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
+
diff --git a/app/src/main/res/layout/fragment_offline.xml b/app/src/main/res/layout/fragment_offline.xml
new file mode 100644
index 00000000..f549249d
--- /dev/null
+++ b/app/src/main/res/layout/fragment_offline.xml
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_navbar.xml b/app/src/main/res/layout/item_navbar.xml
new file mode 100644
index 00000000..417d4e10
--- /dev/null
+++ b/app/src/main/res/layout/item_navbar.xml
@@ -0,0 +1,35 @@
+
+
+
+
+