Drop support for Android 5.x

(cherry picked from commit 89619b7836145130b4bf5d92ebc0f6fe70de7233)

# Conflicts:
#	app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaInfoHeaderAdapter.kt
This commit is contained in:
arkon 2021-04-19 15:29:00 -04:00 committed by Jobobby04
parent 39d6319e8f
commit b4a226157c
19 changed files with 45 additions and 108 deletions

View File

@ -2,7 +2,6 @@ package eu.kanade.tachiyomi.network
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.Context import android.content.Context
import android.os.Build
import android.os.Handler import android.os.Handler
import android.os.Looper import android.os.Looper
import android.webkit.WebSettings import android.webkit.WebSettings
@ -114,10 +113,7 @@ class CloudflareInterceptor(private val context: Context) : Interceptor {
latch.countDown() latch.countDown()
} }
// HTTP error codes are only received since M if (url == origRequestUrl && !challengeFound) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M &&
url == origRequestUrl && !challengeFound
) {
// The first request didn't return the challenge, abort. // The first request didn't return the challenge, abort.
latch.countDown() latch.countDown()
} }

View File

@ -2,7 +2,6 @@ package eu.kanade.tachiyomi.ui.base.controller
import android.content.Intent import android.content.Intent
import android.content.pm.PackageManager.PERMISSION_GRANTED import android.content.pm.PackageManager.PERMISSION_GRANTED
import android.os.Build
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.core.net.toUri import androidx.core.net.toUri
import com.bluelinelabs.conductor.Controller import com.bluelinelabs.conductor.Controller
@ -22,14 +21,12 @@ fun Router.popControllerWithTag(tag: String): Boolean {
fun Controller.requestPermissionsSafe(permissions: Array<String>, requestCode: Int) { fun Controller.requestPermissionsSafe(permissions: Array<String>, requestCode: Int) {
val activity = activity ?: return val activity = activity ?: return
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
permissions.forEach { permission -> permissions.forEach { permission ->
if (ContextCompat.checkSelfPermission(activity, permission) != PERMISSION_GRANTED) { if (ContextCompat.checkSelfPermission(activity, permission) != PERMISSION_GRANTED) {
requestPermissions(arrayOf(permission), requestCode) requestPermissions(arrayOf(permission), requestCode)
} }
} }
} }
}
fun Controller.withFadeTransaction(): RouterTransaction { fun Controller.withFadeTransaction(): RouterTransaction {
return RouterTransaction.with(this) return RouterTransaction.with(this)

View File

@ -407,23 +407,17 @@ class MangaController :
fab.setOnClickListener { fab.setOnClickListener {
val item = presenter.getNextUnreadChapter() val item = presenter.getNextUnreadChapter()
if (item != null) { if (item != null) {
// Create animation listener // Get coordinates and start animation
val revealAnimationListener: Animator.AnimatorListener = object : AnimatorListenerAdapter() { actionFab?.getCoordinates()?.let { coordinates ->
binding.revealView.showRevealEffect(
coordinates.x,
coordinates.y,
object : AnimatorListenerAdapter() {
override fun onAnimationStart(animation: Animator?) { override fun onAnimationStart(animation: Animator?) {
openChapter(item.chapter, true) openChapter(item.chapter, true)
} }
} }
// Get coordinates and start animation
actionFab?.getCoordinates()?.let { coordinates ->
if (!binding.revealView.showRevealEffect(
coordinates.x,
coordinates.y,
revealAnimationListener
) )
) {
openChapter(item.chapter)
}
} }
} else { } else {
view?.context?.toast(R.string.no_next_chapter) view?.context?.toast(R.string.no_next_chapter)

View File

@ -1,7 +1,5 @@
package eu.kanade.tachiyomi.ui.manga.info package eu.kanade.tachiyomi.ui.manga.info
import android.graphics.PorterDuff
import android.os.Build
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
@ -23,7 +21,6 @@ import eu.kanade.tachiyomi.source.online.HttpSource
import eu.kanade.tachiyomi.source.online.all.MergedSource import eu.kanade.tachiyomi.source.online.all.MergedSource
import eu.kanade.tachiyomi.ui.manga.MangaController import eu.kanade.tachiyomi.ui.manga.MangaController
import eu.kanade.tachiyomi.util.system.copyToClipboard import eu.kanade.tachiyomi.util.system.copyToClipboard
import eu.kanade.tachiyomi.util.system.getResourceColor
import exh.merged.sql.models.MergedMangaReference import exh.merged.sql.models.MergedMangaReference
import exh.source.MERGED_SOURCE_ID import exh.source.MERGED_SOURCE_ID
import exh.util.SourceTagsUtil import exh.util.SourceTagsUtil
@ -299,14 +296,6 @@ class MangaInfoHeaderAdapter(
.into(it) .into(it)
} }
} }
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP) {
@Suppress("DEPRECATION")
binding.backdropOverlay.background.setColorFilter(
view.context.getResourceColor(android.R.attr.colorBackground),
PorterDuff.Mode.SRC_ATOP
)
}
} }
/** /**

View File

@ -1,7 +1,5 @@
package eu.kanade.tachiyomi.ui.manga.info package eu.kanade.tachiyomi.ui.manga.info
import android.graphics.PorterDuff
import android.os.Build
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
@ -19,7 +17,6 @@ import eu.kanade.tachiyomi.source.Source
import eu.kanade.tachiyomi.source.online.NamespaceSource import eu.kanade.tachiyomi.source.online.NamespaceSource
import eu.kanade.tachiyomi.ui.manga.MangaController import eu.kanade.tachiyomi.ui.manga.MangaController
import eu.kanade.tachiyomi.util.system.copyToClipboard import eu.kanade.tachiyomi.util.system.copyToClipboard
import eu.kanade.tachiyomi.util.system.getResourceColor
import exh.metadata.metadata.base.RaisedSearchMetadata import exh.metadata.metadata.base.RaisedSearchMetadata
import exh.metadata.metadata.base.RaisedSearchMetadata.Companion.TAG_TYPE_VIRTUAL import exh.metadata.metadata.base.RaisedSearchMetadata.Companion.TAG_TYPE_VIRTUAL
import exh.source.getMainSource import exh.source.getMainSource
@ -178,15 +175,6 @@ class MangaInfoItemAdapter(
initialLoad = false initialLoad = false
} }
} }
// backgroundTint attribute doesn't work properly on Android 5
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP) {
@Suppress("DEPRECATION")
binding.mangaInfoToggleMoreScrim.background.setColorFilter(
view.context.getResourceColor(android.R.attr.colorBackground),
PorterDuff.Mode.SRC_ATOP
)
}
} }
private fun showMangaInfo(visible: Boolean) { private fun showMangaInfo(visible: Boolean) {

View File

@ -163,11 +163,6 @@ class AboutController : SettingsController() {
private fun checkVersion() { private fun checkVersion() {
if (activity == null) return if (activity == null) return
if (Build.VERSION.SDK_INT under Build.VERSION_CODES.M) {
activity?.toast(R.string.update_check_eol)
return
}
activity?.toast(R.string.update_check_look_for_updates) activity?.toast(R.string.update_check_look_for_updates)
launchNow { launchNow {

View File

@ -4,7 +4,6 @@ import android.annotation.SuppressLint
import android.app.Dialog import android.app.Dialog
import android.content.ActivityNotFoundException import android.content.ActivityNotFoundException
import android.content.Intent import android.content.Intent
import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.provider.Settings import android.provider.Settings
import android.widget.Toast import android.widget.Toast
@ -77,7 +76,6 @@ class SettingsAdvancedController : SettingsController() {
} }
} }
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
preference { preference {
key = "pref_disable_battery_optimization" key = "pref_disable_battery_optimization"
titleRes = R.string.pref_disable_battery_optimization titleRes = R.string.pref_disable_battery_optimization
@ -100,7 +98,6 @@ class SettingsAdvancedController : SettingsController() {
} }
} }
} }
}
preferenceCategory { preferenceCategory {
titleRes = R.string.label_data titleRes = R.string.label_data

View File

@ -33,7 +33,7 @@ object BiometricUtil {
* Returns whether the device is secured with a PIN, pattern or password. * Returns whether the device is secured with a PIN, pattern or password.
*/ */
private fun isLegacySecured(context: Context): Boolean { private fun isLegacySecured(context: Context): Boolean {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && Build.VERSION.SDK_INT <= Build.VERSION_CODES.Q) { if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.Q) {
if (context.keyguardManager.isDeviceSecure) { if (context.keyguardManager.isDeviceSecure) {
return true return true
} }

View File

@ -54,7 +54,6 @@ abstract class WebViewClientCompat : WebViewClient() {
return shouldInterceptRequestCompat(view, url) return shouldInterceptRequestCompat(view, url)
} }
@TargetApi(Build.VERSION_CODES.M)
final override fun onReceivedError( final override fun onReceivedError(
view: WebView, view: WebView,
request: WebResourceRequest, request: WebResourceRequest,
@ -78,7 +77,6 @@ abstract class WebViewClientCompat : WebViewClient() {
onReceivedErrorCompat(view, errorCode, description, failingUrl, failingUrl == view.url) onReceivedErrorCompat(view, errorCode, description, failingUrl, failingUrl == view.url)
} }
@TargetApi(Build.VERSION_CODES.M)
final override fun onReceivedHttpError( final override fun onReceivedHttpError(
view: WebView, view: WebView,
request: WebResourceRequest, request: WebResourceRequest,

View File

@ -3,7 +3,6 @@ package eu.kanade.tachiyomi.widget
import android.animation.ObjectAnimator import android.animation.ObjectAnimator
import android.animation.StateListAnimator import android.animation.StateListAnimator
import android.content.Context import android.content.Context
import android.os.Build
import android.util.AttributeSet import android.util.AttributeSet
import com.google.android.material.R import com.google.android.material.R
import com.google.android.material.appbar.AppBarLayout import com.google.android.material.appbar.AppBarLayout
@ -20,13 +19,8 @@ class ElevationAppBarLayout @JvmOverloads constructor(
} }
fun enableElevation(liftOnScroll: Boolean) { fun enableElevation(liftOnScroll: Boolean) {
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP) {
// Delay to avoid crash
post { setElevation(liftOnScroll) }
} else {
setElevation(liftOnScroll) setElevation(liftOnScroll)
} }
}
private fun setElevation(liftOnScroll: Boolean) { private fun setElevation(liftOnScroll: Boolean) {
stateListAnimator = origStateAnimator stateListAnimator = origStateAnimator

View File

@ -49,10 +49,8 @@ class RevealAnimationView @JvmOverloads constructor(context: Context, attrs: Att
* @param centerX x starting point * @param centerX x starting point
* @param centerY y starting point * @param centerY y starting point
* @param listener animation listener * @param listener animation listener
*
* @return sdk version lower then 21
*/ */
fun showRevealEffect(centerX: Int, centerY: Int, listener: Animator.AnimatorListener): Boolean { fun showRevealEffect(centerX: Int, centerY: Int, listener: Animator.AnimatorListener) {
this.isVisible = true this.isVisible = true
val height = this.height val height = this.height
@ -71,6 +69,5 @@ class RevealAnimationView @JvmOverloads constructor(context: Context, attrs: Att
anim.addListener(listener) anim.addListener(listener)
anim.start() anim.start()
return true
} }
} }

View File

@ -1,7 +1,6 @@
package exh package exh
import android.content.Context import android.content.Context
import android.os.Build
import androidx.core.content.edit import androidx.core.content.edit
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
import com.pushtorefresh.storio.sqlite.queries.Query import com.pushtorefresh.storio.sqlite.queries.Query
@ -35,7 +34,6 @@ import exh.source.MERGED_SOURCE_ID
import exh.source.PERV_EDEN_EN_SOURCE_ID import exh.source.PERV_EDEN_EN_SOURCE_ID
import exh.source.PERV_EDEN_IT_SOURCE_ID import exh.source.PERV_EDEN_IT_SOURCE_ID
import exh.source.TSUMINO_SOURCE_ID import exh.source.TSUMINO_SOURCE_ID
import exh.util.over
import exh.util.under import exh.util.under
import kotlinx.serialization.SerialName import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
@ -68,7 +66,7 @@ object EXHMigrations {
// Fresh install // Fresh install
if (oldVersion == 0) { if (oldVersion == 0) {
// Set up default background tasks // Set up default background tasks
if (BuildConfig.INCLUDE_UPDATER && Build.VERSION.SDK_INT over Build.VERSION_CODES.LOLLIPOP_MR1) { if (BuildConfig.INCLUDE_UPDATER) {
UpdaterJob.setupTask(context) UpdaterJob.setupTask(context)
} }
ExtensionUpdateJob.setupTask(context) ExtensionUpdateJob.setupTask(context)
@ -234,9 +232,9 @@ object EXHMigrations {
// Reset rotation to Free after replacing Lock // Reset rotation to Free after replacing Lock
preferences.rotation().set(1) preferences.rotation().set(1)
// Disable update check for Android 5.x users // Disable update check for Android 5.x users
if (BuildConfig.INCLUDE_UPDATER && Build.VERSION.SDK_INT under Build.VERSION_CODES.M) { //if (BuildConfig.INCLUDE_UPDATER && Build.VERSION.SDK_INT under Build.VERSION_CODES.M) {
UpdaterJob.cancelTask(context) // UpdaterJob.cancelTask(context)
} //}
} }
// if (oldVersion under 1) { } (1 is current release version) // if (oldVersion under 1) { } (1 is current release version)

View File

@ -1,9 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="Base.V23.Theme.Tachiyomi.Light" parent="Base.Theme.Tachiyomi.Light">
<item name="android:statusBarColor">?attr/colorPrimary</item>
<item name="android:windowLightStatusBar">true</item>
</style>
<style name="Theme.Tachiyomi.Light" parent="Base.V23.Theme.Tachiyomi.Light" />
</resources>

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<style name="Base.V27.Theme.Tachiyomi.Light" parent="Base.V23.Theme.Tachiyomi.Light"> <style name="Base.V27.Theme.Tachiyomi.Light" parent="Base.Theme.Tachiyomi.Light">
<item name="android:navigationBarColor">?attr/colorPrimary</item> <item name="android:navigationBarColor">?attr/colorPrimary</item>
<item name="android:windowLightNavigationBar">true</item> <item name="android:windowLightNavigationBar">true</item>
</style> </style>

View File

@ -91,7 +91,10 @@
<!--===========--> <!--===========-->
<!-- Main Theme--> <!-- Main Theme-->
<!--===========--> <!--===========-->
<style name="Base.Theme.Tachiyomi.Light" parent="Theme.Base" /> <style name="Base.Theme.Tachiyomi.Light" parent="Theme.Base">
<item name="android:statusBarColor">?attr/colorPrimary</item>
<item name="android:windowLightStatusBar">true</item>
</style>
<style name="Theme.Tachiyomi.Light" parent="Base.Theme.Tachiyomi.Light" /> <style name="Theme.Tachiyomi.Light" parent="Base.Theme.Tachiyomi.Light" />
<style name="Theme.Tachiyomi.Light.Blue"> <style name="Theme.Tachiyomi.Light.Blue">

View File

@ -41,7 +41,7 @@ import uy.kohesive.injekt.api.addSingleton
* Test class for the [LegacyBackupManager]. * Test class for the [LegacyBackupManager].
* Note that this does not include the backup create/restore services. * Note that this does not include the backup create/restore services.
*/ */
@Config(constants = BuildConfig::class, sdk = [Build.VERSION_CODES.LOLLIPOP]) @Config(constants = BuildConfig::class, sdk = [Build.VERSION_CODES.M])
@RunWith(CustomRobolectricGradleTestRunner::class) @RunWith(CustomRobolectricGradleTestRunner::class)
class BackupTest { class BackupTest {
// Create root object // Create root object

View File

@ -13,7 +13,7 @@ import org.junit.runner.RunWith
import org.robolectric.RuntimeEnvironment import org.robolectric.RuntimeEnvironment
import org.robolectric.annotation.Config import org.robolectric.annotation.Config
@Config(constants = BuildConfig::class, sdk = [Build.VERSION_CODES.LOLLIPOP]) @Config(constants = BuildConfig::class, sdk = [Build.VERSION_CODES.M])
@RunWith(CustomRobolectricGradleTestRunner::class) @RunWith(CustomRobolectricGradleTestRunner::class)
class CategoryTest { class CategoryTest {

View File

@ -28,7 +28,7 @@ import uy.kohesive.injekt.api.InjektModule
import uy.kohesive.injekt.api.InjektRegistrar import uy.kohesive.injekt.api.InjektRegistrar
import uy.kohesive.injekt.api.addSingleton import uy.kohesive.injekt.api.addSingleton
@Config(constants = BuildConfig::class, sdk = [Build.VERSION_CODES.LOLLIPOP]) @Config(constants = BuildConfig::class, sdk = [Build.VERSION_CODES.M])
@RunWith(CustomRobolectricGradleTestRunner::class) @RunWith(CustomRobolectricGradleTestRunner::class)
class LibraryUpdateServiceTest { class LibraryUpdateServiceTest {

View File

@ -1,6 +1,6 @@
object AndroidConfig { object AndroidConfig {
const val compileSdk = 29 const val compileSdk = 29
const val minSdk = 21 const val minSdk = 23
const val targetSdk = 29 const val targetSdk = 29
const val buildTools = "30.0.3" const val buildTools = "30.0.3"
const val ndk = "22.1.7171670" const val ndk = "22.1.7171670"