浏览代码

Revert "Drop support for Android 5.x"

This reverts commit 443024cebb06c85e25a87945c95580c05a05913e. Guess I'll do this a bit later so scb can get another major update first.

April Fools or whatever.
arkon 4 年之前
父节点
当前提交
f7a6cbe5e2

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

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

+ 4 - 0
app/src/main/java/eu/kanade/tachiyomi/ui/base/activity/BaseThemedActivity.kt

@@ -32,6 +32,10 @@ abstract class BaseThemedActivity : AppCompatActivity() {
                         R.style.Theme_Tachiyomi_Light_Api27
                     }
                     // Light status bar + fallback gray navigation bar
+                    Build.VERSION.SDK_INT >= Build.VERSION_CODES.M -> {
+                        R.style.Theme_Tachiyomi_Light_Api23
+                    }
+                    // Fallback gray status + navigation bar
                     else -> {
                         R.style.Theme_Tachiyomi_Light
                     }

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

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

+ 15 - 9
app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaController.kt

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

+ 15 - 0
app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaInfoHeaderAdapter.kt

@@ -1,5 +1,7 @@
 package eu.kanade.tachiyomi.ui.manga.info
 
+import android.graphics.PorterDuff
+import android.os.Build
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
@@ -19,6 +21,7 @@ import eu.kanade.tachiyomi.source.model.SManga
 import eu.kanade.tachiyomi.source.online.HttpSource
 import eu.kanade.tachiyomi.ui.manga.MangaController
 import eu.kanade.tachiyomi.util.system.copyToClipboard
+import eu.kanade.tachiyomi.util.system.getResourceColor
 import eu.kanade.tachiyomi.util.view.setChips
 import kotlinx.coroutines.flow.launchIn
 import kotlinx.coroutines.flow.merge
@@ -301,6 +304,18 @@ class MangaInfoHeaderAdapter(
                     initialLoad = false
                 }
             }
+
+            // backgroundTint attribute doesn't work properly on Android 5
+            if (Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP) {
+                listOf(binding.backdropOverlay, binding.mangaInfoToggleMoreScrim)
+                    .forEach {
+                        @Suppress("DEPRECATION")
+                        it.background.setColorFilter(
+                            view.context.getResourceColor(android.R.attr.colorBackground),
+                            PorterDuff.Mode.SRC_ATOP
+                        )
+                    }
+            }
         }
 
         private fun showMangaInfo(visible: Boolean) {

+ 19 - 16
app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsAdvancedController.kt

@@ -4,6 +4,7 @@ import android.annotation.SuppressLint
 import android.app.Dialog
 import android.content.ActivityNotFoundException
 import android.content.Intent
+import android.os.Build
 import android.os.Bundle
 import android.provider.Settings
 import androidx.core.net.toUri
@@ -63,25 +64,27 @@ class SettingsAdvancedController : SettingsController() {
             }
         }
 
-        preference {
-            key = "pref_disable_battery_optimization"
-            titleRes = R.string.pref_disable_battery_optimization
-            summaryRes = R.string.pref_disable_battery_optimization_summary
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+            preference {
+                key = "pref_disable_battery_optimization"
+                titleRes = R.string.pref_disable_battery_optimization
+                summaryRes = R.string.pref_disable_battery_optimization_summary
 
-            onClick {
-                val packageName: String = context.packageName
-                if (!context.powerManager.isIgnoringBatteryOptimizations(packageName)) {
-                    try {
-                        val intent = Intent().apply {
-                            action = Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
-                            data = "package:$packageName".toUri()
+                onClick {
+                    val packageName: String = context.packageName
+                    if (!context.powerManager.isIgnoringBatteryOptimizations(packageName)) {
+                        try {
+                            val intent = Intent().apply {
+                                action = Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
+                                data = "package:$packageName".toUri()
+                            }
+                            startActivity(intent)
+                        } catch (e: ActivityNotFoundException) {
+                            context.toast(R.string.battery_optimization_setting_activity_not_found)
                         }
-                        startActivity(intent)
-                    } catch (e: ActivityNotFoundException) {
-                        context.toast(R.string.battery_optimization_setting_activity_not_found)
+                    } else {
+                        context.toast(R.string.battery_optimization_disabled)
                     }
-                } else {
-                    context.toast(R.string.battery_optimization_disabled)
                 }
             }
         }

+ 2 - 0
app/src/main/java/eu/kanade/tachiyomi/util/system/WebViewClientCompat.kt

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

+ 7 - 1
app/src/main/java/eu/kanade/tachiyomi/widget/ElevationAppBarLayout.kt

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

+ 4 - 1
app/src/main/java/eu/kanade/tachiyomi/widget/RevealAnimationView.kt

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

+ 9 - 0
app/src/main/res/values-v23/themes.xml

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

+ 1 - 2
app/src/main/res/values/themes.xml

@@ -88,8 +88,7 @@
     <!-- Main Theme-->
     <!--===========-->
     <style name="Theme.Tachiyomi.Light" parent="Theme.Base">
-        <item name="android:statusBarColor">@android:color/transparent</item>
-        <item name="android:windowLightStatusBar">true</item>
+        <item name="android:statusBarColor">@color/md_black_1000_54</item>
         <item name="android:navigationBarColor">@color/md_black_1000_54</item>
 
         <item name="colorFilterActive">@color/filterColorLight</item>

+ 1 - 1
app/src/test/java/eu/kanade/tachiyomi/data/backup/BackupTest.kt

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

+ 1 - 1
app/src/test/java/eu/kanade/tachiyomi/data/database/CategoryTest.kt

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

+ 1 - 1
app/src/test/java/eu/kanade/tachiyomi/data/library/LibraryUpdateServiceTest.kt

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

+ 1 - 1
buildSrc/src/main/kotlin/AndroidConfig.kt

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