mirror of
https://github.com/tachiyomiorg/tachiyomi.git
synced 2024-12-22 23:01:51 +01:00
Use more Compat utilities (#5786)
* Use ActivityCompat.recreate * Use more KTX extensions * Use PackageInfoCompat.getLongVersionCode * Remove unnecessary compat usages
This commit is contained in:
parent
edcfa28b0b
commit
12a9d0575d
@ -1,6 +1,6 @@
|
|||||||
package eu.kanade.tachiyomi.data.database.resolvers
|
package eu.kanade.tachiyomi.data.database.resolvers
|
||||||
|
|
||||||
import android.content.ContentValues
|
import androidx.core.content.contentValuesOf
|
||||||
import com.pushtorefresh.storio.sqlite.StorIOSQLite
|
import com.pushtorefresh.storio.sqlite.StorIOSQLite
|
||||||
import com.pushtorefresh.storio.sqlite.operations.put.PutResolver
|
import com.pushtorefresh.storio.sqlite.operations.put.PutResolver
|
||||||
import com.pushtorefresh.storio.sqlite.operations.put.PutResult
|
import com.pushtorefresh.storio.sqlite.operations.put.PutResult
|
||||||
@ -25,7 +25,7 @@ class MangaNextUpdatedPutResolver : PutResolver<Manga>() {
|
|||||||
.whereArgs(manga.id)
|
.whereArgs(manga.id)
|
||||||
.build()
|
.build()
|
||||||
|
|
||||||
fun mapToContentValues(manga: Manga) = ContentValues(1).apply {
|
fun mapToContentValues(manga: Manga) = contentValuesOf(
|
||||||
put(MangaTable.COL_NEXT_UPDATE, manga.next_update)
|
MangaTable.COL_NEXT_UPDATE to manga.next_update
|
||||||
}
|
)
|
||||||
}
|
}
|
||||||
|
@ -14,6 +14,7 @@ import kotlinx.serialization.json.JsonArray
|
|||||||
import kotlinx.serialization.json.int
|
import kotlinx.serialization.json.int
|
||||||
import kotlinx.serialization.json.jsonObject
|
import kotlinx.serialization.json.jsonObject
|
||||||
import kotlinx.serialization.json.jsonPrimitive
|
import kotlinx.serialization.json.jsonPrimitive
|
||||||
|
import kotlinx.serialization.json.long
|
||||||
import uy.kohesive.injekt.injectLazy
|
import uy.kohesive.injekt.injectLazy
|
||||||
import java.util.Date
|
import java.util.Date
|
||||||
|
|
||||||
@ -67,7 +68,7 @@ internal class ExtensionGithubApi {
|
|||||||
val pkgName = element.jsonObject["pkg"]!!.jsonPrimitive.content
|
val pkgName = element.jsonObject["pkg"]!!.jsonPrimitive.content
|
||||||
val apkName = element.jsonObject["apk"]!!.jsonPrimitive.content
|
val apkName = element.jsonObject["apk"]!!.jsonPrimitive.content
|
||||||
val versionName = element.jsonObject["version"]!!.jsonPrimitive.content
|
val versionName = element.jsonObject["version"]!!.jsonPrimitive.content
|
||||||
val versionCode = element.jsonObject["code"]!!.jsonPrimitive.int
|
val versionCode = element.jsonObject["code"]!!.jsonPrimitive.long
|
||||||
val lang = element.jsonObject["lang"]!!.jsonPrimitive.content
|
val lang = element.jsonObject["lang"]!!.jsonPrimitive.content
|
||||||
val nsfw = element.jsonObject["nsfw"]!!.jsonPrimitive.int == 1
|
val nsfw = element.jsonObject["nsfw"]!!.jsonPrimitive.int == 1
|
||||||
val icon = "${REPO_URL_PREFIX}icon/${apkName.replace(".apk", ".png")}"
|
val icon = "${REPO_URL_PREFIX}icon/${apkName.replace(".apk", ".png")}"
|
||||||
|
@ -7,7 +7,7 @@ sealed class Extension {
|
|||||||
abstract val name: String
|
abstract val name: String
|
||||||
abstract val pkgName: String
|
abstract val pkgName: String
|
||||||
abstract val versionName: String
|
abstract val versionName: String
|
||||||
abstract val versionCode: Int
|
abstract val versionCode: Long
|
||||||
abstract val lang: String?
|
abstract val lang: String?
|
||||||
abstract val isNsfw: Boolean
|
abstract val isNsfw: Boolean
|
||||||
|
|
||||||
@ -15,7 +15,7 @@ sealed class Extension {
|
|||||||
override val name: String,
|
override val name: String,
|
||||||
override val pkgName: String,
|
override val pkgName: String,
|
||||||
override val versionName: String,
|
override val versionName: String,
|
||||||
override val versionCode: Int,
|
override val versionCode: Long,
|
||||||
override val lang: String,
|
override val lang: String,
|
||||||
override val isNsfw: Boolean,
|
override val isNsfw: Boolean,
|
||||||
val pkgFactory: String?,
|
val pkgFactory: String?,
|
||||||
@ -29,7 +29,7 @@ sealed class Extension {
|
|||||||
override val name: String,
|
override val name: String,
|
||||||
override val pkgName: String,
|
override val pkgName: String,
|
||||||
override val versionName: String,
|
override val versionName: String,
|
||||||
override val versionCode: Int,
|
override val versionCode: Long,
|
||||||
override val lang: String,
|
override val lang: String,
|
||||||
override val isNsfw: Boolean,
|
override val isNsfw: Boolean,
|
||||||
val apkName: String,
|
val apkName: String,
|
||||||
@ -40,7 +40,7 @@ sealed class Extension {
|
|||||||
override val name: String,
|
override val name: String,
|
||||||
override val pkgName: String,
|
override val pkgName: String,
|
||||||
override val versionName: String,
|
override val versionName: String,
|
||||||
override val versionCode: Int,
|
override val versionCode: Long,
|
||||||
val signatureHash: String,
|
val signatureHash: String,
|
||||||
override val lang: String? = null,
|
override val lang: String? = null,
|
||||||
override val isNsfw: Boolean = false
|
override val isNsfw: Boolean = false
|
||||||
|
@ -4,6 +4,7 @@ import android.annotation.SuppressLint
|
|||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.pm.PackageInfo
|
import android.content.pm.PackageInfo
|
||||||
import android.content.pm.PackageManager
|
import android.content.pm.PackageManager
|
||||||
|
import androidx.core.content.pm.PackageInfoCompat
|
||||||
import dalvik.system.PathClassLoader
|
import dalvik.system.PathClassLoader
|
||||||
import eu.kanade.tachiyomi.annotations.Nsfw
|
import eu.kanade.tachiyomi.annotations.Nsfw
|
||||||
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
||||||
@ -103,7 +104,7 @@ internal object ExtensionLoader {
|
|||||||
|
|
||||||
val extName = pkgManager.getApplicationLabel(appInfo).toString().substringAfter("Tachiyomi: ")
|
val extName = pkgManager.getApplicationLabel(appInfo).toString().substringAfter("Tachiyomi: ")
|
||||||
val versionName = pkgInfo.versionName
|
val versionName = pkgInfo.versionName
|
||||||
val versionCode = pkgInfo.versionCode
|
val versionCode = PackageInfoCompat.getLongVersionCode(pkgInfo)
|
||||||
|
|
||||||
if (versionName.isNullOrEmpty()) {
|
if (versionName.isNullOrEmpty()) {
|
||||||
val exception = Exception("Missing versionName for extension $extName")
|
val exception = Exception("Missing versionName for extension $extName")
|
||||||
|
@ -3,6 +3,7 @@ package eu.kanade.tachiyomi.ui.browse.source.filter
|
|||||||
import android.view.View
|
import android.view.View
|
||||||
import android.widget.CheckedTextView
|
import android.widget.CheckedTextView
|
||||||
import androidx.appcompat.content.res.AppCompatResources
|
import androidx.appcompat.content.res.AppCompatResources
|
||||||
|
import androidx.core.view.updatePadding
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import com.google.android.material.R
|
import com.google.android.material.R
|
||||||
import eu.davidea.flexibleadapter.FlexibleAdapter
|
import eu.davidea.flexibleadapter.FlexibleAdapter
|
||||||
@ -72,7 +73,7 @@ open class TriStateItem(val filter: Filter.TriState) : AbstractFlexibleItem<TriS
|
|||||||
|
|
||||||
init {
|
init {
|
||||||
// Align with native checkbox
|
// Align with native checkbox
|
||||||
text.setPadding(4.dpToPx, 0, 0, 0)
|
text.updatePadding(left = 4.dpToPx)
|
||||||
text.compoundDrawablePadding = 20.dpToPx
|
text.compoundDrawablePadding = 20.dpToPx
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,7 +9,6 @@ import android.view.MenuItem
|
|||||||
import android.view.View
|
import android.view.View
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
import androidx.appcompat.view.ActionMode
|
import androidx.appcompat.view.ActionMode
|
||||||
import androidx.core.graphics.drawable.DrawableCompat
|
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
import com.bluelinelabs.conductor.ControllerChangeHandler
|
import com.bluelinelabs.conductor.ControllerChangeHandler
|
||||||
import com.bluelinelabs.conductor.ControllerChangeType
|
import com.bluelinelabs.conductor.ControllerChangeType
|
||||||
@ -417,7 +416,7 @@ class LibraryController(
|
|||||||
// Tint icon if there's a filter active
|
// Tint icon if there's a filter active
|
||||||
if (settingsSheet.filters.hasActiveFilters()) {
|
if (settingsSheet.filters.hasActiveFilters()) {
|
||||||
val filterColor = activity!!.getResourceColor(R.attr.colorFilterActive)
|
val filterColor = activity!!.getResourceColor(R.attr.colorFilterActive)
|
||||||
DrawableCompat.setTint(filterItem.icon, filterColor)
|
filterItem.icon.setTint(filterColor)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,7 +3,6 @@ package eu.kanade.tachiyomi.ui.manga.chapter
|
|||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import androidx.core.graphics.drawable.DrawableCompat
|
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import eu.kanade.tachiyomi.R
|
import eu.kanade.tachiyomi.R
|
||||||
import eu.kanade.tachiyomi.databinding.MangaChaptersHeaderBinding
|
import eu.kanade.tachiyomi.databinding.MangaChaptersHeaderBinding
|
||||||
@ -60,7 +59,7 @@ class MangaChaptersHeaderAdapter(
|
|||||||
} else {
|
} else {
|
||||||
view.context.getResourceColor(R.attr.colorOnBackground)
|
view.context.getResourceColor(R.attr.colorOnBackground)
|
||||||
}
|
}
|
||||||
DrawableCompat.setTint(binding.btnChaptersFilter.drawable, filterColor)
|
binding.btnChaptersFilter.drawable.setTint(filterColor)
|
||||||
|
|
||||||
merge(view.clicks(), binding.btnChaptersFilter.clicks())
|
merge(view.clicks(), binding.btnChaptersFilter.clicks())
|
||||||
.onEach { controller.showSettingsSheet() }
|
.onEach { controller.showSettingsSheet() }
|
||||||
|
@ -8,7 +8,7 @@ import android.util.AttributeSet
|
|||||||
import android.view.MotionEvent
|
import android.view.MotionEvent
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewPropertyAnimator
|
import android.view.ViewPropertyAnimator
|
||||||
import androidx.core.content.ContextCompat
|
import androidx.core.graphics.withSave
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
import eu.kanade.tachiyomi.ui.reader.viewer.ViewerNavigation
|
import eu.kanade.tachiyomi.ui.reader.viewer.ViewerNavigation
|
||||||
import kotlin.math.abs
|
import kotlin.math.abs
|
||||||
@ -62,30 +62,27 @@ class ReaderNavigationOverlayView(context: Context, attributeSet: AttributeSet)
|
|||||||
navigation?.regions?.forEach { region ->
|
navigation?.regions?.forEach { region ->
|
||||||
val rect = region.rectF
|
val rect = region.rectF
|
||||||
|
|
||||||
canvas?.save()
|
canvas?.withSave {
|
||||||
|
// Scale rect from 1f,1f to screen width and height
|
||||||
// Scale rect from 1f,1f to screen width and height
|
scale(width.toFloat(), height.toFloat())
|
||||||
canvas?.scale(width.toFloat(), height.toFloat())
|
regionPaint.color = context.getColor(region.type.colorRes)
|
||||||
regionPaint.color = ContextCompat.getColor(context, region.type.colorRes)
|
drawRect(rect, regionPaint)
|
||||||
canvas?.drawRect(rect, regionPaint)
|
}
|
||||||
|
|
||||||
canvas?.restore()
|
|
||||||
// Don't want scale anymore because it messes with drawText
|
// Don't want scale anymore because it messes with drawText
|
||||||
canvas?.save()
|
canvas?.withSave {
|
||||||
|
|
||||||
// Translate origin to rect start (left, top)
|
// Translate origin to rect start (left, top)
|
||||||
canvas?.translate((width * rect.left), (height * rect.top))
|
translate((width * rect.left), (height * rect.top))
|
||||||
|
|
||||||
// Calculate center of rect width on screen
|
// Calculate center of rect width on screen
|
||||||
val x = width * (abs(rect.left - rect.right) / 2)
|
val x = width * (abs(rect.left - rect.right) / 2)
|
||||||
|
|
||||||
// Calculate center of rect height on screen
|
// Calculate center of rect height on screen
|
||||||
val y = height * (abs(rect.top - rect.bottom) / 2)
|
val y = height * (abs(rect.top - rect.bottom) / 2)
|
||||||
|
|
||||||
canvas?.drawText(context.getString(region.type.nameRes), x, y, textBorderPaint)
|
drawText(context.getString(region.type.nameRes), x, y, textBorderPaint)
|
||||||
canvas?.drawText(context.getString(region.type.nameRes), x, y, textPaint)
|
drawText(context.getString(region.type.nameRes), x, y, textPaint)
|
||||||
|
}
|
||||||
canvas?.restore()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6,6 +6,7 @@ import android.os.Looper
|
|||||||
import android.view.GestureDetector
|
import android.view.GestureDetector
|
||||||
import android.view.MotionEvent
|
import android.view.MotionEvent
|
||||||
import android.view.ViewConfiguration
|
import android.view.ViewConfiguration
|
||||||
|
import androidx.core.os.postDelayed
|
||||||
import kotlin.math.abs
|
import kotlin.math.abs
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -43,7 +44,7 @@ open class GestureDetectorWithLongTap(
|
|||||||
if (ev.downTime - lastUp > doubleTapTime) {
|
if (ev.downTime - lastUp > doubleTapTime) {
|
||||||
downX = ev.rawX
|
downX = ev.rawX
|
||||||
downY = ev.rawY
|
downY = ev.rawY
|
||||||
handler.postDelayed(longTapFn, longTapTime)
|
handler.postDelayed(longTapTime) { longTapFn }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
MotionEvent.ACTION_MOVE -> {
|
MotionEvent.ACTION_MOVE -> {
|
||||||
|
@ -16,6 +16,7 @@ import android.widget.ImageView
|
|||||||
import android.widget.LinearLayout
|
import android.widget.LinearLayout
|
||||||
import android.widget.TextView
|
import android.widget.TextView
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
|
import androidx.core.view.setMargins
|
||||||
import androidx.core.view.updateLayoutParams
|
import androidx.core.view.updateLayoutParams
|
||||||
import coil.imageLoader
|
import coil.imageLoader
|
||||||
import coil.request.CachePolicy
|
import coil.request.CachePolicy
|
||||||
@ -457,7 +458,7 @@ class PagerPageHolder(
|
|||||||
|
|
||||||
TextView(context).apply {
|
TextView(context).apply {
|
||||||
layoutParams = LinearLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT).apply {
|
layoutParams = LinearLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT).apply {
|
||||||
setMargins(margins, margins, margins, margins)
|
setMargins(margins)
|
||||||
}
|
}
|
||||||
gravity = Gravity.CENTER
|
gravity = Gravity.CENTER
|
||||||
setText(R.string.decode_image_error)
|
setText(R.string.decode_image_error)
|
||||||
@ -467,7 +468,7 @@ class PagerPageHolder(
|
|||||||
|
|
||||||
PagerButton(context, viewer).apply {
|
PagerButton(context, viewer).apply {
|
||||||
layoutParams = LayoutParams(WRAP_CONTENT, WRAP_CONTENT).apply {
|
layoutParams = LayoutParams(WRAP_CONTENT, WRAP_CONTENT).apply {
|
||||||
setMargins(margins, margins, margins, margins)
|
setMargins(margins)
|
||||||
}
|
}
|
||||||
setText(R.string.action_retry)
|
setText(R.string.action_retry)
|
||||||
setOnClickListener {
|
setOnClickListener {
|
||||||
@ -481,7 +482,7 @@ class PagerPageHolder(
|
|||||||
if (imageUrl.orEmpty().startsWith("http", true)) {
|
if (imageUrl.orEmpty().startsWith("http", true)) {
|
||||||
PagerButton(context, viewer).apply {
|
PagerButton(context, viewer).apply {
|
||||||
layoutParams = LayoutParams(WRAP_CONTENT, WRAP_CONTENT).apply {
|
layoutParams = LayoutParams(WRAP_CONTENT, WRAP_CONTENT).apply {
|
||||||
setMargins(margins, margins, margins, margins)
|
setMargins(margins)
|
||||||
}
|
}
|
||||||
setText(R.string.action_open_in_web_view)
|
setText(R.string.action_open_in_web_view)
|
||||||
setOnClickListener {
|
setOnClickListener {
|
||||||
|
@ -6,6 +6,7 @@ import android.view.MotionEvent
|
|||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import android.view.ViewGroup.LayoutParams.MATCH_PARENT
|
import android.view.ViewGroup.LayoutParams.MATCH_PARENT
|
||||||
|
import androidx.core.app.ActivityCompat
|
||||||
import androidx.core.view.isGone
|
import androidx.core.view.isGone
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
@ -139,7 +140,7 @@ class WebtoonViewer(val activity: ReaderActivity, val isContinuous: Boolean = tr
|
|||||||
}
|
}
|
||||||
|
|
||||||
config.themeChangedListener = {
|
config.themeChangedListener = {
|
||||||
activity.recreate()
|
ActivityCompat.recreate(activity)
|
||||||
}
|
}
|
||||||
|
|
||||||
config.navigationModeChangedListener = {
|
config.navigationModeChangedListener = {
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package eu.kanade.tachiyomi.ui.setting
|
package eu.kanade.tachiyomi.ui.setting
|
||||||
|
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
|
import androidx.core.app.ActivityCompat
|
||||||
import androidx.preference.PreferenceScreen
|
import androidx.preference.PreferenceScreen
|
||||||
import eu.kanade.tachiyomi.R
|
import eu.kanade.tachiyomi.R
|
||||||
import eu.kanade.tachiyomi.data.preference.asImmediateFlow
|
import eu.kanade.tachiyomi.data.preference.asImmediateFlow
|
||||||
@ -74,7 +75,7 @@ class SettingsAppearanceController : SettingsController() {
|
|||||||
defaultValue = appThemes[0].name
|
defaultValue = appThemes[0].name
|
||||||
|
|
||||||
onChange {
|
onChange {
|
||||||
activity?.recreate()
|
activity?.let { ActivityCompat.recreate(it) }
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -87,7 +88,7 @@ class SettingsAppearanceController : SettingsController() {
|
|||||||
.launchIn(viewScope)
|
.launchIn(viewScope)
|
||||||
|
|
||||||
onChange {
|
onChange {
|
||||||
activity?.recreate()
|
activity?.let { ActivityCompat.recreate(it) }
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,6 @@ package eu.kanade.tachiyomi.util.preference
|
|||||||
|
|
||||||
import androidx.annotation.StringRes
|
import androidx.annotation.StringRes
|
||||||
import androidx.appcompat.content.res.AppCompatResources
|
import androidx.appcompat.content.res.AppCompatResources
|
||||||
import androidx.core.graphics.drawable.DrawableCompat
|
|
||||||
import androidx.preference.CheckBoxPreference
|
import androidx.preference.CheckBoxPreference
|
||||||
import androidx.preference.DialogPreference
|
import androidx.preference.DialogPreference
|
||||||
import androidx.preference.EditTextPreference
|
import androidx.preference.EditTextPreference
|
||||||
@ -150,7 +149,7 @@ var Preference.summaryRes: Int
|
|||||||
var Preference.iconTint: Int
|
var Preference.iconTint: Int
|
||||||
get() = 0 // set only
|
get() = 0 // set only
|
||||||
set(value) {
|
set(value) {
|
||||||
DrawableCompat.setTint(icon, value)
|
icon.setTint(value)
|
||||||
}
|
}
|
||||||
|
|
||||||
var ListPreference.entriesRes: Array<Int>
|
var ListPreference.entriesRes: Array<Int>
|
||||||
|
@ -7,7 +7,6 @@ import android.os.Environment
|
|||||||
import android.os.StatFs
|
import android.os.StatFs
|
||||||
import androidx.core.content.ContextCompat
|
import androidx.core.content.ContextCompat
|
||||||
import androidx.core.net.toUri
|
import androidx.core.net.toUri
|
||||||
import androidx.core.os.EnvironmentCompat
|
|
||||||
import com.hippo.unifile.UniFile
|
import com.hippo.unifile.UniFile
|
||||||
import eu.kanade.tachiyomi.util.lang.Hash
|
import eu.kanade.tachiyomi.util.lang.Hash
|
||||||
import java.io.File
|
import java.io.File
|
||||||
@ -51,7 +50,7 @@ object DiskUtil {
|
|||||||
.filterNotNull()
|
.filterNotNull()
|
||||||
.mapNotNull {
|
.mapNotNull {
|
||||||
val file = File(it.absolutePath.substringBefore("/Android/"))
|
val file = File(it.absolutePath.substringBefore("/Android/"))
|
||||||
val state = EnvironmentCompat.getStorageState(file)
|
val state = Environment.getExternalStorageState(file)
|
||||||
if (state == Environment.MEDIA_MOUNTED || state == Environment.MEDIA_MOUNTED_READ_ONLY) {
|
if (state == Environment.MEDIA_MOUNTED || state == Environment.MEDIA_MOUNTED_READ_ONLY) {
|
||||||
file
|
file
|
||||||
} else {
|
} else {
|
||||||
|
@ -102,7 +102,7 @@ fun Context.copyToClipboard(label: String, content: String) {
|
|||||||
*/
|
*/
|
||||||
fun Context.notificationBuilder(channelId: String, block: (NotificationCompat.Builder.() -> Unit)? = null): NotificationCompat.Builder {
|
fun Context.notificationBuilder(channelId: String, block: (NotificationCompat.Builder.() -> Unit)? = null): NotificationCompat.Builder {
|
||||||
val builder = NotificationCompat.Builder(this, channelId)
|
val builder = NotificationCompat.Builder(this, channelId)
|
||||||
.setColor(ContextCompat.getColor(this, R.color.accent_blue))
|
.setColor(getColor(R.color.accent_blue))
|
||||||
if (block != null) {
|
if (block != null) {
|
||||||
builder.block()
|
builder.block()
|
||||||
}
|
}
|
||||||
@ -152,7 +152,7 @@ fun Context.hasPermission(permission: String) = ContextCompat.checkSelfPermissio
|
|||||||
val tv = TypedValue()
|
val tv = TypedValue()
|
||||||
return if (this.theme.resolveAttribute(attr, tv, true)) {
|
return if (this.theme.resolveAttribute(attr, tv, true)) {
|
||||||
if (tv.resourceId != 0) {
|
if (tv.resourceId != 0) {
|
||||||
ContextCompat.getColor(this, tv.resourceId)
|
getColor(tv.resourceId)
|
||||||
} else {
|
} else {
|
||||||
tv.data
|
tv.data
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,6 @@ import android.content.Context
|
|||||||
import android.content.res.Configuration
|
import android.content.res.Configuration
|
||||||
import android.graphics.Bitmap
|
import android.graphics.Bitmap
|
||||||
import android.graphics.BitmapFactory
|
import android.graphics.BitmapFactory
|
||||||
import android.graphics.Canvas
|
|
||||||
import android.graphics.Color
|
import android.graphics.Color
|
||||||
import android.graphics.Rect
|
import android.graphics.Rect
|
||||||
import android.graphics.drawable.ColorDrawable
|
import android.graphics.drawable.ColorDrawable
|
||||||
@ -12,6 +11,7 @@ import android.graphics.drawable.Drawable
|
|||||||
import android.graphics.drawable.GradientDrawable
|
import android.graphics.drawable.GradientDrawable
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import androidx.core.graphics.alpha
|
import androidx.core.graphics.alpha
|
||||||
|
import androidx.core.graphics.applyCanvas
|
||||||
import androidx.core.graphics.blue
|
import androidx.core.graphics.blue
|
||||||
import androidx.core.graphics.createBitmap
|
import androidx.core.graphics.createBitmap
|
||||||
import androidx.core.graphics.green
|
import androidx.core.graphics.green
|
||||||
@ -132,8 +132,9 @@ object ImageUtil {
|
|||||||
Side.RIGHT -> Rect(width - width / 2, 0, width, height)
|
Side.RIGHT -> Rect(width - width / 2, 0, width, height)
|
||||||
Side.LEFT -> Rect(0, 0, width / 2, height)
|
Side.LEFT -> Rect(0, 0, width / 2, height)
|
||||||
}
|
}
|
||||||
val canvas = Canvas(half)
|
half.applyCanvas {
|
||||||
canvas.drawBitmap(imageBitmap, part, singlePage, null)
|
drawBitmap(imageBitmap, part, singlePage, null)
|
||||||
|
}
|
||||||
val output = ByteArrayOutputStream()
|
val output = ByteArrayOutputStream()
|
||||||
half.compress(Bitmap.CompressFormat.JPEG, 100, output)
|
half.compress(Bitmap.CompressFormat.JPEG, 100, output)
|
||||||
|
|
||||||
@ -151,21 +152,22 @@ object ImageUtil {
|
|||||||
val width = imageBitmap.width
|
val width = imageBitmap.width
|
||||||
|
|
||||||
val result = createBitmap(width / 2, height * 2)
|
val result = createBitmap(width / 2, height * 2)
|
||||||
val canvas = Canvas(result)
|
result.applyCanvas {
|
||||||
// right -> upper
|
// right -> upper
|
||||||
val rightPart = when (upperSide) {
|
val rightPart = when (upperSide) {
|
||||||
Side.RIGHT -> Rect(width - width / 2, 0, width, height)
|
Side.RIGHT -> Rect(width - width / 2, 0, width, height)
|
||||||
Side.LEFT -> Rect(0, 0, width / 2, height)
|
Side.LEFT -> Rect(0, 0, width / 2, height)
|
||||||
|
}
|
||||||
|
val upperPart = Rect(0, 0, width / 2, height)
|
||||||
|
drawBitmap(imageBitmap, rightPart, upperPart, null)
|
||||||
|
// left -> bottom
|
||||||
|
val leftPart = when (upperSide) {
|
||||||
|
Side.LEFT -> Rect(width - width / 2, 0, width, height)
|
||||||
|
Side.RIGHT -> Rect(0, 0, width / 2, height)
|
||||||
|
}
|
||||||
|
val bottomPart = Rect(0, height, width / 2, height * 2)
|
||||||
|
drawBitmap(imageBitmap, leftPart, bottomPart, null)
|
||||||
}
|
}
|
||||||
val upperPart = Rect(0, 0, width / 2, height)
|
|
||||||
canvas.drawBitmap(imageBitmap, rightPart, upperPart, null)
|
|
||||||
// left -> bottom
|
|
||||||
val leftPart = when (upperSide) {
|
|
||||||
Side.LEFT -> Rect(width - width / 2, 0, width, height)
|
|
||||||
Side.RIGHT -> Rect(0, 0, width / 2, height)
|
|
||||||
}
|
|
||||||
val bottomPart = Rect(0, height, width / 2, height * 2)
|
|
||||||
canvas.drawBitmap(imageBitmap, leftPart, bottomPart, null)
|
|
||||||
|
|
||||||
val output = ByteArrayOutputStream()
|
val output = ByteArrayOutputStream()
|
||||||
result.compress(Bitmap.CompressFormat.JPEG, 100, output)
|
result.compress(Bitmap.CompressFormat.JPEG, 100, output)
|
||||||
|
@ -13,10 +13,10 @@ import android.view.ViewGroup
|
|||||||
import android.widget.TextView
|
import android.widget.TextView
|
||||||
import androidx.annotation.MenuRes
|
import androidx.annotation.MenuRes
|
||||||
import androidx.annotation.StringRes
|
import androidx.annotation.StringRes
|
||||||
|
import androidx.appcompat.content.res.AppCompatResources
|
||||||
import androidx.appcompat.view.menu.MenuBuilder
|
import androidx.appcompat.view.menu.MenuBuilder
|
||||||
import androidx.appcompat.widget.PopupMenu
|
import androidx.appcompat.widget.PopupMenu
|
||||||
import androidx.appcompat.widget.TooltipCompat
|
import androidx.appcompat.widget.TooltipCompat
|
||||||
import androidx.core.content.ContextCompat
|
|
||||||
import androidx.core.view.children
|
import androidx.core.view.children
|
||||||
import androidx.core.view.descendants
|
import androidx.core.view.descendants
|
||||||
import androidx.core.view.forEach
|
import androidx.core.view.forEach
|
||||||
@ -123,10 +123,10 @@ inline fun View.popupMenu(
|
|||||||
|
|
||||||
if (selectedItemId != null) {
|
if (selectedItemId != null) {
|
||||||
(popup.menu as? MenuBuilder)?.setOptionalIconsVisible(true)
|
(popup.menu as? MenuBuilder)?.setOptionalIconsVisible(true)
|
||||||
val emptyIcon = ContextCompat.getDrawable(context, R.drawable.ic_blank_24dp)
|
val emptyIcon = AppCompatResources.getDrawable(context, R.drawable.ic_blank_24dp)
|
||||||
popup.menu.forEach { item ->
|
popup.menu.forEach { item ->
|
||||||
item.icon = when (item.itemId) {
|
item.icon = when (item.itemId) {
|
||||||
selectedItemId -> ContextCompat.getDrawable(context, R.drawable.ic_check_24dp)?.mutate()?.apply {
|
selectedItemId -> AppCompatResources.getDrawable(context, R.drawable.ic_check_24dp)?.mutate()?.apply {
|
||||||
setTint(context.getResourceColor(android.R.attr.textColorPrimary))
|
setTint(context.getResourceColor(android.R.attr.textColorPrimary))
|
||||||
}
|
}
|
||||||
else -> emptyIcon
|
else -> emptyIcon
|
||||||
|
@ -7,7 +7,6 @@ import android.view.ViewGroup
|
|||||||
import androidx.annotation.AttrRes
|
import androidx.annotation.AttrRes
|
||||||
import androidx.annotation.CallSuper
|
import androidx.annotation.CallSuper
|
||||||
import androidx.appcompat.content.res.AppCompatResources
|
import androidx.appcompat.content.res.AppCompatResources
|
||||||
import androidx.core.content.ContextCompat
|
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import eu.kanade.tachiyomi.R
|
import eu.kanade.tachiyomi.R
|
||||||
@ -102,7 +101,7 @@ open class ExtendedNavigationView @JvmOverloads constructor(
|
|||||||
return when (state) {
|
return when (state) {
|
||||||
SORT_ASC -> tintVector(context, R.drawable.ic_arrow_up_white_32dp)
|
SORT_ASC -> tintVector(context, R.drawable.ic_arrow_up_white_32dp)
|
||||||
SORT_DESC -> tintVector(context, R.drawable.ic_arrow_down_white_32dp)
|
SORT_DESC -> tintVector(context, R.drawable.ic_arrow_down_white_32dp)
|
||||||
SORT_NONE -> ContextCompat.getDrawable(context, R.drawable.empty_drawable_32dp)
|
SORT_NONE -> AppCompatResources.getDrawable(context, R.drawable.empty_drawable_32dp)
|
||||||
else -> null
|
else -> null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -8,9 +8,9 @@ import android.view.LayoutInflater
|
|||||||
import android.view.MenuItem
|
import android.view.MenuItem
|
||||||
import android.widget.FrameLayout
|
import android.widget.FrameLayout
|
||||||
import androidx.annotation.ArrayRes
|
import androidx.annotation.ArrayRes
|
||||||
|
import androidx.appcompat.content.res.AppCompatResources
|
||||||
import androidx.appcompat.view.menu.MenuBuilder
|
import androidx.appcompat.view.menu.MenuBuilder
|
||||||
import androidx.appcompat.widget.PopupMenu
|
import androidx.appcompat.widget.PopupMenu
|
||||||
import androidx.core.content.ContextCompat
|
|
||||||
import androidx.core.view.forEach
|
import androidx.core.view.forEach
|
||||||
import androidx.core.view.get
|
import androidx.core.view.get
|
||||||
import com.tfcporciuncula.flow.Preference
|
import com.tfcporciuncula.flow.Preference
|
||||||
@ -38,10 +38,10 @@ class MaterialSpinnerView @JvmOverloads constructor(context: Context, attrs: Att
|
|||||||
}
|
}
|
||||||
|
|
||||||
private val emptyIcon by lazy {
|
private val emptyIcon by lazy {
|
||||||
ContextCompat.getDrawable(context, R.drawable.ic_blank_24dp)
|
AppCompatResources.getDrawable(context, R.drawable.ic_blank_24dp)
|
||||||
}
|
}
|
||||||
private val checkmarkIcon by lazy {
|
private val checkmarkIcon by lazy {
|
||||||
ContextCompat.getDrawable(context, R.drawable.ic_check_24dp)?.mutate()?.apply {
|
AppCompatResources.getDrawable(context, R.drawable.ic_check_24dp)?.mutate()?.apply {
|
||||||
setTint(context.getResourceColor(android.R.attr.textColorPrimary))
|
setTint(context.getResourceColor(android.R.attr.textColorPrimary))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -13,7 +13,6 @@ import android.widget.RadioButton
|
|||||||
import android.widget.Spinner
|
import android.widget.Spinner
|
||||||
import android.widget.TextView
|
import android.widget.TextView
|
||||||
import androidx.appcompat.widget.TintTypedArray
|
import androidx.appcompat.widget.TintTypedArray
|
||||||
import androidx.core.view.ViewCompat
|
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager
|
import androidx.recyclerview.widget.LinearLayoutManager
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import com.google.android.material.R
|
import com.google.android.material.R
|
||||||
@ -44,14 +43,10 @@ open class SimpleNavigationView @JvmOverloads constructor(
|
|||||||
R.style.Widget_Design_NavigationView
|
R.style.Widget_Design_NavigationView
|
||||||
)
|
)
|
||||||
|
|
||||||
ViewCompat.setBackground(
|
setBackground(a.getDrawable(R.styleable.NavigationView_android_background))
|
||||||
this,
|
|
||||||
a.getDrawable(R.styleable.NavigationView_android_background)
|
|
||||||
)
|
|
||||||
|
|
||||||
if (a.hasValue(R.styleable.NavigationView_elevation)) {
|
if (a.hasValue(R.styleable.NavigationView_elevation)) {
|
||||||
ViewCompat.setElevation(
|
setElevation(
|
||||||
this,
|
|
||||||
a.getDimensionPixelSize(
|
a.getDimensionPixelSize(
|
||||||
R.styleable.NavigationView_elevation,
|
R.styleable.NavigationView_elevation,
|
||||||
0
|
0
|
||||||
|
Loading…
Reference in New Issue
Block a user