androidx migration

I DID THIS ONE MYSELF WITHOUT TAKING IT FROM THE OTHER FORKS
YEEEEEEEEEEET
This commit is contained in:
Rani Sargees
2020-01-06 03:26:31 -05:00
parent 53402459f2
commit 9b883b1a09
243 changed files with 4537 additions and 4604 deletions

View File

@@ -2,11 +2,11 @@ package exh.debug
import android.annotation.SuppressLint
import android.app.Activity
import android.support.v7.preference.PreferenceScreen
import android.text.Html
import android.util.Log
import android.widget.HorizontalScrollView
import android.widget.TextView
import androidx.preference.PreferenceScreen
import com.afollestad.materialdialogs.MaterialDialog
import eu.kanade.tachiyomi.ui.setting.*
import kotlin.reflect.KVisibility

View File

@@ -7,7 +7,7 @@ import android.app.job.JobService
import android.content.ComponentName
import android.content.Context
import android.os.Build
import android.support.annotation.RequiresApi
import androidx.annotation.RequiresApi
import com.elvishew.xlog.XLog
import com.google.gson.Gson
import com.kizitonwose.time.days
@@ -27,11 +27,14 @@ import exh.EXH_SOURCE_ID
import exh.debug.DebugToggles
import exh.eh.EHentaiUpdateWorkerConstants.UPDATES_PER_ITERATION
import exh.metadata.metadata.EHentaiSearchMetadata
import exh.metadata.metadata.base.*
import exh.metadata.metadata.base.getFlatMetadataForManga
import exh.metadata.metadata.base.insertFlatMetadata
import exh.util.await
import exh.util.cancellable
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.flow.asFlow
import kotlinx.coroutines.flow.mapNotNull
import kotlinx.coroutines.flow.toList
import rx.schedulers.Schedulers
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get

View File

@@ -1,12 +1,15 @@
package exh.eh
import android.support.v4.util.AtomicFile
import android.util.SparseArray
import androidx.core.util.AtomicFile
import com.elvishew.xlog.XLog
import kotlinx.coroutines.*
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
import java.io.*
import java.io.Closeable
import java.io.File
import java.io.FileNotFoundException
import java.io.InputStream
import java.nio.ByteBuffer
import kotlin.concurrent.thread
import kotlin.coroutines.CoroutineContext

View File

@@ -78,7 +78,7 @@ class HitomiNozomi(private val client: OkHttpClient,
return client.newCall(rangedGet(url, offset, offset + length - 1))
.asObservable()
.map {
it.body()?.bytes() ?: ByteArray(0)
it.body?.bytes() ?: ByteArray(0)
}
.onErrorReturn { ByteArray(0) }
.map { inbuf ->
@@ -183,7 +183,7 @@ class HitomiNozomi(private val client: OkHttpClient,
return client.newCall(rangedGet(url, address, address + MAX_NODE_SIZE - 1))
.asObservableSuccess()
.map {
it.body()?.bytes() ?: ByteArray(0)
it.body?.bytes() ?: ByteArray(0)
}
.onErrorReturn { ByteArray(0) }
.map { nodedata ->
@@ -204,7 +204,7 @@ class HitomiNozomi(private val client: OkHttpClient,
.build())
.asObservableSuccess()
.map { resp ->
val body = resp.body()!!.bytes()
val body = resp.body!!.bytes()
val cursor = ByteCursor(body)
(1 .. body.size / 4).map {
cursor.nextInt()
@@ -238,7 +238,7 @@ class HitomiNozomi(private val client: OkHttpClient,
fun getIndexVersion(httpClient: OkHttpClient, name: String): Observable<Long> {
return httpClient.newCall(GET("$LTN_BASE_URL/$name/version?_=${System.currentTimeMillis()}"))
.asObservableSuccess()
.map { it.body()!!.string().toLong() }
.map { it.body!!.string().toLong() }
}
}
}

View File

@@ -1,11 +1,9 @@
package exh.log
import com.elvishew.xlog.XLog
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
fun OkHttpClient.Builder.maybeInjectEHLogger(): OkHttpClient.Builder {
if(EHLogLevel.shouldLog(EHLogLevel.EXTREME)) {
fun OkHttpClient.Builder.maybeInjectEHLogger(): OkHttpClient.Builder { //TODO - un-break this
/* if(false &&EHLogLevel.shouldLog(EHLogLevel.EXTREME)) {
val xLogger = XLog.tag("EHNetwork")
.nst()
val interceptor = HttpLoggingInterceptor {
@@ -13,6 +11,6 @@ fun OkHttpClient.Builder.maybeInjectEHLogger(): OkHttpClient.Builder {
}
interceptor.level = HttpLoggingInterceptor.Level.BODY
return addInterceptor(interceptor)
}
} */
return this
}

View File

@@ -5,8 +5,7 @@ import eu.kanade.tachiyomi.source.SourceManager
import eu.kanade.tachiyomi.source.online.HttpSource
import exh.ui.captcha.BrowserActionActivity
import exh.util.interceptAsHtml
import okhttp3.HttpUrl
import okhttp3.OkHttpClient
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
@@ -19,13 +18,13 @@ private val HIDE_SCRIPT = """
""".trimIndent()
private fun verifyComplete(url: String): Boolean {
return HttpUrl.parse(url)?.let { parsed ->
parsed.host() == "mangadex.org" && parsed.pathSegments().none { it.isNotBlank() }
return url.toHttpUrlOrNull()?.let { parsed ->
parsed.host == "mangadex.org" && parsed.pathSegments.none { it.isNotBlank() }
} ?: false
}
val MANGADEX_LOGIN_PATCH: EHInterceptor = { request, response, sourceId ->
if(request.url().host() == MANGADEX_DOMAIN) {
if (request.url.host == MANGADEX_DOMAIN) {
response.interceptAsHtml { doc ->
if (doc.title().trim().equals("Login - MangaDex", true)) {
BrowserActionActivity.launchAction(

View File

@@ -15,7 +15,7 @@ val CAPTCHA_DETECTION_PATCH: EHInterceptor = { request, response, sourceId ->
BrowserActionActivity.launchUniversal(
Injekt.get<Application>(),
sourceId,
request.url().toString()
request.url.toString()
)
}
}

View File

@@ -117,13 +117,13 @@ class EHConfigurator {
//Persist slot + sk
source.spPref().set(slot)
val keyCookie = response.headers().toMultimap()["Set-Cookie"]?.find {
val keyCookie = response.headers.toMultimap()["Set-Cookie"]?.find {
it.startsWith("sk=")
}?.removePrefix("sk=")?.substringBefore(';')
val sessionCookie = response.headers().toMultimap()["Set-Cookie"]?.find {
val sessionCookie = response.headers.toMultimap()["Set-Cookie"]?.find {
it.startsWith("s=")
}?.removePrefix("s=")?.substringBefore(';')
val hathPerksCookie = response.headers().toMultimap()["Set-Cookie"]?.find {
val hathPerksCookie = response.headers.toMultimap()["Set-Cookie"]?.find {
it.startsWith("hath_perks=")
}?.removePrefix("hath_perks=")?.substringBefore(';')

View File

@@ -1,10 +1,10 @@
package exh.ui.base
import android.os.Bundle
import android.support.annotation.LayoutRes
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.annotation.LayoutRes
import eu.kanade.tachiyomi.ui.base.controller.BaseController
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers

View File

@@ -1,10 +1,10 @@
package exh.ui.captcha
import android.os.Build
import android.support.annotation.RequiresApi
import android.webkit.WebResourceRequest
import android.webkit.WebResourceResponse
import android.webkit.WebView
import androidx.annotation.RequiresApi
import eu.kanade.tachiyomi.util.asJsoup
import exh.ui.captcha.BrowserActionActivity.Companion.CROSS_WINDOW_SCRIPT_INNER
import org.jsoup.nodes.DataNode

View File

@@ -4,34 +4,38 @@ import android.content.Context
import android.content.Intent
import android.os.Build
import android.os.Bundle
import android.support.annotation.RequiresApi
import android.support.v7.app.AppCompatActivity
import android.os.SystemClock
import android.view.MotionEvent
import android.webkit.*
import androidx.annotation.RequiresApi
import androidx.appcompat.app.AppCompatActivity
import com.afollestad.materialdialogs.MaterialDialog
import com.github.salomonbrys.kotson.get
import com.github.salomonbrys.kotson.string
import com.google.gson.JsonParser
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.data.preference.getOrDefault
import eu.kanade.tachiyomi.network.NetworkHelper
import eu.kanade.tachiyomi.network.asObservableSuccess
import eu.kanade.tachiyomi.source.Source
import eu.kanade.tachiyomi.source.SourceManager
import eu.kanade.tachiyomi.source.online.HttpSource
import exh.source.DelegatedHttpSource
import exh.util.melt
import kotlinx.android.synthetic.main.eh_activity_captcha.*
import okhttp3.*
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.MultipartBody
import okhttp3.Request
import okhttp3.RequestBody
import rx.Observable
import rx.Single
import rx.schedulers.Schedulers
import timber.log.Timber
import uy.kohesive.injekt.injectLazy
import java.io.Serializable
import java.net.URL
import java.util.*
import android.view.MotionEvent
import android.os.SystemClock
import com.afollestad.materialdialogs.MaterialDialog
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.data.preference.getOrDefault
import eu.kanade.tachiyomi.network.NetworkHelper
import eu.kanade.tachiyomi.source.online.HttpSource
import exh.source.DelegatedHttpSource
import exh.util.melt
import rx.Observable
import java.io.Serializable
import kotlin.collections.HashMap
class BrowserActionActivity : AppCompatActivity() {
@@ -146,7 +150,7 @@ class BrowserActionActivity : AppCompatActivity() {
.asObservableSuccess()
.subscribeOn(Schedulers.io())
.map {
val json = jsonParser.parse(it.body()!!.string())
val json = jsonParser.parse(it.body!!.string())
it.close()
json["token"].string
}.melt()
@@ -267,10 +271,10 @@ class BrowserActionActivity : AppCompatActivity() {
token to it
}
}.flatMap { (token, response) ->
val audioFile = response.body()!!.bytes()
val audioFile = response.body!!.bytes()
httpClient.newCall(Request.Builder()
.url(HttpUrl.parse("https://stream.watsonplatform.net/speech-to-text/api/v1/recognize")!!
.url("https://stream.watsonplatform.net/speech-to-text/api/v1/recognize".toHttpUrlOrNull()!!
.newBuilder()
.addQueryParameter("watson-token", token)
.build())
@@ -279,11 +283,11 @@ class BrowserActionActivity : AppCompatActivity() {
.addFormDataPart("jsonDescription", RECOGNIZE_JSON)
.addFormDataPart("audio.mp3",
"audio.mp3",
RequestBody.create(MediaType.parse("audio/mp3"), audioFile))
RequestBody.create("audio/mp3".toMediaTypeOrNull(), audioFile))
.build())
.build()).asObservableSuccess()
}.map { response ->
jsonParser.parse(response.body()!!.string())["results"][0]["alternatives"][0]["transcript"].string.trim()
jsonParser.parse(response.body!!.string())["results"][0]["alternatives"][0]["transcript"].string.trim()
}.toSingle()
}

View File

@@ -1,10 +1,10 @@
package exh.ui.captcha
import android.os.Build
import android.support.annotation.RequiresApi
import android.webkit.WebResourceRequest
import android.webkit.WebResourceResponse
import android.webkit.WebView
import androidx.annotation.RequiresApi
@RequiresApi(Build.VERSION_CODES.LOLLIPOP)
open class HeadersInjectingWebViewClient(activity: BrowserActionActivity,

View File

@@ -1,8 +1,8 @@
package exh.ui.captcha
import android.os.Build
import android.support.annotation.RequiresApi
import android.webkit.WebResourceRequest
import androidx.annotation.RequiresApi
import okhttp3.Request
@RequiresApi(Build.VERSION_CODES.LOLLIPOP)

View File

@@ -4,12 +4,12 @@ import android.annotation.SuppressLint
import android.annotation.TargetApi
import android.content.Context
import android.os.Build
import android.support.v7.preference.SwitchPreferenceCompat
import android.support.v7.widget.LinearLayoutCompat
import android.util.AttributeSet
import android.view.Gravity
import android.view.ViewGroup
import android.widget.TextView
import androidx.appcompat.widget.LinearLayoutCompat
import androidx.preference.SwitchPreferenceCompat
import com.afollestad.materialdialogs.MaterialDialog
import com.github.ajalt.reprint.core.AuthenticationResult
import com.github.ajalt.reprint.core.Reprint

View File

@@ -1,9 +1,9 @@
package exh.ui.lock
import android.content.Context
import android.support.v7.preference.SwitchPreferenceCompat
import android.text.InputType
import android.util.AttributeSet
import androidx.preference.SwitchPreferenceCompat
import com.afollestad.materialdialogs.MaterialDialog
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.preference.PreferencesHelper

View File

@@ -1,7 +1,6 @@
package exh.ui.migration.manga.design
import android.os.Bundle
import android.support.v7.widget.LinearLayoutManager
import android.view.View
import eu.davidea.flexibleadapter.FlexibleAdapter
import eu.kanade.tachiyomi.R
@@ -42,7 +41,7 @@ class MigrationDesignController(bundle: Bundle? = null) : BaseExhController(bund
this
)
adapter = ourAdapter
recycler.layoutManager = LinearLayoutManager(view.context)
recycler.layoutManager = androidx.recyclerview.widget.LinearLayoutManager(view.context)
recycler.setHasFixedSize(true)
recycler.adapter = ourAdapter
ourAdapter.itemTouchHelperCallback = null // Reset adapter touch adapter to fix drag after rotation

View File

@@ -1,7 +1,6 @@
package exh.ui.migration.manga.design
import android.os.Parcelable
import android.support.v7.widget.RecyclerView
import android.view.View
import eu.davidea.flexibleadapter.FlexibleAdapter
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem
@@ -14,7 +13,7 @@ import kotlinx.android.parcel.Parcelize
class MigrationSourceItem(val source: HttpSource, var sourceEnabled: Boolean): AbstractFlexibleItem<MigrationSourceHolder>() {
override fun getLayoutRes() = R.layout.eh_source_item
override fun createViewHolder(view: View, adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>): MigrationSourceHolder {
override fun createViewHolder(view: View, adapter: FlexibleAdapter<IFlexible<androidx.recyclerview.widget.RecyclerView.ViewHolder>>): MigrationSourceHolder {
return MigrationSourceHolder(view, adapter as MigrationSourceAdapter)
}
@@ -26,7 +25,7 @@ class MigrationSourceItem(val source: HttpSource, var sourceEnabled: Boolean): A
* @param position The position of this item in the adapter.
* @param payloads List of partial changes.
*/
override fun bindViewHolder(adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>,
override fun bindViewHolder(adapter: FlexibleAdapter<IFlexible<androidx.recyclerview.widget.RecyclerView.ViewHolder>>,
holder: MigrationSourceHolder,
position: Int,
payloads: List<Any?>?) {

View File

@@ -1,11 +1,10 @@
package exh.ui.migration.manga.process
import android.content.Context
import android.support.v4.view.ViewPager
import android.util.AttributeSet
import android.view.MotionEvent
class DeactivatableViewPager: ViewPager {
class DeactivatableViewPager : androidx.viewpager.widget.ViewPager {
constructor(context: Context): super(context)
constructor(context: Context, attrs: AttributeSet): super(context, attrs)

View File

@@ -1,6 +1,5 @@
package exh.ui.migration.manga.process
import android.support.v4.view.PagerAdapter
import android.view.View
import android.view.ViewGroup
import com.bumptech.glide.load.engine.DiskCacheStrategy
@@ -18,7 +17,9 @@ import eu.kanade.tachiyomi.source.online.all.MergedSource
import eu.kanade.tachiyomi.ui.base.controller.withFadeTransaction
import eu.kanade.tachiyomi.ui.manga.MangaController
import eu.kanade.tachiyomi.ui.migration.MigrationFlags
import eu.kanade.tachiyomi.util.*
import eu.kanade.tachiyomi.util.gone
import eu.kanade.tachiyomi.util.inflate
import eu.kanade.tachiyomi.util.visible
import exh.MERGED_SOURCE_ID
import exh.util.await
import kotlinx.android.synthetic.main.eh_manga_card.view.*
@@ -34,7 +35,7 @@ import kotlin.coroutines.CoroutineContext
class MigrationProcedureAdapter(val controller: MigrationProcedureController,
val migratingManga: List<MigratingManga>,
override val coroutineContext: CoroutineContext) : PagerAdapter(), CoroutineScope {
override val coroutineContext: CoroutineContext) : androidx.viewpager.widget.PagerAdapter(), CoroutineScope {
private val db: DatabaseHelper by injectLazy()
private val gson: Gson by injectLazy()
private val sourceManager: SourceManager by injectLazy()

View File

@@ -129,7 +129,7 @@ class WebViewActivity : BaseActivity() {
webview.restoreState(savedInstanceState)
}
override fun onSaveInstanceState(outState: Bundle?) {
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState?.putString(STATE_KEY_MOBILE_USER_AGENT, mobileUserAgent)
outState?.putBoolean(STATE_KEY_IS_DESKTOP, isDesktop)

View File

@@ -7,9 +7,9 @@ import okhttp3.ResponseBody
import org.jsoup.nodes.Document
fun Response.interceptAsHtml(block: (Document) -> Unit): Response {
val body = body()
if (body?.contentType()?.type() == "text"
&& body.contentType()?.subtype() == "html") {
val body = body
if (body?.contentType()?.type == "text"
&& body.contentType()?.subtype == "html") {
val bodyString = body.string()
val rebuiltResponse = newBuilder()
.body(ResponseBody.create(body.contentType(), bodyString))