diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 4e3b89737..f32d33b16 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -27,7 +27,11 @@
android:name="android.app.default_searchable"
android:value=".ui.search.SearchActivity" />
-
+
+
+
+
+
{
+ manga?.let { m ->
+ showDialog {
+ setTitle(R.string.delete_manga)
+ setMessage(getString(R.string.text_delete_local_manga, m.title))
+ setPositiveButton(R.string.delete) { _, _ ->
+ presenter.deleteLocal(m)
+ }
+ setNegativeButton(android.R.string.cancel, null)
+ }
+ }
+ true
+ }
R.id.action_save -> {
manga?.let {
DownloadService.start(this, it)
@@ -118,6 +143,8 @@ class MangaDetailsActivity : BaseActivity(), MangaDetailsView {
private const val EXTRA_MANGA = "manga"
+ const val ACTION_MANGA_VIEW = "${BuildConfig.APPLICATION_ID}.action.VIEW_MANGA"
+
fun newIntent(context: Context, manga: Manga) =
Intent(context, MangaDetailsActivity::class.java)
.putExtra(EXTRA_MANGA, manga)
diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsFragment.kt
index 0efb4679c..411b64cdb 100644
--- a/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsFragment.kt
+++ b/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsFragment.kt
@@ -82,9 +82,9 @@ class MangaDetailsFragment : BaseFragment(R.layout.fragment_details), MangaDetai
progressBar.isVisible = isLoading
}
- override fun onError(e: Exception) {
+ override fun onError(e: Exception) = Unit //handled in activity
- }
+ override fun onMangaRemoved(manga: Manga) = Unit //handled in activity
private fun updateReadButton() {
if (manga?.chapters.isNullOrEmpty()) {
diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsPresenter.kt b/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsPresenter.kt
index 659324531..5d3aeb06b 100644
--- a/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsPresenter.kt
+++ b/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsPresenter.kt
@@ -1,5 +1,6 @@
package org.koitharu.kotatsu.ui.details
+import kotlinx.coroutines.CancellationException
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
@@ -7,15 +8,20 @@ import moxy.InjectViewState
import moxy.presenterScope
import org.koitharu.kotatsu.BuildConfig
import org.koitharu.kotatsu.core.model.Manga
+import org.koitharu.kotatsu.core.model.MangaSource
+import org.koitharu.kotatsu.core.parser.LocalMangaRepository
import org.koitharu.kotatsu.domain.MangaProviderFactory
import org.koitharu.kotatsu.domain.favourites.FavouritesRepository
import org.koitharu.kotatsu.domain.favourites.OnFavouritesChangeListener
import org.koitharu.kotatsu.domain.history.HistoryRepository
import org.koitharu.kotatsu.domain.history.OnHistoryChangeListener
import org.koitharu.kotatsu.ui.common.BasePresenter
+import org.koitharu.kotatsu.utils.ext.safe
+import java.io.IOException
@InjectViewState
-class MangaDetailsPresenter private constructor(): BasePresenter(), OnHistoryChangeListener,
+class MangaDetailsPresenter private constructor() : BasePresenter(),
+ OnHistoryChangeListener,
OnFavouritesChangeListener {
private lateinit var historyRepository: HistoryRepository
@@ -57,6 +63,31 @@ class MangaDetailsPresenter private constructor(): BasePresenter)
+
+ @SingleState
+ fun onMangaRemoved(manga: Manga)
}
\ No newline at end of file
diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/download/DownloadNotification.kt b/app/src/main/java/org/koitharu/kotatsu/ui/download/DownloadNotification.kt
index c9ef0eb81..636a0ba0c 100644
--- a/app/src/main/java/org/koitharu/kotatsu/ui/download/DownloadNotification.kt
+++ b/app/src/main/java/org/koitharu/kotatsu/ui/download/DownloadNotification.kt
@@ -49,7 +49,7 @@ class DownloadNotification(private val context: Context) {
chapter * PROGRESS_STEP + (page / pagesTotal.toFloat() * PROGRESS_STEP).roundToInt()
val percent = (progress / max.toFloat() * 100).roundToInt()
builder.setProgress(max, progress, false)
- builder.setContentText(context.getString(R.string.downloading_d_percent, percent))
+ builder.setContentText("%d%%".format(percent))
}
fun setPostProcessing() {
diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/main/list/favourites/categories/FavouriteCategoriesDialog.kt b/app/src/main/java/org/koitharu/kotatsu/ui/main/list/favourites/categories/FavouriteCategoriesDialog.kt
index 947ea76ed..2dd9ab58c 100644
--- a/app/src/main/java/org/koitharu/kotatsu/ui/main/list/favourites/categories/FavouriteCategoriesDialog.kt
+++ b/app/src/main/java/org/koitharu/kotatsu/ui/main/list/favourites/categories/FavouriteCategoriesDialog.kt
@@ -11,7 +11,7 @@ import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.core.model.FavouriteCategory
import org.koitharu.kotatsu.core.model.Manga
import org.koitharu.kotatsu.ui.common.BaseBottomSheet
-import org.koitharu.kotatsu.ui.common.TextInputDialog
+import org.koitharu.kotatsu.ui.common.dialog.TextInputDialog
import org.koitharu.kotatsu.utils.ext.getDisplayMessage
import org.koitharu.kotatsu.utils.ext.withArgs
diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/main/list/local/LocalListFragment.kt b/app/src/main/java/org/koitharu/kotatsu/ui/main/list/local/LocalListFragment.kt
index 7a30c6026..a2bea3ff5 100644
--- a/app/src/main/java/org/koitharu/kotatsu/ui/main/list/local/LocalListFragment.kt
+++ b/app/src/main/java/org/koitharu/kotatsu/ui/main/list/local/LocalListFragment.kt
@@ -14,6 +14,7 @@ import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.core.model.Manga
import org.koitharu.kotatsu.ui.main.list.MangaListFragment
import org.koitharu.kotatsu.utils.ext.ellipsize
+import org.koitharu.kotatsu.utils.ext.showDialog
import java.io.File
class LocalListFragment : MangaListFragment() {
@@ -80,7 +81,14 @@ class LocalListFragment : MangaListFragment() {
override fun onPopupMenuItemSelected(item: MenuItem, data: Manga): Boolean {
return when (item.itemId) {
R.id.action_delete -> {
- presenter.delete(data)
+ context?.showDialog {
+ setTitle(R.string.delete_manga)
+ setMessage(getString(R.string.text_delete_local_manga, data.title))
+ setPositiveButton(R.string.delete) { _, _ ->
+ presenter.delete(data)
+ }
+ setNegativeButton(android.R.string.cancel, null)
+ }
true
}
else -> super.onPopupMenuItemSelected(item, data)
diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ShortcutUtils.kt b/app/src/main/java/org/koitharu/kotatsu/utils/ShortcutUtils.kt
index daa5ff295..dae106504 100644
--- a/app/src/main/java/org/koitharu/kotatsu/utils/ShortcutUtils.kt
+++ b/app/src/main/java/org/koitharu/kotatsu/utils/ShortcutUtils.kt
@@ -1,6 +1,8 @@
package org.koitharu.kotatsu.utils
+import android.app.ActivityManager
import android.content.Context
+import androidx.core.content.getSystemService
import androidx.core.content.pm.ShortcutInfoCompat
import androidx.core.graphics.drawable.IconCompat
import androidx.core.graphics.drawable.toBitmap
@@ -11,23 +13,30 @@ import kotlinx.coroutines.withContext
import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.core.model.Manga
import org.koitharu.kotatsu.ui.details.MangaDetailsActivity
+import org.koitharu.kotatsu.utils.ext.safe
object ShortcutUtils {
- @JvmStatic
suspend fun createShortcutInfo(context: Context, manga: Manga): ShortcutInfoCompat {
-// val icon = withContext(Dispatchers.IO) {
-// Coil.loader().get(manga.coverUrl) {
-// context.getSystemService()?.let {
-// size(it.launcherLargeIconSize)
-// }
-// }.toBitmap()
-// }
+ val icon = safe {
+ withContext(Dispatchers.IO) {
+ Coil.loader().get(manga.coverUrl) {
+ context.getSystemService()?.let {
+ size(it.launcherLargeIconSize)
+ }
+ }.toBitmap()
+ }
+ }
return ShortcutInfoCompat.Builder(context, manga.id.toString())
.setShortLabel(manga.title)
.setLongLabel(manga.title)
- .setIcon(IconCompat.createWithResource(context, R.drawable.ic_launcher_foreground))
- .setIntent(MangaDetailsActivity.newIntent(context, manga))
+ .setIcon(icon?.let {
+ IconCompat.createWithBitmap(it)
+ } ?: IconCompat.createWithResource(context, R.drawable.ic_launcher_foreground))
+ .setIntent(
+ MangaDetailsActivity.newIntent(context, manga.copy(chapters = null))
+ .setAction(MangaDetailsActivity.ACTION_MANGA_VIEW)
+ )
.build()
}
}
\ No newline at end of file
diff --git a/app/src/main/res/menu/opt_details.xml b/app/src/main/res/menu/opt_details.xml
index 9d2019bcd..ac4039dbd 100644
--- a/app/src/main/res/menu/opt_details.xml
+++ b/app/src/main/res/menu/opt_details.xml
@@ -1,22 +1,28 @@
-