Migrate to AndroidX (#2424)
* Migrate to AndroidX (automatic conversion by Android Studio) * AndroidX dependency code updates * Fix source preference reparenting * fixes the androidx prefererences icon spacing issue (cherry picked from commit b76a15d960ec2cdf771be16377db0348b66b3179) * Fix source preference screen heading size/list padding Co-authored-by: Carlos <cargo8005@gmail.com>
This commit is contained in:
		
							parent
							
								
									aa57b1bc77
								
							
						
					
					
						commit
						78689e7443
					
				| @ -37,7 +37,7 @@ android { | |||||||
|         applicationId "eu.kanade.tachiyomi" |         applicationId "eu.kanade.tachiyomi" | ||||||
|         minSdkVersion 16 |         minSdkVersion 16 | ||||||
|         targetSdkVersion 28 |         targetSdkVersion 28 | ||||||
|         testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" |         testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" | ||||||
|         versionCode 41 |         versionCode 41 | ||||||
|         versionName "0.8.4" |         versionName "0.8.4" | ||||||
| 
 | 
 | ||||||
| @ -108,21 +108,20 @@ dependencies { | |||||||
|     implementation 'com.github.inorichi:junrar-android:634c1f5' |     implementation 'com.github.inorichi:junrar-android:634c1f5' | ||||||
| 
 | 
 | ||||||
|     // Android support library |     // Android support library | ||||||
|     final support_library_version = '28.0.0' |     implementation 'androidx.legacy:legacy-support-v4:1.0.0' | ||||||
|     implementation "com.android.support:support-v4:$support_library_version" |     implementation 'androidx.appcompat:appcompat:1.1.0' | ||||||
|     implementation "com.android.support:appcompat-v7:$support_library_version" |     implementation 'androidx.cardview:cardview:1.0.0' | ||||||
|     implementation "com.android.support:cardview-v7:$support_library_version" |     implementation 'com.google.android.material:material:1.0.0' | ||||||
|     implementation "com.android.support:design:$support_library_version" |     implementation 'androidx.recyclerview:recyclerview:1.1.0' | ||||||
|     implementation "com.android.support:recyclerview-v7:$support_library_version" |     implementation 'androidx.preference:preference:1.1.0' | ||||||
|     implementation "com.android.support:preference-v7:$support_library_version" |     implementation 'androidx.annotation:annotation:1.1.0' | ||||||
|     implementation "com.android.support:support-annotations:$support_library_version" |     implementation 'androidx.browser:browser:1.2.0' | ||||||
|     implementation "com.android.support:customtabs:$support_library_version" |  | ||||||
| 
 | 
 | ||||||
|     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 |     // ReactiveX | ||||||
|     implementation 'io.reactivex:rxandroid:1.2.1' |     implementation 'io.reactivex:rxandroid:1.2.1' | ||||||
| @ -132,17 +131,19 @@ dependencies { | |||||||
|     implementation 'com.github.pwittchen:reactivenetwork:0.13.0' |     implementation 'com.github.pwittchen:reactivenetwork:0.13.0' | ||||||
| 
 | 
 | ||||||
|     // Network client |     // Network client | ||||||
|     implementation "com.squareup.okhttp3:okhttp:3.10.0" |     final okhttp_version = '4.2.1' | ||||||
|     implementation 'com.squareup.okio:okio:1.14.0' |     implementation "com.squareup.okhttp3:okhttp:$okhttp_version" | ||||||
|  |     implementation "com.squareup.okhttp3:logging-interceptor:$okhttp_version" | ||||||
|  |     implementation 'com.squareup.okio:okio:2.4.0' | ||||||
| 
 | 
 | ||||||
|     // REST |     // REST | ||||||
|     final retrofit_version = '2.3.0' |     final retrofit_version = '2.6.2' | ||||||
|     implementation "com.squareup.retrofit2:retrofit:$retrofit_version" |     implementation "com.squareup.retrofit2:retrofit:$retrofit_version" | ||||||
|     implementation "com.squareup.retrofit2:converter-gson:$retrofit_version" |     implementation "com.squareup.retrofit2:converter-gson:$retrofit_version" | ||||||
|     implementation "com.squareup.retrofit2:adapter-rxjava:$retrofit_version" |     implementation "com.squareup.retrofit2:adapter-rxjava:$retrofit_version" | ||||||
| 
 | 
 | ||||||
|     // JSON |     // 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' |     implementation 'com.github.salomonbrys.kotson:kotson:2.5.0' | ||||||
| 
 | 
 | ||||||
|     // JavaScript engine |     // JavaScript engine | ||||||
| @ -157,13 +158,13 @@ dependencies { | |||||||
| 
 | 
 | ||||||
|     // Job scheduling |     // Job scheduling | ||||||
|     implementation 'com.evernote:android-job:1.2.5' |     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 |     // Changelog | ||||||
|     implementation 'com.github.gabrielemariotti.changeloglib:changelog:2.1.0' |     implementation 'com.github.gabrielemariotti.changeloglib:changelog:2.1.0' | ||||||
| 
 | 
 | ||||||
|     // Database |     // 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-common:8be19de@aar' | ||||||
|     implementation 'com.github.inorichi.storio:storio-sqlite:8be19de@aar' |     implementation 'com.github.inorichi.storio:storio-sqlite:8be19de@aar' | ||||||
|     implementation 'io.requery:sqlite-android:3.25.2' |     implementation 'io.requery:sqlite-android:3.25.2' | ||||||
| @ -177,13 +178,13 @@ dependencies { | |||||||
|     implementation "com.github.inorichi.injekt:injekt-core:65b0440" |     implementation "com.github.inorichi.injekt:injekt-core:65b0440" | ||||||
| 
 | 
 | ||||||
|     // Image library |     // 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:glide:$glide_version" | ||||||
|     implementation "com.github.bumptech.glide:okhttp3-integration:$glide_version" |     implementation "com.github.bumptech.glide:okhttp3-integration:$glide_version" | ||||||
|     kapt "com.github.bumptech.glide:compiler:$glide_version" |     kapt "com.github.bumptech.glide:compiler:$glide_version" | ||||||
| 
 | 
 | ||||||
|     // Transformations |     // Transformations | ||||||
|     implementation 'jp.wasabeef:glide-transformations:3.1.1' |     implementation 'jp.wasabeef:glide-transformations:4.0.0' | ||||||
| 
 | 
 | ||||||
|     // Logging |     // Logging | ||||||
|     implementation 'com.jakewharton.timber:timber:4.7.1' |     implementation 'com.jakewharton.timber:timber:4.7.1' | ||||||
| @ -194,24 +195,24 @@ dependencies { | |||||||
|     // UI |     // UI | ||||||
|     implementation 'com.dmitrymalkovich.android:material-design-dimens:1.4' |     implementation 'com.dmitrymalkovich.android:material-design-dimens:1.4' | ||||||
|     implementation 'com.github.dmytrodanylyk.android-process-button:library:1.0.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:5.1.0' | ||||||
|     implementation 'eu.davidea:flexible-adapter-ui:1.0.0-b1' |     implementation 'eu.davidea:flexible-adapter-ui:1.0.0' | ||||||
|     implementation 'com.nononsenseapps:filepicker:2.5.2' |     implementation 'com.nononsenseapps:filepicker:2.5.2' | ||||||
|     implementation 'com.github.amulyakhare:TextDrawable:558677e' |     implementation 'com.github.amulyakhare:TextDrawable:558677e' | ||||||
|     implementation 'com.afollestad.material-dialogs:core:0.9.6.0' |     implementation 'com.afollestad.material-dialogs:core:0.9.6.0' | ||||||
|     implementation 'me.zhanghai.android.systemuihelper:library:1.0.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 'com.github.mthli:Slice:v1.2' | ||||||
|     implementation 'me.gujun.android.taggroup:library:1.4@aar' |     implementation 'me.gujun.android.taggroup:library:1.4@aar' | ||||||
|     implementation 'com.github.chrisbanes:PhotoView:2.1.3' |     implementation 'com.github.chrisbanes:PhotoView:2.3.0' | ||||||
|     implementation 'com.github.inorichi:DirectionalViewPager:3acc51a' |     implementation 'com.github.carlosesco:DirectionalViewPager:a844dbca0a' | ||||||
| 
 | 
 | ||||||
|     // Conductor |     // Conductor | ||||||
|     implementation 'com.bluelinelabs:conductor:2.1.5' |     implementation 'com.bluelinelabs:conductor:2.1.5' | ||||||
|     implementation ("com.bluelinelabs:conductor-support:2.1.5") { |     implementation ("com.bluelinelabs:conductor-support:2.1.5") { | ||||||
|         exclude group: "com.android.support" |         exclude group: "com.android.support" | ||||||
|     } |     } | ||||||
|     implementation 'com.github.inorichi:conductor-support-preference:27.0.2' |     implementation 'com.github.inorichi:conductor-support-preference:78e2344' | ||||||
| 
 | 
 | ||||||
|     // RxBindings |     // RxBindings | ||||||
|     final rxbindings_version = '1.0.1' |     final rxbindings_version = '1.0.1' | ||||||
|  | |||||||
							
								
								
									
										26
									
								
								app/proguard-rules.pro
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										26
									
								
								app/proguard-rules.pro
									
									
									
									
										vendored
									
									
								
							| @ -4,6 +4,12 @@ | |||||||
| -keep class eu.kanade.tachiyomi.** | -keep class eu.kanade.tachiyomi.** | ||||||
| -keep class eu.kanade.tachiyomi.source.model.** { *; } | -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 class com.hippo.image.** { *; } | ||||||
| -keep interface com.hippo.image.** { *; } | -keep interface com.hippo.image.** { *; } | ||||||
| -dontwarn nucleus.view.NucleusActionBarActivity | -dontwarn nucleus.view.NucleusActionBarActivity | ||||||
| @ -46,26 +52,6 @@ | |||||||
|     rx.internal.util.atomic.LinkedQueueNode consumerNode; |     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 | # ReactiveNetwork | ||||||
| -dontwarn com.github.pwittchen.reactivenetwork.** | -dontwarn com.github.pwittchen.reactivenetwork.** | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -98,7 +98,7 @@ | |||||||
|             android:theme="@android:style/Theme.Translucent.NoTitleBar"/> |             android:theme="@android:style/Theme.Translucent.NoTitleBar"/> | ||||||
| 
 | 
 | ||||||
|         <provider |         <provider | ||||||
|             android:name="android.support.v4.content.FileProvider" |             android:name="androidx.core.content.FileProvider" | ||||||
|             android:authorities="${applicationId}.provider" |             android:authorities="${applicationId}.provider" | ||||||
|             android:exported="false" |             android:exported="false" | ||||||
|             android:grantUriPermissions="true"> |             android:grantUriPermissions="true"> | ||||||
|  | |||||||
| @ -3,7 +3,7 @@ package eu.kanade.tachiyomi | |||||||
| import android.app.Application | import android.app.Application | ||||||
| import android.content.Context | import android.content.Context | ||||||
| import android.content.res.Configuration | import android.content.res.Configuration | ||||||
| import android.support.multidex.MultiDex | import androidx.multidex.MultiDex | ||||||
| import com.evernote.android.job.JobManager | import com.evernote.android.job.JobManager | ||||||
| import eu.kanade.tachiyomi.data.backup.BackupCreatorJob | import eu.kanade.tachiyomi.data.backup.BackupCreatorJob | ||||||
| import eu.kanade.tachiyomi.data.library.LibraryUpdateJob | import eu.kanade.tachiyomi.data.library.LibraryUpdateJob | ||||||
|  | |||||||
| @ -10,7 +10,8 @@ import eu.kanade.tachiyomi.source.model.Page | |||||||
| import eu.kanade.tachiyomi.util.DiskUtil | import eu.kanade.tachiyomi.util.DiskUtil | ||||||
| import eu.kanade.tachiyomi.util.saveTo | import eu.kanade.tachiyomi.util.saveTo | ||||||
| import okhttp3.Response | import okhttp3.Response | ||||||
| import okio.Okio | import okio.buffer | ||||||
|  | import okio.sink | ||||||
| import rx.Observable | import rx.Observable | ||||||
| import uy.kohesive.injekt.injectLazy | import uy.kohesive.injekt.injectLazy | ||||||
| import java.io.File | import java.io.File | ||||||
| @ -126,7 +127,7 @@ class ChapterCache(private val context: Context) { | |||||||
|             editor = diskCache.edit(key) ?: return |             editor = diskCache.edit(key) ?: return | ||||||
| 
 | 
 | ||||||
|             // Write chapter urls to cache. |             // Write chapter urls to cache. | ||||||
|             Okio.buffer(Okio.sink(editor.newOutputStream(0))).use { |             editor.newOutputStream(0).sink().buffer().use { | ||||||
|                 it.write(cachedValue.toByteArray()) |                 it.write(cachedValue.toByteArray()) | ||||||
|                 it.flush() |                 it.flush() | ||||||
|             } |             } | ||||||
| @ -186,12 +187,12 @@ class ChapterCache(private val context: Context) { | |||||||
|             editor = diskCache.edit(key) ?: throw IOException("Unable to edit key") |             editor = diskCache.edit(key) ?: throw IOException("Unable to edit key") | ||||||
| 
 | 
 | ||||||
|             // Get OutputStream and write image with Okio. |             // Get OutputStream and write image with Okio. | ||||||
|             response.body()!!.source().saveTo(editor.newOutputStream(0)) |             response.body!!.source().saveTo(editor.newOutputStream(0)) | ||||||
| 
 | 
 | ||||||
|             diskCache.flush() |             diskCache.flush() | ||||||
|             editor.commit() |             editor.commit() | ||||||
|         } finally { |         } finally { | ||||||
|             response.body()?.close() |             response.body?.close() | ||||||
|             editor?.abortUnlessCommitted() |             editor?.abortUnlessCommitted() | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -1,6 +1,6 @@ | |||||||
| package eu.kanade.tachiyomi.data.database | package eu.kanade.tachiyomi.data.database | ||||||
| 
 | 
 | ||||||
| import android.arch.persistence.db.SupportSQLiteOpenHelper | import androidx.sqlite.db.SupportSQLiteOpenHelper | ||||||
| import android.content.Context | import android.content.Context | ||||||
| import com.pushtorefresh.storio.sqlite.impl.DefaultStorIOSQLite | import com.pushtorefresh.storio.sqlite.impl.DefaultStorIOSQLite | ||||||
| import eu.kanade.tachiyomi.data.database.mappers.* | import eu.kanade.tachiyomi.data.database.mappers.* | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| package eu.kanade.tachiyomi.data.database | package eu.kanade.tachiyomi.data.database | ||||||
| 
 | 
 | ||||||
| import android.arch.persistence.db.SupportSQLiteDatabase | import androidx.sqlite.db.SupportSQLiteDatabase | ||||||
| import android.arch.persistence.db.SupportSQLiteOpenHelper | import androidx.sqlite.db.SupportSQLiteOpenHelper | ||||||
| import android.content.Context | import android.content.Context | ||||||
| import android.database.sqlite.SQLiteDatabase | import android.database.sqlite.SQLiteDatabase | ||||||
| import android.database.sqlite.SQLiteOpenHelper | import android.database.sqlite.SQLiteOpenHelper | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| package eu.kanade.tachiyomi.data.database.resolvers | package eu.kanade.tachiyomi.data.database.resolvers | ||||||
| 
 | 
 | ||||||
| import android.content.ContentValues | import android.content.ContentValues | ||||||
| import android.support.annotation.NonNull | import androidx.annotation.NonNull | ||||||
| import com.pushtorefresh.storio.sqlite.StorIOSQLite | import com.pushtorefresh.storio.sqlite.StorIOSQLite | ||||||
| import com.pushtorefresh.storio.sqlite.operations.put.PutResult | import com.pushtorefresh.storio.sqlite.operations.put.PutResult | ||||||
| import com.pushtorefresh.storio.sqlite.queries.Query | import com.pushtorefresh.storio.sqlite.queries.Query | ||||||
|  | |||||||
| @ -2,7 +2,7 @@ package eu.kanade.tachiyomi.data.download | |||||||
| 
 | 
 | ||||||
| import android.content.Context | import android.content.Context | ||||||
| import android.graphics.BitmapFactory | import android.graphics.BitmapFactory | ||||||
| import android.support.v4.app.NotificationCompat | import androidx.core.app.NotificationCompat | ||||||
| import eu.kanade.tachiyomi.R | import eu.kanade.tachiyomi.R | ||||||
| import eu.kanade.tachiyomi.data.download.model.Download | import eu.kanade.tachiyomi.data.download.model.Download | ||||||
| import eu.kanade.tachiyomi.data.download.model.DownloadQueue | import eu.kanade.tachiyomi.data.download.model.DownloadQueue | ||||||
|  | |||||||
| @ -9,7 +9,7 @@ import android.net.NetworkInfo.State.DISCONNECTED | |||||||
| import android.os.Build | import android.os.Build | ||||||
| import android.os.IBinder | import android.os.IBinder | ||||||
| import android.os.PowerManager | 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.Connectivity | ||||||
| import com.github.pwittchen.reactivenetwork.library.ReactiveNetwork | import com.github.pwittchen.reactivenetwork.library.ReactiveNetwork | ||||||
| import com.jakewharton.rxrelay.BehaviorRelay | import com.jakewharton.rxrelay.BehaviorRelay | ||||||
|  | |||||||
| @ -351,7 +351,7 @@ class Downloader( | |||||||
|                 .map { response -> |                 .map { response -> | ||||||
|                     val file = tmpDir.createFile("$filename.tmp") |                     val file = tmpDir.createFile("$filename.tmp") | ||||||
|                     try { |                     try { | ||||||
|                         response.body()!!.source().saveTo(file.openOutputStream()) |                         response.body!!.source().saveTo(file.openOutputStream()) | ||||||
|                         val extension = getImageExtension(response, file) |                         val extension = getImageExtension(response, file) | ||||||
|                         file.renameTo("$filename.$extension") |                         file.renameTo("$filename.$extension") | ||||||
|                     } catch (e: Exception) { |                     } catch (e: Exception) { | ||||||
| @ -374,7 +374,7 @@ class Downloader( | |||||||
|      */ |      */ | ||||||
|     private fun getImageExtension(response: Response, file: UniFile): String { |     private fun getImageExtension(response: Response, file: UniFile): String { | ||||||
|         // Read content type if available. |         // 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. |             // Else guess from the uri. | ||||||
|             ?: context.contentResolver.getType(file.uri) |             ?: context.contentResolver.getType(file.uri) | ||||||
|             // Else read magic numbers. |             // Else read magic numbers. | ||||||
|  | |||||||
| @ -9,7 +9,7 @@ import android.graphics.BitmapFactory | |||||||
| import android.os.Build | import android.os.Build | ||||||
| import android.os.IBinder | import android.os.IBinder | ||||||
| import android.os.PowerManager | import android.os.PowerManager | ||||||
| import android.support.v4.app.NotificationCompat | import androidx.core.app.NotificationCompat | ||||||
| import eu.kanade.tachiyomi.R | import eu.kanade.tachiyomi.R | ||||||
| import eu.kanade.tachiyomi.data.database.DatabaseHelper | import eu.kanade.tachiyomi.data.database.DatabaseHelper | ||||||
| import eu.kanade.tachiyomi.data.database.models.Category | import eu.kanade.tachiyomi.data.database.models.Category | ||||||
|  | |||||||
| @ -1,6 +1,6 @@ | |||||||
| package eu.kanade.tachiyomi.data.preference | package eu.kanade.tachiyomi.data.preference | ||||||
| 
 | 
 | ||||||
| import android.support.v7.preference.PreferenceDataStore | import androidx.preference.PreferenceDataStore | ||||||
| 
 | 
 | ||||||
| class EmptyPreferenceDataStore : PreferenceDataStore() { | class EmptyPreferenceDataStore : PreferenceDataStore() { | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| package eu.kanade.tachiyomi.data.preference | package eu.kanade.tachiyomi.data.preference | ||||||
| 
 | 
 | ||||||
| import android.content.SharedPreferences | import android.content.SharedPreferences | ||||||
| import android.support.v7.preference.PreferenceDataStore | import androidx.preference.PreferenceDataStore | ||||||
| 
 | 
 | ||||||
| class SharedPreferencesDataStore(private val prefs: SharedPreferences) : PreferenceDataStore() { | class SharedPreferencesDataStore(private val prefs: SharedPreferences) : PreferenceDataStore() { | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| package eu.kanade.tachiyomi.data.track | package eu.kanade.tachiyomi.data.track | ||||||
| 
 | 
 | ||||||
| import android.support.annotation.CallSuper | import androidx.annotation.CallSuper | ||||||
| import android.support.annotation.DrawableRes | import androidx.annotation.DrawableRes | ||||||
| import eu.kanade.tachiyomi.data.database.models.Track | import eu.kanade.tachiyomi.data.database.models.Track | ||||||
| import eu.kanade.tachiyomi.data.track.model.TrackSearch | import eu.kanade.tachiyomi.data.track.model.TrackSearch | ||||||
| import eu.kanade.tachiyomi.data.preference.PreferencesHelper | import eu.kanade.tachiyomi.data.preference.PreferencesHelper | ||||||
|  | |||||||
| @ -1,13 +1,18 @@ | |||||||
| package eu.kanade.tachiyomi.data.track.anilist | package eu.kanade.tachiyomi.data.track.anilist | ||||||
| 
 | 
 | ||||||
| import android.net.Uri | 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.JsonObject | ||||||
| import com.google.gson.JsonParser | import com.google.gson.JsonParser | ||||||
| import eu.kanade.tachiyomi.data.database.models.Track | import eu.kanade.tachiyomi.data.database.models.Track | ||||||
| import eu.kanade.tachiyomi.data.track.model.TrackSearch | import eu.kanade.tachiyomi.data.track.model.TrackSearch | ||||||
| import eu.kanade.tachiyomi.network.asObservableSuccess | import eu.kanade.tachiyomi.network.asObservableSuccess | ||||||
| import okhttp3.MediaType | import okhttp3.MediaType.Companion.toMediaTypeOrNull | ||||||
| import okhttp3.OkHttpClient | import okhttp3.OkHttpClient | ||||||
| import okhttp3.Request | import okhttp3.Request | ||||||
| import okhttp3.RequestBody | import okhttp3.RequestBody | ||||||
| @ -18,7 +23,7 @@ import java.util.Calendar | |||||||
| class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { | class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { | ||||||
| 
 | 
 | ||||||
|     private val parser = JsonParser() |     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() |     private val authClient = client.newBuilder().addInterceptor(interceptor).build() | ||||||
| 
 | 
 | ||||||
|     fun addLibManga(track: Track): Observable<Track> { |     fun addLibManga(track: Track): Observable<Track> { | ||||||
| @ -47,7 +52,7 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { | |||||||
|         return authClient.newCall(request) |         return authClient.newCall(request) | ||||||
|                 .asObservableSuccess() |                 .asObservableSuccess() | ||||||
|                 .map { netResponse -> |                 .map { netResponse -> | ||||||
|                     val responseBody = netResponse.body()?.string().orEmpty() |                     val responseBody = netResponse.body?.string().orEmpty() | ||||||
|                     netResponse.close() |                     netResponse.close() | ||||||
|                     if (responseBody.isEmpty()) { |                     if (responseBody.isEmpty()) { | ||||||
|                         throw Exception("Null Response") |                         throw Exception("Null Response") | ||||||
| @ -130,7 +135,7 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { | |||||||
|         return authClient.newCall(request) |         return authClient.newCall(request) | ||||||
|                 .asObservableSuccess() |                 .asObservableSuccess() | ||||||
|                 .map { netResponse -> |                 .map { netResponse -> | ||||||
|                     val responseBody = netResponse.body()?.string().orEmpty() |                     val responseBody = netResponse.body?.string().orEmpty() | ||||||
|                     if (responseBody.isEmpty()) { |                     if (responseBody.isEmpty()) { | ||||||
|                         throw Exception("Null Response") |                         throw Exception("Null Response") | ||||||
|                     } |                     } | ||||||
| @ -191,7 +196,7 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { | |||||||
|         return authClient.newCall(request) |         return authClient.newCall(request) | ||||||
|                 .asObservableSuccess() |                 .asObservableSuccess() | ||||||
|                 .map { netResponse -> |                 .map { netResponse -> | ||||||
|                     val responseBody = netResponse.body()?.string().orEmpty() |                     val responseBody = netResponse.body?.string().orEmpty() | ||||||
|                     if (responseBody.isEmpty()) { |                     if (responseBody.isEmpty()) { | ||||||
|                         throw Exception("Null Response") |                         throw Exception("Null Response") | ||||||
|                     } |                     } | ||||||
| @ -236,7 +241,7 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { | |||||||
|         return authClient.newCall(request) |         return authClient.newCall(request) | ||||||
|                 .asObservableSuccess() |                 .asObservableSuccess() | ||||||
|                 .map { netResponse -> |                 .map { netResponse -> | ||||||
|                     val responseBody = netResponse.body()?.string().orEmpty() |                     val responseBody = netResponse.body?.string().orEmpty() | ||||||
|                     if (responseBody.isEmpty()) { |                     if (responseBody.isEmpty()) { | ||||||
|                         throw Exception("Null Response") |                         throw Exception("Null Response") | ||||||
|                     } |                     } | ||||||
|  | |||||||
| @ -84,7 +84,7 @@ class BangumiApi(private val client: OkHttpClient, interceptor: BangumiIntercept | |||||||
|     return authClient.newCall(request) |     return authClient.newCall(request) | ||||||
|       .asObservableSuccess() |       .asObservableSuccess() | ||||||
|       .map { netResponse -> |       .map { netResponse -> | ||||||
|         val responseBody = netResponse.body()?.string().orEmpty() |         val responseBody = netResponse.body?.string().orEmpty() | ||||||
|         if (responseBody.isEmpty()) { |         if (responseBody.isEmpty()) { | ||||||
|           throw Exception("Null Response") |           throw Exception("Null Response") | ||||||
|         } |         } | ||||||
| @ -127,7 +127,7 @@ class BangumiApi(private val client: OkHttpClient, interceptor: BangumiIntercept | |||||||
|       .asObservableSuccess() |       .asObservableSuccess() | ||||||
|       .map { netResponse -> |       .map { netResponse -> | ||||||
|         // get comic info |         // get comic info | ||||||
|         val responseBody = netResponse.body()?.string().orEmpty() |         val responseBody = netResponse.body?.string().orEmpty() | ||||||
|         jsonToTrack(parser.parse(responseBody).obj) |         jsonToTrack(parser.parse(responseBody).obj) | ||||||
|       } |       } | ||||||
|   } |   } | ||||||
| @ -144,7 +144,7 @@ class BangumiApi(private val client: OkHttpClient, interceptor: BangumiIntercept | |||||||
|     return authClient.newCall(requestUserRead) |     return authClient.newCall(requestUserRead) | ||||||
|       .asObservableSuccess() |       .asObservableSuccess() | ||||||
|       .map { netResponse -> |       .map { netResponse -> | ||||||
|         val resp = netResponse.body()?.string() |         val resp = netResponse.body?.string() | ||||||
|         val coll = gson.fromJson(resp, Collection::class.java) |         val coll = gson.fromJson(resp, Collection::class.java) | ||||||
|         track.status = coll.status?.id!! |         track.status = coll.status?.id!! | ||||||
|         track.last_chapter_read = coll.ep_status!! |         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> { |   fun accessToken(code: String): Observable<OAuth> { | ||||||
|     return client.newCall(accessTokenRequest(code)).asObservableSuccess().map { netResponse -> |     return client.newCall(accessTokenRequest(code)).asObservableSuccess().map { netResponse -> | ||||||
|       val responseBody = netResponse.body()?.string().orEmpty() |       val responseBody = netResponse.body?.string().orEmpty() | ||||||
|       if (responseBody.isEmpty()) { |       if (responseBody.isEmpty()) { | ||||||
|         throw Exception("Null Response") |         throw Exception("Null Response") | ||||||
|       } |       } | ||||||
|  | |||||||
| @ -14,7 +14,7 @@ class BangumiInterceptor(val bangumi: Bangumi, val gson: Gson) : Interceptor { | |||||||
| 
 | 
 | ||||||
|   fun addTocken(tocken: String, oidFormBody: FormBody): FormBody { |   fun addTocken(tocken: String, oidFormBody: FormBody): FormBody { | ||||||
|     val newFormBody = FormBody.Builder() |     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(oidFormBody.name(i), oidFormBody.value(i)) | ||||||
|     } |     } | ||||||
|     newFormBody.add("access_token", tocken) |     newFormBody.add("access_token", tocken) | ||||||
| @ -29,18 +29,18 @@ class BangumiInterceptor(val bangumi: Bangumi, val gson: Gson) : Interceptor { | |||||||
|     if (currAuth.isExpired()) { |     if (currAuth.isExpired()) { | ||||||
|       val response = chain.proceed(BangumiApi.refreshTokenRequest(currAuth.refresh_token!!)) |       val response = chain.proceed(BangumiApi.refreshTokenRequest(currAuth.refresh_token!!)) | ||||||
|       if (response.isSuccessful) { |       if (response.isSuccessful) { | ||||||
|         newAuth(gson.fromJson(response.body()!!.string(), OAuth::class.java)) |         newAuth(gson.fromJson(response.body!!.string(), OAuth::class.java)) | ||||||
|       } else { |       } else { | ||||||
|         response.close() |         response.close() | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     var authRequest = if (originalRequest.method() == "GET") originalRequest.newBuilder() |     var authRequest = if (originalRequest.method == "GET") originalRequest.newBuilder() | ||||||
|       .header("User-Agent", "Tachiyomi") |       .header("User-Agent", "Tachiyomi") | ||||||
|       .url(originalRequest.url().newBuilder() |       .url(originalRequest.url.newBuilder() | ||||||
|         .addQueryParameter("access_token", currAuth.access_token).build()) |         .addQueryParameter("access_token", currAuth.access_token).build()) | ||||||
|       .build() else originalRequest.newBuilder() |       .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") |       .header("User-Agent", "Tachiyomi") | ||||||
|       .build() |       .build() | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -22,7 +22,7 @@ class KitsuInterceptor(val kitsu: Kitsu, val gson: Gson) : Interceptor { | |||||||
|         if (currAuth.isExpired()) { |         if (currAuth.isExpired()) { | ||||||
|             val response = chain.proceed(KitsuApi.refreshTokenRequest(refreshToken)) |             val response = chain.proceed(KitsuApi.refreshTokenRequest(refreshToken)) | ||||||
|             if (response.isSuccessful) { |             if (response.isSuccessful) { | ||||||
|                 newAuth(gson.fromJson(response.body()!!.string(), OAuth::class.java)) |                 newAuth(gson.fromJson(response.body!!.string(), OAuth::class.java)) | ||||||
|             } else { |             } else { | ||||||
|                 response.close() |                 response.close() | ||||||
|             } |             } | ||||||
|  | |||||||
| @ -1,6 +1,6 @@ | |||||||
| package eu.kanade.tachiyomi.data.track.kitsu | package eu.kanade.tachiyomi.data.track.kitsu | ||||||
| 
 | 
 | ||||||
| import android.support.annotation.CallSuper | import androidx.annotation.CallSuper | ||||||
| import com.github.salomonbrys.kotson.* | import com.github.salomonbrys.kotson.* | ||||||
| import com.google.gson.JsonObject | import com.google.gson.JsonObject | ||||||
| import eu.kanade.tachiyomi.data.database.models.Track | import eu.kanade.tachiyomi.data.database.models.Track | ||||||
|  | |||||||
| @ -7,10 +7,9 @@ import eu.kanade.tachiyomi.data.database.models.Track | |||||||
| import eu.kanade.tachiyomi.data.preference.getOrDefault | import eu.kanade.tachiyomi.data.preference.getOrDefault | ||||||
| import eu.kanade.tachiyomi.data.track.TrackService | import eu.kanade.tachiyomi.data.track.TrackService | ||||||
| import eu.kanade.tachiyomi.data.track.model.TrackSearch | import eu.kanade.tachiyomi.data.track.model.TrackSearch | ||||||
| import okhttp3.HttpUrl | import okhttp3.HttpUrl.Companion.toHttpUrlOrNull | ||||||
| import rx.Completable | import rx.Completable | ||||||
| import rx.Observable | import rx.Observable | ||||||
| import java.lang.Exception |  | ||||||
| 
 | 
 | ||||||
| class Myanimelist(private val context: Context, id: Int) : TrackService(id) { | 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() { |     override fun logout() { | ||||||
|         super.logout() |         super.logout() | ||||||
|         preferences.trackToken(this).delete() |         preferences.trackToken(this).delete() | ||||||
|         networkService.cookieManager.remove(HttpUrl.parse(BASE_URL)!!) |         networkService.cookieManager.remove(BASE_URL.toHttpUrlOrNull()!!) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     val isAuthorized: Boolean |     val isAuthorized: Boolean | ||||||
| @ -152,9 +151,9 @@ class Myanimelist(private val context: Context, id: Int) : TrackService(id) { | |||||||
| 
 | 
 | ||||||
|     private fun checkCookies(): Boolean { |     private fun checkCookies(): Boolean { | ||||||
|         var ckCount = 0 |         var ckCount = 0 | ||||||
|         val url = HttpUrl.parse(BASE_URL)!! |         val url = BASE_URL.toHttpUrlOrNull()!! | ||||||
|         for (ck in networkService.cookieManager.get(url)) { |         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++ |                 ckCount++ | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -15,7 +15,7 @@ class MyAnimeListInterceptor(private val myanimelist: Myanimelist): Interceptor | |||||||
|         val request = chain.request() |         val request = chain.request() | ||||||
|         var response = chain.proceed(updateRequest(request)) |         var response = chain.proceed(updateRequest(request)) | ||||||
| 
 | 
 | ||||||
|         if (response.code() == 400){ |         if (response.code == 400){ | ||||||
|             myanimelist.refreshLogin() |             myanimelist.refreshLogin() | ||||||
|             response = chain.proceed(updateRequest(request)) |             response = chain.proceed(updateRequest(request)) | ||||||
|         } |         } | ||||||
| @ -24,7 +24,7 @@ class MyAnimeListInterceptor(private val myanimelist: Myanimelist): Interceptor | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     private fun updateRequest(request: Request): Request { |     private fun updateRequest(request: Request): Request { | ||||||
|         return request.body()?.let { |         return request.body?.let { | ||||||
|             val contentType = it.contentType().toString() |             val contentType = it.contentType().toString() | ||||||
|             val updatedBody = when { |             val updatedBody = when { | ||||||
|                 contentType.contains("x-www-form-urlencoded") -> updateFormBody(it) |                 contentType.contains("x-www-form-urlencoded") -> updateFormBody(it) | ||||||
|  | |||||||
| @ -10,7 +10,11 @@ import eu.kanade.tachiyomi.network.asObservable | |||||||
| import eu.kanade.tachiyomi.network.asObservableSuccess | import eu.kanade.tachiyomi.network.asObservableSuccess | ||||||
| import eu.kanade.tachiyomi.util.selectInt | import eu.kanade.tachiyomi.util.selectInt | ||||||
| import eu.kanade.tachiyomi.util.selectText | 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.json.JSONObject | ||||||
| import org.jsoup.Jsoup | import org.jsoup.Jsoup | ||||||
| import org.jsoup.nodes.Document | import org.jsoup.nodes.Document | ||||||
| @ -85,7 +89,7 @@ class MyanimelistApi(private val client: OkHttpClient, interceptor: MyAnimeListI | |||||||
|                 .map {response -> |                 .map {response -> | ||||||
|                     var libTrack: Track? = null |                     var libTrack: Track? = null | ||||||
|                     response.use { |                     response.use { | ||||||
|                         if (it.priorResponse()?.isRedirect != true) { |                         if (it.priorResponse?.isRedirect != true) { | ||||||
|                             val trackForm = Jsoup.parse(it.consumeBody()) |                             val trackForm = Jsoup.parse(it.consumeBody()) | ||||||
| 
 | 
 | ||||||
|                             libTrack = Track.create(TrackManager.MYANIMELIST).apply { |                             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() |         val response = client.newCall(POST(url = loginUrl(), body = loginPostBody(username, password, csrf))).execute() | ||||||
| 
 | 
 | ||||||
|         response.use { |         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? { |     private fun Response.consumeBody(): String? { | ||||||
|         use { |         use { | ||||||
|             if (it.code() != 200) throw Exception("HTTP error ${it.code()}") |             if (it.code != 200) throw Exception("HTTP error ${it.code}") | ||||||
|             return it.body()?.string() |             return it.body?.string() | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     private fun Response.consumeXmlBody(): String? { |     private fun Response.consumeXmlBody(): String? { | ||||||
|         use { res -> |         use { res -> | ||||||
|             if (res.code() != 200) throw Exception("Export list error") |             if (res.code != 200) throw Exception("Export list error") | ||||||
|             BufferedReader(InputStreamReader(GZIPInputStream(res.body()?.source()?.inputStream()))).use { reader -> |             BufferedReader(InputStreamReader(GZIPInputStream(res.body?.source()?.inputStream()))).use { reader -> | ||||||
|                 val sb = StringBuilder() |                 val sb = StringBuilder() | ||||||
|                 reader.forEachLine { line -> |                 reader.forEachLine { line -> | ||||||
|                     sb.append(line) |                     sb.append(line) | ||||||
| @ -262,7 +266,7 @@ class MyanimelistApi(private val client: OkHttpClient, interceptor: MyAnimeListI | |||||||
|                     .put("score", track.score) |                     .put("score", track.score) | ||||||
|                     .put("num_read_chapters", track.last_chapter_read) |                     .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()!! |         private fun Element.searchTitle() = select("strong").text()!! | ||||||
|  | |||||||
| @ -14,7 +14,11 @@ import eu.kanade.tachiyomi.data.track.model.TrackSearch | |||||||
| import eu.kanade.tachiyomi.network.GET | import eu.kanade.tachiyomi.network.GET | ||||||
| import eu.kanade.tachiyomi.network.POST | import eu.kanade.tachiyomi.network.POST | ||||||
| import eu.kanade.tachiyomi.network.asObservableSuccess | 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 rx.Observable | ||||||
| import uy.kohesive.injekt.injectLazy | 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 gson: Gson by injectLazy() | ||||||
|     private val parser = JsonParser() |     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() |     private val authClient = client.newBuilder().addInterceptor(interceptor).build() | ||||||
| 
 | 
 | ||||||
|     fun addLibManga(track: Track, user_id: String): Observable<Track> { |     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) |         return authClient.newCall(request) | ||||||
|                 .asObservableSuccess() |                 .asObservableSuccess() | ||||||
|                 .map { netResponse -> |                 .map { netResponse -> | ||||||
|                     val responseBody = netResponse.body()?.string().orEmpty() |                     val responseBody = netResponse.body?.string().orEmpty() | ||||||
|                     if (responseBody.isEmpty()) { |                     if (responseBody.isEmpty()) { | ||||||
|                         throw Exception("Null Response") |                         throw Exception("Null Response") | ||||||
|                     } |                     } | ||||||
| @ -120,13 +124,13 @@ class ShikimoriApi(private val client: OkHttpClient, interceptor: ShikimoriInter | |||||||
|         return authClient.newCall(requestMangas) |         return authClient.newCall(requestMangas) | ||||||
|                 .asObservableSuccess() |                 .asObservableSuccess() | ||||||
|                 .map { netResponse -> |                 .map { netResponse -> | ||||||
|                     val responseBody = netResponse.body()?.string().orEmpty() |                     val responseBody = netResponse.body?.string().orEmpty() | ||||||
|                     parser.parse(responseBody).obj |                     parser.parse(responseBody).obj | ||||||
|                 }.flatMap { mangas -> |                 }.flatMap { mangas -> | ||||||
|                     authClient.newCall(request) |                     authClient.newCall(request) | ||||||
|                             .asObservableSuccess() |                             .asObservableSuccess() | ||||||
|                             .map { netResponse -> |                             .map { netResponse -> | ||||||
|                                 val responseBody = netResponse.body()?.string().orEmpty() |                                 val responseBody = netResponse.body?.string().orEmpty() | ||||||
|                                 if (responseBody.isEmpty()) { |                                 if (responseBody.isEmpty()) { | ||||||
|                                     throw Exception("Null Response") |                                     throw Exception("Null Response") | ||||||
|                                 } |                                 } | ||||||
| @ -143,13 +147,13 @@ class ShikimoriApi(private val client: OkHttpClient, interceptor: ShikimoriInter | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fun getCurrentUser(): Int { |     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 |         return parser.parse(user).obj["id"].asInt | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fun accessToken(code: String): Observable<OAuth> { |     fun accessToken(code: String): Observable<OAuth> { | ||||||
|         return client.newCall(accessTokenRequest(code)).asObservableSuccess().map { netResponse -> |         return client.newCall(accessTokenRequest(code)).asObservableSuccess().map { netResponse -> | ||||||
|             val responseBody = netResponse.body()?.string().orEmpty() |             val responseBody = netResponse.body?.string().orEmpty() | ||||||
|             if (responseBody.isEmpty()) { |             if (responseBody.isEmpty()) { | ||||||
|                 throw Exception("Null Response") |                 throw Exception("Null Response") | ||||||
|             } |             } | ||||||
|  | |||||||
| @ -22,7 +22,7 @@ class ShikimoriInterceptor(val shikimori: Shikimori, val gson: Gson) : Intercept | |||||||
|         if (currAuth.isExpired()) { |         if (currAuth.isExpired()) { | ||||||
|             val response = chain.proceed(ShikimoriApi.refreshTokenRequest(refreshToken)) |             val response = chain.proceed(ShikimoriApi.refreshTokenRequest(refreshToken)) | ||||||
|             if (response.isSuccessful) { |             if (response.isSuccessful) { | ||||||
|                 newAuth(gson.fromJson(response.body()!!.string(), OAuth::class.java)) |                 newAuth(gson.fromJson(response.body!!.string(), OAuth::class.java)) | ||||||
|             } else { |             } else { | ||||||
|                 response.close() |                 response.close() | ||||||
|             } |             } | ||||||
|  | |||||||
| @ -2,7 +2,7 @@ package eu.kanade.tachiyomi.data.updater | |||||||
| 
 | 
 | ||||||
| import android.app.PendingIntent | import android.app.PendingIntent | ||||||
| import android.content.Intent | 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.Job | ||||||
| import com.evernote.android.job.JobManager | import com.evernote.android.job.JobManager | ||||||
| import com.evernote.android.job.JobRequest | import com.evernote.android.job.JobRequest | ||||||
|  | |||||||
| @ -2,7 +2,7 @@ package eu.kanade.tachiyomi.data.updater | |||||||
| 
 | 
 | ||||||
| import android.content.Context | import android.content.Context | ||||||
| import android.net.Uri | import android.net.Uri | ||||||
| import android.support.v4.app.NotificationCompat | import androidx.core.app.NotificationCompat | ||||||
| import eu.kanade.tachiyomi.R | import eu.kanade.tachiyomi.R | ||||||
| import eu.kanade.tachiyomi.data.notification.NotificationHandler | import eu.kanade.tachiyomi.data.notification.NotificationHandler | ||||||
| import eu.kanade.tachiyomi.data.notification.NotificationReceiver | import eu.kanade.tachiyomi.data.notification.NotificationReceiver | ||||||
|  | |||||||
| @ -71,7 +71,7 @@ class UpdaterService : IntentService(UpdaterService::class.java.name) { | |||||||
|             val apkFile = File(externalCacheDir, "update.apk") |             val apkFile = File(externalCacheDir, "update.apk") | ||||||
| 
 | 
 | ||||||
|             if (response.isSuccessful) { |             if (response.isSuccessful) { | ||||||
|                 response.body()!!.source().saveTo(apkFile) |                 response.body!!.source().saveTo(apkFile) | ||||||
|             } else { |             } else { | ||||||
|                 response.close() |                 response.close() | ||||||
|                 throw Exception("Unsuccessful response") |                 throw Exception("Unsuccessful response") | ||||||
|  | |||||||
| @ -32,7 +32,7 @@ internal class ExtensionGithubApi { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     private fun parseResponse(response: Response): List<Extension.Available> { |     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) |         val json = gson.fromJson<JsonArray>(text) | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -21,7 +21,7 @@ class AndroidCookieJar(context: Context) : CookieJar { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     override fun saveFromResponse(url: HttpUrl, cookies: MutableList<Cookie>) { |     override fun saveFromResponse(url: HttpUrl, cookies: List<Cookie>) { | ||||||
|         val urlString = url.toString() |         val urlString = url.toString() | ||||||
| 
 | 
 | ||||||
|         for (cookie in cookies) { |         for (cookie in cookies) { | ||||||
|  | |||||||
| @ -42,7 +42,7 @@ class CloudflareInterceptor(private val context: Context) : Interceptor { | |||||||
|         val response = chain.proceed(chain.request()) |         val response = chain.proceed(chain.request()) | ||||||
| 
 | 
 | ||||||
|         // Check if Cloudflare anti-bot is on |         // 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 { |             try { | ||||||
|                 response.close() |                 response.close() | ||||||
|                 val solutionRequest = resolveWithWebView(chain.request()) |                 val solutionRequest = resolveWithWebView(chain.request()) | ||||||
| @ -71,8 +71,8 @@ class CloudflareInterceptor(private val context: Context) : Interceptor { | |||||||
|         var solutionUrl: String? = null |         var solutionUrl: String? = null | ||||||
|         var challengeFound = false |         var challengeFound = false | ||||||
| 
 | 
 | ||||||
|         val origRequestUrl = request.url().toString() |         val origRequestUrl = request.url.toString() | ||||||
|         val headers = request.headers().toMultimap().mapValues { it.value.getOrNull(0) ?: "" } |         val headers = request.headers.toMultimap().mapValues { it.value.getOrNull(0) ?: "" } | ||||||
| 
 | 
 | ||||||
|         handler.post { |         handler.post { | ||||||
|             val view = WebView(context) |             val view = WebView(context) | ||||||
| @ -144,7 +144,7 @@ class CloudflareInterceptor(private val context: Context) : Interceptor { | |||||||
| 
 | 
 | ||||||
|         return Request.Builder().get() |         return Request.Builder().get() | ||||||
|             .url(solution) |             .url(solution) | ||||||
|             .headers(request.headers()) |             .headers(request.headers) | ||||||
|             .addHeader("Referer", origRequestUrl) |             .addHeader("Referer", origRequestUrl) | ||||||
|             .addHeader("Accept", "text/html,application/xhtml+xml,application/xml") |             .addHeader("Accept", "text/html,application/xhtml+xml,application/xml") | ||||||
|             .addHeader("Accept-Language", "en") |             .addHeader("Accept-Language", "en") | ||||||
|  | |||||||
| @ -103,7 +103,7 @@ class NetworkHelper(context: Context) { | |||||||
|         val specCompat = ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS) |         val specCompat = ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS) | ||||||
|             .tlsVersions(TlsVersion.TLS_1_2, TlsVersion.TLS_1_1, TlsVersion.TLS_1_0) |             .tlsVersions(TlsVersion.TLS_1_2, TlsVersion.TLS_1_1, TlsVersion.TLS_1_0) | ||||||
|             .cipherSuites( |             .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_128_CBC_SHA, | ||||||
|                     CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA |                     CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA | ||||||
|             ) |             ) | ||||||
|  | |||||||
| @ -37,7 +37,7 @@ fun Call.asObservable(): Observable<Response> { | |||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             override fun isUnsubscribed(): Boolean { |             override fun isUnsubscribed(): Boolean { | ||||||
|                 return call.isCanceled |                 return call.isCanceled() | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
| @ -50,7 +50,7 @@ fun Call.asObservableSuccess(): Observable<Response> { | |||||||
|     return asObservable().doOnNext { response -> |     return asObservable().doOnNext { response -> | ||||||
|         if (!response.isSuccessful) { |         if (!response.isSuccessful) { | ||||||
|             response.close() |             response.close() | ||||||
|             throw Exception("HTTP error ${response.code()}") |             throw Exception("HTTP error ${response.code}") | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @ -61,7 +61,7 @@ fun OkHttpClient.newCallWithProgress(request: Request, listener: ProgressListene | |||||||
|             .addNetworkInterceptor { chain -> |             .addNetworkInterceptor { chain -> | ||||||
|                 val originalResponse = chain.proceed(chain.request()) |                 val originalResponse = chain.proceed(chain.request()) | ||||||
|                 originalResponse.newBuilder() |                 originalResponse.newBuilder() | ||||||
|                         .body(ProgressResponseBody(originalResponse.body()!!, listener)) |                         .body(ProgressResponseBody(originalResponse.body!!, listener)) | ||||||
|                         .build() |                         .build() | ||||||
|             } |             } | ||||||
|             .build() |             .build() | ||||||
|  | |||||||
| @ -8,7 +8,7 @@ import java.io.IOException | |||||||
| class ProgressResponseBody(private val responseBody: ResponseBody, private val progressListener: ProgressListener) : ResponseBody() { | class ProgressResponseBody(private val responseBody: ResponseBody, private val progressListener: ProgressListener) : ResponseBody() { | ||||||
| 
 | 
 | ||||||
|     private val bufferedSource: BufferedSource by lazy { |     private val bufferedSource: BufferedSource by lazy { | ||||||
|         Okio.buffer(source(responseBody.source())) |         source(responseBody.source()).buffer() | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     override fun contentType(): MediaType { |     override fun contentType(): MediaType { | ||||||
| @ -25,7 +25,7 @@ class ProgressResponseBody(private val responseBody: ResponseBody, private val p | |||||||
| 
 | 
 | ||||||
|     private fun source(source: Source): Source { |     private fun source(source: Source): Source { | ||||||
|         return object : ForwardingSource(source) { |         return object : ForwardingSource(source) { | ||||||
|             internal var totalBytesRead = 0L |             var totalBytesRead = 0L | ||||||
| 
 | 
 | ||||||
|             @Throws(IOException::class) |             @Throws(IOException::class) | ||||||
|             override fun read(sink: Buffer, byteCount: Long): Long { |             override fun read(sink: Buffer, byteCount: Long): Long { | ||||||
|  | |||||||
| @ -1,6 +1,6 @@ | |||||||
| package eu.kanade.tachiyomi.source | package eu.kanade.tachiyomi.source | ||||||
| 
 | 
 | ||||||
| import android.support.v7.preference.PreferenceScreen | import androidx.preference.PreferenceScreen | ||||||
| 
 | 
 | ||||||
| interface ConfigurableSource : Source { | interface ConfigurableSource : Source { | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,6 +1,6 @@ | |||||||
| package eu.kanade.tachiyomi.ui.base.activity | package eu.kanade.tachiyomi.ui.base.activity | ||||||
| 
 | 
 | ||||||
| import android.support.v7.app.AppCompatActivity | import androidx.appcompat.app.AppCompatActivity | ||||||
| import eu.kanade.tachiyomi.util.LocaleHelper | import eu.kanade.tachiyomi.util.LocaleHelper | ||||||
| 
 | 
 | ||||||
| abstract class BaseActivity : AppCompatActivity() { | abstract class BaseActivity : AppCompatActivity() { | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| package eu.kanade.tachiyomi.ui.base.controller | package eu.kanade.tachiyomi.ui.base.controller | ||||||
| 
 | 
 | ||||||
| import android.os.Bundle | import android.os.Bundle | ||||||
| import android.support.v7.app.AppCompatActivity | import androidx.appcompat.app.AppCompatActivity | ||||||
| import android.view.LayoutInflater | import android.view.LayoutInflater | ||||||
| import android.view.MenuItem | import android.view.MenuItem | ||||||
| import android.view.View | import android.view.View | ||||||
|  | |||||||
| @ -2,7 +2,7 @@ package eu.kanade.tachiyomi.ui.base.controller | |||||||
| 
 | 
 | ||||||
| import android.content.pm.PackageManager.PERMISSION_GRANTED | import android.content.pm.PackageManager.PERMISSION_GRANTED | ||||||
| import android.os.Build | import android.os.Build | ||||||
| import android.support.v4.content.ContextCompat | import androidx.core.content.ContextCompat | ||||||
| import com.bluelinelabs.conductor.Controller | import com.bluelinelabs.conductor.Controller | ||||||
| import com.bluelinelabs.conductor.Router | import com.bluelinelabs.conductor.Router | ||||||
| import com.bluelinelabs.conductor.RouterTransaction | import com.bluelinelabs.conductor.RouterTransaction | ||||||
|  | |||||||
| @ -3,8 +3,8 @@ package eu.kanade.tachiyomi.ui.base.controller; | |||||||
| import android.app.Dialog; | import android.app.Dialog; | ||||||
| import android.content.DialogInterface; | import android.content.DialogInterface; | ||||||
| import android.os.Bundle; | import android.os.Bundle; | ||||||
| import android.support.annotation.NonNull; | import androidx.annotation.NonNull; | ||||||
| import android.support.annotation.Nullable; | import androidx.annotation.Nullable; | ||||||
| import android.view.LayoutInflater; | import android.view.LayoutInflater; | ||||||
| import android.view.View; | import android.view.View; | ||||||
| import android.view.ViewGroup; | import android.view.ViewGroup; | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| package eu.kanade.tachiyomi.ui.base.controller | package eu.kanade.tachiyomi.ui.base.controller | ||||||
| 
 | 
 | ||||||
| import android.os.Bundle | import android.os.Bundle | ||||||
| import android.support.annotation.CallSuper | import androidx.annotation.CallSuper | ||||||
| import android.view.View | import android.view.View | ||||||
| import rx.Observable | import rx.Observable | ||||||
| import rx.Subscription | import rx.Subscription | ||||||
|  | |||||||
| @ -1,6 +1,6 @@ | |||||||
| package eu.kanade.tachiyomi.ui.base.controller | package eu.kanade.tachiyomi.ui.base.controller | ||||||
| 
 | 
 | ||||||
| import android.support.v4.widget.DrawerLayout | import androidx.drawerlayout.widget.DrawerLayout | ||||||
| import android.view.ViewGroup | import android.view.ViewGroup | ||||||
| 
 | 
 | ||||||
| interface SecondaryDrawerController { | interface SecondaryDrawerController { | ||||||
|  | |||||||
| @ -1,6 +1,6 @@ | |||||||
| package eu.kanade.tachiyomi.ui.base.controller | package eu.kanade.tachiyomi.ui.base.controller | ||||||
| 
 | 
 | ||||||
| import android.support.design.widget.TabLayout | import com.google.android.material.tabs.TabLayout | ||||||
| 
 | 
 | ||||||
| interface TabbedController { | interface TabbedController { | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,6 +1,6 @@ | |||||||
| package eu.kanade.tachiyomi.ui.base.holder | package eu.kanade.tachiyomi.ui.base.holder | ||||||
| 
 | 
 | ||||||
| import android.support.v7.widget.RecyclerView | import androidx.recyclerview.widget.RecyclerView | ||||||
| import android.view.View | import android.view.View | ||||||
| import kotlinx.android.extensions.LayoutContainer | import kotlinx.android.extensions.LayoutContainer | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| package eu.kanade.tachiyomi.ui.base.presenter; | package eu.kanade.tachiyomi.ui.base.presenter; | ||||||
| 
 | 
 | ||||||
| import android.os.Bundle; | import android.os.Bundle; | ||||||
| import android.support.annotation.Nullable; | import androidx.annotation.Nullable; | ||||||
| 
 | 
 | ||||||
| import nucleus.factory.PresenterFactory; | import nucleus.factory.PresenterFactory; | ||||||
| import nucleus.presenter.Presenter; | import nucleus.presenter.Presenter; | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| package eu.kanade.tachiyomi.ui.base.presenter; | package eu.kanade.tachiyomi.ui.base.presenter; | ||||||
| 
 | 
 | ||||||
| import android.os.Bundle; | import android.os.Bundle; | ||||||
| import android.support.annotation.NonNull; | import androidx.annotation.NonNull; | ||||||
| import android.view.View; | import android.view.View; | ||||||
| 
 | 
 | ||||||
| import com.bluelinelabs.conductor.Controller; | import com.bluelinelabs.conductor.Controller; | ||||||
|  | |||||||
| @ -1,8 +1,8 @@ | |||||||
| package eu.kanade.tachiyomi.ui.catalogue | package eu.kanade.tachiyomi.ui.catalogue | ||||||
| 
 | 
 | ||||||
| import android.Manifest.permission.WRITE_EXTERNAL_STORAGE | import android.Manifest.permission.WRITE_EXTERNAL_STORAGE | ||||||
| import android.support.v7.widget.LinearLayoutManager | import androidx.recyclerview.widget.LinearLayoutManager | ||||||
| import android.support.v7.widget.SearchView | import androidx.appcompat.widget.SearchView | ||||||
| import android.view.* | import android.view.* | ||||||
| import com.bluelinelabs.conductor.ControllerChangeHandler | import com.bluelinelabs.conductor.ControllerChangeHandler | ||||||
| import com.bluelinelabs.conductor.ControllerChangeType | import com.bluelinelabs.conductor.ControllerChangeType | ||||||
| @ -132,7 +132,7 @@ class CatalogueController : NucleusController<CataloguePresenter>(), | |||||||
|     /** |     /** | ||||||
|      * Called when item is clicked |      * 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 item = adapter?.getItem(position) as? SourceItem ?: return false | ||||||
|         val source = item.source |         val source = item.source | ||||||
|         if (source is LoginSource && !source.isLogged()) { |         if (source is LoginSource && !source.isLogged()) { | ||||||
| @ -150,7 +150,7 @@ class CatalogueController : NucleusController<CataloguePresenter>(), | |||||||
|      * Called when browse is clicked in [CatalogueAdapter] |      * Called when browse is clicked in [CatalogueAdapter] | ||||||
|      */ |      */ | ||||||
|     override fun onBrowseClick(position: Int) { |     override fun onBrowseClick(position: Int) { | ||||||
|         onItemClick(position) |         onItemClick(view!!, position) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|  | |||||||
| @ -1,8 +1,10 @@ | |||||||
| package eu.kanade.tachiyomi.ui.catalogue | package eu.kanade.tachiyomi.ui.catalogue | ||||||
| 
 | 
 | ||||||
| import android.view.View | import android.view.View | ||||||
|  | import androidx.recyclerview.widget.RecyclerView | ||||||
| import eu.davidea.flexibleadapter.FlexibleAdapter | import eu.davidea.flexibleadapter.FlexibleAdapter | ||||||
| import eu.davidea.flexibleadapter.items.AbstractHeaderItem | import eu.davidea.flexibleadapter.items.AbstractHeaderItem | ||||||
|  | import eu.davidea.flexibleadapter.items.IFlexible | ||||||
| import eu.kanade.tachiyomi.R | 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. |      * 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) |         return LangHolder(view, adapter) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|      * Binds this item to the given view holder. |      * Binds this item to the given view holder. | ||||||
|      */ |      */ | ||||||
|     override fun bindViewHolder(adapter: FlexibleAdapter<*>, holder: LangHolder, |     override fun bindViewHolder( | ||||||
|                                 position: Int, payloads: List<Any?>?) { |             adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>, | ||||||
| 
 |             holder: LangHolder, | ||||||
|  |             position: Int, | ||||||
|  |             payloads: MutableList<Any>) { | ||||||
|         holder.bind(this) |         holder.bind(this) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -4,7 +4,7 @@ import android.content.Context | |||||||
| import android.graphics.Canvas | import android.graphics.Canvas | ||||||
| import android.graphics.Rect | import android.graphics.Rect | ||||||
| import android.graphics.drawable.Drawable | import android.graphics.drawable.Drawable | ||||||
| import android.support.v7.widget.RecyclerView | import androidx.recyclerview.widget.RecyclerView | ||||||
| import android.view.View | import android.view.View | ||||||
| 
 | 
 | ||||||
| class SourceDividerItemDecoration(context: Context) : RecyclerView.ItemDecoration() { | class SourceDividerItemDecoration(context: Context) : RecyclerView.ItemDecoration() { | ||||||
|  | |||||||
| @ -1,8 +1,10 @@ | |||||||
| package eu.kanade.tachiyomi.ui.catalogue | package eu.kanade.tachiyomi.ui.catalogue | ||||||
| 
 | 
 | ||||||
| import android.view.View | import android.view.View | ||||||
|  | import androidx.recyclerview.widget.RecyclerView | ||||||
| import eu.davidea.flexibleadapter.FlexibleAdapter | import eu.davidea.flexibleadapter.FlexibleAdapter | ||||||
| import eu.davidea.flexibleadapter.items.AbstractSectionableItem | import eu.davidea.flexibleadapter.items.AbstractSectionableItem | ||||||
|  | import eu.davidea.flexibleadapter.items.IFlexible | ||||||
| import eu.kanade.tachiyomi.R | import eu.kanade.tachiyomi.R | ||||||
| import eu.kanade.tachiyomi.source.CatalogueSource | import eu.kanade.tachiyomi.source.CatalogueSource | ||||||
| 
 | 
 | ||||||
| @ -25,16 +27,18 @@ data class SourceItem(val source: CatalogueSource, val header: LangItem? = null) | |||||||
|     /** |     /** | ||||||
|      * Creates a new view holder for this item. |      * 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) |         return SourceHolder(view, adapter as CatalogueAdapter) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|      * Binds this item to the given view holder. |      * Binds this item to the given view holder. | ||||||
|      */ |      */ | ||||||
|     override fun bindViewHolder(adapter: FlexibleAdapter<*>, holder: SourceHolder, |     override fun bindViewHolder( | ||||||
|                                 position: Int, payloads: List<Any?>?) { |             adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>, | ||||||
| 
 |             holder: SourceHolder, | ||||||
|  |             position: Int, | ||||||
|  |             payloads: MutableList<Any>) { | ||||||
|         holder.bind(this) |         holder.bind(this) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -2,10 +2,15 @@ package eu.kanade.tachiyomi.ui.catalogue.browse | |||||||
| 
 | 
 | ||||||
| import android.content.res.Configuration | import android.content.res.Configuration | ||||||
| import android.os.Bundle | import android.os.Bundle | ||||||
| import android.support.design.widget.Snackbar | import com.google.android.material.snackbar.Snackbar | ||||||
| import android.support.v4.widget.DrawerLayout | import androidx.drawerlayout.widget.DrawerLayout | ||||||
| import android.support.v7.widget.* | import androidx.appcompat.widget.* | ||||||
| import android.view.* | 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.afollestad.materialdialogs.MaterialDialog | ||||||
| import com.f2prateek.rx.preferences.Preference | import com.f2prateek.rx.preferences.Preference | ||||||
| import com.jakewharton.rxbinding.support.v7.widget.queryTextChangeEvents | import com.jakewharton.rxbinding.support.v7.widget.queryTextChangeEvents | ||||||
| @ -136,13 +141,13 @@ open class BrowseCatalogueController(bundle: Bundle) : | |||||||
|         this.navView = navView |         this.navView = navView | ||||||
|         navView.setFilters(presenter.filterItems) |         navView.setFilters(presenter.filterItems) | ||||||
| 
 | 
 | ||||||
|         drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED, Gravity.END) |         drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED, GravityCompat.END) | ||||||
| 
 | 
 | ||||||
|         navView.onSearchClicked = { |         navView.onSearchClicked = { | ||||||
|             val allDefault = presenter.sourceFilters == presenter.source.getFilterList() |             val allDefault = presenter.sourceFilters == presenter.source.getFilterList() | ||||||
|             showProgressBar() |             showProgressBar() | ||||||
|             adapter?.clear() |             adapter?.clear() | ||||||
|             drawer.closeDrawer(Gravity.END) |             drawer.closeDrawer(GravityCompat.END) | ||||||
|             presenter.setSourceFilter(if (allDefault) FilterList() else presenter.sourceFilters) |             presenter.setSourceFilter(if (allDefault) FilterList() else presenter.sourceFilters) | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
| @ -273,7 +278,7 @@ open class BrowseCatalogueController(bundle: Bundle) : | |||||||
|     override fun onOptionsItemSelected(item: MenuItem): Boolean { |     override fun onOptionsItemSelected(item: MenuItem): Boolean { | ||||||
|         when (item.itemId) { |         when (item.itemId) { | ||||||
|             R.id.action_display_mode -> swapDisplayMode() |             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_browser -> openInBrowser() | ||||||
|             R.id.action_open_in_web_view -> openInWebView() |             R.id.action_open_in_web_view -> openInWebView() | ||||||
|             else -> return super.onOptionsItemSelected(item) |             else -> return super.onOptionsItemSelected(item) | ||||||
| @ -468,7 +473,7 @@ open class BrowseCatalogueController(bundle: Bundle) : | |||||||
|      * @param position the position of the element clicked. |      * @param position the position of the element clicked. | ||||||
|      * @return true if the item should be selected, false otherwise. |      * @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 |         val item = adapter?.getItem(position) as? CatalogueItem ?: return false | ||||||
|         router.pushController(MangaController(item.manga, true).withFadeTransaction()) |         router.pushController(MangaController(item.manga, true).withFadeTransaction()) | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -4,9 +4,11 @@ import android.view.Gravity | |||||||
| import android.view.View | import android.view.View | ||||||
| import android.view.ViewGroup.LayoutParams.MATCH_PARENT | import android.view.ViewGroup.LayoutParams.MATCH_PARENT | ||||||
| import android.widget.FrameLayout | import android.widget.FrameLayout | ||||||
|  | import androidx.recyclerview.widget.RecyclerView | ||||||
| import com.f2prateek.rx.preferences.Preference | import com.f2prateek.rx.preferences.Preference | ||||||
| import eu.davidea.flexibleadapter.FlexibleAdapter | import eu.davidea.flexibleadapter.FlexibleAdapter | ||||||
| import eu.davidea.flexibleadapter.items.AbstractFlexibleItem | import eu.davidea.flexibleadapter.items.AbstractFlexibleItem | ||||||
|  | import eu.davidea.flexibleadapter.items.IFlexible | ||||||
| import eu.kanade.tachiyomi.R | import eu.kanade.tachiyomi.R | ||||||
| import eu.kanade.tachiyomi.data.database.models.Manga | import eu.kanade.tachiyomi.data.database.models.Manga | ||||||
| import eu.kanade.tachiyomi.data.preference.getOrDefault | 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 |             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 |         val parent = adapter.recyclerView | ||||||
|         return if (parent is AutofitRecyclerView) { |         return if (parent is AutofitRecyclerView) { | ||||||
|             view.apply { |             view.apply { | ||||||
| @ -38,11 +43,12 @@ class CatalogueItem(val manga: Manga, private val catalogueAsList: Preference<Bo | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     override fun bindViewHolder(adapter: FlexibleAdapter<*>, |     override fun bindViewHolder( | ||||||
|                                 holder: CatalogueHolder, |             adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>, | ||||||
|                                 position: Int, |             holder: CatalogueHolder, | ||||||
|                                 payloads: List<Any?>?) { |             position: Int, | ||||||
| 
 |             payloads: List<Any?>? | ||||||
|  |     ) { | ||||||
|         holder.onSetValues(manga) |         holder.onSetValues(manga) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| @ -58,6 +64,4 @@ class CatalogueItem(val manga: Manga, private val catalogueAsList: Preference<Bo | |||||||
|         return manga.id!!.hashCode() |         return manga.id!!.hashCode() | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| } | } | ||||||
| @ -3,8 +3,10 @@ package eu.kanade.tachiyomi.ui.catalogue.browse | |||||||
| import android.view.View | import android.view.View | ||||||
| import android.widget.ProgressBar | import android.widget.ProgressBar | ||||||
| import android.widget.TextView | import android.widget.TextView | ||||||
|  | import androidx.recyclerview.widget.RecyclerView | ||||||
| import eu.davidea.flexibleadapter.FlexibleAdapter | import eu.davidea.flexibleadapter.FlexibleAdapter | ||||||
| import eu.davidea.flexibleadapter.items.AbstractFlexibleItem | import eu.davidea.flexibleadapter.items.AbstractFlexibleItem | ||||||
|  | import eu.davidea.flexibleadapter.items.IFlexible | ||||||
| import eu.davidea.viewholders.FlexibleViewHolder | import eu.davidea.viewholders.FlexibleViewHolder | ||||||
| import eu.kanade.tachiyomi.R | import eu.kanade.tachiyomi.R | ||||||
| 
 | 
 | ||||||
| @ -17,11 +19,11 @@ class ProgressItem : AbstractFlexibleItem<ProgressItem.Holder>() { | |||||||
|         return R.layout.catalogue_progress_item |         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) |         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.progressBar.visibility = View.GONE | ||||||
|         holder.progressMessage.visibility = View.GONE |         holder.progressMessage.visibility = View.GONE | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -2,8 +2,10 @@ package eu.kanade.tachiyomi.ui.catalogue.filter | |||||||
| 
 | 
 | ||||||
| import android.view.View | import android.view.View | ||||||
| import android.widget.CheckBox | import android.widget.CheckBox | ||||||
|  | import androidx.recyclerview.widget.RecyclerView | ||||||
| import eu.davidea.flexibleadapter.FlexibleAdapter | import eu.davidea.flexibleadapter.FlexibleAdapter | ||||||
| import eu.davidea.flexibleadapter.items.AbstractFlexibleItem | import eu.davidea.flexibleadapter.items.AbstractFlexibleItem | ||||||
|  | import eu.davidea.flexibleadapter.items.IFlexible | ||||||
| import eu.davidea.viewholders.FlexibleViewHolder | import eu.davidea.viewholders.FlexibleViewHolder | ||||||
| import eu.kanade.tachiyomi.R | import eu.kanade.tachiyomi.R | ||||||
| import eu.kanade.tachiyomi.source.model.Filter | 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 |         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) |         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 |         val view = holder.check | ||||||
|         view.text = filter.name |         view.text = filter.name | ||||||
|         view.isChecked = filter.state |         view.isChecked = filter.state | ||||||
|  | |||||||
| @ -3,8 +3,10 @@ package eu.kanade.tachiyomi.ui.catalogue.filter | |||||||
| import android.view.View | import android.view.View | ||||||
| import android.widget.ImageView | import android.widget.ImageView | ||||||
| import android.widget.TextView | import android.widget.TextView | ||||||
|  | import androidx.recyclerview.widget.RecyclerView | ||||||
| import eu.davidea.flexibleadapter.FlexibleAdapter | import eu.davidea.flexibleadapter.FlexibleAdapter | ||||||
| import eu.davidea.flexibleadapter.items.AbstractExpandableHeaderItem | import eu.davidea.flexibleadapter.items.AbstractExpandableHeaderItem | ||||||
|  | import eu.davidea.flexibleadapter.items.IFlexible | ||||||
| import eu.davidea.flexibleadapter.items.ISectionable | import eu.davidea.flexibleadapter.items.ISectionable | ||||||
| import eu.davidea.viewholders.ExpandableViewHolder | import eu.davidea.viewholders.ExpandableViewHolder | ||||||
| import eu.kanade.tachiyomi.R | import eu.kanade.tachiyomi.R | ||||||
| @ -25,11 +27,11 @@ class GroupItem(val filter: Filter.Group<*>) : AbstractExpandableHeaderItem<Grou | |||||||
|         return 101 |         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) |         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.title.text = filter.name | ||||||
| 
 | 
 | ||||||
|         holder.icon.setVectorCompat(if (isExpanded) |         holder.icon.setVectorCompat(if (isExpanded) | ||||||
|  | |||||||
| @ -1,11 +1,13 @@ | |||||||
| package eu.kanade.tachiyomi.ui.catalogue.filter | package eu.kanade.tachiyomi.ui.catalogue.filter | ||||||
| 
 | 
 | ||||||
| import android.annotation.SuppressLint | import android.annotation.SuppressLint | ||||||
| import android.support.design.R | import com.google.android.material.R | ||||||
| import android.view.View | import android.view.View | ||||||
| import android.widget.TextView | import android.widget.TextView | ||||||
|  | import androidx.recyclerview.widget.RecyclerView | ||||||
| import eu.davidea.flexibleadapter.FlexibleAdapter | import eu.davidea.flexibleadapter.FlexibleAdapter | ||||||
| import eu.davidea.flexibleadapter.items.AbstractHeaderItem | import eu.davidea.flexibleadapter.items.AbstractHeaderItem | ||||||
|  | import eu.davidea.flexibleadapter.items.IFlexible | ||||||
| import eu.davidea.viewholders.FlexibleViewHolder | import eu.davidea.viewholders.FlexibleViewHolder | ||||||
| import eu.kanade.tachiyomi.source.model.Filter | 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 |         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) |         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 |         val view = holder.itemView as TextView | ||||||
|         view.text = filter.name |         view.text = filter.name | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -4,8 +4,10 @@ import android.view.View | |||||||
| import android.widget.ArrayAdapter | import android.widget.ArrayAdapter | ||||||
| import android.widget.Spinner | import android.widget.Spinner | ||||||
| import android.widget.TextView | import android.widget.TextView | ||||||
|  | import androidx.recyclerview.widget.RecyclerView | ||||||
| import eu.davidea.flexibleadapter.FlexibleAdapter | import eu.davidea.flexibleadapter.FlexibleAdapter | ||||||
| import eu.davidea.flexibleadapter.items.AbstractFlexibleItem | import eu.davidea.flexibleadapter.items.AbstractFlexibleItem | ||||||
|  | import eu.davidea.flexibleadapter.items.IFlexible | ||||||
| import eu.davidea.viewholders.FlexibleViewHolder | import eu.davidea.viewholders.FlexibleViewHolder | ||||||
| import eu.kanade.tachiyomi.R | import eu.kanade.tachiyomi.R | ||||||
| import eu.kanade.tachiyomi.source.model.Filter | 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 |         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) |         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 + ": " |         holder.text.text = filter.name + ": " | ||||||
| 
 | 
 | ||||||
|         val spinner = holder.spinner |         val spinner = holder.spinner | ||||||
|  | |||||||
| @ -1,10 +1,12 @@ | |||||||
| package eu.kanade.tachiyomi.ui.catalogue.filter | package eu.kanade.tachiyomi.ui.catalogue.filter | ||||||
| 
 | 
 | ||||||
| import android.annotation.SuppressLint | import android.annotation.SuppressLint | ||||||
| import android.support.design.R | import com.google.android.material.R | ||||||
| import android.view.View | import android.view.View | ||||||
|  | import androidx.recyclerview.widget.RecyclerView | ||||||
| import eu.davidea.flexibleadapter.FlexibleAdapter | import eu.davidea.flexibleadapter.FlexibleAdapter | ||||||
| import eu.davidea.flexibleadapter.items.AbstractHeaderItem | import eu.davidea.flexibleadapter.items.AbstractHeaderItem | ||||||
|  | import eu.davidea.flexibleadapter.items.IFlexible | ||||||
| import eu.davidea.viewholders.FlexibleViewHolder | import eu.davidea.viewholders.FlexibleViewHolder | ||||||
| import eu.kanade.tachiyomi.source.model.Filter | 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 |         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) |         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?>?) { | ||||||
| 
 | 
 | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,8 +1,10 @@ | |||||||
| package eu.kanade.tachiyomi.ui.catalogue.filter | package eu.kanade.tachiyomi.ui.catalogue.filter | ||||||
| 
 | 
 | ||||||
| import android.view.View | import android.view.View | ||||||
|  | import androidx.recyclerview.widget.RecyclerView | ||||||
| import eu.davidea.flexibleadapter.FlexibleAdapter | import eu.davidea.flexibleadapter.FlexibleAdapter | ||||||
| import eu.davidea.flexibleadapter.items.AbstractExpandableHeaderItem | import eu.davidea.flexibleadapter.items.AbstractExpandableHeaderItem | ||||||
|  | import eu.davidea.flexibleadapter.items.IFlexible | ||||||
| import eu.davidea.flexibleadapter.items.ISectionable | import eu.davidea.flexibleadapter.items.ISectionable | ||||||
| import eu.kanade.tachiyomi.R | import eu.kanade.tachiyomi.R | ||||||
| import eu.kanade.tachiyomi.source.model.Filter | import eu.kanade.tachiyomi.source.model.Filter | ||||||
| @ -22,11 +24,11 @@ class SortGroup(val filter: Filter.Sort) : AbstractExpandableHeaderItem<SortGrou | |||||||
|         return 100 |         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) |         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.title.text = filter.name | ||||||
| 
 | 
 | ||||||
|         holder.icon.setVectorCompat(if (isExpanded) |         holder.icon.setVectorCompat(if (isExpanded) | ||||||
|  | |||||||
| @ -1,11 +1,13 @@ | |||||||
| package eu.kanade.tachiyomi.ui.catalogue.filter | package eu.kanade.tachiyomi.ui.catalogue.filter | ||||||
| 
 | 
 | ||||||
| import android.support.graphics.drawable.VectorDrawableCompat | import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat | ||||||
| import android.support.v4.content.ContextCompat | import androidx.core.content.ContextCompat | ||||||
| import android.view.View | import android.view.View | ||||||
| import android.widget.CheckedTextView | import android.widget.CheckedTextView | ||||||
|  | import androidx.recyclerview.widget.RecyclerView | ||||||
| import eu.davidea.flexibleadapter.FlexibleAdapter | import eu.davidea.flexibleadapter.FlexibleAdapter | ||||||
| import eu.davidea.flexibleadapter.items.AbstractSectionableItem | import eu.davidea.flexibleadapter.items.AbstractSectionableItem | ||||||
|  | import eu.davidea.flexibleadapter.items.IFlexible | ||||||
| import eu.davidea.viewholders.FlexibleViewHolder | import eu.davidea.viewholders.FlexibleViewHolder | ||||||
| import eu.kanade.tachiyomi.R | import eu.kanade.tachiyomi.R | ||||||
| import eu.kanade.tachiyomi.source.model.Filter | import eu.kanade.tachiyomi.source.model.Filter | ||||||
| @ -21,11 +23,11 @@ class SortItem(val name: String, val group: SortGroup) : AbstractSectionableItem | |||||||
|         return 102 |         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) |         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 |         val view = holder.text | ||||||
|         view.text = name |         view.text = name | ||||||
|         val filter = group.filter |         val filter = group.filter | ||||||
|  | |||||||
| @ -1,10 +1,12 @@ | |||||||
| package eu.kanade.tachiyomi.ui.catalogue.filter | 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.view.View | ||||||
| import android.widget.EditText | import android.widget.EditText | ||||||
|  | import androidx.recyclerview.widget.RecyclerView | ||||||
| import eu.davidea.flexibleadapter.FlexibleAdapter | import eu.davidea.flexibleadapter.FlexibleAdapter | ||||||
| import eu.davidea.flexibleadapter.items.AbstractFlexibleItem | import eu.davidea.flexibleadapter.items.AbstractFlexibleItem | ||||||
|  | import eu.davidea.flexibleadapter.items.IFlexible | ||||||
| import eu.davidea.viewholders.FlexibleViewHolder | import eu.davidea.viewholders.FlexibleViewHolder | ||||||
| import eu.kanade.tachiyomi.R | import eu.kanade.tachiyomi.R | ||||||
| import eu.kanade.tachiyomi.source.model.Filter | 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 |         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) |         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.wrapper.hint = filter.name | ||||||
|         holder.edit.setText(filter.state) |         holder.edit.setText(filter.state) | ||||||
|         holder.edit.addTextChangedListener(object : SimpleTextWatcher() { |         holder.edit.addTextChangedListener(object : SimpleTextWatcher() { | ||||||
|  | |||||||
| @ -1,11 +1,13 @@ | |||||||
| package eu.kanade.tachiyomi.ui.catalogue.filter | package eu.kanade.tachiyomi.ui.catalogue.filter | ||||||
| 
 | 
 | ||||||
| import android.support.design.R | import com.google.android.material.R | ||||||
| import android.support.graphics.drawable.VectorDrawableCompat | import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat | ||||||
| import android.view.View | import android.view.View | ||||||
| import android.widget.CheckedTextView | import android.widget.CheckedTextView | ||||||
|  | import androidx.recyclerview.widget.RecyclerView | ||||||
| import eu.davidea.flexibleadapter.FlexibleAdapter | import eu.davidea.flexibleadapter.FlexibleAdapter | ||||||
| import eu.davidea.flexibleadapter.items.AbstractFlexibleItem | import eu.davidea.flexibleadapter.items.AbstractFlexibleItem | ||||||
|  | import eu.davidea.flexibleadapter.items.IFlexible | ||||||
| import eu.davidea.viewholders.FlexibleViewHolder | import eu.davidea.viewholders.FlexibleViewHolder | ||||||
| import eu.kanade.tachiyomi.source.model.Filter | import eu.kanade.tachiyomi.source.model.Filter | ||||||
| import eu.kanade.tachiyomi.util.dpToPx | import eu.kanade.tachiyomi.util.dpToPx | ||||||
| @ -22,11 +24,11 @@ open class TriStateItem(val filter: Filter.TriState) : AbstractFlexibleItem<TriS | |||||||
|         return 103 |         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) |         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 |         val view = holder.text | ||||||
|         view.text = filter.name |         view.text = filter.name | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -2,7 +2,7 @@ package eu.kanade.tachiyomi.ui.catalogue.global_search | |||||||
| 
 | 
 | ||||||
| import android.os.Bundle | import android.os.Bundle | ||||||
| import android.os.Parcelable | import android.os.Parcelable | ||||||
| import android.support.v7.widget.RecyclerView | import androidx.recyclerview.widget.RecyclerView | ||||||
| import android.util.SparseArray | import android.util.SparseArray | ||||||
| import eu.davidea.flexibleadapter.FlexibleAdapter | import eu.davidea.flexibleadapter.FlexibleAdapter | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,8 +1,10 @@ | |||||||
| package eu.kanade.tachiyomi.ui.catalogue.global_search | package eu.kanade.tachiyomi.ui.catalogue.global_search | ||||||
| 
 | 
 | ||||||
| import android.view.View | import android.view.View | ||||||
|  | import androidx.recyclerview.widget.RecyclerView | ||||||
| import eu.davidea.flexibleadapter.FlexibleAdapter | import eu.davidea.flexibleadapter.FlexibleAdapter | ||||||
| import eu.davidea.flexibleadapter.items.AbstractFlexibleItem | import eu.davidea.flexibleadapter.items.AbstractFlexibleItem | ||||||
|  | import eu.davidea.flexibleadapter.items.IFlexible | ||||||
| import eu.kanade.tachiyomi.R | import eu.kanade.tachiyomi.R | ||||||
| import eu.kanade.tachiyomi.data.database.models.Manga | 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 |         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) |         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?>?) { |                                 position: Int, payloads: List<Any?>?) { | ||||||
|         holder.bind(manga) |         holder.bind(manga) | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -1,8 +1,8 @@ | |||||||
| package eu.kanade.tachiyomi.ui.catalogue.global_search | package eu.kanade.tachiyomi.ui.catalogue.global_search | ||||||
| 
 | 
 | ||||||
| import android.os.Bundle | import android.os.Bundle | ||||||
| import android.support.v7.widget.LinearLayoutManager | import androidx.recyclerview.widget.LinearLayoutManager | ||||||
| import android.support.v7.widget.SearchView | import androidx.appcompat.widget.SearchView | ||||||
| import android.view.* | import android.view.* | ||||||
| import com.jakewharton.rxbinding.support.v7.widget.queryTextChangeEvents | import com.jakewharton.rxbinding.support.v7.widget.queryTextChangeEvents | ||||||
| import eu.kanade.tachiyomi.R | import eu.kanade.tachiyomi.R | ||||||
|  | |||||||
| @ -1,6 +1,6 @@ | |||||||
| package eu.kanade.tachiyomi.ui.catalogue.global_search | package eu.kanade.tachiyomi.ui.catalogue.global_search | ||||||
| 
 | 
 | ||||||
| import android.support.v7.widget.LinearLayoutManager | import androidx.recyclerview.widget.LinearLayoutManager | ||||||
| import android.view.View | import android.view.View | ||||||
| import eu.kanade.tachiyomi.R | import eu.kanade.tachiyomi.R | ||||||
| import eu.kanade.tachiyomi.data.database.models.Manga | import eu.kanade.tachiyomi.data.database.models.Manga | ||||||
|  | |||||||
| @ -1,8 +1,10 @@ | |||||||
| package eu.kanade.tachiyomi.ui.catalogue.global_search | package eu.kanade.tachiyomi.ui.catalogue.global_search | ||||||
| 
 | 
 | ||||||
| import android.view.View | import android.view.View | ||||||
|  | import androidx.recyclerview.widget.RecyclerView | ||||||
| import eu.davidea.flexibleadapter.FlexibleAdapter | import eu.davidea.flexibleadapter.FlexibleAdapter | ||||||
| import eu.davidea.flexibleadapter.items.AbstractFlexibleItem | import eu.davidea.flexibleadapter.items.AbstractFlexibleItem | ||||||
|  | import eu.davidea.flexibleadapter.items.IFlexible | ||||||
| import eu.kanade.tachiyomi.R | import eu.kanade.tachiyomi.R | ||||||
| import eu.kanade.tachiyomi.source.CatalogueSource | import eu.kanade.tachiyomi.source.CatalogueSource | ||||||
| 
 | 
 | ||||||
| @ -30,14 +32,14 @@ class CatalogueSearchItem(val source: CatalogueSource, val results: List<Catalog | |||||||
|      * |      * | ||||||
|      * @return holder of view. |      * @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) |         return CatalogueSearchHolder(view, adapter as CatalogueSearchAdapter) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|      * Bind item to view. |      * 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?>?) { |                                 position: Int, payloads: List<Any?>?) { | ||||||
|         holder.bind(this) |         holder.bind(this) | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| package eu.kanade.tachiyomi.ui.catalogue.latest | package eu.kanade.tachiyomi.ui.catalogue.latest | ||||||
| 
 | 
 | ||||||
| import android.os.Bundle | import android.os.Bundle | ||||||
| import android.support.v4.widget.DrawerLayout | import androidx.drawerlayout.widget.DrawerLayout | ||||||
| import android.view.Menu | import android.view.Menu | ||||||
| import android.view.ViewGroup | import android.view.ViewGroup | ||||||
| import eu.kanade.tachiyomi.R | import eu.kanade.tachiyomi.R | ||||||
|  | |||||||
| @ -1,10 +1,10 @@ | |||||||
| package eu.kanade.tachiyomi.ui.category | package eu.kanade.tachiyomi.ui.category | ||||||
| 
 | 
 | ||||||
| import android.support.design.widget.Snackbar | import com.google.android.material.snackbar.Snackbar | ||||||
| import android.support.v7.app.AppCompatActivity | import androidx.appcompat.app.AppCompatActivity | ||||||
| import android.support.v7.view.ActionMode | import androidx.appcompat.view.ActionMode | ||||||
| import android.support.v7.widget.LinearLayoutManager | import androidx.recyclerview.widget.LinearLayoutManager | ||||||
| import android.support.v7.widget.RecyclerView | import androidx.recyclerview.widget.RecyclerView | ||||||
| import android.view.* | import android.view.* | ||||||
| import com.jakewharton.rxbinding.view.clicks | import com.jakewharton.rxbinding.view.clicks | ||||||
| import eu.davidea.flexibleadapter.FlexibleAdapter | import eu.davidea.flexibleadapter.FlexibleAdapter | ||||||
| @ -205,7 +205,7 @@ class CategoryController : NucleusController<CategoryPresenter>(), | |||||||
|      * @param position The position of the clicked item. |      * @param position The position of the clicked item. | ||||||
|      * @return true if this click should enable selection mode. |      * @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. |         // Check if action mode is initialized and selected item exist. | ||||||
|         if (actionMode != null && position != RecyclerView.NO_POSITION) { |         if (actionMode != null && position != RecyclerView.NO_POSITION) { | ||||||
|             toggleSelection(position) |             toggleSelection(position) | ||||||
|  | |||||||
| @ -1,8 +1,10 @@ | |||||||
| package eu.kanade.tachiyomi.ui.category | package eu.kanade.tachiyomi.ui.category | ||||||
| 
 | 
 | ||||||
| import android.view.View | import android.view.View | ||||||
|  | import androidx.recyclerview.widget.RecyclerView | ||||||
| import eu.davidea.flexibleadapter.FlexibleAdapter | import eu.davidea.flexibleadapter.FlexibleAdapter | ||||||
| import eu.davidea.flexibleadapter.items.AbstractFlexibleItem | import eu.davidea.flexibleadapter.items.AbstractFlexibleItem | ||||||
|  | import eu.davidea.flexibleadapter.items.IFlexible | ||||||
| import eu.kanade.tachiyomi.R | import eu.kanade.tachiyomi.R | ||||||
| import eu.kanade.tachiyomi.data.database.models.Category | 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 view The view of this item. | ||||||
|      * @param adapter The adapter 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) |         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 position The position of this item in the adapter. | ||||||
|      * @param payloads List of partial changes. |      * @param payloads List of partial changes. | ||||||
|      */ |      */ | ||||||
|     override fun bindViewHolder(adapter: FlexibleAdapter<*>, |     override fun bindViewHolder(adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>, | ||||||
|                                 holder: CategoryHolder, |                                 holder: CategoryHolder, | ||||||
|                                 position: Int, |                                 position: Int, | ||||||
|                                 payloads: List<Any?>?) { |                                 payloads: List<Any?>?) { | ||||||
|  | |||||||
| @ -1,6 +1,6 @@ | |||||||
| package eu.kanade.tachiyomi.ui.download | package eu.kanade.tachiyomi.ui.download | ||||||
| 
 | 
 | ||||||
| import android.support.v7.widget.RecyclerView | import androidx.recyclerview.widget.RecyclerView | ||||||
| import android.view.ViewGroup | import android.view.ViewGroup | ||||||
| import eu.kanade.tachiyomi.R | import eu.kanade.tachiyomi.R | ||||||
| import eu.kanade.tachiyomi.data.download.model.Download | import eu.kanade.tachiyomi.data.download.model.Download | ||||||
|  | |||||||
| @ -1,6 +1,6 @@ | |||||||
| package eu.kanade.tachiyomi.ui.download | package eu.kanade.tachiyomi.ui.download | ||||||
| 
 | 
 | ||||||
| import android.support.v7.widget.LinearLayoutManager | import androidx.recyclerview.widget.LinearLayoutManager | ||||||
| import android.view.* | import android.view.* | ||||||
| import eu.kanade.tachiyomi.R | import eu.kanade.tachiyomi.R | ||||||
| import eu.kanade.tachiyomi.data.download.DownloadService | import eu.kanade.tachiyomi.data.download.DownloadService | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| package eu.kanade.tachiyomi.ui.extension | package eu.kanade.tachiyomi.ui.extension | ||||||
| 
 | 
 | ||||||
| import android.support.v7.widget.LinearLayoutManager | import androidx.recyclerview.widget.LinearLayoutManager | ||||||
| import android.support.v7.widget.SearchView | import androidx.appcompat.widget.SearchView | ||||||
| import android.view.LayoutInflater | import android.view.LayoutInflater | ||||||
| import android.view.Menu | import android.view.Menu | ||||||
| import android.view.MenuInflater | import android.view.MenuInflater | ||||||
| @ -116,7 +116,7 @@ open class ExtensionController : NucleusController<ExtensionPresenter>(), | |||||||
|         searchItem.fixExpand() |         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 |         val extension = (adapter?.getItem(position) as? ExtensionItem)?.extension ?: return false | ||||||
|         if (extension is Extension.Installed) { |         if (extension is Extension.Installed) { | ||||||
|             openDetails(extension) |             openDetails(extension) | ||||||
|  | |||||||
| @ -3,11 +3,10 @@ package eu.kanade.tachiyomi.ui.extension | |||||||
| import android.annotation.SuppressLint | import android.annotation.SuppressLint | ||||||
| import android.content.Context | import android.content.Context | ||||||
| import android.os.Bundle | import android.os.Bundle | ||||||
| import android.support.v7.preference.* | import androidx.preference.* | ||||||
| import android.support.v7.preference.internal.AbstractMultiSelectListPreference | import androidx.recyclerview.widget.DividerItemDecoration | ||||||
| import android.support.v7.widget.DividerItemDecoration | import androidx.recyclerview.widget.DividerItemDecoration.VERTICAL | ||||||
| import android.support.v7.widget.DividerItemDecoration.VERTICAL | import androidx.recyclerview.widget.LinearLayoutManager | ||||||
| import android.support.v7.widget.LinearLayoutManager |  | ||||||
| import android.util.TypedValue | import android.util.TypedValue | ||||||
| import android.view.ContextThemeWrapper | import android.view.ContextThemeWrapper | ||||||
| import android.view.LayoutInflater | import android.view.LayoutInflater | ||||||
| @ -74,7 +73,7 @@ class ExtensionDetailsController(bundle: Bundle? = null) : | |||||||
|         val manager = PreferenceManager(themedContext) |         val manager = PreferenceManager(themedContext) | ||||||
|         manager.preferenceDataStore = EmptyPreferenceDataStore() |         manager.preferenceDataStore = EmptyPreferenceDataStore() | ||||||
|         manager.onDisplayPreferenceDialogListener = this |         manager.onDisplayPreferenceDialogListener = this | ||||||
|         val screen = manager.createPreferenceScreen(themedContext) |         val screen = manager.createPreferenceScreen(context) | ||||||
|         preferenceScreen = screen |         preferenceScreen = screen | ||||||
| 
 | 
 | ||||||
|         val multiSource = extension.sources.size > 1 |         val multiSource = extension.sources.size > 1 | ||||||
| @ -136,10 +135,13 @@ class ExtensionDetailsController(bundle: Bundle? = null) : | |||||||
|             val newScreen = screen.preferenceManager.createPreferenceScreen(context) |             val newScreen = screen.preferenceManager.createPreferenceScreen(context) | ||||||
|             source.setupPreferenceScreen(newScreen) |             source.setupPreferenceScreen(newScreen) | ||||||
| 
 | 
 | ||||||
|             for (i in 0 until newScreen.preferenceCount) { |             // Reparent the preferences | ||||||
|                 val pref = newScreen.getPreference(i) |             while (newScreen.preferenceCount != 0) { | ||||||
|  |                 val pref = newScreen.getPreference(0) | ||||||
|                 pref.preferenceDataStore = dataStore |                 pref.preferenceDataStore = dataStore | ||||||
|                 pref.order = Int.MAX_VALUE // reset to default order |                 pref.order = Int.MAX_VALUE // reset to default order | ||||||
|  | 
 | ||||||
|  |                 newScreen.removePreference(pref) | ||||||
|                 screen.addPreference(pref) |                 screen.addPreference(pref) | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| @ -165,7 +167,7 @@ class ExtensionDetailsController(bundle: Bundle? = null) : | |||||||
|                     .newInstance(preference.getKey()) |                     .newInstance(preference.getKey()) | ||||||
|             is ListPreference -> ListPreferenceDialogController |             is ListPreference -> ListPreferenceDialogController | ||||||
|                     .newInstance(preference.getKey()) |                     .newInstance(preference.getKey()) | ||||||
|             is AbstractMultiSelectListPreference -> MultiSelectListPreferenceDialogController |             is MultiSelectListPreference -> MultiSelectListPreferenceDialogController | ||||||
|                     .newInstance(preference.getKey()) |                     .newInstance(preference.getKey()) | ||||||
|             else -> throw IllegalArgumentException("Tried to display dialog for unknown " + |             else -> throw IllegalArgumentException("Tried to display dialog for unknown " + | ||||||
|                     "preference type. Did you forget to override onDisplayPreferenceDialog()?") |                     "preference type. Did you forget to override onDisplayPreferenceDialog()?") | ||||||
| @ -174,8 +176,8 @@ class ExtensionDetailsController(bundle: Bundle? = null) : | |||||||
|         f.showDialog(router) |         f.showDialog(router) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     override fun findPreference(key: CharSequence?): Preference { |     override fun <T : Preference> findPreference(key: CharSequence): T? { | ||||||
|         return preferenceScreen!!.getPreference(lastOpenPreferencePosition!!) |         return preferenceScreen!!.findPreference(key) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     override fun loginDialogClosed(source: LoginSource) { |     override fun loginDialogClosed(source: LoginSource) { | ||||||
|  | |||||||
| @ -4,7 +4,7 @@ import android.content.Context | |||||||
| import android.graphics.Canvas | import android.graphics.Canvas | ||||||
| import android.graphics.Rect | import android.graphics.Rect | ||||||
| import android.graphics.drawable.Drawable | import android.graphics.drawable.Drawable | ||||||
| import android.support.v7.widget.RecyclerView | import androidx.recyclerview.widget.RecyclerView | ||||||
| import android.view.View | import android.view.View | ||||||
| 
 | 
 | ||||||
| class ExtensionDividerItemDecoration(context: Context) : RecyclerView.ItemDecoration() { | class ExtensionDividerItemDecoration(context: Context) : RecyclerView.ItemDecoration() { | ||||||
|  | |||||||
| @ -1,8 +1,10 @@ | |||||||
| package eu.kanade.tachiyomi.ui.extension | package eu.kanade.tachiyomi.ui.extension | ||||||
| 
 | 
 | ||||||
| import android.view.View | import android.view.View | ||||||
|  | import androidx.recyclerview.widget.RecyclerView | ||||||
| import eu.davidea.flexibleadapter.FlexibleAdapter | import eu.davidea.flexibleadapter.FlexibleAdapter | ||||||
| import eu.davidea.flexibleadapter.items.AbstractHeaderItem | import eu.davidea.flexibleadapter.items.AbstractHeaderItem | ||||||
|  | import eu.davidea.flexibleadapter.items.IFlexible | ||||||
| import eu.kanade.tachiyomi.R | 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. |      * 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) |         return ExtensionGroupHolder(view, adapter) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|      * Binds this item to the given view holder. |      * 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?>?) { |                                 position: Int, payloads: List<Any?>?) { | ||||||
| 
 | 
 | ||||||
|         holder.bind(this) |         holder.bind(this) | ||||||
|  | |||||||
| @ -1,8 +1,10 @@ | |||||||
| package eu.kanade.tachiyomi.ui.extension | package eu.kanade.tachiyomi.ui.extension | ||||||
| 
 | 
 | ||||||
| import android.view.View | import android.view.View | ||||||
|  | import androidx.recyclerview.widget.RecyclerView | ||||||
| import eu.davidea.flexibleadapter.FlexibleAdapter | import eu.davidea.flexibleadapter.FlexibleAdapter | ||||||
| import eu.davidea.flexibleadapter.items.AbstractSectionableItem | import eu.davidea.flexibleadapter.items.AbstractSectionableItem | ||||||
|  | import eu.davidea.flexibleadapter.items.IFlexible | ||||||
| import eu.kanade.tachiyomi.R | import eu.kanade.tachiyomi.R | ||||||
| import eu.kanade.tachiyomi.extension.model.Extension | import eu.kanade.tachiyomi.extension.model.Extension | ||||||
| import eu.kanade.tachiyomi.extension.model.InstallStep | 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. |      * 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) |         return ExtensionHolder(view, adapter as ExtensionAdapter) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|      * Binds this item to the given view holder. |      * 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?>?) { |                                 position: Int, payloads: List<Any?>?) { | ||||||
| 
 | 
 | ||||||
|         if (payloads == null || payloads.isEmpty()) { |         if (payloads == null || payloads.isEmpty()) { | ||||||
|  | |||||||
| @ -38,7 +38,11 @@ class LibraryCategoryAdapter(view: LibraryCategoryView) : | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fun performFilter() { |     fun performFilter() { | ||||||
|         updateDataSet(mangas.filter { it.filter(searchText) }) |         var s = getFilter(String::class.java) | ||||||
|  |         if (s == null) { | ||||||
|  |             s = "" | ||||||
|  |         } | ||||||
|  |         updateDataSet(mangas.filter { it.filter(s) }) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
|  | |||||||
| @ -1,9 +1,10 @@ | |||||||
| package eu.kanade.tachiyomi.ui.library | package eu.kanade.tachiyomi.ui.library | ||||||
| 
 | 
 | ||||||
| import android.content.Context | import android.content.Context | ||||||
| import android.support.v7.widget.LinearLayoutManager | import androidx.recyclerview.widget.LinearLayoutManager | ||||||
| import android.support.v7.widget.RecyclerView | import androidx.recyclerview.widget.RecyclerView | ||||||
| import android.util.AttributeSet | import android.util.AttributeSet | ||||||
|  | import android.view.View | ||||||
| import android.widget.FrameLayout | import android.widget.FrameLayout | ||||||
| import eu.davidea.flexibleadapter.FlexibleAdapter | import eu.davidea.flexibleadapter.FlexibleAdapter | ||||||
| import eu.davidea.flexibleadapter.SelectableAdapter | import eu.davidea.flexibleadapter.SelectableAdapter | ||||||
| @ -110,7 +111,7 @@ class LibraryCategoryView @JvmOverloads constructor(context: Context, attrs: Att | |||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         subscriptions += controller.searchRelay |         subscriptions += controller.searchRelay | ||||||
|                 .doOnNext { adapter.searchText = it } |                 .doOnNext { adapter.setFilter(it) } | ||||||
|                 .skip(1) |                 .skip(1) | ||||||
|                 .subscribe { adapter.performFilter() } |                 .subscribe { adapter.performFilter() } | ||||||
| 
 | 
 | ||||||
| @ -201,7 +202,7 @@ class LibraryCategoryView @JvmOverloads constructor(context: Context, attrs: Att | |||||||
|      * @param position the position of the element clicked. |      * @param position the position of the element clicked. | ||||||
|      * @return true if the item should be selected, false otherwise. |      * @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. |         // If the action mode is created and the position is valid, toggle the selection. | ||||||
|         val item = adapter.getItem(position) ?: return false |         val item = adapter.getItem(position) ?: return false | ||||||
|         if (adapter.mode == SelectableAdapter.Mode.MULTI) { |         if (adapter.mode == SelectableAdapter.Mode.MULTI) { | ||||||
|  | |||||||
| @ -5,13 +5,14 @@ import android.content.Intent | |||||||
| import android.content.res.Configuration | import android.content.res.Configuration | ||||||
| import android.graphics.Color | import android.graphics.Color | ||||||
| import android.os.Bundle | import android.os.Bundle | ||||||
| import android.support.design.widget.TabLayout | import com.google.android.material.tabs.TabLayout | ||||||
| import android.support.v4.graphics.drawable.DrawableCompat | import androidx.core.graphics.drawable.DrawableCompat | ||||||
| import android.support.v4.widget.DrawerLayout | import androidx.drawerlayout.widget.DrawerLayout | ||||||
| import android.support.v7.app.AppCompatActivity | import androidx.appcompat.app.AppCompatActivity | ||||||
| import android.support.v7.view.ActionMode | import androidx.appcompat.view.ActionMode | ||||||
| import android.support.v7.widget.SearchView | import androidx.appcompat.widget.SearchView | ||||||
| import android.view.* | import android.view.* | ||||||
|  | import androidx.core.view.GravityCompat | ||||||
| import com.bluelinelabs.conductor.ControllerChangeHandler | import com.bluelinelabs.conductor.ControllerChangeHandler | ||||||
| import com.bluelinelabs.conductor.ControllerChangeType | import com.bluelinelabs.conductor.ControllerChangeType | ||||||
| import com.f2prateek.rx.preferences.Preference | import com.f2prateek.rx.preferences.Preference | ||||||
| @ -353,7 +354,7 @@ class LibraryController( | |||||||
|     override fun onOptionsItemSelected(item: MenuItem): Boolean { |     override fun onOptionsItemSelected(item: MenuItem): Boolean { | ||||||
|         when (item.itemId) { |         when (item.itemId) { | ||||||
|             R.id.action_filter -> { |             R.id.action_filter -> { | ||||||
|                 navView?.let { activity?.drawer?.openDrawer(Gravity.END) } |                 navView?.let { activity?.drawer?.openDrawer(GravityCompat.END) } | ||||||
|             } |             } | ||||||
|             R.id.action_update_library -> { |             R.id.action_update_library -> { | ||||||
|                 activity?.let { LibraryUpdateService.start(it) } |                 activity?.let { LibraryUpdateService.start(it) } | ||||||
|  | |||||||
| @ -4,10 +4,12 @@ import android.view.Gravity | |||||||
| import android.view.View | import android.view.View | ||||||
| import android.view.ViewGroup.LayoutParams.MATCH_PARENT | import android.view.ViewGroup.LayoutParams.MATCH_PARENT | ||||||
| import android.widget.FrameLayout | import android.widget.FrameLayout | ||||||
|  | import androidx.recyclerview.widget.RecyclerView | ||||||
| import com.f2prateek.rx.preferences.Preference | import com.f2prateek.rx.preferences.Preference | ||||||
| import eu.davidea.flexibleadapter.FlexibleAdapter | import eu.davidea.flexibleadapter.FlexibleAdapter | ||||||
| import eu.davidea.flexibleadapter.items.AbstractFlexibleItem | import eu.davidea.flexibleadapter.items.AbstractFlexibleItem | ||||||
| import eu.davidea.flexibleadapter.items.IFilterable | import eu.davidea.flexibleadapter.items.IFilterable | ||||||
|  | import eu.davidea.flexibleadapter.items.IFlexible | ||||||
| import eu.kanade.tachiyomi.R | import eu.kanade.tachiyomi.R | ||||||
| import eu.kanade.tachiyomi.data.database.models.LibraryManga | import eu.kanade.tachiyomi.data.database.models.LibraryManga | ||||||
| import eu.kanade.tachiyomi.data.preference.getOrDefault | 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.* | import kotlinx.android.synthetic.main.catalogue_grid_item.view.* | ||||||
| 
 | 
 | ||||||
| class LibraryItem(val manga: LibraryManga, private val libraryAsList: Preference<Boolean>) : | class LibraryItem(val manga: LibraryManga, private val libraryAsList: Preference<Boolean>) : | ||||||
|         AbstractFlexibleItem<LibraryHolder>(), IFilterable { |         AbstractFlexibleItem<LibraryHolder>(), IFilterable<String> { | ||||||
| 
 | 
 | ||||||
|     var downloadCount = -1 |     var downloadCount = -1 | ||||||
| 
 | 
 | ||||||
| @ -26,7 +28,7 @@ class LibraryItem(val manga: LibraryManga, private val libraryAsList: Preference | |||||||
|             R.layout.catalogue_grid_item |             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 |         val parent = adapter.recyclerView | ||||||
|         return if (parent is AutofitRecyclerView) { |         return if (parent is AutofitRecyclerView) { | ||||||
|             view.apply { |             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, |                                 holder: LibraryHolder, | ||||||
|                                 position: Int, |                                 position: Int, | ||||||
|                                 payloads: List<Any?>?) { |                                 payloads: List<Any?>?) { | ||||||
|  | |||||||
| @ -5,9 +5,9 @@ import android.app.SearchManager | |||||||
| import android.content.Intent | import android.content.Intent | ||||||
| import android.graphics.Color | import android.graphics.Color | ||||||
| import android.os.Bundle | import android.os.Bundle | ||||||
| import android.support.v4.view.GravityCompat | import androidx.core.view.GravityCompat | ||||||
| import android.support.v4.widget.DrawerLayout | import androidx.drawerlayout.widget.DrawerLayout | ||||||
| import android.support.v7.graphics.drawable.DrawerArrowDrawable | import androidx.appcompat.graphics.drawable.DrawerArrowDrawable | ||||||
| import android.view.ViewGroup | import android.view.ViewGroup | ||||||
| import com.bluelinelabs.conductor.* | import com.bluelinelabs.conductor.* | ||||||
| import eu.kanade.tachiyomi.Migrations | import eu.kanade.tachiyomi.Migrations | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| package eu.kanade.tachiyomi.ui.main | package eu.kanade.tachiyomi.ui.main | ||||||
| 
 | 
 | ||||||
| import android.animation.ObjectAnimator | import android.animation.ObjectAnimator | ||||||
| import android.support.design.widget.TabLayout | import com.google.android.material.tabs.TabLayout | ||||||
| import android.view.ViewTreeObserver | import android.view.ViewTreeObserver | ||||||
| import android.view.animation.DecelerateInterpolator | import android.view.animation.DecelerateInterpolator | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -2,8 +2,8 @@ package eu.kanade.tachiyomi.ui.manga | |||||||
| 
 | 
 | ||||||
| import android.Manifest.permission.WRITE_EXTERNAL_STORAGE | import android.Manifest.permission.WRITE_EXTERNAL_STORAGE | ||||||
| import android.os.Bundle | import android.os.Bundle | ||||||
| import android.support.design.widget.TabLayout | import com.google.android.material.tabs.TabLayout | ||||||
| import android.support.graphics.drawable.VectorDrawableCompat | import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat | ||||||
| import android.view.LayoutInflater | import android.view.LayoutInflater | ||||||
| import android.view.View | import android.view.View | ||||||
| import android.view.ViewGroup | import android.view.ViewGroup | ||||||
|  | |||||||
| @ -1,8 +1,10 @@ | |||||||
| package eu.kanade.tachiyomi.ui.manga.chapter | package eu.kanade.tachiyomi.ui.manga.chapter | ||||||
| 
 | 
 | ||||||
| import android.view.View | import android.view.View | ||||||
|  | import androidx.recyclerview.widget.RecyclerView | ||||||
| import eu.davidea.flexibleadapter.FlexibleAdapter | import eu.davidea.flexibleadapter.FlexibleAdapter | ||||||
| import eu.davidea.flexibleadapter.items.AbstractFlexibleItem | import eu.davidea.flexibleadapter.items.AbstractFlexibleItem | ||||||
|  | import eu.davidea.flexibleadapter.items.IFlexible | ||||||
| import eu.kanade.tachiyomi.R | import eu.kanade.tachiyomi.R | ||||||
| import eu.kanade.tachiyomi.data.database.models.Chapter | import eu.kanade.tachiyomi.data.database.models.Chapter | ||||||
| import eu.kanade.tachiyomi.data.database.models.Manga | 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 |         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) |         return ChapterHolder(view, adapter as ChaptersAdapter) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     override fun bindViewHolder(adapter: FlexibleAdapter<*>, |     override fun bindViewHolder(adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>, | ||||||
|                                 holder: ChapterHolder, |                                 holder: ChapterHolder, | ||||||
|                                 position: Int, |                                 position: Int, | ||||||
|                                 payloads: List<Any?>?) { |                                 payloads: List<Any?>?) { | ||||||
|  | |||||||
| @ -5,11 +5,11 @@ import android.animation.AnimatorListenerAdapter | |||||||
| import android.annotation.SuppressLint | import android.annotation.SuppressLint | ||||||
| import android.app.Activity | import android.app.Activity | ||||||
| import android.content.Intent | import android.content.Intent | ||||||
| import android.support.design.widget.Snackbar | import com.google.android.material.snackbar.Snackbar | ||||||
| import android.support.v7.app.AppCompatActivity | import androidx.appcompat.app.AppCompatActivity | ||||||
| import android.support.v7.view.ActionMode | import androidx.appcompat.view.ActionMode | ||||||
| import android.support.v7.widget.DividerItemDecoration | import androidx.recyclerview.widget.DividerItemDecoration | ||||||
| import android.support.v7.widget.LinearLayoutManager | import androidx.recyclerview.widget.LinearLayoutManager | ||||||
| import android.view.* | import android.view.* | ||||||
| import com.jakewharton.rxbinding.support.v4.widget.refreshes | import com.jakewharton.rxbinding.support.v4.widget.refreshes | ||||||
| import com.jakewharton.rxbinding.view.clicks | import com.jakewharton.rxbinding.view.clicks | ||||||
| @ -242,7 +242,7 @@ class ChaptersController : NucleusController<ChaptersPresenter>(), | |||||||
|         startActivity(intent) |         startActivity(intent) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     override fun onItemClick(position: Int): Boolean { |     override fun onItemClick(view: View, position: Int): Boolean { | ||||||
|         val adapter = adapter ?: return false |         val adapter = adapter ?: return false | ||||||
|         val item = adapter.getItem(position) ?: return false |         val item = adapter.getItem(position) ?: return false | ||||||
|         if (actionMode != null && adapter.mode == SelectableAdapter.Mode.MULTI) { |         if (actionMode != null && adapter.mode == SelectableAdapter.Mode.MULTI) { | ||||||
|  | |||||||
| @ -11,10 +11,10 @@ import android.graphics.drawable.Drawable | |||||||
| import android.net.Uri | import android.net.Uri | ||||||
| import android.os.Build | import android.os.Build | ||||||
| import android.os.Bundle | import android.os.Bundle | ||||||
| import android.support.customtabs.CustomTabsIntent | import androidx.browser.customtabs.CustomTabsIntent | ||||||
| import android.support.v4.content.pm.ShortcutInfoCompat | import androidx.core.content.pm.ShortcutInfoCompat | ||||||
| import android.support.v4.content.pm.ShortcutManagerCompat | import androidx.core.content.pm.ShortcutManagerCompat | ||||||
| import android.support.v4.graphics.drawable.IconCompat | import androidx.core.graphics.drawable.IconCompat | ||||||
| import android.view.* | import android.view.* | ||||||
| import android.widget.Toast | import android.widget.Toast | ||||||
| import com.afollestad.materialdialogs.MaterialDialog | import com.afollestad.materialdialogs.MaterialDialog | ||||||
| @ -291,14 +291,14 @@ class MangaInfoController : NucleusController<MangaInfoPresenter>(), | |||||||
|         val context = view?.context ?: return |         val context = view?.context ?: return | ||||||
|         val source = presenter.source as? HttpSource ?: 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() { |     private fun openInWebView() { | ||||||
|         val source = presenter.source as? HttpSource ?: return |         val source = presenter.source as? HttpSource ?: return | ||||||
| 
 | 
 | ||||||
|         val url = try { |         val url = try { | ||||||
|             source.mangaDetailsRequest(presenter.manga).url().toString() |             source.mangaDetailsRequest(presenter.manga).url.toString() | ||||||
|         } catch (e: Exception) { |         } catch (e: Exception) { | ||||||
|             return |             return | ||||||
|         } |         } | ||||||
| @ -315,7 +315,7 @@ class MangaInfoController : NucleusController<MangaInfoPresenter>(), | |||||||
| 
 | 
 | ||||||
|         val source = presenter.source as? HttpSource ?: return |         val source = presenter.source as? HttpSource ?: return | ||||||
|         try { |         try { | ||||||
|             val url = source.mangaDetailsRequest(presenter.manga).url().toString() |             val url = source.mangaDetailsRequest(presenter.manga).url.toString() | ||||||
|             val intent = Intent(Intent.ACTION_SEND).apply { |             val intent = Intent(Intent.ACTION_SEND).apply { | ||||||
|                 type = "text/plain" |                 type = "text/plain" | ||||||
|                 putExtra(Intent.EXTRA_TEXT, url) |                 putExtra(Intent.EXTRA_TEXT, url) | ||||||
|  | |||||||
| @ -1,6 +1,6 @@ | |||||||
| package eu.kanade.tachiyomi.ui.manga.track | package eu.kanade.tachiyomi.ui.manga.track | ||||||
| 
 | 
 | ||||||
| import android.support.v7.widget.RecyclerView | import androidx.recyclerview.widget.RecyclerView | ||||||
| import android.view.ViewGroup | import android.view.ViewGroup | ||||||
| import eu.kanade.tachiyomi.R | import eu.kanade.tachiyomi.R | ||||||
| import eu.kanade.tachiyomi.util.inflate | import eu.kanade.tachiyomi.util.inflate | ||||||
|  | |||||||
| @ -2,7 +2,7 @@ package eu.kanade.tachiyomi.ui.manga.track | |||||||
| 
 | 
 | ||||||
| import android.content.Intent | import android.content.Intent | ||||||
| import android.net.Uri | import android.net.Uri | ||||||
| import android.support.v7.widget.LinearLayoutManager | import androidx.recyclerview.widget.LinearLayoutManager | ||||||
| import android.view.LayoutInflater | import android.view.LayoutInflater | ||||||
| import android.view.View | import android.view.View | ||||||
| import android.view.ViewGroup | import android.view.ViewGroup | ||||||
|  | |||||||
| @ -1,8 +1,10 @@ | |||||||
| package eu.kanade.tachiyomi.ui.migration | package eu.kanade.tachiyomi.ui.migration | ||||||
| 
 | 
 | ||||||
| import android.view.View | import android.view.View | ||||||
|  | import androidx.recyclerview.widget.RecyclerView | ||||||
| import eu.davidea.flexibleadapter.FlexibleAdapter | import eu.davidea.flexibleadapter.FlexibleAdapter | ||||||
| import eu.davidea.flexibleadapter.items.AbstractFlexibleItem | import eu.davidea.flexibleadapter.items.AbstractFlexibleItem | ||||||
|  | import eu.davidea.flexibleadapter.items.IFlexible | ||||||
| import eu.kanade.tachiyomi.R | import eu.kanade.tachiyomi.R | ||||||
| import eu.kanade.tachiyomi.data.database.models.Manga | 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 |         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) |         return MangaHolder(view, adapter) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     override fun bindViewHolder(adapter: FlexibleAdapter<*>, |     override fun bindViewHolder(adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>, | ||||||
|                                 holder: MangaHolder, |                                 holder: MangaHolder, | ||||||
|                                 position: Int, |                                 position: Int, | ||||||
|                                 payloads: List<Any?>?) { |                                 payloads: List<Any?>?) { | ||||||
|  | |||||||
| @ -2,7 +2,7 @@ package eu.kanade.tachiyomi.ui.migration | |||||||
| 
 | 
 | ||||||
| import android.app.Dialog | import android.app.Dialog | ||||||
| import android.os.Bundle | import android.os.Bundle | ||||||
| import android.support.v7.widget.LinearLayoutManager | import androidx.recyclerview.widget.LinearLayoutManager | ||||||
| import android.view.LayoutInflater | import android.view.LayoutInflater | ||||||
| import android.view.View | import android.view.View | ||||||
| import android.view.ViewGroup | 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 |         val item = adapter?.getItem(position) ?: return false | ||||||
| 
 | 
 | ||||||
|         if (item is MangaItem) { |         if (item is MangaItem) { | ||||||
| @ -106,7 +106,7 @@ class MigrationController : NucleusController<MigrationPresenter>(), | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     override fun onSelectClick(position: Int) { |     override fun onSelectClick(position: Int) { | ||||||
|         onItemClick(position) |         onItemClick(view!!, position) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fun migrateManga(prevManga: Manga, manga: Manga) { |     fun migrateManga(prevManga: Manga, manga: Manga) { | ||||||
|  | |||||||
| @ -1,8 +1,10 @@ | |||||||
| package eu.kanade.tachiyomi.ui.migration | package eu.kanade.tachiyomi.ui.migration | ||||||
| 
 | 
 | ||||||
| import android.view.View | import android.view.View | ||||||
|  | import androidx.recyclerview.widget.RecyclerView | ||||||
| import eu.davidea.flexibleadapter.FlexibleAdapter | import eu.davidea.flexibleadapter.FlexibleAdapter | ||||||
| import eu.davidea.flexibleadapter.items.AbstractHeaderItem | import eu.davidea.flexibleadapter.items.AbstractHeaderItem | ||||||
|  | import eu.davidea.flexibleadapter.items.IFlexible | ||||||
| import eu.kanade.tachiyomi.R | import eu.kanade.tachiyomi.R | ||||||
| import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder | import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder | ||||||
| import kotlinx.android.synthetic.main.catalogue_main_controller_card.title | 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. |      * 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) |         return SelectionHeader.Holder(view, adapter) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|      * Binds this item to the given view holder. |      * 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?>?) { |                                 position: Int, payloads: List<Any?>?) { | ||||||
|         // Intentionally empty |         // Intentionally empty | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -1,8 +1,10 @@ | |||||||
| package eu.kanade.tachiyomi.ui.migration | package eu.kanade.tachiyomi.ui.migration | ||||||
| 
 | 
 | ||||||
| import android.view.View | import android.view.View | ||||||
|  | import androidx.recyclerview.widget.RecyclerView | ||||||
| import eu.davidea.flexibleadapter.FlexibleAdapter | import eu.davidea.flexibleadapter.FlexibleAdapter | ||||||
| import eu.davidea.flexibleadapter.items.AbstractSectionableItem | import eu.davidea.flexibleadapter.items.AbstractSectionableItem | ||||||
|  | import eu.davidea.flexibleadapter.items.IFlexible | ||||||
| import eu.kanade.tachiyomi.R | import eu.kanade.tachiyomi.R | ||||||
| import eu.kanade.tachiyomi.source.Source | import eu.kanade.tachiyomi.source.Source | ||||||
| 
 | 
 | ||||||
| @ -25,14 +27,14 @@ data class SourceItem(val source: Source, val header: SelectionHeader? = null) : | |||||||
|     /** |     /** | ||||||
|      * Creates a new view holder for this item. |      * 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) |         return SourceHolder(view, adapter as SourceAdapter) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|      * Binds this item to the given view holder. |      * 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?>?) { |                                 position: Int, payloads: List<Any?>?) { | ||||||
| 
 | 
 | ||||||
|         holder.bind(this) |         holder.bind(this) | ||||||
|  | |||||||
| @ -5,7 +5,7 @@ import android.content.Context | |||||||
| import android.graphics.Canvas | import android.graphics.Canvas | ||||||
| import android.graphics.Color | import android.graphics.Color | ||||||
| import android.graphics.Paint | import android.graphics.Paint | ||||||
| import android.support.v7.widget.AppCompatTextView | import androidx.appcompat.widget.AppCompatTextView | ||||||
| import android.text.Spannable | import android.text.Spannable | ||||||
| import android.text.SpannableString | import android.text.SpannableString | ||||||
| import android.text.style.ScaleXSpan | import android.text.style.ScaleXSpan | ||||||
|  | |||||||
| @ -1,9 +1,9 @@ | |||||||
| package eu.kanade.tachiyomi.ui.reader | package eu.kanade.tachiyomi.ui.reader | ||||||
| 
 | 
 | ||||||
| import android.graphics.Color | import android.graphics.Color | ||||||
| import android.support.annotation.ColorInt | import androidx.annotation.ColorInt | ||||||
| import android.support.design.widget.BottomSheetBehavior | import com.google.android.material.bottomsheet.BottomSheetBehavior | ||||||
| import android.support.design.widget.BottomSheetDialog | import com.google.android.material.bottomsheet.BottomSheetDialog | ||||||
| import android.view.View | import android.view.View | ||||||
| import android.view.ViewGroup | import android.view.ViewGroup | ||||||
| import android.widget.SeekBar | import android.widget.SeekBar | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| package eu.kanade.tachiyomi.ui.reader | package eu.kanade.tachiyomi.ui.reader | ||||||
| 
 | 
 | ||||||
| import android.os.Bundle | import android.os.Bundle | ||||||
| import android.support.design.widget.BottomSheetDialog | import com.google.android.material.bottomsheet.BottomSheetDialog | ||||||
| import android.view.ViewGroup | import android.view.ViewGroup | ||||||
| import com.afollestad.materialdialogs.MaterialDialog | import com.afollestad.materialdialogs.MaterialDialog | ||||||
| import eu.kanade.tachiyomi.R | import eu.kanade.tachiyomi.R | ||||||
|  | |||||||
| @ -2,7 +2,7 @@ package eu.kanade.tachiyomi.ui.reader | |||||||
| 
 | 
 | ||||||
| import android.content.Context | import android.content.Context | ||||||
| import android.graphics.Canvas | import android.graphics.Canvas | ||||||
| import android.support.v7.widget.AppCompatSeekBar | import androidx.appcompat.widget.AppCompatSeekBar | ||||||
| import android.util.AttributeSet | import android.util.AttributeSet | ||||||
| import android.view.MotionEvent | import android.view.MotionEvent | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,8 +1,8 @@ | |||||||
| package eu.kanade.tachiyomi.ui.reader | package eu.kanade.tachiyomi.ui.reader | ||||||
| 
 | 
 | ||||||
| import android.os.Bundle | import android.os.Bundle | ||||||
| import android.support.design.widget.BottomSheetDialog | import com.google.android.material.bottomsheet.BottomSheetDialog | ||||||
| import android.support.v4.widget.NestedScrollView | import androidx.core.widget.NestedScrollView | ||||||
| import android.widget.CompoundButton | import android.widget.CompoundButton | ||||||
| import android.widget.Spinner | import android.widget.Spinner | ||||||
| import com.f2prateek.rx.preferences.Preference | import com.f2prateek.rx.preferences.Preference | ||||||
|  | |||||||
| @ -2,7 +2,7 @@ package eu.kanade.tachiyomi.ui.reader | |||||||
| 
 | 
 | ||||||
| import android.content.Context | import android.content.Context | ||||||
| import android.graphics.Bitmap | import android.graphics.Bitmap | ||||||
| import android.support.v4.app.NotificationCompat | import androidx.core.app.NotificationCompat | ||||||
| import com.bumptech.glide.load.engine.DiskCacheStrategy | import com.bumptech.glide.load.engine.DiskCacheStrategy | ||||||
| import eu.kanade.tachiyomi.R | import eu.kanade.tachiyomi.R | ||||||
| import eu.kanade.tachiyomi.data.glide.GlideApp | import eu.kanade.tachiyomi.data.glide.GlideApp | ||||||
|  | |||||||
| @ -1,6 +1,6 @@ | |||||||
| package eu.kanade.tachiyomi.ui.reader.loader | 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 eu.kanade.tachiyomi.ui.reader.model.ReaderPage | ||||||
| import rx.Observable | import rx.Observable | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,10 +1,10 @@ | |||||||
| package eu.kanade.tachiyomi.ui.reader.viewer.pager | package eu.kanade.tachiyomi.ui.reader.viewer.pager | ||||||
| 
 | 
 | ||||||
| import android.content.Context | import android.content.Context | ||||||
| import android.support.v4.view.DirectionalViewPager |  | ||||||
| import android.view.HapticFeedbackConstants | import android.view.HapticFeedbackConstants | ||||||
| import android.view.KeyEvent | import android.view.KeyEvent | ||||||
| import android.view.MotionEvent | import android.view.MotionEvent | ||||||
|  | import androidx.viewpager.widget.DirectionalViewPager | ||||||
| import eu.kanade.tachiyomi.ui.reader.viewer.GestureDetectorWithLongTap | import eu.kanade.tachiyomi.ui.reader.viewer.GestureDetectorWithLongTap | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  | |||||||
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 arkon
						arkon