Bläddra i källkod

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 <[email protected]>
arkon 5 år sedan
förälder
incheckning
78689e7443
100 ändrade filer med 386 tillägg och 321 borttagningar
  1. 28 27
      app/build.gradle
  2. 7 21
      app/proguard-rules.pro
  3. 1 1
      app/src/main/AndroidManifest.xml
  4. 1 1
      app/src/main/java/eu/kanade/tachiyomi/App.kt
  5. 6 5
      app/src/main/java/eu/kanade/tachiyomi/data/cache/ChapterCache.kt
  6. 1 1
      app/src/main/java/eu/kanade/tachiyomi/data/database/DatabaseHelper.kt
  7. 2 2
      app/src/main/java/eu/kanade/tachiyomi/data/database/DbOpenCallback.kt
  8. 1 1
      app/src/main/java/eu/kanade/tachiyomi/data/database/resolvers/HistoryLastReadPutResolver.kt
  9. 1 1
      app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadNotifier.kt
  10. 1 1
      app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadService.kt
  11. 2 2
      app/src/main/java/eu/kanade/tachiyomi/data/download/Downloader.kt
  12. 1 1
      app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt
  13. 2 2
      app/src/main/java/eu/kanade/tachiyomi/data/preference/EmptyPreferenceDataStore.kt
  14. 1 1
      app/src/main/java/eu/kanade/tachiyomi/data/preference/SharedPreferencesDataStore.kt
  15. 2 2
      app/src/main/java/eu/kanade/tachiyomi/data/track/TrackService.kt
  16. 12 7
      app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistApi.kt
  17. 4 4
      app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/BangumiApi.kt
  18. 5 5
      app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/BangumiInterceptor.kt
  19. 2 2
      app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuInterceptor.kt
  20. 1 1
      app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuModels.kt
  21. 4 5
      app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeList.kt
  22. 3 3
      app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeListInterceptor.kt
  23. 13 9
      app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyanimelistApi.kt
  24. 11 7
      app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/ShikimoriApi.kt
  25. 1 1
      app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/ShikimoriInterceptor.kt
  26. 1 1
      app/src/main/java/eu/kanade/tachiyomi/data/updater/UpdaterJob.kt
  27. 2 2
      app/src/main/java/eu/kanade/tachiyomi/data/updater/UpdaterNotifier.kt
  28. 1 1
      app/src/main/java/eu/kanade/tachiyomi/data/updater/UpdaterService.kt
  29. 1 1
      app/src/main/java/eu/kanade/tachiyomi/extension/api/ExtensionGithubApi.kt
  30. 1 1
      app/src/main/java/eu/kanade/tachiyomi/network/AndroidCookieJar.kt
  31. 4 4
      app/src/main/java/eu/kanade/tachiyomi/network/CloudflareInterceptor.kt
  32. 1 1
      app/src/main/java/eu/kanade/tachiyomi/network/NetworkHelper.kt
  33. 4 4
      app/src/main/java/eu/kanade/tachiyomi/network/OkHttpExtensions.kt
  34. 3 3
      app/src/main/java/eu/kanade/tachiyomi/network/ProgressResponseBody.kt
  35. 2 2
      app/src/main/java/eu/kanade/tachiyomi/source/ConfigurableSource.kt
  36. 1 1
      app/src/main/java/eu/kanade/tachiyomi/ui/base/activity/BaseActivity.kt
  37. 1 1
      app/src/main/java/eu/kanade/tachiyomi/ui/base/controller/BaseController.kt
  38. 1 1
      app/src/main/java/eu/kanade/tachiyomi/ui/base/controller/ConductorExtensions.kt
  39. 2 2
      app/src/main/java/eu/kanade/tachiyomi/ui/base/controller/DialogController.java
  40. 2 2
      app/src/main/java/eu/kanade/tachiyomi/ui/base/controller/RxController.kt
  41. 2 2
      app/src/main/java/eu/kanade/tachiyomi/ui/base/controller/SecondaryDrawerController.kt
  42. 2 2
      app/src/main/java/eu/kanade/tachiyomi/ui/base/controller/TabbedController.kt
  43. 2 2
      app/src/main/java/eu/kanade/tachiyomi/ui/base/holder/BaseViewHolder.kt
  44. 1 1
      app/src/main/java/eu/kanade/tachiyomi/ui/base/presenter/NucleusConductorDelegate.java
  45. 1 1
      app/src/main/java/eu/kanade/tachiyomi/ui/base/presenter/NucleusConductorLifecycleListener.java
  46. 5 5
      app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/CatalogueController.kt
  47. 8 4
      app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/LangItem.kt
  48. 1 1
      app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/SourceDividerItemDecoration.kt
  49. 9 5
      app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/SourceItem.kt
  50. 12 7
      app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/browse/BrowseCatalogueController.kt
  51. 13 9
      app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/browse/CatalogueItem.kt
  52. 5 3
      app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/browse/ProgressItem.kt
  53. 5 3
      app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/filter/CheckboxItem.kt
  54. 5 3
      app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/filter/GroupItem.kt
  55. 5 3
      app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/filter/HeaderItem.kt
  56. 5 3
      app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/filter/SelectItem.kt
  57. 6 4
      app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/filter/SeparatorItem.kt
  58. 5 3
      app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/filter/SortGroup.kt
  59. 7 5
      app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/filter/SortItem.kt
  60. 6 4
      app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/filter/TextItem.kt
  61. 7 5
      app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/filter/TriStateItem.kt
  62. 1 1
      app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/global_search/CatalogueSearchAdapter.kt
  63. 5 3
      app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/global_search/CatalogueSearchCardItem.kt
  64. 2 2
      app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/global_search/CatalogueSearchController.kt
  65. 1 1
      app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/global_search/CatalogueSearchHolder.kt
  66. 4 2
      app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/global_search/CatalogueSearchItem.kt
  67. 1 1
      app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/latest/LatestUpdatesController.kt
  68. 7 7
      app/src/main/java/eu/kanade/tachiyomi/ui/category/CategoryController.kt
  69. 5 3
      app/src/main/java/eu/kanade/tachiyomi/ui/category/CategoryItem.kt
  70. 1 1
      app/src/main/java/eu/kanade/tachiyomi/ui/download/DownloadAdapter.kt
  71. 1 1
      app/src/main/java/eu/kanade/tachiyomi/ui/download/DownloadController.kt
  72. 3 3
      app/src/main/java/eu/kanade/tachiyomi/ui/extension/ExtensionController.kt
  73. 13 11
      app/src/main/java/eu/kanade/tachiyomi/ui/extension/ExtensionDetailsController.kt
  74. 1 1
      app/src/main/java/eu/kanade/tachiyomi/ui/extension/ExtensionDividerItemDecoration.kt
  75. 4 2
      app/src/main/java/eu/kanade/tachiyomi/ui/extension/ExtensionGroupItem.kt
  76. 4 2
      app/src/main/java/eu/kanade/tachiyomi/ui/extension/ExtensionItem.kt
  77. 5 1
      app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCategoryAdapter.kt
  78. 5 4
      app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCategoryView.kt
  79. 8 7
      app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt
  80. 6 4
      app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryItem.kt
  81. 3 3
      app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt
  82. 2 2
      app/src/main/java/eu/kanade/tachiyomi/ui/main/TabsAnimator.kt
  83. 2 2
      app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaController.kt
  84. 5 3
      app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChapterItem.kt
  85. 6 6
      app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChaptersController.kt
  86. 7 7
      app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaInfoController.kt
  87. 1 1
      app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackAdapter.kt
  88. 2 2
      app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackController.kt
  89. 5 3
      app/src/main/java/eu/kanade/tachiyomi/ui/migration/MangaItem.kt
  90. 4 4
      app/src/main/java/eu/kanade/tachiyomi/ui/migration/MigrationController.kt
  91. 4 2
      app/src/main/java/eu/kanade/tachiyomi/ui/migration/SelectionHeader.kt
  92. 5 3
      app/src/main/java/eu/kanade/tachiyomi/ui/migration/SourceItem.kt
  93. 1 1
      app/src/main/java/eu/kanade/tachiyomi/ui/reader/PageIndicatorTextView.kt
  94. 3 3
      app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderColorFilterSheet.kt
  95. 1 1
      app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderPageSheet.kt
  96. 1 1
      app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderSeekBar.kt
  97. 2 2
      app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderSettingsSheet.kt
  98. 1 1
      app/src/main/java/eu/kanade/tachiyomi/ui/reader/SaveImageNotifier.kt
  99. 1 1
      app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/PageLoader.kt
  100. 1 1
      app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/Pager.kt

+ 28 - 27
app/build.gradle

@@ -37,7 +37,7 @@ android {
         applicationId "eu.kanade.tachiyomi"
         minSdkVersion 16
         targetSdkVersion 28
-        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
+        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
         versionCode 41
         versionName "0.8.4"
 
@@ -108,21 +108,20 @@ dependencies {
     implementation 'com.github.inorichi:junrar-android:634c1f5'
 
     // Android support library
-    final support_library_version = '28.0.0'
-    implementation "com.android.support:support-v4:$support_library_version"
-    implementation "com.android.support:appcompat-v7:$support_library_version"
-    implementation "com.android.support:cardview-v7:$support_library_version"
-    implementation "com.android.support:design:$support_library_version"
-    implementation "com.android.support:recyclerview-v7:$support_library_version"
-    implementation "com.android.support:preference-v7:$support_library_version"
-    implementation "com.android.support:support-annotations:$support_library_version"
-    implementation "com.android.support:customtabs:$support_library_version"
+    implementation 'androidx.legacy:legacy-support-v4:1.0.0'
+    implementation 'androidx.appcompat:appcompat:1.1.0'
+    implementation 'androidx.cardview:cardview:1.0.0'
+    implementation 'com.google.android.material:material:1.0.0'
+    implementation 'androidx.recyclerview:recyclerview:1.1.0'
+    implementation 'androidx.preference:preference:1.1.0'
+    implementation 'androidx.annotation:annotation:1.1.0'
+    implementation 'androidx.browser:browser:1.2.0'
 
-    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
+    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
 
-    implementation 'com.android.support:multidex:1.0.3'
+    implementation 'androidx.multidex:multidex:2.0.1'
 
-    standardImplementation 'com.google.firebase:firebase-core:11.8.0'
+    standardImplementation 'com.google.firebase:firebase-core:17.2.1'
 
     // ReactiveX
     implementation 'io.reactivex:rxandroid:1.2.1'
@@ -132,17 +131,19 @@ dependencies {
     implementation 'com.github.pwittchen:reactivenetwork:0.13.0'
 
     // Network client
-    implementation "com.squareup.okhttp3:okhttp:3.10.0"
-    implementation 'com.squareup.okio:okio:1.14.0'
+    final okhttp_version = '4.2.1'
+    implementation "com.squareup.okhttp3:okhttp:$okhttp_version"
+    implementation "com.squareup.okhttp3:logging-interceptor:$okhttp_version"
+    implementation 'com.squareup.okio:okio:2.4.0'
 
     // REST
-    final retrofit_version = '2.3.0'
+    final retrofit_version = '2.6.2'
     implementation "com.squareup.retrofit2:retrofit:$retrofit_version"
     implementation "com.squareup.retrofit2:converter-gson:$retrofit_version"
     implementation "com.squareup.retrofit2:adapter-rxjava:$retrofit_version"
 
     // JSON
-    implementation 'com.google.code.gson:gson:2.8.2'
+    implementation 'com.google.code.gson:gson:2.8.5'
     implementation 'com.github.salomonbrys.kotson:kotson:2.5.0'
 
     // JavaScript engine
@@ -157,13 +158,13 @@ dependencies {
 
     // Job scheduling
     implementation 'com.evernote:android-job:1.2.5'
-    implementation 'com.google.android.gms:play-services-gcm:11.8.0'
+    implementation 'com.google.android.gms:play-services-gcm:17.0.0'
 
     // Changelog
     implementation 'com.github.gabrielemariotti.changeloglib:changelog:2.1.0'
 
     // Database
-    implementation 'android.arch.persistence:db:1.1.1'
+    implementation 'androidx.sqlite:sqlite:2.0.1'
     implementation 'com.github.inorichi.storio:storio-common:8be19de@aar'
     implementation 'com.github.inorichi.storio:storio-sqlite:8be19de@aar'
     implementation 'io.requery:sqlite-android:3.25.2'
@@ -177,13 +178,13 @@ dependencies {
     implementation "com.github.inorichi.injekt:injekt-core:65b0440"
 
     // Image library
-    final glide_version = '4.6.1'
+    final glide_version = '4.10.0'
     implementation "com.github.bumptech.glide:glide:$glide_version"
     implementation "com.github.bumptech.glide:okhttp3-integration:$glide_version"
     kapt "com.github.bumptech.glide:compiler:$glide_version"
 
     // Transformations
-    implementation 'jp.wasabeef:glide-transformations:3.1.1'
+    implementation 'jp.wasabeef:glide-transformations:4.0.0'
 
     // Logging
     implementation 'com.jakewharton.timber:timber:4.7.1'
@@ -194,24 +195,24 @@ dependencies {
     // UI
     implementation 'com.dmitrymalkovich.android:material-design-dimens:1.4'
     implementation 'com.github.dmytrodanylyk.android-process-button:library:1.0.4'
-    implementation 'eu.davidea:flexible-adapter:5.0.0-rc4'
-    implementation 'eu.davidea:flexible-adapter-ui:1.0.0-b1'
+    implementation 'eu.davidea:flexible-adapter:5.1.0'
+    implementation 'eu.davidea:flexible-adapter-ui:1.0.0'
     implementation 'com.nononsenseapps:filepicker:2.5.2'
     implementation 'com.github.amulyakhare:TextDrawable:558677e'
     implementation 'com.afollestad.material-dialogs:core:0.9.6.0'
     implementation 'me.zhanghai.android.systemuihelper:library:1.0.0'
-    implementation 'com.nightlynexus.viewstatepageradapter:viewstatepageradapter:1.0.4'
+    implementation 'com.nightlynexus.viewstatepageradapter:viewstatepageradapter:1.1.0'
     implementation 'com.github.mthli:Slice:v1.2'
     implementation 'me.gujun.android.taggroup:library:1.4@aar'
-    implementation 'com.github.chrisbanes:PhotoView:2.1.3'
-    implementation 'com.github.inorichi:DirectionalViewPager:3acc51a'
+    implementation 'com.github.chrisbanes:PhotoView:2.3.0'
+    implementation 'com.github.carlosesco:DirectionalViewPager:a844dbca0a'
 
     // Conductor
     implementation 'com.bluelinelabs:conductor:2.1.5'
     implementation ("com.bluelinelabs:conductor-support:2.1.5") {
         exclude group: "com.android.support"
     }
-    implementation 'com.github.inorichi:conductor-support-preference:27.0.2'
+    implementation 'com.github.inorichi:conductor-support-preference:78e2344'
 
     // RxBindings
     final rxbindings_version = '1.0.1'

+ 7 - 21
app/proguard-rules.pro

@@ -4,6 +4,12 @@
 -keep class eu.kanade.tachiyomi.**
 -keep class eu.kanade.tachiyomi.source.model.** { *; }
 
+# Design library
+-dontwarn com.google.android.material.**
+-keep class com.google.android.material.** { *; }
+-keep interface com.google.android.material.** { *; }
+-keep public class com.google.android.material.R$* { *; }
+
 -keep class com.hippo.image.** { *; }
 -keep interface com.hippo.image.** { *; }
 -dontwarn nucleus.view.NucleusActionBarActivity
@@ -46,26 +52,6 @@
     rx.internal.util.atomic.LinkedQueueNode consumerNode;
 }
 
-### Support v7, Design
-# http://stackoverflow.com/questions/29679177/cardview-shadow-not-appearing-in-lollipop-after-obfuscate-with-proguard/29698051
--keep class android.support.v7.widget.RoundRectDrawable { *; }
-
--keep public class android.support.v7.widget.** { *; }
--keep public class android.support.v7.internal.widget.** { *; }
--keep public class android.support.v7.internal.view.menu.** { *; }
--keep public class android.support.v7.graphics.drawable.** { *; }
-
--keep public class * extends android.support.v4.view.ActionProvider {
-    public <init>(android.content.Context);
-}
-
--dontwarn android.support.**
--dontwarn android.support.design.**
--keep class android.support.design.** { *; }
--keep interface android.support.design.** { *; }
--keep public class android.support.design.R$* { *; }
-
-
 # ReactiveNetwork
 -dontwarn com.github.pwittchen.reactivenetwork.**
 
@@ -89,4 +75,4 @@
 -dontwarn org.yaml.snakeyaml.**
 
 # Duktape
--keep class com.squareup.duktape.** { *; }
+-keep class com.squareup.duktape.** { *; }

+ 1 - 1
app/src/main/AndroidManifest.xml

@@ -98,7 +98,7 @@
             android:theme="@android:style/Theme.Translucent.NoTitleBar"/>
 
         <provider
-            android:name="android.support.v4.content.FileProvider"
+            android:name="androidx.core.content.FileProvider"
             android:authorities="${applicationId}.provider"
             android:exported="false"
             android:grantUriPermissions="true">

+ 1 - 1
app/src/main/java/eu/kanade/tachiyomi/App.kt

@@ -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

+ 6 - 5
app/src/main/java/eu/kanade/tachiyomi/data/cache/ChapterCache.kt

@@ -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 - 1
app/src/main/java/eu/kanade/tachiyomi/data/database/DatabaseHelper.kt

@@ -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.*

+ 2 - 2
app/src/main/java/eu/kanade/tachiyomi/data/database/DbOpenCallback.kt

@@ -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 - 1
app/src/main/java/eu/kanade/tachiyomi/data/database/resolvers/HistoryLastReadPutResolver.kt

@@ -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

+ 1 - 1
app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadNotifier.kt

@@ -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

+ 1 - 1
app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadService.kt

@@ -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

+ 2 - 2
app/src/main/java/eu/kanade/tachiyomi/data/download/Downloader.kt

@@ -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.

+ 1 - 1
app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt

@@ -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

+ 2 - 2
app/src/main/java/eu/kanade/tachiyomi/data/preference/EmptyPreferenceDataStore.kt

@@ -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 - 1
app/src/main/java/eu/kanade/tachiyomi/data/preference/SharedPreferencesDataStore.kt

@@ -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() {
 

+ 2 - 2
app/src/main/java/eu/kanade/tachiyomi/data/track/TrackService.kt

@@ -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

+ 12 - 7
app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistApi.kt

@@ -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")
                     }

+ 4 - 4
app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/BangumiApi.kt

@@ -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")
       }

+ 5 - 5
app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/BangumiInterceptor.kt

@@ -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()
 

+ 2 - 2
app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuInterceptor.kt

@@ -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 - 1
app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuModels.kt

@@ -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

+ 4 - 5
app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeList.kt

@@ -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++
         }
 

+ 3 - 3
app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeListInterceptor.kt

@@ -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())
     }
-}
+}

+ 13 - 9
app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyanimelistApi.kt

@@ -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
             }
     }
-}
+}

+ 11 - 7
app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/ShikimoriApi.kt

@@ -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")
             }

+ 1 - 1
app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/ShikimoriInterceptor.kt

@@ -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()
             }

+ 1 - 1
app/src/main/java/eu/kanade/tachiyomi/data/updater/UpdaterJob.kt

@@ -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 - 2
app/src/main/java/eu/kanade/tachiyomi/data/updater/UpdaterNotifier.kt

@@ -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)
     }
-}
+}

+ 1 - 1
app/src/main/java/eu/kanade/tachiyomi/data/updater/UpdaterService.kt

@@ -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")

+ 1 - 1
app/src/main/java/eu/kanade/tachiyomi/extension/api/ExtensionGithubApi.kt

@@ -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)
 

+ 1 - 1
app/src/main/java/eu/kanade/tachiyomi/network/AndroidCookieJar.kt

@@ -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) {

+ 4 - 4
app/src/main/java/eu/kanade/tachiyomi/network/CloudflareInterceptor.kt

@@ -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")

+ 1 - 1
app/src/main/java/eu/kanade/tachiyomi/network/NetworkHelper.kt

@@ -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
             )

+ 4 - 4
app/src/main/java/eu/kanade/tachiyomi/network/OkHttpExtensions.kt

@@ -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)
-}
+}

+ 3 - 3
app/src/main/java/eu/kanade/tachiyomi/network/ProgressResponseBody.kt

@@ -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
             }
         }
     }
-}
+}

+ 2 - 2
app/src/main/java/eu/kanade/tachiyomi/source/ConfigurableSource.kt

@@ -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 - 1
app/src/main/java/eu/kanade/tachiyomi/ui/base/activity/BaseActivity.kt

@@ -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 - 1
app/src/main/java/eu/kanade/tachiyomi/ui/base/controller/BaseController.kt

@@ -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

+ 1 - 1
app/src/main/java/eu/kanade/tachiyomi/ui/base/controller/ConductorExtensions.kt

@@ -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

+ 2 - 2
app/src/main/java/eu/kanade/tachiyomi/ui/base/controller/DialogController.java

@@ -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;

+ 2 - 2
app/src/main/java/eu/kanade/tachiyomi/ui/base/controller/RxController.kt

@@ -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) }
     }
 
-}
+}

+ 2 - 2
app/src/main/java/eu/kanade/tachiyomi/ui/base/controller/SecondaryDrawerController.kt

@@ -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)
-}
+}

+ 2 - 2
app/src/main/java/eu/kanade/tachiyomi/ui/base/controller/TabbedController.kt

@@ -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) {}
-}
+}

+ 2 - 2
app/src/main/java/eu/kanade/tachiyomi/ui/base/holder/BaseViewHolder.kt

@@ -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 - 1
app/src/main/java/eu/kanade/tachiyomi/ui/base/presenter/NucleusConductorDelegate.java

@@ -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 - 1
app/src/main/java/eu/kanade/tachiyomi/ui/base/presenter/NucleusConductorLifecycleListener.java

@@ -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;

+ 5 - 5
app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/CatalogueController.kt

@@ -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()
-}
+}

+ 8 - 4
app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/LangItem.kt

@@ -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)
     }
 

+ 1 - 1
app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/SourceDividerItemDecoration.kt

@@ -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() {

+ 9 - 5
app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/SourceItem.kt

@@ -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)
     }
 
-}
+}

+ 12 - 7
app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/browse/BrowseCatalogueController.kt

@@ -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())
 

+ 13 - 9
app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/browse/CatalogueItem.kt

@@ -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()
     }
 
-
-
-}
+}

+ 5 - 3
app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/browse/ProgressItem.kt

@@ -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)
     }
 
-}
+}

+ 5 - 3
app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/filter/CheckboxItem.kt

@@ -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)
     }
-}
+}

+ 5 - 3
app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/filter/GroupItem.kt

@@ -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
         }
 
     }
-}
+}

+ 5 - 3
app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/filter/HeaderItem.kt

@@ -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
     }

+ 5 - 3
app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/filter/SelectItem.kt

@@ -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)
     }
-}
+}

+ 6 - 4
app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/filter/SeparatorItem.kt

@@ -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)
-}
+}

+ 5 - 3
app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/filter/SortGroup.kt

@@ -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)
-}
+}

+ 7 - 5
app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/filter/SortItem.kt

@@ -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)
     }
 
-}
+}

+ 6 - 4
app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/filter/TextItem.kt

@@ -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)
     }
-}
+}

+ 7 - 5
app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/filter/TriStateItem.kt

@@ -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
         }
     }
 
-}
+}

+ 1 - 1
app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/global_search/CatalogueSearchAdapter.kt

@@ -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
 

+ 5 - 3
app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/global_search/CatalogueSearchCardItem.kt

@@ -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
     }
 
-}
+}

+ 2 - 2
app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/global_search/CatalogueSearchController.kt

@@ -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 - 1
app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/global_search/CatalogueSearchHolder.kt

@@ -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

+ 4 - 2
app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/global_search/CatalogueSearchItem.kt

@@ -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 - 1
app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/latest/LatestUpdatesController.kt

@@ -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

+ 7 - 7
app/src/main/java/eu/kanade/tachiyomi/ui/category/CategoryController.kt

@@ -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)
     }
 
-}
+}

+ 5 - 3
app/src/main/java/eu/kanade/tachiyomi/ui/category/CategoryItem.kt

@@ -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 - 1
app/src/main/java/eu/kanade/tachiyomi/ui/download/DownloadAdapter.kt

@@ -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 - 1
app/src/main/java/eu/kanade/tachiyomi/ui/download/DownloadController.kt

@@ -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

+ 3 - 3
app/src/main/java/eu/kanade/tachiyomi/ui/extension/ExtensionController.kt

@@ -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)

+ 13 - 11
app/src/main/java/eu/kanade/tachiyomi/ui/extension/ExtensionDetailsController.kt

@@ -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) {

+ 1 - 1
app/src/main/java/eu/kanade/tachiyomi/ui/extension/ExtensionDividerItemDecoration.kt

@@ -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() {

+ 4 - 2
app/src/main/java/eu/kanade/tachiyomi/ui/extension/ExtensionGroupItem.kt

@@ -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)

+ 4 - 2
app/src/main/java/eu/kanade/tachiyomi/ui/extension/ExtensionItem.kt

@@ -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()) {

+ 5 - 1
app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCategoryAdapter.kt

@@ -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) })
     }
 
 }

+ 5 - 4
app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCategoryView.kt

@@ -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) {

+ 8 - 7
app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt

@@ -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) }

+ 6 - 4
app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryItem.kt

@@ -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()
     }
-}
+}

+ 3 - 3
app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt

@@ -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

+ 2 - 2
app/src/main/java/eu/kanade/tachiyomi/ui/main/TabsAnimator.kt

@@ -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 - 2
app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaController.kt

@@ -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

+ 5 - 3
app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChapterItem.kt

@@ -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()
     }
 
-}
+}

+ 6 - 6
app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChaptersController.kt

@@ -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) {

+ 7 - 7
app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaInfoController.kt

@@ -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 - 1
app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackAdapter.kt

@@ -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 - 2
app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackController.kt

@@ -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"
     }
 
-}
+}

+ 5 - 3
app/src/main/java/eu/kanade/tachiyomi/ui/migration/MangaItem.kt

@@ -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()
     }
-}
+}

+ 4 - 4
app/src/main/java/eu/kanade/tachiyomi/ui/migration/MigrationController.kt

@@ -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"
     }
 
-}
+}

+ 4 - 2
app/src/main/java/eu/kanade/tachiyomi/ui/migration/SelectionHeader.kt

@@ -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
     }

+ 5 - 3
app/src/main/java/eu/kanade/tachiyomi/ui/migration/SourceItem.kt

@@ -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)
     }
 
-}
+}

+ 1 - 1
app/src/main/java/eu/kanade/tachiyomi/ui/reader/PageIndicatorTextView.kt

@@ -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

+ 3 - 3
app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderColorFilterSheet.kt

@@ -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 - 1
app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderPageSheet.kt

@@ -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

+ 1 - 1
app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderSeekBar.kt

@@ -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
 

+ 2 - 2
app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderSettingsSheet.kt

@@ -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

+ 1 - 1
app/src/main/java/eu/kanade/tachiyomi/ui/reader/SaveImageNotifier.kt

@@ -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 - 1
app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/PageLoader.kt

@@ -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 - 1
app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/Pager.kt

@@ -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
 
 /**

Vissa filer visades inte eftersom för många filer har ändrats