From c2b113ac0a56a72628a9402f772e72c5265ae81e Mon Sep 17 00:00:00 2001 From: Bram van de Kerkhof Date: Thu, 13 Oct 2016 17:54:07 +0200 Subject: [PATCH] Fixes + API 16 support --- app/src/main/AndroidManifest.xml | 2 +- .../data/download/DownloadNotifier.kt | 46 +++--- .../tachiyomi/data/download/ImageNotifier.kt | 132 ------------------ .../tachiyomi/ui/reader/ReaderActivity.kt | 36 +++-- .../tachiyomi/ui/reader/ReaderPresenter.kt | 99 ++++--------- .../ImageNotificationReceiver.kt | 43 ++++-- .../ui/reader/notification/ImageNotifier.kt | 93 ++++++++++++ .../ui/reader/viewer/pager/PagerReader.kt | 10 +- .../ui/reader/viewer/webtoon/WebtoonReader.kt | 18 ++- .../res/drawable-hdpi/ic_delete_grey_24dp.png | Bin 0 -> 485 bytes .../ic_insert_photo_white_24dp.png | Bin 0 -> 247 bytes .../res/drawable-hdpi/ic_share_grey_24dp.png | Bin 0 -> 928 bytes .../res/drawable-mdpi/ic_delete_grey_24dp.png | Bin 0 -> 367 bytes .../ic_insert_photo_white_24dp.png | Bin 0 -> 185 bytes .../res/drawable-mdpi/ic_share_grey_24dp.png | Bin 0 -> 554 bytes .../drawable-xhdpi/ic_delete_grey_24dp.png | Bin 0 -> 594 bytes .../ic_insert_photo_white_24dp.png | Bin 0 -> 304 bytes .../res/drawable-xhdpi/ic_share_grey_24dp.png | Bin 0 -> 1222 bytes .../drawable-xxhdpi/ic_delete_grey_24dp.png | Bin 0 -> 695 bytes .../ic_insert_photo_white_24dp.png | Bin 0 -> 450 bytes .../drawable-xxhdpi/ic_share_grey_24dp.png | Bin 0 -> 1823 bytes .../drawable-xxxhdpi/ic_delete_grey_24dp.png | Bin 0 -> 1076 bytes .../ic_insert_photo_white_24dp.png | Bin 0 -> 570 bytes .../drawable-xxxhdpi/ic_share_grey_24dp.png | Bin 0 -> 2776 bytes .../drawable/ic_insert_photo_black_24dp.xml | 9 -- .../drawable/ic_insert_photo_white_24dp.png | Bin 0 -> 185 bytes app/src/main/res/values/keys.xml | 2 - app/src/main/res/values/strings.xml | 7 +- 28 files changed, 219 insertions(+), 278 deletions(-) delete mode 100644 app/src/main/java/eu/kanade/tachiyomi/data/download/ImageNotifier.kt rename app/src/main/java/eu/kanade/tachiyomi/{data/download => ui/reader/notification}/ImageNotificationReceiver.kt (68%) create mode 100644 app/src/main/java/eu/kanade/tachiyomi/ui/reader/notification/ImageNotifier.kt create mode 100644 app/src/main/res/drawable-hdpi/ic_delete_grey_24dp.png create mode 100644 app/src/main/res/drawable-hdpi/ic_insert_photo_white_24dp.png create mode 100644 app/src/main/res/drawable-hdpi/ic_share_grey_24dp.png create mode 100644 app/src/main/res/drawable-mdpi/ic_delete_grey_24dp.png create mode 100644 app/src/main/res/drawable-mdpi/ic_insert_photo_white_24dp.png create mode 100644 app/src/main/res/drawable-mdpi/ic_share_grey_24dp.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_delete_grey_24dp.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_insert_photo_white_24dp.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_share_grey_24dp.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_delete_grey_24dp.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_insert_photo_white_24dp.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_share_grey_24dp.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_delete_grey_24dp.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_insert_photo_white_24dp.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_share_grey_24dp.png delete mode 100644 app/src/main/res/drawable/ic_insert_photo_black_24dp.xml create mode 100644 app/src/main/res/drawable/ic_insert_photo_white_24dp.png diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c9aaa32fd1..379f290acb 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -88,7 +88,7 @@ - + (96, 96) { - /** - * The method that will be called when the resource load has finished. - * @param resource the loaded resource. - */ - override fun onResourceReady(resource: Bitmap?, glideAnimation: GlideAnimation?) { - setLargeIcon(resource) - context.notificationManager.notify(notificationId, notificationBuilder.build()) - } - }) - Glide.with(context).load(file).asBitmap().into(object : SimpleTarget(720, 1280) { - /** - * The method that will be called when the resource load has finished. - * @param resource the loaded resource. - */ - override fun onResourceReady(resource: Bitmap?, glideAnimation: GlideAnimation?) { - setStyle(NotificationCompat.BigPictureStyle().bigPicture(resource)) - context.notificationManager.notify(notificationId, notificationBuilder.build()) - } - }) - - setAutoCancel(true) - - // Clear old actions if they exist - if (!mActions.isEmpty()) - mActions.clear() - - setContentIntent(ImageNotificationReceiver.showImageIntent(context, file.absolutePath)) - // Share action - addAction(R.drawable.ic_share_white_24dp, - context.getString(R.string.action_share), - ImageNotificationReceiver.shareImageIntent(context, file.absolutePath, notificationId)) - // Delete action - addAction(R.drawable.ic_delete_white_24dp, - context.getString(R.string.action_delete), - ImageNotificationReceiver.deleteImageIntent(context, file.absolutePath, notificationId)) - } - // Displays the progress bar on notification - context.notificationManager.notify(notificationId, notificationBuilder.build()) - } - - /** - * Clears the notification message - */ - internal fun onClear() { - context.notificationManager.cancel(notificationId) - } - - - /** - * Called on error while downloading image - * @param error string containing error information - */ - internal fun onError(error: String?) { - // Create notification - with(notificationBuilder) { - setContentTitle(context.getString(R.string.download_notifier_title_error)) - setContentText(error ?: context.getString(R.string.download_notifier_unkown_error)) - setSmallIcon(android.R.drawable.ic_menu_report_image) - setProgress(0, 0, false) - } - context.notificationManager.notify(notificationId, notificationBuilder.build()) - isDownloading = false - } - -} diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt index ef1a8820b4..fe3104f701 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt @@ -5,6 +5,7 @@ import android.content.Intent import android.content.pm.ActivityInfo import android.content.res.Configuration import android.graphics.Color +import android.net.Uri import android.os.Build import android.os.Build.VERSION_CODES.KITKAT import android.os.Bundle @@ -229,19 +230,17 @@ class ReaderActivity : BaseRxActivity() { } fun onLongPress(page: Page) { - MaterialDialog.Builder(this).apply { - title = "Choose" - items(R.array.reader_image_options) + MaterialDialog.Builder(this) + .title(getString(R.string.options)) + .items(R.array.reader_image_options) .itemsIds(R.array.reader_image_options_values) - itemsCallback { materialDialog, view, i, charSequence -> + .itemsCallback { materialDialog, view, i, charSequence -> when (i) { 0 -> presenter.setCover(page) - 1 -> presenter.shareImage(page) + 1 -> shareImage(page) 2 -> presenter.savePage(page) } - }.show() - } } /** @@ -409,16 +408,16 @@ class ReaderActivity : BaseRxActivity() { private fun setRotation(rotation: Int) { when (rotation) { - // Rotation free + // Rotation free 1 -> requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED - // Lock in current rotation + // Lock in current rotation 2 -> { val currentOrientation = resources.configuration.orientation setRotation(if (currentOrientation == Configuration.ORIENTATION_PORTRAIT) 3 else 4) } - // Lock in portrait + // Lock in portrait 3 -> requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT - // Lock in landscape + // Lock in landscape 4 -> requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE } } @@ -471,6 +470,21 @@ class ReaderActivity : BaseRxActivity() { } } + /** + * Start a share intent that lets user share image + * + * @param page page object containing image information. + */ + fun shareImage(page: Page) { + val shareIntent = Intent().apply { + action = Intent.ACTION_SEND + putExtra(Intent.EXTRA_STREAM, Uri.parse(page.imagePath)) + flags = Intent.FLAG_ACTIVITY_NEW_TASK + type = "image/jpeg" + } + startActivity(Intent.createChooser(shareIntent, resources.getText(R.string.action_share))) + } + /** * Sets the brightness of the screen. Range is [-75, 100]. * From -75 to -1 a semi-transparent black view is shown at the top with the minimum brightness. diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderPresenter.kt index fde3321b21..aef86551d4 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderPresenter.kt @@ -1,7 +1,5 @@ package eu.kanade.tachiyomi.ui.reader -import android.content.Intent -import android.net.Uri import android.os.Bundle import android.os.Environment import eu.kanade.tachiyomi.R @@ -13,15 +11,14 @@ import eu.kanade.tachiyomi.data.database.models.History import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.data.database.models.MangaSync import eu.kanade.tachiyomi.data.download.DownloadManager -import eu.kanade.tachiyomi.data.download.ImageNotifier import eu.kanade.tachiyomi.data.mangasync.MangaSyncManager import eu.kanade.tachiyomi.data.mangasync.UpdateMangaSyncService -import eu.kanade.tachiyomi.data.network.NetworkHelper import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.source.SourceManager import eu.kanade.tachiyomi.data.source.model.Page import eu.kanade.tachiyomi.data.source.online.OnlineSource import eu.kanade.tachiyomi.ui.base.presenter.BasePresenter +import eu.kanade.tachiyomi.ui.reader.notification.ImageNotifier import eu.kanade.tachiyomi.util.RetryWithDelay import eu.kanade.tachiyomi.util.SharedData import eu.kanade.tachiyomi.util.toast @@ -33,19 +30,12 @@ import timber.log.Timber import uy.kohesive.injekt.injectLazy import java.io.File import java.io.IOException -import java.io.InputStream import java.util.* /** * Presenter of [ReaderActivity]. */ class ReaderPresenter : BasePresenter() { - - /** - * Network helper - */ - private val network: NetworkHelper by injectLazy() - /** * Preferences. */ @@ -108,11 +98,6 @@ class ReaderPresenter : BasePresenter() { */ private val source by lazy { sourceManager.get(manga.source)!! } - /** - * - */ - val imageNotifier by lazy { ImageNotifier(context) } - /** * Directory of pictures */ @@ -398,13 +383,13 @@ class ReaderPresenter : BasePresenter() { if (chapter.read) { val removeAfterReadSlots = prefs.removeAfterReadSlots() when (removeAfterReadSlots) { - // Setting disabled + // Setting disabled -1 -> { /**Empty function**/ } - // Remove current read chapter + // Remove current read chapter 0 -> deleteChapter(chapter, manga) - // Remove previous chapter specified by user in settings. + // Remove previous chapter specified by user in settings. else -> getAdjacentChaptersStrategy(chapter, removeAfterReadSlots) .first?.let { deleteChapter(it, manga) } } @@ -548,43 +533,21 @@ class ReaderPresenter : BasePresenter() { * Update cover with page file. */ internal fun setCover(page: Page) { - // Update cover to selected file, show error if something went wrong - try { - if (editCoverWithStream(File(page.imagePath).inputStream(), manga)) { + try { + if (manga.favorite) { + if (manga.thumbnail_url != null) { + coverCache.copyToCache(manga.thumbnail_url!!, File(page.imagePath).inputStream()) context.toast(R.string.cover_updated) } else { - throw Exception("Stream copy failed") + throw Exception("Image url not found") } - } catch(e: Exception) { - context.toast(R.string.notification_manga_update_failed) - Timber.e(e.message) + } else { + context.toast(R.string.notification_first_add_to_library) } - } - - /** - * Called to copy image to cache - * @param inputStream the new cover. - * @param manga the manga edited. - * @return true if the cover is updated, false otherwise - */ - @Throws(IOException::class) - private fun editCoverWithStream(inputStream: InputStream, manga: Manga): Boolean { - if (manga.thumbnail_url != null && manga.favorite) { - coverCache.copyToCache(manga.thumbnail_url!!, inputStream) - return true + } catch (error: Exception) { + context.toast(R.string.notification_cover_update_failed) + Timber.e(error) } - return false - } - - fun shareImage(page: Page) { - val shareIntent = Intent().apply { - action = Intent.ACTION_SEND - putExtra(Intent.EXTRA_STREAM, Uri.parse(page.imagePath)) - flags = Intent.FLAG_ACTIVITY_NEW_TASK - type = "image/jpeg" - } - context.startActivity(Intent.createChooser(shareIntent, context.resources.getText(R.string.action_share)) - .apply { flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_MULTIPLE_TASK }) } /** @@ -593,6 +556,9 @@ class ReaderPresenter : BasePresenter() { */ @Throws(IOException::class) internal fun savePage(page: Page) { + // Used to show image notification + val imageNotifier = ImageNotifier(context) + // Location of image file. val inputFile = File(page.imagePath) @@ -602,23 +568,20 @@ class ReaderPresenter : BasePresenter() { //Remove the notification if already exist (user feedback) imageNotifier.onClear() - - //Check if file doesn't already exist - if (destFile.exists()) { - imageNotifier.onComplete(destFile) - } else { - if (inputFile.exists()) { - // Copy file - Observable.fromCallable { inputFile.copyTo(destFile) } - .observeOn(AndroidSchedulers.mainThread()) - .subscribeOn(Schedulers.io()) - .subscribe( - { imageNotifier.onComplete(it) }, - { error -> - Timber.e(error.message) - imageNotifier.onError(error.message) - }) - } + if (inputFile.exists()) { + // Copy file + Observable.fromCallable { inputFile.copyTo(destFile, true) } + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe( + { + // Show notification + imageNotifier.onComplete(it) + }, + { error -> + Timber.e(error) + imageNotifier.onError(error.message) + }) } } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/download/ImageNotificationReceiver.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/notification/ImageNotificationReceiver.kt similarity index 68% rename from app/src/main/java/eu/kanade/tachiyomi/data/download/ImageNotificationReceiver.kt rename to app/src/main/java/eu/kanade/tachiyomi/ui/reader/notification/ImageNotificationReceiver.kt index 13a2ff754e..fc1348ce5f 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/download/ImageNotificationReceiver.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/notification/ImageNotificationReceiver.kt @@ -1,4 +1,4 @@ -package eu.kanade.tachiyomi.data.download +package eu.kanade.tachiyomi.ui.reader.notification import android.app.PendingIntent import android.content.BroadcastReceiver @@ -9,6 +9,10 @@ import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.util.notificationManager import java.io.File +/** + * The BroadcastReceiver of [ImageNotifier] + * Intent calls should be made from this class. + */ class ImageNotificationReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { when (intent.action) { @@ -25,23 +29,36 @@ class ImageNotificationReceiver : BroadcastReceiver() { } } - fun deleteImage(path: String) { + /** + * Called to delete image + * @param path path of file + */ + private fun deleteImage(path: String) { val file = File(path) if (file.exists()) file.delete() } - fun shareImage(context: Context, path: String) { + /** + * Called to start share intent to share image + * @param context context of application + * @param path path of file + */ + private fun shareImage(context: Context, path: String) { val shareIntent = Intent().apply { action = Intent.ACTION_SEND putExtra(Intent.EXTRA_STREAM, Uri.parse(path)) - flags = Intent.FLAG_ACTIVITY_NEW_TASK type = "image/jpeg" } context.startActivity(Intent.createChooser(shareIntent, context.resources.getText(R.string.action_share)) .apply { flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_MULTIPLE_TASK }) } - fun showImage(context: Context, path: String) { + /** + * Called to show image in gallery application + * @param context context of application + * @param path path of file + */ + private fun showImage(context: Context, path: String) { val intent = Intent().apply { action = Intent.ACTION_VIEW flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_MULTIPLE_TASK @@ -51,17 +68,17 @@ class ImageNotificationReceiver : BroadcastReceiver() { } companion object { - const val ACTION_SHARE_IMAGE = "eu.kanade.SHARE_IMAGE" + private const val ACTION_SHARE_IMAGE = "eu.kanade.SHARE_IMAGE" - const val ACTION_SHOW_IMAGE = "eu.kanade.SHOW_IMAGE" + private const val ACTION_SHOW_IMAGE = "eu.kanade.SHOW_IMAGE" - const val ACTION_DELETE_IMAGE = "eu.kanade.DELETE_IMAGE" + private const val ACTION_DELETE_IMAGE = "eu.kanade.DELETE_IMAGE" - const val EXTRA_FILE_LOCATION = "file_location" + private const val EXTRA_FILE_LOCATION = "file_location" - const val NOTIFICATION_ID = "notification_id" + private const val NOTIFICATION_ID = "notification_id" - fun shareImageIntent(context: Context, path: String, notificationId: Int): PendingIntent { + internal fun shareImageIntent(context: Context, path: String, notificationId: Int): PendingIntent { val intent = Intent(context, ImageNotificationReceiver::class.java).apply { action = ACTION_SHARE_IMAGE putExtra(EXTRA_FILE_LOCATION, path) @@ -70,7 +87,7 @@ class ImageNotificationReceiver : BroadcastReceiver() { return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT) } - fun showImageIntent(context: Context, path: String): PendingIntent { + internal fun showImageIntent(context: Context, path: String): PendingIntent { val intent = Intent(context, ImageNotificationReceiver::class.java).apply { action = ACTION_SHOW_IMAGE putExtra(EXTRA_FILE_LOCATION, path) @@ -78,7 +95,7 @@ class ImageNotificationReceiver : BroadcastReceiver() { return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT) } - fun deleteImageIntent(context: Context, path: String, notificationId: Int): PendingIntent { + internal fun deleteImageIntent(context: Context, path: String, notificationId: Int): PendingIntent { val intent = Intent(context, ImageNotificationReceiver::class.java).apply { action = ACTION_DELETE_IMAGE putExtra(EXTRA_FILE_LOCATION, path) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/notification/ImageNotifier.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/notification/ImageNotifier.kt new file mode 100644 index 0000000000..241f5b72fb --- /dev/null +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/notification/ImageNotifier.kt @@ -0,0 +1,93 @@ +package eu.kanade.tachiyomi.ui.reader.notification + +import android.content.Context +import android.graphics.Bitmap +import android.support.v4.app.NotificationCompat +import com.bumptech.glide.Glide +import com.bumptech.glide.load.engine.DiskCacheStrategy +import com.bumptech.glide.request.animation.GlideAnimation +import com.bumptech.glide.request.target.SimpleTarget +import eu.kanade.tachiyomi.Constants +import eu.kanade.tachiyomi.R +import eu.kanade.tachiyomi.util.notificationManager +import java.io.File + +/** + * Class used to show BigPictureStyle notifications + */ +class ImageNotifier(private val context: Context) { + /** + * Notification builder. + */ + private val notificationBuilder = NotificationCompat.Builder(context) + + /** + * Id of the notification. + */ + private val notificationId: Int + get() = Constants.NOTIFICATION_DOWNLOAD_IMAGE_ID + + /** + * Called when image download/copy is complete + * @param file image file containing downloaded page image + */ + fun onComplete(file: File) { + with(notificationBuilder) { + Glide.with(context).load(file).asBitmap().diskCacheStrategy(DiskCacheStrategy.NONE).skipMemoryCache(true).into(object : SimpleTarget(720, 1280) { + /** + * The method that will be called when the resource load has finished. + * @param resource the loaded resource. + */ + override fun onResourceReady(resource: Bitmap?, glideAnimation: GlideAnimation?) { + setContentTitle(context.getString(R.string.picture_saved)) + setSmallIcon(R.drawable.ic_insert_photo_white_24dp) + setStyle(NotificationCompat.BigPictureStyle().bigPicture(resource)) + setLargeIcon(resource) + setAutoCancel(true) + // Clear old actions if they exist + if (!mActions.isEmpty()) + mActions.clear() + + setContentIntent(ImageNotificationReceiver.showImageIntent(context, file.absolutePath)) + // Share action + addAction(R.drawable.ic_share_grey_24dp, + context.getString(R.string.action_share), + ImageNotificationReceiver.shareImageIntent(context, file.absolutePath, notificationId)) + // Delete action + addAction(R.drawable.ic_delete_grey_24dp, + context.getString(R.string.action_delete), + ImageNotificationReceiver.deleteImageIntent(context, file.absolutePath, notificationId)) + updateNotification() + } + }) + } + } + + /** + * Clears the notification message + */ + fun onClear() { + context.notificationManager.cancel(notificationId) + } + + private fun updateNotification() { + // Displays the progress bar on notification + context.notificationManager.notify(notificationId, notificationBuilder.build()) + } + + + /** + * Called on error while downloading image + * @param error string containing error information + */ + fun onError(error: String?) { + // Create notification + with(notificationBuilder) { + setContentTitle(context.getString(R.string.download_notifier_title_error)) + setContentText(error ?: context.getString(R.string.unknown_error)) + setSmallIcon(android.R.drawable.ic_menu_report_image) + } + updateNotification() + } + +} diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerReader.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerReader.kt index b7d56bbeca..18cf1501c3 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerReader.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerReader.kt @@ -11,6 +11,7 @@ import eu.kanade.tachiyomi.ui.reader.ReaderChapter import eu.kanade.tachiyomi.ui.reader.viewer.base.BaseReader import eu.kanade.tachiyomi.ui.reader.viewer.pager.horizontal.LeftToRightReader import eu.kanade.tachiyomi.ui.reader.viewer.pager.horizontal.RightToLeftReader +import eu.kanade.tachiyomi.util.toast import rx.subscriptions.CompositeSubscription /** @@ -187,8 +188,13 @@ abstract class PagerReader : BaseReader() { } override fun onLongPress(e: MotionEvent?) { - super.onLongPress(e) - readerActivity.onLongPress(adapter.pages!![pager.currentItem]) + if (isAdded) { + val page = adapter.pages.getOrNull(pager.currentItem) + if (page != null) + readerActivity.onLongPress(page) + else + context.toast(getString(R.string.unknown_error)) + } } }) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonReader.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonReader.kt index 8dd7bf8d96..41fb2ac0a9 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonReader.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonReader.kt @@ -6,9 +6,11 @@ import android.view.* import android.view.GestureDetector.SimpleOnGestureListener import android.view.ViewGroup.LayoutParams.MATCH_PARENT import android.view.ViewGroup.LayoutParams.WRAP_CONTENT +import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.source.model.Page import eu.kanade.tachiyomi.ui.reader.ReaderChapter import eu.kanade.tachiyomi.ui.reader.viewer.base.BaseReader +import eu.kanade.tachiyomi.util.toast import eu.kanade.tachiyomi.widget.PreCachingLayoutManager import rx.subscriptions.CompositeSubscription @@ -142,17 +144,21 @@ class WebtoonReader : BaseReader() { } override fun onLongPress(e: MotionEvent) { - super.onLongPress(e) - val a = recycler.findChildViewUnder(e.rawX, e.rawY) - val i = recycler.getChildAdapterPosition(a) - readerActivity.onLongPress(adapter.getItem(i)) + if (isAdded) { + val child = recycler.findChildViewUnder(e.rawX, e.rawY) + val position = recycler.getChildAdapterPosition(child) + val page = adapter.pages?.getOrNull(position) + if (page != null) + readerActivity.onLongPress(page) + else + context.toast(getString(R.string.unknown_error)) + } } }) } /** * Called when a new chapter is set in [BaseReader]. - * * @param chapter the chapter set. * @param currentPage the initial page to display. */ @@ -167,7 +173,6 @@ class WebtoonReader : BaseReader() { /** * Called when a chapter is appended in [BaseReader]. - * * @param chapter the chapter appended. */ override fun onChapterAppended(chapter: ReaderChapter) { @@ -191,7 +196,6 @@ class WebtoonReader : BaseReader() { /** * Sets the active page. - * * @param pageNumber the index of the page from [pages]. */ override fun setActivePage(pageNumber: Int) { diff --git a/app/src/main/res/drawable-hdpi/ic_delete_grey_24dp.png b/app/src/main/res/drawable-hdpi/ic_delete_grey_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..13d2741f36a92e9e62e14434f7de95e83052fe4c GIT binary patch literal 485 zcmVa`j!y#$vOWH!i&Y?wFmV9^ZA?yMIs1e z%-^vLqG?*lnb6g0H9xL@F`Z7iEJ)J(jYi`yKv}Jng3uh;wtb5bx=9&Jy!Ku$m*0Z# zhXBjv(xj9=qy=D%txBcRl>!!v#lUf#kRS<+5MoxV)yG)Ce!uTVyXnxiuIurD*=#m& zT{pFZLZM*R>vg#U0T3xVbjMMhNRbjC93<^~Pk*q3B!vxXl@2D8$$(Ot+5yJcY&M(n z8VEqvBL6=i>!2we937B#l4Bi=Mx)GKWEh6Liv%F+B*y~A<8jY%oPOF#CWQ1`t=6;j zYdRbbuPCJ(gwSbz;d}I400000NkvXXu0mjf8ExUl literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/ic_insert_photo_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_insert_photo_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..25a9576ddd920f235d3f1391477aed6697c8ca03 GIT binary patch literal 247 zcmVgF&^r)t_CE()tu|&z;WnrSDjp5yz5TC% zQZOeHYtWYejBuHDpzAy_%J>Du7wMq5lZZi;q3MZWJp(%08_hKPsRIAlvN~xtJNu<^q5D}VZDdmqtLqpH>1gKOh zA1I}28^z5%=RCA+JGE`V+}vEh5MoLxmEB^c|8yMZK-U1RHCC(Dmk}`=hT-ujisTl6 zvg0_z9RrN;{QUe;MD&U1*(i!Ij^nFZYabDx1Aw;xU>^Ydf{3;C_4S30T~scY4>HD1 zYpvf^N@a*>6#zcBEUReS_I1zm*ucQRegij{z{gqCq-$BHD7=};9aco@jH2{?A_4;?7=f&+RtpO;P%da5fCq(p^@v^ZS=X@Oz zZzV}`P$^}Eu9$R;jg1*V$D;x8eSawkg4fJ-tK}GDrg*L+Vv&eGb6t0>W92(9HUPz9 z@ir0d-OSGbFf=|sUg=i&o;8@Bp1utLdp8piLX6~cxl&Jnsi~<;jIlR1iy)Os{UL-X zMNzb1+qQ8}SEG@lLZR>y0DKAnkGFjN9{{W%;vp$zEQI(Wj^onE$jHTR2=~~uzrX(& z5k0{eyQ#Il5(L4GR4R1>06wxT>#z{QbjokzIQCapS1)&L({?kOoSfXx82bFIxED1iVA_I|@rjaL$)p*L}Swz~bT}UtV4=AfgQbyu~QDIOp%Xu6v;;K+~Q{lAH#B6GW6@ zjQvbRALsM=OWSf$J3DWD-g5-)fV+Tp8QS?@sQ&>BqNFzW>>X180000X1^@s6IQ*`u0003tNkl5>et@nDRh@6fsL;Pw&v3SBZKk!)YF zAZbhtIS5^HgCtJ6kJEoAAzWy9VLV(5pe)O9uZ2?T0RUczNFC|Zv~9cUy6$7|i=wFR z*G_|~s%XE_wk;TAPPCO$f)L{1pUq}2)(u&fy?LGoUDpA3)>=Ou18$|1kKB@4Yu~lj zKLf{uC5%D zQik*S{7-`(V2oh{lv4iy*zI=g41C`|&7cP`>hJnw6wvnpN5K9}U&eumX`0?OP4h)W zH;iUl3nA_oi^cb$6Nw0y%jGj7>NAiv0K6tivO+}ng0JOEVzj-6zmROnb2dbs~(^j5ic0>pDDE2 jzES4mqy6s}oc+sic8*Qfk2kwOj%4t3^>bP0l+XkKat%vT literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_share_grey_24dp.png b/app/src/main/res/drawable-mdpi/ic_share_grey_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..e2814bdc98156d1ab0710b985e8a5c671727b109 GIT binary patch literal 554 zcmV+_0@eMAP)X1^@s6IQ*`u0005;NklDY-|L76rKb@Z4a^VFSy1w5wi)G1a?WW(PXoPJ2nuKkm4%A zzrgBh(c(}WJLL)m@kfFpMBLfgH?m?t5>zVAag;=v>ShyMvM9*-|D z#)be;0DwIrx>GC`U#9k8G#Wh*!|)Oj0b>jd!+23DmDW-Nf*=UvIOd25N-5AZEv#0n z=1Rb1GPy!T_viEZ`X3{IRIAl)Ed>NYkmsCx0I(s1cq6530>Bz$>?#pGky3VT+y49$ zFc=IjB4R-)wHHOvYtu9xrBqP}5ep$&*=%;FTrP(Pg${?q;U*DzM8p$ai1<}Xc`OXW z9YnlWuh%~wmR9Wd`%@vriNu&+21z11YuomInwVp+*ZZWDI{90%G)?oIWm&IM0es)T z3jkXHzyTo9`6ZXj9S491MAWQQDjyD&kUaXne;xoX1Hd!R`F<2dHC@-soO1;L-Pvq5 zc3t=TfhI1acRHQCrfDtC`E6a--w~0+7&`+1*BE0@r_$=}o2C3Wa77(#z7{<*w zj$skyOeXWtvaF4jfJKL%=OyDjwYclL{=U&@;fY0I*xNAHK5&YpJt40 s6VY|X*kdBvY&M&3Qv;Tn{SN?s0G-Ly8u8t$XaE2J07*qoM6N<$f})o5S^xk5 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_delete_grey_24dp.png b/app/src/main/res/drawable-xhdpi/ic_delete_grey_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..4ca7f7c9ad1acae880b05e4d6d89514f5faf95fd GIT binary patch literal 594 zcmV-Y0BjE6vyA4q_agmb?MqUkSTLNMJd=>+Ovz)>(6jART#v_sc8Q2HGT{RoB5 z{Q#v~IG<$e!UY1ctwg8zL}HK^Vd=elzx&^Ne`F(g;tzV_`p^Qj3bYEe3K%IcnM_{v zdc98=;}fM+4Z=gqGo|#uiOH=2q-lCwmV_}rS}vC#q?9l3D}H;Q z5OU?Z?uAn7XW3do5M127zXp&bi7HDfiURUHH`&lljO)7KI8JGN7=~*#*SDM>AGzK`X>kw)zcvH5 z0H)LF008tDZOwU|v);@HfaB3oEZte<7s+_nOQ zkil>`Gy{-QT34Xc>C^+T-GuuGV7muuDX>^9toJ~-+cob24Pd(m_6H!2<9?p!)_uV9 zyaA=u%m* ztH)3&m6#(q@3lEra+D1^8~2pw2##6Q08_bH{nD*-s?E+OQsD2h{rkY@ox zIF55Jr99`HFDn6bz<4}<1pptFQtuH$uXlj>i!uI|W!V?b`Mt^fc4 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_insert_photo_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_insert_photo_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..2642b9e09ec00be308649f62d9323f22ae2b6c6c GIT binary patch literal 304 zcmV-00nh%4P)0++mR7nD4pd~x$TQLGba6~{cu-M!3I>jYZG8L#~C$dSzGCa?>% zii{qBH_l~3H}Ow_R&mWIA6&_uY{DqeDkOK@%2_vI7ibl>$R-Q|t-=u5gh8NHSX1ob zZ91p^`0a>6o%RQ$Cqo6Qpk>-nPOXnuLHxL2AA)bf8YiVe5h%F;00003Y(x$KKLXu%PLH$Ocd8)D@kwubPpp!Nt#mH zCXEs1&`n=d)Qzz{%oi2Gfs@e(VVh{tIasz4>4Y}Py}x^o{9+<)?f)d~B|iv(o7{6g zzwf!f?>QIYE-$>x`JoBWRG_IqQ-OvkkWQyt48!P=QoaQMy8%EF(XT>?kLTy-v%z4n zP&L4Y0A#b-1I(OqUAL8pfSEx`sXue3X^t)|ETpRtbqC01vwNBOi(;|(;7T@cSr!?F zk?Qa759;3=0dTZXD7?E?kFhLkW?*1Im!|#z>2&&2*L7dfvLj+y{^j3NN;eP)SPcP~ znwmPPl6B6)R!Y6*x~|{zJpG^%GoMGqct=OagwO!k%UP1^kP4hMY+$5qW9LE7IHvs5l$8_>=IIJPIyvhnpPfs84JTK)qPU}jM zG)M(XXTPZBo}ZsT7mLOIC9PqV0aB^dOtDzpwT^lGjEJFyg@v!{k$A}|7#kbA0|49B zvCk8>Z6B;*vn$?OR$z2=^bR6!TPwJf@)O&(`x*j}OeQZ?28UJS8-{UNN*SG-n>*Wx z66`0U_Ym=c)ykmBd_EsbDK9Z|BA?Hnss~891o{{%r4A9%QAE6V8N^LyzJZ8ORwoB4VpnM2}deX`TmwM0FG7t_dMNVCMUXsE>%s?uv*d!!W)o6bj);ByxR;5p7hi zmHwweT3T9OWaeSrdUY<#vdY$7>6ZV^gr;d~rG7!gHwFg>zb}K;l6>*K$z-zI^SlTm z>UV;c)ofk&70a?R!C-Kpt^ie-cs!m2fbd!yGfneyC=}Y!5P9}|HGn>^xFfkMp%?$hv`WFN*y5Qnn z*ly{A13!kXnW-6zgBmz4=zcZz-m7{Gd#B)zKkAP64?=+3L2*DFASxguL==z=7YE1^ z5(|g}L;=Zgaeyo#u>jeDEXy8sI-QRIa9**OYw!Itt@WphxIeCw2;_PG_;@^iI2;b= z&N)y@f%m@j?|#339YxVAt@Zo5Bnk=Sd47Qv^xofd&TZ>9e@nL4>je@crPL4Xom%U! zf8Qx2u-olCRxF(F_xl^gsZY1ty>ShD27|#rmkLqa?UvpZ)=iD`;czGfYUtJ+q>=+w z(xhto)V)6%jmnKsbDFhZ319v8dmz05B~a!wfz$y4F3SGjAt-??%Y5CLZ30)6{gnu8 zHXF~m(Btv=q{yfP>-C!TLrn;X1H_0TkI-thVof13fiOaxDKwc(XeksNAWi`ZE(Dg# zCF>3};sECkOs7-Y4g?2CLreq<0datPgcgehYYH{81Dq)|o6Tq`6dWK<0SPVy(llk= zfkqtQ+<`cbX*&=cAPq4QECj>>?h%^L=d3Bz$PRF(P?99H6bcRyr+@?(0@hmA9caV> z&K)qu(00ID`x5}pNP}D-d})k1`7aFU*X!2W*8uRMeh(z%8)MANQx#AGX_`KC&V2!Z z`=nN?gRi0}dJ@O+HxhvWw$_dTApHC<5?4y8I7yOs7;n^p+XB|w2LSNgd;e4^b=J~i zUjo2q0C;PR`HnRo&Px+0Q;g$|5a3X~(w|wm8^qo(BZMi`_PIFFw!&C_aR5`O?Q?OU dZH2M=zW^S?_<8q8m|@f&vEk zXhJXy z)&q8Jdy{=h?m>-(r*@dK*d3epCi{|HgU+qz4*BYtIwp6bB0wo2#+nm8I>3B8iEGdk zTNzJQxB%cRn_*v)JJ1{dbN|paSFGhz>`QV3I>zMAKdKnfM6N&`Di|k|EDy3@h4PVK zk{o2e3gsieq-8-3jN^&)U)Wy&nw9O-LW-|?GEfU&#WGOH2p`=L$UkuoJ#eZRDaa7g sq|daVQ|=KHU?d>_qaXz-NI@l=ck_!~>**H-(*OVf07*qoM6N<$f*#evGXMYp literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_share_grey_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_share_grey_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..9ed5b4d43206a8ca290e29b0bb645c76ee07ca26 GIT binary patch literal 1823 zcmV+)2jKXLP)39sV&C+;DUL02RiRsVFj=NwTKNYr9r`YGQsY z%V^W4n~L+tP*G43oeKW8>U1iI;ID~JWKMLyl$gA}yxb$Vv?Yy6*Y}e3Rmg)-NY1_Q z`#I;_^Ul4m2>=IZEb;B0WdT)v|wap1dFt~Ka%jm$sz;a2FB85WX zV#6?)jkFnk$N|98U@$m5V*q`9eP_wC`~VT%G%_-x2;pVo_jAs7Gscz^QFFD03jlu- z(e0|L?wqk!VsLOU4gjiQ7+{)arED4YcswiDuV0^y#bT#RlJqtJEUI8AJbq&+6#8RE znmLi@obz_WFcw$Jb42{CSS)s_s`?%xPV^A{{rydaLg75l`DuvQ$~pg&bN-92>)&gd zR?!1>E2Bh&>2!LrEXxm@rnzFgt1R=_&xkmf&1Ujsd?WS-@muQm(=tMoQQ zp-{+cRp8O=D*_A-4$k46cQD4TLBulv;3NPzf{4Fy&Ob5?C^T>#)s&UtS>pZ`+RG=4NeR)7Bwz~;@H=eynRS4`6!&EL|hAto2yprR-_ zA_^knTGKQy6N^+_CE__E{zyc~ubb5{bm+ zMD(6j0I|LEcsw5?VwczJ{m|<8TJ0y5(Re)m1QFeeqJU3v$W*@2#i5hSyu~uQz9X|;m5{aBF%d$9+Y_VF6guMU}4>-nHx7X{9&-jB(P;c6_X<@Ngd@rPrV{dQoKGDoIH#c_zz+FT%zf^#Th=_(P%R5ce?DqTpUmuHz)UBP4Mx#$7 z;w@rdP?~;Y=b3`-F`v(OmmM!pHKuL=LUH$+XfKoBhX!H&M5UF)`d0Gh&S(bMZQHRgx`=mUrG)2!LKh`gnHkg=l_)#vkVsswRN z0mKa>k;nyzC@R(s03er&5FpLX&HDl1HO83ehR>;V2q0h;Mfo(F&93b3?mj#zs`bdj z>C6#}#jYhH5s~xD_ZwoDCyrgFddV^N#Q)Va%_U+xJATh&9)WVWNF;JIV{AJSxvV}c z$12+94I4HD9Rm#uA!dy1xMIWgCaN1!w!kx1l0M7(!8 zDOhUL($ccQ@AvmP4vq}3z9bE(CUfi~An{x2r!6%7m zP1U9i@&4}a?uW{ozgYn=E;<|zUy6uV0>C9ibdop?C!!A-WAAL-xbYiDnmG%(ZOe34 zMZgY01Hg{g>N%znfqHt=&RmTM*zsCD$21~PPjA|ps}TV^UaRMre*qxDpLv_nR?Ywb N002ovPDHLkV1iT^WM%*W literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_delete_grey_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_delete_grey_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..a1b86d06e88c02bc7f265596e330996c9ba6ff37 GIT binary patch literal 1076 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 eI_I>vfd2!>QSHB`6gf2j0000 - - diff --git a/app/src/main/res/drawable/ic_insert_photo_white_24dp.png b/app/src/main/res/drawable/ic_insert_photo_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..d474bd577d00d2aa045685f38b1729e4b2c314e2 GIT binary patch literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_+i22U5q5R22v2@-1_)Iaz?{r|_t z@c(}UO&^5wG3f`I3NX5v2Dl$y{{P_r{X*9Y*v@e=cBuVzj-6zmROnb2dbs~(^j5ic0>pDDE2 jzES4mqy6s}oc+sic8*Qfk2kwOj%4t3^>bP0l+XkKat%vT literal 0 HcmV?d00001 diff --git a/app/src/main/res/values/keys.xml b/app/src/main/res/values/keys.xml index 0fafb4123f..f3694dc7ad 100644 --- a/app/src/main/res/values/keys.xml +++ b/app/src/main/res/values/keys.xml @@ -48,8 +48,6 @@ pref_download_only_over_wifi_key pref_remove_after_marked_as_read_key pref_category_remove_after_read_key - notifications_single_page - notifications_manga_download last_used_category pref_source_languages diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 52d5ac8d3d..7815e3f951 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -267,11 +267,6 @@ Status Chapters - - Custom filter - Download page - Set as cover - Cover updated This will remove the read date of this chapter. Are you sure? Reset all chapters for this manga @@ -279,6 +274,7 @@ Picture saved Saving picture + Options Custom filter @@ -315,6 +311,7 @@ No new chapters found New chapters found for: Failed to update manga: + Failed to update cover Please add the manga to your library before doing this Sync canceled Not connected to AC power