mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-11-04 16:18:55 +01:00 
			
		
		
		
	Migrate to AndroidX (#2424)
* Migrate to AndroidX (automatic conversion by Android Studio) * AndroidX dependency code updates * Fix source preference reparenting * fixes the androidx prefererences icon spacing issue (cherry picked from commit b76a15d960ec2cdf771be16377db0348b66b3179) * Fix source preference screen heading size/list padding Co-authored-by: Carlos <cargo8005@gmail.com>
This commit is contained in:
		@@ -3,7 +3,7 @@ package eu.kanade.tachiyomi
 | 
			
		||||
import android.app.Application
 | 
			
		||||
import android.content.Context
 | 
			
		||||
import android.content.res.Configuration
 | 
			
		||||
import android.support.multidex.MultiDex
 | 
			
		||||
import androidx.multidex.MultiDex
 | 
			
		||||
import com.evernote.android.job.JobManager
 | 
			
		||||
import eu.kanade.tachiyomi.data.backup.BackupCreatorJob
 | 
			
		||||
import eu.kanade.tachiyomi.data.library.LibraryUpdateJob
 | 
			
		||||
 
 | 
			
		||||
@@ -10,7 +10,8 @@ import eu.kanade.tachiyomi.source.model.Page
 | 
			
		||||
import eu.kanade.tachiyomi.util.DiskUtil
 | 
			
		||||
import eu.kanade.tachiyomi.util.saveTo
 | 
			
		||||
import okhttp3.Response
 | 
			
		||||
import okio.Okio
 | 
			
		||||
import okio.buffer
 | 
			
		||||
import okio.sink
 | 
			
		||||
import rx.Observable
 | 
			
		||||
import uy.kohesive.injekt.injectLazy
 | 
			
		||||
import java.io.File
 | 
			
		||||
@@ -126,7 +127,7 @@ class ChapterCache(private val context: Context) {
 | 
			
		||||
            editor = diskCache.edit(key) ?: return
 | 
			
		||||
 | 
			
		||||
            // Write chapter urls to cache.
 | 
			
		||||
            Okio.buffer(Okio.sink(editor.newOutputStream(0))).use {
 | 
			
		||||
            editor.newOutputStream(0).sink().buffer().use {
 | 
			
		||||
                it.write(cachedValue.toByteArray())
 | 
			
		||||
                it.flush()
 | 
			
		||||
            }
 | 
			
		||||
@@ -170,7 +171,7 @@ class ChapterCache(private val context: Context) {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Add image to cache.
 | 
			
		||||
     * 
 | 
			
		||||
     *
 | 
			
		||||
     * @param imageUrl url of image.
 | 
			
		||||
     * @param response http response from page.
 | 
			
		||||
     * @throws IOException image error.
 | 
			
		||||
@@ -186,12 +187,12 @@ class ChapterCache(private val context: Context) {
 | 
			
		||||
            editor = diskCache.edit(key) ?: throw IOException("Unable to edit key")
 | 
			
		||||
 | 
			
		||||
            // Get OutputStream and write image with Okio.
 | 
			
		||||
            response.body()!!.source().saveTo(editor.newOutputStream(0))
 | 
			
		||||
            response.body!!.source().saveTo(editor.newOutputStream(0))
 | 
			
		||||
 | 
			
		||||
            diskCache.flush()
 | 
			
		||||
            editor.commit()
 | 
			
		||||
        } finally {
 | 
			
		||||
            response.body()?.close()
 | 
			
		||||
            response.body?.close()
 | 
			
		||||
            editor?.abortUnlessCommitted()
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
package eu.kanade.tachiyomi.data.database
 | 
			
		||||
 | 
			
		||||
import android.arch.persistence.db.SupportSQLiteOpenHelper
 | 
			
		||||
import androidx.sqlite.db.SupportSQLiteOpenHelper
 | 
			
		||||
import android.content.Context
 | 
			
		||||
import com.pushtorefresh.storio.sqlite.impl.DefaultStorIOSQLite
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.mappers.*
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
package eu.kanade.tachiyomi.data.database
 | 
			
		||||
 | 
			
		||||
import android.arch.persistence.db.SupportSQLiteDatabase
 | 
			
		||||
import android.arch.persistence.db.SupportSQLiteOpenHelper
 | 
			
		||||
import androidx.sqlite.db.SupportSQLiteDatabase
 | 
			
		||||
import androidx.sqlite.db.SupportSQLiteOpenHelper
 | 
			
		||||
import android.content.Context
 | 
			
		||||
import android.database.sqlite.SQLiteDatabase
 | 
			
		||||
import android.database.sqlite.SQLiteOpenHelper
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
package eu.kanade.tachiyomi.data.database.resolvers
 | 
			
		||||
 | 
			
		||||
import android.content.ContentValues
 | 
			
		||||
import android.support.annotation.NonNull
 | 
			
		||||
import androidx.annotation.NonNull
 | 
			
		||||
import com.pushtorefresh.storio.sqlite.StorIOSQLite
 | 
			
		||||
import com.pushtorefresh.storio.sqlite.operations.put.PutResult
 | 
			
		||||
import com.pushtorefresh.storio.sqlite.queries.Query
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@ package eu.kanade.tachiyomi.data.download
 | 
			
		||||
 | 
			
		||||
import android.content.Context
 | 
			
		||||
import android.graphics.BitmapFactory
 | 
			
		||||
import android.support.v4.app.NotificationCompat
 | 
			
		||||
import androidx.core.app.NotificationCompat
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.data.download.model.Download
 | 
			
		||||
import eu.kanade.tachiyomi.data.download.model.DownloadQueue
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,7 @@ import android.net.NetworkInfo.State.DISCONNECTED
 | 
			
		||||
import android.os.Build
 | 
			
		||||
import android.os.IBinder
 | 
			
		||||
import android.os.PowerManager
 | 
			
		||||
import android.support.v4.app.NotificationCompat
 | 
			
		||||
import androidx.core.app.NotificationCompat
 | 
			
		||||
import com.github.pwittchen.reactivenetwork.library.Connectivity
 | 
			
		||||
import com.github.pwittchen.reactivenetwork.library.ReactiveNetwork
 | 
			
		||||
import com.jakewharton.rxrelay.BehaviorRelay
 | 
			
		||||
 
 | 
			
		||||
@@ -351,7 +351,7 @@ class Downloader(
 | 
			
		||||
                .map { response ->
 | 
			
		||||
                    val file = tmpDir.createFile("$filename.tmp")
 | 
			
		||||
                    try {
 | 
			
		||||
                        response.body()!!.source().saveTo(file.openOutputStream())
 | 
			
		||||
                        response.body!!.source().saveTo(file.openOutputStream())
 | 
			
		||||
                        val extension = getImageExtension(response, file)
 | 
			
		||||
                        file.renameTo("$filename.$extension")
 | 
			
		||||
                    } catch (e: Exception) {
 | 
			
		||||
@@ -374,7 +374,7 @@ class Downloader(
 | 
			
		||||
     */
 | 
			
		||||
    private fun getImageExtension(response: Response, file: UniFile): String {
 | 
			
		||||
        // Read content type if available.
 | 
			
		||||
        val mime = response.body()?.contentType()?.let { ct -> "${ct.type()}/${ct.subtype()}" }
 | 
			
		||||
        val mime = response.body?.contentType()?.let { ct -> "${ct.type}/${ct.subtype}" }
 | 
			
		||||
            // Else guess from the uri.
 | 
			
		||||
            ?: context.contentResolver.getType(file.uri)
 | 
			
		||||
            // Else read magic numbers.
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,7 @@ import android.graphics.BitmapFactory
 | 
			
		||||
import android.os.Build
 | 
			
		||||
import android.os.IBinder
 | 
			
		||||
import android.os.PowerManager
 | 
			
		||||
import android.support.v4.app.NotificationCompat
 | 
			
		||||
import androidx.core.app.NotificationCompat
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.DatabaseHelper
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.models.Category
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
package eu.kanade.tachiyomi.data.preference
 | 
			
		||||
 | 
			
		||||
import android.support.v7.preference.PreferenceDataStore
 | 
			
		||||
import androidx.preference.PreferenceDataStore
 | 
			
		||||
 | 
			
		||||
class EmptyPreferenceDataStore : PreferenceDataStore() {
 | 
			
		||||
 | 
			
		||||
@@ -45,4 +45,4 @@ class EmptyPreferenceDataStore : PreferenceDataStore() {
 | 
			
		||||
 | 
			
		||||
    override fun putStringSet(key: String?, values: Set<String>?) {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
package eu.kanade.tachiyomi.data.preference
 | 
			
		||||
 | 
			
		||||
import android.content.SharedPreferences
 | 
			
		||||
import android.support.v7.preference.PreferenceDataStore
 | 
			
		||||
import androidx.preference.PreferenceDataStore
 | 
			
		||||
 | 
			
		||||
class SharedPreferencesDataStore(private val prefs: SharedPreferences) : PreferenceDataStore() {
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
package eu.kanade.tachiyomi.data.track
 | 
			
		||||
 | 
			
		||||
import android.support.annotation.CallSuper
 | 
			
		||||
import android.support.annotation.DrawableRes
 | 
			
		||||
import androidx.annotation.CallSuper
 | 
			
		||||
import androidx.annotation.DrawableRes
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.models.Track
 | 
			
		||||
import eu.kanade.tachiyomi.data.track.model.TrackSearch
 | 
			
		||||
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
 | 
			
		||||
 
 | 
			
		||||
@@ -1,13 +1,18 @@
 | 
			
		||||
package eu.kanade.tachiyomi.data.track.anilist
 | 
			
		||||
 | 
			
		||||
import android.net.Uri
 | 
			
		||||
import com.github.salomonbrys.kotson.*
 | 
			
		||||
import com.github.salomonbrys.kotson.array
 | 
			
		||||
import com.github.salomonbrys.kotson.get
 | 
			
		||||
import com.github.salomonbrys.kotson.jsonObject
 | 
			
		||||
import com.github.salomonbrys.kotson.nullInt
 | 
			
		||||
import com.github.salomonbrys.kotson.nullString
 | 
			
		||||
import com.github.salomonbrys.kotson.obj
 | 
			
		||||
import com.google.gson.JsonObject
 | 
			
		||||
import com.google.gson.JsonParser
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.models.Track
 | 
			
		||||
import eu.kanade.tachiyomi.data.track.model.TrackSearch
 | 
			
		||||
import eu.kanade.tachiyomi.network.asObservableSuccess
 | 
			
		||||
import okhttp3.MediaType
 | 
			
		||||
import okhttp3.MediaType.Companion.toMediaTypeOrNull
 | 
			
		||||
import okhttp3.OkHttpClient
 | 
			
		||||
import okhttp3.Request
 | 
			
		||||
import okhttp3.RequestBody
 | 
			
		||||
@@ -18,7 +23,7 @@ import java.util.Calendar
 | 
			
		||||
class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) {
 | 
			
		||||
 | 
			
		||||
    private val parser = JsonParser()
 | 
			
		||||
    private val jsonMime = MediaType.parse("application/json; charset=utf-8")
 | 
			
		||||
    private val jsonMime = "application/json; charset=utf-8".toMediaTypeOrNull()
 | 
			
		||||
    private val authClient = client.newBuilder().addInterceptor(interceptor).build()
 | 
			
		||||
 | 
			
		||||
    fun addLibManga(track: Track): Observable<Track> {
 | 
			
		||||
@@ -47,7 +52,7 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) {
 | 
			
		||||
        return authClient.newCall(request)
 | 
			
		||||
                .asObservableSuccess()
 | 
			
		||||
                .map { netResponse ->
 | 
			
		||||
                    val responseBody = netResponse.body()?.string().orEmpty()
 | 
			
		||||
                    val responseBody = netResponse.body?.string().orEmpty()
 | 
			
		||||
                    netResponse.close()
 | 
			
		||||
                    if (responseBody.isEmpty()) {
 | 
			
		||||
                        throw Exception("Null Response")
 | 
			
		||||
@@ -130,7 +135,7 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) {
 | 
			
		||||
        return authClient.newCall(request)
 | 
			
		||||
                .asObservableSuccess()
 | 
			
		||||
                .map { netResponse ->
 | 
			
		||||
                    val responseBody = netResponse.body()?.string().orEmpty()
 | 
			
		||||
                    val responseBody = netResponse.body?.string().orEmpty()
 | 
			
		||||
                    if (responseBody.isEmpty()) {
 | 
			
		||||
                        throw Exception("Null Response")
 | 
			
		||||
                    }
 | 
			
		||||
@@ -191,7 +196,7 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) {
 | 
			
		||||
        return authClient.newCall(request)
 | 
			
		||||
                .asObservableSuccess()
 | 
			
		||||
                .map { netResponse ->
 | 
			
		||||
                    val responseBody = netResponse.body()?.string().orEmpty()
 | 
			
		||||
                    val responseBody = netResponse.body?.string().orEmpty()
 | 
			
		||||
                    if (responseBody.isEmpty()) {
 | 
			
		||||
                        throw Exception("Null Response")
 | 
			
		||||
                    }
 | 
			
		||||
@@ -236,7 +241,7 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) {
 | 
			
		||||
        return authClient.newCall(request)
 | 
			
		||||
                .asObservableSuccess()
 | 
			
		||||
                .map { netResponse ->
 | 
			
		||||
                    val responseBody = netResponse.body()?.string().orEmpty()
 | 
			
		||||
                    val responseBody = netResponse.body?.string().orEmpty()
 | 
			
		||||
                    if (responseBody.isEmpty()) {
 | 
			
		||||
                        throw Exception("Null Response")
 | 
			
		||||
                    }
 | 
			
		||||
 
 | 
			
		||||
@@ -84,7 +84,7 @@ class BangumiApi(private val client: OkHttpClient, interceptor: BangumiIntercept
 | 
			
		||||
    return authClient.newCall(request)
 | 
			
		||||
      .asObservableSuccess()
 | 
			
		||||
      .map { netResponse ->
 | 
			
		||||
        val responseBody = netResponse.body()?.string().orEmpty()
 | 
			
		||||
        val responseBody = netResponse.body?.string().orEmpty()
 | 
			
		||||
        if (responseBody.isEmpty()) {
 | 
			
		||||
          throw Exception("Null Response")
 | 
			
		||||
        }
 | 
			
		||||
@@ -127,7 +127,7 @@ class BangumiApi(private val client: OkHttpClient, interceptor: BangumiIntercept
 | 
			
		||||
      .asObservableSuccess()
 | 
			
		||||
      .map { netResponse ->
 | 
			
		||||
        // get comic info
 | 
			
		||||
        val responseBody = netResponse.body()?.string().orEmpty()
 | 
			
		||||
        val responseBody = netResponse.body?.string().orEmpty()
 | 
			
		||||
        jsonToTrack(parser.parse(responseBody).obj)
 | 
			
		||||
      }
 | 
			
		||||
  }
 | 
			
		||||
@@ -144,7 +144,7 @@ class BangumiApi(private val client: OkHttpClient, interceptor: BangumiIntercept
 | 
			
		||||
    return authClient.newCall(requestUserRead)
 | 
			
		||||
      .asObservableSuccess()
 | 
			
		||||
      .map { netResponse ->
 | 
			
		||||
        val resp = netResponse.body()?.string()
 | 
			
		||||
        val resp = netResponse.body?.string()
 | 
			
		||||
        val coll = gson.fromJson(resp, Collection::class.java)
 | 
			
		||||
        track.status = coll.status?.id!!
 | 
			
		||||
        track.last_chapter_read = coll.ep_status!!
 | 
			
		||||
@@ -154,7 +154,7 @@ class BangumiApi(private val client: OkHttpClient, interceptor: BangumiIntercept
 | 
			
		||||
 | 
			
		||||
  fun accessToken(code: String): Observable<OAuth> {
 | 
			
		||||
    return client.newCall(accessTokenRequest(code)).asObservableSuccess().map { netResponse ->
 | 
			
		||||
      val responseBody = netResponse.body()?.string().orEmpty()
 | 
			
		||||
      val responseBody = netResponse.body?.string().orEmpty()
 | 
			
		||||
      if (responseBody.isEmpty()) {
 | 
			
		||||
        throw Exception("Null Response")
 | 
			
		||||
      }
 | 
			
		||||
 
 | 
			
		||||
@@ -14,7 +14,7 @@ class BangumiInterceptor(val bangumi: Bangumi, val gson: Gson) : Interceptor {
 | 
			
		||||
 | 
			
		||||
  fun addTocken(tocken: String, oidFormBody: FormBody): FormBody {
 | 
			
		||||
    val newFormBody = FormBody.Builder()
 | 
			
		||||
    for (i in 0 until oidFormBody.size()) {
 | 
			
		||||
    for (i in 0 until oidFormBody.size) {
 | 
			
		||||
      newFormBody.add(oidFormBody.name(i), oidFormBody.value(i))
 | 
			
		||||
    }
 | 
			
		||||
    newFormBody.add("access_token", tocken)
 | 
			
		||||
@@ -29,18 +29,18 @@ class BangumiInterceptor(val bangumi: Bangumi, val gson: Gson) : Interceptor {
 | 
			
		||||
    if (currAuth.isExpired()) {
 | 
			
		||||
      val response = chain.proceed(BangumiApi.refreshTokenRequest(currAuth.refresh_token!!))
 | 
			
		||||
      if (response.isSuccessful) {
 | 
			
		||||
        newAuth(gson.fromJson(response.body()!!.string(), OAuth::class.java))
 | 
			
		||||
        newAuth(gson.fromJson(response.body!!.string(), OAuth::class.java))
 | 
			
		||||
      } else {
 | 
			
		||||
        response.close()
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    var authRequest = if (originalRequest.method() == "GET") originalRequest.newBuilder()
 | 
			
		||||
    var authRequest = if (originalRequest.method == "GET") originalRequest.newBuilder()
 | 
			
		||||
      .header("User-Agent", "Tachiyomi")
 | 
			
		||||
      .url(originalRequest.url().newBuilder()
 | 
			
		||||
      .url(originalRequest.url.newBuilder()
 | 
			
		||||
        .addQueryParameter("access_token", currAuth.access_token).build())
 | 
			
		||||
      .build() else originalRequest.newBuilder()
 | 
			
		||||
      .post(addTocken(currAuth.access_token, originalRequest.body() as FormBody))
 | 
			
		||||
      .post(addTocken(currAuth.access_token, originalRequest.body as FormBody))
 | 
			
		||||
      .header("User-Agent", "Tachiyomi")
 | 
			
		||||
      .build()
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -22,7 +22,7 @@ class KitsuInterceptor(val kitsu: Kitsu, val gson: Gson) : Interceptor {
 | 
			
		||||
        if (currAuth.isExpired()) {
 | 
			
		||||
            val response = chain.proceed(KitsuApi.refreshTokenRequest(refreshToken))
 | 
			
		||||
            if (response.isSuccessful) {
 | 
			
		||||
                newAuth(gson.fromJson(response.body()!!.string(), OAuth::class.java))
 | 
			
		||||
                newAuth(gson.fromJson(response.body!!.string(), OAuth::class.java))
 | 
			
		||||
            } else {
 | 
			
		||||
                response.close()
 | 
			
		||||
            }
 | 
			
		||||
@@ -43,4 +43,4 @@ class KitsuInterceptor(val kitsu: Kitsu, val gson: Gson) : Interceptor {
 | 
			
		||||
        kitsu.saveToken(oauth)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
package eu.kanade.tachiyomi.data.track.kitsu
 | 
			
		||||
 | 
			
		||||
import android.support.annotation.CallSuper
 | 
			
		||||
import androidx.annotation.CallSuper
 | 
			
		||||
import com.github.salomonbrys.kotson.*
 | 
			
		||||
import com.google.gson.JsonObject
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.models.Track
 | 
			
		||||
 
 | 
			
		||||
@@ -7,10 +7,9 @@ import eu.kanade.tachiyomi.data.database.models.Track
 | 
			
		||||
import eu.kanade.tachiyomi.data.preference.getOrDefault
 | 
			
		||||
import eu.kanade.tachiyomi.data.track.TrackService
 | 
			
		||||
import eu.kanade.tachiyomi.data.track.model.TrackSearch
 | 
			
		||||
import okhttp3.HttpUrl
 | 
			
		||||
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
 | 
			
		||||
import rx.Completable
 | 
			
		||||
import rx.Observable
 | 
			
		||||
import java.lang.Exception
 | 
			
		||||
 | 
			
		||||
class Myanimelist(private val context: Context, id: Int) : TrackService(id) {
 | 
			
		||||
 | 
			
		||||
@@ -138,7 +137,7 @@ class Myanimelist(private val context: Context, id: Int) : TrackService(id) {
 | 
			
		||||
    override fun logout() {
 | 
			
		||||
        super.logout()
 | 
			
		||||
        preferences.trackToken(this).delete()
 | 
			
		||||
        networkService.cookieManager.remove(HttpUrl.parse(BASE_URL)!!)
 | 
			
		||||
        networkService.cookieManager.remove(BASE_URL.toHttpUrlOrNull()!!)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    val isAuthorized: Boolean
 | 
			
		||||
@@ -152,9 +151,9 @@ class Myanimelist(private val context: Context, id: Int) : TrackService(id) {
 | 
			
		||||
 | 
			
		||||
    private fun checkCookies(): Boolean {
 | 
			
		||||
        var ckCount = 0
 | 
			
		||||
        val url = HttpUrl.parse(BASE_URL)!!
 | 
			
		||||
        val url = BASE_URL.toHttpUrlOrNull()!!
 | 
			
		||||
        for (ck in networkService.cookieManager.get(url)) {
 | 
			
		||||
            if (ck.name() == USER_SESSION_COOKIE || ck.name() == LOGGED_IN_COOKIE)
 | 
			
		||||
            if (ck.name == USER_SESSION_COOKIE || ck.name == LOGGED_IN_COOKIE)
 | 
			
		||||
                ckCount++
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -15,7 +15,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))
 | 
			
		||||
        }
 | 
			
		||||
@@ -24,7 +24,7 @@ class MyAnimeListInterceptor(private val myanimelist: Myanimelist): Interceptor
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun updateRequest(request: Request): Request {
 | 
			
		||||
        return request.body()?.let {
 | 
			
		||||
        return request.body?.let {
 | 
			
		||||
            val contentType = it.contentType().toString()
 | 
			
		||||
            val updatedBody = when {
 | 
			
		||||
                contentType.contains("x-www-form-urlencoded") -> updateFormBody(it)
 | 
			
		||||
@@ -56,4 +56,4 @@ class MyAnimeListInterceptor(private val myanimelist: Myanimelist): Interceptor
 | 
			
		||||
 | 
			
		||||
        return RequestBody.create(requestBody.contentType(), newBody.toString())
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -10,7 +10,11 @@ import eu.kanade.tachiyomi.network.asObservable
 | 
			
		||||
import eu.kanade.tachiyomi.network.asObservableSuccess
 | 
			
		||||
import eu.kanade.tachiyomi.util.selectInt
 | 
			
		||||
import eu.kanade.tachiyomi.util.selectText
 | 
			
		||||
import okhttp3.*
 | 
			
		||||
import okhttp3.FormBody
 | 
			
		||||
import okhttp3.MediaType.Companion.toMediaTypeOrNull
 | 
			
		||||
import okhttp3.OkHttpClient
 | 
			
		||||
import okhttp3.RequestBody
 | 
			
		||||
import okhttp3.Response
 | 
			
		||||
import org.json.JSONObject
 | 
			
		||||
import org.jsoup.Jsoup
 | 
			
		||||
import org.jsoup.nodes.Document
 | 
			
		||||
@@ -85,7 +89,7 @@ class MyanimelistApi(private val client: OkHttpClient, interceptor: MyAnimeListI
 | 
			
		||||
                .map {response ->
 | 
			
		||||
                    var libTrack: Track? = null
 | 
			
		||||
                    response.use {
 | 
			
		||||
                        if (it.priorResponse()?.isRedirect != true) {
 | 
			
		||||
                        if (it.priorResponse?.isRedirect != true) {
 | 
			
		||||
                            val trackForm = Jsoup.parse(it.consumeBody())
 | 
			
		||||
 | 
			
		||||
                            libTrack = Track.create(TrackManager.MYANIMELIST).apply {
 | 
			
		||||
@@ -125,7 +129,7 @@ class MyanimelistApi(private val client: OkHttpClient, interceptor: MyAnimeListI
 | 
			
		||||
        val response = client.newCall(POST(url = loginUrl(), body = loginPostBody(username, password, csrf))).execute()
 | 
			
		||||
 | 
			
		||||
        response.use {
 | 
			
		||||
            if (response.priorResponse()?.code() != 302) throw Exception("Authentication error")
 | 
			
		||||
            if (response.priorResponse?.code != 302) throw Exception("Authentication error")
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -172,15 +176,15 @@ class MyanimelistApi(private val client: OkHttpClient, interceptor: MyAnimeListI
 | 
			
		||||
 | 
			
		||||
    private fun Response.consumeBody(): String? {
 | 
			
		||||
        use {
 | 
			
		||||
            if (it.code() != 200) throw Exception("HTTP error ${it.code()}")
 | 
			
		||||
            return it.body()?.string()
 | 
			
		||||
            if (it.code != 200) throw Exception("HTTP error ${it.code}")
 | 
			
		||||
            return it.body?.string()
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun Response.consumeXmlBody(): String? {
 | 
			
		||||
        use { res ->
 | 
			
		||||
            if (res.code() != 200) throw Exception("Export list error")
 | 
			
		||||
            BufferedReader(InputStreamReader(GZIPInputStream(res.body()?.source()?.inputStream()))).use { reader ->
 | 
			
		||||
            if (res.code != 200) throw Exception("Export list error")
 | 
			
		||||
            BufferedReader(InputStreamReader(GZIPInputStream(res.body?.source()?.inputStream()))).use { reader ->
 | 
			
		||||
                val sb = StringBuilder()
 | 
			
		||||
                reader.forEachLine { line ->
 | 
			
		||||
                    sb.append(line)
 | 
			
		||||
@@ -262,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(MediaType.parse("application/json; charset=utf-8"), body.toString())
 | 
			
		||||
            return RequestBody.create("application/json; charset=utf-8".toMediaTypeOrNull(), body.toString())
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private fun Element.searchTitle() = select("strong").text()!!
 | 
			
		||||
@@ -298,4 +302,4 @@ class MyanimelistApi(private val client: OkHttpClient, interceptor: MyAnimeListI
 | 
			
		||||
            else -> 1
 | 
			
		||||
            }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -14,7 +14,11 @@ import eu.kanade.tachiyomi.data.track.model.TrackSearch
 | 
			
		||||
import eu.kanade.tachiyomi.network.GET
 | 
			
		||||
import eu.kanade.tachiyomi.network.POST
 | 
			
		||||
import eu.kanade.tachiyomi.network.asObservableSuccess
 | 
			
		||||
import okhttp3.*
 | 
			
		||||
import okhttp3.FormBody
 | 
			
		||||
import okhttp3.MediaType.Companion.toMediaTypeOrNull
 | 
			
		||||
import okhttp3.OkHttpClient
 | 
			
		||||
import okhttp3.Request
 | 
			
		||||
import okhttp3.RequestBody
 | 
			
		||||
import rx.Observable
 | 
			
		||||
import uy.kohesive.injekt.injectLazy
 | 
			
		||||
 | 
			
		||||
@@ -22,7 +26,7 @@ class ShikimoriApi(private val client: OkHttpClient, interceptor: ShikimoriInter
 | 
			
		||||
 | 
			
		||||
    private val gson: Gson by injectLazy()
 | 
			
		||||
    private val parser = JsonParser()
 | 
			
		||||
    private val jsonime = MediaType.parse("application/json; charset=utf-8")
 | 
			
		||||
    private val jsonime = "application/json; charset=utf-8".toMediaTypeOrNull()
 | 
			
		||||
    private val authClient = client.newBuilder().addInterceptor(interceptor).build()
 | 
			
		||||
 | 
			
		||||
    fun addLibManga(track: Track, user_id: String): Observable<Track> {
 | 
			
		||||
@@ -63,7 +67,7 @@ class ShikimoriApi(private val client: OkHttpClient, interceptor: ShikimoriInter
 | 
			
		||||
        return authClient.newCall(request)
 | 
			
		||||
                .asObservableSuccess()
 | 
			
		||||
                .map { netResponse ->
 | 
			
		||||
                    val responseBody = netResponse.body()?.string().orEmpty()
 | 
			
		||||
                    val responseBody = netResponse.body?.string().orEmpty()
 | 
			
		||||
                    if (responseBody.isEmpty()) {
 | 
			
		||||
                        throw Exception("Null Response")
 | 
			
		||||
                    }
 | 
			
		||||
@@ -120,13 +124,13 @@ class ShikimoriApi(private val client: OkHttpClient, interceptor: ShikimoriInter
 | 
			
		||||
        return authClient.newCall(requestMangas)
 | 
			
		||||
                .asObservableSuccess()
 | 
			
		||||
                .map { netResponse ->
 | 
			
		||||
                    val responseBody = netResponse.body()?.string().orEmpty()
 | 
			
		||||
                    val responseBody = netResponse.body?.string().orEmpty()
 | 
			
		||||
                    parser.parse(responseBody).obj
 | 
			
		||||
                }.flatMap { mangas ->
 | 
			
		||||
                    authClient.newCall(request)
 | 
			
		||||
                            .asObservableSuccess()
 | 
			
		||||
                            .map { netResponse ->
 | 
			
		||||
                                val responseBody = netResponse.body()?.string().orEmpty()
 | 
			
		||||
                                val responseBody = netResponse.body?.string().orEmpty()
 | 
			
		||||
                                if (responseBody.isEmpty()) {
 | 
			
		||||
                                    throw Exception("Null Response")
 | 
			
		||||
                                }
 | 
			
		||||
@@ -143,13 +147,13 @@ class ShikimoriApi(private val client: OkHttpClient, interceptor: ShikimoriInter
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun getCurrentUser(): Int {
 | 
			
		||||
        val user = authClient.newCall(GET("$apiUrl/users/whoami")).execute().body()?.string()
 | 
			
		||||
        val user = authClient.newCall(GET("$apiUrl/users/whoami")).execute().body?.string()
 | 
			
		||||
        return parser.parse(user).obj["id"].asInt
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun accessToken(code: String): Observable<OAuth> {
 | 
			
		||||
        return client.newCall(accessTokenRequest(code)).asObservableSuccess().map { netResponse ->
 | 
			
		||||
            val responseBody = netResponse.body()?.string().orEmpty()
 | 
			
		||||
            val responseBody = netResponse.body?.string().orEmpty()
 | 
			
		||||
            if (responseBody.isEmpty()) {
 | 
			
		||||
                throw Exception("Null Response")
 | 
			
		||||
            }
 | 
			
		||||
 
 | 
			
		||||
@@ -22,7 +22,7 @@ class ShikimoriInterceptor(val shikimori: Shikimori, val gson: Gson) : Intercept
 | 
			
		||||
        if (currAuth.isExpired()) {
 | 
			
		||||
            val response = chain.proceed(ShikimoriApi.refreshTokenRequest(refreshToken))
 | 
			
		||||
            if (response.isSuccessful) {
 | 
			
		||||
                newAuth(gson.fromJson(response.body()!!.string(), OAuth::class.java))
 | 
			
		||||
                newAuth(gson.fromJson(response.body!!.string(), OAuth::class.java))
 | 
			
		||||
            } else {
 | 
			
		||||
                response.close()
 | 
			
		||||
            }
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@ package eu.kanade.tachiyomi.data.updater
 | 
			
		||||
 | 
			
		||||
import android.app.PendingIntent
 | 
			
		||||
import android.content.Intent
 | 
			
		||||
import android.support.v4.app.NotificationCompat
 | 
			
		||||
import androidx.core.app.NotificationCompat
 | 
			
		||||
import com.evernote.android.job.Job
 | 
			
		||||
import com.evernote.android.job.JobManager
 | 
			
		||||
import com.evernote.android.job.JobRequest
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@ package eu.kanade.tachiyomi.data.updater
 | 
			
		||||
 | 
			
		||||
import android.content.Context
 | 
			
		||||
import android.net.Uri
 | 
			
		||||
import android.support.v4.app.NotificationCompat
 | 
			
		||||
import androidx.core.app.NotificationCompat
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.data.notification.NotificationHandler
 | 
			
		||||
import eu.kanade.tachiyomi.data.notification.NotificationReceiver
 | 
			
		||||
@@ -106,4 +106,4 @@ internal class UpdaterNotifier(private val context: Context) {
 | 
			
		||||
        }
 | 
			
		||||
        notification.show(Notifications.ID_UPDATER)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -71,7 +71,7 @@ class UpdaterService : IntentService(UpdaterService::class.java.name) {
 | 
			
		||||
            val apkFile = File(externalCacheDir, "update.apk")
 | 
			
		||||
 | 
			
		||||
            if (response.isSuccessful) {
 | 
			
		||||
                response.body()!!.source().saveTo(apkFile)
 | 
			
		||||
                response.body!!.source().saveTo(apkFile)
 | 
			
		||||
            } else {
 | 
			
		||||
                response.close()
 | 
			
		||||
                throw Exception("Unsuccessful response")
 | 
			
		||||
 
 | 
			
		||||
@@ -32,7 +32,7 @@ internal class ExtensionGithubApi {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun parseResponse(response: Response): List<Extension.Available> {
 | 
			
		||||
        val text = response.body()?.use { it.string() } ?: return emptyList()
 | 
			
		||||
        val text = response.body?.use { it.string() } ?: return emptyList()
 | 
			
		||||
 | 
			
		||||
        val json = gson.fromJson<JsonArray>(text)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -21,7 +21,7 @@ class AndroidCookieJar(context: Context) : CookieJar {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun saveFromResponse(url: HttpUrl, cookies: MutableList<Cookie>) {
 | 
			
		||||
    override fun saveFromResponse(url: HttpUrl, cookies: List<Cookie>) {
 | 
			
		||||
        val urlString = url.toString()
 | 
			
		||||
 | 
			
		||||
        for (cookie in cookies) {
 | 
			
		||||
 
 | 
			
		||||
@@ -42,7 +42,7 @@ class CloudflareInterceptor(private val context: Context) : Interceptor {
 | 
			
		||||
        val response = chain.proceed(chain.request())
 | 
			
		||||
 | 
			
		||||
        // Check if Cloudflare anti-bot is on
 | 
			
		||||
        if (response.code() == 503 && response.header("Server") in serverCheck) {
 | 
			
		||||
        if (response.code == 503 && response.header("Server") in serverCheck) {
 | 
			
		||||
            try {
 | 
			
		||||
                response.close()
 | 
			
		||||
                val solutionRequest = resolveWithWebView(chain.request())
 | 
			
		||||
@@ -71,8 +71,8 @@ class CloudflareInterceptor(private val context: Context) : Interceptor {
 | 
			
		||||
        var solutionUrl: String? = null
 | 
			
		||||
        var challengeFound = false
 | 
			
		||||
 | 
			
		||||
        val origRequestUrl = request.url().toString()
 | 
			
		||||
        val headers = request.headers().toMultimap().mapValues { it.value.getOrNull(0) ?: "" }
 | 
			
		||||
        val origRequestUrl = request.url.toString()
 | 
			
		||||
        val headers = request.headers.toMultimap().mapValues { it.value.getOrNull(0) ?: "" }
 | 
			
		||||
 | 
			
		||||
        handler.post {
 | 
			
		||||
            val view = WebView(context)
 | 
			
		||||
@@ -144,7 +144,7 @@ class CloudflareInterceptor(private val context: Context) : Interceptor {
 | 
			
		||||
 | 
			
		||||
        return Request.Builder().get()
 | 
			
		||||
            .url(solution)
 | 
			
		||||
            .headers(request.headers())
 | 
			
		||||
            .headers(request.headers)
 | 
			
		||||
            .addHeader("Referer", origRequestUrl)
 | 
			
		||||
            .addHeader("Accept", "text/html,application/xhtml+xml,application/xml")
 | 
			
		||||
            .addHeader("Accept-Language", "en")
 | 
			
		||||
 
 | 
			
		||||
@@ -103,7 +103,7 @@ class NetworkHelper(context: Context) {
 | 
			
		||||
        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(),
 | 
			
		||||
                    *ConnectionSpec.MODERN_TLS.cipherSuites.orEmpty().toTypedArray(),
 | 
			
		||||
                    CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
 | 
			
		||||
                    CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
 | 
			
		||||
            )
 | 
			
		||||
 
 | 
			
		||||
@@ -37,7 +37,7 @@ fun Call.asObservable(): Observable<Response> {
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            override fun isUnsubscribed(): Boolean {
 | 
			
		||||
                return call.isCanceled
 | 
			
		||||
                return call.isCanceled()
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -50,7 +50,7 @@ fun Call.asObservableSuccess(): Observable<Response> {
 | 
			
		||||
    return asObservable().doOnNext { response ->
 | 
			
		||||
        if (!response.isSuccessful) {
 | 
			
		||||
            response.close()
 | 
			
		||||
            throw Exception("HTTP error ${response.code()}")
 | 
			
		||||
            throw Exception("HTTP error ${response.code}")
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -61,10 +61,10 @@ fun OkHttpClient.newCallWithProgress(request: Request, listener: ProgressListene
 | 
			
		||||
            .addNetworkInterceptor { chain ->
 | 
			
		||||
                val originalResponse = chain.proceed(chain.request())
 | 
			
		||||
                originalResponse.newBuilder()
 | 
			
		||||
                        .body(ProgressResponseBody(originalResponse.body()!!, listener))
 | 
			
		||||
                        .body(ProgressResponseBody(originalResponse.body!!, listener))
 | 
			
		||||
                        .build()
 | 
			
		||||
            }
 | 
			
		||||
            .build()
 | 
			
		||||
 | 
			
		||||
    return progressClient.newCall(request)
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@ import java.io.IOException
 | 
			
		||||
class ProgressResponseBody(private val responseBody: ResponseBody, private val progressListener: ProgressListener) : ResponseBody() {
 | 
			
		||||
 | 
			
		||||
    private val bufferedSource: BufferedSource by lazy {
 | 
			
		||||
        Okio.buffer(source(responseBody.source()))
 | 
			
		||||
        source(responseBody.source()).buffer()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun contentType(): MediaType {
 | 
			
		||||
@@ -25,7 +25,7 @@ class ProgressResponseBody(private val responseBody: ResponseBody, private val p
 | 
			
		||||
 | 
			
		||||
    private fun source(source: Source): Source {
 | 
			
		||||
        return object : ForwardingSource(source) {
 | 
			
		||||
            internal var totalBytesRead = 0L
 | 
			
		||||
            var totalBytesRead = 0L
 | 
			
		||||
 | 
			
		||||
            @Throws(IOException::class)
 | 
			
		||||
            override fun read(sink: Buffer, byteCount: Long): Long {
 | 
			
		||||
@@ -37,4 +37,4 @@ class ProgressResponseBody(private val responseBody: ResponseBody, private val p
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,8 @@
 | 
			
		||||
package eu.kanade.tachiyomi.source
 | 
			
		||||
 | 
			
		||||
import android.support.v7.preference.PreferenceScreen
 | 
			
		||||
import androidx.preference.PreferenceScreen
 | 
			
		||||
 | 
			
		||||
interface ConfigurableSource : Source {
 | 
			
		||||
 | 
			
		||||
    fun setupPreferenceScreen(screen: PreferenceScreen)
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.base.activity
 | 
			
		||||
 | 
			
		||||
import android.support.v7.app.AppCompatActivity
 | 
			
		||||
import androidx.appcompat.app.AppCompatActivity
 | 
			
		||||
import eu.kanade.tachiyomi.util.LocaleHelper
 | 
			
		||||
 | 
			
		||||
abstract class BaseActivity : AppCompatActivity() {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.base.controller
 | 
			
		||||
 | 
			
		||||
import android.os.Bundle
 | 
			
		||||
import android.support.v7.app.AppCompatActivity
 | 
			
		||||
import androidx.appcompat.app.AppCompatActivity
 | 
			
		||||
import android.view.LayoutInflater
 | 
			
		||||
import android.view.MenuItem
 | 
			
		||||
import android.view.View
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@ package eu.kanade.tachiyomi.ui.base.controller
 | 
			
		||||
 | 
			
		||||
import android.content.pm.PackageManager.PERMISSION_GRANTED
 | 
			
		||||
import android.os.Build
 | 
			
		||||
import android.support.v4.content.ContextCompat
 | 
			
		||||
import androidx.core.content.ContextCompat
 | 
			
		||||
import com.bluelinelabs.conductor.Controller
 | 
			
		||||
import com.bluelinelabs.conductor.Router
 | 
			
		||||
import com.bluelinelabs.conductor.RouterTransaction
 | 
			
		||||
 
 | 
			
		||||
@@ -3,8 +3,8 @@ package eu.kanade.tachiyomi.ui.base.controller;
 | 
			
		||||
import android.app.Dialog;
 | 
			
		||||
import android.content.DialogInterface;
 | 
			
		||||
import android.os.Bundle;
 | 
			
		||||
import android.support.annotation.NonNull;
 | 
			
		||||
import android.support.annotation.Nullable;
 | 
			
		||||
import androidx.annotation.NonNull;
 | 
			
		||||
import androidx.annotation.Nullable;
 | 
			
		||||
import android.view.LayoutInflater;
 | 
			
		||||
import android.view.View;
 | 
			
		||||
import android.view.ViewGroup;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.base.controller
 | 
			
		||||
 | 
			
		||||
import android.os.Bundle
 | 
			
		||||
import android.support.annotation.CallSuper
 | 
			
		||||
import androidx.annotation.CallSuper
 | 
			
		||||
import android.view.View
 | 
			
		||||
import rx.Observable
 | 
			
		||||
import rx.Subscription
 | 
			
		||||
@@ -89,4 +89,4 @@ abstract class RxController(bundle: Bundle? = null) : BaseController(bundle) {
 | 
			
		||||
        return subscribe(onNext, onError, onCompleted).also { untilDestroySubscriptions.add(it) }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.base.controller
 | 
			
		||||
 | 
			
		||||
import android.support.v4.widget.DrawerLayout
 | 
			
		||||
import androidx.drawerlayout.widget.DrawerLayout
 | 
			
		||||
import android.view.ViewGroup
 | 
			
		||||
 | 
			
		||||
interface SecondaryDrawerController {
 | 
			
		||||
@@ -8,4 +8,4 @@ interface SecondaryDrawerController {
 | 
			
		||||
    fun createSecondaryDrawer(drawer: DrawerLayout): ViewGroup?
 | 
			
		||||
 | 
			
		||||
    fun cleanupSecondaryDrawer(drawer: DrawerLayout)
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,10 +1,10 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.base.controller
 | 
			
		||||
 | 
			
		||||
import android.support.design.widget.TabLayout
 | 
			
		||||
import com.google.android.material.tabs.TabLayout
 | 
			
		||||
 | 
			
		||||
interface TabbedController {
 | 
			
		||||
 | 
			
		||||
    fun configureTabs(tabs: TabLayout) {}
 | 
			
		||||
 | 
			
		||||
    fun cleanupTabs(tabs: TabLayout) {}
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.base.holder
 | 
			
		||||
 | 
			
		||||
import android.support.v7.widget.RecyclerView
 | 
			
		||||
import androidx.recyclerview.widget.RecyclerView
 | 
			
		||||
import android.view.View
 | 
			
		||||
import kotlinx.android.extensions.LayoutContainer
 | 
			
		||||
 | 
			
		||||
@@ -8,4 +8,4 @@ abstract class BaseViewHolder(view: View) : RecyclerView.ViewHolder(view), Layou
 | 
			
		||||
 | 
			
		||||
    override val containerView: View?
 | 
			
		||||
        get() = itemView
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.base.presenter;
 | 
			
		||||
 | 
			
		||||
import android.os.Bundle;
 | 
			
		||||
import android.support.annotation.Nullable;
 | 
			
		||||
import androidx.annotation.Nullable;
 | 
			
		||||
 | 
			
		||||
import nucleus.factory.PresenterFactory;
 | 
			
		||||
import nucleus.presenter.Presenter;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.base.presenter;
 | 
			
		||||
 | 
			
		||||
import android.os.Bundle;
 | 
			
		||||
import android.support.annotation.NonNull;
 | 
			
		||||
import androidx.annotation.NonNull;
 | 
			
		||||
import android.view.View;
 | 
			
		||||
 | 
			
		||||
import com.bluelinelabs.conductor.Controller;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,8 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.catalogue
 | 
			
		||||
 | 
			
		||||
import android.Manifest.permission.WRITE_EXTERNAL_STORAGE
 | 
			
		||||
import android.support.v7.widget.LinearLayoutManager
 | 
			
		||||
import android.support.v7.widget.SearchView
 | 
			
		||||
import androidx.recyclerview.widget.LinearLayoutManager
 | 
			
		||||
import androidx.appcompat.widget.SearchView
 | 
			
		||||
import android.view.*
 | 
			
		||||
import com.bluelinelabs.conductor.ControllerChangeHandler
 | 
			
		||||
import com.bluelinelabs.conductor.ControllerChangeType
 | 
			
		||||
@@ -132,7 +132,7 @@ class CatalogueController : NucleusController<CataloguePresenter>(),
 | 
			
		||||
    /**
 | 
			
		||||
     * Called when item is clicked
 | 
			
		||||
     */
 | 
			
		||||
    override fun onItemClick(position: Int): Boolean {
 | 
			
		||||
    override fun onItemClick(view: View, position: Int): Boolean {
 | 
			
		||||
        val item = adapter?.getItem(position) as? SourceItem ?: return false
 | 
			
		||||
        val source = item.source
 | 
			
		||||
        if (source is LoginSource && !source.isLogged()) {
 | 
			
		||||
@@ -150,7 +150,7 @@ class CatalogueController : NucleusController<CataloguePresenter>(),
 | 
			
		||||
     * Called when browse is clicked in [CatalogueAdapter]
 | 
			
		||||
     */
 | 
			
		||||
    override fun onBrowseClick(position: Int) {
 | 
			
		||||
        onItemClick(position)
 | 
			
		||||
        onItemClick(view!!, position)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -233,4 +233,4 @@ class CatalogueController : NucleusController<CataloguePresenter>(),
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    class SettingsSourcesFadeChangeHandler : FadeChangeHandler()
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,10 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.catalogue
 | 
			
		||||
 | 
			
		||||
import android.view.View
 | 
			
		||||
import androidx.recyclerview.widget.RecyclerView
 | 
			
		||||
import eu.davidea.flexibleadapter.FlexibleAdapter
 | 
			
		||||
import eu.davidea.flexibleadapter.items.AbstractHeaderItem
 | 
			
		||||
import eu.davidea.flexibleadapter.items.IFlexible
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -22,16 +24,18 @@ data class LangItem(val code: String) : AbstractHeaderItem<LangHolder>() {
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates a new view holder for this item.
 | 
			
		||||
     */
 | 
			
		||||
    override fun createViewHolder(view: View, adapter: FlexibleAdapter<*>): LangHolder {
 | 
			
		||||
    override fun createViewHolder(view: View, adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>): LangHolder {
 | 
			
		||||
        return LangHolder(view, adapter)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Binds this item to the given view holder.
 | 
			
		||||
     */
 | 
			
		||||
    override fun bindViewHolder(adapter: FlexibleAdapter<*>, holder: LangHolder,
 | 
			
		||||
                                position: Int, payloads: List<Any?>?) {
 | 
			
		||||
 | 
			
		||||
    override fun bindViewHolder(
 | 
			
		||||
            adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>,
 | 
			
		||||
            holder: LangHolder,
 | 
			
		||||
            position: Int,
 | 
			
		||||
            payloads: MutableList<Any>) {
 | 
			
		||||
        holder.bind(this)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@ import android.content.Context
 | 
			
		||||
import android.graphics.Canvas
 | 
			
		||||
import android.graphics.Rect
 | 
			
		||||
import android.graphics.drawable.Drawable
 | 
			
		||||
import android.support.v7.widget.RecyclerView
 | 
			
		||||
import androidx.recyclerview.widget.RecyclerView
 | 
			
		||||
import android.view.View
 | 
			
		||||
 | 
			
		||||
class SourceDividerItemDecoration(context: Context) : RecyclerView.ItemDecoration() {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,10 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.catalogue
 | 
			
		||||
 | 
			
		||||
import android.view.View
 | 
			
		||||
import androidx.recyclerview.widget.RecyclerView
 | 
			
		||||
import eu.davidea.flexibleadapter.FlexibleAdapter
 | 
			
		||||
import eu.davidea.flexibleadapter.items.AbstractSectionableItem
 | 
			
		||||
import eu.davidea.flexibleadapter.items.IFlexible
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.source.CatalogueSource
 | 
			
		||||
 | 
			
		||||
@@ -25,17 +27,19 @@ data class SourceItem(val source: CatalogueSource, val header: LangItem? = null)
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates a new view holder for this item.
 | 
			
		||||
     */
 | 
			
		||||
    override fun createViewHolder(view: View, adapter: FlexibleAdapter<*>): SourceHolder {
 | 
			
		||||
    override fun createViewHolder(view: View, adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>): SourceHolder {
 | 
			
		||||
        return SourceHolder(view, adapter as CatalogueAdapter)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Binds this item to the given view holder.
 | 
			
		||||
     */
 | 
			
		||||
    override fun bindViewHolder(adapter: FlexibleAdapter<*>, holder: SourceHolder,
 | 
			
		||||
                                position: Int, payloads: List<Any?>?) {
 | 
			
		||||
 | 
			
		||||
    override fun bindViewHolder(
 | 
			
		||||
            adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>,
 | 
			
		||||
            holder: SourceHolder,
 | 
			
		||||
            position: Int,
 | 
			
		||||
            payloads: MutableList<Any>) {
 | 
			
		||||
        holder.bind(this)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -2,10 +2,15 @@ package eu.kanade.tachiyomi.ui.catalogue.browse
 | 
			
		||||
 | 
			
		||||
import android.content.res.Configuration
 | 
			
		||||
import android.os.Bundle
 | 
			
		||||
import android.support.design.widget.Snackbar
 | 
			
		||||
import android.support.v4.widget.DrawerLayout
 | 
			
		||||
import android.support.v7.widget.*
 | 
			
		||||
import com.google.android.material.snackbar.Snackbar
 | 
			
		||||
import androidx.drawerlayout.widget.DrawerLayout
 | 
			
		||||
import androidx.appcompat.widget.*
 | 
			
		||||
import android.view.*
 | 
			
		||||
import androidx.core.view.GravityCompat
 | 
			
		||||
import androidx.recyclerview.widget.DividerItemDecoration
 | 
			
		||||
import androidx.recyclerview.widget.GridLayoutManager
 | 
			
		||||
import androidx.recyclerview.widget.LinearLayoutManager
 | 
			
		||||
import androidx.recyclerview.widget.RecyclerView
 | 
			
		||||
import com.afollestad.materialdialogs.MaterialDialog
 | 
			
		||||
import com.f2prateek.rx.preferences.Preference
 | 
			
		||||
import com.jakewharton.rxbinding.support.v7.widget.queryTextChangeEvents
 | 
			
		||||
@@ -136,13 +141,13 @@ open class BrowseCatalogueController(bundle: Bundle) :
 | 
			
		||||
        this.navView = navView
 | 
			
		||||
        navView.setFilters(presenter.filterItems)
 | 
			
		||||
 | 
			
		||||
        drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED, Gravity.END)
 | 
			
		||||
        drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED, GravityCompat.END)
 | 
			
		||||
 | 
			
		||||
        navView.onSearchClicked = {
 | 
			
		||||
            val allDefault = presenter.sourceFilters == presenter.source.getFilterList()
 | 
			
		||||
            showProgressBar()
 | 
			
		||||
            adapter?.clear()
 | 
			
		||||
            drawer.closeDrawer(Gravity.END)
 | 
			
		||||
            drawer.closeDrawer(GravityCompat.END)
 | 
			
		||||
            presenter.setSourceFilter(if (allDefault) FilterList() else presenter.sourceFilters)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -273,7 +278,7 @@ open class BrowseCatalogueController(bundle: Bundle) :
 | 
			
		||||
    override fun onOptionsItemSelected(item: MenuItem): Boolean {
 | 
			
		||||
        when (item.itemId) {
 | 
			
		||||
            R.id.action_display_mode -> swapDisplayMode()
 | 
			
		||||
            R.id.action_set_filter -> navView?.let { activity?.drawer?.openDrawer(Gravity.END) }
 | 
			
		||||
            R.id.action_set_filter -> navView?.let { activity?.drawer?.openDrawer(GravityCompat.END) }
 | 
			
		||||
            R.id.action_open_in_browser -> openInBrowser()
 | 
			
		||||
            R.id.action_open_in_web_view -> openInWebView()
 | 
			
		||||
            else -> return super.onOptionsItemSelected(item)
 | 
			
		||||
@@ -468,7 +473,7 @@ open class BrowseCatalogueController(bundle: Bundle) :
 | 
			
		||||
     * @param position the position of the element clicked.
 | 
			
		||||
     * @return true if the item should be selected, false otherwise.
 | 
			
		||||
     */
 | 
			
		||||
    override fun onItemClick(position: Int): Boolean {
 | 
			
		||||
    override fun onItemClick(view: View, position: Int): Boolean {
 | 
			
		||||
        val item = adapter?.getItem(position) as? CatalogueItem ?: return false
 | 
			
		||||
        router.pushController(MangaController(item.manga, true).withFadeTransaction())
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -4,9 +4,11 @@ import android.view.Gravity
 | 
			
		||||
import android.view.View
 | 
			
		||||
import android.view.ViewGroup.LayoutParams.MATCH_PARENT
 | 
			
		||||
import android.widget.FrameLayout
 | 
			
		||||
import androidx.recyclerview.widget.RecyclerView
 | 
			
		||||
import com.f2prateek.rx.preferences.Preference
 | 
			
		||||
import eu.davidea.flexibleadapter.FlexibleAdapter
 | 
			
		||||
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem
 | 
			
		||||
import eu.davidea.flexibleadapter.items.IFlexible
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.models.Manga
 | 
			
		||||
import eu.kanade.tachiyomi.data.preference.getOrDefault
 | 
			
		||||
@@ -23,7 +25,10 @@ class CatalogueItem(val manga: Manga, private val catalogueAsList: Preference<Bo
 | 
			
		||||
            R.layout.catalogue_grid_item
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun createViewHolder(view: View, adapter: FlexibleAdapter<*>): CatalogueHolder {
 | 
			
		||||
    override fun createViewHolder(
 | 
			
		||||
            view: View,
 | 
			
		||||
            adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>
 | 
			
		||||
    ): CatalogueHolder {
 | 
			
		||||
        val parent = adapter.recyclerView
 | 
			
		||||
        return if (parent is AutofitRecyclerView) {
 | 
			
		||||
            view.apply {
 | 
			
		||||
@@ -38,11 +43,12 @@ class CatalogueItem(val manga: Manga, private val catalogueAsList: Preference<Bo
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun bindViewHolder(adapter: FlexibleAdapter<*>,
 | 
			
		||||
                                holder: CatalogueHolder,
 | 
			
		||||
                                position: Int,
 | 
			
		||||
                                payloads: List<Any?>?) {
 | 
			
		||||
 | 
			
		||||
    override fun bindViewHolder(
 | 
			
		||||
            adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>,
 | 
			
		||||
            holder: CatalogueHolder,
 | 
			
		||||
            position: Int,
 | 
			
		||||
            payloads: List<Any?>?
 | 
			
		||||
    ) {
 | 
			
		||||
        holder.onSetValues(manga)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -58,6 +64,4 @@ class CatalogueItem(val manga: Manga, private val catalogueAsList: Preference<Bo
 | 
			
		||||
        return manga.id!!.hashCode()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -3,8 +3,10 @@ package eu.kanade.tachiyomi.ui.catalogue.browse
 | 
			
		||||
import android.view.View
 | 
			
		||||
import android.widget.ProgressBar
 | 
			
		||||
import android.widget.TextView
 | 
			
		||||
import androidx.recyclerview.widget.RecyclerView
 | 
			
		||||
import eu.davidea.flexibleadapter.FlexibleAdapter
 | 
			
		||||
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem
 | 
			
		||||
import eu.davidea.flexibleadapter.items.IFlexible
 | 
			
		||||
import eu.davidea.viewholders.FlexibleViewHolder
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
 | 
			
		||||
@@ -17,11 +19,11 @@ class ProgressItem : AbstractFlexibleItem<ProgressItem.Holder>() {
 | 
			
		||||
        return R.layout.catalogue_progress_item
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun createViewHolder(view: View, adapter: FlexibleAdapter<*>): Holder {
 | 
			
		||||
    override fun createViewHolder(view: View, adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>): Holder {
 | 
			
		||||
        return Holder(view, adapter)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun bindViewHolder(adapter: FlexibleAdapter<*>, holder: Holder, position: Int, payloads: List<Any?>) {
 | 
			
		||||
    override fun bindViewHolder(adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>, holder: Holder, position: Int, payloads: List<Any?>) {
 | 
			
		||||
        holder.progressBar.visibility = View.GONE
 | 
			
		||||
        holder.progressMessage.visibility = View.GONE
 | 
			
		||||
 | 
			
		||||
@@ -46,4 +48,4 @@ class ProgressItem : AbstractFlexibleItem<ProgressItem.Holder>() {
 | 
			
		||||
        val progressMessage: TextView = view.findViewById(R.id.progress_message)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -2,8 +2,10 @@ package eu.kanade.tachiyomi.ui.catalogue.filter
 | 
			
		||||
 | 
			
		||||
import android.view.View
 | 
			
		||||
import android.widget.CheckBox
 | 
			
		||||
import androidx.recyclerview.widget.RecyclerView
 | 
			
		||||
import eu.davidea.flexibleadapter.FlexibleAdapter
 | 
			
		||||
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem
 | 
			
		||||
import eu.davidea.flexibleadapter.items.IFlexible
 | 
			
		||||
import eu.davidea.viewholders.FlexibleViewHolder
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.source.model.Filter
 | 
			
		||||
@@ -14,11 +16,11 @@ open class CheckboxItem(val filter: Filter.CheckBox) : AbstractFlexibleItem<Chec
 | 
			
		||||
        return R.layout.navigation_view_checkbox
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun createViewHolder(view: View, adapter: FlexibleAdapter<*>): Holder {
 | 
			
		||||
    override fun createViewHolder(view: View, adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>): Holder {
 | 
			
		||||
        return Holder(view, adapter)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun bindViewHolder(adapter: FlexibleAdapter<*>, holder: Holder, position: Int, payloads: List<Any?>?) {
 | 
			
		||||
    override fun bindViewHolder(adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>, holder: Holder, position: Int, payloads: List<Any?>?) {
 | 
			
		||||
        val view = holder.check
 | 
			
		||||
        view.text = filter.name
 | 
			
		||||
        view.isChecked = filter.state
 | 
			
		||||
@@ -42,4 +44,4 @@ open class CheckboxItem(val filter: Filter.CheckBox) : AbstractFlexibleItem<Chec
 | 
			
		||||
 | 
			
		||||
        val check: CheckBox = itemView.findViewById(R.id.nav_view_item)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -3,8 +3,10 @@ package eu.kanade.tachiyomi.ui.catalogue.filter
 | 
			
		||||
import android.view.View
 | 
			
		||||
import android.widget.ImageView
 | 
			
		||||
import android.widget.TextView
 | 
			
		||||
import androidx.recyclerview.widget.RecyclerView
 | 
			
		||||
import eu.davidea.flexibleadapter.FlexibleAdapter
 | 
			
		||||
import eu.davidea.flexibleadapter.items.AbstractExpandableHeaderItem
 | 
			
		||||
import eu.davidea.flexibleadapter.items.IFlexible
 | 
			
		||||
import eu.davidea.flexibleadapter.items.ISectionable
 | 
			
		||||
import eu.davidea.viewholders.ExpandableViewHolder
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
@@ -25,11 +27,11 @@ class GroupItem(val filter: Filter.Group<*>) : AbstractExpandableHeaderItem<Grou
 | 
			
		||||
        return 101
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun createViewHolder(view: View, adapter: FlexibleAdapter<*>): Holder {
 | 
			
		||||
    override fun createViewHolder(view: View, adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>): Holder {
 | 
			
		||||
        return Holder(view, adapter)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun bindViewHolder(adapter: FlexibleAdapter<*>, holder: Holder, position: Int, payloads: List<Any?>?) {
 | 
			
		||||
    override fun bindViewHolder(adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>, holder: Holder, position: Int, payloads: List<Any?>?) {
 | 
			
		||||
        holder.title.text = filter.name
 | 
			
		||||
 | 
			
		||||
        holder.icon.setVectorCompat(if (isExpanded)
 | 
			
		||||
@@ -62,4 +64,4 @@ class GroupItem(val filter: Filter.Group<*>) : AbstractExpandableHeaderItem<Grou
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,11 +1,13 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.catalogue.filter
 | 
			
		||||
 | 
			
		||||
import android.annotation.SuppressLint
 | 
			
		||||
import android.support.design.R
 | 
			
		||||
import com.google.android.material.R
 | 
			
		||||
import android.view.View
 | 
			
		||||
import android.widget.TextView
 | 
			
		||||
import androidx.recyclerview.widget.RecyclerView
 | 
			
		||||
import eu.davidea.flexibleadapter.FlexibleAdapter
 | 
			
		||||
import eu.davidea.flexibleadapter.items.AbstractHeaderItem
 | 
			
		||||
import eu.davidea.flexibleadapter.items.IFlexible
 | 
			
		||||
import eu.davidea.viewholders.FlexibleViewHolder
 | 
			
		||||
import eu.kanade.tachiyomi.source.model.Filter
 | 
			
		||||
 | 
			
		||||
@@ -16,11 +18,11 @@ class HeaderItem(val filter: Filter.Header) : AbstractHeaderItem<HeaderItem.Hold
 | 
			
		||||
        return R.layout.design_navigation_item_subheader
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun createViewHolder(view: View, adapter: FlexibleAdapter<*>): Holder {
 | 
			
		||||
    override fun createViewHolder(view: View, adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>): Holder {
 | 
			
		||||
        return Holder(view, adapter)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun bindViewHolder(adapter: FlexibleAdapter<*>, holder: Holder, position: Int, payloads: List<Any?>?) {
 | 
			
		||||
    override fun bindViewHolder(adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>, holder: Holder, position: Int, payloads: List<Any?>?) {
 | 
			
		||||
        val view = holder.itemView as TextView
 | 
			
		||||
        view.text = filter.name
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -4,8 +4,10 @@ import android.view.View
 | 
			
		||||
import android.widget.ArrayAdapter
 | 
			
		||||
import android.widget.Spinner
 | 
			
		||||
import android.widget.TextView
 | 
			
		||||
import androidx.recyclerview.widget.RecyclerView
 | 
			
		||||
import eu.davidea.flexibleadapter.FlexibleAdapter
 | 
			
		||||
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem
 | 
			
		||||
import eu.davidea.flexibleadapter.items.IFlexible
 | 
			
		||||
import eu.davidea.viewholders.FlexibleViewHolder
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.source.model.Filter
 | 
			
		||||
@@ -17,11 +19,11 @@ open class SelectItem(val filter: Filter.Select<*>) : AbstractFlexibleItem<Selec
 | 
			
		||||
        return R.layout.navigation_view_spinner
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun createViewHolder(view: View, adapter: FlexibleAdapter<*>): Holder {
 | 
			
		||||
    override fun createViewHolder(view: View, adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>): Holder {
 | 
			
		||||
        return Holder(view, adapter)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun bindViewHolder(adapter: FlexibleAdapter<*>, holder: Holder, position: Int, payloads: List<Any?>?) {
 | 
			
		||||
    override fun bindViewHolder(adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>, holder: Holder, position: Int, payloads: List<Any?>?) {
 | 
			
		||||
        holder.text.text = filter.name + ": "
 | 
			
		||||
 | 
			
		||||
        val spinner = holder.spinner
 | 
			
		||||
@@ -51,4 +53,4 @@ open class SelectItem(val filter: Filter.Select<*>) : AbstractFlexibleItem<Selec
 | 
			
		||||
        val text: TextView = itemView.findViewById(R.id.nav_view_item_text)
 | 
			
		||||
        val spinner: Spinner = itemView.findViewById(R.id.nav_view_item)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,10 +1,12 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.catalogue.filter
 | 
			
		||||
 | 
			
		||||
import android.annotation.SuppressLint
 | 
			
		||||
import android.support.design.R
 | 
			
		||||
import com.google.android.material.R
 | 
			
		||||
import android.view.View
 | 
			
		||||
import androidx.recyclerview.widget.RecyclerView
 | 
			
		||||
import eu.davidea.flexibleadapter.FlexibleAdapter
 | 
			
		||||
import eu.davidea.flexibleadapter.items.AbstractHeaderItem
 | 
			
		||||
import eu.davidea.flexibleadapter.items.IFlexible
 | 
			
		||||
import eu.davidea.viewholders.FlexibleViewHolder
 | 
			
		||||
import eu.kanade.tachiyomi.source.model.Filter
 | 
			
		||||
 | 
			
		||||
@@ -15,11 +17,11 @@ class SeparatorItem(val filter: Filter.Separator) : AbstractHeaderItem<Separator
 | 
			
		||||
        return R.layout.design_navigation_item_separator
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun createViewHolder(view: View, adapter: FlexibleAdapter<*>): Holder {
 | 
			
		||||
    override fun createViewHolder(view: View, adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>): Holder {
 | 
			
		||||
        return Holder(view, adapter)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun bindViewHolder(adapter: FlexibleAdapter<*>, holder: Holder, position: Int, payloads: List<Any?>?) {
 | 
			
		||||
    override fun bindViewHolder(adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>, holder: Holder, position: Int, payloads: List<Any?>?) {
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -34,4 +36,4 @@ class SeparatorItem(val filter: Filter.Separator) : AbstractHeaderItem<Separator
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    class Holder(view: View, adapter: FlexibleAdapter<*>) : FlexibleViewHolder(view, adapter)
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,10 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.catalogue.filter
 | 
			
		||||
 | 
			
		||||
import android.view.View
 | 
			
		||||
import androidx.recyclerview.widget.RecyclerView
 | 
			
		||||
import eu.davidea.flexibleadapter.FlexibleAdapter
 | 
			
		||||
import eu.davidea.flexibleadapter.items.AbstractExpandableHeaderItem
 | 
			
		||||
import eu.davidea.flexibleadapter.items.IFlexible
 | 
			
		||||
import eu.davidea.flexibleadapter.items.ISectionable
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.source.model.Filter
 | 
			
		||||
@@ -22,11 +24,11 @@ class SortGroup(val filter: Filter.Sort) : AbstractExpandableHeaderItem<SortGrou
 | 
			
		||||
        return 100
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun createViewHolder(view: View, adapter: FlexibleAdapter<*>): Holder {
 | 
			
		||||
    override fun createViewHolder(view: View, adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>): Holder {
 | 
			
		||||
        return Holder(view, adapter)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun bindViewHolder(adapter: FlexibleAdapter<*>, holder: Holder, position: Int, payloads: List<Any?>?) {
 | 
			
		||||
    override fun bindViewHolder(adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>, holder: Holder, position: Int, payloads: List<Any?>?) {
 | 
			
		||||
        holder.title.text = filter.name
 | 
			
		||||
 | 
			
		||||
        holder.icon.setVectorCompat(if (isExpanded)
 | 
			
		||||
@@ -49,4 +51,4 @@ class SortGroup(val filter: Filter.Sort) : AbstractExpandableHeaderItem<SortGrou
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    class Holder(view: View, adapter: FlexibleAdapter<*>) : GroupItem.Holder(view, adapter)
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,11 +1,13 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.catalogue.filter
 | 
			
		||||
 | 
			
		||||
import android.support.graphics.drawable.VectorDrawableCompat
 | 
			
		||||
import android.support.v4.content.ContextCompat
 | 
			
		||||
import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat
 | 
			
		||||
import androidx.core.content.ContextCompat
 | 
			
		||||
import android.view.View
 | 
			
		||||
import android.widget.CheckedTextView
 | 
			
		||||
import androidx.recyclerview.widget.RecyclerView
 | 
			
		||||
import eu.davidea.flexibleadapter.FlexibleAdapter
 | 
			
		||||
import eu.davidea.flexibleadapter.items.AbstractSectionableItem
 | 
			
		||||
import eu.davidea.flexibleadapter.items.IFlexible
 | 
			
		||||
import eu.davidea.viewholders.FlexibleViewHolder
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.source.model.Filter
 | 
			
		||||
@@ -21,11 +23,11 @@ class SortItem(val name: String, val group: SortGroup) : AbstractSectionableItem
 | 
			
		||||
        return 102
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun createViewHolder(view: View, adapter: FlexibleAdapter<*>): Holder {
 | 
			
		||||
    override fun createViewHolder(view: View, adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>): Holder {
 | 
			
		||||
        return Holder(view, adapter)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun bindViewHolder(adapter: FlexibleAdapter<*>, holder: Holder, position: Int, payloads: List<Any?>?) {
 | 
			
		||||
    override fun bindViewHolder(adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>, holder: Holder, position: Int, payloads: List<Any?>?) {
 | 
			
		||||
        val view = holder.text
 | 
			
		||||
        view.text = name
 | 
			
		||||
        val filter = group.filter
 | 
			
		||||
@@ -71,4 +73,4 @@ class SortItem(val name: String, val group: SortGroup) : AbstractSectionableItem
 | 
			
		||||
        val text: CheckedTextView = itemView.findViewById(R.id.nav_view_item)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,10 +1,12 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.catalogue.filter
 | 
			
		||||
 | 
			
		||||
import android.support.design.widget.TextInputLayout
 | 
			
		||||
import com.google.android.material.textfield.TextInputLayout
 | 
			
		||||
import android.view.View
 | 
			
		||||
import android.widget.EditText
 | 
			
		||||
import androidx.recyclerview.widget.RecyclerView
 | 
			
		||||
import eu.davidea.flexibleadapter.FlexibleAdapter
 | 
			
		||||
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem
 | 
			
		||||
import eu.davidea.flexibleadapter.items.IFlexible
 | 
			
		||||
import eu.davidea.viewholders.FlexibleViewHolder
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.source.model.Filter
 | 
			
		||||
@@ -16,11 +18,11 @@ open class TextItem(val filter: Filter.Text) : AbstractFlexibleItem<TextItem.Hol
 | 
			
		||||
        return R.layout.navigation_view_text
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun createViewHolder(view: View, adapter: FlexibleAdapter<*>): Holder {
 | 
			
		||||
    override fun createViewHolder(view: View, adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>): Holder {
 | 
			
		||||
        return Holder(view, adapter)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun bindViewHolder(adapter: FlexibleAdapter<*>, holder: Holder, position: Int, payloads: List<Any?>?) {
 | 
			
		||||
    override fun bindViewHolder(adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>, holder: Holder, position: Int, payloads: List<Any?>?) {
 | 
			
		||||
        holder.wrapper.hint = filter.name
 | 
			
		||||
        holder.edit.setText(filter.state)
 | 
			
		||||
        holder.edit.addTextChangedListener(object : SimpleTextWatcher() {
 | 
			
		||||
@@ -45,4 +47,4 @@ open class TextItem(val filter: Filter.Text) : AbstractFlexibleItem<TextItem.Hol
 | 
			
		||||
        val wrapper: TextInputLayout = itemView.findViewById(R.id.nav_view_item_wrapper)
 | 
			
		||||
        val edit: EditText = itemView.findViewById(R.id.nav_view_item)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,11 +1,13 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.catalogue.filter
 | 
			
		||||
 | 
			
		||||
import android.support.design.R
 | 
			
		||||
import android.support.graphics.drawable.VectorDrawableCompat
 | 
			
		||||
import com.google.android.material.R
 | 
			
		||||
import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat
 | 
			
		||||
import android.view.View
 | 
			
		||||
import android.widget.CheckedTextView
 | 
			
		||||
import androidx.recyclerview.widget.RecyclerView
 | 
			
		||||
import eu.davidea.flexibleadapter.FlexibleAdapter
 | 
			
		||||
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem
 | 
			
		||||
import eu.davidea.flexibleadapter.items.IFlexible
 | 
			
		||||
import eu.davidea.viewholders.FlexibleViewHolder
 | 
			
		||||
import eu.kanade.tachiyomi.source.model.Filter
 | 
			
		||||
import eu.kanade.tachiyomi.util.dpToPx
 | 
			
		||||
@@ -22,11 +24,11 @@ open class TriStateItem(val filter: Filter.TriState) : AbstractFlexibleItem<TriS
 | 
			
		||||
        return 103
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun createViewHolder(view: View, adapter: FlexibleAdapter<*>): Holder {
 | 
			
		||||
    override fun createViewHolder(view: View, adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>): Holder {
 | 
			
		||||
        return Holder(view, adapter)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun bindViewHolder(adapter: FlexibleAdapter<*>, holder: Holder, position: Int, payloads: List<Any?>?) {
 | 
			
		||||
    override fun bindViewHolder(adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>, holder: Holder, position: Int, payloads: List<Any?>?) {
 | 
			
		||||
        val view = holder.text
 | 
			
		||||
        view.text = filter.name
 | 
			
		||||
 | 
			
		||||
@@ -72,4 +74,4 @@ open class TriStateItem(val filter: Filter.TriState) : AbstractFlexibleItem<TriS
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@ package eu.kanade.tachiyomi.ui.catalogue.global_search
 | 
			
		||||
 | 
			
		||||
import android.os.Bundle
 | 
			
		||||
import android.os.Parcelable
 | 
			
		||||
import android.support.v7.widget.RecyclerView
 | 
			
		||||
import androidx.recyclerview.widget.RecyclerView
 | 
			
		||||
import android.util.SparseArray
 | 
			
		||||
import eu.davidea.flexibleadapter.FlexibleAdapter
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,10 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.catalogue.global_search
 | 
			
		||||
 | 
			
		||||
import android.view.View
 | 
			
		||||
import androidx.recyclerview.widget.RecyclerView
 | 
			
		||||
import eu.davidea.flexibleadapter.FlexibleAdapter
 | 
			
		||||
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem
 | 
			
		||||
import eu.davidea.flexibleadapter.items.IFlexible
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.models.Manga
 | 
			
		||||
 | 
			
		||||
@@ -12,11 +14,11 @@ class CatalogueSearchCardItem(val manga: Manga) : AbstractFlexibleItem<Catalogue
 | 
			
		||||
        return R.layout.catalogue_global_search_controller_card_item
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun createViewHolder(view: View, adapter: FlexibleAdapter<*>): CatalogueSearchCardHolder {
 | 
			
		||||
    override fun createViewHolder(view: View, adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>): CatalogueSearchCardHolder {
 | 
			
		||||
        return CatalogueSearchCardHolder(view, adapter as CatalogueSearchCardAdapter)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun bindViewHolder(adapter: FlexibleAdapter<*>, holder: CatalogueSearchCardHolder,
 | 
			
		||||
    override fun bindViewHolder(adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>, holder: CatalogueSearchCardHolder,
 | 
			
		||||
                                position: Int, payloads: List<Any?>?) {
 | 
			
		||||
        holder.bind(manga)
 | 
			
		||||
    }
 | 
			
		||||
@@ -32,4 +34,4 @@ class CatalogueSearchCardItem(val manga: Manga) : AbstractFlexibleItem<Catalogue
 | 
			
		||||
        return manga.id?.toInt() ?: 0
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,8 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.catalogue.global_search
 | 
			
		||||
 | 
			
		||||
import android.os.Bundle
 | 
			
		||||
import android.support.v7.widget.LinearLayoutManager
 | 
			
		||||
import android.support.v7.widget.SearchView
 | 
			
		||||
import androidx.recyclerview.widget.LinearLayoutManager
 | 
			
		||||
import androidx.appcompat.widget.SearchView
 | 
			
		||||
import android.view.*
 | 
			
		||||
import com.jakewharton.rxbinding.support.v7.widget.queryTextChangeEvents
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.catalogue.global_search
 | 
			
		||||
 | 
			
		||||
import android.support.v7.widget.LinearLayoutManager
 | 
			
		||||
import androidx.recyclerview.widget.LinearLayoutManager
 | 
			
		||||
import android.view.View
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.models.Manga
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,10 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.catalogue.global_search
 | 
			
		||||
 | 
			
		||||
import android.view.View
 | 
			
		||||
import androidx.recyclerview.widget.RecyclerView
 | 
			
		||||
import eu.davidea.flexibleadapter.FlexibleAdapter
 | 
			
		||||
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem
 | 
			
		||||
import eu.davidea.flexibleadapter.items.IFlexible
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.source.CatalogueSource
 | 
			
		||||
 | 
			
		||||
@@ -30,14 +32,14 @@ class CatalogueSearchItem(val source: CatalogueSource, val results: List<Catalog
 | 
			
		||||
     *
 | 
			
		||||
     * @return holder of view.
 | 
			
		||||
     */
 | 
			
		||||
    override fun createViewHolder(view: View, adapter: FlexibleAdapter<*>): CatalogueSearchHolder {
 | 
			
		||||
    override fun createViewHolder(view: View, adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>): CatalogueSearchHolder {
 | 
			
		||||
        return CatalogueSearchHolder(view, adapter as CatalogueSearchAdapter)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Bind item to view.
 | 
			
		||||
     */
 | 
			
		||||
    override fun bindViewHolder(adapter: FlexibleAdapter<*>, holder: CatalogueSearchHolder,
 | 
			
		||||
    override fun bindViewHolder(adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>, holder: CatalogueSearchHolder,
 | 
			
		||||
                                position: Int, payloads: List<Any?>?) {
 | 
			
		||||
        holder.bind(this)
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.catalogue.latest
 | 
			
		||||
 | 
			
		||||
import android.os.Bundle
 | 
			
		||||
import android.support.v4.widget.DrawerLayout
 | 
			
		||||
import androidx.drawerlayout.widget.DrawerLayout
 | 
			
		||||
import android.view.Menu
 | 
			
		||||
import android.view.ViewGroup
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
 
 | 
			
		||||
@@ -1,10 +1,10 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.category
 | 
			
		||||
 | 
			
		||||
import android.support.design.widget.Snackbar
 | 
			
		||||
import android.support.v7.app.AppCompatActivity
 | 
			
		||||
import android.support.v7.view.ActionMode
 | 
			
		||||
import android.support.v7.widget.LinearLayoutManager
 | 
			
		||||
import android.support.v7.widget.RecyclerView
 | 
			
		||||
import com.google.android.material.snackbar.Snackbar
 | 
			
		||||
import androidx.appcompat.app.AppCompatActivity
 | 
			
		||||
import androidx.appcompat.view.ActionMode
 | 
			
		||||
import androidx.recyclerview.widget.LinearLayoutManager
 | 
			
		||||
import androidx.recyclerview.widget.RecyclerView
 | 
			
		||||
import android.view.*
 | 
			
		||||
import com.jakewharton.rxbinding.view.clicks
 | 
			
		||||
import eu.davidea.flexibleadapter.FlexibleAdapter
 | 
			
		||||
@@ -205,7 +205,7 @@ class CategoryController : NucleusController<CategoryPresenter>(),
 | 
			
		||||
     * @param position The position of the clicked item.
 | 
			
		||||
     * @return true if this click should enable selection mode.
 | 
			
		||||
     */
 | 
			
		||||
    override fun onItemClick(position: Int): Boolean {
 | 
			
		||||
    override fun onItemClick(view: View, position: Int): Boolean {
 | 
			
		||||
        // Check if action mode is initialized and selected item exist.
 | 
			
		||||
        if (actionMode != null && position != RecyclerView.NO_POSITION) {
 | 
			
		||||
            toggleSelection(position)
 | 
			
		||||
@@ -320,4 +320,4 @@ class CategoryController : NucleusController<CategoryPresenter>(),
 | 
			
		||||
        activity?.toast(R.string.error_category_exists)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,10 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.category
 | 
			
		||||
 | 
			
		||||
import android.view.View
 | 
			
		||||
import androidx.recyclerview.widget.RecyclerView
 | 
			
		||||
import eu.davidea.flexibleadapter.FlexibleAdapter
 | 
			
		||||
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem
 | 
			
		||||
import eu.davidea.flexibleadapter.items.IFlexible
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.models.Category
 | 
			
		||||
 | 
			
		||||
@@ -29,7 +31,7 @@ class CategoryItem(val category: Category) : AbstractFlexibleItem<CategoryHolder
 | 
			
		||||
     * @param view The view of this item.
 | 
			
		||||
     * @param adapter The adapter of this item.
 | 
			
		||||
     */
 | 
			
		||||
    override fun createViewHolder(view: View, adapter: FlexibleAdapter<*>): CategoryHolder {
 | 
			
		||||
    override fun createViewHolder(view: View, adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>): CategoryHolder {
 | 
			
		||||
        return CategoryHolder(view, adapter as CategoryAdapter)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -41,7 +43,7 @@ class CategoryItem(val category: Category) : AbstractFlexibleItem<CategoryHolder
 | 
			
		||||
     * @param position The position of this item in the adapter.
 | 
			
		||||
     * @param payloads List of partial changes.
 | 
			
		||||
     */
 | 
			
		||||
    override fun bindViewHolder(adapter: FlexibleAdapter<*>,
 | 
			
		||||
    override fun bindViewHolder(adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>,
 | 
			
		||||
                                holder: CategoryHolder,
 | 
			
		||||
                                position: Int,
 | 
			
		||||
                                payloads: List<Any?>?) {
 | 
			
		||||
@@ -68,4 +70,4 @@ class CategoryItem(val category: Category) : AbstractFlexibleItem<CategoryHolder
 | 
			
		||||
        return category.id!!
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.download
 | 
			
		||||
 | 
			
		||||
import android.support.v7.widget.RecyclerView
 | 
			
		||||
import androidx.recyclerview.widget.RecyclerView
 | 
			
		||||
import android.view.ViewGroup
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.data.download.model.Download
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.download
 | 
			
		||||
 | 
			
		||||
import android.support.v7.widget.LinearLayoutManager
 | 
			
		||||
import androidx.recyclerview.widget.LinearLayoutManager
 | 
			
		||||
import android.view.*
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.data.download.DownloadService
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.extension
 | 
			
		||||
 | 
			
		||||
import android.support.v7.widget.LinearLayoutManager
 | 
			
		||||
import android.support.v7.widget.SearchView
 | 
			
		||||
import androidx.recyclerview.widget.LinearLayoutManager
 | 
			
		||||
import androidx.appcompat.widget.SearchView
 | 
			
		||||
import android.view.LayoutInflater
 | 
			
		||||
import android.view.Menu
 | 
			
		||||
import android.view.MenuInflater
 | 
			
		||||
@@ -116,7 +116,7 @@ open class ExtensionController : NucleusController<ExtensionPresenter>(),
 | 
			
		||||
        searchItem.fixExpand()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun onItemClick(position: Int): Boolean {
 | 
			
		||||
    override fun onItemClick(view: View, position: Int): Boolean {
 | 
			
		||||
        val extension = (adapter?.getItem(position) as? ExtensionItem)?.extension ?: return false
 | 
			
		||||
        if (extension is Extension.Installed) {
 | 
			
		||||
            openDetails(extension)
 | 
			
		||||
 
 | 
			
		||||
@@ -3,11 +3,10 @@ package eu.kanade.tachiyomi.ui.extension
 | 
			
		||||
import android.annotation.SuppressLint
 | 
			
		||||
import android.content.Context
 | 
			
		||||
import android.os.Bundle
 | 
			
		||||
import android.support.v7.preference.*
 | 
			
		||||
import android.support.v7.preference.internal.AbstractMultiSelectListPreference
 | 
			
		||||
import android.support.v7.widget.DividerItemDecoration
 | 
			
		||||
import android.support.v7.widget.DividerItemDecoration.VERTICAL
 | 
			
		||||
import android.support.v7.widget.LinearLayoutManager
 | 
			
		||||
import androidx.preference.*
 | 
			
		||||
import androidx.recyclerview.widget.DividerItemDecoration
 | 
			
		||||
import androidx.recyclerview.widget.DividerItemDecoration.VERTICAL
 | 
			
		||||
import androidx.recyclerview.widget.LinearLayoutManager
 | 
			
		||||
import android.util.TypedValue
 | 
			
		||||
import android.view.ContextThemeWrapper
 | 
			
		||||
import android.view.LayoutInflater
 | 
			
		||||
@@ -74,7 +73,7 @@ class ExtensionDetailsController(bundle: Bundle? = null) :
 | 
			
		||||
        val manager = PreferenceManager(themedContext)
 | 
			
		||||
        manager.preferenceDataStore = EmptyPreferenceDataStore()
 | 
			
		||||
        manager.onDisplayPreferenceDialogListener = this
 | 
			
		||||
        val screen = manager.createPreferenceScreen(themedContext)
 | 
			
		||||
        val screen = manager.createPreferenceScreen(context)
 | 
			
		||||
        preferenceScreen = screen
 | 
			
		||||
 | 
			
		||||
        val multiSource = extension.sources.size > 1
 | 
			
		||||
@@ -136,10 +135,13 @@ class ExtensionDetailsController(bundle: Bundle? = null) :
 | 
			
		||||
            val newScreen = screen.preferenceManager.createPreferenceScreen(context)
 | 
			
		||||
            source.setupPreferenceScreen(newScreen)
 | 
			
		||||
 | 
			
		||||
            for (i in 0 until newScreen.preferenceCount) {
 | 
			
		||||
                val pref = newScreen.getPreference(i)
 | 
			
		||||
            // Reparent the preferences
 | 
			
		||||
            while (newScreen.preferenceCount != 0) {
 | 
			
		||||
                val pref = newScreen.getPreference(0)
 | 
			
		||||
                pref.preferenceDataStore = dataStore
 | 
			
		||||
                pref.order = Int.MAX_VALUE // reset to default order
 | 
			
		||||
 | 
			
		||||
                newScreen.removePreference(pref)
 | 
			
		||||
                screen.addPreference(pref)
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
@@ -165,7 +167,7 @@ class ExtensionDetailsController(bundle: Bundle? = null) :
 | 
			
		||||
                    .newInstance(preference.getKey())
 | 
			
		||||
            is ListPreference -> ListPreferenceDialogController
 | 
			
		||||
                    .newInstance(preference.getKey())
 | 
			
		||||
            is AbstractMultiSelectListPreference -> MultiSelectListPreferenceDialogController
 | 
			
		||||
            is MultiSelectListPreference -> MultiSelectListPreferenceDialogController
 | 
			
		||||
                    .newInstance(preference.getKey())
 | 
			
		||||
            else -> throw IllegalArgumentException("Tried to display dialog for unknown " +
 | 
			
		||||
                    "preference type. Did you forget to override onDisplayPreferenceDialog()?")
 | 
			
		||||
@@ -174,8 +176,8 @@ class ExtensionDetailsController(bundle: Bundle? = null) :
 | 
			
		||||
        f.showDialog(router)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun findPreference(key: CharSequence?): Preference {
 | 
			
		||||
        return preferenceScreen!!.getPreference(lastOpenPreferencePosition!!)
 | 
			
		||||
    override fun <T : Preference> findPreference(key: CharSequence): T? {
 | 
			
		||||
        return preferenceScreen!!.findPreference(key)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun loginDialogClosed(source: LoginSource) {
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@ import android.content.Context
 | 
			
		||||
import android.graphics.Canvas
 | 
			
		||||
import android.graphics.Rect
 | 
			
		||||
import android.graphics.drawable.Drawable
 | 
			
		||||
import android.support.v7.widget.RecyclerView
 | 
			
		||||
import androidx.recyclerview.widget.RecyclerView
 | 
			
		||||
import android.view.View
 | 
			
		||||
 | 
			
		||||
class ExtensionDividerItemDecoration(context: Context) : RecyclerView.ItemDecoration() {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,10 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.extension
 | 
			
		||||
 | 
			
		||||
import android.view.View
 | 
			
		||||
import androidx.recyclerview.widget.RecyclerView
 | 
			
		||||
import eu.davidea.flexibleadapter.FlexibleAdapter
 | 
			
		||||
import eu.davidea.flexibleadapter.items.AbstractHeaderItem
 | 
			
		||||
import eu.davidea.flexibleadapter.items.IFlexible
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -23,14 +25,14 @@ data class ExtensionGroupItem(val name: String, val size: Int) : AbstractHeaderI
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates a new view holder for this item.
 | 
			
		||||
     */
 | 
			
		||||
    override fun createViewHolder(view: View, adapter: FlexibleAdapter<*>): ExtensionGroupHolder {
 | 
			
		||||
    override fun createViewHolder(view: View, adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>): ExtensionGroupHolder {
 | 
			
		||||
        return ExtensionGroupHolder(view, adapter)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Binds this item to the given view holder.
 | 
			
		||||
     */
 | 
			
		||||
    override fun bindViewHolder(adapter: FlexibleAdapter<*>, holder: ExtensionGroupHolder,
 | 
			
		||||
    override fun bindViewHolder(adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>, holder: ExtensionGroupHolder,
 | 
			
		||||
                                position: Int, payloads: List<Any?>?) {
 | 
			
		||||
 | 
			
		||||
        holder.bind(this)
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,10 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.extension
 | 
			
		||||
 | 
			
		||||
import android.view.View
 | 
			
		||||
import androidx.recyclerview.widget.RecyclerView
 | 
			
		||||
import eu.davidea.flexibleadapter.FlexibleAdapter
 | 
			
		||||
import eu.davidea.flexibleadapter.items.AbstractSectionableItem
 | 
			
		||||
import eu.davidea.flexibleadapter.items.IFlexible
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.extension.model.Extension
 | 
			
		||||
import eu.kanade.tachiyomi.extension.model.InstallStep
 | 
			
		||||
@@ -29,14 +31,14 @@ data class ExtensionItem(val extension: Extension,
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates a new view holder for this item.
 | 
			
		||||
     */
 | 
			
		||||
    override fun createViewHolder(view: View, adapter: FlexibleAdapter<*>): ExtensionHolder {
 | 
			
		||||
    override fun createViewHolder(view: View, adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>): ExtensionHolder {
 | 
			
		||||
        return ExtensionHolder(view, adapter as ExtensionAdapter)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Binds this item to the given view holder.
 | 
			
		||||
     */
 | 
			
		||||
    override fun bindViewHolder(adapter: FlexibleAdapter<*>, holder: ExtensionHolder,
 | 
			
		||||
    override fun bindViewHolder(adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>, holder: ExtensionHolder,
 | 
			
		||||
                                position: Int, payloads: List<Any?>?) {
 | 
			
		||||
 | 
			
		||||
        if (payloads == null || payloads.isEmpty()) {
 | 
			
		||||
 
 | 
			
		||||
@@ -38,7 +38,11 @@ class LibraryCategoryAdapter(view: LibraryCategoryView) :
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun performFilter() {
 | 
			
		||||
        updateDataSet(mangas.filter { it.filter(searchText) })
 | 
			
		||||
        var s = getFilter(String::class.java)
 | 
			
		||||
        if (s == null) {
 | 
			
		||||
            s = ""
 | 
			
		||||
        }
 | 
			
		||||
        updateDataSet(mangas.filter { it.filter(s) })
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,10 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.library
 | 
			
		||||
 | 
			
		||||
import android.content.Context
 | 
			
		||||
import android.support.v7.widget.LinearLayoutManager
 | 
			
		||||
import android.support.v7.widget.RecyclerView
 | 
			
		||||
import androidx.recyclerview.widget.LinearLayoutManager
 | 
			
		||||
import androidx.recyclerview.widget.RecyclerView
 | 
			
		||||
import android.util.AttributeSet
 | 
			
		||||
import android.view.View
 | 
			
		||||
import android.widget.FrameLayout
 | 
			
		||||
import eu.davidea.flexibleadapter.FlexibleAdapter
 | 
			
		||||
import eu.davidea.flexibleadapter.SelectableAdapter
 | 
			
		||||
@@ -110,7 +111,7 @@ class LibraryCategoryView @JvmOverloads constructor(context: Context, attrs: Att
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        subscriptions += controller.searchRelay
 | 
			
		||||
                .doOnNext { adapter.searchText = it }
 | 
			
		||||
                .doOnNext { adapter.setFilter(it) }
 | 
			
		||||
                .skip(1)
 | 
			
		||||
                .subscribe { adapter.performFilter() }
 | 
			
		||||
 | 
			
		||||
@@ -201,7 +202,7 @@ class LibraryCategoryView @JvmOverloads constructor(context: Context, attrs: Att
 | 
			
		||||
     * @param position the position of the element clicked.
 | 
			
		||||
     * @return true if the item should be selected, false otherwise.
 | 
			
		||||
     */
 | 
			
		||||
    override fun onItemClick(position: Int): Boolean {
 | 
			
		||||
    override fun onItemClick(view: View, position: Int): Boolean {
 | 
			
		||||
        // If the action mode is created and the position is valid, toggle the selection.
 | 
			
		||||
        val item = adapter.getItem(position) ?: return false
 | 
			
		||||
        if (adapter.mode == SelectableAdapter.Mode.MULTI) {
 | 
			
		||||
 
 | 
			
		||||
@@ -5,13 +5,14 @@ import android.content.Intent
 | 
			
		||||
import android.content.res.Configuration
 | 
			
		||||
import android.graphics.Color
 | 
			
		||||
import android.os.Bundle
 | 
			
		||||
import android.support.design.widget.TabLayout
 | 
			
		||||
import android.support.v4.graphics.drawable.DrawableCompat
 | 
			
		||||
import android.support.v4.widget.DrawerLayout
 | 
			
		||||
import android.support.v7.app.AppCompatActivity
 | 
			
		||||
import android.support.v7.view.ActionMode
 | 
			
		||||
import android.support.v7.widget.SearchView
 | 
			
		||||
import com.google.android.material.tabs.TabLayout
 | 
			
		||||
import androidx.core.graphics.drawable.DrawableCompat
 | 
			
		||||
import androidx.drawerlayout.widget.DrawerLayout
 | 
			
		||||
import androidx.appcompat.app.AppCompatActivity
 | 
			
		||||
import androidx.appcompat.view.ActionMode
 | 
			
		||||
import androidx.appcompat.widget.SearchView
 | 
			
		||||
import android.view.*
 | 
			
		||||
import androidx.core.view.GravityCompat
 | 
			
		||||
import com.bluelinelabs.conductor.ControllerChangeHandler
 | 
			
		||||
import com.bluelinelabs.conductor.ControllerChangeType
 | 
			
		||||
import com.f2prateek.rx.preferences.Preference
 | 
			
		||||
@@ -353,7 +354,7 @@ class LibraryController(
 | 
			
		||||
    override fun onOptionsItemSelected(item: MenuItem): Boolean {
 | 
			
		||||
        when (item.itemId) {
 | 
			
		||||
            R.id.action_filter -> {
 | 
			
		||||
                navView?.let { activity?.drawer?.openDrawer(Gravity.END) }
 | 
			
		||||
                navView?.let { activity?.drawer?.openDrawer(GravityCompat.END) }
 | 
			
		||||
            }
 | 
			
		||||
            R.id.action_update_library -> {
 | 
			
		||||
                activity?.let { LibraryUpdateService.start(it) }
 | 
			
		||||
 
 | 
			
		||||
@@ -4,10 +4,12 @@ import android.view.Gravity
 | 
			
		||||
import android.view.View
 | 
			
		||||
import android.view.ViewGroup.LayoutParams.MATCH_PARENT
 | 
			
		||||
import android.widget.FrameLayout
 | 
			
		||||
import androidx.recyclerview.widget.RecyclerView
 | 
			
		||||
import com.f2prateek.rx.preferences.Preference
 | 
			
		||||
import eu.davidea.flexibleadapter.FlexibleAdapter
 | 
			
		||||
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem
 | 
			
		||||
import eu.davidea.flexibleadapter.items.IFilterable
 | 
			
		||||
import eu.davidea.flexibleadapter.items.IFlexible
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.models.LibraryManga
 | 
			
		||||
import eu.kanade.tachiyomi.data.preference.getOrDefault
 | 
			
		||||
@@ -15,7 +17,7 @@ import eu.kanade.tachiyomi.widget.AutofitRecyclerView
 | 
			
		||||
import kotlinx.android.synthetic.main.catalogue_grid_item.view.*
 | 
			
		||||
 | 
			
		||||
class LibraryItem(val manga: LibraryManga, private val libraryAsList: Preference<Boolean>) :
 | 
			
		||||
        AbstractFlexibleItem<LibraryHolder>(), IFilterable {
 | 
			
		||||
        AbstractFlexibleItem<LibraryHolder>(), IFilterable<String> {
 | 
			
		||||
 | 
			
		||||
    var downloadCount = -1
 | 
			
		||||
 | 
			
		||||
@@ -26,7 +28,7 @@ class LibraryItem(val manga: LibraryManga, private val libraryAsList: Preference
 | 
			
		||||
            R.layout.catalogue_grid_item
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun createViewHolder(view: View, adapter: FlexibleAdapter<*>): LibraryHolder {
 | 
			
		||||
    override fun createViewHolder(view: View, adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>): LibraryHolder {
 | 
			
		||||
        val parent = adapter.recyclerView
 | 
			
		||||
        return if (parent is AutofitRecyclerView) {
 | 
			
		||||
            view.apply {
 | 
			
		||||
@@ -41,7 +43,7 @@ class LibraryItem(val manga: LibraryManga, private val libraryAsList: Preference
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun bindViewHolder(adapter: FlexibleAdapter<*>,
 | 
			
		||||
    override fun bindViewHolder(adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>,
 | 
			
		||||
                                holder: LibraryHolder,
 | 
			
		||||
                                position: Int,
 | 
			
		||||
                                payloads: List<Any?>?) {
 | 
			
		||||
@@ -70,4 +72,4 @@ class LibraryItem(val manga: LibraryManga, private val libraryAsList: Preference
 | 
			
		||||
    override fun hashCode(): Int {
 | 
			
		||||
        return manga.id!!.hashCode()
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -5,9 +5,9 @@ import android.app.SearchManager
 | 
			
		||||
import android.content.Intent
 | 
			
		||||
import android.graphics.Color
 | 
			
		||||
import android.os.Bundle
 | 
			
		||||
import android.support.v4.view.GravityCompat
 | 
			
		||||
import android.support.v4.widget.DrawerLayout
 | 
			
		||||
import android.support.v7.graphics.drawable.DrawerArrowDrawable
 | 
			
		||||
import androidx.core.view.GravityCompat
 | 
			
		||||
import androidx.drawerlayout.widget.DrawerLayout
 | 
			
		||||
import androidx.appcompat.graphics.drawable.DrawerArrowDrawable
 | 
			
		||||
import android.view.ViewGroup
 | 
			
		||||
import com.bluelinelabs.conductor.*
 | 
			
		||||
import eu.kanade.tachiyomi.Migrations
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.main
 | 
			
		||||
 | 
			
		||||
import android.animation.ObjectAnimator
 | 
			
		||||
import android.support.design.widget.TabLayout
 | 
			
		||||
import com.google.android.material.tabs.TabLayout
 | 
			
		||||
import android.view.ViewTreeObserver
 | 
			
		||||
import android.view.animation.DecelerateInterpolator
 | 
			
		||||
 | 
			
		||||
@@ -103,4 +103,4 @@ class TabsAnimator(val tabs: TabLayout) {
 | 
			
		||||
    private val isMeasured: Boolean
 | 
			
		||||
        get() = tabsHeight > 0
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -2,8 +2,8 @@ package eu.kanade.tachiyomi.ui.manga
 | 
			
		||||
 | 
			
		||||
import android.Manifest.permission.WRITE_EXTERNAL_STORAGE
 | 
			
		||||
import android.os.Bundle
 | 
			
		||||
import android.support.design.widget.TabLayout
 | 
			
		||||
import android.support.graphics.drawable.VectorDrawableCompat
 | 
			
		||||
import com.google.android.material.tabs.TabLayout
 | 
			
		||||
import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat
 | 
			
		||||
import android.view.LayoutInflater
 | 
			
		||||
import android.view.View
 | 
			
		||||
import android.view.ViewGroup
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,10 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.manga.chapter
 | 
			
		||||
 | 
			
		||||
import android.view.View
 | 
			
		||||
import androidx.recyclerview.widget.RecyclerView
 | 
			
		||||
import eu.davidea.flexibleadapter.FlexibleAdapter
 | 
			
		||||
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem
 | 
			
		||||
import eu.davidea.flexibleadapter.items.IFlexible
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.models.Chapter
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.models.Manga
 | 
			
		||||
@@ -26,11 +28,11 @@ class ChapterItem(val chapter: Chapter, val manga: Manga) : AbstractFlexibleItem
 | 
			
		||||
        return R.layout.chapters_item
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun createViewHolder(view: View, adapter: FlexibleAdapter<*>): ChapterHolder {
 | 
			
		||||
    override fun createViewHolder(view: View, adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>): ChapterHolder {
 | 
			
		||||
        return ChapterHolder(view, adapter as ChaptersAdapter)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun bindViewHolder(adapter: FlexibleAdapter<*>,
 | 
			
		||||
    override fun bindViewHolder(adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>,
 | 
			
		||||
                                holder: ChapterHolder,
 | 
			
		||||
                                position: Int,
 | 
			
		||||
                                payloads: List<Any?>?) {
 | 
			
		||||
@@ -50,4 +52,4 @@ class ChapterItem(val chapter: Chapter, val manga: Manga) : AbstractFlexibleItem
 | 
			
		||||
        return chapter.id!!.hashCode()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -5,11 +5,11 @@ import android.animation.AnimatorListenerAdapter
 | 
			
		||||
import android.annotation.SuppressLint
 | 
			
		||||
import android.app.Activity
 | 
			
		||||
import android.content.Intent
 | 
			
		||||
import android.support.design.widget.Snackbar
 | 
			
		||||
import android.support.v7.app.AppCompatActivity
 | 
			
		||||
import android.support.v7.view.ActionMode
 | 
			
		||||
import android.support.v7.widget.DividerItemDecoration
 | 
			
		||||
import android.support.v7.widget.LinearLayoutManager
 | 
			
		||||
import com.google.android.material.snackbar.Snackbar
 | 
			
		||||
import androidx.appcompat.app.AppCompatActivity
 | 
			
		||||
import androidx.appcompat.view.ActionMode
 | 
			
		||||
import androidx.recyclerview.widget.DividerItemDecoration
 | 
			
		||||
import androidx.recyclerview.widget.LinearLayoutManager
 | 
			
		||||
import android.view.*
 | 
			
		||||
import com.jakewharton.rxbinding.support.v4.widget.refreshes
 | 
			
		||||
import com.jakewharton.rxbinding.view.clicks
 | 
			
		||||
@@ -242,7 +242,7 @@ class ChaptersController : NucleusController<ChaptersPresenter>(),
 | 
			
		||||
        startActivity(intent)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun onItemClick(position: Int): Boolean {
 | 
			
		||||
    override fun onItemClick(view: View, position: Int): Boolean {
 | 
			
		||||
        val adapter = adapter ?: return false
 | 
			
		||||
        val item = adapter.getItem(position) ?: return false
 | 
			
		||||
        if (actionMode != null && adapter.mode == SelectableAdapter.Mode.MULTI) {
 | 
			
		||||
 
 | 
			
		||||
@@ -11,10 +11,10 @@ import android.graphics.drawable.Drawable
 | 
			
		||||
import android.net.Uri
 | 
			
		||||
import android.os.Build
 | 
			
		||||
import android.os.Bundle
 | 
			
		||||
import android.support.customtabs.CustomTabsIntent
 | 
			
		||||
import android.support.v4.content.pm.ShortcutInfoCompat
 | 
			
		||||
import android.support.v4.content.pm.ShortcutManagerCompat
 | 
			
		||||
import android.support.v4.graphics.drawable.IconCompat
 | 
			
		||||
import androidx.browser.customtabs.CustomTabsIntent
 | 
			
		||||
import androidx.core.content.pm.ShortcutInfoCompat
 | 
			
		||||
import androidx.core.content.pm.ShortcutManagerCompat
 | 
			
		||||
import androidx.core.graphics.drawable.IconCompat
 | 
			
		||||
import android.view.*
 | 
			
		||||
import android.widget.Toast
 | 
			
		||||
import com.afollestad.materialdialogs.MaterialDialog
 | 
			
		||||
@@ -291,14 +291,14 @@ class MangaInfoController : NucleusController<MangaInfoPresenter>(),
 | 
			
		||||
        val context = view?.context ?: return
 | 
			
		||||
        val source = presenter.source as? HttpSource ?: return
 | 
			
		||||
 | 
			
		||||
        context.openInBrowser(source.mangaDetailsRequest(presenter.manga).url().toString())
 | 
			
		||||
        context.openInBrowser(source.mangaDetailsRequest(presenter.manga).url.toString())
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun openInWebView() {
 | 
			
		||||
        val source = presenter.source as? HttpSource ?: return
 | 
			
		||||
 | 
			
		||||
        val url = try {
 | 
			
		||||
            source.mangaDetailsRequest(presenter.manga).url().toString()
 | 
			
		||||
            source.mangaDetailsRequest(presenter.manga).url.toString()
 | 
			
		||||
        } catch (e: Exception) {
 | 
			
		||||
            return
 | 
			
		||||
        }
 | 
			
		||||
@@ -315,7 +315,7 @@ class MangaInfoController : NucleusController<MangaInfoPresenter>(),
 | 
			
		||||
 | 
			
		||||
        val source = presenter.source as? HttpSource ?: return
 | 
			
		||||
        try {
 | 
			
		||||
            val url = source.mangaDetailsRequest(presenter.manga).url().toString()
 | 
			
		||||
            val url = source.mangaDetailsRequest(presenter.manga).url.toString()
 | 
			
		||||
            val intent = Intent(Intent.ACTION_SEND).apply {
 | 
			
		||||
                type = "text/plain"
 | 
			
		||||
                putExtra(Intent.EXTRA_TEXT, url)
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.manga.track
 | 
			
		||||
 | 
			
		||||
import android.support.v7.widget.RecyclerView
 | 
			
		||||
import androidx.recyclerview.widget.RecyclerView
 | 
			
		||||
import android.view.ViewGroup
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.util.inflate
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@ package eu.kanade.tachiyomi.ui.manga.track
 | 
			
		||||
 | 
			
		||||
import android.content.Intent
 | 
			
		||||
import android.net.Uri
 | 
			
		||||
import android.support.v7.widget.LinearLayoutManager
 | 
			
		||||
import androidx.recyclerview.widget.LinearLayoutManager
 | 
			
		||||
import android.view.LayoutInflater
 | 
			
		||||
import android.view.View
 | 
			
		||||
import android.view.ViewGroup
 | 
			
		||||
@@ -139,4 +139,4 @@ class TrackController : NucleusController<TrackPresenter>(),
 | 
			
		||||
        const val TAG_SEARCH_CONTROLLER = "track_search_controller"
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,10 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.migration
 | 
			
		||||
 | 
			
		||||
import android.view.View
 | 
			
		||||
import androidx.recyclerview.widget.RecyclerView
 | 
			
		||||
import eu.davidea.flexibleadapter.FlexibleAdapter
 | 
			
		||||
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem
 | 
			
		||||
import eu.davidea.flexibleadapter.items.IFlexible
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.models.Manga
 | 
			
		||||
 | 
			
		||||
@@ -12,11 +14,11 @@ class MangaItem(val manga: Manga) : AbstractFlexibleItem<MangaHolder>() {
 | 
			
		||||
        return R.layout.catalogue_list_item
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun createViewHolder(view: View, adapter: FlexibleAdapter<*>): MangaHolder {
 | 
			
		||||
    override fun createViewHolder(view: View, adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>): MangaHolder {
 | 
			
		||||
        return MangaHolder(view, adapter)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun bindViewHolder(adapter: FlexibleAdapter<*>,
 | 
			
		||||
    override fun bindViewHolder(adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>,
 | 
			
		||||
                                holder: MangaHolder,
 | 
			
		||||
                                position: Int,
 | 
			
		||||
                                payloads: List<Any?>?) {
 | 
			
		||||
@@ -34,4 +36,4 @@ class MangaItem(val manga: Manga) : AbstractFlexibleItem<MangaHolder>() {
 | 
			
		||||
    override fun hashCode(): Int {
 | 
			
		||||
        return manga.id!!.hashCode()
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@ package eu.kanade.tachiyomi.ui.migration
 | 
			
		||||
 | 
			
		||||
import android.app.Dialog
 | 
			
		||||
import android.os.Bundle
 | 
			
		||||
import android.support.v7.widget.LinearLayoutManager
 | 
			
		||||
import androidx.recyclerview.widget.LinearLayoutManager
 | 
			
		||||
import android.view.LayoutInflater
 | 
			
		||||
import android.view.View
 | 
			
		||||
import android.view.ViewGroup
 | 
			
		||||
@@ -91,7 +91,7 @@ class MigrationController : NucleusController<MigrationPresenter>(),
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun onItemClick(position: Int): Boolean {
 | 
			
		||||
    override fun onItemClick(view: View, position: Int): Boolean {
 | 
			
		||||
        val item = adapter?.getItem(position) ?: return false
 | 
			
		||||
 | 
			
		||||
        if (item is MangaItem) {
 | 
			
		||||
@@ -106,7 +106,7 @@ class MigrationController : NucleusController<MigrationPresenter>(),
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun onSelectClick(position: Int) {
 | 
			
		||||
        onItemClick(position)
 | 
			
		||||
        onItemClick(view!!, position)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun migrateManga(prevManga: Manga, manga: Manga) {
 | 
			
		||||
@@ -132,4 +132,4 @@ class MigrationController : NucleusController<MigrationPresenter>(),
 | 
			
		||||
        const val LOADING_DIALOG_TAG = "LoadingDialog"
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,10 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.migration
 | 
			
		||||
 | 
			
		||||
import android.view.View
 | 
			
		||||
import androidx.recyclerview.widget.RecyclerView
 | 
			
		||||
import eu.davidea.flexibleadapter.FlexibleAdapter
 | 
			
		||||
import eu.davidea.flexibleadapter.items.AbstractHeaderItem
 | 
			
		||||
import eu.davidea.flexibleadapter.items.IFlexible
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder
 | 
			
		||||
import kotlinx.android.synthetic.main.catalogue_main_controller_card.title
 | 
			
		||||
@@ -22,14 +24,14 @@ class SelectionHeader : AbstractHeaderItem<SelectionHeader.Holder>() {
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates a new view holder for this item.
 | 
			
		||||
     */
 | 
			
		||||
    override fun createViewHolder(view: View, adapter: FlexibleAdapter<*>): Holder {
 | 
			
		||||
    override fun createViewHolder(view: View, adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>): Holder {
 | 
			
		||||
        return SelectionHeader.Holder(view, adapter)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Binds this item to the given view holder.
 | 
			
		||||
     */
 | 
			
		||||
    override fun bindViewHolder(adapter: FlexibleAdapter<*>, holder: Holder,
 | 
			
		||||
    override fun bindViewHolder(adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>, holder: Holder,
 | 
			
		||||
                                position: Int, payloads: List<Any?>?) {
 | 
			
		||||
        // Intentionally empty
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,10 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.migration
 | 
			
		||||
 | 
			
		||||
import android.view.View
 | 
			
		||||
import androidx.recyclerview.widget.RecyclerView
 | 
			
		||||
import eu.davidea.flexibleadapter.FlexibleAdapter
 | 
			
		||||
import eu.davidea.flexibleadapter.items.AbstractSectionableItem
 | 
			
		||||
import eu.davidea.flexibleadapter.items.IFlexible
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.source.Source
 | 
			
		||||
 | 
			
		||||
@@ -25,17 +27,17 @@ data class SourceItem(val source: Source, val header: SelectionHeader? = null) :
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates a new view holder for this item.
 | 
			
		||||
     */
 | 
			
		||||
    override fun createViewHolder(view: View, adapter: FlexibleAdapter<*>): SourceHolder {
 | 
			
		||||
    override fun createViewHolder(view: View, adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>): SourceHolder {
 | 
			
		||||
        return SourceHolder(view, adapter as SourceAdapter)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Binds this item to the given view holder.
 | 
			
		||||
     */
 | 
			
		||||
    override fun bindViewHolder(adapter: FlexibleAdapter<*>, holder: SourceHolder,
 | 
			
		||||
    override fun bindViewHolder(adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>, holder: SourceHolder,
 | 
			
		||||
                                position: Int, payloads: List<Any?>?) {
 | 
			
		||||
 | 
			
		||||
        holder.bind(this)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,7 @@ import android.content.Context
 | 
			
		||||
import android.graphics.Canvas
 | 
			
		||||
import android.graphics.Color
 | 
			
		||||
import android.graphics.Paint
 | 
			
		||||
import android.support.v7.widget.AppCompatTextView
 | 
			
		||||
import androidx.appcompat.widget.AppCompatTextView
 | 
			
		||||
import android.text.Spannable
 | 
			
		||||
import android.text.SpannableString
 | 
			
		||||
import android.text.style.ScaleXSpan
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,9 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.reader
 | 
			
		||||
 | 
			
		||||
import android.graphics.Color
 | 
			
		||||
import android.support.annotation.ColorInt
 | 
			
		||||
import android.support.design.widget.BottomSheetBehavior
 | 
			
		||||
import android.support.design.widget.BottomSheetDialog
 | 
			
		||||
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
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.reader
 | 
			
		||||
 | 
			
		||||
import android.os.Bundle
 | 
			
		||||
import android.support.design.widget.BottomSheetDialog
 | 
			
		||||
import com.google.android.material.bottomsheet.BottomSheetDialog
 | 
			
		||||
import android.view.ViewGroup
 | 
			
		||||
import com.afollestad.materialdialogs.MaterialDialog
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@ package eu.kanade.tachiyomi.ui.reader
 | 
			
		||||
 | 
			
		||||
import android.content.Context
 | 
			
		||||
import android.graphics.Canvas
 | 
			
		||||
import android.support.v7.widget.AppCompatSeekBar
 | 
			
		||||
import androidx.appcompat.widget.AppCompatSeekBar
 | 
			
		||||
import android.util.AttributeSet
 | 
			
		||||
import android.view.MotionEvent
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,8 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.reader
 | 
			
		||||
 | 
			
		||||
import android.os.Bundle
 | 
			
		||||
import android.support.design.widget.BottomSheetDialog
 | 
			
		||||
import android.support.v4.widget.NestedScrollView
 | 
			
		||||
import com.google.android.material.bottomsheet.BottomSheetDialog
 | 
			
		||||
import androidx.core.widget.NestedScrollView
 | 
			
		||||
import android.widget.CompoundButton
 | 
			
		||||
import android.widget.Spinner
 | 
			
		||||
import com.f2prateek.rx.preferences.Preference
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@ package eu.kanade.tachiyomi.ui.reader
 | 
			
		||||
 | 
			
		||||
import android.content.Context
 | 
			
		||||
import android.graphics.Bitmap
 | 
			
		||||
import android.support.v4.app.NotificationCompat
 | 
			
		||||
import androidx.core.app.NotificationCompat
 | 
			
		||||
import com.bumptech.glide.load.engine.DiskCacheStrategy
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.data.glide.GlideApp
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.reader.loader
 | 
			
		||||
 | 
			
		||||
import android.support.annotation.CallSuper
 | 
			
		||||
import androidx.annotation.CallSuper
 | 
			
		||||
import eu.kanade.tachiyomi.ui.reader.model.ReaderPage
 | 
			
		||||
import rx.Observable
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,10 +1,10 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.reader.viewer.pager
 | 
			
		||||
 | 
			
		||||
import android.content.Context
 | 
			
		||||
import android.support.v4.view.DirectionalViewPager
 | 
			
		||||
import android.view.HapticFeedbackConstants
 | 
			
		||||
import android.view.KeyEvent
 | 
			
		||||
import android.view.MotionEvent
 | 
			
		||||
import androidx.viewpager.widget.DirectionalViewPager
 | 
			
		||||
import eu.kanade.tachiyomi.ui.reader.viewer.GestureDetectorWithLongTap
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@ package eu.kanade.tachiyomi.ui.reader.viewer.pager
 | 
			
		||||
 | 
			
		||||
import android.annotation.SuppressLint
 | 
			
		||||
import android.content.Context
 | 
			
		||||
import android.support.v7.widget.AppCompatButton
 | 
			
		||||
import androidx.appcompat.widget.AppCompatButton
 | 
			
		||||
import android.view.MotionEvent
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@ package eu.kanade.tachiyomi.ui.reader.viewer.pager
 | 
			
		||||
 | 
			
		||||
import android.annotation.SuppressLint
 | 
			
		||||
import android.graphics.Typeface
 | 
			
		||||
import android.support.v7.widget.AppCompatTextView
 | 
			
		||||
import androidx.appcompat.widget.AppCompatTextView
 | 
			
		||||
import android.text.SpannableStringBuilder
 | 
			
		||||
import android.text.Spanned
 | 
			
		||||
import android.text.style.StyleSpan
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.reader.viewer.pager
 | 
			
		||||
 | 
			
		||||
import android.support.v4.view.ViewPager
 | 
			
		||||
import androidx.viewpager.widget.ViewPager
 | 
			
		||||
import android.view.InputDevice
 | 
			
		||||
import android.view.KeyEvent
 | 
			
		||||
import android.view.MotionEvent
 | 
			
		||||
 
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user