Merge branch 'tachiyomiorg:master' into master

This commit is contained in:
jmir1 2021-05-24 21:52:28 +02:00
commit 24ff9d36c3
28 changed files with 431 additions and 61 deletions

View file

@ -74,9 +74,6 @@ open class App : Application(), LifecycleObserver, ImageLoaderFactory {
ProcessLifecycleOwner.get().lifecycle.addObserver(this)
// Reset Incognito Mode on relaunch
preferences.incognitoMode().set(false)
// Show notification to disable Incognito Mode when it's enabled
preferences.incognitoMode().asFlow()
.onEach { enabled ->

View file

@ -24,7 +24,9 @@ object PreferenceValues {
enum class DarkThemeVariant {
default,
blue,
midnightdusk,
amoled,
hotpink,
}
/* ktlint-enable experimental:enum-entry-name-case */

View file

@ -11,6 +11,7 @@ import eu.kanade.tachiyomi.data.track.model.AnimeTrackSearch
import eu.kanade.tachiyomi.data.track.model.TrackSearch
import eu.kanade.tachiyomi.network.POST
import eu.kanade.tachiyomi.network.await
import eu.kanade.tachiyomi.network.interceptor.RateLimitInterceptor
import eu.kanade.tachiyomi.network.jsonMime
import eu.kanade.tachiyomi.network.parseAs
import eu.kanade.tachiyomi.util.lang.withIOContext
@ -29,10 +30,14 @@ import kotlinx.serialization.json.putJsonObject
import okhttp3.OkHttpClient
import okhttp3.RequestBody.Companion.toRequestBody
import java.util.Calendar
import java.util.concurrent.TimeUnit.MINUTES
class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) {
private val authClient = client.newBuilder().addInterceptor(interceptor).build()
private val authClient = client.newBuilder()
.addInterceptor(interceptor)
.addInterceptor(RateLimitInterceptor(85, 1, MINUTES))
.build()
suspend fun addLibManga(track: Track): Track {
return withIOContext {

View file

@ -4,6 +4,8 @@ import android.content.Context
import coil.util.CoilUtils
import eu.kanade.tachiyomi.BuildConfig
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.network.interceptor.CloudflareInterceptor
import eu.kanade.tachiyomi.network.interceptor.UserAgentInterceptor
import okhttp3.Cache
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor

View file

@ -1,4 +1,4 @@
package eu.kanade.tachiyomi.network
package eu.kanade.tachiyomi.network.interceptor
import android.annotation.SuppressLint
import android.content.Context
@ -8,6 +8,7 @@ import android.webkit.WebSettings
import android.webkit.WebView
import android.widget.Toast
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.network.NetworkHelper
import eu.kanade.tachiyomi.source.online.HttpSource
import eu.kanade.tachiyomi.util.lang.launchUI
import eu.kanade.tachiyomi.util.system.WebViewClientCompat

View file

@ -0,0 +1,58 @@
package eu.kanade.tachiyomi.network.interceptor
import android.os.SystemClock
import okhttp3.Interceptor
import okhttp3.Response
import java.util.concurrent.TimeUnit
/**
* An OkHttp interceptor that handles rate limiting.
*
* Examples:
*
* permits = 5, period = 1, unit = seconds => 5 requests per second
* permits = 10, period = 2, unit = minutes => 10 requests per 2 minutes
*
* @param permits {Int} Number of requests allowed within a period of units.
* @param period {Long} The limiting duration. Defaults to 1.
* @param unit {TimeUnit} The unit of time for the period. Defaults to seconds.
*/
class RateLimitInterceptor(
private val permits: Int,
private val period: Long = 1,
private val unit: TimeUnit = TimeUnit.SECONDS
) : Interceptor {
private val requestQueue = ArrayList<Long>(permits)
private val rateLimitMillis = unit.toMillis(period)
override fun intercept(chain: Interceptor.Chain): Response {
synchronized(requestQueue) {
val now = SystemClock.elapsedRealtime()
val waitTime = if (requestQueue.size < permits) {
0
} else {
val oldestReq = requestQueue[0]
val newestReq = requestQueue[permits - 1]
if (newestReq - oldestReq > rateLimitMillis) {
0
} else {
oldestReq + rateLimitMillis - now // Remaining time
}
}
if (requestQueue.size == permits) {
requestQueue.removeAt(0)
}
if (waitTime > 0) {
requestQueue.add(now + waitTime)
Thread.sleep(waitTime) // Sleep inside synchronized to pause queued requests
} else {
requestQueue.add(now)
}
}
return chain.proceed(chain.request())
}
}

View file

@ -0,0 +1,65 @@
package eu.kanade.tachiyomi.network.interceptor
import android.os.SystemClock
import okhttp3.HttpUrl
import okhttp3.Interceptor
import okhttp3.Response
import java.util.concurrent.TimeUnit
/**
* An OkHttp interceptor that handles given url host's rate limiting.
*
* Examples:
*
* httpUrl = "api.manga.com".toHttpUrlOrNull(), permits = 5, period = 1, unit = seconds => 5 requests per second to api.manga.com
* httpUrl = "imagecdn.manga.com".toHttpUrlOrNull(), permits = 10, period = 2, unit = minutes => 10 requests per 2 minutes to imagecdn.manga.com
*
* @param httpUrl {HttpUrl} The url host that this interceptor should handle. Will get url's host by using HttpUrl.host()
* @param permits {Int} Number of requests allowed within a period of units.
* @param period {Long} The limiting duration. Defaults to 1.
* @param unit {TimeUnit} The unit of time for the period. Defaults to seconds.
*/
class SpecificHostRateLimitInterceptor(
private val httpUrl: HttpUrl,
private val permits: Int,
private val period: Long = 1,
private val unit: TimeUnit = TimeUnit.SECONDS
) : Interceptor {
private val requestQueue = ArrayList<Long>(permits)
private val rateLimitMillis = unit.toMillis(period)
private val host = httpUrl.host
override fun intercept(chain: Interceptor.Chain): Response {
if (chain.request().url.host != host) {
return chain.proceed(chain.request())
}
synchronized(requestQueue) {
val now = SystemClock.elapsedRealtime()
val waitTime = if (requestQueue.size < permits) {
0
} else {
val oldestReq = requestQueue[0]
val newestReq = requestQueue[permits - 1]
if (newestReq - oldestReq > rateLimitMillis) {
0
} else {
oldestReq + rateLimitMillis - now // Remaining time
}
}
if (requestQueue.size == permits) {
requestQueue.removeAt(0)
}
if (waitTime > 0) {
requestQueue.add(now + waitTime)
Thread.sleep(waitTime) // Sleep inside synchronized to pause queued requests
} else {
requestQueue.add(now)
}
}
return chain.proceed(chain.request())
}
}

View file

@ -1,4 +1,4 @@
package eu.kanade.tachiyomi.network
package eu.kanade.tachiyomi.network.interceptor
import eu.kanade.tachiyomi.source.online.HttpSource
import okhttp3.Interceptor

View file

@ -25,7 +25,9 @@ abstract class BaseThemedActivity : AppCompatActivity() {
when (preferences.themeDark().get()) {
DarkThemeVariant.default -> R.style.Theme_Tachiyomi_Dark
DarkThemeVariant.blue -> R.style.Theme_Tachiyomi_Dark_Blue
DarkThemeVariant.amoled -> R.style.Theme_Tachiyomi_Dark_Amoled
DarkThemeVariant.midnightdusk -> R.style.Theme_Tachiyomi_Dark_MidnightDusk
DarkThemeVariant.amoled -> R.style.Theme_Tachiyomi_Amoled
DarkThemeVariant.hotpink -> R.style.Theme_Tachiyomi_Amoled_HotPink
}
} else {
when (preferences.themeLight().get()) {

View file

@ -11,7 +11,7 @@ import eu.davidea.flexibleadapter.items.IFlexible
import eu.davidea.viewholders.FlexibleViewHolder
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.source.model.Filter
import eu.kanade.tachiyomi.widget.IgnoreFirstSpinnerListener
import eu.kanade.tachiyomi.widget.listener.IgnoreFirstSpinnerListener
open class SelectItem(val filter: Filter.Select<*>) : AbstractFlexibleItem<SelectItem.Holder>() {

View file

@ -232,6 +232,9 @@ class MainActivity : BaseViewBindingActivity<MainActivityBinding>() {
syncActivityViewWithController(router.backstack.lastOrNull()?.controller())
if (savedInstanceState == null) {
// Reset Incognito Mode on relaunch
preferences.incognitoMode().set(false)
// Show changelog prompt on update
if (Migrations.upgrade(preferences) && !BuildConfig.DEBUG) {
WhatsNewDialogController().showDialog(router)

View file

@ -61,8 +61,8 @@ import eu.kanade.tachiyomi.util.view.isDefaultBar
import eu.kanade.tachiyomi.util.view.popupMenu
import eu.kanade.tachiyomi.util.view.setTooltip
import eu.kanade.tachiyomi.util.view.showBar
import eu.kanade.tachiyomi.widget.SimpleAnimationListener
import eu.kanade.tachiyomi.widget.SimpleSeekBarListener
import eu.kanade.tachiyomi.widget.listener.SimpleAnimationListener
import eu.kanade.tachiyomi.widget.listener.SimpleSeekBarListener
import kotlinx.coroutines.flow.drop
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach

View file

@ -15,7 +15,7 @@ import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.databinding.ReaderColorFilterSettingsBinding
import eu.kanade.tachiyomi.ui.reader.ReaderActivity
import eu.kanade.tachiyomi.util.preference.bindToPreference
import eu.kanade.tachiyomi.widget.SimpleSeekBarListener
import eu.kanade.tachiyomi.widget.listener.SimpleSeekBarListener
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.flow.sample

View file

@ -4,7 +4,7 @@ import android.os.Bundle
import com.google.android.material.tabs.TabLayout
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.ui.reader.ReaderActivity
import eu.kanade.tachiyomi.widget.SimpleTabSelectedListener
import eu.kanade.tachiyomi.widget.listener.SimpleTabSelectedListener
import eu.kanade.tachiyomi.widget.sheet.TabbedBottomSheetDialog
class ReaderSettingsSheet(

View file

@ -141,12 +141,16 @@ class SettingsGeneralController : SettingsController() {
entriesRes = arrayOf(
R.string.theme_dark_default,
R.string.theme_dark_blue,
R.string.theme_dark_amoled
R.string.theme_dark_midnightdusk,
R.string.theme_dark_amoled,
R.string.theme_dark_amoled_hotpink
)
entryValues = arrayOf(
Values.DarkThemeVariant.default.name,
Values.DarkThemeVariant.blue.name,
Values.DarkThemeVariant.amoled.name
Values.DarkThemeVariant.midnightdusk.name,
Values.DarkThemeVariant.amoled.name,
Values.DarkThemeVariant.hotpink.name
)
defaultValue = Values.DarkThemeVariant.default.name
summary = "%s"

View file

@ -16,6 +16,7 @@ import androidx.preference.PreferenceScreen
import androidx.preference.SwitchPreferenceCompat
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.util.system.getResourceColor
import eu.kanade.tachiyomi.widget.preference.AdaptiveTitlePreferenceCategory
import eu.kanade.tachiyomi.widget.preference.IntListPreference
import eu.kanade.tachiyomi.widget.preference.SwitchPreferenceCategory
import eu.kanade.tachiyomi.widget.preference.SwitchSettingsPreference
@ -77,7 +78,7 @@ inline fun PreferenceGroup.multiSelectListPreference(block: (@DSL MultiSelectLis
}
inline fun PreferenceScreen.preferenceCategory(block: (@DSL PreferenceCategory).() -> Unit): PreferenceCategory {
return addThenInit(PreferenceCategory(context), block)
return addThenInit(AdaptiveTitlePreferenceCategory(context), block)
}
inline fun PreferenceScreen.preferenceScreen(block: (@DSL PreferenceScreen).() -> Unit): PreferenceScreen {

View file

@ -13,6 +13,7 @@ import androidx.appcompat.view.ActionMode
import androidx.core.view.isVisible
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.databinding.ActionToolbarBinding
import eu.kanade.tachiyomi.widget.listener.SimpleAnimationListener
/**
* A toolbar holding only menu items.

View file

@ -1,4 +1,4 @@
package eu.kanade.tachiyomi.widget
package eu.kanade.tachiyomi.widget.listener
import android.view.View
import android.widget.AdapterView

View file

@ -1,4 +1,4 @@
package eu.kanade.tachiyomi.widget
package eu.kanade.tachiyomi.widget.listener
import android.view.animation.Animation

View file

@ -1,4 +1,4 @@
package eu.kanade.tachiyomi.widget
package eu.kanade.tachiyomi.widget.listener
import android.widget.SeekBar

View file

@ -1,4 +1,4 @@
package eu.kanade.tachiyomi.widget
package eu.kanade.tachiyomi.widget.listener
import com.google.android.material.tabs.TabLayout

View file

@ -0,0 +1,22 @@
package eu.kanade.tachiyomi.widget.preference
import android.content.Context
import androidx.core.view.updateLayoutParams
import androidx.preference.PreferenceCategory
import androidx.preference.PreferenceViewHolder
import androidx.recyclerview.widget.RecyclerView
/**
* PreferenceCategory that hides the title placeholder layout if the title is unset
*/
class AdaptiveTitlePreferenceCategory(context: Context) : PreferenceCategory(context) {
override fun onBindViewHolder(holder: PreferenceViewHolder) {
super.onBindViewHolder(holder)
if (title.isNullOrBlank()) {
holder.itemView.updateLayoutParams<RecyclerView.LayoutParams> {
height = 0
topMargin = 0
}
}
}
}

View file

@ -33,7 +33,8 @@
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@id/chapters_recycler"
app:layout_constraintWidth_percent="0.4"
app:layout_constraintWidth_percent="0.5"
app:layout_constraintWidth_max="450dp"
tools:itemCount="1"
tools:listitem="@layout/manga_info_header" />

View file

@ -8,8 +8,11 @@
<!-- Dark Application Colors -->
<color name="colorDarkPrimary">#242529</color>
<color name="colorDarkPrimaryDark">#202125</color>
<!-- AMOLED Application Colors -->
<color name="colorAmoledPrimary">@color/md_black_1000</color>
<!-- Splash Color -->
<color name="splashBackgroundColor">@color/colorPrimary</color>
<!-- Light Theme -->
@ -38,6 +41,38 @@
<color name="dialogDark">@color/colorDarkPrimary</color>
<color name="selectorColorDark">@color/md_blue_A200_50</color>
<!-- Midnight Dusk Theme -->
<color name="colorAccentDusk">#F02475</color>
<color name="textColorPrimaryDusk">@color/md_white_1000</color>
<color name="textColorSecondaryDusk">@color/md_white_1000_70</color>
<color name="textColorHintDusk">@color/md_white_1000_50</color>
<color name="dividerDusk">#12ffffff</color>
<color name="rippleSecondaryColorDusk">#0FF02475</color>
<color name="backgroundDusk">#16151D</color>
<color name="dialogDusk">#201F27</color>
<color name="selectorColorDusk">#80F02475</color>
<!-- AMOLED Theme -->
<color name="colorAccentAmoled">#3399FF</color>
<color name="textColorPrimaryAmoled">@color/md_white_1000</color>
<color name="textColorSecondaryAmoled">@color/md_white_1000_70</color>
<color name="textColorHintAmoled">@color/md_white_1000_50</color>
<color name="dividerAmoled">@android:color/transparent</color>
<color name="rippleColorAmoled">@color/md_white_1000_8</color>
<color name="rippleSecondaryColorAmoled">#0A3399FF</color>
<color name="rippleToolbarColorAmoled">@color/rippleColorAmoled</color>
<color name="backgroundAmoled">@color/colorAmoledPrimary</color>
<color name="dialogAmoled">@color/colorAmoledPrimary</color>
<color name="selectorColorAmoled">@color/md_blue_A200_50</color>
<!-- Hot Pink Theme -->
<color name="colorAccentPink">#FF3399</color>
<color name="textColorPrimaryPink">@color/md_white_1000</color>
<color name="textColorSecondaryPink">@color/md_white_1000_70</color>
<color name="textColorHintPink">@color/md_white_1000_50</color>
<color name="rippleSecondaryColorPink">#0AFF3399</color>
<color name="selectorColorPink">#80FF69B4</color>
<!-- Reader Theme -->
<color name="readerColorDarkPrimary">@color/colorDarkPrimary</color>
<color name="pageNumberBackgroundLight">@color/md_grey_50_75</color>
@ -45,12 +80,14 @@
<color name="filterColorLight">#FFC107</color>
<color name="filterColorDark">#FFEB3B</color>
<color name="filterColorAmoled">#FFEB3B</color>
<!-- Text Colors -->
<color name="md_black_1000_87">#DE000000</color>
<color name="md_black_1000_54">#8A000000</color>
<color name="md_black_1000_38">#61000000</color>
<color name="md_black_1000_12">#1F000000</color>
<color name="md_black_1000_8">#14000000</color>
<color name="md_black_1000_6">#0F000000</color>
<color name="md_white_1000">#FFFFFFFF</color>
@ -59,6 +96,7 @@
<color name="md_white_1000_50">#80FFFFFF</color>
<color name="md_white_1000_20">#33FFFFFF</color>
<color name="md_white_1000_12">#1FFFFFFF</color>
<color name="md_white_1000_8">#14FFFFFF</color>
<color name="md_white_1000_6">#0FFFFFFF</color>
<!-- Material Design Colors -->

View file

@ -168,7 +168,9 @@
<string name="pref_theme_dark">Dark theme</string>
<string name="theme_dark_default">Default</string>
<string name="theme_dark_blue">Dark blue</string>
<string name="theme_dark_midnightdusk">Midnight dusk</string>
<string name="theme_dark_amoled">AMOLED black</string>
<string name="theme_dark_amoled_hotpink">Hot pink</string>
<string name="pref_start_screen">Start screen</string>
<string name="pref_language">Language</string>
<string name="system_default">Default</string>

View file

@ -6,11 +6,7 @@
<!--========-->
<style name="Theme.Toolbar" parent="@style/ThemeOverlay.MaterialComponents.ActionBar" />
<style name="Theme.Toolbar.Light" parent="Theme.Toolbar.Custom.Dark">
<item name="popupTheme">@style/ThemeOverlay.MaterialComponents.Light</item>
</style>
<style name="Theme.Toolbar.Custom" parent="@style/ThemeOverlay.MaterialComponents.ActionBar">
<style name="Theme.Toolbar.Custom.Light" parent="@style/ThemeOverlay.MaterialComponents.ActionBar">
<item name="android:colorControlHighlight">?attr/rippleToolbarColor</item>
</style>
@ -18,6 +14,14 @@
<item name="android:colorControlHighlight">?attr/rippleToolbarColor</item>
</style>
<style name="Theme.Toolbar.Custom.Amoled" parent="@style/ThemeOverlay.MaterialComponents.Dark.ActionBar">
<item name="android:colorControlHighlight">?attr/rippleToolbarColor</item>
</style>
<style name="Theme.Toolbar.Custom.PopupTheme" parent="Theme.Toolbar.Custom.Dark">
<item name="popupTheme">@style/ThemeOverlay.MaterialComponents.Light</item>
</style>
<style name="Theme.Toolbar.Navigation" parent="Widget.AppCompat.Toolbar.Button.Navigation">
<item name="tint">?attr/colorOnPrimary</item>
</style>
@ -68,6 +72,10 @@
<item name="colorAccent">@color/colorAccentDark</item>
</style>
<style name="Theme.AlertDialog.Amoled" parent="Theme.AlertDialog">
<item name="colorAccent">@color/colorAccentAmoled</item>
</style>
<!--===========-->
<!--BottomSheet-->

View file

@ -4,16 +4,16 @@
<!--============-->
<!-- Base Theme -->
<!--============-->
<style name="Theme"/>
<!--==============-->
<!-- Light Themes -->
<!--=======-======-->
<!--== Theme ==-->
<style name="Theme" />
<!--== Theme base ==-->
<style name="Theme.Base" parent="Theme.MaterialComponents.Light.NoActionBar">
<!-- AppBar -->
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<!-- Disallow 'Force dark theme' -->
<item name="android:forceDarkAllowed" tools:targetApi="Q">false</item>
<!-- Theme colors -->
@ -60,7 +60,7 @@
<item name="actionModeStyle">@style/Theme.ActionMode</item>
<item name="actionModeCloseButtonStyle">@style/Theme.ActionMode.CloseButton</item>
<item name="actionModeCloseDrawable">@drawable/ic_close_24dp</item>
<item name="actionBarTheme">@style/Theme.Toolbar.Custom</item>
<item name="actionBarTheme">@style/Theme.Toolbar.Custom.Light</item>
<item name="actionBarPopupTheme">@style/ThemeOverlay.MaterialComponents</item>
<item name="toolbarNavigationButtonStyle">@style/Theme.Toolbar.Navigation</item>
<item name="preferenceTheme">@style/PreferenceThemeCustom</item>
@ -93,24 +93,41 @@
<item name="colorFilterActive">@color/filterColorLight</item>
</style>
<!--===========-->
<!-- Main Theme-->
<!--===========-->
<!--==============-->
<!-- Light Themes -->
<!--==============-->
<!--== Light base ==-->
<style name="Base.Theme.Tachiyomi.Light" parent="Theme.Base">
<!-- Base background/text colors -->
<item name="android:statusBarColor">?attr/colorPrimary</item>
<item name="android:windowLightStatusBar">true</item>
<item name="background">@color/dialogLight</item>
</style>
<!--== Light theme ==-->
<style name="Theme.Tachiyomi.Light" parent="Base.Theme.Tachiyomi.Light" />
<!--== Light Blue theme ==-->
<style name="Theme.Tachiyomi.Light.Blue">
<!-- Theme colors -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorOnPrimary">@color/textColorPrimaryDark</item>
<item name="colorAccentOnPrimary">@color/textColorPrimaryDark</item>
<item name="colorPrimaryVariant">@color/colorPrimaryDark</item>
<item name="colorFilterActive">@color/filterColorDark</item>
<!-- Base background/text colors -->
<item name="background">@color/colorPrimary</item>
<!-- Ripples -->
<item name="rippleSecondaryColor">@color/md_white_1000_6</item>
<item name="rippleToolbarColor">@color/md_white_1000_12</item>
<item name="actionBarTheme">@style/Theme.Toolbar.Light</item>
<!-- Themes -->
<item name="actionBarTheme">@style/Theme.Toolbar.Custom.PopupTheme</item>
<!-- Status/Navigation bar -->
<item name="android:windowLightStatusBar" tools:targetApi="m">false</item>
<item name="android:windowLightNavigationBar" tools:targetApi="o_mr1">false</item>
</style>
@ -118,6 +135,8 @@
<!--=============-->
<!-- Dark Themes -->
<!--=============-->
<!--== Dark base ==-->
<style name="Theme.Base.Dark" parent="Theme.MaterialComponents.NoActionBar">
<!-- Theme colors -->
<item name="colorPrimary">@color/colorDarkPrimary</item>
@ -144,6 +163,7 @@
<item name="android:textColorSecondaryInverse">@color/textColorSecondaryLight</item>
<item name="android:textColorHintInverse">@color/textColorHintLight</item>
<item name="android:colorEdgeEffect">?attr/colorAccent</item>
<item name="background">@color/colorDarkPrimaryDark</item>
<item name="android:divider">@color/dividerDark</item>
<item name="android:listDivider">@drawable/line_divider</item>
@ -196,81 +216,219 @@
<item name="colorFilterActive">@color/filterColorDark</item>
</style>
<!--== Dark theme ==-->
<style name="Theme.Tachiyomi.Dark" parent="Theme.Base.Dark" />
<!--== Dark Blue theme ==-->
<style name="Theme.Tachiyomi.Dark.Blue">
<!-- Theme colors -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorAccentOnPrimary">@color/textColorPrimaryDark</item>
<item name="colorPrimaryVariant">@color/colorPrimary</item>
<!-- Base background/text colors -->
<item name="background">@color/colorPrimary</item>
<!-- Ripples -->
<item name="rippleSecondaryColor">@color/md_black_1000_6</item>
<item name="rippleToolbarColor">@color/md_black_1000_12</item>
</style>
<style name="Theme.Tachiyomi.Dark.Amoled">
<item name="colorPrimary">@color/colorAmoledPrimary</item>
<item name="colorPrimaryVariant">@color/colorAmoledPrimary</item>
<item name="colorSurface">@color/colorAmoledPrimary</item>
<!--== Midnight Dusk theme ==-->
<style name="Theme.Tachiyomi.Dark.MidnightDusk" parent="Theme.Base.Dark">
<!-- Theme colors -->
<item name="colorPrimary">@color/dialogDusk</item>
<item name="colorOnPrimary">@color/textColorPrimaryDusk</item>
<item name="colorAccentOnPrimary">@color/colorAccentDusk</item>
<item name="colorPrimaryVariant">@color/dialogDusk</item>
<item name="colorSecondary">@color/colorAccentDusk</item>
<item name="colorOnSecondary">@color/textColorPrimaryDusk</item>
<item name="colorSurface">@color/dialogDusk</item>
<item name="colorOnSurface">@color/textColorPrimaryDusk</item>
<item name="colorOnBackground">@color/textColorPrimaryDusk</item>
<item name="colorAccent">@color/colorAccentDusk</item>
<item name="android:colorBackground">@color/colorAmoledPrimary</item>
<!-- Base background/text colors -->
<item name="android:colorBackground">@color/backgroundDusk</item>
<item name="background">@color/backgroundDusk</item>
<!-- Some ROMs make black navbars white (e.g. OxygenOS) -->
<item name="android:navigationBarColor">#000001</item>
<!-- Ripples -->
<item name="rippleSecondaryColor">@color/rippleSecondaryColorDusk</item>
<!-- Custom Attributes-->
<!-- Custom Attributes -->
<item name="colorLibrarySelection">@color/selectorColorDark</item>
<item name="colorLibrarySelectionActive">@color/selectorColorDark</item>
</style>
<!--==============-->
<!-- Reader Theme -->
<!--==============-->
<style name="Theme.Base.Reader.Dark" parent="Theme.Base.Dark">
<item name="colorPrimary">@color/readerColorDarkPrimary</item>
<item name="colorOnPrimary">@color/textColorPrimaryDark</item>
<item name="colorPrimaryVariant">@color/readerColorDarkPrimary</item>
<item name="colorSurface">@color/md_black_1000</item>
<!--===============-->
<!-- AMOLED Themes -->
<!--===============-->
<item name="android:colorBackground">@color/md_black_1000</item>
<item name="android:statusBarColor">?attr/colorPrimaryVariant</item>
<item name="android:navigationBarColor">?attr/colorPrimaryVariant</item>
<!--== AMOLED base ==-->
<style name="Theme.Base.Amoled" parent="Theme.MaterialComponents.NoActionBar">
<!-- Theme colors -->
<item name="colorPrimary">@color/colorAmoledPrimary</item>
<item name="colorOnPrimary">@color/textColorPrimaryAmoled</item>
<item name="colorAccentOnPrimary">@color/colorAccentAmoled</item>
<item name="colorPrimaryVariant">@color/colorAmoledPrimary</item>
<item name="colorSecondary">@color/colorAccentAmoled</item>
<item name="colorOnSecondary">@color/textColorPrimaryAmoled</item>
<item name="colorSurface">@color/dialogAmoled</item>
<item name="colorOnSurface">@color/textColorPrimaryAmoled</item>
<item name="colorOnBackground">@color/textColorPrimaryAmoled</item>
<item name="colorAccent">@color/colorAccentAmoled</item>
<item name="actionBarTheme">@style/Theme.Toolbar.Custom.Dark</item>
<!-- Handles RTL text -->
<item name="android:textAlignment">gravity</item>
<item name="android:textDirection">locale</item>
<!-- Base background/text colors -->
<item name="android:colorBackground">@color/colorAmoledPrimary</item>
<item name="android:textColorPrimary">@color/textColorPrimaryAmoled</item>
<item name="android:textColorSecondary">@color/textColorSecondaryAmoled</item>
<item name="android:textColorHint">@color/textColorHintAmoled</item>
<item name="android:textColorPrimaryInverse">@color/textColorPrimaryLight</item>
<item name="android:textColorSecondaryInverse">@color/textColorSecondaryLight</item>
<item name="android:textColorHintInverse">@color/textColorHintLight</item>
<item name="android:colorEdgeEffect">?attr/colorAccent</item>
<item name="background">@color/colorAmoledPrimary</item>
<item name="android:divider">@color/dividerAmoled</item>
<item name="android:listDivider">@drawable/line_divider</item>
<!-- Ripples -->
<item name="rippleColor">@color/rippleColorAmoled</item>
<item name="rippleSecondaryColor">@color/rippleSecondaryColorAmoled</item>
<item name="rippleToolbarColor">@color/rippleToolbarColorAmoled</item>
<!-- Themes -->
<item name="android:statusBarColor">?attr/colorPrimary</item>
<item name="android:navigationBarDividerColor" tools:targetApi="o_mr1">@null</item>
<item name="android:enforceNavigationBarContrast" tools:targetApi="Q">false</item>
<item name="windowActionModeOverlay">true</item>
<item name="elevationOverlayEnabled">false</item>
<item name="actionModeStyle">@style/Theme.ActionMode</item>
<item name="actionModeCloseButtonStyle">@style/Theme.ActionMode.CloseButton</item>
<item name="actionModeCloseDrawable">@drawable/ic_close_24dp</item>
<item name="actionBarTheme">@style/Theme.Toolbar.Custom.Amoled</item>
<item name="actionBarPopupTheme">@style/ThemeOverlay.MaterialComponents</item>
<item name="switchStyle">@style/Theme.Widget.BasicSwitch</item>
<item name="toolbarNavigationButtonStyle">@style/Theme.Toolbar.Navigation</item>
<item name="preferenceTheme">@style/PreferenceThemeCustom</item>
<item name="dialogTheme">@style/Theme.AlertDialog.Amoled</item>
<item name="materialAlertDialogTheme">@style/Theme.AlertDialog.Amoled</item>
<item name="bottomSheetDialogTheme">@style/Theme.BottomSheet</item>
<item name="chipStyle">@style/Theme.Widget.Chip</item>
<item name="buttonStyle">@style/Theme.Widget.Button</item>
<item name="snackbarStyle">@style/Theme.Widget.Snackbar</item>
<item name="snackbarButtonStyle">@style/Theme.Widget.Button</item>
<item name="snackbarTextViewStyle">@style/Theme.Widget.Snackbar.TextView</item>
<item name="textAppearanceButton">@style/TextAppearance.Widget.Button</item>
<item name="textInputStyle">@style/Theme.Widget.TextInputLayout.OutlinedBox</item>
<item name="android:itemTextAppearance">@style/TextAppearance.Widget.Menu</item>
<item name="swipeRefreshLayoutProgressSpinnerBackgroundColor">?attr/colorAccent</item>
<item name="circularProgressIndicatorStyle">@style/Theme.Widget.CircularProgressIndicator</item>
<item name="linearProgressIndicatorStyle">@style/Theme.Widget.LinearProgressIndicator</item>
<!-- Material Dialogs -->
<item name="md_background_color">?attr/colorSurface</item>
<item name="md_color_title">?attr/colorOnSurface</item>
<item name="md_color_content">?attr/colorOnSurface</item>
<item name="md_color_button_text">?attr/colorAccent</item>
<item name="md_button_casing">literal</item>
<item name="md_corner_radius">@dimen/dialog_radius</item>
<!-- Custom Attributes-->
<item name="colorLibrarySelection">@color/selectorColorAmoled</item>
<item name="colorLibrarySelectionActive">@color/selectorColorAmoled</item>
<item name="colorFilterActive">@color/filterColorAmoled</item>
<!-- Some ROMs make black navbars white (e.g. OxygenOS) -->
<item name="android:navigationBarColor">#000001</item>
</style>
<!--== AMOLED theme ==-->
<style name="Theme.Tachiyomi.Amoled" parent="Theme.Base.Amoled" />
<!--== Hot Pink theme ==-->
<style name="Theme.Tachiyomi.Amoled.HotPink">
<!-- Theme colors -->
<item name="colorOnPrimary">@color/textColorPrimaryPink</item>
<item name="colorAccentOnPrimary">@color/colorAccentPink</item>
<item name="colorSecondary">@color/colorAccentPink</item>
<item name="colorOnSecondary">@color/textColorPrimaryPink</item>
<item name="colorOnSurface">@color/textColorPrimaryPink</item>
<item name="colorOnBackground">@color/textColorPrimaryPink</item>
<item name="colorAccent">@color/colorAccentPink</item>
<!-- Ripples -->
<item name="rippleSecondaryColor">@color/rippleSecondaryColorPink</item>
</style>
<!--===============-->
<!-- Reader Themes -->
<!--===============-->
<!--== Light Reader base ==-->
<style name="Theme.Base.Reader.Light" parent="Theme.Base">
<!-- Theme colors -->
<item name="colorPrimary">@color/readerColorDarkPrimary</item>
<item name="colorOnPrimary">@color/textColorPrimaryDark</item>
<item name="colorPrimaryVariant">@color/readerColorDarkPrimary</item>
<item name="colorSurface">@color/md_white_1000</item>
<!-- Base background/text colors -->
<item name="android:colorBackground">@color/md_white_1000</item>
<item name="android:statusBarColor">?attr/colorPrimaryVariant</item>
<item name="android:navigationBarColor">?attr/colorPrimaryVariant</item>
<!-- Themes -->
<item name="actionBarTheme">@style/Theme.Toolbar.Custom.Dark</item>
<item name="actionBarPopupTheme">@style/ThemeOverlay.MaterialComponents</item>
<item name="switchStyle">@style/Theme.Widget.BasicSwitch</item>
<item name="bottomSheetDialogTheme">@style/Theme.BottomSheet</item>
</style>
<!--== Light Reader ==-->
<style name="Theme.Reader.Light" parent="Theme.Base.Reader.Light" />
<!--== Dark Reader base ==-->
<style name="Theme.Base.Reader.Dark" parent="Theme.Base.Dark">
<!-- Theme colors -->
<item name="colorPrimary">@color/readerColorDarkPrimary</item>
<item name="colorOnPrimary">@color/textColorPrimaryDark</item>
<item name="colorPrimaryVariant">@color/readerColorDarkPrimary</item>
<item name="colorSurface">@color/md_black_1000</item>
<!-- Base background/text colors -->
<item name="android:colorBackground">@color/md_black_1000</item>
<item name="android:statusBarColor">?attr/colorPrimaryVariant</item>
<item name="android:navigationBarColor">?attr/colorPrimaryVariant</item>
<!-- Themes -->
<item name="actionBarTheme">@style/Theme.Toolbar.Custom.Dark</item>
<item name="actionBarPopupTheme">@style/ThemeOverlay.MaterialComponents</item>
<item name="switchStyle">@style/Theme.Widget.BasicSwitch</item>
<item name="bottomSheetDialogTheme">@style/Theme.BottomSheet</item>
</style>
<!--== Dark Reader ==-->
<style name="Theme.Reader.Dark" parent="Theme.Base.Reader.Dark" />
<!--== Dark Grey Reader ==-->
<style name="Theme.Reader.Dark.Grey" parent="Theme.Base.Reader.Dark">
<item name="android:colorBackground">@color/backgroundDark</item>
</style>
<style name="Theme.Reader.Light" parent="Theme.Base.Reader.Light" />
<!--===============-->
<!-- Launch Screen -->
<!--===============-->
<!--== Splash theme ==-->
<style name="Theme.Splash" parent="Theme.Tachiyomi.Light.Blue">
<!-- Theme colors -->
<item name="colorBackgroundSplash">@color/colorPrimary</item>
<!-- Base background/text colors -->
<item name="android:windowBackground">@drawable/splash_background</item>
<item name="android:statusBarColor">?attr/colorBackgroundSplash</item>
<item name="android:navigationBarColor">?attr/colorBackgroundSplash</item>

View file

@ -1,7 +1,7 @@
object BuildPluginsVersion {
const val AGP = "4.2.0"
const val AGP = "4.2.1"
const val KOTLIN = "1.4.32"
const val KOTLINTER = "3.4.0"
const val VERSIONS_PLUGIN = "0.38.0"
const val ABOUTLIB_PLUGIN = "8.8.5"
const val ABOUTLIB_PLUGIN = "8.8.6"
}