diff --git a/.gitattributes b/.gitattributes index 7353614049..637f5e4cc2 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,2 +1,28 @@ * text=auto * text eol=lf + +# Windows forced line-endings +/.idea/* text eol=crlf + +*.png binary +*.jpg binary +*.jpeg binary +*.gif binary +*.ico binary +*.mov binary +*.mp4 binary +*.mp3 binary +*.flv binary +*.fla binary +*.swf binary +*.gz binary +*.zip binary +*.7z binary +*.ttf binary +*.eot binary +*.woff binary +*.pyc binary +*.pdf binary +*.ez binary +*.bz2 binary +*.swp binary diff --git a/.travis.yml b/.travis.yml index edfc5a7c0f..4d33cff050 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,7 +3,7 @@ language: android android: components: - build-tools-29.0.2 - - android-28 + - android-29 - extra-android-m2repository - extra-google-m2repository - extra-android-support @@ -11,7 +11,7 @@ android: licenses: - android-sdk-license-.+ before_install: -- yes | sdkmanager "platforms;android-28" # workaround for accepting the license +- yes | sdkmanager "platforms;android-29" # workaround for accepting the license - if [ "$TRAVIS_PULL_REQUEST" = "false" ]; then openssl aes-256-cbc -K $encrypted_e56be693d4fd_key -iv $encrypted_e56be693d4fd_iv -in "$PWD/.travis/secrets.tar.enc" -out secrets.tar -d; tar xf secrets.tar; diff --git a/README.md b/README.md index 0361b6d4a4..4f580e4cf2 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # ![app icon](./.github/readme-images/app-icon.png)Tachiyomi -Tachiyomi is a free and open source manga reader for Android. +Tachiyomi is a free and open source manga reader for Android 5.0 and above. ![screenshots of app](./.github/readme-images/theming-screenshots.gif) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3c89d541e8..ccdfb20c94 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -28,7 +28,8 @@ android:networkSecurityConfig="@xml/network_security_config"> + android:launchMode="singleTask" + android:theme="@style/Theme.Splash"> diff --git a/app/src/main/java/eu/kanade/tachiyomi/App.kt b/app/src/main/java/eu/kanade/tachiyomi/App.kt index 81f4442202..33b7b99bdd 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/App.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/App.kt @@ -31,7 +31,7 @@ import uy.kohesive.injekt.registry.default.DefaultRegistrar reportType = org.acra.sender.HttpSender.Type.JSON, httpMethod = org.acra.sender.HttpSender.Method.PUT, buildConfigClass = BuildConfig::class, - excludeMatchingSharedPreferencesKeys = arrayOf(".*username.*", ".*password.*", ".*token.*") + excludeMatchingSharedPreferencesKeys = [".*username.*", ".*password.*", ".*token.*"] ) open class App : Application(), LifecycleObserver { diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupManager.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupManager.kt index c58b3e6033..b5a8e53a22 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupManager.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupManager.kt @@ -35,6 +35,7 @@ import eu.kanade.tachiyomi.util.syncChaptersWithSource 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) { @@ -204,7 +205,7 @@ class BackupManager(val context: Context, version: Int = CURRENT_VERSION) { if (options and BACKUP_CHAPTER_MASK == BACKUP_CHAPTER) { // Backup all the chapters val chapters = databaseHelper.getChapters(manga).executeAsBlocking() - if (!chapters.isEmpty()) { + if (chapters.isNotEmpty()) { val chaptersJson = parser.toJsonTree(chapters) if (chaptersJson.asJsonArray.size() > 0) { entry[CHAPTERS] = chaptersJson @@ -216,7 +217,7 @@ class BackupManager(val context: Context, version: Int = CURRENT_VERSION) { if (options and BACKUP_CATEGORY_MASK == BACKUP_CATEGORY) { // Backup categories for this manga val categoriesForManga = databaseHelper.getCategoriesForManga(manga).executeAsBlocking() - if (!categoriesForManga.isEmpty()) { + if (categoriesForManga.isNotEmpty()) { val categoriesNames = categoriesForManga.map { it.name } entry[CATEGORIES] = parser.toJsonTree(categoriesNames) } @@ -225,7 +226,7 @@ class BackupManager(val context: Context, version: Int = CURRENT_VERSION) { // Check if user wants track information in backup if (options and BACKUP_TRACK_MASK == BACKUP_TRACK) { val tracks = databaseHelper.getTracks(manga).executeAsBlocking() - if (!tracks.isEmpty()) { + if (tracks.isNotEmpty()) { entry[TRACK] = parser.toJsonTree(tracks) } } @@ -233,7 +234,7 @@ class BackupManager(val context: Context, version: Int = CURRENT_VERSION) { // Check if user wants history information in backup if (options and BACKUP_HISTORY_MASK == BACKUP_HISTORY) { val historyForManga = databaseHelper.getHistoryByMangaId(manga.id!!).executeAsBlocking() - if (!historyForManga.isEmpty()) { + if (historyForManga.isNotEmpty()) { val historyData = historyForManga.mapNotNull { history -> val url = databaseHelper.getChapter(history.chapter_id).executeAsBlocking()?.url url?.let { DHistory(url, history.last_read) } @@ -344,7 +345,7 @@ class BackupManager(val context: Context, version: Int = CURRENT_VERSION) { } // Update database - if (!mangaCategoriesToUpdate.isEmpty()) { + if (mangaCategoriesToUpdate.isNotEmpty()) { val mangaAsList = ArrayList() mangaAsList.add(manga) databaseHelper.deleteOldMangasCategories(mangaAsList).executeAsBlocking() @@ -365,7 +366,7 @@ class BackupManager(val context: Context, version: Int = CURRENT_VERSION) { // Check if history already in database and update if (dbHistory != null) { dbHistory.apply { - last_read = Math.max(lastRead, dbHistory.last_read) + last_read = max(lastRead, dbHistory.last_read) } historyToBeUpdated.add(dbHistory) } else { @@ -408,7 +409,7 @@ class BackupManager(val context: Context, version: Int = CURRENT_VERSION) { if (track.library_id != dbTrack.library_id) { dbTrack.library_id = track.library_id } - dbTrack.last_chapter_read = Math.max(dbTrack.last_chapter_read, track.last_chapter_read) + dbTrack.last_chapter_read = max(dbTrack.last_chapter_read, track.last_chapter_read) isInDatabase = true trackToUpdate.add(dbTrack) break @@ -422,7 +423,7 @@ class BackupManager(val context: Context, version: Int = CURRENT_VERSION) { } } // Update database - if (!trackToUpdate.isEmpty()) { + if (trackToUpdate.isNotEmpty()) { databaseHelper.insertTracks(trackToUpdate).executeAsBlocking() } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/serializer/ChapterTypeAdapter.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/serializer/ChapterTypeAdapter.kt index 74002582de..9bd6e8e1e6 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/serializer/ChapterTypeAdapter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/serializer/ChapterTypeAdapter.kt @@ -43,9 +43,7 @@ object ChapterTypeAdapter { beginObject() while (hasNext()) { if (peek() == JsonToken.NAME) { - val name = nextName() - - when (name) { + when (nextName()) { URL -> chapter.url = nextString() READ -> chapter.read = nextInt() == 1 BOOKMARK -> chapter.bookmark = nextInt() == 1 @@ -58,4 +56,4 @@ object ChapterTypeAdapter { } } } -} \ No newline at end of file +} diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/serializer/TrackTypeAdapter.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/serializer/TrackTypeAdapter.kt index d9f3b8cac3..0cc16d38e9 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/serializer/TrackTypeAdapter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/serializer/TrackTypeAdapter.kt @@ -42,9 +42,7 @@ object TrackTypeAdapter { beginObject() while (hasNext()) { if (peek() == JsonToken.NAME) { - val name = nextName() - - when (name) { + when (nextName()) { TITLE -> track.title = nextString() SYNC -> track.sync_id = nextInt() MEDIA -> track.media_id = nextInt() @@ -59,4 +57,4 @@ object TrackTypeAdapter { } } } -} \ No newline at end of file +} diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadCache.kt b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadCache.kt index 6920e28fc8..9600867369 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadCache.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadCache.kt @@ -266,7 +266,7 @@ class DownloadCache( for (element in this) { val (key, value) = transform(element) if (key != null) { - destination.put(key, value) + destination[key] = value } } return destination diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadProvider.kt b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadProvider.kt index 23156486bb..816f59abab 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadProvider.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadProvider.kt @@ -3,6 +3,7 @@ package eu.kanade.tachiyomi.data.download import android.content.Context import android.net.Uri import com.hippo.unifile.UniFile +import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.database.models.Chapter import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.data.preference.PreferencesHelper @@ -46,9 +47,13 @@ class DownloadProvider(private val context: Context) { * @param source the source of the manga. */ internal fun getMangaDir(manga: Manga, source: Source): UniFile { - return downloadsDir - .createDirectory(getSourceDirName(source)) - .createDirectory(getMangaDirName(manga)) + try { + return downloadsDir + .createDirectory(getSourceDirName(source)) + .createDirectory(getMangaDirName(manga)) + } catch (e: NullPointerException) { + throw Exception(context.getString(R.string.invalid_download_dir)) + } } /** diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/download/Downloader.kt b/app/src/main/java/eu/kanade/tachiyomi/data/download/Downloader.kt index 07b4f380d6..afae5d4fcf 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/download/Downloader.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/Downloader.kt @@ -108,7 +108,7 @@ class Downloader( pending.forEach { if (it.status != Download.QUEUE) it.status = Download.QUEUE } downloadsRelay.call(pending) - return !pending.isEmpty() + return pending.isNotEmpty() } /** diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateJob.kt b/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateJob.kt index 3cad6a2206..01698a5ce0 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateJob.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateJob.kt @@ -48,4 +48,4 @@ class LibraryUpdateJob : Job() { JobManager.instance().cancelAllForTag(TAG) } } -} \ No newline at end of file +} diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt b/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt index 5177f8daf0..298cc9356c 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt @@ -257,7 +257,6 @@ class LibraryUpdateService( else db.getLibraryMangas().executeAsBlocking().distinctBy { it.id } } - if (target == Target.CHAPTERS && preferences.updateOnlyNonCompleted()) { listToUpdate = listToUpdate.filter { it.status != SManga.COMPLETED } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/TrackService.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/TrackService.kt index 736b33cb93..f4bfcaeff4 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/TrackService.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/TrackService.kt @@ -57,8 +57,8 @@ abstract class TrackService(val id: Int) { } open val isLogged: Boolean - get() = !getUsername().isEmpty() && - !getPassword().isEmpty() + get() = getUsername().isNotEmpty() && + getPassword().isNotEmpty() fun getUsername() = preferences.trackUsername(this)!! diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/Anilist.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/Anilist.kt index 1f862cfefa..fde18a22d6 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/Anilist.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/Anilist.kt @@ -52,7 +52,7 @@ class Anilist(private val context: Context, id: Int) : TrackService(id) { } } - override fun getLogo() = R.drawable.al + override fun getLogo() = R.drawable.anilist override fun getLogoColor() = Color.rgb(18, 25, 35) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistApi.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistApi.kt index 95ce87abad..2dacccf141 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistApi.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistApi.kt @@ -17,6 +17,7 @@ import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.RequestBody +import okhttp3.RequestBody.Companion.toRequestBody import rx.Observable import java.util.Calendar @@ -45,7 +46,7 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { "query" to query, "variables" to variables ) - val body = RequestBody.create(jsonMime, payload.toString()) + val body = payload.toString().toRequestBody(jsonMime) val request = Request.Builder() .url(apiUrl) .post(body) @@ -84,7 +85,7 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { "query" to query, "variables" to variables ) - val body = RequestBody.create(jsonMime, payload.toString()) + val body = payload.toString().toRequestBody(jsonMime) val request = Request.Builder() .url(apiUrl) .post(body) @@ -128,7 +129,7 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { "query" to query, "variables" to variables ) - val body = RequestBody.create(jsonMime, payload.toString()) + val body = payload.toString().toRequestBody(jsonMime) val request = Request.Builder() .url(apiUrl) .post(body) @@ -189,7 +190,7 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { "query" to query, "variables" to variables ) - val body = RequestBody.create(jsonMime, payload.toString()) + val body = payload.toString().toRequestBody(jsonMime) val request = Request.Builder() .url(apiUrl) .post(body) @@ -234,7 +235,7 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { val payload = jsonObject( "query" to query ) - val body = RequestBody.create(jsonMime, payload.toString()) + val body = payload.toString().toRequestBody(jsonMime) val request = Request.Builder() .url(apiUrl) .post(body) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/BangumiInterceptor.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/BangumiInterceptor.kt index b403daf8a9..d51c6d7862 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/BangumiInterceptor.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/BangumiInterceptor.kt @@ -35,7 +35,7 @@ class BangumiInterceptor(val bangumi: Bangumi, val gson: Gson) : Interceptor { } } - var authRequest = if (originalRequest.method == "GET") originalRequest.newBuilder() + val authRequest = if (originalRequest.method == "GET") originalRequest.newBuilder() .header("User-Agent", "Tachiyomi") .url(originalRequest.url.newBuilder() .addQueryParameter("access_token", currAuth.access_token).build()) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/OAuth.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/OAuth.kt index 8674b6134b..b46276d167 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/OAuth.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/OAuth.kt @@ -9,7 +9,7 @@ data class OAuth( val user_id: Long? ) { - // Access token refersh before expired + // Access token refresh before expired fun isExpired() = (System.currentTimeMillis() / 1000) > (created_at + expires_in - 3600) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeList.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeList.kt index 29134a6d99..85a29193bd 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeList.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeList.kt @@ -30,7 +30,7 @@ class Myanimelist(private val context: Context, id: Int) : TrackService(id) { } private val interceptor by lazy { MyAnimeListInterceptor(this) } - private val api by lazy { MyanimelistApi(client, interceptor) } + private val api by lazy { MyAnimeListApi(client, interceptor) } override val name: String get() = "MyAnimeList" diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyanimelistApi.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeListApi.kt similarity index 97% rename from app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyanimelistApi.kt rename to app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeListApi.kt index bab726c124..9430e00148 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyanimelistApi.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeListApi.kt @@ -12,7 +12,10 @@ import eu.kanade.tachiyomi.util.selectInt import eu.kanade.tachiyomi.util.selectText import okhttp3.* import okhttp3.MediaType.Companion.toMediaTypeOrNull +import okhttp3.OkHttpClient +import okhttp3.RequestBody import okhttp3.RequestBody.Companion.toRequestBody +import okhttp3.Response import org.json.JSONObject import org.jsoup.Jsoup import org.jsoup.nodes.Document @@ -24,7 +27,7 @@ import java.io.InputStreamReader import java.util.zip.GZIPInputStream -class MyanimelistApi(private val client: OkHttpClient, interceptor: MyAnimeListInterceptor) { +class MyAnimeListApi(private val client: OkHttpClient, interceptor: MyAnimeListInterceptor) { private val authClient = client.newBuilder().addInterceptor(interceptor).build() @@ -35,8 +38,7 @@ class MyanimelistApi(private val client: OkHttpClient, interceptor: MyAnimeListI .flatMap { Observable.from(it) } .filter { it.title.contains(realQuery, true) } .toList() - } - else { + } else { client.newCall(GET(searchUrl(query))) .asObservable() .flatMap { response -> @@ -264,7 +266,7 @@ class MyanimelistApi(private val client: OkHttpClient, interceptor: MyAnimeListI .put("score", track.score) .put("num_read_chapters", track.last_chapter_read) - return RequestBody.create("application/json; charset=utf-8".toMediaTypeOrNull(), body.toString()) + return body.toString().toRequestBody("application/json; charset=utf-8".toMediaTypeOrNull()) } private fun Element.searchTitle() = select("strong").text()!! diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeListInterceptor.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeListInterceptor.kt index 9eae9f1370..9ef078983b 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeListInterceptor.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeListInterceptor.kt @@ -3,6 +3,7 @@ package eu.kanade.tachiyomi.data.track.myanimelist import okhttp3.Interceptor import okhttp3.Request import okhttp3.RequestBody +import okhttp3.RequestBody.Companion.toRequestBody import okhttp3.Response import okio.Buffer import org.json.JSONObject @@ -15,7 +16,7 @@ class MyAnimeListInterceptor(private val myanimelist: Myanimelist): Interceptor val request = chain.request() var response = chain.proceed(updateRequest(request)) - if (response.code == 400){ + if (response.code == 400) { myanimelist.refreshLogin() response = chain.proceed(updateRequest(request)) } @@ -45,15 +46,14 @@ class MyAnimeListInterceptor(private val myanimelist: Myanimelist): Interceptor private fun updateFormBody(requestBody: RequestBody): RequestBody { val formString = bodyToString(requestBody) - return RequestBody.create(requestBody.contentType(), - "$formString${if (formString.isNotEmpty()) "&" else ""}${MyanimelistApi.CSRF}=${myanimelist.getCSRF()}") + return "$formString${if (formString.isNotEmpty()) "&" else ""}${MyAnimeListApi.CSRF}=${myanimelist.getCSRF()}".toRequestBody(requestBody.contentType()) } private fun updateJsonBody(requestBody: RequestBody): RequestBody { val jsonString = bodyToString(requestBody) val newBody = JSONObject(jsonString) - .put(MyanimelistApi.CSRF, myanimelist.getCSRF()) + .put(MyAnimeListApi.CSRF, myanimelist.getCSRF()) - return RequestBody.create(requestBody.contentType(), newBody.toString()) + return newBody.toString().toRequestBody(requestBody.contentType()) } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/ShikimoriApi.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/ShikimoriApi.kt index afef886bab..74702fcca2 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/ShikimoriApi.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/ShikimoriApi.kt @@ -16,6 +16,10 @@ import eu.kanade.tachiyomi.network.POST import eu.kanade.tachiyomi.network.asObservableSuccess import okhttp3.* import okhttp3.MediaType.Companion.toMediaTypeOrNull +import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.RequestBody +import okhttp3.RequestBody.Companion.toRequestBody import rx.Observable import uy.kohesive.injekt.injectLazy @@ -37,7 +41,7 @@ class ShikimoriApi(private val client: OkHttpClient, interceptor: ShikimoriInter "status" to track.toShikimoriStatus() ) ) - val body = RequestBody.create(jsonime, payload.toString()) + val body = payload.toString().toRequestBody(jsonime) val request = Request.Builder() .url("$apiUrl/v2/user_rates") .post(body) diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstallReceiver.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstallReceiver.kt index 2a55ccd7d9..2c7bf9ef78 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstallReceiver.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstallReceiver.kt @@ -94,7 +94,7 @@ internal class ExtensionInstallReceiver(private val listener: Listener) : private suspend fun getExtensionFromIntent(context: Context, intent: Intent?): LoadResult { val pkgName = getPackageNameFromIntent(intent) ?: return LoadResult.Error("Package name not found") - return GlobalScope.async(Dispatchers.Default, CoroutineStart.DEFAULT, { ExtensionLoader.loadExtensionFromPkgName(context, pkgName) }).await() + return GlobalScope.async(Dispatchers.Default, CoroutineStart.DEFAULT) { ExtensionLoader.loadExtensionFromPkgName(context, pkgName) }.await() } /** diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionLoader.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionLoader.kt index c4018f0461..1fa963419c 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionLoader.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionLoader.kt @@ -173,7 +173,7 @@ internal object ExtensionLoader { */ private fun getSignatureHash(pkgInfo: PackageInfo): String? { val signatures = pkgInfo.signatures - return if (signatures != null && !signatures.isEmpty()) { + return if (signatures != null && signatures.isNotEmpty()) { Hash.sha256(signatures.first().toByteArray()) } else { null diff --git a/app/src/main/java/eu/kanade/tachiyomi/network/AndroidCookieJar.kt b/app/src/main/java/eu/kanade/tachiyomi/network/AndroidCookieJar.kt index b588dbea26..7db589a551 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/network/AndroidCookieJar.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/network/AndroidCookieJar.kt @@ -1,19 +1,14 @@ package eu.kanade.tachiyomi.network -import android.content.Context -import android.os.Build import android.webkit.CookieManager -import android.webkit.CookieSyncManager import okhttp3.Cookie import okhttp3.CookieJar import okhttp3.HttpUrl -class AndroidCookieJar(context: Context) : CookieJar { +class AndroidCookieJar : CookieJar { private val manager = CookieManager.getInstance() - private val syncManager by lazy { CookieSyncManager.createInstance(context) } - override fun saveFromResponse(url: HttpUrl, cookies: List) { val urlString = url.toString() @@ -29,7 +24,7 @@ class AndroidCookieJar(context: Context) : CookieJar { fun get(url: HttpUrl): List { val cookies = manager.getCookie(url.toString()) - return if (cookies != null && !cookies.isEmpty()) { + return if (cookies != null && cookies.isNotEmpty()) { cookies.split(";").mapNotNull { Cookie.parse(url, it) } } else { emptyList() @@ -43,19 +38,10 @@ class AndroidCookieJar(context: Context) : CookieJar { cookies.split(";") .map { it.substringBefore("=") } .onEach { manager.setCookie(urlString, "$it=;Max-Age=-1") } - - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { - syncManager.sync() - } } fun removeAll() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - manager.removeAllCookies {} - } else { - manager.removeAllCookie() - syncManager.sync() - } + manager.removeAllCookies {} } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/network/CloudflareInterceptor.kt b/app/src/main/java/eu/kanade/tachiyomi/network/CloudflareInterceptor.kt index 7a320ba49f..ec66d2df40 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/network/CloudflareInterceptor.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/network/CloudflareInterceptor.kt @@ -28,11 +28,7 @@ class CloudflareInterceptor(private val context: Context) : Interceptor { * Application class. */ private val initWebView by lazy { - if (Build.VERSION.SDK_INT >= 17) { - WebSettings.getDefaultUserAgent(context) - } else { - null - } + WebSettings.getDefaultUserAgent(context) } @Synchronized diff --git a/app/src/main/java/eu/kanade/tachiyomi/network/NetworkHelper.kt b/app/src/main/java/eu/kanade/tachiyomi/network/NetworkHelper.kt index fa0b70660d..21445593e4 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/network/NetworkHelper.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/network/NetworkHelper.kt @@ -1,17 +1,9 @@ package eu.kanade.tachiyomi.network import android.content.Context -import android.os.Build -import okhttp3.* +import okhttp3.Cache +import okhttp3.OkHttpClient import java.io.File -import java.io.IOException -import java.net.InetAddress -import java.net.Socket -import java.net.UnknownHostException -import java.security.KeyManagementException -import java.security.KeyStore -import java.security.NoSuchAlgorithmException -import javax.net.ssl.* class NetworkHelper(context: Context) { @@ -19,99 +11,15 @@ class NetworkHelper(context: Context) { private val cacheSize = 5L * 1024 * 1024 // 5 MiB - val cookieManager = AndroidCookieJar(context) + val cookieManager = AndroidCookieJar() val client = OkHttpClient.Builder() .cookieJar(cookieManager) .cache(Cache(cacheDir, cacheSize)) - .enableTLS12() .build() val cloudflareClient = client.newBuilder() .addInterceptor(CloudflareInterceptor(context)) .build() - private fun OkHttpClient.Builder.enableTLS12(): OkHttpClient.Builder { - if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) { - return this - } - - val trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()) - trustManagerFactory.init(null as KeyStore?) - val trustManagers = trustManagerFactory.trustManagers - if (trustManagers.size == 1 && trustManagers[0] is X509TrustManager) { - class TLSSocketFactory @Throws(KeyManagementException::class, NoSuchAlgorithmException::class) - constructor() : SSLSocketFactory() { - - private val internalSSLSocketFactory: SSLSocketFactory - - init { - val context = SSLContext.getInstance("TLS") - context.init(null, null, null) - internalSSLSocketFactory = context.socketFactory - } - - override fun getDefaultCipherSuites(): Array { - return internalSSLSocketFactory.defaultCipherSuites - } - - override fun getSupportedCipherSuites(): Array { - return internalSSLSocketFactory.supportedCipherSuites - } - - @Throws(IOException::class) - override fun createSocket(): Socket? { - return enableTLSOnSocket(internalSSLSocketFactory.createSocket()) - } - - @Throws(IOException::class) - override fun createSocket(s: Socket, host: String, port: Int, autoClose: Boolean): Socket? { - return enableTLSOnSocket(internalSSLSocketFactory.createSocket(s, host, port, autoClose)) - } - - @Throws(IOException::class, UnknownHostException::class) - override fun createSocket(host: String, port: Int): Socket? { - return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port)) - } - - @Throws(IOException::class, UnknownHostException::class) - override fun createSocket(host: String, port: Int, localHost: InetAddress, localPort: Int): Socket? { - return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port, localHost, localPort)) - } - - @Throws(IOException::class) - override fun createSocket(host: InetAddress, port: Int): Socket? { - return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port)) - } - - @Throws(IOException::class) - override fun createSocket(address: InetAddress, port: Int, localAddress: InetAddress, localPort: Int): Socket? { - return enableTLSOnSocket(internalSSLSocketFactory.createSocket(address, port, localAddress, localPort)) - } - - private fun enableTLSOnSocket(socket: Socket?): Socket? { - if (socket != null && socket is SSLSocket) { - socket.enabledProtocols = socket.supportedProtocols - } - return socket - } - } - - sslSocketFactory(TLSSocketFactory(), trustManagers[0] as X509TrustManager) - } - - val specCompat = ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS) - .tlsVersions(TlsVersion.TLS_1_2, TlsVersion.TLS_1_1, TlsVersion.TLS_1_0) - .cipherSuites( - *ConnectionSpec.MODERN_TLS.cipherSuites.orEmpty().toTypedArray(), - CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, - CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA - ) - .build() - - val specs = listOf(specCompat, ConnectionSpec.CLEARTEXT) - connectionSpecs(specs) - - return this - } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/source/model/Page.kt b/app/src/main/java/eu/kanade/tachiyomi/source/model/Page.kt index c06a59a882..a0c0b1989e 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/source/model/Page.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/source/model/Page.kt @@ -37,7 +37,6 @@ open class Page( } companion object { - const val QUEUE = 0 const val LOAD_PAGE = 1 const val DOWNLOAD_IMAGE = 2 diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/base/controller/DialogController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/base/controller/DialogController.kt index d00d9d59cb..fafdbe1605 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/base/controller/DialogController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/base/controller/DialogController.kt @@ -38,7 +38,7 @@ abstract class DialogController : RestoreViewOnCreateController { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup, savedViewState: Bundle?): View { dialog = onCreateDialog(savedViewState) - //dialog!!.ownerActivity = activity + dialog!!.setOwnerActivity(activity!!) dialog!!.setOnDismissListener { dismissDialog() } if (savedViewState != null) { val dialogState = savedViewState.getBundle(SAVED_DIALOG_STATE_TAG) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/base/holder/SlicedHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/base/holder/SlicedHolder.kt index b2fc8fd26f..2d7efa2489 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/base/holder/SlicedHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/base/holder/SlicedHolder.kt @@ -1,6 +1,5 @@ package eu.kanade.tachiyomi.ui.base.holder -import android.os.Build import android.view.View import android.view.ViewGroup import eu.davidea.flexibleadapter.FlexibleAdapter @@ -51,10 +50,6 @@ interface SlicedHolder { slice.showRightTopRect(topRect) slice.showLeftBottomRect(bottomRect) slice.showRightBottomRect(bottomRect) - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { - slice.showTopEdgeShadow(topShadow) - slice.showBottomEdgeShadow(bottomShadow) - } setMargins(margin, if (topShadow) margin else 0, margin, if (bottomShadow) margin else 0) } @@ -68,4 +63,4 @@ interface SlicedHolder { val margin get() = 8.dpToPx -} \ No newline at end of file +} diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/SourceDividerItemDecoration.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/SourceDividerItemDecoration.kt index b927d4e3e5..0475b90276 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/SourceDividerItemDecoration.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/SourceDividerItemDecoration.kt @@ -27,8 +27,8 @@ class SourceDividerItemDecoration(context: Context) : androidx.recyclerview.widg val params = child.layoutParams as androidx.recyclerview.widget.RecyclerView.LayoutParams val top = child.bottom + params.bottomMargin val bottom = top + divider.intrinsicHeight - val left = parent.paddingLeft + holder.margin - val right = parent.width - parent.paddingRight - holder.margin + val left = parent.paddingStart + holder.margin + val right = parent.width - parent.paddingEnd - holder.margin divider.setBounds(left, top, right, bottom) divider.draw(c) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/browse/BrowseCataloguePresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/browse/BrowseCataloguePresenter.kt index d81f1f044b..c19fa806dd 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/browse/BrowseCataloguePresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/browse/BrowseCataloguePresenter.kt @@ -367,7 +367,7 @@ open class BrowseCataloguePresenter( * @param selectedCategories selected categories */ fun updateMangaCategories(manga: Manga, selectedCategories: List) { - if (!selectedCategories.isEmpty()) { + if (selectedCategories.isNotEmpty()) { if (!manga.favorite) changeMangaFavorite(manga) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/browse/Pager.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/browse/Pager.kt index 1383fdfcc5..104e5887df 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/browse/Pager.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/browse/Pager.kt @@ -24,8 +24,8 @@ abstract class Pager(var currentPage: Int = 1) { fun onPageReceived(mangasPage: MangasPage) { val page = currentPage currentPage++ - hasNextPage = mangasPage.hasNextPage && !mangasPage.mangas.isEmpty() + hasNextPage = mangasPage.hasNextPage && mangasPage.mangas.isNotEmpty() results.call(Pair(page, mangasPage.mangas)) } -} \ No newline at end of file +} diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/global_search/CatalogueSearchPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/global_search/CatalogueSearchPresenter.kt index 14312da130..92f32fed9e 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/global_search/CatalogueSearchPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/global_search/CatalogueSearchPresenter.kt @@ -205,7 +205,6 @@ open class CatalogueSearchPresenter( .map { Pair(source as CatalogueSource, it) } } - .onBackpressureBuffer() .observeOn(AndroidSchedulers.mainThread()) .subscribe({ (source, manga) -> diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/category/CategoryController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/category/CategoryController.kt index 0e619efb5d..aa124d0599 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/category/CategoryController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/category/CategoryController.kt @@ -235,11 +235,11 @@ class CategoryController : NucleusController(), */ override fun onItemClick(view: View?, position: Int): Boolean { // Check if action mode is initialized and selected item exist. - if (actionMode != null && position != androidx.recyclerview.widget.RecyclerView.NO_POSITION) { + return if (actionMode != null && position != RecyclerView.NO_POSITION) { toggleSelection(position) - return true + true } else { - return false + false } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/category/CategoryCreateDialog.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/category/CategoryCreateDialog.kt index dfa4bad32a..82306d0795 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/category/CategoryCreateDialog.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/category/CategoryCreateDialog.kt @@ -33,9 +33,9 @@ class CategoryCreateDialog(bundle: Bundle? = null) : DialogController(bundle) .title(R.string.action_add_category) .negativeText(android.R.string.cancel) .alwaysCallInputCallback() - .input(resources?.getString(R.string.name), currentName, false, { _, input -> + .input(resources?.getString(R.string.name), currentName, false) { _, input -> currentName = input.toString() - }) + } .onPositive { _, _ -> (targetController as? Listener)?.createCategory(currentName) } .build() } @@ -44,4 +44,4 @@ class CategoryCreateDialog(bundle: Bundle? = null) : DialogController(bundle) fun createCategory(name: String) } -} \ No newline at end of file +} diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/category/CategoryRenameDialog.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/category/CategoryRenameDialog.kt index 286093b06b..023333c833 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/category/CategoryRenameDialog.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/category/CategoryRenameDialog.kt @@ -38,9 +38,9 @@ class CategoryRenameDialog(bundle: Bundle? = null) : DialogController(bundle) .title(R.string.action_rename_category) .negativeText(android.R.string.cancel) .alwaysCallInputCallback() - .input(resources!!.getString(R.string.name), currentName, false, { _, input -> + .input(resources!!.getString(R.string.name), currentName, false) { _, input -> currentName = input.toString() - }) + } .onPositive { _, _ -> onPositive() } .build() } @@ -83,4 +83,4 @@ class CategoryRenameDialog(bundle: Bundle? = null) : DialogController(bundle) const val CATEGORY_KEY = "CategoryRenameDialog.category" } -} \ No newline at end of file +} diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/download/DownloadPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/download/DownloadPresenter.kt index e892553d8b..3aef0f7ea1 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/download/DownloadPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/download/DownloadPresenter.kt @@ -69,4 +69,4 @@ class DownloadPresenter : BasePresenter() { downloadManager.deletePendingDownloads(download) } -} \ No newline at end of file +} diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/extension/ExtensionController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/extension/ExtensionController.kt index 3cd347c5d0..2a7dc944b9 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/extension/ExtensionController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/extension/ExtensionController.kt @@ -138,7 +138,7 @@ open class ExtensionController : NucleusController(), val searchView = searchItem.actionView as SearchView searchView.maxWidth = Int.MAX_VALUE - if (!query.isEmpty()) { + if (query.isNotEmpty()) { searchItem.expandActionView() searchView.setQuery(query, true) searchView.clearFocus() diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/extension/ExtensionDividerItemDecoration.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/extension/ExtensionDividerItemDecoration.kt index 5b5946939d..cc99508e31 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/extension/ExtensionDividerItemDecoration.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/extension/ExtensionDividerItemDecoration.kt @@ -27,8 +27,8 @@ class ExtensionDividerItemDecoration(context: Context) : androidx.recyclerview.w val params = child.layoutParams as androidx.recyclerview.widget.RecyclerView.LayoutParams val top = child.bottom + params.bottomMargin val bottom = top + divider.intrinsicHeight - val left = parent.paddingLeft + holder.margin - val right = parent.width - parent.paddingRight - holder.margin + val left = parent.paddingStart + holder.margin + val right = parent.width - parent.paddingEnd - holder.margin divider.setBounds(left, top, right, bottom) divider.draw(c) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt index a8db98c746..7a59c04629 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt @@ -218,8 +218,7 @@ class LibraryController( override fun createSecondaryDrawer(drawer: androidx.drawerlayout.widget.DrawerLayout): ViewGroup { val view = drawer.inflate(R.layout.library_drawer) as LibraryNavigationView navView = view - drawer.setDrawerLockMode(androidx.drawerlayout.widget.DrawerLayout.LOCK_MODE_UNLOCKED, - GravityCompat.END) + drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED, GravityCompat.END) navView?.onGroupClicked = { group -> when (group) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryNavigationView.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryNavigationView.kt index 343cc6e328..ac2d10d179 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryNavigationView.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryNavigationView.kt @@ -231,9 +231,9 @@ class LibraryNavigationView @JvmOverloads constructor(context: Context, attrs: A item.group.items.forEach { (it as Item.Radio).checked = false } item.checked = true - preferences.libraryAsList().set(if (item == list) true else false) + preferences.libraryAsList().set(item == list) item.group.items.forEach { adapter.notifyItemChanged(it) } } } -} \ No newline at end of file +} diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryPresenter.kt index 86928c4782..388874e75d 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryPresenter.kt @@ -97,12 +97,15 @@ class LibraryPresenter( fun subscribeLibrary() { if (librarySubscription.isNullOrUnsubscribed()) { librarySubscription = getLibraryObservable() - .combineLatest(downloadTriggerRelay.observeOn(Schedulers.io()), - { lib, _ -> lib.apply { setDownloadCount(mangaMap) } }) - .combineLatest(filterTriggerRelay.observeOn(Schedulers.io()), - { lib, _ -> lib.copy(mangaMap = applyFilters(lib.mangaMap)) }) - .combineLatest(sortTriggerRelay.observeOn(Schedulers.io()), - { lib, _ -> lib.copy(mangaMap = applySort(lib.mangaMap)) }) + .combineLatest(downloadTriggerRelay.observeOn(Schedulers.io())) { + lib, _ -> lib.apply { setDownloadCount(mangaMap) } + } + .combineLatest(filterTriggerRelay.observeOn(Schedulers.io())) { + lib, _ -> lib.copy(mangaMap = applyFilters(lib.mangaMap)) + } + .combineLatest(sortTriggerRelay.observeOn(Schedulers.io())) { + lib, _ -> lib.copy(mangaMap = applySort(lib.mangaMap)) + } .observeOn(AndroidSchedulers.mainThread()) .subscribeLatestCache({ view, (categories, mangaMap) -> view.onNextLibraryUpdate(categories, mangaMap) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/main/ChangelogDialogController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/main/ChangelogDialogController.kt index 60627bee54..5e659c5b5e 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/main/ChangelogDialogController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/main/ChangelogDialogController.kt @@ -12,7 +12,7 @@ import it.gmariotti.changelibs.library.view.ChangeLogRecyclerView class ChangelogDialogController : DialogController() { - override fun onCreateDialog(savedState: Bundle?): Dialog { + override fun onCreateDialog(savedViewState: Bundle?): Dialog { val activity = activity!! val view = WhatsNewRecyclerView(activity) return MaterialDialog.Builder(activity) @@ -29,4 +29,4 @@ class ChangelogDialogController : DialogController() { mChangeLogFileResourceId = if (BuildConfig.DEBUG) R.raw.changelog_debug else R.raw.changelog_release } } -} \ No newline at end of file +} diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt index 13e5b49172..961b801363 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt @@ -315,7 +315,7 @@ class MainActivity : BaseActivity() { //Get the search query provided in extras, and if not null, perform a global search with it. val query = intent.getStringExtra(SearchManager.QUERY) - if (query != null && !query.isEmpty()) { + if (query != null && query.isNotEmpty()) { if (router.backstackSize > 1) { router.popToRoot() } @@ -325,7 +325,7 @@ class MainActivity : BaseActivity() { INTENT_SEARCH -> { val query = intent.getStringExtra(INTENT_SEARCH_QUERY) val filter = intent.getStringExtra(INTENT_SEARCH_FILTER) - if (query != null && !query.isEmpty()) { + if (query != null && query.isNotEmpty()) { if (router.backstackSize > 1) { router.popToRoot() } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChaptersPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChaptersPresenter.kt index 0a4424629c..8275728230 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChaptersPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChaptersPresenter.kt @@ -109,8 +109,9 @@ class ChaptersPresenter( .observeOn(AndroidSchedulers.mainThread()) .filter { download -> download.manga.id == manga.id } .doOnNext { onDownloadStatusChange(it) } - .subscribeLatestCache(ChaptersController::onChapterStatusChange, - { _, error -> Timber.e(error) }) + .subscribeLatestCache(ChaptersController::onChapterStatusChange) { + _, error -> Timber.e(error) + } } /** diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/DeletingChaptersDialog.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/DeletingChaptersDialog.kt index 8fa6df5862..07a3f318f8 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/DeletingChaptersDialog.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/DeletingChaptersDialog.kt @@ -13,7 +13,7 @@ class DeletingChaptersDialog(bundle: Bundle? = null) : DialogController(bundle) const val TAG = "deleting_dialog" } - override fun onCreateDialog(savedState: Bundle?): Dialog { + override fun onCreateDialog(savedViewState: Bundle?): Dialog { return MaterialDialog.Builder(activity!!) .progress(true, 0) .content(R.string.deleting) @@ -24,4 +24,4 @@ class DeletingChaptersDialog(bundle: Bundle? = null) : DialogController(bundle) showDialog(router, TAG) } -} \ No newline at end of file +} diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/DownloadChaptersDialog.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/DownloadChaptersDialog.kt index b00356a473..6b1f6077ad 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/DownloadChaptersDialog.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/DownloadChaptersDialog.kt @@ -27,6 +27,7 @@ class DownloadChaptersDialog(bundle: Bundle? = null) : DialogController(bundl ).map { activity.getString(it) } return MaterialDialog.Builder(activity) + .title(R.string.manga_download) .negativeText(android.R.string.cancel) .items(choices) .itemsCallback { _, _, position, _ -> @@ -39,4 +40,4 @@ class DownloadChaptersDialog(bundle: Bundle? = null) : DialogController(bundl fun downloadChapters(choice: Int) } -} \ No newline at end of file +} diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaInfoController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaInfoController.kt index 480f36b5d1..1e69d75489 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaInfoController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaInfoController.kt @@ -21,7 +21,9 @@ import androidx.core.content.pm.ShortcutInfoCompat import androidx.core.content.pm.ShortcutManagerCompat import androidx.core.graphics.drawable.IconCompat import com.afollestad.materialdialogs.MaterialDialog +import com.bumptech.glide.load.DataSource import com.bumptech.glide.load.engine.DiskCacheStrategy +import com.bumptech.glide.load.engine.GlideException import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.bumptech.glide.request.target.CustomTarget import com.bumptech.glide.request.transition.Transition @@ -240,11 +242,7 @@ class MangaInfoController : NucleusController(), } // If manga source is known update source TextView. - manga_source.text = if (source == null) { - view.context.getString(R.string.unknown) - } else { - source.toString() - } + manga_source.text = source?.toString() ?: view.context.getString(R.string.unknown) // Update genres list if (manga.genre.isNullOrBlank().not()) { @@ -580,17 +578,18 @@ class MangaInfoController : NucleusController(), 3 -> centerCrop().transform(MaskTransformation(R.drawable.mask_star)) } } - .into(object : CustomTarget(96, 96) { - override fun onResourceReady(resource: Bitmap, transition: Transition?) { + .listener(object : RequestListener { + override fun onResourceReady(resource: Bitmap, model: Any, target: Target, dataSource: DataSource, isFirstResource: Boolean): Boolean { createShortcut(resource) + return true } - override fun onLoadCleared(placeholder: Drawable?) { } - - override fun onLoadFailed(errorDrawable: Drawable?) { + override fun onLoadFailed(e: GlideException?, model: Any?, target: Target?, isFirstResource: Boolean): Boolean { activity?.toast(R.string.icon_creation_fail) + return true } }) + .submit() } /** diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/SetTrackStatusDialog.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/SetTrackStatusDialog.kt index ad2774c62b..8b2f929fcd 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/SetTrackStatusDialog.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/SetTrackStatusDialog.kt @@ -32,7 +32,7 @@ class SetTrackStatusDialog : DialogController override fun onCreateDialog(savedViewState: Bundle?): Dialog { val item = item - val statusList = item.service.getStatusList().orEmpty() + val statusList = item.service.getStatusList() val statusString = statusList.mapNotNull { item.service.getStatus(it) } val selectedIndex = statusList.indexOf(item.track?.status) @@ -40,10 +40,10 @@ class SetTrackStatusDialog : DialogController .title(R.string.status) .negativeText(android.R.string.cancel) .items(statusString) - .itemsCallbackSingleChoice(selectedIndex, { _, _, i, _ -> + .itemsCallbackSingleChoice(selectedIndex) { _, _, i, _ -> (targetController as? Listener)?.setStatus(item, i) true - }) + } .build() } @@ -55,4 +55,4 @@ class SetTrackStatusDialog : DialogController const val KEY_ITEM_TRACK = "SetTrackStatusDialog.item.track" } -} \ No newline at end of file +} diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackHolder.kt index 4a62c430b9..c8c9da6887 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackHolder.kt @@ -25,7 +25,7 @@ class TrackHolder(view: View, adapter: TrackAdapter) : BaseViewHolder(view) { logo_container.setBackgroundColor(item.service.getLogoColor()) if (track != null) { track_title.setTextAppearance(itemView.context, R.style.TextAppearance_Regular_Body1_Secondary) - track_title.setAllCaps(false) + track_title.isAllCaps = false track_title.text = track.title track_chapters.text = "${track.last_chapter_read}/" + if (track.total_chapters > 0) track.total_chapters else "-" diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackSearchAdapter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackSearchAdapter.kt index 6fdaf1c720..9fde89cd3c 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackSearchAdapter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackSearchAdapter.kt @@ -76,4 +76,4 @@ class TrackSearchAdapter(context: Context) } } } -} \ No newline at end of file +} diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackSearchDialog.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackSearchDialog.kt index 215ef00b94..f93293812d 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackSearchDialog.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackSearchDialog.kt @@ -50,7 +50,7 @@ class TrackSearchDialog : DialogController { service = Injekt.get().getService(bundle.getInt(KEY_SERVICE))!! } - override fun onCreateDialog(savedState: Bundle?): Dialog { + override fun onCreateDialog(savedViewState: Bundle?): Dialog { val dialog = MaterialDialog.Builder(activity!!) .customView(R.layout.track_search_dialog, false) .positiveText(android.R.string.ok) @@ -63,7 +63,7 @@ class TrackSearchDialog : DialogController { } dialogView = dialog.view - onViewCreated(dialog.view, savedState) + onViewCreated(dialog.view, savedViewState) return dialog } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/migration/MigrationPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/migration/MigrationPresenter.kt index 35b6bc06bd..e1a350c1ac 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/migration/MigrationPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/migration/MigrationPresenter.kt @@ -42,8 +42,8 @@ class MigrationPresenter( .observeOn(AndroidSchedulers.mainThread()) .doOnNext { state = state.copy(sourcesWithManga = findSourcesWithManga(it)) } .combineLatest(stateRelay.map { it.selectedSource } - .distinctUntilChanged(), - { library, source -> library to source }) + .distinctUntilChanged() + ) { library, source -> library to source } .filter { (_, source) -> source != null } .observeOn(Schedulers.io()) .map { (library, source) -> libraryToMigrationItem(library, source!!.id) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/migration/SearchController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/migration/SearchController.kt index f4710342cb..fc4b46c2b0 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/migration/SearchController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/migration/SearchController.kt @@ -147,7 +147,8 @@ class SearchController( preferences.migrateFlags().set(newValue) true - }.positiveText(R.string.migrate) + } + .positiveText(R.string.migrate) .negativeText(R.string.copy) .neutralText(android.R.string.cancel) .onPositive { _, _ -> @@ -197,4 +198,4 @@ class SearchController( } -} \ No newline at end of file +} diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt index df055837ab..332b8075e2 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt @@ -9,7 +9,6 @@ import android.content.pm.ActivityInfo import android.content.res.Configuration import android.graphics.Bitmap import android.graphics.Color -import android.os.Build import android.os.Bundle import android.view.KeyEvent import android.view.Menu @@ -68,6 +67,7 @@ import uy.kohesive.injekt.injectLazy import java.io.File import java.util.Date import java.util.concurrent.TimeUnit +import kotlin.math.abs /** * Activity containing the reader of Tachiyomi. This activity is mostly a container of the @@ -803,18 +803,22 @@ class ReaderActivity : BaseRxActivity(), */ private fun setCustomBrightnessValue(value: Int) { // Calculate and set reader brightness. - val readerBrightness = if (value > 0) { - value / 100f - } else if (value < 0) { - 0.01f - } else WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE + val readerBrightness = when { + value > 0 -> { + value / 100f + } + value < 0 -> { + 0.01f + } + else -> WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE + } window.attributes = window.attributes.apply { screenBrightness = readerBrightness } // Set black overlay visibility. if (value < 0) { brightness_overlay.visibility = View.VISIBLE - val alpha = (Math.abs(value) * 2.56).toInt() + val alpha = (abs(value) * 2.56).toInt() brightness_overlay.setBackgroundColor(Color.argb(alpha, 0, 0, 0)) } else { brightness_overlay.visibility = View.GONE diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderColorFilterSheet.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderColorFilterSheet.kt index cffba4f8bc..a69c91e181 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderColorFilterSheet.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderColorFilterSheet.kt @@ -1,12 +1,12 @@ package eu.kanade.tachiyomi.ui.reader import android.graphics.Color -import androidx.annotation.ColorInt -import com.google.android.material.bottomsheet.BottomSheetBehavior -import com.google.android.material.bottomsheet.BottomSheetDialog import android.view.View import android.view.ViewGroup import android.widget.SeekBar +import androidx.annotation.ColorInt +import com.google.android.material.bottomsheet.BottomSheetBehavior +import com.google.android.material.bottomsheet.BottomSheetDialog import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.preference.getOrDefault @@ -14,12 +14,14 @@ import eu.kanade.tachiyomi.util.plusAssign import eu.kanade.tachiyomi.widget.IgnoreFirstSpinnerListener import eu.kanade.tachiyomi.widget.SimpleSeekBarListener import kotlinx.android.synthetic.main.reader_color_filter.* -import kotlinx.android.synthetic.main.reader_color_filter_sheet.* +import kotlinx.android.synthetic.main.reader_color_filter_sheet.brightness_overlay +import kotlinx.android.synthetic.main.reader_color_filter_sheet.color_overlay import rx.Subscription import rx.android.schedulers.AndroidSchedulers import rx.subscriptions.CompositeSubscription import uy.kohesive.injekt.injectLazy import java.util.concurrent.TimeUnit +import kotlin.math.abs /** * Color filter sheet to toggle custom filter and brightness overlay. @@ -221,7 +223,7 @@ class ReaderColorFilterSheet(activity: ReaderActivity) : BottomSheetDialog(activ // Set black overlay visibility. if (value < 0) { brightness_overlay.visibility = View.VISIBLE - val alpha = (Math.abs(value) * 2.56).toInt() + val alpha = (abs(value) * 2.56).toInt() brightness_overlay.setBackgroundColor(Color.argb(alpha, 0, 0, 0)) } else { brightness_overlay.visibility = View.GONE diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderColorFilterView.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderColorFilterView.kt index 01d91a3b4a..4c833bbd08 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderColorFilterView.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderColorFilterView.kt @@ -13,7 +13,7 @@ class ReaderColorFilterView( private val colorFilterPaint: Paint = Paint() fun setFilterColor(color: Int, filterMode: Int) { - colorFilterPaint.setColor(color) + colorFilterPaint.color = color colorFilterPaint.xfermode = PorterDuffXfermode(when (filterMode) { 1 -> PorterDuff.Mode.MULTIPLY 2 -> PorterDuff.Mode.SCREEN diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderPresenter.kt index d9211b5eab..c6d138881b 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderPresenter.kt @@ -90,7 +90,7 @@ class ReaderPresenter( val chaptersForReader = if (preferences.skipRead()) { - var list = dbChapters.filter { it -> !it.read }.toMutableList() + val list = dbChapters.filter { !it.read }.toMutableList() val find = list.find { it.id == chapterId } if (find == null) { list.add(selectedChapter) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/SaveImageNotifier.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/SaveImageNotifier.kt index dfa24d7de8..b9bdaa4f15 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/SaveImageNotifier.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/SaveImageNotifier.kt @@ -60,7 +60,7 @@ class SaveImageNotifier(private val context: Context) { setAutoCancel(true) color = ContextCompat.getColor(context, R.color.colorAccentLight) // Clear old actions if they exist - if (!mActions.isEmpty()) + if (mActions.isNotEmpty()) mActions.clear() setContentIntent(NotificationHandler.openImagePendingActivity(context, file)) @@ -72,8 +72,8 @@ class SaveImageNotifier(private val context: Context) { addAction(R.drawable.ic_delete_grey_24dp, context.getString(R.string.action_delete), NotificationReceiver.deleteImagePendingBroadcast(context, file.absolutePath, notificationId)) - updateNotification() + updateNotification() } } @@ -89,7 +89,6 @@ class SaveImageNotifier(private val context: Context) { context.notificationManager.notify(notificationId, notificationBuilder.build()) } - /** * Called on error while downloading image. * @param error string containing error information. diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/DownloadPageLoader.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/DownloadPageLoader.kt index a21993a787..d3d7953be9 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/DownloadPageLoader.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/DownloadPageLoader.kt @@ -33,9 +33,9 @@ class DownloadPageLoader( return downloadManager.buildPageList(source, manga, chapter.chapter) .map { pages -> pages.map { page -> - ReaderPage(page.index, page.url, page.imageUrl, { + ReaderPage(page.index, page.url, page.imageUrl) { context.contentResolver.openInputStream(page.uri ?: Uri.EMPTY)!! - }).apply { + }.apply { status = Page.READY } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/GestureDetectorWithLongTap.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/GestureDetectorWithLongTap.kt index d941d3bc42..a96392b52f 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/GestureDetectorWithLongTap.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/GestureDetectorWithLongTap.kt @@ -5,6 +5,7 @@ import android.os.Handler import android.view.GestureDetector import android.view.MotionEvent import android.view.ViewConfiguration +import kotlin.math.abs /** * A custom gesture detector that also implements an on long tap confirmed, because the built-in @@ -45,7 +46,7 @@ open class GestureDetectorWithLongTap( } } MotionEvent.ACTION_MOVE -> { - if (Math.abs(ev.rawX - downX) > slop || Math.abs(ev.rawY - downY) > slop) { + if (abs(ev.rawX - downX) > slop || abs(ev.rawY - downY) > slop) { handler.removeCallbacks(longTapFn) } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/ReaderProgressBar.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/ReaderProgressBar.kt index a251b0c8ab..16c0ae6343 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/ReaderProgressBar.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/ReaderProgressBar.kt @@ -16,6 +16,7 @@ import android.view.animation.LinearInterpolator import android.view.animation.RotateAnimation import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.util.getResourceColor +import kotlin.math.min /** * A custom progress bar that always rotates while being determinate. By always rotating we give @@ -75,7 +76,7 @@ class ReaderProgressBar @JvmOverloads constructor( override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) { super.onLayout(changed, left, top, right, bottom) - val diameter = Math.min(width, height) + val diameter = min(width, height) val thickness = diameter / 10f val pad = thickness / 2f ovalRect.set(pad, pad, diameter - pad, diameter - pad) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonRecyclerView.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonRecyclerView.kt index 5d68c178e9..2744d91d6e 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonRecyclerView.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonRecyclerView.kt @@ -3,17 +3,16 @@ package eu.kanade.tachiyomi.ui.reader.viewer.webtoon import android.animation.Animator import android.animation.AnimatorSet import android.animation.ValueAnimator -import android.annotation.TargetApi import android.content.Context -import android.os.Build -import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.RecyclerView import android.util.AttributeSet import android.view.HapticFeedbackConstants import android.view.MotionEvent import android.view.ViewConfiguration import android.view.animation.DecelerateInterpolator +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView import eu.kanade.tachiyomi.ui.reader.viewer.GestureDetectorWithLongTap +import kotlin.math.abs /** * Implementation of a [RecyclerView] used by the webtoon reader. @@ -58,7 +57,6 @@ open class WebtoonRecyclerView @JvmOverloads constructor( firstVisibleItemPosition = layoutManager.findFirstVisibleItemPosition() } - @TargetApi(Build.VERSION_CODES.KITKAT) override fun onScrollStateChanged(state: Int) { super.onScrollStateChanged(state) val layoutManager = layoutManager @@ -270,7 +268,7 @@ open class WebtoonRecyclerView @JvmOverloads constructor( if (!isZoomDragging && currentScale > 1f) { var startScroll = false - if (Math.abs(dx) > touchSlop) { + if (abs(dx) > touchSlop) { if (dx < 0) { dx += touchSlop } else { @@ -278,7 +276,7 @@ open class WebtoonRecyclerView @JvmOverloads constructor( } startScroll = true } - if (Math.abs(dy) > touchSlop) { + if (abs(dy) > touchSlop) { if (dy < 0) { dy += touchSlop } else { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/recent_updates/DeletingChaptersDialog.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/recent_updates/DeletingChaptersDialog.kt index 8bb9d57b99..4d310c7e30 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/recent_updates/DeletingChaptersDialog.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/recent_updates/DeletingChaptersDialog.kt @@ -13,7 +13,7 @@ class DeletingChaptersDialog(bundle: Bundle? = null) : DialogController(bundle) const val TAG = "deleting_dialog" } - override fun onCreateDialog(savedState: Bundle?): Dialog { + override fun onCreateDialog(savedViewState: Bundle?): Dialog { return MaterialDialog.Builder(activity!!) .progress(true, 0) .content(R.string.deleting) @@ -24,4 +24,4 @@ class DeletingChaptersDialog(bundle: Bundle? = null) : DialogController(bundle) showDialog(router, TAG) } -} \ No newline at end of file +} diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/recent_updates/RecentChaptersPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/recent_updates/RecentChaptersPresenter.kt index bcf418761d..b4e99693c3 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/recent_updates/RecentChaptersPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/recent_updates/RecentChaptersPresenter.kt @@ -38,8 +38,9 @@ class RecentChaptersPresenter( .subscribeLatestCache(RecentChaptersController::onNextRecentChapters) getChapterStatusObservable() - .subscribeLatestCache(RecentChaptersController::onChapterStatusChange, - { _, error -> Timber.e(error) }) + .subscribeLatestCache(RecentChaptersController::onChapterStatusChange) { + _, error -> Timber.e(error) + } } /** diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/AnilistLoginActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/AnilistLoginActivity.kt index 31c081a2b3..1cb43bed98 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/AnilistLoginActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/AnilistLoginActivity.kt @@ -31,7 +31,7 @@ class AnilistLoginActivity : AppCompatActivity() { .observeOn(AndroidSchedulers.mainThread()) .subscribe({ returnToSettings() - }, { _ -> + }, { returnToSettings() }) } else { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/PreferenceDSL.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/PreferenceDSL.kt index 6f77383aac..a92e603d3e 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/PreferenceDSL.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/PreferenceDSL.kt @@ -63,14 +63,16 @@ inline fun

PreferenceGroup.initThenAdd(p: P, block: P.() -> Uni return p.apply { block() this.isIconSpaceReserved = false - addPreference(this) } + addPreference(this) + } } inline fun

PreferenceGroup.addThenInit(p: P, block: P.() -> Unit): P { return p.apply { this.isIconSpaceReserved = false addPreference(this) - block() } + block() + } } inline fun Preference.onClick(crossinline block: () -> Unit) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsBackupController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsBackupController.kt index 9977e9f465..b0e4c7d655 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsBackupController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsBackupController.kt @@ -5,10 +5,9 @@ import android.app.Activity import android.app.Dialog import android.content.* import android.net.Uri -import android.os.Build import android.os.Bundle -import androidx.preference.PreferenceScreen import android.view.View +import androidx.preference.PreferenceScreen import com.afollestad.materialdialogs.MaterialDialog import com.hippo.unifile.UniFile import eu.kanade.tachiyomi.R @@ -106,21 +105,12 @@ class SettingsBackupController : SettingsController() { onClick { val currentDir = preferences.backupsDirectory().getOrDefault() try{ - val intent = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { - // Custom dir selected, open directory selector - preferences.context.getFilePicker(currentDir) - } else { - Intent(Intent.ACTION_OPEN_DOCUMENT_TREE) - } - + val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE) startActivityForResult(intent, CODE_BACKUP_DIR) } catch (e: ActivityNotFoundException){ - //Fall back to custom picker on error - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){ - startActivityForResult(preferences.context.getFilePicker(currentDir), CODE_BACKUP_DIR) - } + // Fall back to custom picker on error + startActivityForResult(preferences.context.getFilePicker(currentDir), CODE_BACKUP_DIR) } - } preferences.backupsDirectory().asObservable() @@ -154,38 +144,32 @@ class SettingsBackupController : SettingsController() { // Get uri of backup folder. val uri = data.data - // Get UriPermission so it's possible to write files post kitkat. - if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) { - val flags = Intent.FLAG_GRANT_READ_URI_PERMISSION or - Intent.FLAG_GRANT_WRITE_URI_PERMISSION - if (uri != null) + // Get UriPermission so it's possible to write files + val flags = Intent.FLAG_GRANT_READ_URI_PERMISSION or + Intent.FLAG_GRANT_WRITE_URI_PERMISSION + + if (uri != null) { activity.contentResolver.takePersistableUriPermission(uri, flags) } - // Set backup Uri. + // Set backup Uri preferences.backupsDirectory().set(uri.toString()) } CODE_BACKUP_CREATE -> if (data != null && resultCode == Activity.RESULT_OK) { val activity = activity ?: return - val uri = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { - val dir = data.data?.path - val file = File(dir, Backup.getDefaultFilename()) - Uri.fromFile(file) - } else { - val uri = data.data - val flags = Intent.FLAG_GRANT_READ_URI_PERMISSION or - Intent.FLAG_GRANT_WRITE_URI_PERMISSION + val uri = data.data + val flags = Intent.FLAG_GRANT_READ_URI_PERMISSION or + Intent.FLAG_GRANT_WRITE_URI_PERMISSION - if (uri != null) + if (uri != null) { activity.contentResolver.takePersistableUriPermission(uri, flags) - val file = UniFile.fromUri(activity, uri) - - file.uri } + val file = UniFile.fromUri(activity, uri) + CreatingBackupDialog().showDialog(router, TAG_CREATING_BACKUP_DIALOG) - BackupCreateService.makeBackup(activity, uri, backupFlags) + BackupCreateService.makeBackup(activity, file.uri, backupFlags) } CODE_BACKUP_RESTORE -> if (data != null && resultCode == Activity.RESULT_OK) { val uri = data.data @@ -203,25 +187,17 @@ class SettingsBackupController : SettingsController() { val currentDir = preferences.backupsDirectory().getOrDefault() try { - // If API is lower than Lollipop use custom picker - val intent = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { - preferences.context.getFilePicker(currentDir) - } else { - // Use Androids build in file creator - Intent(Intent.ACTION_CREATE_DOCUMENT) + // Use Android's built-in file creator + val intent = Intent(Intent.ACTION_CREATE_DOCUMENT) .addCategory(Intent.CATEGORY_OPENABLE) .setType("application/*") .putExtra(Intent.EXTRA_TITLE, Backup.getDefaultFilename()) - } startActivityForResult(intent, CODE_BACKUP_CREATE) } catch (e: ActivityNotFoundException) { // Handle errors where the android ROM doesn't support the built in picker - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){ - startActivityForResult(preferences.context.getFilePicker(currentDir), CODE_BACKUP_CREATE) - } + startActivityForResult(preferences.context.getFilePicker(currentDir), CODE_BACKUP_CREATE) } - } class CreateBackupDialog : DialogController() { @@ -236,7 +212,7 @@ class SettingsBackupController : SettingsController() { .content(R.string.backup_choice) .items(options) .itemsDisabledIndices(0) - .itemsCallbackMultiChoice(arrayOf(0, 1, 2, 3, 4), { _, positions, _ -> + .itemsCallbackMultiChoice(arrayOf(0, 1, 2, 3, 4)) { _, positions, _ -> var flags = 0 for (i in 1 until positions.size) { when (positions[i]) { @@ -249,7 +225,7 @@ class SettingsBackupController : SettingsController() { (targetController as? SettingsBackupController)?.createBackup(flags) true - }) + } .positiveText(R.string.action_create) .negativeText(android.R.string.cancel) .build() @@ -395,7 +371,7 @@ class SettingsBackupController : SettingsController() { .negativeText(R.string.action_open_log) .onNegative { _, _ -> val context = applicationContext ?: return@onNegative - if (!path!!.isEmpty()) { + if (!path.isNullOrEmpty()) { val destFile = File(path, file) val uri = destFile.getUriCompat(context) val sendIntent = Intent(Intent.ACTION_VIEW).apply { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsDownloadController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsDownloadController.kt index 20a56778c1..51e313e3c9 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsDownloadController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsDownloadController.kt @@ -5,7 +5,6 @@ import android.app.Dialog import android.content.ActivityNotFoundException import android.content.Intent import android.net.Uri -import android.os.Build import android.os.Bundle import android.os.Environment import androidx.core.content.ContextCompat @@ -107,19 +106,16 @@ class SettingsDownloadController : SettingsController() { override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { when (requestCode) { - DOWNLOAD_DIR_PRE_L -> if (data != null && resultCode == Activity.RESULT_OK) { - val uri = Uri.fromFile(File(data.data?.path)) - preferences.downloadsDirectory().set(uri?.toString() ?: "") - } - DOWNLOAD_DIR_L -> if (data != null && resultCode == Activity.RESULT_OK) { + DOWNLOAD_DIR -> if (data != null && resultCode == Activity.RESULT_OK) { val context = applicationContext ?: return val uri = data.data val flags = Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION - @Suppress("NewApi") - if (uri != null) + if (uri != null) { + @Suppress("NewApi") context.contentResolver.takePersistableUriPermission(uri, flags) + } val file = UniFile.fromUri(context, uri) preferences.downloadsDirectory().set(file.uri.toString()) @@ -133,19 +129,11 @@ class SettingsDownloadController : SettingsController() { } fun customDirectorySelected(currentDir: String) { - - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { - startActivityForResult(preferences.context.getFilePicker(currentDir), DOWNLOAD_DIR_PRE_L) - } else { - val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE) - try { - startActivityForResult(intent, DOWNLOAD_DIR_L) - } catch (e: ActivityNotFoundException) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - startActivityForResult(preferences.context.getFilePicker(currentDir), DOWNLOAD_DIR_L) - } - } - + val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE) + try { + startActivityForResult(intent, DOWNLOAD_DIR) + } catch (e: ActivityNotFoundException) { + startActivityForResult(preferences.context.getFilePicker(currentDir), DOWNLOAD_DIR) } } @@ -161,7 +149,7 @@ class SettingsDownloadController : SettingsController() { return MaterialDialog.Builder(activity) .items(externalDirs) - .itemsCallbackSingleChoice(selectedIndex, { _, _, which, text -> + .itemsCallbackSingleChoice(selectedIndex) { _, _, which, text -> val target = targetController as? SettingsDownloadController if (which == externalDirs.lastIndex) { target?.customDirectorySelected(currentDir) @@ -169,7 +157,7 @@ class SettingsDownloadController : SettingsController() { target?.predefinedDirectorySelected(text.toString()) } true - }) + } .build() } @@ -184,7 +172,6 @@ class SettingsDownloadController : SettingsController() { } private companion object { - const val DOWNLOAD_DIR_PRE_L = 103 - const val DOWNLOAD_DIR_L = 104 + const val DOWNLOAD_DIR = 104 } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/ChapterSourceSync.kt b/app/src/main/java/eu/kanade/tachiyomi/util/ChapterSourceSync.kt index 1ee3ee010c..b8dc83b01c 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/ChapterSourceSync.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/ChapterSourceSync.kt @@ -97,7 +97,7 @@ fun syncChaptersWithSource(db: DatabaseHelper, db.inTransaction { val deletedChapterNumbers = TreeSet() val deletedReadChapterNumbers = TreeSet() - if (!toDelete.isEmpty()) { + if (toDelete.isNotEmpty()) { for (c in toDelete) { if (c.read) { deletedReadChapterNumbers.add(c.chapter_number) @@ -107,7 +107,7 @@ fun syncChaptersWithSource(db: DatabaseHelper, db.deleteChapters(toDelete).executeAsBlocking() } - if (!toAdd.isEmpty()) { + if (toAdd.isNotEmpty()) { // Set the date fetch for new items in reverse order to allow another sorting method. // Sources MUST return the chapters from most to less recent, which is common. var now = Date().time @@ -126,7 +126,7 @@ fun syncChaptersWithSource(db: DatabaseHelper, db.insertChapters(toAdd).executeAsBlocking() } - if (!toChange.isEmpty()) { + if (toChange.isNotEmpty()) { db.insertChapters(toChange).executeAsBlocking() } @@ -139,8 +139,8 @@ fun syncChaptersWithSource(db: DatabaseHelper, manga.last_update = if (dateFetch == 0L) Date().time else dateFetch db.updateLastUpdated(manga).executeAsBlocking() } - return Pair(toAdd.subtract(readded).toList(), toDelete.subtract(readded).toList()) + return Pair(toAdd.subtract(readded).toList(), toDelete.subtract(readded).toList()) } //checks if the chapter in db needs updated @@ -148,4 +148,4 @@ private fun shouldUpdateDbChapter(dbChapter: Chapter, sourceChapter: SChapter): return dbChapter.scanlator != sourceChapter.scanlator || dbChapter.name != sourceChapter.name || dbChapter.date_upload != sourceChapter.date_upload || dbChapter.chapter_number != sourceChapter.chapter_number -} \ No newline at end of file +} diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/DiskUtil.kt b/app/src/main/java/eu/kanade/tachiyomi/util/DiskUtil.kt index 4f0375e423..e089c9ebc9 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/DiskUtil.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/DiskUtil.kt @@ -3,7 +3,6 @@ package eu.kanade.tachiyomi.util import android.content.Context import android.content.Intent import android.net.Uri -import android.os.Build import android.os.Environment import androidx.core.content.ContextCompat import androidx.core.os.EnvironmentCompat @@ -45,13 +44,6 @@ object DiskUtil { } } - if (Build.VERSION.SDK_INT < 21) { - val extStorages = System.getenv("SECONDARY_STORAGE") - if (extStorages != null) { - directories += extStorages.split(":").map(::File) - } - } - return directories } @@ -79,11 +71,7 @@ object DiskUtil { * Scans the given file so that it can be shown in gallery apps, for example. */ fun scanMedia(context: Context, uri: Uri) { - val action = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { - Intent.ACTION_MEDIA_MOUNTED - } else { - Intent.ACTION_MEDIA_SCANNER_SCAN_FILE - } + val action = Intent.ACTION_MEDIA_SCANNER_SCAN_FILE val mediaScanIntent = Intent(action) mediaScanIntent.data = uri context.sendBroadcast(mediaScanIntent) diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/ImageUtil.kt b/app/src/main/java/eu/kanade/tachiyomi/util/ImageUtil.kt index 68b6c7730b..6281f31a1e 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/ImageUtil.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/ImageUtil.kt @@ -216,7 +216,7 @@ object ImageUtil { } private fun ByteArray.compareWith(magic: ByteArray): Boolean { - for (i in 0 until magic.size) { + for (i in magic.indices) { if (this[i] != magic[i]) return false } return true @@ -224,7 +224,7 @@ object ImageUtil { private fun charByteArrayOf(vararg bytes: Int): ByteArray { return ByteArray(bytes.size).apply { - for (i in 0 until bytes.size) { + for (i in bytes.indices) { set(i, bytes[i].toByte()) } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/LocaleHelper.kt b/app/src/main/java/eu/kanade/tachiyomi/util/LocaleHelper.kt index 0cb6715f75..80794e6e73 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/LocaleHelper.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/LocaleHelper.kt @@ -4,12 +4,11 @@ import android.app.Application import android.content.Context import android.content.res.Configuration import android.os.Build -import android.os.LocaleList import android.view.ContextThemeWrapper import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.preference.PreferencesHelper import uy.kohesive.injekt.injectLazy -import java.util.* +import java.util.Locale /** * Utility class to change the application's language in runtime. @@ -43,7 +42,7 @@ object LocaleHelper { * * @param pref the string value stored in preferences. */ - fun getLocaleFromString(pref: String): Locale? { + fun getLocaleFromString(pref: String?): Locale? { if (pref.isNullOrEmpty()) { return null } @@ -90,7 +89,7 @@ object LocaleHelper { * Updates the app's language to an activity. */ fun updateConfiguration(wrapper: ContextThemeWrapper) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 && appLocale != null) { + if (appLocale != null) { val config = Configuration(preferences.context.resources.configuration) config.setLocale(appLocale) wrapper.applyOverrideConfiguration(config) @@ -138,7 +137,7 @@ object LocaleHelper { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) { newConfig.setLocale(locale) } else { - newConfig.setLocales(LocaleList(locale)) + newConfig.setLocale(locale) } return newConfig } diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/SharedData.kt b/app/src/main/java/eu/kanade/tachiyomi/util/SharedData.kt index 98d10b2d47..5ac2f45ebb 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/SharedData.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/SharedData.kt @@ -22,7 +22,7 @@ object SharedData { * @param data the object to put. */ fun put(data: T) { - map.put(data.javaClass, data) + map[data.javaClass] = data } /** diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/StringExtensions.kt b/app/src/main/java/eu/kanade/tachiyomi/util/StringExtensions.kt index 7f7ad4d2b7..6a21dd8fa9 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/StringExtensions.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/StringExtensions.kt @@ -1,6 +1,6 @@ package eu.kanade.tachiyomi.util -import java.lang.Math.floor +import kotlin.math.floor /** * Replaces the given string to have at most [count] characters using [replacement] at its end. @@ -29,4 +29,4 @@ fun String.truncateCenter(count: Int, replacement: String = "..."): String{ val pieceLength:Int = floor((count - replacement.length).div(2.0)).toInt() return "${ take(pieceLength) }$replacement${ takeLast(pieceLength) }" -} \ No newline at end of file +} diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/ViewExtensions.kt b/app/src/main/java/eu/kanade/tachiyomi/util/ViewExtensions.kt index 3f9fa346c9..2b69ea225e 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/ViewExtensions.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/ViewExtensions.kt @@ -113,7 +113,7 @@ inline fun View.visibleIf(block: () -> Boolean) { * @param random random color */ fun View.getRound(text: String, random : Boolean = true): TextDrawable { - val size = Math.min(this.width, this.height) + val size = min(this.width, this.height) return TextDrawable.builder() .beginConfig() .width(size) diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/WebViewClientCompat.kt b/app/src/main/java/eu/kanade/tachiyomi/util/WebViewClientCompat.kt index 977dca5e6d..911a40714c 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/WebViewClientCompat.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/WebViewClientCompat.kt @@ -36,7 +36,6 @@ abstract class WebViewClientCompat : WebViewClient() { return shouldOverrideUrlCompat(view, url) } - @TargetApi(Build.VERSION_CODES.LOLLIPOP) final override fun shouldInterceptRequest( view: WebView, request: WebResourceRequest diff --git a/app/src/main/java/eu/kanade/tachiyomi/widget/AutofitRecyclerView.kt b/app/src/main/java/eu/kanade/tachiyomi/widget/AutofitRecyclerView.kt index 4a0b586f07..738e2e70f9 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/widget/AutofitRecyclerView.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/widget/AutofitRecyclerView.kt @@ -1,9 +1,10 @@ package eu.kanade.tachiyomi.widget import android.content.Context +import android.util.AttributeSet import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.RecyclerView -import android.util.AttributeSet +import kotlin.math.max class AutofitRecyclerView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) : androidx.recyclerview.widget.RecyclerView(context, attrs) { @@ -37,7 +38,7 @@ class AutofitRecyclerView @JvmOverloads constructor(context: Context, attrs: Att override fun onMeasure(widthSpec: Int, heightSpec: Int) { super.onMeasure(widthSpec, heightSpec) if (spanCount == 0 && columnWidth > 0) { - val count = Math.max(1, measuredWidth / columnWidth) + val count = max(1, measuredWidth / columnWidth) spanCount = count } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/widget/CustomLayoutPicker.kt b/app/src/main/java/eu/kanade/tachiyomi/widget/CustomLayoutPicker.kt index 249948a033..bef33dc26e 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/widget/CustomLayoutPicker.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/widget/CustomLayoutPicker.kt @@ -21,13 +21,13 @@ class CustomLayoutPickerActivity : FilePickerActivity() { } class CustomLayoutFilePickerFragment : FilePickerFragment() { - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): androidx.recyclerview.widget.RecyclerView.ViewHolder { - when (viewType) { + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return when (viewType) { LogicHandler.VIEWTYPE_DIR -> { val view = parent.inflate(R.layout.common_listitem_dir) - return DirViewHolder(view) + DirViewHolder(view) } - else -> return super.onCreateViewHolder(parent, viewType) + else -> super.onCreateViewHolder(parent, viewType) } } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/widget/ElevationAppBarLayout.kt b/app/src/main/java/eu/kanade/tachiyomi/widget/ElevationAppBarLayout.kt index 32a959e663..8ae15900f2 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/widget/ElevationAppBarLayout.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/widget/ElevationAppBarLayout.kt @@ -16,32 +16,26 @@ class ElevationAppBarLayout @JvmOverloads constructor( private var origStateAnimator: StateListAnimator? = null init { - if (Build.VERSION.SDK_INT >= 21) { - origStateAnimator = stateListAnimator - } + origStateAnimator = stateListAnimator } fun enableElevation() { - if (Build.VERSION.SDK_INT >= 21) { - stateListAnimator = origStateAnimator - } + stateListAnimator = origStateAnimator } fun disableElevation() { - if (Build.VERSION.SDK_INT >= 21) { - stateListAnimator = StateListAnimator().apply { - val objAnimator = ObjectAnimator.ofFloat(this, "elevation", 0f) + stateListAnimator = StateListAnimator().apply { + val objAnimator = ObjectAnimator.ofFloat(this, "elevation", 0f) - // Enabled and collapsible, but not collapsed means not elevated - addState(intArrayOf(android.R.attr.enabled, R.attr.state_collapsible, -R.attr.state_collapsed), - objAnimator) + // Enabled and collapsible, but not collapsed means not elevated + addState(intArrayOf(android.R.attr.enabled, R.attr.state_collapsible, -R.attr.state_collapsed), + objAnimator) - // Default enabled state - addState(intArrayOf(android.R.attr.enabled), objAnimator) + // Default enabled state + addState(intArrayOf(android.R.attr.enabled), objAnimator) - // Disabled state - addState(IntArray(0), objAnimator) - } + // Disabled state + addState(IntArray(0), objAnimator) } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/widget/ExtendedNavigationView.kt b/app/src/main/java/eu/kanade/tachiyomi/widget/ExtendedNavigationView.kt index 8f2a4589c8..bfca88684b 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/widget/ExtendedNavigationView.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/widget/ExtendedNavigationView.kt @@ -13,7 +13,7 @@ import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.util.getResourceColor /** - * An alternative implementation of [android.support.design.widget.NavigationView], without menu + * An alternative implementation of [com.google.android.material.navigation.NavigationView], without menu * inflation and allowing customizable items (multiple selections, custom views, etc). */ open class ExtendedNavigationView @JvmOverloads constructor( @@ -210,8 +210,7 @@ open class ExtendedNavigationView @JvmOverloads constructor( @CallSuper override fun getItemViewType(position: Int): Int { - val item = items[position] - return when (item) { + return when (items[position]) { is Item.Header -> VIEW_TYPE_HEADER is Item.Separator -> VIEW_TYPE_SEPARATOR is Item.Radio -> VIEW_TYPE_RADIO diff --git a/app/src/main/java/eu/kanade/tachiyomi/widget/FABAnimationBase.kt b/app/src/main/java/eu/kanade/tachiyomi/widget/FABAnimationBase.kt deleted file mode 100644 index 42babe98e5..0000000000 --- a/app/src/main/java/eu/kanade/tachiyomi/widget/FABAnimationBase.kt +++ /dev/null @@ -1,34 +0,0 @@ -package eu.kanade.tachiyomi.widget - -import androidx.coordinatorlayout.widget.CoordinatorLayout -import com.google.android.material.floatingactionbutton.FloatingActionButton -import androidx.core.view.ViewCompat -import android.view.View - -abstract class FABAnimationBase : FloatingActionButton.Behavior() { - - var isAnimatingOut = false - - override fun onStartNestedScroll(coordinatorLayout: CoordinatorLayout, child: FloatingActionButton, - directTargetChild: View, target: View, axes: Int, type: Int): Boolean { - // Ensure we react to vertical scrolling - return axes == ViewCompat.SCROLL_AXIS_VERTICAL || - super.onStartNestedScroll(coordinatorLayout, child, directTargetChild, target, axes, type) - } - - override fun onNestedScroll(coordinatorLayout: CoordinatorLayout, child: FloatingActionButton, - target: View, dxConsumed: Int, dyConsumed: Int, dxUnconsumed: Int, - dyUnconsumed: Int, type: Int) { - super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, type) - if (dyConsumed > 0 && !isAnimatingOut && child.visibility == View.VISIBLE) { - // User scrolled down and the FAB is currently visible -> hide the FAB - animateOut(child) - } else if (dyConsumed < 0 && child.visibility != View.VISIBLE) { - // User scrolled up and the FAB is currently not visible -> show the FAB - animateIn(child) - } - } - - abstract fun animateOut(button: FloatingActionButton) - abstract fun animateIn(button: FloatingActionButton) -} diff --git a/app/src/main/java/eu/kanade/tachiyomi/widget/FABAnimationUpDown.kt b/app/src/main/java/eu/kanade/tachiyomi/widget/FABAnimationUpDown.kt deleted file mode 100644 index f8e732b3d3..0000000000 --- a/app/src/main/java/eu/kanade/tachiyomi/widget/FABAnimationUpDown.kt +++ /dev/null @@ -1,87 +0,0 @@ -package eu.kanade.tachiyomi.widget - -import android.content.Context -import android.content.res.Configuration -import android.graphics.Rect -import android.util.AttributeSet -import android.view.View -import android.view.animation.Animation -import android.view.animation.AnimationUtils -import androidx.coordinatorlayout.widget.CoordinatorLayout -import androidx.interpolator.view.animation.FastOutSlowInInterpolator -import com.google.android.material.floatingactionbutton.FloatingActionButton -import com.google.android.material.snackbar.Snackbar -import eu.kanade.tachiyomi.R -import kotlin.math.min - -@Suppress("unused", "UNUSED_PARAMETER") -class FABAnimationUpDown @JvmOverloads constructor(ctx: Context, attrs: AttributeSet? = null) : - FABAnimationBase() { - - private val INTERPOLATOR = FastOutSlowInInterpolator() - - private val outAnimation by lazy { - AnimationUtils.loadAnimation(ctx, R.anim.fab_hide_to_bottom).apply { - duration = 200 - interpolator = INTERPOLATOR - } - } - private val inAnimation by lazy { - AnimationUtils.loadAnimation(ctx, R.anim.fab_show_from_bottom).apply { - duration = 200 - interpolator = INTERPOLATOR - } - } - - override fun animateOut(button: FloatingActionButton) { - outAnimation.setAnimationListener(object : Animation.AnimationListener { - override fun onAnimationStart(animation: Animation) { - isAnimatingOut = true - } - - override fun onAnimationEnd(animation: Animation) { - isAnimatingOut = false - button.visibility = View.INVISIBLE - } - - override fun onAnimationRepeat(animation: Animation) { - } - }) - button.startAnimation(outAnimation) - } - - override fun animateIn(button: FloatingActionButton) { - button.visibility = View.VISIBLE - button.startAnimation(inAnimation) - } - - override fun onDependentViewChanged(parent: CoordinatorLayout, child: FloatingActionButton, dependency: View): Boolean { - if (isTablet(child.context)) return true - val translationY = getFabTranslationYForSnackbar(parent, child) - child.translationY = translationY - return true - } - - private fun isTablet(context: Context): Boolean { - return (context.resources.configuration.screenLayout and Configuration - .SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_LARGE - } - - private fun getFabTranslationYForSnackbar(parent: CoordinatorLayout, fab: - FloatingActionButton): Float { - var minOffset = 0f - val dependencies = parent.getDependencies(fab) - for (i in 0 until dependencies.size) { - val view = dependencies[i] - if (view is Snackbar.SnackbarLayout) { - minOffset = min(minOffset, view.translationY - view.height) - } - } - return minOffset - } - - override fun getInsetDodgeRect(parent: CoordinatorLayout, child: FloatingActionButton, rect: Rect): Boolean { - rect.set(child.left, child.top + 100, child.right, child.bottom - 1000) - return true - } -} diff --git a/app/src/main/java/eu/kanade/tachiyomi/widget/NegativeSeekBar.kt b/app/src/main/java/eu/kanade/tachiyomi/widget/NegativeSeekBar.kt index 807435b4e5..30e0eac7c5 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/widget/NegativeSeekBar.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/widget/NegativeSeekBar.kt @@ -5,6 +5,7 @@ import android.os.Parcelable import android.util.AttributeSet import android.widget.SeekBar import eu.kanade.tachiyomi.R +import kotlin.math.abs class NegativeSeekBar @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) : @@ -28,21 +29,21 @@ class NegativeSeekBar @JvmOverloads constructor(context: Context, attrs: Attribu super.setOnSeekBarChangeListener(object : OnSeekBarChangeListener { override fun onProgressChanged(seekBar: SeekBar?, value: Int, fromUser: Boolean) { - listener?.let { it.onProgressChanged(seekBar, minValue + value, fromUser) } + listener?.onProgressChanged(seekBar, minValue + value, fromUser) } override fun onStartTrackingTouch(p0: SeekBar?) { - listener?.let { it.onStartTrackingTouch(p0) } + listener?.onStartTrackingTouch(p0) } override fun onStopTrackingTouch(p0: SeekBar?) { - listener?.let { it.onStopTrackingTouch(p0) } + listener?.onStopTrackingTouch(p0) } }) } override fun setProgress(progress: Int) { - super.setProgress(Math.abs(minValue) + progress) + super.setProgress(abs(minValue) + progress) } fun setMinSeek(minValue: Int) { @@ -66,4 +67,4 @@ class NegativeSeekBar @JvmOverloads constructor(context: Context, attrs: Attribu super.setProgress(origProgress) } -} \ No newline at end of file +} diff --git a/app/src/main/java/eu/kanade/tachiyomi/widget/PTSansTextView.kt b/app/src/main/java/eu/kanade/tachiyomi/widget/PTSansTextView.kt index 4152f17670..8bbf4ad243 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/widget/PTSansTextView.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/widget/PTSansTextView.kt @@ -30,7 +30,7 @@ class PTSansTextView @JvmOverloads constructor(context: Context, attrs: Attribut Typeface.createFromAsset(context.assets, when (typeface) { PTSANS_NARROW -> "fonts/PTSans-Narrow.ttf" PTSANS_NARROW_BOLD -> "fonts/PTSans-NarrowBold.ttf" - else -> throw IllegalArgumentException("Font not found " + typeface) + else -> throw IllegalArgumentException("Font not found $typeface") }) }) diff --git a/app/src/main/java/eu/kanade/tachiyomi/widget/RevealAnimationView.kt b/app/src/main/java/eu/kanade/tachiyomi/widget/RevealAnimationView.kt index f5718e75df..a78a678034 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/widget/RevealAnimationView.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/widget/RevealAnimationView.kt @@ -2,14 +2,11 @@ package eu.kanade.tachiyomi.widget import android.animation.Animator import android.animation.AnimatorListenerAdapter -import android.annotation.TargetApi import android.content.Context -import android.os.Build import android.util.AttributeSet import android.view.View import android.view.ViewAnimationUtils -@TargetApi(Build.VERSION_CODES.LOLLIPOP) class RevealAnimationView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) : View(context, attrs) { @@ -21,28 +18,25 @@ class RevealAnimationView @JvmOverloads constructor(context: Context, attrs: Att * @param initialRadius size of radius of animation */ fun hideRevealEffect(centerX: Int, centerY: Int, initialRadius: Int) { - if (Build.VERSION.SDK_INT >= 21) { + // Make the view visible. + this.visibility = View.VISIBLE - // Make the view visible. - this.visibility = View.VISIBLE + // Create the animation (the final radius is zero). + val anim = ViewAnimationUtils.createCircularReveal( + this, centerX, centerY, initialRadius.toFloat(), 0f) - // Create the animation (the final radius is zero). - val anim = ViewAnimationUtils.createCircularReveal( - this, centerX, centerY, initialRadius.toFloat(), 0f) + // Set duration of animation. + anim.duration = 500 - // Set duration of animation. - anim.duration = 500 + // make the view invisible when the animation is done + anim.addListener(object : AnimatorListenerAdapter() { + override fun onAnimationEnd(animation: Animator) { + super.onAnimationEnd(animation) + this@RevealAnimationView.visibility = View.INVISIBLE + } + }) - // make the view invisible when the animation is done - anim.addListener(object : AnimatorListenerAdapter() { - override fun onAnimationEnd(animation: Animator) { - super.onAnimationEnd(animation) - this@RevealAnimationView.visibility = View.INVISIBLE - } - }) - - anim.start() - } + anim.start() } /** @@ -55,25 +49,20 @@ class RevealAnimationView @JvmOverloads constructor(context: Context, attrs: Att * @return sdk version lower then 21 */ fun showRevealEffect(centerX: Int, centerY: Int, listener: Animator.AnimatorListener): Boolean { - if (Build.VERSION.SDK_INT >= 21) { + this.visibility = View.VISIBLE - this.visibility = View.VISIBLE + val height = this.height - val height = this.height + // Create animation + val anim = ViewAnimationUtils.createCircularReveal( + this, centerX, centerY, 0f, height.toFloat()) - // Create animation - val anim = ViewAnimationUtils.createCircularReveal( - this, centerX, centerY, 0f, height.toFloat()) + // Set duration of animation + anim.duration = 350 - // Set duration of animation - anim.duration = 350 - - anim.addListener(listener) - anim.start() - return true - } - return false + anim.addListener(listener) + anim.start() + return true } - } diff --git a/app/src/main/java/eu/kanade/tachiyomi/widget/SimpleNavigationView.kt b/app/src/main/java/eu/kanade/tachiyomi/widget/SimpleNavigationView.kt index 0b189a9757..0c95c17eae 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/widget/SimpleNavigationView.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/widget/SimpleNavigationView.kt @@ -2,18 +2,19 @@ package eu.kanade.tachiyomi.widget import android.annotation.SuppressLint import android.content.Context -import com.google.android.material.R -import com.google.android.material.textfield.TextInputLayout -import androidx.core.view.ViewCompat -import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.RecyclerView -import androidx.appcompat.widget.TintTypedArray import android.util.AttributeSet import android.view.View import android.view.ViewGroup import android.widget.* +import androidx.appcompat.widget.TintTypedArray +import androidx.core.view.ViewCompat +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.google.android.material.R import com.google.android.material.internal.ScrimInsetsFrameLayout +import com.google.android.material.textfield.TextInputLayout import eu.kanade.tachiyomi.util.inflate +import kotlin.math.min import eu.kanade.tachiyomi.R as TR @Suppress("LeakingThis") @@ -67,7 +68,7 @@ open class SimpleNavigationView @JvmOverloads constructor( override fun onMeasure(widthSpec: Int, heightSpec: Int) { val width = when (MeasureSpec.getMode(widthSpec)) { MeasureSpec.AT_MOST -> MeasureSpec.makeMeasureSpec( - Math.min(MeasureSpec.getSize(widthSpec), maxWidth), MeasureSpec.EXACTLY) + min(MeasureSpec.getSize(widthSpec), maxWidth), MeasureSpec.EXACTLY) MeasureSpec.UNSPECIFIED -> MeasureSpec.makeMeasureSpec(maxWidth, MeasureSpec.EXACTLY) else -> widthSpec } diff --git a/app/src/main/java/eu/kanade/tachiyomi/widget/preference/LoginDialogPreference.kt b/app/src/main/java/eu/kanade/tachiyomi/widget/preference/LoginDialogPreference.kt index b27c77c62b..25e99ef286 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/widget/preference/LoginDialogPreference.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/widget/preference/LoginDialogPreference.kt @@ -25,7 +25,7 @@ abstract class LoginDialogPreference(bundle: Bundle? = null) : DialogController( var requestSubscription: Subscription? = null - override fun onCreateDialog(savedState: Bundle?): Dialog { + override fun onCreateDialog(savedViewState: Bundle?): Dialog { val dialog = MaterialDialog.Builder(activity!!) .customView(R.layout.pref_account_login, false) .negativeText(android.R.string.cancel) diff --git a/app/src/main/res/color/abc_primary_text_material_dark.xml b/app/src/main/res/color/abc_primary_text_material_dark.xml deleted file mode 100644 index 8e9adbf450..0000000000 --- a/app/src/main/res/color/abc_primary_text_material_dark.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable-hdpi/splash_icon.webp b/app/src/main/res/drawable-hdpi/splash_icon.webp new file mode 100644 index 0000000000..9429d0d06b Binary files /dev/null and b/app/src/main/res/drawable-hdpi/splash_icon.webp differ diff --git a/app/src/main/res/drawable-hdpi/tachiyomi_circle.png b/app/src/main/res/drawable-hdpi/tachiyomi_circle.png deleted file mode 100644 index 4e069c4b4c..0000000000 Binary files a/app/src/main/res/drawable-hdpi/tachiyomi_circle.png and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/tachiyomi_circle.webp b/app/src/main/res/drawable-hdpi/tachiyomi_circle.webp new file mode 100644 index 0000000000..0ec2f7bbe8 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/tachiyomi_circle.webp differ diff --git a/app/src/main/res/drawable-mdpi/splash_icon.webp b/app/src/main/res/drawable-mdpi/splash_icon.webp new file mode 100644 index 0000000000..f78eb6609d Binary files /dev/null and b/app/src/main/res/drawable-mdpi/splash_icon.webp differ diff --git a/app/src/main/res/drawable-mdpi/tachiyomi_circle.png b/app/src/main/res/drawable-mdpi/tachiyomi_circle.png deleted file mode 100644 index 46d427f365..0000000000 Binary files a/app/src/main/res/drawable-mdpi/tachiyomi_circle.png and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/tachiyomi_circle.webp b/app/src/main/res/drawable-mdpi/tachiyomi_circle.webp new file mode 100644 index 0000000000..ab4db0b7b8 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/tachiyomi_circle.webp differ diff --git a/app/src/main/res/drawable-v21/library_item_selector_amoled.xml b/app/src/main/res/drawable-v21/library_item_selector_amoled.xml deleted file mode 100644 index b21f488c29..0000000000 --- a/app/src/main/res/drawable-v21/library_item_selector_amoled.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable-v21/library_item_selector_dark.xml b/app/src/main/res/drawable-v21/library_item_selector_dark.xml deleted file mode 100644 index 82a72da4aa..0000000000 --- a/app/src/main/res/drawable-v21/library_item_selector_dark.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable-v21/library_item_selector_light.xml b/app/src/main/res/drawable-v21/library_item_selector_light.xml deleted file mode 100644 index 1f2e8bf89c..0000000000 --- a/app/src/main/res/drawable-v21/library_item_selector_light.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable-v21/list_item_selector_amoled.xml b/app/src/main/res/drawable-v21/list_item_selector_amoled.xml deleted file mode 100644 index 0fce81a343..0000000000 --- a/app/src/main/res/drawable-v21/list_item_selector_amoled.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable-v21/list_item_selector_dark.xml b/app/src/main/res/drawable-v21/list_item_selector_dark.xml deleted file mode 100644 index c86632f6a9..0000000000 --- a/app/src/main/res/drawable-v21/list_item_selector_dark.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable-v21/list_item_selector_light.xml b/app/src/main/res/drawable-v21/list_item_selector_light.xml deleted file mode 100644 index 942446ef06..0000000000 --- a/app/src/main/res/drawable-v21/list_item_selector_light.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable-xhdpi/splash_icon.webp b/app/src/main/res/drawable-xhdpi/splash_icon.webp new file mode 100644 index 0000000000..3197577085 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/splash_icon.webp differ diff --git a/app/src/main/res/drawable-xhdpi/tachiyomi_circle.png b/app/src/main/res/drawable-xhdpi/tachiyomi_circle.png deleted file mode 100644 index 8366d11a60..0000000000 Binary files a/app/src/main/res/drawable-xhdpi/tachiyomi_circle.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/tachiyomi_circle.webp b/app/src/main/res/drawable-xhdpi/tachiyomi_circle.webp new file mode 100644 index 0000000000..9c2fcfabdd Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/tachiyomi_circle.webp differ diff --git a/app/src/main/res/drawable-xxhdpi/splash_icon.webp b/app/src/main/res/drawable-xxhdpi/splash_icon.webp new file mode 100644 index 0000000000..cbfd186757 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/splash_icon.webp differ diff --git a/app/src/main/res/drawable-xxhdpi/tachiyomi_circle.png b/app/src/main/res/drawable-xxhdpi/tachiyomi_circle.png deleted file mode 100644 index e85f7ea585..0000000000 Binary files a/app/src/main/res/drawable-xxhdpi/tachiyomi_circle.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/tachiyomi_circle.webp b/app/src/main/res/drawable-xxhdpi/tachiyomi_circle.webp new file mode 100644 index 0000000000..c5e2b696b5 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/tachiyomi_circle.webp differ diff --git a/app/src/main/res/drawable-xxxhdpi/al.png b/app/src/main/res/drawable-xxxhdpi/al.png deleted file mode 100644 index a189688bb9..0000000000 Binary files a/app/src/main/res/drawable-xxxhdpi/al.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/anilist.webp b/app/src/main/res/drawable-xxxhdpi/anilist.webp new file mode 100644 index 0000000000..b553d6c497 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/anilist.webp differ diff --git a/app/src/main/res/drawable-xxxhdpi/bangumi.png b/app/src/main/res/drawable-xxxhdpi/bangumi.png deleted file mode 100644 index 23a8c2746d..0000000000 Binary files a/app/src/main/res/drawable-xxxhdpi/bangumi.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/bangumi.webp b/app/src/main/res/drawable-xxxhdpi/bangumi.webp new file mode 100644 index 0000000000..779ab9af7d Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/bangumi.webp differ diff --git a/app/src/main/res/drawable-xxxhdpi/kitsu.png b/app/src/main/res/drawable-xxxhdpi/kitsu.png deleted file mode 100644 index 42eff8707a..0000000000 Binary files a/app/src/main/res/drawable-xxxhdpi/kitsu.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/kitsu.webp b/app/src/main/res/drawable-xxxhdpi/kitsu.webp new file mode 100644 index 0000000000..f34cef52eb Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/kitsu.webp differ diff --git a/app/src/main/res/drawable-xxxhdpi/mal.png b/app/src/main/res/drawable-xxxhdpi/mal.png deleted file mode 100644 index 7405691334..0000000000 Binary files a/app/src/main/res/drawable-xxxhdpi/mal.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/mal.webp b/app/src/main/res/drawable-xxxhdpi/mal.webp new file mode 100644 index 0000000000..a9c6f2e929 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/mal.webp differ diff --git a/app/src/main/res/drawable-xxxhdpi/shikimori.png b/app/src/main/res/drawable-xxxhdpi/shikimori.png deleted file mode 100644 index 0f7dcd2912..0000000000 Binary files a/app/src/main/res/drawable-xxxhdpi/shikimori.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/shikimori.webp b/app/src/main/res/drawable-xxxhdpi/shikimori.webp new file mode 100644 index 0000000000..d9cf1706fa Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/shikimori.webp differ diff --git a/app/src/main/res/drawable-xxxhdpi/splash_icon.webp b/app/src/main/res/drawable-xxxhdpi/splash_icon.webp new file mode 100644 index 0000000000..34e4ace57e Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/splash_icon.webp differ diff --git a/app/src/main/res/drawable-xxxhdpi/tachiyomi_circle.png b/app/src/main/res/drawable-xxxhdpi/tachiyomi_circle.png deleted file mode 100644 index 2d9cfe659c..0000000000 Binary files a/app/src/main/res/drawable-xxxhdpi/tachiyomi_circle.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/tachiyomi_circle.webp b/app/src/main/res/drawable-xxxhdpi/tachiyomi_circle.webp new file mode 100644 index 0000000000..74705a6722 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/tachiyomi_circle.webp differ diff --git a/app/src/main/res/drawable/filter_mock.png b/app/src/main/res/drawable/filter_mock.png deleted file mode 100644 index 4ede13310c..0000000000 Binary files a/app/src/main/res/drawable/filter_mock.png and /dev/null differ diff --git a/app/src/main/res/drawable/filter_mock.webp b/app/src/main/res/drawable/filter_mock.webp new file mode 100644 index 0000000000..6bfbe6dc87 Binary files /dev/null and b/app/src/main/res/drawable/filter_mock.webp differ diff --git a/app/src/main/res/drawable/library_item_selector_amoled.xml b/app/src/main/res/drawable/library_item_selector_amoled.xml index 1cf05bdc96..18b0fb40eb 100644 --- a/app/src/main/res/drawable/library_item_selector_amoled.xml +++ b/app/src/main/res/drawable/library_item_selector_amoled.xml @@ -1,10 +1,19 @@ - + + + + + + - - - - + + + - \ No newline at end of file + + + + + + diff --git a/app/src/main/res/drawable/library_item_selector_dark.xml b/app/src/main/res/drawable/library_item_selector_dark.xml index 9880c4b38c..7e2dc8b749 100644 --- a/app/src/main/res/drawable/library_item_selector_dark.xml +++ b/app/src/main/res/drawable/library_item_selector_dark.xml @@ -1,10 +1,19 @@ - + + + + + + - - - - + + + - \ No newline at end of file + + + + + + diff --git a/app/src/main/res/drawable/library_item_selector_light.xml b/app/src/main/res/drawable/library_item_selector_light.xml index 70f7b85b47..e51877cc91 100644 --- a/app/src/main/res/drawable/library_item_selector_light.xml +++ b/app/src/main/res/drawable/library_item_selector_light.xml @@ -1,10 +1,19 @@ - + + + + + + - - - - + + + - \ No newline at end of file + + + + + + diff --git a/app/src/main/res/drawable/list_item_selector_amoled.xml b/app/src/main/res/drawable/list_item_selector_amoled.xml index 9bbf565786..f3a9c3e06f 100644 --- a/app/src/main/res/drawable/list_item_selector_amoled.xml +++ b/app/src/main/res/drawable/list_item_selector_amoled.xml @@ -1,10 +1,19 @@ - + + + + + + - - - - + + + - \ No newline at end of file + + + + + + diff --git a/app/src/main/res/drawable/list_item_selector_dark.xml b/app/src/main/res/drawable/list_item_selector_dark.xml index c3a6245050..7e8dc6495e 100644 --- a/app/src/main/res/drawable/list_item_selector_dark.xml +++ b/app/src/main/res/drawable/list_item_selector_dark.xml @@ -1,10 +1,20 @@ - + + + + + + - \ No newline at end of file + + + + + + diff --git a/app/src/main/res/drawable/list_item_selector_light.xml b/app/src/main/res/drawable/list_item_selector_light.xml index 92bed9fc90..3fa9224b93 100644 --- a/app/src/main/res/drawable/list_item_selector_light.xml +++ b/app/src/main/res/drawable/list_item_selector_light.xml @@ -1,10 +1,19 @@ - + + + + + + - - - - + + + - \ No newline at end of file + + + + + + diff --git a/app/src/main/res/drawable/splash_background.xml b/app/src/main/res/drawable/splash_background.xml new file mode 100644 index 0000000000..7541671832 --- /dev/null +++ b/app/src/main/res/drawable/splash_background.xml @@ -0,0 +1,12 @@ + + + + + + + + + + diff --git a/app/src/main/res/layout-land/manga_info_controller.xml b/app/src/main/res/layout-land/manga_info_controller.xml index 07c43e6c46..51eec6280c 100644 --- a/app/src/main/res/layout-land/manga_info_controller.xml +++ b/app/src/main/res/layout-land/manga_info_controller.xml @@ -34,15 +34,14 @@ android:layout_height="0dp" android:layout_marginTop="16dp" android:layout_marginBottom="16dp" - android:layout_marginLeft="16dp" + android:layout_marginStart="16dp" android:contentDescription="@string/description_cover" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintStart_toStartOf="parent" app:layout_constraintDimensionRatio="h,3:2" tools:background="@color/material_grey_700" - app:layout_constraintVertical_bias="0.0" - android:layout_marginStart="16dp"/> + app:layout_constraintVertical_bias="0.0" /> + app:layout_constraintStart_toStartOf="parent"/> + app:layout_constraintStart_toEndOf="@+id/manga_author_label" + app:layout_constraintEnd_toEndOf="parent" /> + app:layout_constraintStart_toStartOf="parent"/> + app:layout_constraintStart_toEndOf="@+id/manga_artist_label" + app:layout_constraintEnd_toEndOf="parent" /> + app:layout_constraintStart_toStartOf="parent"/> + app:layout_constraintStart_toEndOf="@+id/manga_chapters_label" + app:layout_constraintEnd_toEndOf="parent" /> + app:layout_constraintStart_toStartOf="parent"/> + app:layout_constraintStart_toEndOf="@+id/manga_last_update_label" + app:layout_constraintEnd_toEndOf="parent" /> + app:layout_constraintStart_toStartOf="parent"/> + app:layout_constraintStart_toEndOf="@+id/manga_status_label" + app:layout_constraintEnd_toEndOf="parent" /> + app:layout_constraintStart_toStartOf="parent"/> + app:layout_constraintStart_toEndOf="@+id/manga_source_label" + app:layout_constraintEnd_toEndOf="parent" /> + app:layout_constraintStart_toStartOf="parent"/> + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toEndOf="parent" + android:layout_marginEnd="64dp"/> - + android:layout_marginEnd="64dp"/> diff --git a/app/src/main/res/layout-land/reader_color_filter_sheet.xml b/app/src/main/res/layout-land/reader_color_filter_sheet.xml index 9cf10846dd..75c1f8424c 100644 --- a/app/src/main/res/layout-land/reader_color_filter_sheet.xml +++ b/app/src/main/res/layout-land/reader_color_filter_sheet.xml @@ -12,8 +12,8 @@ android:id="@+id/frame" android:layout_width="0dp" android:layout_height="0dp" - app:layout_constraintLeft_toLeftOf="parent" - app:layout_constraintRight_toLeftOf="@id/scroll" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toStartOf="@id/scroll" app:layout_constraintTop_toTopOf="@id/scroll" app:layout_constraintBottom_toBottomOf="@id/scroll"> @@ -40,8 +40,8 @@ android:id="@+id/scroll" android:layout_width="0dp" android:layout_height="wrap_content" - app:layout_constraintLeft_toRightOf="@id/frame" - app:layout_constraintRight_toRightOf="parent"> + app:layout_constraintStart_toEndOf="@id/frame" + app:layout_constraintEnd_toEndOf="parent"> diff --git a/app/src/main/res/layout/catalogue_drawer_content.xml b/app/src/main/res/layout/catalogue_drawer_content.xml index b2b621a9cf..b4bf2e16bc 100644 --- a/app/src/main/res/layout/catalogue_drawer_content.xml +++ b/app/src/main/res/layout/catalogue_drawer_content.xml @@ -6,6 +6,7 @@ android:layout_height="match_parent" android:clickable="true" android:orientation="vertical"> + + android:paddingStart="?attr/listPreferredItemPaddingStart" + android:paddingEnd="?attr/listPreferredItemPaddingEnd"> + + + - \ No newline at end of file + + diff --git a/app/src/main/res/layout/catalogue_global_search_controller.xml b/app/src/main/res/layout/catalogue_global_search_controller.xml index 4f9ab29f8e..7959047a90 100644 --- a/app/src/main/res/layout/catalogue_global_search_controller.xml +++ b/app/src/main/res/layout/catalogue_global_search_controller.xml @@ -1,15 +1,16 @@ - - + android:layout_height="wrap_content"> + + + diff --git a/app/src/main/res/layout/catalogue_global_search_controller_card.xml b/app/src/main/res/layout/catalogue_global_search_controller_card.xml index 145a64df1e..330baa5af1 100644 --- a/app/src/main/res/layout/catalogue_global_search_controller_card.xml +++ b/app/src/main/res/layout/catalogue_global_search_controller_card.xml @@ -13,8 +13,8 @@ android:layout_height="wrap_content" android:padding="@dimen/material_component_text_fields_padding_above_and_below_label" app:layout_constraintBottom_toTopOf="@+id/source_card" - app:layout_constrainedHeight="true" - app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintHeight_default="wrap" + app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" tools:text="Title" /> @@ -45,5 +45,7 @@ android:paddingStart="4dp" android:clipToPadding="false" tools:listitem="@layout/catalogue_global_search_controller_card_item" /> + + diff --git a/app/src/main/res/layout/catalogue_grid_item.xml b/app/src/main/res/layout/catalogue_grid_item.xml index 614a0bbd19..5b833d32ff 100644 --- a/app/src/main/res/layout/catalogue_grid_item.xml +++ b/app/src/main/res/layout/catalogue_grid_item.xml @@ -41,14 +41,14 @@ android:layout_height="wrap_content" android:background="@color/colorAccentDark" android:paddingBottom="1dp" - android:paddingLeft="3dp" - android:paddingRight="3dp" + android:paddingStart="3dp" + android:paddingEnd="3dp" android:paddingTop="1dp" android:visibility="gone" tools:visibility="visible" tools:text="120" - app:layout_constraintLeft_toRightOf="@+id/download_text" - android:layout_marginLeft="4dp" + app:layout_constraintStart_toEndOf="@+id/download_text" + android:layout_marginStart="4dp" app:layout_constraintTop_toTopOf="parent" android:layout_marginTop="4dp"/> diff --git a/app/src/main/res/layout/catalogue_list_item.xml b/app/src/main/res/layout/catalogue_list_item.xml index b83795268a..09b4e9943b 100644 --- a/app/src/main/res/layout/catalogue_list_item.xml +++ b/app/src/main/res/layout/catalogue_list_item.xml @@ -5,22 +5,23 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="@dimen/material_component_lists_single_line_with_avatar_height" - android:layout_gravity="center_vertical" + android:layout_gravity="center_vertical" android:background="?attr/selectable_list_drawable" tools:layout_editor_absoluteY="25dp" tools:layout_editor_absoluteX="0dp"> + + android:layout_marginStart="8dp"/> @@ -49,8 +49,8 @@ android:layout_height="wrap_content" android:background="@color/md_teal_500" android:paddingBottom="1dp" - android:paddingLeft="3dp" - android:paddingRight="3dp" + android:paddingStart="3dp" + android:paddingEnd="3dp" android:paddingTop="1dp" android:layout_centerVertical="true" android:maxLines="1" @@ -58,58 +58,57 @@ android:visibility="gone" tools:visibility="visible" android:layout_marginEnd="8dp" - app:layout_constraintRight_toLeftOf="@+id/unread_text" + app:layout_constraintEnd_toStartOf="@+id/unread_text" app:layout_constraintTop_toTopOf="parent" android:layout_marginTop="8dp" app:layout_constraintBottom_toBottomOf="parent" android:layout_marginBottom="8dp"/> - + - - - + + diff --git a/app/src/main/res/layout/catalogue_main_controller_card.xml b/app/src/main/res/layout/catalogue_main_controller_card.xml index aec409b0a0..e0ba18d4ab 100644 --- a/app/src/main/res/layout/catalogue_main_controller_card.xml +++ b/app/src/main/res/layout/catalogue_main_controller_card.xml @@ -12,7 +12,7 @@ android:layout_height="wrap_content" android:paddingTop="8dp" android:paddingBottom="8dp" - android:paddingLeft="@dimen/material_component_text_fields_padding_above_and_below_label" + android:paddingStart="@dimen/material_component_text_fields_padding_above_and_below_label" tools:text="Title" /> - \ No newline at end of file + diff --git a/app/src/main/res/layout/catalogue_main_controller_card_item.xml b/app/src/main/res/layout/catalogue_main_controller_card_item.xml index 071c89ad77..faf7915d00 100644 --- a/app/src/main/res/layout/catalogue_main_controller_card_item.xml +++ b/app/src/main/res/layout/catalogue_main_controller_card_item.xml @@ -19,7 +19,7 @@ android:padding="8dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintDimensionRatio="1:1" - app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" tools:src="@mipmap/ic_launcher_round" /> @@ -28,16 +28,14 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:maxLines="1" - android:paddingLeft="0dp" android:paddingStart="0dp" - android:paddingRight="8dp" android:paddingEnd="8dp" android:ellipsize="end" android:textAppearance="@style/TextAppearance.Regular.SubHeading" app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintLeft_toRightOf="@+id/image" + app:layout_constraintStart_toEndOf="@+id/image" app:layout_constraintTop_toTopOf="parent" - app:layout_constraintRight_toLeftOf="@+id/source_latest" + app:layout_constraintEnd_toStartOf="@+id/source_latest" tools:text="Source title"/>