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 @@ - + - + - + - + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index bc9eb4be8..513c1f11b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -86,4 +86,6 @@ Put items below to disable it Grid size Search results on %s + Delete manga + Are you really want to delete \"%s\" from your phone\'s local storage? \nThis operation cannot be undone. \ No newline at end of file