mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-10-30 22:07:57 +01:00 
			
		
		
		
	Use Kolinter Gradle plugin for linting instead of ktlint directly
This commit is contained in:
		| @@ -13,7 +13,6 @@ import eu.kanade.tachiyomi.data.notification.Notifications | ||||
| import eu.kanade.tachiyomi.data.preference.PreferencesHelper | ||||
| import eu.kanade.tachiyomi.ui.security.SecureActivityDelegate | ||||
| import eu.kanade.tachiyomi.util.system.LocaleHelper | ||||
| import java.security.Security | ||||
| import org.acra.ACRA | ||||
| import org.acra.annotation.AcraCore | ||||
| import org.acra.annotation.AcraHttpSender | ||||
| @@ -24,6 +23,7 @@ import uy.kohesive.injekt.Injekt | ||||
| import uy.kohesive.injekt.api.InjektScope | ||||
| import uy.kohesive.injekt.injectLazy | ||||
| import uy.kohesive.injekt.registry.default.DefaultRegistrar | ||||
| import java.security.Security | ||||
|  | ||||
| @AcraCore( | ||||
|     buildConfigClass = BuildConfig::class, | ||||
|   | ||||
| @@ -8,9 +8,9 @@ import androidx.work.WorkManager | ||||
| import androidx.work.Worker | ||||
| import androidx.work.WorkerParameters | ||||
| import eu.kanade.tachiyomi.data.preference.PreferencesHelper | ||||
| import java.util.concurrent.TimeUnit | ||||
| import uy.kohesive.injekt.Injekt | ||||
| import uy.kohesive.injekt.api.get | ||||
| import java.util.concurrent.TimeUnit | ||||
|  | ||||
| class BackupCreatorJob(private val context: Context, workerParams: WorkerParameters) : | ||||
|     Worker(context, workerParams) { | ||||
| @@ -36,8 +36,10 @@ class BackupCreatorJob(private val context: Context, workerParams: WorkerParamet | ||||
|             val interval = prefInterval ?: preferences.backupInterval().get() | ||||
|             if (interval > 0) { | ||||
|                 val request = PeriodicWorkRequestBuilder<BackupCreatorJob>( | ||||
|                     interval.toLong(), TimeUnit.HOURS, | ||||
|                     10, TimeUnit.MINUTES | ||||
|                     interval.toLong(), | ||||
|                     TimeUnit.HOURS, | ||||
|                     10, | ||||
|                     TimeUnit.MINUTES | ||||
|                 ) | ||||
|                     .addTag(TAG) | ||||
|                     .build() | ||||
|   | ||||
| @@ -50,10 +50,10 @@ import eu.kanade.tachiyomi.source.LocalSource | ||||
| import eu.kanade.tachiyomi.source.Source | ||||
| import eu.kanade.tachiyomi.source.SourceManager | ||||
| import eu.kanade.tachiyomi.util.chapter.syncChaptersWithSource | ||||
| import kotlin.math.max | ||||
| import rx.Observable | ||||
| import timber.log.Timber | ||||
| import uy.kohesive.injekt.injectLazy | ||||
| import kotlin.math.max | ||||
|  | ||||
| class BackupManager(val context: Context, version: Int = CURRENT_VERSION) { | ||||
|  | ||||
|   | ||||
| @@ -11,9 +11,9 @@ import eu.kanade.tachiyomi.data.preference.PreferencesHelper | ||||
| import eu.kanade.tachiyomi.util.storage.getUriCompat | ||||
| import eu.kanade.tachiyomi.util.system.notificationBuilder | ||||
| import eu.kanade.tachiyomi.util.system.notificationManager | ||||
| import uy.kohesive.injekt.injectLazy | ||||
| import java.io.File | ||||
| import java.util.concurrent.TimeUnit | ||||
| import uy.kohesive.injekt.injectLazy | ||||
|  | ||||
| internal class BackupNotifier(private val context: Context) { | ||||
|  | ||||
|   | ||||
| @@ -35,10 +35,6 @@ import eu.kanade.tachiyomi.source.Source | ||||
| import eu.kanade.tachiyomi.util.chapter.NoChaptersException | ||||
| import eu.kanade.tachiyomi.util.system.acquireWakeLock | ||||
| import eu.kanade.tachiyomi.util.system.isServiceRunning | ||||
| import java.io.File | ||||
| import java.text.SimpleDateFormat | ||||
| import java.util.Date | ||||
| import java.util.Locale | ||||
| import kotlinx.coroutines.CoroutineExceptionHandler | ||||
| import kotlinx.coroutines.GlobalScope | ||||
| import kotlinx.coroutines.Job | ||||
| @@ -46,6 +42,10 @@ import kotlinx.coroutines.launch | ||||
| import rx.Observable | ||||
| import timber.log.Timber | ||||
| import uy.kohesive.injekt.injectLazy | ||||
| import java.io.File | ||||
| import java.text.SimpleDateFormat | ||||
| import java.util.Date | ||||
| import java.util.Locale | ||||
|  | ||||
| /** | ||||
|  * Restores backup from a JSON file. | ||||
|   | ||||
| @@ -9,13 +9,13 @@ import eu.kanade.tachiyomi.data.database.models.Chapter | ||||
| import eu.kanade.tachiyomi.source.model.Page | ||||
| import eu.kanade.tachiyomi.util.storage.DiskUtil | ||||
| import eu.kanade.tachiyomi.util.storage.saveTo | ||||
| import java.io.File | ||||
| import java.io.IOException | ||||
| import okhttp3.Response | ||||
| import okio.buffer | ||||
| import okio.sink | ||||
| import rx.Observable | ||||
| import uy.kohesive.injekt.injectLazy | ||||
| import java.io.File | ||||
| import java.io.IOException | ||||
|  | ||||
| /** | ||||
|  * Class used to create chapter cache | ||||
|   | ||||
| @@ -7,10 +7,10 @@ import eu.kanade.tachiyomi.data.database.models.Chapter | ||||
| import eu.kanade.tachiyomi.data.database.models.Manga | ||||
| import eu.kanade.tachiyomi.data.preference.PreferencesHelper | ||||
| import eu.kanade.tachiyomi.source.SourceManager | ||||
| import java.util.concurrent.TimeUnit | ||||
| import kotlinx.coroutines.flow.onEach | ||||
| import uy.kohesive.injekt.Injekt | ||||
| import uy.kohesive.injekt.api.get | ||||
| import java.util.concurrent.TimeUnit | ||||
|  | ||||
| /** | ||||
|  * Cache where we dump the downloads directory from the filesystem. This class is needed because | ||||
|   | ||||
| @@ -12,8 +12,8 @@ import eu.kanade.tachiyomi.data.preference.PreferencesHelper | ||||
| import eu.kanade.tachiyomi.util.lang.chop | ||||
| import eu.kanade.tachiyomi.util.system.notificationBuilder | ||||
| import eu.kanade.tachiyomi.util.system.notificationManager | ||||
| import java.util.regex.Pattern | ||||
| import uy.kohesive.injekt.injectLazy | ||||
| import java.util.regex.Pattern | ||||
|  | ||||
| /** | ||||
|  * DownloadNotifier is used to show notifications when downloading one or multiple chapters. | ||||
| @@ -107,7 +107,9 @@ internal class DownloadNotifier(private val context: Context) { | ||||
|             } | ||||
|  | ||||
|             val downloadingProgressText = context.getString( | ||||
|                 R.string.chapter_downloading_progress, download.downloadedImages, download.pages!!.size | ||||
|                 R.string.chapter_downloading_progress, | ||||
|                 download.downloadedImages, | ||||
|                 download.pages!!.size | ||||
|             ) | ||||
|  | ||||
|             if (preferences.hideNotificationContent()) { | ||||
|   | ||||
| @@ -22,7 +22,6 @@ import eu.kanade.tachiyomi.util.lang.plusAssign | ||||
| import eu.kanade.tachiyomi.util.storage.DiskUtil | ||||
| import eu.kanade.tachiyomi.util.storage.saveTo | ||||
| import eu.kanade.tachiyomi.util.system.ImageUtil | ||||
| import java.io.File | ||||
| import kotlinx.coroutines.async | ||||
| import okhttp3.Response | ||||
| import rx.Observable | ||||
| @@ -31,6 +30,7 @@ import rx.schedulers.Schedulers | ||||
| import rx.subscriptions.CompositeSubscription | ||||
| import timber.log.Timber | ||||
| import uy.kohesive.injekt.injectLazy | ||||
| import java.io.File | ||||
|  | ||||
| /** | ||||
|  * This class is the one in charge of downloading chapters. | ||||
|   | ||||
| @@ -5,9 +5,9 @@ import eu.kanade.tachiyomi.data.database.models.Chapter | ||||
| import eu.kanade.tachiyomi.data.database.models.Manga | ||||
| import eu.kanade.tachiyomi.data.download.DownloadStore | ||||
| import eu.kanade.tachiyomi.source.model.Page | ||||
| import java.util.concurrent.CopyOnWriteArrayList | ||||
| import rx.Observable | ||||
| import rx.subjects.PublishSubject | ||||
| import java.util.concurrent.CopyOnWriteArrayList | ||||
|  | ||||
| class DownloadQueue( | ||||
|     private val store: DownloadStore, | ||||
|   | ||||
| @@ -5,12 +5,12 @@ import android.util.Log | ||||
| import com.bumptech.glide.Priority | ||||
| import com.bumptech.glide.load.DataSource | ||||
| import com.bumptech.glide.load.data.DataFetcher | ||||
| import timber.log.Timber | ||||
| import java.io.File | ||||
| import java.io.FileInputStream | ||||
| import java.io.FileNotFoundException | ||||
| import java.io.IOException | ||||
| import java.io.InputStream | ||||
| import timber.log.Timber | ||||
|  | ||||
| open class FileFetcher(private val filePath: String = "") : DataFetcher<InputStream> { | ||||
|  | ||||
|   | ||||
| @@ -14,10 +14,10 @@ import eu.kanade.tachiyomi.network.NetworkHelper | ||||
| import eu.kanade.tachiyomi.source.SourceManager | ||||
| import eu.kanade.tachiyomi.source.online.HttpSource | ||||
| import eu.kanade.tachiyomi.util.isLocal | ||||
| import java.io.InputStream | ||||
| import uy.kohesive.injekt.Injekt | ||||
| import uy.kohesive.injekt.api.get | ||||
| import uy.kohesive.injekt.injectLazy | ||||
| import java.io.InputStream | ||||
|  | ||||
| /** | ||||
|  * A class for loading a cover associated with a [Manga] that can be present in our own cache. | ||||
|   | ||||
| @@ -14,9 +14,9 @@ import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions | ||||
| import com.bumptech.glide.module.AppGlideModule | ||||
| import com.bumptech.glide.request.RequestOptions | ||||
| import eu.kanade.tachiyomi.network.NetworkHelper | ||||
| import java.io.InputStream | ||||
| import uy.kohesive.injekt.Injekt | ||||
| import uy.kohesive.injekt.api.get | ||||
| import java.io.InputStream | ||||
|  | ||||
| /** | ||||
|  * Class used to update Glide module settings | ||||
|   | ||||
| @@ -9,9 +9,9 @@ import androidx.work.WorkManager | ||||
| import androidx.work.Worker | ||||
| import androidx.work.WorkerParameters | ||||
| import eu.kanade.tachiyomi.data.preference.PreferencesHelper | ||||
| import java.util.concurrent.TimeUnit | ||||
| import uy.kohesive.injekt.Injekt | ||||
| import uy.kohesive.injekt.api.get | ||||
| import java.util.concurrent.TimeUnit | ||||
|  | ||||
| class LibraryUpdateJob(private val context: Context, workerParams: WorkerParameters) : | ||||
|     Worker(context, workerParams) { | ||||
| @@ -45,8 +45,10 @@ class LibraryUpdateJob(private val context: Context, workerParams: WorkerParamet | ||||
|                     .build() | ||||
|  | ||||
|                 val request = PeriodicWorkRequestBuilder<LibraryUpdateJob>( | ||||
|                     interval.toLong(), TimeUnit.HOURS, | ||||
|                     10, TimeUnit.MINUTES | ||||
|                     interval.toLong(), | ||||
|                     TimeUnit.HOURS, | ||||
|                     10, | ||||
|                     TimeUnit.MINUTES | ||||
|                 ) | ||||
|                     .addTag(TAG) | ||||
|                     .setConstraints(constraints) | ||||
|   | ||||
| @@ -22,9 +22,9 @@ import eu.kanade.tachiyomi.util.lang.chop | ||||
| import eu.kanade.tachiyomi.util.system.notification | ||||
| import eu.kanade.tachiyomi.util.system.notificationBuilder | ||||
| import eu.kanade.tachiyomi.util.system.notificationManager | ||||
| import uy.kohesive.injekt.injectLazy | ||||
| import java.text.DecimalFormat | ||||
| import java.text.DecimalFormatSymbols | ||||
| import uy.kohesive.injekt.injectLazy | ||||
|  | ||||
| class LibraryUpdateNotifier(private val context: Context) { | ||||
|  | ||||
| @@ -198,18 +198,23 @@ class LibraryUpdateNotifier(private val context: Context) { | ||||
|  | ||||
|             // Mark chapters as read action | ||||
|             addAction( | ||||
|                 R.drawable.ic_glasses_black_24dp, context.getString(R.string.action_mark_as_read), | ||||
|                 R.drawable.ic_glasses_black_24dp, | ||||
|                 context.getString(R.string.action_mark_as_read), | ||||
|                 NotificationReceiver.markAsReadPendingBroadcast( | ||||
|                     context, | ||||
|                     manga, chapters, Notifications.ID_NEW_CHAPTERS | ||||
|                     manga, | ||||
|                     chapters, | ||||
|                     Notifications.ID_NEW_CHAPTERS | ||||
|                 ) | ||||
|             ) | ||||
|             // View chapters action | ||||
|             addAction( | ||||
|                 R.drawable.ic_book_24dp, context.getString(R.string.action_view_chapters), | ||||
|                 R.drawable.ic_book_24dp, | ||||
|                 context.getString(R.string.action_view_chapters), | ||||
|                 NotificationReceiver.openChapterPendingActivity( | ||||
|                     context, | ||||
|                     manga, Notifications.ID_NEW_CHAPTERS | ||||
|                     manga, | ||||
|                     Notifications.ID_NEW_CHAPTERS | ||||
|                 ) | ||||
|             ) | ||||
|         } | ||||
|   | ||||
| @@ -29,14 +29,14 @@ import eu.kanade.tachiyomi.util.shouldDownloadNewChapters | ||||
| import eu.kanade.tachiyomi.util.storage.getUriCompat | ||||
| import eu.kanade.tachiyomi.util.system.acquireWakeLock | ||||
| import eu.kanade.tachiyomi.util.system.isServiceRunning | ||||
| import java.io.File | ||||
| import java.util.concurrent.atomic.AtomicInteger | ||||
| import rx.Observable | ||||
| import rx.Subscription | ||||
| import rx.schedulers.Schedulers | ||||
| import timber.log.Timber | ||||
| import uy.kohesive.injekt.Injekt | ||||
| import uy.kohesive.injekt.api.get | ||||
| import java.io.File | ||||
| import java.util.concurrent.atomic.AtomicInteger | ||||
|  | ||||
| /** | ||||
|  * This class will take care of updating the chapters of the manga from the library. It can be | ||||
|   | ||||
| @@ -7,7 +7,6 @@ import android.content.Intent | ||||
| import android.net.Uri | ||||
| import android.os.Build | ||||
| import android.os.Handler | ||||
| import eu.kanade.tachiyomi.BuildConfig.APPLICATION_ID as ID | ||||
| import eu.kanade.tachiyomi.R | ||||
| import eu.kanade.tachiyomi.data.backup.BackupRestoreService | ||||
| import eu.kanade.tachiyomi.data.database.DatabaseHelper | ||||
| @@ -26,10 +25,11 @@ import eu.kanade.tachiyomi.util.storage.DiskUtil | ||||
| import eu.kanade.tachiyomi.util.storage.getUriCompat | ||||
| import eu.kanade.tachiyomi.util.system.notificationManager | ||||
| import eu.kanade.tachiyomi.util.system.toast | ||||
| import java.io.File | ||||
| import uy.kohesive.injekt.Injekt | ||||
| import uy.kohesive.injekt.api.get | ||||
| import uy.kohesive.injekt.injectLazy | ||||
| import java.io.File | ||||
| import eu.kanade.tachiyomi.BuildConfig.APPLICATION_ID as ID | ||||
|  | ||||
| /** | ||||
|  * Global [BroadcastReceiver] that runs on UI thread | ||||
| @@ -56,19 +56,22 @@ class NotificationReceiver : BroadcastReceiver() { | ||||
|             // Launch share activity and dismiss notification | ||||
|             ACTION_SHARE_IMAGE -> | ||||
|                 shareImage( | ||||
|                     context, intent.getStringExtra(EXTRA_FILE_LOCATION), | ||||
|                     context, | ||||
|                     intent.getStringExtra(EXTRA_FILE_LOCATION), | ||||
|                     intent.getIntExtra(EXTRA_NOTIFICATION_ID, -1) | ||||
|                 ) | ||||
|             // Delete image from path and dismiss notification | ||||
|             ACTION_DELETE_IMAGE -> | ||||
|                 deleteImage( | ||||
|                     context, intent.getStringExtra(EXTRA_FILE_LOCATION), | ||||
|                     context, | ||||
|                     intent.getStringExtra(EXTRA_FILE_LOCATION), | ||||
|                     intent.getIntExtra(EXTRA_NOTIFICATION_ID, -1) | ||||
|                 ) | ||||
|             // Share backup file | ||||
|             ACTION_SHARE_BACKUP -> | ||||
|                 shareBackup( | ||||
|                     context, intent.getParcelableExtra(EXTRA_URI), | ||||
|                     context, | ||||
|                     intent.getParcelableExtra(EXTRA_URI), | ||||
|                     intent.getIntExtra(EXTRA_NOTIFICATION_ID, -1) | ||||
|                 ) | ||||
|             ACTION_CANCEL_RESTORE -> cancelRestore( | ||||
| @@ -80,7 +83,8 @@ class NotificationReceiver : BroadcastReceiver() { | ||||
|             // Open reader activity | ||||
|             ACTION_OPEN_CHAPTER -> { | ||||
|                 openChapter( | ||||
|                     context, intent.getLongExtra(EXTRA_MANGA_ID, -1), | ||||
|                     context, | ||||
|                     intent.getLongExtra(EXTRA_MANGA_ID, -1), | ||||
|                     intent.getLongExtra(EXTRA_CHAPTER_ID, -1) | ||||
|                 ) | ||||
|             } | ||||
|   | ||||
| @@ -82,53 +82,62 @@ object Notifications { | ||||
|  | ||||
|         listOf( | ||||
|             NotificationChannel( | ||||
|                 CHANNEL_COMMON, context.getString(R.string.channel_common), | ||||
|                 CHANNEL_COMMON, | ||||
|                 context.getString(R.string.channel_common), | ||||
|                 NotificationManager.IMPORTANCE_LOW | ||||
|             ), | ||||
|             NotificationChannel( | ||||
|                 CHANNEL_LIBRARY, context.getString(R.string.channel_library), | ||||
|                 CHANNEL_LIBRARY, | ||||
|                 context.getString(R.string.channel_library), | ||||
|                 NotificationManager.IMPORTANCE_LOW | ||||
|             ).apply { | ||||
|                 setShowBadge(false) | ||||
|             }, | ||||
|             NotificationChannel( | ||||
|                 CHANNEL_DOWNLOADER_PROGRESS, context.getString(R.string.channel_progress), | ||||
|                 CHANNEL_DOWNLOADER_PROGRESS, | ||||
|                 context.getString(R.string.channel_progress), | ||||
|                 NotificationManager.IMPORTANCE_LOW | ||||
|             ).apply { | ||||
|                 group = GROUP_DOWNLOADER | ||||
|                 setShowBadge(false) | ||||
|             }, | ||||
|             NotificationChannel( | ||||
|                 CHANNEL_DOWNLOADER_COMPLETE, context.getString(R.string.channel_complete), | ||||
|                 CHANNEL_DOWNLOADER_COMPLETE, | ||||
|                 context.getString(R.string.channel_complete), | ||||
|                 NotificationManager.IMPORTANCE_LOW | ||||
|             ).apply { | ||||
|                 group = GROUP_DOWNLOADER | ||||
|                 setShowBadge(false) | ||||
|             }, | ||||
|             NotificationChannel( | ||||
|                 CHANNEL_DOWNLOADER_ERROR, context.getString(R.string.channel_errors), | ||||
|                 CHANNEL_DOWNLOADER_ERROR, | ||||
|                 context.getString(R.string.channel_errors), | ||||
|                 NotificationManager.IMPORTANCE_LOW | ||||
|             ).apply { | ||||
|                 group = GROUP_DOWNLOADER | ||||
|                 setShowBadge(false) | ||||
|             }, | ||||
|             NotificationChannel( | ||||
|                 CHANNEL_NEW_CHAPTERS, context.getString(R.string.channel_new_chapters), | ||||
|                 CHANNEL_NEW_CHAPTERS, | ||||
|                 context.getString(R.string.channel_new_chapters), | ||||
|                 NotificationManager.IMPORTANCE_DEFAULT | ||||
|             ), | ||||
|             NotificationChannel( | ||||
|                 CHANNEL_UPDATES_TO_EXTS, context.getString(R.string.channel_ext_updates), | ||||
|                 CHANNEL_UPDATES_TO_EXTS, | ||||
|                 context.getString(R.string.channel_ext_updates), | ||||
|                 NotificationManager.IMPORTANCE_DEFAULT | ||||
|             ), | ||||
|             NotificationChannel( | ||||
|                 CHANNEL_BACKUP_RESTORE_PROGRESS, context.getString(R.string.channel_progress), | ||||
|                 CHANNEL_BACKUP_RESTORE_PROGRESS, | ||||
|                 context.getString(R.string.channel_progress), | ||||
|                 NotificationManager.IMPORTANCE_LOW | ||||
|             ).apply { | ||||
|                 group = GROUP_BACKUP_RESTORE | ||||
|                 setShowBadge(false) | ||||
|             }, | ||||
|             NotificationChannel( | ||||
|                 CHANNEL_BACKUP_RESTORE_COMPLETE, context.getString(R.string.channel_complete), | ||||
|                 CHANNEL_BACKUP_RESTORE_COMPLETE, | ||||
|                 context.getString(R.string.channel_complete), | ||||
|                 NotificationManager.IMPORTANCE_HIGH | ||||
|             ).apply { | ||||
|                 group = GROUP_BACKUP_RESTORE | ||||
|   | ||||
| @@ -7,19 +7,19 @@ import androidx.preference.PreferenceManager | ||||
| import com.tfcporciuncula.flow.FlowSharedPreferences | ||||
| import com.tfcporciuncula.flow.Preference | ||||
| import eu.kanade.tachiyomi.R | ||||
| import eu.kanade.tachiyomi.data.preference.PreferenceKeys as Keys | ||||
| import eu.kanade.tachiyomi.data.preference.PreferenceValues as Values | ||||
| import eu.kanade.tachiyomi.data.preference.PreferenceValues.DisplayMode | ||||
| import eu.kanade.tachiyomi.data.preference.PreferenceValues.NsfwAllowance | ||||
| import eu.kanade.tachiyomi.data.track.TrackService | ||||
| import eu.kanade.tachiyomi.data.track.anilist.Anilist | ||||
| import kotlinx.coroutines.ExperimentalCoroutinesApi | ||||
| import kotlinx.coroutines.flow.Flow | ||||
| import kotlinx.coroutines.flow.onEach | ||||
| import java.io.File | ||||
| import java.text.DateFormat | ||||
| import java.text.SimpleDateFormat | ||||
| import java.util.Locale | ||||
| import kotlinx.coroutines.ExperimentalCoroutinesApi | ||||
| import kotlinx.coroutines.flow.Flow | ||||
| import kotlinx.coroutines.flow.onEach | ||||
| import eu.kanade.tachiyomi.data.preference.PreferenceKeys as Keys | ||||
| import eu.kanade.tachiyomi.data.preference.PreferenceValues as Values | ||||
|  | ||||
| @OptIn(ExperimentalCoroutinesApi::class) | ||||
| fun <T> Preference<T>.asImmediateFlow(block: (value: T) -> Unit): Flow<T> { | ||||
|   | ||||
| @@ -13,12 +13,12 @@ import com.google.gson.JsonParser | ||||
| import eu.kanade.tachiyomi.data.database.models.Track | ||||
| import eu.kanade.tachiyomi.data.track.model.TrackSearch | ||||
| import eu.kanade.tachiyomi.network.asObservableSuccess | ||||
| import java.util.Calendar | ||||
| import okhttp3.MediaType.Companion.toMediaTypeOrNull | ||||
| import okhttp3.OkHttpClient | ||||
| import okhttp3.Request | ||||
| import okhttp3.RequestBody.Companion.toRequestBody | ||||
| import rx.Observable | ||||
| import java.util.Calendar | ||||
|  | ||||
| class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { | ||||
|  | ||||
| @@ -271,9 +271,14 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { | ||||
|         } | ||||
|  | ||||
|         return ALManga( | ||||
|             struct["id"].asInt, struct["title"]["romaji"].asString, struct["coverImage"]["large"].asString, | ||||
|             struct["description"].nullString.orEmpty(), struct["type"].asString, struct["status"].nullString.orEmpty(), | ||||
|             date, struct["chapters"].nullInt ?: 0 | ||||
|             struct["id"].asInt, | ||||
|             struct["title"]["romaji"].asString, | ||||
|             struct["coverImage"]["large"].asString, | ||||
|             struct["description"].nullString.orEmpty(), | ||||
|             struct["type"].asString, | ||||
|             struct["status"].nullString.orEmpty(), | ||||
|             date, | ||||
|             struct["chapters"].nullInt ?: 0 | ||||
|         ) | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -4,9 +4,9 @@ import eu.kanade.tachiyomi.data.database.models.Track | ||||
| import eu.kanade.tachiyomi.data.preference.PreferencesHelper | ||||
| import eu.kanade.tachiyomi.data.track.TrackManager | ||||
| import eu.kanade.tachiyomi.data.track.model.TrackSearch | ||||
| import uy.kohesive.injekt.injectLazy | ||||
| import java.text.SimpleDateFormat | ||||
| import java.util.Locale | ||||
| import uy.kohesive.injekt.injectLazy | ||||
|  | ||||
| data class ALManga( | ||||
|     val media_id: Int, | ||||
|   | ||||
| @@ -12,13 +12,13 @@ import eu.kanade.tachiyomi.data.track.TrackManager | ||||
| import eu.kanade.tachiyomi.data.track.model.TrackSearch | ||||
| import eu.kanade.tachiyomi.network.POST | ||||
| import eu.kanade.tachiyomi.network.asObservableSuccess | ||||
| import java.net.URLEncoder | ||||
| import okhttp3.CacheControl | ||||
| import okhttp3.FormBody | ||||
| import okhttp3.OkHttpClient | ||||
| import okhttp3.Request | ||||
| import rx.Observable | ||||
| import uy.kohesive.injekt.injectLazy | ||||
| import java.net.URLEncoder | ||||
|  | ||||
| class BangumiApi(private val client: OkHttpClient, interceptor: BangumiInterceptor) { | ||||
|  | ||||
|   | ||||
| @@ -7,10 +7,10 @@ import eu.kanade.tachiyomi.R | ||||
| import eu.kanade.tachiyomi.data.database.models.Track | ||||
| import eu.kanade.tachiyomi.data.track.TrackService | ||||
| import eu.kanade.tachiyomi.data.track.model.TrackSearch | ||||
| import java.text.DecimalFormat | ||||
| import rx.Completable | ||||
| import rx.Observable | ||||
| import uy.kohesive.injekt.injectLazy | ||||
| import java.text.DecimalFormat | ||||
|  | ||||
| class Kitsu(private val context: Context, id: Int) : TrackService(id) { | ||||
|  | ||||
|   | ||||
| @@ -11,13 +11,6 @@ import eu.kanade.tachiyomi.network.asObservableSuccess | ||||
| import eu.kanade.tachiyomi.util.lang.toCalendar | ||||
| import eu.kanade.tachiyomi.util.selectInt | ||||
| import eu.kanade.tachiyomi.util.selectText | ||||
| import java.io.BufferedReader | ||||
| import java.io.InputStreamReader | ||||
| import java.text.SimpleDateFormat | ||||
| import java.util.Calendar | ||||
| import java.util.GregorianCalendar | ||||
| import java.util.Locale | ||||
| import java.util.zip.GZIPInputStream | ||||
| import okhttp3.FormBody | ||||
| import okhttp3.MediaType.Companion.toMediaTypeOrNull | ||||
| import okhttp3.OkHttpClient | ||||
| @@ -30,6 +23,13 @@ import org.jsoup.nodes.Document | ||||
| import org.jsoup.nodes.Element | ||||
| import org.jsoup.parser.Parser | ||||
| import rx.Observable | ||||
| import java.io.BufferedReader | ||||
| import java.io.InputStreamReader | ||||
| import java.text.SimpleDateFormat | ||||
| import java.util.Calendar | ||||
| import java.util.GregorianCalendar | ||||
| import java.util.Locale | ||||
| import java.util.zip.GZIPInputStream | ||||
|  | ||||
| class MyAnimeListApi(private val client: OkHttpClient, interceptor: MyAnimeListInterceptor) { | ||||
|  | ||||
|   | ||||
| @@ -15,8 +15,8 @@ import eu.kanade.tachiyomi.R | ||||
| import eu.kanade.tachiyomi.data.notification.Notifications | ||||
| import eu.kanade.tachiyomi.data.updater.github.GithubUpdateChecker | ||||
| import eu.kanade.tachiyomi.util.system.notificationManager | ||||
| import java.util.concurrent.TimeUnit | ||||
| import kotlinx.coroutines.runBlocking | ||||
| import java.util.concurrent.TimeUnit | ||||
|  | ||||
| class UpdaterJob(private val context: Context, workerParams: WorkerParameters) : | ||||
|     Worker(context, workerParams) { | ||||
| @@ -66,8 +66,10 @@ class UpdaterJob(private val context: Context, workerParams: WorkerParameters) : | ||||
|                 .build() | ||||
|  | ||||
|             val request = PeriodicWorkRequestBuilder<UpdaterJob>( | ||||
|                 3, TimeUnit.DAYS, | ||||
|                 3, TimeUnit.HOURS | ||||
|                 3, | ||||
|                 TimeUnit.DAYS, | ||||
|                 3, | ||||
|                 TimeUnit.HOURS | ||||
|             ) | ||||
|                 .addTag(TAG) | ||||
|                 .setConstraints(constraints) | ||||
|   | ||||
| @@ -20,9 +20,9 @@ import eu.kanade.tachiyomi.util.storage.getUriCompat | ||||
| import eu.kanade.tachiyomi.util.storage.saveTo | ||||
| import eu.kanade.tachiyomi.util.system.acquireWakeLock | ||||
| import eu.kanade.tachiyomi.util.system.isServiceRunning | ||||
| import java.io.File | ||||
| import timber.log.Timber | ||||
| import uy.kohesive.injekt.injectLazy | ||||
| import java.io.File | ||||
|  | ||||
| class UpdaterService : Service() { | ||||
|  | ||||
|   | ||||
| @@ -16,10 +16,10 @@ import eu.kanade.tachiyomi.data.notification.Notifications | ||||
| import eu.kanade.tachiyomi.data.preference.PreferencesHelper | ||||
| import eu.kanade.tachiyomi.extension.api.ExtensionGithubApi | ||||
| import eu.kanade.tachiyomi.util.system.notification | ||||
| import java.util.concurrent.TimeUnit | ||||
| import kotlinx.coroutines.coroutineScope | ||||
| import uy.kohesive.injekt.Injekt | ||||
| import uy.kohesive.injekt.api.get | ||||
| import java.util.concurrent.TimeUnit | ||||
|  | ||||
| class ExtensionUpdateJob(private val context: Context, workerParams: WorkerParameters) : | ||||
|     CoroutineWorker(context, workerParams) { | ||||
| @@ -73,8 +73,10 @@ class ExtensionUpdateJob(private val context: Context, workerParams: WorkerParam | ||||
|                     .build() | ||||
|  | ||||
|                 val request = PeriodicWorkRequestBuilder<ExtensionUpdateJob>( | ||||
|                     12, TimeUnit.HOURS, | ||||
|                     1, TimeUnit.HOURS | ||||
|                     12, | ||||
|                     TimeUnit.HOURS, | ||||
|                     1, | ||||
|                     TimeUnit.HOURS | ||||
|                 ) | ||||
|                     .addTag(TAG) | ||||
|                     .setConstraints(constraints) | ||||
|   | ||||
| @@ -9,10 +9,10 @@ import eu.kanade.tachiyomi.data.preference.PreferencesHelper | ||||
| import eu.kanade.tachiyomi.extension.model.Extension | ||||
| import eu.kanade.tachiyomi.extension.model.LoadResult | ||||
| import eu.kanade.tachiyomi.extension.util.ExtensionLoader | ||||
| import java.util.Date | ||||
| import kotlinx.coroutines.Dispatchers | ||||
| import kotlinx.coroutines.withContext | ||||
| import uy.kohesive.injekt.injectLazy | ||||
| import java.util.Date | ||||
|  | ||||
| internal class ExtensionGithubApi { | ||||
|  | ||||
|   | ||||
| @@ -13,11 +13,11 @@ import com.jakewharton.rxrelay.PublishRelay | ||||
| import eu.kanade.tachiyomi.extension.model.Extension | ||||
| import eu.kanade.tachiyomi.extension.model.InstallStep | ||||
| import eu.kanade.tachiyomi.util.storage.getUriCompat | ||||
| import java.io.File | ||||
| import java.util.concurrent.TimeUnit | ||||
| import rx.Observable | ||||
| import rx.android.schedulers.AndroidSchedulers | ||||
| import timber.log.Timber | ||||
| import java.io.File | ||||
| import java.util.concurrent.TimeUnit | ||||
|  | ||||
| /** | ||||
|  * The installer which installs, updates and uninstalls the extensions. | ||||
|   | ||||
| @@ -178,7 +178,13 @@ internal object ExtensionLoader { | ||||
|         } | ||||
|  | ||||
|         val extension = Extension.Installed( | ||||
|             extName, pkgName, versionName, versionCode, lang, isNsfw, sources, | ||||
|             extName, | ||||
|             pkgName, | ||||
|             versionName, | ||||
|             versionCode, | ||||
|             lang, | ||||
|             isNsfw, | ||||
|             sources, | ||||
|             isUnofficial = signatureHash != officialSignature | ||||
|         ) | ||||
|         return LoadResult.Success(extension) | ||||
|   | ||||
| @@ -16,15 +16,15 @@ import eu.kanade.tachiyomi.util.system.WebViewUtil | ||||
| import eu.kanade.tachiyomi.util.system.isOutdated | ||||
| import eu.kanade.tachiyomi.util.system.setDefaultSettings | ||||
| import eu.kanade.tachiyomi.util.system.toast | ||||
| import java.io.IOException | ||||
| import java.util.concurrent.CountDownLatch | ||||
| import java.util.concurrent.TimeUnit | ||||
| import okhttp3.Cookie | ||||
| import okhttp3.HttpUrl.Companion.toHttpUrl | ||||
| import okhttp3.Interceptor | ||||
| import okhttp3.Request | ||||
| import okhttp3.Response | ||||
| import uy.kohesive.injekt.injectLazy | ||||
| import java.io.IOException | ||||
| import java.util.concurrent.CountDownLatch | ||||
| import java.util.concurrent.TimeUnit | ||||
|  | ||||
| class CloudflareInterceptor(private val context: Context) : Interceptor { | ||||
|  | ||||
|   | ||||
| @@ -3,15 +3,15 @@ package eu.kanade.tachiyomi.network | ||||
| import android.content.Context | ||||
| import eu.kanade.tachiyomi.BuildConfig | ||||
| import eu.kanade.tachiyomi.data.preference.PreferencesHelper | ||||
| import java.io.File | ||||
| import java.net.InetAddress | ||||
| import java.util.concurrent.TimeUnit | ||||
| import okhttp3.Cache | ||||
| import okhttp3.HttpUrl.Companion.toHttpUrl | ||||
| import okhttp3.OkHttpClient | ||||
| import okhttp3.dnsoverhttps.DnsOverHttps | ||||
| import okhttp3.logging.HttpLoggingInterceptor | ||||
| import uy.kohesive.injekt.injectLazy | ||||
| import java.io.File | ||||
| import java.net.InetAddress | ||||
| import java.util.concurrent.TimeUnit | ||||
|  | ||||
| class NetworkHelper(context: Context) { | ||||
|  | ||||
|   | ||||
| @@ -1,9 +1,5 @@ | ||||
| package eu.kanade.tachiyomi.network | ||||
|  | ||||
| import java.io.IOException | ||||
| import java.util.concurrent.atomic.AtomicBoolean | ||||
| import kotlin.coroutines.resume | ||||
| import kotlin.coroutines.resumeWithException | ||||
| import kotlinx.coroutines.suspendCancellableCoroutine | ||||
| import okhttp3.Call | ||||
| import okhttp3.Callback | ||||
| @@ -13,6 +9,10 @@ import okhttp3.Response | ||||
| import rx.Observable | ||||
| import rx.Producer | ||||
| import rx.Subscription | ||||
| import java.io.IOException | ||||
| import java.util.concurrent.atomic.AtomicBoolean | ||||
| import kotlin.coroutines.resume | ||||
| import kotlin.coroutines.resumeWithException | ||||
|  | ||||
| fun Call.asObservable(): Observable<Response> { | ||||
|     return Observable.unsafeCreate { subscriber -> | ||||
| @@ -54,22 +54,24 @@ fun Call.asObservable(): Observable<Response> { | ||||
| // Based on https://github.com/gildor/kotlin-coroutines-okhttp | ||||
| suspend fun Call.await(assertSuccess: Boolean = false): Response { | ||||
|     return suspendCancellableCoroutine { continuation -> | ||||
|         enqueue(object : Callback { | ||||
|             override fun onResponse(call: Call, response: Response) { | ||||
|                 if (assertSuccess && !response.isSuccessful) { | ||||
|                     continuation.resumeWithException(Exception("HTTP error ${response.code}")) | ||||
|                     return | ||||
|         enqueue( | ||||
|             object : Callback { | ||||
|                 override fun onResponse(call: Call, response: Response) { | ||||
|                     if (assertSuccess && !response.isSuccessful) { | ||||
|                         continuation.resumeWithException(Exception("HTTP error ${response.code}")) | ||||
|                         return | ||||
|                     } | ||||
|  | ||||
|                     continuation.resume(response) | ||||
|                 } | ||||
|  | ||||
|                 continuation.resume(response) | ||||
|                 override fun onFailure(call: Call, e: IOException) { | ||||
|                     // Don't bother with resuming the continuation if it is already cancelled. | ||||
|                     if (continuation.isCancelled) return | ||||
|                     continuation.resumeWithException(e) | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             override fun onFailure(call: Call, e: IOException) { | ||||
|                 // Don't bother with resuming the continuation if it is already cancelled. | ||||
|                 if (continuation.isCancelled) return | ||||
|                 continuation.resumeWithException(e) | ||||
|             } | ||||
|         }) | ||||
|         ) | ||||
|  | ||||
|         continuation.invokeOnCancellation { | ||||
|             try { | ||||
|   | ||||
| @@ -1,6 +1,5 @@ | ||||
| package eu.kanade.tachiyomi.network | ||||
|  | ||||
| import java.io.IOException | ||||
| import okhttp3.MediaType | ||||
| import okhttp3.ResponseBody | ||||
| import okio.Buffer | ||||
| @@ -8,6 +7,7 @@ import okio.BufferedSource | ||||
| import okio.ForwardingSource | ||||
| import okio.Source | ||||
| import okio.buffer | ||||
| import java.io.IOException | ||||
|  | ||||
| class ProgressResponseBody(private val responseBody: ResponseBody, private val progressListener: ProgressListener) : ResponseBody() { | ||||
|  | ||||
|   | ||||
| @@ -1,11 +1,11 @@ | ||||
| package eu.kanade.tachiyomi.network | ||||
|  | ||||
| import java.util.concurrent.TimeUnit.MINUTES | ||||
| import okhttp3.CacheControl | ||||
| import okhttp3.FormBody | ||||
| import okhttp3.Headers | ||||
| import okhttp3.Request | ||||
| import okhttp3.RequestBody | ||||
| import java.util.concurrent.TimeUnit.MINUTES | ||||
|  | ||||
| private val DEFAULT_CACHE_CONTROL = CacheControl.Builder().maxAge(10, MINUTES).build() | ||||
| private val DEFAULT_HEADERS = Headers.Builder().build() | ||||
|   | ||||
| @@ -14,6 +14,10 @@ import eu.kanade.tachiyomi.util.lang.compareToCaseInsensitiveNaturalOrder | ||||
| import eu.kanade.tachiyomi.util.storage.DiskUtil | ||||
| import eu.kanade.tachiyomi.util.storage.EpubFile | ||||
| import eu.kanade.tachiyomi.util.system.ImageUtil | ||||
| import junrar.Archive | ||||
| import junrar.rarfile.FileHeader | ||||
| import rx.Observable | ||||
| import timber.log.Timber | ||||
| import java.io.File | ||||
| import java.io.FileInputStream | ||||
| import java.io.InputStream | ||||
| @@ -21,10 +25,6 @@ import java.util.Locale | ||||
| import java.util.concurrent.TimeUnit | ||||
| import java.util.zip.ZipEntry | ||||
| import java.util.zip.ZipFile | ||||
| import junrar.Archive | ||||
| import junrar.rarfile.FileHeader | ||||
| import rx.Observable | ||||
| import timber.log.Timber | ||||
|  | ||||
| class LocalSource(private val context: Context) : CatalogueSource { | ||||
|     companion object { | ||||
|   | ||||
| @@ -10,15 +10,15 @@ import eu.kanade.tachiyomi.source.model.MangasPage | ||||
| import eu.kanade.tachiyomi.source.model.Page | ||||
| import eu.kanade.tachiyomi.source.model.SChapter | ||||
| import eu.kanade.tachiyomi.source.model.SManga | ||||
| import java.net.URI | ||||
| import java.net.URISyntaxException | ||||
| import java.security.MessageDigest | ||||
| import okhttp3.Headers | ||||
| import okhttp3.OkHttpClient | ||||
| import okhttp3.Request | ||||
| import okhttp3.Response | ||||
| import rx.Observable | ||||
| import uy.kohesive.injekt.injectLazy | ||||
| import java.net.URI | ||||
| import java.net.URISyntaxException | ||||
| import java.security.MessageDigest | ||||
|  | ||||
| /** | ||||
|  * A simple implementation for sources from a website. | ||||
|   | ||||
| @@ -7,11 +7,11 @@ import androidx.appcompat.app.AppCompatActivity | ||||
| import androidx.lifecycle.lifecycleScope | ||||
| import androidx.viewbinding.ViewBinding | ||||
| import eu.kanade.tachiyomi.R | ||||
| import eu.kanade.tachiyomi.data.preference.PreferenceValues as Values | ||||
| import eu.kanade.tachiyomi.data.preference.PreferencesHelper | ||||
| import eu.kanade.tachiyomi.ui.security.SecureActivityDelegate | ||||
| import eu.kanade.tachiyomi.util.system.LocaleHelper | ||||
| import uy.kohesive.injekt.injectLazy | ||||
| import eu.kanade.tachiyomi.data.preference.PreferenceValues as Values | ||||
|  | ||||
| abstract class BaseActivity<VB : ViewBinding> : AppCompatActivity() { | ||||
|  | ||||
|   | ||||
| @@ -22,27 +22,29 @@ abstract class BaseController<VB : ViewBinding>(bundle: Bundle? = null) : | ||||
|     lateinit var binding: VB | ||||
|  | ||||
|     init { | ||||
|         addLifecycleListener(object : LifecycleListener() { | ||||
|             override fun postCreateView(controller: Controller, view: View) { | ||||
|                 onViewCreated(view) | ||||
|             } | ||||
|         addLifecycleListener( | ||||
|             object : LifecycleListener() { | ||||
|                 override fun postCreateView(controller: Controller, view: View) { | ||||
|                     onViewCreated(view) | ||||
|                 } | ||||
|  | ||||
|             override fun preCreateView(controller: Controller) { | ||||
|                 Timber.d("Create view for ${controller.instance()}") | ||||
|             } | ||||
|                 override fun preCreateView(controller: Controller) { | ||||
|                     Timber.d("Create view for ${controller.instance()}") | ||||
|                 } | ||||
|  | ||||
|             override fun preAttach(controller: Controller, view: View) { | ||||
|                 Timber.d("Attach view for ${controller.instance()}") | ||||
|             } | ||||
|                 override fun preAttach(controller: Controller, view: View) { | ||||
|                     Timber.d("Attach view for ${controller.instance()}") | ||||
|                 } | ||||
|  | ||||
|             override fun preDetach(controller: Controller, view: View) { | ||||
|                 Timber.d("Detach view for ${controller.instance()}") | ||||
|             } | ||||
|                 override fun preDetach(controller: Controller, view: View) { | ||||
|                     Timber.d("Detach view for ${controller.instance()}") | ||||
|                 } | ||||
|  | ||||
|             override fun preDestroyView(controller: Controller, view: View) { | ||||
|                 Timber.d("Destroy view for ${controller.instance()}") | ||||
|                 override fun preDestroyView(controller: Controller, view: View) { | ||||
|                     Timber.d("Destroy view for ${controller.instance()}") | ||||
|                 } | ||||
|             } | ||||
|         }) | ||||
|         ) | ||||
|     } | ||||
|  | ||||
|     override val containerView: View? | ||||
| @@ -98,17 +100,19 @@ abstract class BaseController<VB : ViewBinding>(bundle: Bundle? = null) : | ||||
|     var expandActionViewFromInteraction = false | ||||
|  | ||||
|     fun MenuItem.fixExpand(onExpand: ((MenuItem) -> Boolean)? = null, onCollapse: ((MenuItem) -> Boolean)? = null) { | ||||
|         setOnActionExpandListener(object : MenuItem.OnActionExpandListener { | ||||
|             override fun onMenuItemActionExpand(item: MenuItem): Boolean { | ||||
|                 return onExpand?.invoke(item) ?: true | ||||
|             } | ||||
|         setOnActionExpandListener( | ||||
|             object : MenuItem.OnActionExpandListener { | ||||
|                 override fun onMenuItemActionExpand(item: MenuItem): Boolean { | ||||
|                     return onExpand?.invoke(item) ?: true | ||||
|                 } | ||||
|  | ||||
|             override fun onMenuItemActionCollapse(item: MenuItem): Boolean { | ||||
|                 activity?.invalidateOptionsMenu() | ||||
|                 override fun onMenuItemActionCollapse(item: MenuItem): Boolean { | ||||
|                     activity?.invalidateOptionsMenu() | ||||
|  | ||||
|                 return onCollapse?.invoke(item) ?: true | ||||
|                     return onCollapse?.invoke(item) ?: true | ||||
|                 } | ||||
|             } | ||||
|         }) | ||||
|         ) | ||||
|  | ||||
|         if (expandActionViewFromInteraction) { | ||||
|             expandActionViewFromInteraction = false | ||||
|   | ||||
| @@ -10,12 +10,12 @@ import eu.kanade.tachiyomi.extension.model.Extension | ||||
| import eu.kanade.tachiyomi.extension.model.InstallStep | ||||
| import eu.kanade.tachiyomi.ui.base.presenter.BasePresenter | ||||
| import eu.kanade.tachiyomi.util.system.LocaleHelper | ||||
| import java.util.concurrent.TimeUnit | ||||
| import rx.Observable | ||||
| import rx.Subscription | ||||
| import rx.android.schedulers.AndroidSchedulers | ||||
| import uy.kohesive.injekt.Injekt | ||||
| import uy.kohesive.injekt.api.get | ||||
| import java.util.concurrent.TimeUnit | ||||
|  | ||||
| private typealias ExtensionTuple = | ||||
|     Triple<List<Extension.Installed>, List<Extension.Untrusted>, List<Extension.Available>> | ||||
|   | ||||
| @@ -13,10 +13,10 @@ import eu.kanade.tachiyomi.ui.browse.source.globalsearch.GlobalSearchCardItem | ||||
| import eu.kanade.tachiyomi.ui.browse.source.globalsearch.GlobalSearchItem | ||||
| import eu.kanade.tachiyomi.ui.browse.source.globalsearch.GlobalSearchPresenter | ||||
| import eu.kanade.tachiyomi.util.chapter.syncChaptersWithSource | ||||
| import java.util.Date | ||||
| import rx.Observable | ||||
| import rx.android.schedulers.AndroidSchedulers | ||||
| import rx.schedulers.Schedulers | ||||
| import java.util.Date | ||||
|  | ||||
| class SearchPresenter( | ||||
|     initialQuery: String? = "", | ||||
|   | ||||
| @@ -16,9 +16,9 @@ import eu.kanade.tachiyomi.util.preference.onChange | ||||
| import eu.kanade.tachiyomi.util.preference.switchPreferenceCategory | ||||
| import eu.kanade.tachiyomi.util.preference.titleRes | ||||
| import eu.kanade.tachiyomi.util.system.LocaleHelper | ||||
| import java.util.TreeMap | ||||
| import uy.kohesive.injekt.Injekt | ||||
| import uy.kohesive.injekt.api.get | ||||
| import java.util.TreeMap | ||||
|  | ||||
| class SourceFilterController : SettingsController() { | ||||
|  | ||||
|   | ||||
| @@ -6,7 +6,6 @@ import eu.kanade.tachiyomi.source.CatalogueSource | ||||
| import eu.kanade.tachiyomi.source.LocalSource | ||||
| import eu.kanade.tachiyomi.source.SourceManager | ||||
| import eu.kanade.tachiyomi.ui.base.presenter.BasePresenter | ||||
| import java.util.TreeMap | ||||
| import kotlinx.coroutines.CoroutineScope | ||||
| import kotlinx.coroutines.Dispatchers | ||||
| import kotlinx.coroutines.Job | ||||
| @@ -21,6 +20,7 @@ import rx.Observable | ||||
| import rx.Subscription | ||||
| import uy.kohesive.injekt.Injekt | ||||
| import uy.kohesive.injekt.api.get | ||||
| import java.util.TreeMap | ||||
|  | ||||
| /** | ||||
|  * Presenter of [SourceController] | ||||
|   | ||||
| @@ -29,7 +29,6 @@ import eu.kanade.tachiyomi.ui.browse.source.filter.TextSectionItem | ||||
| import eu.kanade.tachiyomi.ui.browse.source.filter.TriStateItem | ||||
| import eu.kanade.tachiyomi.ui.browse.source.filter.TriStateSectionItem | ||||
| import eu.kanade.tachiyomi.util.removeCovers | ||||
| import java.util.Date | ||||
| import kotlinx.coroutines.flow.subscribe | ||||
| import rx.Observable | ||||
| import rx.Subscription | ||||
| @@ -39,6 +38,7 @@ import rx.subjects.PublishSubject | ||||
| import timber.log.Timber | ||||
| import uy.kohesive.injekt.Injekt | ||||
| import uy.kohesive.injekt.api.get | ||||
| import java.util.Date | ||||
|  | ||||
| /** | ||||
|  * Presenter of [BrowseSourceController]. | ||||
|   | ||||
| @@ -38,10 +38,13 @@ class SourceItem(val manga: Manga, private val displayMode: Preference<DisplayMo | ||||
|                 val coverHeight = parent.itemWidth / 3 * 4 | ||||
|                 view.apply { | ||||
|                     card.layoutParams = FrameLayout.LayoutParams( | ||||
|                         MATCH_PARENT, coverHeight | ||||
|                         MATCH_PARENT, | ||||
|                         coverHeight | ||||
|                     ) | ||||
|                     gradient.layoutParams = FrameLayout.LayoutParams( | ||||
|                         MATCH_PARENT, coverHeight / 2, Gravity.BOTTOM | ||||
|                         MATCH_PARENT, | ||||
|                         coverHeight / 2, | ||||
|                         Gravity.BOTTOM | ||||
|                     ) | ||||
|                 } | ||||
|                 SourceGridHolder(view, adapter) | ||||
| @@ -51,7 +54,8 @@ class SourceItem(val manga: Manga, private val displayMode: Preference<DisplayMo | ||||
|                 val coverHeight = parent.itemWidth / 3 * 4 | ||||
|                 view.apply { | ||||
|                     card.layoutParams = ConstraintLayout.LayoutParams( | ||||
|                         MATCH_PARENT, coverHeight | ||||
|                         MATCH_PARENT, | ||||
|                         coverHeight | ||||
|                     ) | ||||
|                 } | ||||
|                 SourceComfortableGridHolder(view, adapter) | ||||
|   | ||||
| @@ -30,7 +30,8 @@ open class SelectItem(val filter: Filter.Select<*>) : AbstractFlexibleItem<Selec | ||||
|         spinner.prompt = filter.name | ||||
|         spinner.adapter = ArrayAdapter<Any>( | ||||
|             holder.itemView.context, | ||||
|             android.R.layout.simple_spinner_item, filter.values | ||||
|             android.R.layout.simple_spinner_item, | ||||
|             filter.values | ||||
|         ).apply { | ||||
|             setDropDownViewResource(R.layout.common_spinner_item) | ||||
|         } | ||||
|   | ||||
| @@ -9,10 +9,10 @@ import eu.davidea.flexibleadapter.FlexibleAdapter | ||||
| import eu.davidea.flexibleadapter.items.AbstractFlexibleItem | ||||
| import eu.davidea.flexibleadapter.items.IFlexible | ||||
| import eu.davidea.viewholders.FlexibleViewHolder | ||||
| import eu.kanade.tachiyomi.R as TR | ||||
| import eu.kanade.tachiyomi.source.model.Filter | ||||
| import eu.kanade.tachiyomi.util.system.dpToPx | ||||
| import eu.kanade.tachiyomi.util.system.getResourceColor | ||||
| import eu.kanade.tachiyomi.R as TR | ||||
|  | ||||
| open class TriStateItem(val filter: Filter.TriState) : AbstractFlexibleItem<TriStateItem.Holder>() { | ||||
|  | ||||
|   | ||||
| @@ -108,17 +108,19 @@ open class GlobalSearchController( | ||||
|         val searchView = searchItem.actionView as SearchView | ||||
|         searchView.maxWidth = Int.MAX_VALUE | ||||
|  | ||||
|         searchItem.setOnActionExpandListener(object : MenuItem.OnActionExpandListener { | ||||
|             override fun onMenuItemActionExpand(item: MenuItem?): Boolean { | ||||
|                 searchView.onActionViewExpanded() // Required to show the query in the view | ||||
|                 searchView.setQuery(presenter.query, false) | ||||
|                 return true | ||||
|             } | ||||
|         searchItem.setOnActionExpandListener( | ||||
|             object : MenuItem.OnActionExpandListener { | ||||
|                 override fun onMenuItemActionExpand(item: MenuItem?): Boolean { | ||||
|                     searchView.onActionViewExpanded() // Required to show the query in the view | ||||
|                     searchView.setQuery(presenter.query, false) | ||||
|                     return true | ||||
|                 } | ||||
|  | ||||
|             override fun onMenuItemActionCollapse(item: MenuItem?): Boolean { | ||||
|                 return true | ||||
|                 override fun onMenuItemActionCollapse(item: MenuItem?): Boolean { | ||||
|                     return true | ||||
|                 } | ||||
|             } | ||||
|         }) | ||||
|         ) | ||||
|  | ||||
|         searchView.queryTextEvents() | ||||
|             .filterIsInstance<QueryTextEvent.QuerySubmitted>() | ||||
|   | ||||
| @@ -198,8 +198,11 @@ class CategoryController : | ||||
|             R.id.action_delete -> { | ||||
|                 undoHelper = UndoHelper(adapter, this) | ||||
|                 undoHelper?.start( | ||||
|                     adapter.selectedPositions, activity!!.root_coordinator, | ||||
|                     R.string.snack_categories_deleted, R.string.action_undo, 3000 | ||||
|                     adapter.selectedPositions, | ||||
|                     activity!!.root_coordinator, | ||||
|                     R.string.snack_categories_deleted, | ||||
|                     R.string.action_undo, | ||||
|                     3000 | ||||
|                 ) | ||||
|  | ||||
|                 mode.finish() | ||||
|   | ||||
| @@ -18,13 +18,13 @@ import eu.kanade.tachiyomi.source.model.Page | ||||
| import eu.kanade.tachiyomi.ui.base.controller.FabController | ||||
| import eu.kanade.tachiyomi.ui.base.controller.NucleusController | ||||
| import eu.kanade.tachiyomi.util.view.shrinkOnScroll | ||||
| import java.util.concurrent.TimeUnit | ||||
| import kotlinx.coroutines.flow.launchIn | ||||
| import kotlinx.coroutines.flow.onEach | ||||
| import reactivecircus.flowbinding.android.view.clicks | ||||
| import rx.Observable | ||||
| import rx.Subscription | ||||
| import rx.android.schedulers.AndroidSchedulers | ||||
| import java.util.concurrent.TimeUnit | ||||
|  | ||||
| /** | ||||
|  * Controller that shows the currently active downloads. | ||||
|   | ||||
| @@ -45,7 +45,9 @@ class LibraryItem(val manga: LibraryManga, private val libraryDisplayMode: Prefe | ||||
|                 view.apply { | ||||
|                     card.layoutParams = FrameLayout.LayoutParams(MATCH_PARENT, coverHeight) | ||||
|                     gradient.layoutParams = FrameLayout.LayoutParams( | ||||
|                         MATCH_PARENT, coverHeight / 2, Gravity.BOTTOM | ||||
|                         MATCH_PARENT, | ||||
|                         coverHeight / 2, | ||||
|                         Gravity.BOTTOM | ||||
|                     ) | ||||
|                 } | ||||
|                 LibraryCompactGridHolder(view, adapter) | ||||
| @@ -55,7 +57,8 @@ class LibraryItem(val manga: LibraryManga, private val libraryDisplayMode: Prefe | ||||
|                 val coverHeight = parent.itemWidth / 3 * 4 | ||||
|                 view.apply { | ||||
|                     card.layoutParams = ConstraintLayout.LayoutParams( | ||||
|                         MATCH_PARENT, coverHeight | ||||
|                         MATCH_PARENT, | ||||
|                         coverHeight | ||||
|                     ) | ||||
|                 } | ||||
|                 LibraryComfortableGridHolder(view, adapter) | ||||
|   | ||||
| @@ -19,14 +19,14 @@ import eu.kanade.tachiyomi.util.lang.combineLatest | ||||
| import eu.kanade.tachiyomi.util.lang.isNullOrUnsubscribed | ||||
| import eu.kanade.tachiyomi.util.lang.launchIO | ||||
| import eu.kanade.tachiyomi.util.removeCovers | ||||
| import java.util.Collections | ||||
| import java.util.Comparator | ||||
| import rx.Observable | ||||
| import rx.Subscription | ||||
| import rx.android.schedulers.AndroidSchedulers | ||||
| import rx.schedulers.Schedulers | ||||
| import uy.kohesive.injekt.Injekt | ||||
| import uy.kohesive.injekt.api.get | ||||
| import java.util.Collections | ||||
| import java.util.Comparator | ||||
|  | ||||
| /** | ||||
|  * Class containing library information. | ||||
|   | ||||
| @@ -44,13 +44,13 @@ import eu.kanade.tachiyomi.ui.recent.updates.UpdatesController | ||||
| import eu.kanade.tachiyomi.util.lang.launchIO | ||||
| import eu.kanade.tachiyomi.util.lang.launchUI | ||||
| import eu.kanade.tachiyomi.util.system.toast | ||||
| import java.util.Date | ||||
| import java.util.concurrent.TimeUnit | ||||
| import kotlinx.android.synthetic.main.main_activity.appbar | ||||
| import kotlinx.android.synthetic.main.main_activity.tabs | ||||
| import kotlinx.coroutines.delay | ||||
| import kotlinx.coroutines.flow.launchIn | ||||
| import timber.log.Timber | ||||
| import java.util.Date | ||||
| import java.util.concurrent.TimeUnit | ||||
|  | ||||
| class MainActivity : BaseActivity<MainActivityBinding>() { | ||||
|  | ||||
| @@ -126,26 +126,28 @@ class MainActivity : BaseActivity<MainActivityBinding>() { | ||||
|             onBackPressed() | ||||
|         } | ||||
|  | ||||
|         router.addChangeListener(object : ControllerChangeHandler.ControllerChangeListener { | ||||
|             override fun onChangeStarted( | ||||
|                 to: Controller?, | ||||
|                 from: Controller?, | ||||
|                 isPush: Boolean, | ||||
|                 container: ViewGroup, | ||||
|                 handler: ControllerChangeHandler | ||||
|             ) { | ||||
|                 syncActivityViewWithController(to, from) | ||||
|             } | ||||
|         router.addChangeListener( | ||||
|             object : ControllerChangeHandler.ControllerChangeListener { | ||||
|                 override fun onChangeStarted( | ||||
|                     to: Controller?, | ||||
|                     from: Controller?, | ||||
|                     isPush: Boolean, | ||||
|                     container: ViewGroup, | ||||
|                     handler: ControllerChangeHandler | ||||
|                 ) { | ||||
|                     syncActivityViewWithController(to, from) | ||||
|                 } | ||||
|  | ||||
|             override fun onChangeCompleted( | ||||
|                 to: Controller?, | ||||
|                 from: Controller?, | ||||
|                 isPush: Boolean, | ||||
|                 container: ViewGroup, | ||||
|                 handler: ControllerChangeHandler | ||||
|             ) { | ||||
|                 override fun onChangeCompleted( | ||||
|                     to: Controller?, | ||||
|                     from: Controller?, | ||||
|                     isPush: Boolean, | ||||
|                     container: ViewGroup, | ||||
|                     handler: ControllerChangeHandler | ||||
|                 ) { | ||||
|                 } | ||||
|             } | ||||
|         }) | ||||
|         ) | ||||
|  | ||||
|         syncActivityViewWithController(router.backstack.lastOrNull()?.controller()) | ||||
|  | ||||
|   | ||||
| @@ -71,7 +71,6 @@ import eu.kanade.tachiyomi.util.system.toast | ||||
| import eu.kanade.tachiyomi.util.view.getCoordinates | ||||
| import eu.kanade.tachiyomi.util.view.shrinkOnScroll | ||||
| import eu.kanade.tachiyomi.util.view.snack | ||||
| import kotlin.math.min | ||||
| import kotlinx.android.synthetic.main.main_activity.root_coordinator | ||||
| import kotlinx.android.synthetic.main.main_activity.toolbar | ||||
| import kotlinx.coroutines.flow.launchIn | ||||
| @@ -83,6 +82,7 @@ import timber.log.Timber | ||||
| import uy.kohesive.injekt.Injekt | ||||
| import uy.kohesive.injekt.api.get | ||||
| import uy.kohesive.injekt.injectLazy | ||||
| import kotlin.math.min | ||||
|  | ||||
| class MangaController : | ||||
|     NucleusController<MangaControllerBinding, MangaPresenter>, | ||||
| @@ -291,10 +291,10 @@ class MangaController : | ||||
|                     // Get coordinates and start animation | ||||
|                     actionFab?.getCoordinates()?.let { coordinates -> | ||||
|                         if (!binding.revealView.showRevealEffect( | ||||
|                             coordinates.x, | ||||
|                             coordinates.y, | ||||
|                             revealAnimationListener | ||||
|                         ) | ||||
|                                 coordinates.x, | ||||
|                                 coordinates.y, | ||||
|                                 revealAnimationListener | ||||
|                             ) | ||||
|                         ) { | ||||
|                             openChapter(item.chapter) | ||||
|                         } | ||||
|   | ||||
| @@ -26,7 +26,6 @@ import eu.kanade.tachiyomi.util.prepUpdateCover | ||||
| import eu.kanade.tachiyomi.util.removeCovers | ||||
| import eu.kanade.tachiyomi.util.shouldDownloadNewChapters | ||||
| import eu.kanade.tachiyomi.util.updateCoverLastModified | ||||
| import java.util.Date | ||||
| import rx.Observable | ||||
| import rx.Subscription | ||||
| import rx.android.schedulers.AndroidSchedulers | ||||
| @@ -34,6 +33,7 @@ import rx.schedulers.Schedulers | ||||
| import timber.log.Timber | ||||
| import uy.kohesive.injekt.Injekt | ||||
| import uy.kohesive.injekt.api.get | ||||
| import java.util.Date | ||||
|  | ||||
| class MangaPresenter( | ||||
|     val manga: Manga, | ||||
|   | ||||
| @@ -9,11 +9,11 @@ import eu.kanade.tachiyomi.R | ||||
| import eu.kanade.tachiyomi.data.database.models.Manga | ||||
| import eu.kanade.tachiyomi.data.download.model.Download | ||||
| import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder | ||||
| import java.util.Date | ||||
| import kotlinx.android.synthetic.main.chapters_item.bookmark_icon | ||||
| import kotlinx.android.synthetic.main.chapters_item.chapter_description | ||||
| import kotlinx.android.synthetic.main.chapters_item.chapter_title | ||||
| import kotlinx.android.synthetic.main.chapters_item.download_text | ||||
| import java.util.Date | ||||
|  | ||||
| class ChapterHolder( | ||||
|     view: View, | ||||
|   | ||||
| @@ -6,10 +6,10 @@ import eu.kanade.tachiyomi.R | ||||
| import eu.kanade.tachiyomi.data.preference.PreferencesHelper | ||||
| import eu.kanade.tachiyomi.ui.manga.MangaController | ||||
| import eu.kanade.tachiyomi.util.system.getResourceColor | ||||
| import uy.kohesive.injekt.injectLazy | ||||
| import java.text.DateFormat | ||||
| import java.text.DecimalFormat | ||||
| import java.text.DecimalFormatSymbols | ||||
| import uy.kohesive.injekt.injectLazy | ||||
|  | ||||
| class ChaptersAdapter( | ||||
|     controller: MangaController, | ||||
|   | ||||
| @@ -9,9 +9,9 @@ import eu.kanade.tachiyomi.R | ||||
| import eu.kanade.tachiyomi.data.database.models.Track | ||||
| import eu.kanade.tachiyomi.data.track.TrackManager | ||||
| import eu.kanade.tachiyomi.ui.base.controller.DialogController | ||||
| import java.util.Calendar | ||||
| import uy.kohesive.injekt.Injekt | ||||
| import uy.kohesive.injekt.api.get | ||||
| import java.util.Calendar | ||||
|  | ||||
| class SetTrackReadingDatesDialog<T> : DialogController | ||||
|         where T : Controller, T : SetTrackReadingDatesDialog.Listener { | ||||
|   | ||||
| @@ -5,8 +5,8 @@ import androidx.core.view.isVisible | ||||
| import eu.kanade.tachiyomi.data.preference.PreferencesHelper | ||||
| import eu.kanade.tachiyomi.databinding.TrackItemBinding | ||||
| import eu.kanade.tachiyomi.ui.base.holder.BaseViewHolder | ||||
| import java.text.DateFormat | ||||
| import uy.kohesive.injekt.injectLazy | ||||
| import java.text.DateFormat | ||||
|  | ||||
| class TrackHolder(private val binding: TrackItemBinding, adapter: TrackAdapter) : BaseViewHolder(binding.root) { | ||||
|  | ||||
|   | ||||
| @@ -13,7 +13,6 @@ import eu.kanade.tachiyomi.data.track.TrackManager | ||||
| import eu.kanade.tachiyomi.data.track.TrackService | ||||
| import eu.kanade.tachiyomi.data.track.model.TrackSearch | ||||
| import eu.kanade.tachiyomi.ui.base.controller.DialogController | ||||
| import java.util.concurrent.TimeUnit | ||||
| import kotlinx.android.synthetic.main.track_search_dialog.view.progress | ||||
| import kotlinx.android.synthetic.main.track_search_dialog.view.track_search | ||||
| import kotlinx.android.synthetic.main.track_search_dialog.view.track_search_list | ||||
| @@ -26,6 +25,7 @@ import reactivecircus.flowbinding.android.widget.itemClicks | ||||
| import reactivecircus.flowbinding.android.widget.textChanges | ||||
| import uy.kohesive.injekt.Injekt | ||||
| import uy.kohesive.injekt.api.get | ||||
| import java.util.concurrent.TimeUnit | ||||
|  | ||||
| class TrackSearchDialog : DialogController { | ||||
|  | ||||
|   | ||||
| @@ -23,12 +23,12 @@ import eu.kanade.tachiyomi.util.preference.preferenceCategory | ||||
| import eu.kanade.tachiyomi.util.preference.titleRes | ||||
| import eu.kanade.tachiyomi.util.system.copyToClipboard | ||||
| import eu.kanade.tachiyomi.util.system.toast | ||||
| import timber.log.Timber | ||||
| import java.text.DateFormat | ||||
| import java.text.ParseException | ||||
| import java.text.SimpleDateFormat | ||||
| import java.util.Locale | ||||
| import java.util.TimeZone | ||||
| import timber.log.Timber | ||||
|  | ||||
| class AboutController : SettingsController() { | ||||
|  | ||||
| @@ -224,7 +224,9 @@ class AboutController : SettingsController() { | ||||
|             val buildTime = inputDf.parse(BuildConfig.BUILD_TIME) | ||||
|  | ||||
|             val outputDf = DateFormat.getDateTimeInstance( | ||||
|                 DateFormat.MEDIUM, DateFormat.SHORT, Locale.getDefault() | ||||
|                 DateFormat.MEDIUM, | ||||
|                 DateFormat.SHORT, | ||||
|                 Locale.getDefault() | ||||
|             ) | ||||
|             outputDf.timeZone = TimeZone.getDefault() | ||||
|  | ||||
|   | ||||
| @@ -7,7 +7,6 @@ import androidx.preference.PreferenceScreen | ||||
| import eu.kanade.tachiyomi.R | ||||
| import eu.kanade.tachiyomi.data.download.DownloadManager | ||||
| import eu.kanade.tachiyomi.data.download.DownloadService | ||||
| import eu.kanade.tachiyomi.data.preference.PreferenceKeys as Keys | ||||
| import eu.kanade.tachiyomi.ui.base.controller.NoToolbarElevationController | ||||
| import eu.kanade.tachiyomi.ui.base.controller.RootController | ||||
| import eu.kanade.tachiyomi.ui.base.controller.withFadeTransaction | ||||
| @@ -28,6 +27,7 @@ import eu.kanade.tachiyomi.util.system.getResourceColor | ||||
| import eu.kanade.tachiyomi.util.system.openInBrowser | ||||
| import rx.android.schedulers.AndroidSchedulers | ||||
| import uy.kohesive.injekt.injectLazy | ||||
| import eu.kanade.tachiyomi.data.preference.PreferenceKeys as Keys | ||||
|  | ||||
| class MoreController : | ||||
|     SettingsController(), | ||||
|   | ||||
| @@ -57,8 +57,6 @@ import eu.kanade.tachiyomi.util.view.showBar | ||||
| import eu.kanade.tachiyomi.util.view.snack | ||||
| import eu.kanade.tachiyomi.widget.SimpleAnimationListener | ||||
| import eu.kanade.tachiyomi.widget.SimpleSeekBarListener | ||||
| import java.io.File | ||||
| import kotlin.math.abs | ||||
| import kotlinx.coroutines.FlowPreview | ||||
| import kotlinx.coroutines.delay | ||||
| import kotlinx.coroutines.flow.drop | ||||
| @@ -68,6 +66,8 @@ import kotlinx.coroutines.flow.sample | ||||
| import nucleus.factory.RequiresPresenter | ||||
| import timber.log.Timber | ||||
| import uy.kohesive.injekt.injectLazy | ||||
| import java.io.File | ||||
| import kotlin.math.abs | ||||
|  | ||||
| /** | ||||
|  * Activity containing the reader of Tachiyomi. This activity is mostly a container of the | ||||
| @@ -303,13 +303,15 @@ class ReaderActivity : BaseRxActivity<ReaderActivityBinding, ReaderPresenter>() | ||||
|         } | ||||
|  | ||||
|         // Init listeners on bottom menu | ||||
|         binding.pageSeekbar.setOnSeekBarChangeListener(object : SimpleSeekBarListener() { | ||||
|             override fun onProgressChanged(seekBar: SeekBar, value: Int, fromUser: Boolean) { | ||||
|                 if (viewer != null && fromUser) { | ||||
|                     moveToPageIndex(value) | ||||
|         binding.pageSeekbar.setOnSeekBarChangeListener( | ||||
|             object : SimpleSeekBarListener() { | ||||
|                 override fun onProgressChanged(seekBar: SeekBar, value: Int, fromUser: Boolean) { | ||||
|                     if (viewer != null && fromUser) { | ||||
|                         moveToPageIndex(value) | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         }) | ||||
|         ) | ||||
|         binding.leftChapter.setOnClickListener { | ||||
|             if (viewer != null) { | ||||
|                 if (viewer is R2LPagerViewer) { | ||||
| @@ -349,12 +351,14 @@ class ReaderActivity : BaseRxActivity<ReaderActivityBinding, ReaderPresenter>() | ||||
|  | ||||
|             if (animate) { | ||||
|                 val toolbarAnimation = AnimationUtils.loadAnimation(this, R.anim.enter_from_top) | ||||
|                 toolbarAnimation.setAnimationListener(object : SimpleAnimationListener() { | ||||
|                     override fun onAnimationStart(animation: Animation) { | ||||
|                         // Fix status bar being translucent the first time it's opened. | ||||
|                         window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) | ||||
|                 toolbarAnimation.setAnimationListener( | ||||
|                     object : SimpleAnimationListener() { | ||||
|                         override fun onAnimationStart(animation: Animation) { | ||||
| // Fix status bar being translucent the first time it's opened. | ||||
|                             window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) | ||||
|                         } | ||||
|                     } | ||||
|                 }) | ||||
|                 ) | ||||
|                 binding.toolbar.startAnimation(toolbarAnimation) | ||||
|  | ||||
|                 val bottomAnimation = AnimationUtils.loadAnimation(this, R.anim.enter_from_bottom) | ||||
| @@ -373,11 +377,13 @@ class ReaderActivity : BaseRxActivity<ReaderActivityBinding, ReaderPresenter>() | ||||
|  | ||||
|             if (animate) { | ||||
|                 val toolbarAnimation = AnimationUtils.loadAnimation(this, R.anim.exit_to_top) | ||||
|                 toolbarAnimation.setAnimationListener(object : SimpleAnimationListener() { | ||||
|                     override fun onAnimationEnd(animation: Animation) { | ||||
|                         binding.readerMenu.isVisible = false | ||||
|                 toolbarAnimation.setAnimationListener( | ||||
|                     object : SimpleAnimationListener() { | ||||
|                         override fun onAnimationEnd(animation: Animation) { | ||||
|                             binding.readerMenu.isVisible = false | ||||
|                         } | ||||
|                     } | ||||
|                 }) | ||||
|                 ) | ||||
|                 binding.toolbar.startAnimation(toolbarAnimation) | ||||
|  | ||||
|                 val bottomAnimation = AnimationUtils.loadAnimation(this, R.anim.exit_to_bottom) | ||||
|   | ||||
| @@ -74,45 +74,55 @@ class ReaderColorFilterSheet(private val activity: ReaderActivity) : BottomSheet | ||||
|         } | ||||
|         binding.colorFilterMode.setSelection(preferences.colorFilterMode().get(), false) | ||||
|  | ||||
|         binding.seekbarColorFilterAlpha.setOnSeekBarChangeListener(object : SimpleSeekBarListener() { | ||||
|             override fun onProgressChanged(seekBar: SeekBar, value: Int, fromUser: Boolean) { | ||||
|                 if (fromUser) { | ||||
|                     setColorValue(value, ALPHA_MASK, 24) | ||||
|         binding.seekbarColorFilterAlpha.setOnSeekBarChangeListener( | ||||
|             object : SimpleSeekBarListener() { | ||||
|                 override fun onProgressChanged(seekBar: SeekBar, value: Int, fromUser: Boolean) { | ||||
|                     if (fromUser) { | ||||
|                         setColorValue(value, ALPHA_MASK, 24) | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         }) | ||||
|         ) | ||||
|  | ||||
|         binding.seekbarColorFilterRed.setOnSeekBarChangeListener(object : SimpleSeekBarListener() { | ||||
|             override fun onProgressChanged(seekBar: SeekBar, value: Int, fromUser: Boolean) { | ||||
|                 if (fromUser) { | ||||
|                     setColorValue(value, RED_MASK, 16) | ||||
|         binding.seekbarColorFilterRed.setOnSeekBarChangeListener( | ||||
|             object : SimpleSeekBarListener() { | ||||
|                 override fun onProgressChanged(seekBar: SeekBar, value: Int, fromUser: Boolean) { | ||||
|                     if (fromUser) { | ||||
|                         setColorValue(value, RED_MASK, 16) | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         }) | ||||
|         ) | ||||
|  | ||||
|         binding.seekbarColorFilterGreen.setOnSeekBarChangeListener(object : SimpleSeekBarListener() { | ||||
|             override fun onProgressChanged(seekBar: SeekBar, value: Int, fromUser: Boolean) { | ||||
|                 if (fromUser) { | ||||
|                     setColorValue(value, GREEN_MASK, 8) | ||||
|         binding.seekbarColorFilterGreen.setOnSeekBarChangeListener( | ||||
|             object : SimpleSeekBarListener() { | ||||
|                 override fun onProgressChanged(seekBar: SeekBar, value: Int, fromUser: Boolean) { | ||||
|                     if (fromUser) { | ||||
|                         setColorValue(value, GREEN_MASK, 8) | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         }) | ||||
|         ) | ||||
|  | ||||
|         binding.seekbarColorFilterBlue.setOnSeekBarChangeListener(object : SimpleSeekBarListener() { | ||||
|             override fun onProgressChanged(seekBar: SeekBar, value: Int, fromUser: Boolean) { | ||||
|                 if (fromUser) { | ||||
|                     setColorValue(value, BLUE_MASK, 0) | ||||
|         binding.seekbarColorFilterBlue.setOnSeekBarChangeListener( | ||||
|             object : SimpleSeekBarListener() { | ||||
|                 override fun onProgressChanged(seekBar: SeekBar, value: Int, fromUser: Boolean) { | ||||
|                     if (fromUser) { | ||||
|                         setColorValue(value, BLUE_MASK, 0) | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         }) | ||||
|         ) | ||||
|  | ||||
|         binding.brightnessSeekbar.setOnSeekBarChangeListener(object : SimpleSeekBarListener() { | ||||
|             override fun onProgressChanged(seekBar: SeekBar, value: Int, fromUser: Boolean) { | ||||
|                 if (fromUser) { | ||||
|                     preferences.customBrightnessValue().set(value) | ||||
|         binding.brightnessSeekbar.setOnSeekBarChangeListener( | ||||
|             object : SimpleSeekBarListener() { | ||||
|                 override fun onProgressChanged(seekBar: SeekBar, value: Int, fromUser: Boolean) { | ||||
|                     if (fromUser) { | ||||
|                         preferences.customBrightnessValue().set(value) | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         }) | ||||
|         ) | ||||
|     } | ||||
|  | ||||
|     override fun onStart() { | ||||
|   | ||||
| @@ -27,9 +27,6 @@ import eu.kanade.tachiyomi.util.lang.takeBytes | ||||
| import eu.kanade.tachiyomi.util.storage.DiskUtil | ||||
| import eu.kanade.tachiyomi.util.system.ImageUtil | ||||
| import eu.kanade.tachiyomi.util.updateCoverLastModified | ||||
| import java.io.File | ||||
| import java.util.Date | ||||
| import java.util.concurrent.TimeUnit | ||||
| import rx.Completable | ||||
| import rx.Observable | ||||
| import rx.Subscription | ||||
| @@ -38,6 +35,9 @@ import rx.schedulers.Schedulers | ||||
| import timber.log.Timber | ||||
| import uy.kohesive.injekt.Injekt | ||||
| import uy.kohesive.injekt.api.get | ||||
| import java.io.File | ||||
| import java.util.Date | ||||
| import java.util.concurrent.TimeUnit | ||||
|  | ||||
| /** | ||||
|  * Presenter used by the activity to perform background operations. | ||||
|   | ||||
| @@ -4,9 +4,9 @@ import eu.kanade.tachiyomi.source.model.Page | ||||
| import eu.kanade.tachiyomi.ui.reader.model.ReaderPage | ||||
| import eu.kanade.tachiyomi.util.lang.compareToCaseInsensitiveNaturalOrder | ||||
| import eu.kanade.tachiyomi.util.system.ImageUtil | ||||
| import rx.Observable | ||||
| import java.io.File | ||||
| import java.io.FileInputStream | ||||
| import rx.Observable | ||||
|  | ||||
| /** | ||||
|  * Loader used to load a chapter from a directory given on [file]. | ||||
|   | ||||
| @@ -3,8 +3,8 @@ package eu.kanade.tachiyomi.ui.reader.loader | ||||
| import eu.kanade.tachiyomi.source.model.Page | ||||
| import eu.kanade.tachiyomi.ui.reader.model.ReaderPage | ||||
| import eu.kanade.tachiyomi.util.storage.EpubFile | ||||
| import java.io.File | ||||
| import rx.Observable | ||||
| import java.io.File | ||||
|  | ||||
| /** | ||||
|  * Loader used to load a chapter from a .epub file. | ||||
|   | ||||
| @@ -6,9 +6,6 @@ import eu.kanade.tachiyomi.source.online.HttpSource | ||||
| import eu.kanade.tachiyomi.ui.reader.model.ReaderChapter | ||||
| import eu.kanade.tachiyomi.ui.reader.model.ReaderPage | ||||
| import eu.kanade.tachiyomi.util.lang.plusAssign | ||||
| import java.util.concurrent.PriorityBlockingQueue | ||||
| import java.util.concurrent.atomic.AtomicInteger | ||||
| import kotlin.math.min | ||||
| import rx.Completable | ||||
| import rx.Observable | ||||
| import rx.schedulers.Schedulers | ||||
| @@ -18,6 +15,9 @@ import rx.subscriptions.CompositeSubscription | ||||
| import timber.log.Timber | ||||
| import uy.kohesive.injekt.Injekt | ||||
| import uy.kohesive.injekt.api.get | ||||
| import java.util.concurrent.PriorityBlockingQueue | ||||
| import java.util.concurrent.atomic.AtomicInteger | ||||
| import kotlin.math.min | ||||
|  | ||||
| /** | ||||
|  * Loader used to load chapters from an online source. | ||||
|   | ||||
| @@ -4,14 +4,14 @@ import eu.kanade.tachiyomi.source.model.Page | ||||
| import eu.kanade.tachiyomi.ui.reader.model.ReaderPage | ||||
| import eu.kanade.tachiyomi.util.lang.compareToCaseInsensitiveNaturalOrder | ||||
| import eu.kanade.tachiyomi.util.system.ImageUtil | ||||
| import junrar.Archive | ||||
| import junrar.rarfile.FileHeader | ||||
| import rx.Observable | ||||
| import java.io.File | ||||
| import java.io.InputStream | ||||
| import java.io.PipedInputStream | ||||
| import java.io.PipedOutputStream | ||||
| import java.util.concurrent.Executors | ||||
| import junrar.Archive | ||||
| import junrar.rarfile.FileHeader | ||||
| import rx.Observable | ||||
|  | ||||
| /** | ||||
|  * Loader used to load a chapter from a .rar or .cbr file. | ||||
|   | ||||
| @@ -5,11 +5,11 @@ import eu.kanade.tachiyomi.source.model.Page | ||||
| import eu.kanade.tachiyomi.ui.reader.model.ReaderPage | ||||
| import eu.kanade.tachiyomi.util.lang.compareToCaseInsensitiveNaturalOrder | ||||
| import eu.kanade.tachiyomi.util.system.ImageUtil | ||||
| import rx.Observable | ||||
| import java.io.File | ||||
| import java.nio.charset.StandardCharsets | ||||
| import java.util.zip.ZipEntry | ||||
| import java.util.zip.ZipFile | ||||
| import rx.Observable | ||||
|  | ||||
| /** | ||||
|  * Loader used to load a chapter from a .zip or .cbz file. | ||||
|   | ||||
| @@ -63,9 +63,12 @@ class ReaderProgressBar @JvmOverloads constructor( | ||||
|      */ | ||||
|     private val rotationAnimation by lazy { | ||||
|         RotateAnimation( | ||||
|             0f, 360f, | ||||
|             Animation.RELATIVE_TO_SELF, 0.5f, | ||||
|             Animation.RELATIVE_TO_SELF, 0.5f | ||||
|             0f, | ||||
|             360f, | ||||
|             Animation.RELATIVE_TO_SELF, | ||||
|             0.5f, | ||||
|             Animation.RELATIVE_TO_SELF, | ||||
|             0.5f | ||||
|         ).apply { | ||||
|             interpolator = LinearInterpolator() | ||||
|             repeatCount = Animation.INFINITE | ||||
|   | ||||
| @@ -8,11 +8,11 @@ import androidx.core.text.buildSpannedString | ||||
| import androidx.core.view.isVisible | ||||
| import eu.kanade.tachiyomi.R | ||||
| import eu.kanade.tachiyomi.ui.reader.model.ChapterTransition | ||||
| import kotlin.math.floor | ||||
| import kotlinx.android.synthetic.main.reader_transition_view.view.lower_text | ||||
| import kotlinx.android.synthetic.main.reader_transition_view.view.upper_text | ||||
| import kotlinx.android.synthetic.main.reader_transition_view.view.warning | ||||
| import kotlinx.android.synthetic.main.reader_transition_view.view.warning_text | ||||
| import kotlin.math.floor | ||||
|  | ||||
| class ReaderTransitionView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) : | ||||
|     LinearLayout(context, attrs) { | ||||
|   | ||||
| @@ -35,12 +35,12 @@ import eu.kanade.tachiyomi.ui.webview.WebViewActivity | ||||
| import eu.kanade.tachiyomi.util.system.ImageUtil | ||||
| import eu.kanade.tachiyomi.util.system.dpToPx | ||||
| import eu.kanade.tachiyomi.widget.ViewPagerAdapter | ||||
| import java.io.InputStream | ||||
| import java.util.concurrent.TimeUnit | ||||
| import rx.Observable | ||||
| import rx.Subscription | ||||
| import rx.android.schedulers.AndroidSchedulers | ||||
| import rx.schedulers.Schedulers | ||||
| import java.io.InputStream | ||||
| import java.util.concurrent.TimeUnit | ||||
|  | ||||
| /** | ||||
|  * View of the ViewPager that contains a page of a chapter. | ||||
| @@ -307,20 +307,22 @@ class PagerPageHolder( | ||||
|             setMinimumDpi(90) | ||||
|             setMinimumTileDpi(180) | ||||
|             setCropBorders(config.imageCropBorders) | ||||
|             setOnImageEventListener(object : SubsamplingScaleImageView.DefaultOnImageEventListener() { | ||||
|                 override fun onReady() { | ||||
|                     when (config.imageZoomType) { | ||||
|                         ZoomType.Left -> setScaleAndCenter(scale, PointF(0f, 0f)) | ||||
|                         ZoomType.Right -> setScaleAndCenter(scale, PointF(sWidth.toFloat(), 0f)) | ||||
|                         ZoomType.Center -> setScaleAndCenter(scale, center.also { it?.y = 0f }) | ||||
|             setOnImageEventListener( | ||||
|                 object : SubsamplingScaleImageView.DefaultOnImageEventListener() { | ||||
|                     override fun onReady() { | ||||
|                         when (config.imageZoomType) { | ||||
|                             ZoomType.Left -> setScaleAndCenter(scale, PointF(0f, 0f)) | ||||
|                             ZoomType.Right -> setScaleAndCenter(scale, PointF(sWidth.toFloat(), 0f)) | ||||
|                             ZoomType.Center -> setScaleAndCenter(scale, center.also { it?.y = 0f }) | ||||
|                         } | ||||
|                         onImageDecoded() | ||||
|                     } | ||||
|                     onImageDecoded() | ||||
|                 } | ||||
|  | ||||
|                 override fun onImageLoadError(e: Exception) { | ||||
|                     onImageDecodeError() | ||||
|                     override fun onImageLoadError(e: Exception) { | ||||
|                         onImageDecodeError() | ||||
|                     } | ||||
|                 } | ||||
|             }) | ||||
|             ) | ||||
|         } | ||||
|         addView(subsamplingImageView) | ||||
|         return subsamplingImageView!! | ||||
| @@ -338,16 +340,18 @@ class PagerPageHolder( | ||||
|             setZoomTransitionDuration(viewer.config.doubleTapAnimDuration) | ||||
|             setScaleLevels(1f, 2f, 3f) | ||||
|             // Force 2 scale levels on double tap | ||||
|             setOnDoubleTapListener(object : GestureDetector.SimpleOnGestureListener() { | ||||
|                 override fun onDoubleTap(e: MotionEvent): Boolean { | ||||
|                     if (scale > 1f) { | ||||
|                         setScale(1f, e.x, e.y, true) | ||||
|                     } else { | ||||
|                         setScale(2f, e.x, e.y, true) | ||||
|             setOnDoubleTapListener( | ||||
|                 object : GestureDetector.SimpleOnGestureListener() { | ||||
|                     override fun onDoubleTap(e: MotionEvent): Boolean { | ||||
|                         if (scale > 1f) { | ||||
|                             setScale(1f, e.x, e.y, true) | ||||
|                         } else { | ||||
|                             setScale(2f, e.x, e.y, true) | ||||
|                         } | ||||
|                         return true | ||||
|                     } | ||||
|                     return true | ||||
|                 } | ||||
|             }) | ||||
|             ) | ||||
|         } | ||||
|         addView(imageView) | ||||
|         return imageView!! | ||||
| @@ -437,31 +441,33 @@ class PagerPageHolder( | ||||
|             .skipMemoryCache(true) | ||||
|             .diskCacheStrategy(DiskCacheStrategy.NONE) | ||||
|             .transition(DrawableTransitionOptions.with(NoTransition.getFactory())) | ||||
|             .listener(object : RequestListener<Drawable> { | ||||
|                 override fun onLoadFailed( | ||||
|                     e: GlideException?, | ||||
|                     model: Any?, | ||||
|                     target: Target<Drawable>?, | ||||
|                     isFirstResource: Boolean | ||||
|                 ): Boolean { | ||||
|                     onImageDecodeError() | ||||
|                     return false | ||||
|                 } | ||||
|  | ||||
|                 override fun onResourceReady( | ||||
|                     resource: Drawable?, | ||||
|                     model: Any?, | ||||
|                     target: Target<Drawable>?, | ||||
|                     dataSource: DataSource?, | ||||
|                     isFirstResource: Boolean | ||||
|                 ): Boolean { | ||||
|                     if (resource is GifDrawable) { | ||||
|                         resource.setLoopCount(GifDrawable.LOOP_INTRINSIC) | ||||
|             .listener( | ||||
|                 object : RequestListener<Drawable> { | ||||
|                     override fun onLoadFailed( | ||||
|                         e: GlideException?, | ||||
|                         model: Any?, | ||||
|                         target: Target<Drawable>?, | ||||
|                         isFirstResource: Boolean | ||||
|                     ): Boolean { | ||||
|                         onImageDecodeError() | ||||
|                         return false | ||||
|                     } | ||||
|  | ||||
|                     override fun onResourceReady( | ||||
|                         resource: Drawable?, | ||||
|                         model: Any?, | ||||
|                         target: Target<Drawable>?, | ||||
|                         dataSource: DataSource?, | ||||
|                         isFirstResource: Boolean | ||||
|                     ): Boolean { | ||||
|                         if (resource is GifDrawable) { | ||||
|                             resource.setLoopCount(GifDrawable.LOOP_INTRINSIC) | ||||
|                         } | ||||
|                         onImageDecoded() | ||||
|                         return false | ||||
|                     } | ||||
|                     onImageDecoded() | ||||
|                     return false | ||||
|                 } | ||||
|             }) | ||||
|             ) | ||||
|             .into(this) | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -71,15 +71,17 @@ abstract class PagerViewer(val activity: ReaderActivity) : BaseViewer { | ||||
|         pager.offscreenPageLimit = 1 | ||||
|         pager.id = R.id.reader_pager | ||||
|         pager.adapter = adapter | ||||
|         pager.addOnPageChangeListener(object : ViewPager.SimpleOnPageChangeListener() { | ||||
|             override fun onPageSelected(position: Int) { | ||||
|                 onPageChange(position) | ||||
|             } | ||||
|         pager.addOnPageChangeListener( | ||||
|             object : ViewPager.SimpleOnPageChangeListener() { | ||||
|                 override fun onPageSelected(position: Int) { | ||||
|                     onPageChange(position) | ||||
|                 } | ||||
|  | ||||
|             override fun onPageScrollStateChanged(state: Int) { | ||||
|                 isIdle = state == ViewPager.SCROLL_STATE_IDLE | ||||
|                 override fun onPageScrollStateChanged(state: Int) { | ||||
|                     isIdle = state == ViewPager.SCROLL_STATE_IDLE | ||||
|                 } | ||||
|             } | ||||
|         }) | ||||
|         ) | ||||
|         pager.tapListener = f@{ event -> | ||||
|             if (!config.tappingEnabled) { | ||||
|                 activity.toggleMenu() | ||||
|   | ||||
| @@ -32,12 +32,12 @@ import eu.kanade.tachiyomi.ui.reader.viewer.ReaderProgressBar | ||||
| import eu.kanade.tachiyomi.ui.webview.WebViewActivity | ||||
| import eu.kanade.tachiyomi.util.system.ImageUtil | ||||
| import eu.kanade.tachiyomi.util.system.dpToPx | ||||
| import java.io.InputStream | ||||
| import java.util.concurrent.TimeUnit | ||||
| import rx.Observable | ||||
| import rx.Subscription | ||||
| import rx.android.schedulers.AndroidSchedulers | ||||
| import rx.schedulers.Schedulers | ||||
| import java.io.InputStream | ||||
| import java.util.concurrent.TimeUnit | ||||
|  | ||||
| /** | ||||
|  * Holder of the webtoon reader for a single page of a chapter. | ||||
| @@ -362,15 +362,17 @@ class WebtoonPageHolder( | ||||
|             setMinimumDpi(90) | ||||
|             setMinimumTileDpi(180) | ||||
|             setCropBorders(config.imageCropBorders) | ||||
|             setOnImageEventListener(object : SubsamplingScaleImageView.DefaultOnImageEventListener() { | ||||
|                 override fun onReady() { | ||||
|                     onImageDecoded() | ||||
|                 } | ||||
|             setOnImageEventListener( | ||||
|                 object : SubsamplingScaleImageView.DefaultOnImageEventListener() { | ||||
|                     override fun onReady() { | ||||
|                         onImageDecoded() | ||||
|                     } | ||||
|  | ||||
|                 override fun onImageLoadError(e: Exception) { | ||||
|                     onImageDecodeError() | ||||
|                     override fun onImageLoadError(e: Exception) { | ||||
|                         onImageDecodeError() | ||||
|                     } | ||||
|                 } | ||||
|             }) | ||||
|             ) | ||||
|         } | ||||
|         frame.addView(subsamplingImageView, MATCH_PARENT, MATCH_PARENT) | ||||
|         return subsamplingImageView!! | ||||
| @@ -492,31 +494,33 @@ class WebtoonPageHolder( | ||||
|             .skipMemoryCache(true) | ||||
|             .diskCacheStrategy(DiskCacheStrategy.NONE) | ||||
|             .transition(DrawableTransitionOptions.with(NoTransition.getFactory())) | ||||
|             .listener(object : RequestListener<Drawable> { | ||||
|                 override fun onLoadFailed( | ||||
|                     e: GlideException?, | ||||
|                     model: Any?, | ||||
|                     target: Target<Drawable>?, | ||||
|                     isFirstResource: Boolean | ||||
|                 ): Boolean { | ||||
|                     onImageDecodeError() | ||||
|                     return false | ||||
|                 } | ||||
|  | ||||
|                 override fun onResourceReady( | ||||
|                     resource: Drawable?, | ||||
|                     model: Any?, | ||||
|                     target: Target<Drawable>?, | ||||
|                     dataSource: DataSource?, | ||||
|                     isFirstResource: Boolean | ||||
|                 ): Boolean { | ||||
|                     if (resource is GifDrawable) { | ||||
|                         resource.setLoopCount(GifDrawable.LOOP_INTRINSIC) | ||||
|             .listener( | ||||
|                 object : RequestListener<Drawable> { | ||||
|                     override fun onLoadFailed( | ||||
|                         e: GlideException?, | ||||
|                         model: Any?, | ||||
|                         target: Target<Drawable>?, | ||||
|                         isFirstResource: Boolean | ||||
|                     ): Boolean { | ||||
|                         onImageDecodeError() | ||||
|                         return false | ||||
|                     } | ||||
|  | ||||
|                     override fun onResourceReady( | ||||
|                         resource: Drawable?, | ||||
|                         model: Any?, | ||||
|                         target: Target<Drawable>?, | ||||
|                         dataSource: DataSource?, | ||||
|                         isFirstResource: Boolean | ||||
|                     ): Boolean { | ||||
|                         if (resource is GifDrawable) { | ||||
|                             resource.setLoopCount(GifDrawable.LOOP_INTRINSIC) | ||||
|                         } | ||||
|                         onImageDecoded() | ||||
|                         return false | ||||
|                     } | ||||
|                     onImageDecoded() | ||||
|                     return false | ||||
|                 } | ||||
|             }) | ||||
|             ) | ||||
|             .into(this) | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -15,10 +15,10 @@ import eu.kanade.tachiyomi.ui.reader.model.ChapterTransition | ||||
| import eu.kanade.tachiyomi.ui.reader.model.ReaderPage | ||||
| import eu.kanade.tachiyomi.ui.reader.model.ViewerChapters | ||||
| import eu.kanade.tachiyomi.ui.reader.viewer.BaseViewer | ||||
| import kotlin.math.max | ||||
| import kotlin.math.min | ||||
| import rx.subscriptions.CompositeSubscription | ||||
| import timber.log.Timber | ||||
| import kotlin.math.max | ||||
| import kotlin.math.min | ||||
|  | ||||
| /** | ||||
|  * Implementation of a [BaseViewer] to display pages with a [RecyclerView]. | ||||
| @@ -71,28 +71,30 @@ class WebtoonViewer(val activity: ReaderActivity, val isContinuous: Boolean = tr | ||||
|         recycler.itemAnimator = null | ||||
|         recycler.layoutManager = layoutManager | ||||
|         recycler.adapter = adapter | ||||
|         recycler.addOnScrollListener(object : RecyclerView.OnScrollListener() { | ||||
|             override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { | ||||
|                 val position = layoutManager.findLastEndVisibleItemPosition() | ||||
|                 val item = adapter.items.getOrNull(position) | ||||
|                 val allowPreload = checkAllowPreload(item as? ReaderPage) | ||||
|                 if (item != null && currentPage != item) { | ||||
|                     currentPage = item | ||||
|                     when (item) { | ||||
|                         is ReaderPage -> onPageSelected(item, allowPreload) | ||||
|                         is ChapterTransition -> onTransitionSelected(item) | ||||
|         recycler.addOnScrollListener( | ||||
|             object : RecyclerView.OnScrollListener() { | ||||
|                 override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { | ||||
|                     val position = layoutManager.findLastEndVisibleItemPosition() | ||||
|                     val item = adapter.items.getOrNull(position) | ||||
|                     val allowPreload = checkAllowPreload(item as? ReaderPage) | ||||
|                     if (item != null && currentPage != item) { | ||||
|                         currentPage = item | ||||
|                         when (item) { | ||||
|                             is ReaderPage -> onPageSelected(item, allowPreload) | ||||
|                             is ChapterTransition -> onTransitionSelected(item) | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|  | ||||
|                 if (dy < 0) { | ||||
|                     val firstIndex = layoutManager.findFirstVisibleItemPosition() | ||||
|                     val firstItem = adapter.items.getOrNull(firstIndex) | ||||
|                     if (firstItem is ChapterTransition.Prev && firstItem.to != null) { | ||||
|                         activity.requestPreloadChapter(firstItem.to) | ||||
|                     if (dy < 0) { | ||||
|                         val firstIndex = layoutManager.findFirstVisibleItemPosition() | ||||
|                         val firstItem = adapter.items.getOrNull(firstIndex) | ||||
|                         if (firstItem is ChapterTransition.Prev && firstItem.to != null) { | ||||
|                             activity.requestPreloadChapter(firstItem.to) | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         }) | ||||
|         ) | ||||
|         recycler.tapListener = f@{ event -> | ||||
|             if (!config.tappingEnabled) { | ||||
|                 activity.toggleMenu() | ||||
|   | ||||
| @@ -2,9 +2,9 @@ package eu.kanade.tachiyomi.ui.recent.history | ||||
|  | ||||
| import eu.davidea.flexibleadapter.FlexibleAdapter | ||||
| import eu.kanade.tachiyomi.source.SourceManager | ||||
| import uy.kohesive.injekt.injectLazy | ||||
| import java.text.DecimalFormat | ||||
| import java.text.DecimalFormatSymbols | ||||
| import uy.kohesive.injekt.injectLazy | ||||
|  | ||||
| /** | ||||
|  * Adapter of HistoryHolder. | ||||
|   | ||||
| @@ -8,13 +8,13 @@ import eu.kanade.tachiyomi.data.glide.GlideApp | ||||
| import eu.kanade.tachiyomi.data.glide.toMangaThumbnail | ||||
| import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder | ||||
| import eu.kanade.tachiyomi.util.lang.toTimestampString | ||||
| import java.util.Date | ||||
| import kotlinx.android.synthetic.main.history_item.cover | ||||
| import kotlinx.android.synthetic.main.history_item.holder | ||||
| import kotlinx.android.synthetic.main.history_item.manga_subtitle | ||||
| import kotlinx.android.synthetic.main.history_item.manga_title | ||||
| import kotlinx.android.synthetic.main.history_item.remove | ||||
| import kotlinx.android.synthetic.main.history_item.resume | ||||
| import java.util.Date | ||||
|  | ||||
| /** | ||||
|  * Holder that contains recent manga item | ||||
|   | ||||
| @@ -9,13 +9,13 @@ import eu.kanade.tachiyomi.data.database.models.MangaChapterHistory | ||||
| import eu.kanade.tachiyomi.ui.base.presenter.BasePresenter | ||||
| import eu.kanade.tachiyomi.ui.recent.DateSectionItem | ||||
| import eu.kanade.tachiyomi.util.lang.toDateKey | ||||
| import rx.Observable | ||||
| import rx.android.schedulers.AndroidSchedulers | ||||
| import uy.kohesive.injekt.injectLazy | ||||
| import java.util.Calendar | ||||
| import java.util.Comparator | ||||
| import java.util.Date | ||||
| import java.util.TreeMap | ||||
| import rx.Observable | ||||
| import rx.android.schedulers.AndroidSchedulers | ||||
| import uy.kohesive.injekt.injectLazy | ||||
|  | ||||
| /** | ||||
|  * Presenter of HistoryFragment. | ||||
|   | ||||
| @@ -10,15 +10,15 @@ import eu.kanade.tachiyomi.source.SourceManager | ||||
| import eu.kanade.tachiyomi.ui.base.presenter.BasePresenter | ||||
| import eu.kanade.tachiyomi.ui.recent.DateSectionItem | ||||
| import eu.kanade.tachiyomi.util.lang.toDateKey | ||||
| import java.util.Calendar | ||||
| import java.util.Date | ||||
| import java.util.TreeMap | ||||
| import rx.Observable | ||||
| import rx.android.schedulers.AndroidSchedulers | ||||
| import rx.schedulers.Schedulers | ||||
| import timber.log.Timber | ||||
| import uy.kohesive.injekt.Injekt | ||||
| import uy.kohesive.injekt.api.get | ||||
| import java.util.Calendar | ||||
| import java.util.Date | ||||
| import java.util.TreeMap | ||||
|  | ||||
| class UpdatesPresenter( | ||||
|     val preferences: PreferencesHelper = Injekt.get(), | ||||
|   | ||||
| @@ -5,9 +5,9 @@ import androidx.appcompat.app.AppCompatActivity | ||||
| import androidx.biometric.BiometricPrompt | ||||
| import eu.kanade.tachiyomi.R | ||||
| import eu.kanade.tachiyomi.data.preference.PreferencesHelper | ||||
| import uy.kohesive.injekt.injectLazy | ||||
| import java.util.Date | ||||
| import java.util.concurrent.Executors | ||||
| import uy.kohesive.injekt.injectLazy | ||||
|  | ||||
| /** | ||||
|  * Blank activity with a BiometricPrompt. | ||||
| @@ -21,7 +21,8 @@ class BiometricUnlockActivity : AppCompatActivity() { | ||||
|         super.onCreate(savedInstanceState) | ||||
|  | ||||
|         val biometricPrompt = BiometricPrompt( | ||||
|             this, executor, | ||||
|             this, | ||||
|             executor, | ||||
|             object : BiometricPrompt.AuthenticationCallback() { | ||||
|                 override fun onAuthenticationError(errorCode: Int, errString: CharSequence) { | ||||
|                     super.onAuthenticationError(errorCode, errString) | ||||
|   | ||||
| @@ -6,10 +6,10 @@ import androidx.biometric.BiometricManager | ||||
| import androidx.fragment.app.FragmentActivity | ||||
| import androidx.lifecycle.lifecycleScope | ||||
| import eu.kanade.tachiyomi.data.preference.PreferencesHelper | ||||
| import java.util.Date | ||||
| import kotlinx.coroutines.flow.launchIn | ||||
| import kotlinx.coroutines.flow.onEach | ||||
| import uy.kohesive.injekt.injectLazy | ||||
| import java.util.Date | ||||
|  | ||||
| class SecureActivityDelegate(private val activity: FragmentActivity) { | ||||
|  | ||||
|   | ||||
| @@ -15,7 +15,6 @@ import eu.kanade.tachiyomi.data.cache.ChapterCache | ||||
| import eu.kanade.tachiyomi.data.database.DatabaseHelper | ||||
| import eu.kanade.tachiyomi.data.library.LibraryUpdateService | ||||
| import eu.kanade.tachiyomi.data.library.LibraryUpdateService.Target | ||||
| import eu.kanade.tachiyomi.data.preference.PreferenceKeys as Keys | ||||
| import eu.kanade.tachiyomi.network.NetworkHelper | ||||
| import eu.kanade.tachiyomi.ui.base.controller.DialogController | ||||
| import eu.kanade.tachiyomi.util.preference.defaultValue | ||||
| @@ -31,6 +30,7 @@ import rx.Observable | ||||
| import rx.android.schedulers.AndroidSchedulers | ||||
| import rx.schedulers.Schedulers | ||||
| import uy.kohesive.injekt.injectLazy | ||||
| import eu.kanade.tachiyomi.data.preference.PreferenceKeys as Keys | ||||
|  | ||||
| class SettingsAdvancedController : SettingsController() { | ||||
|  | ||||
|   | ||||
| @@ -19,7 +19,6 @@ import eu.kanade.tachiyomi.data.backup.BackupCreatorJob | ||||
| import eu.kanade.tachiyomi.data.backup.BackupRestoreService | ||||
| import eu.kanade.tachiyomi.data.backup.BackupRestoreValidator | ||||
| import eu.kanade.tachiyomi.data.backup.models.Backup | ||||
| import eu.kanade.tachiyomi.data.preference.PreferenceKeys as Keys | ||||
| import eu.kanade.tachiyomi.data.preference.asImmediateFlow | ||||
| import eu.kanade.tachiyomi.ui.base.controller.DialogController | ||||
| import eu.kanade.tachiyomi.ui.base.controller.requestPermissionsSafe | ||||
| @@ -36,6 +35,7 @@ import eu.kanade.tachiyomi.util.system.getFilePicker | ||||
| import eu.kanade.tachiyomi.util.system.toast | ||||
| import kotlinx.coroutines.flow.launchIn | ||||
| import kotlinx.coroutines.flow.onEach | ||||
| import eu.kanade.tachiyomi.data.preference.PreferenceKeys as Keys | ||||
|  | ||||
| class SettingsBackupController : SettingsController() { | ||||
|  | ||||
| @@ -90,9 +90,12 @@ class SettingsBackupController : SettingsController() { | ||||
|                 key = Keys.backupInterval | ||||
|                 titleRes = R.string.pref_backup_interval | ||||
|                 entriesRes = arrayOf( | ||||
|                     R.string.update_never, R.string.update_6hour, | ||||
|                     R.string.update_12hour, R.string.update_24hour, | ||||
|                     R.string.update_48hour, R.string.update_weekly | ||||
|                     R.string.update_never, | ||||
|                     R.string.update_6hour, | ||||
|                     R.string.update_12hour, | ||||
|                     R.string.update_24hour, | ||||
|                     R.string.update_48hour, | ||||
|                     R.string.update_weekly | ||||
|                 ) | ||||
|                 entryValues = arrayOf("0", "6", "12", "24", "48", "168") | ||||
|                 defaultValue = "0" | ||||
| @@ -211,8 +214,11 @@ class SettingsBackupController : SettingsController() { | ||||
|         override fun onCreateDialog(savedViewState: Bundle?): Dialog { | ||||
|             val activity = activity!! | ||||
|             val options = arrayOf( | ||||
|                 R.string.manga, R.string.categories, R.string.chapters, | ||||
|                 R.string.track, R.string.history | ||||
|                 R.string.manga, | ||||
|                 R.string.categories, | ||||
|                 R.string.chapters, | ||||
|                 R.string.track, | ||||
|                 R.string.history | ||||
|             ) | ||||
|                 .map { activity.getString(it) } | ||||
|  | ||||
|   | ||||
| @@ -2,13 +2,13 @@ package eu.kanade.tachiyomi.ui.setting | ||||
|  | ||||
| import androidx.preference.PreferenceScreen | ||||
| import eu.kanade.tachiyomi.R | ||||
| import eu.kanade.tachiyomi.data.preference.PreferenceKeys as Keys | ||||
| import eu.kanade.tachiyomi.extension.ExtensionUpdateJob | ||||
| import eu.kanade.tachiyomi.util.preference.defaultValue | ||||
| import eu.kanade.tachiyomi.util.preference.onChange | ||||
| import eu.kanade.tachiyomi.util.preference.preferenceCategory | ||||
| import eu.kanade.tachiyomi.util.preference.switchPreference | ||||
| import eu.kanade.tachiyomi.util.preference.titleRes | ||||
| import eu.kanade.tachiyomi.data.preference.PreferenceKeys as Keys | ||||
|  | ||||
| class SettingsBrowseController : SettingsController() { | ||||
|  | ||||
|   | ||||
| @@ -15,7 +15,6 @@ import com.hippo.unifile.UniFile | ||||
| import eu.kanade.tachiyomi.R | ||||
| import eu.kanade.tachiyomi.data.database.DatabaseHelper | ||||
| import eu.kanade.tachiyomi.data.database.models.Category | ||||
| import eu.kanade.tachiyomi.data.preference.PreferenceKeys as Keys | ||||
| import eu.kanade.tachiyomi.data.preference.PreferencesHelper | ||||
| import eu.kanade.tachiyomi.data.preference.asImmediateFlow | ||||
| import eu.kanade.tachiyomi.ui.base.controller.DialogController | ||||
| @@ -29,12 +28,13 @@ import eu.kanade.tachiyomi.util.preference.preferenceCategory | ||||
| import eu.kanade.tachiyomi.util.preference.switchPreference | ||||
| import eu.kanade.tachiyomi.util.preference.titleRes | ||||
| import eu.kanade.tachiyomi.util.system.getFilePicker | ||||
| import java.io.File | ||||
| import kotlinx.coroutines.flow.launchIn | ||||
| import kotlinx.coroutines.flow.onEach | ||||
| import uy.kohesive.injekt.Injekt | ||||
| import uy.kohesive.injekt.api.get | ||||
| import uy.kohesive.injekt.injectLazy | ||||
| import java.io.File | ||||
| import eu.kanade.tachiyomi.data.preference.PreferenceKeys as Keys | ||||
|  | ||||
| class SettingsDownloadController : SettingsController() { | ||||
|  | ||||
| @@ -76,8 +76,11 @@ class SettingsDownloadController : SettingsController() { | ||||
|                 key = Keys.removeAfterReadSlots | ||||
|                 titleRes = R.string.pref_remove_after_read | ||||
|                 entriesRes = arrayOf( | ||||
|                     R.string.disabled, R.string.last_read_chapter, | ||||
|                     R.string.second_to_last, R.string.third_to_last, R.string.fourth_to_last, | ||||
|                     R.string.disabled, | ||||
|                     R.string.last_read_chapter, | ||||
|                     R.string.second_to_last, | ||||
|                     R.string.third_to_last, | ||||
|                     R.string.fourth_to_last, | ||||
|                     R.string.fifth_to_last | ||||
|                 ) | ||||
|                 entryValues = arrayOf("-1", "0", "1", "2", "3", "4") | ||||
|   | ||||
| @@ -5,8 +5,6 @@ import android.os.Build | ||||
| import android.provider.Settings | ||||
| import androidx.preference.PreferenceScreen | ||||
| import eu.kanade.tachiyomi.R | ||||
| import eu.kanade.tachiyomi.data.preference.PreferenceKeys as Keys | ||||
| import eu.kanade.tachiyomi.data.preference.PreferenceValues as Values | ||||
| import eu.kanade.tachiyomi.data.preference.asImmediateFlow | ||||
| import eu.kanade.tachiyomi.util.preference.defaultValue | ||||
| import eu.kanade.tachiyomi.util.preference.entriesRes | ||||
| @@ -19,8 +17,10 @@ import eu.kanade.tachiyomi.util.preference.preferenceCategory | ||||
| import eu.kanade.tachiyomi.util.preference.switchPreference | ||||
| import eu.kanade.tachiyomi.util.preference.titleRes | ||||
| import eu.kanade.tachiyomi.util.system.LocaleHelper | ||||
| import java.util.Date | ||||
| import kotlinx.coroutines.flow.launchIn | ||||
| import java.util.Date | ||||
| import eu.kanade.tachiyomi.data.preference.PreferenceKeys as Keys | ||||
| import eu.kanade.tachiyomi.data.preference.PreferenceValues as Values | ||||
|  | ||||
| class SettingsGeneralController : SettingsController() { | ||||
|  | ||||
|   | ||||
| @@ -11,7 +11,6 @@ import eu.kanade.tachiyomi.R | ||||
| import eu.kanade.tachiyomi.data.database.DatabaseHelper | ||||
| import eu.kanade.tachiyomi.data.database.models.Category | ||||
| import eu.kanade.tachiyomi.data.library.LibraryUpdateJob | ||||
| import eu.kanade.tachiyomi.data.preference.PreferenceKeys as Keys | ||||
| import eu.kanade.tachiyomi.data.preference.PreferencesHelper | ||||
| import eu.kanade.tachiyomi.data.preference.asImmediateFlow | ||||
| import eu.kanade.tachiyomi.ui.base.controller.DialogController | ||||
| @@ -35,6 +34,7 @@ import kotlinx.coroutines.flow.launchIn | ||||
| import kotlinx.coroutines.flow.onEach | ||||
| import uy.kohesive.injekt.Injekt | ||||
| import uy.kohesive.injekt.api.get | ||||
| import eu.kanade.tachiyomi.data.preference.PreferenceKeys as Keys | ||||
|  | ||||
| class SettingsLibraryController : SettingsController() { | ||||
|  | ||||
| @@ -121,9 +121,14 @@ class SettingsLibraryController : SettingsController() { | ||||
|                 key = Keys.libraryUpdateInterval | ||||
|                 titleRes = R.string.pref_library_update_interval | ||||
|                 entriesRes = arrayOf( | ||||
|                     R.string.update_never, R.string.update_1hour, | ||||
|                     R.string.update_2hour, R.string.update_3hour, R.string.update_6hour, | ||||
|                     R.string.update_12hour, R.string.update_24hour, R.string.update_48hour | ||||
|                     R.string.update_never, | ||||
|                     R.string.update_1hour, | ||||
|                     R.string.update_2hour, | ||||
|                     R.string.update_3hour, | ||||
|                     R.string.update_6hour, | ||||
|                     R.string.update_12hour, | ||||
|                     R.string.update_24hour, | ||||
|                     R.string.update_48hour | ||||
|                 ) | ||||
|                 entryValues = arrayOf("0", "1", "2", "3", "6", "12", "24", "48") | ||||
|                 defaultValue = "24" | ||||
|   | ||||
| @@ -2,14 +2,14 @@ package eu.kanade.tachiyomi.ui.setting | ||||
|  | ||||
| import androidx.preference.PreferenceScreen | ||||
| import eu.kanade.tachiyomi.R | ||||
| import eu.kanade.tachiyomi.data.preference.PreferenceKeys as Keys | ||||
| import eu.kanade.tachiyomi.data.preference.PreferenceValues as Values | ||||
| import eu.kanade.tachiyomi.util.preference.defaultValue | ||||
| import eu.kanade.tachiyomi.util.preference.entriesRes | ||||
| import eu.kanade.tachiyomi.util.preference.infoPreference | ||||
| import eu.kanade.tachiyomi.util.preference.listPreference | ||||
| import eu.kanade.tachiyomi.util.preference.preferenceCategory | ||||
| import eu.kanade.tachiyomi.util.preference.titleRes | ||||
| import eu.kanade.tachiyomi.data.preference.PreferenceKeys as Keys | ||||
| import eu.kanade.tachiyomi.data.preference.PreferenceValues as Values | ||||
|  | ||||
| class SettingsParentalControlsController : SettingsController() { | ||||
|  | ||||
|   | ||||
| @@ -3,7 +3,6 @@ package eu.kanade.tachiyomi.ui.setting | ||||
| import android.os.Build | ||||
| import androidx.preference.PreferenceScreen | ||||
| import eu.kanade.tachiyomi.R | ||||
| import eu.kanade.tachiyomi.data.preference.PreferenceKeys as Keys | ||||
| import eu.kanade.tachiyomi.data.preference.PreferenceValues.TappingInvertMode | ||||
| import eu.kanade.tachiyomi.data.preference.asImmediateFlow | ||||
| import eu.kanade.tachiyomi.util.preference.defaultValue | ||||
| @@ -16,6 +15,7 @@ import eu.kanade.tachiyomi.util.preference.switchPreference | ||||
| import eu.kanade.tachiyomi.util.preference.titleRes | ||||
| import eu.kanade.tachiyomi.util.system.hasDisplayCutout | ||||
| import kotlinx.coroutines.flow.launchIn | ||||
| import eu.kanade.tachiyomi.data.preference.PreferenceKeys as Keys | ||||
|  | ||||
| class SettingsReaderController : SettingsController() { | ||||
|  | ||||
| @@ -26,8 +26,11 @@ class SettingsReaderController : SettingsController() { | ||||
|             key = Keys.defaultViewer | ||||
|             titleRes = R.string.pref_viewer_type | ||||
|             entriesRes = arrayOf( | ||||
|                 R.string.left_to_right_viewer, R.string.right_to_left_viewer, | ||||
|                 R.string.vertical_viewer, R.string.webtoon_viewer, R.string.vertical_plus_viewer | ||||
|                 R.string.left_to_right_viewer, | ||||
|                 R.string.right_to_left_viewer, | ||||
|                 R.string.vertical_viewer, | ||||
|                 R.string.webtoon_viewer, | ||||
|                 R.string.vertical_plus_viewer | ||||
|             ) | ||||
|             entryValues = arrayOf("1", "2", "3", "4", "5") | ||||
|             defaultValue = "2" | ||||
| @@ -68,8 +71,10 @@ class SettingsReaderController : SettingsController() { | ||||
|                 key = Keys.rotation | ||||
|                 titleRes = R.string.pref_rotation_type | ||||
|                 entriesRes = arrayOf( | ||||
|                     R.string.rotation_free, R.string.rotation_lock, | ||||
|                     R.string.rotation_force_portrait, R.string.rotation_force_landscape | ||||
|                     R.string.rotation_free, | ||||
|                     R.string.rotation_lock, | ||||
|                     R.string.rotation_force_portrait, | ||||
|                     R.string.rotation_force_landscape | ||||
|                 ) | ||||
|                 entryValues = arrayOf("1", "2", "3", "4") | ||||
|                 defaultValue = "1" | ||||
| @@ -136,9 +141,12 @@ class SettingsReaderController : SettingsController() { | ||||
|                 key = Keys.imageScaleType | ||||
|                 titleRes = R.string.pref_image_scale_type | ||||
|                 entriesRes = arrayOf( | ||||
|                     R.string.scale_type_fit_screen, R.string.scale_type_stretch, | ||||
|                     R.string.scale_type_fit_width, R.string.scale_type_fit_height, | ||||
|                     R.string.scale_type_original_size, R.string.scale_type_smart_fit | ||||
|                     R.string.scale_type_fit_screen, | ||||
|                     R.string.scale_type_stretch, | ||||
|                     R.string.scale_type_fit_width, | ||||
|                     R.string.scale_type_fit_height, | ||||
|                     R.string.scale_type_original_size, | ||||
|                     R.string.scale_type_smart_fit | ||||
|                 ) | ||||
|                 entryValues = arrayOf("1", "2", "3", "4", "5", "6") | ||||
|                 defaultValue = "1" | ||||
| @@ -148,8 +156,10 @@ class SettingsReaderController : SettingsController() { | ||||
|                 key = Keys.zoomStart | ||||
|                 titleRes = R.string.pref_zoom_start | ||||
|                 entriesRes = arrayOf( | ||||
|                     R.string.zoom_start_automatic, R.string.zoom_start_left, | ||||
|                     R.string.zoom_start_right, R.string.zoom_start_center | ||||
|                     R.string.zoom_start_automatic, | ||||
|                     R.string.zoom_start_left, | ||||
|                     R.string.zoom_start_right, | ||||
|                     R.string.zoom_start_center | ||||
|                 ) | ||||
|                 entryValues = arrayOf("1", "2", "3", "4") | ||||
|                 defaultValue = "1" | ||||
|   | ||||
| @@ -3,7 +3,6 @@ package eu.kanade.tachiyomi.ui.setting | ||||
| import androidx.biometric.BiometricManager | ||||
| import androidx.preference.PreferenceScreen | ||||
| import eu.kanade.tachiyomi.R | ||||
| import eu.kanade.tachiyomi.data.preference.PreferenceKeys as Keys | ||||
| import eu.kanade.tachiyomi.data.preference.asImmediateFlow | ||||
| import eu.kanade.tachiyomi.util.preference.defaultValue | ||||
| import eu.kanade.tachiyomi.util.preference.intListPreference | ||||
| @@ -11,6 +10,7 @@ import eu.kanade.tachiyomi.util.preference.summaryRes | ||||
| import eu.kanade.tachiyomi.util.preference.switchPreference | ||||
| import eu.kanade.tachiyomi.util.preference.titleRes | ||||
| import kotlinx.coroutines.flow.launchIn | ||||
| import eu.kanade.tachiyomi.data.preference.PreferenceKeys as Keys | ||||
|  | ||||
| class SettingsSecurityController : SettingsController() { | ||||
|  | ||||
|   | ||||
| @@ -5,7 +5,6 @@ import android.content.Intent | ||||
| import androidx.browser.customtabs.CustomTabsIntent | ||||
| import androidx.preference.PreferenceScreen | ||||
| import eu.kanade.tachiyomi.R | ||||
| import eu.kanade.tachiyomi.data.preference.PreferenceKeys as Keys | ||||
| import eu.kanade.tachiyomi.data.track.TrackManager | ||||
| import eu.kanade.tachiyomi.data.track.TrackService | ||||
| import eu.kanade.tachiyomi.data.track.anilist.AnilistApi | ||||
| @@ -23,6 +22,7 @@ import eu.kanade.tachiyomi.util.preference.titleRes | ||||
| import eu.kanade.tachiyomi.util.system.getResourceColor | ||||
| import eu.kanade.tachiyomi.widget.preference.LoginPreference | ||||
| import uy.kohesive.injekt.injectLazy | ||||
| import eu.kanade.tachiyomi.data.preference.PreferenceKeys as Keys | ||||
|  | ||||
| class SettingsTrackingController : | ||||
|     SettingsController(), | ||||
|   | ||||
| @@ -7,10 +7,10 @@ import eu.kanade.tachiyomi.data.download.DownloadManager | ||||
| import eu.kanade.tachiyomi.source.Source | ||||
| import eu.kanade.tachiyomi.source.model.SChapter | ||||
| import eu.kanade.tachiyomi.source.online.HttpSource | ||||
| import java.util.Date | ||||
| import java.util.TreeSet | ||||
| import uy.kohesive.injekt.Injekt | ||||
| import uy.kohesive.injekt.api.get | ||||
| import java.util.Date | ||||
| import java.util.TreeSet | ||||
|  | ||||
| /** | ||||
|  * Helper method for syncing the list of chapters from the source with the ones from the database. | ||||
|   | ||||
| @@ -1,10 +1,10 @@ | ||||
| package eu.kanade.tachiyomi.util.lang | ||||
|  | ||||
| import java.util.concurrent.TimeUnit.MILLISECONDS | ||||
| import rx.Observable | ||||
| import rx.Scheduler | ||||
| import rx.functions.Func1 | ||||
| import rx.schedulers.Schedulers | ||||
| import java.util.concurrent.TimeUnit.MILLISECONDS | ||||
|  | ||||
| class RetryWithDelay( | ||||
|     private val maxRetries: Int = 1, | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| package eu.kanade.tachiyomi.util.lang | ||||
|  | ||||
| import kotlin.math.floor | ||||
| import net.greypanther.natsort.CaseInsensitiveSimpleNaturalComparator | ||||
| import kotlin.math.floor | ||||
|  | ||||
| /** | ||||
|  * Replaces the given string to have at most [count] characters using [replacement] at its end. | ||||
|   | ||||
| @@ -2,6 +2,8 @@ package eu.kanade.tachiyomi.util.storage | ||||
|  | ||||
| import eu.kanade.tachiyomi.source.model.SChapter | ||||
| import eu.kanade.tachiyomi.source.model.SManga | ||||
| import org.jsoup.Jsoup | ||||
| import org.jsoup.nodes.Document | ||||
| import java.io.Closeable | ||||
| import java.io.File | ||||
| import java.io.InputStream | ||||
| @@ -10,8 +12,6 @@ import java.text.SimpleDateFormat | ||||
| import java.util.Locale | ||||
| import java.util.zip.ZipEntry | ||||
| import java.util.zip.ZipFile | ||||
| import org.jsoup.Jsoup | ||||
| import org.jsoup.nodes.Document | ||||
|  | ||||
| /** | ||||
|  * Wrapper over ZipFile to load files in epub format. | ||||
|   | ||||
| @@ -1,10 +1,10 @@ | ||||
| package eu.kanade.tachiyomi.util.storage | ||||
|  | ||||
| import java.io.File | ||||
| import java.io.OutputStream | ||||
| import okio.BufferedSource | ||||
| import okio.buffer | ||||
| import okio.sink | ||||
| import java.io.File | ||||
| import java.io.OutputStream | ||||
|  | ||||
| /** | ||||
|  * Saves the given source to a file and closes it. Directories will be created if needed. | ||||
|   | ||||
| @@ -8,8 +8,8 @@ import android.view.ContextThemeWrapper | ||||
| import eu.kanade.tachiyomi.R | ||||
| import eu.kanade.tachiyomi.data.preference.PreferencesHelper | ||||
| import eu.kanade.tachiyomi.ui.browse.source.SourcePresenter | ||||
| import java.util.Locale | ||||
| import uy.kohesive.injekt.injectLazy | ||||
| import java.util.Locale | ||||
|  | ||||
| /** | ||||
|  * Utility class to change the application's language in runtime. | ||||
|   | ||||
| @@ -61,8 +61,11 @@ abstract class WebViewClientCompat : WebViewClient() { | ||||
|         error: WebResourceError | ||||
|     ) { | ||||
|         onReceivedErrorCompat( | ||||
|             view, error.errorCode, error.description?.toString(), | ||||
|             request.url.toString(), request.isForMainFrame | ||||
|             view, | ||||
|             error.errorCode, | ||||
|             error.description?.toString(), | ||||
|             request.url.toString(), | ||||
|             request.isForMainFrame | ||||
|         ) | ||||
|     } | ||||
|  | ||||
| @@ -82,7 +85,9 @@ abstract class WebViewClientCompat : WebViewClient() { | ||||
|         error: WebResourceResponse | ||||
|     ) { | ||||
|         onReceivedErrorCompat( | ||||
|             view, error.statusCode, error.reasonPhrase, | ||||
|             view, | ||||
|             error.statusCode, | ||||
|             error.reasonPhrase, | ||||
|             request.url | ||||
|                 .toString(), | ||||
|             request.isForMainFrame | ||||
|   | ||||
| @@ -59,11 +59,13 @@ class ActionToolbar @JvmOverloads constructor(context: Context, attrs: Attribute | ||||
|      */ | ||||
|     fun hide() { | ||||
|         val bottomAnimation = AnimationUtils.loadAnimation(context, R.anim.exit_to_bottom) | ||||
|         bottomAnimation.setAnimationListener(object : SimpleAnimationListener() { | ||||
|             override fun onAnimationEnd(animation: Animation) { | ||||
|                 common_action_toolbar.isVisible = false | ||||
|         bottomAnimation.setAnimationListener( | ||||
|             object : SimpleAnimationListener() { | ||||
|                 override fun onAnimationEnd(animation: Animation) { | ||||
|                     common_action_toolbar.isVisible = false | ||||
|                 } | ||||
|             } | ||||
|         }) | ||||
|         ) | ||||
|         common_action_toolbar.startAnimation(bottomAnimation) | ||||
|     } | ||||
| } | ||||
|   | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user