Skip to content

Commit

Permalink
Merge remote-tracking branch 'j2k/master'
Browse files Browse the repository at this point in the history
# Conflicts:
#	.github/ISSUE_TEMPLATE.md
#	.github/ISSUE_TEMPLATE/feature_request.yml
#	.github/ISSUE_TEMPLATE/issue_report.yml
#	.github/workflows/build_push.yml
#	app/src/main/java/eu/kanade/tachiyomi/network/interceptor/CloudflareInterceptor.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryPresenter.kt
#	app/src/main/res/values-ar/strings.xml
#	app/src/main/res/values-pt-rBR/strings.xml
#	app/src/main/res/values-ro/strings.xml
#	app/src/main/res/values-sk/strings.xml
#	buildSrc/src/main/kotlin/Dependencies.kt
  • Loading branch information
Saud-97 committed Feb 19, 2023
2 parents ce77374 + 00e45a5 commit c1537ae
Show file tree
Hide file tree
Showing 314 changed files with 10,441 additions and 3,988 deletions.
50 changes: 38 additions & 12 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ fun runCommand(command: String): String {
return String(byteOut.toByteArray()).trim()
}

val supportedAbis = setOf("armeabi-v7a", "arm64-v8a", "x86")
val supportedAbis = setOf("armeabi-v7a", "arm64-v8a", "x86", "x86_64")

android {
compileSdk = AndroidVersions.compileSdk
Expand Down Expand Up @@ -90,6 +90,12 @@ android {

buildFeatures {
viewBinding = true
compose = true

// Disable some unused things
aidl = false
renderScript = false
shaders = false
}

flavorDimensions.add("default")
Expand All @@ -110,6 +116,10 @@ android {
checkReleaseBuilds = false
}

composeOptions {
kotlinCompilerExtensionVersion = "1.4.2"
}

compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
Expand All @@ -121,26 +131,41 @@ android {
}

dependencies {
// Compose
implementation("androidx.activity:activity-compose:1.6.1")
implementation("androidx.compose.foundation:foundation:1.3.1")
implementation("androidx.compose.animation:animation:1.3.3")
implementation("androidx.compose.ui:ui:1.3.3")
implementation("androidx.compose.material:material:1.3.1")
implementation("androidx.compose.material3:material3:1.0.1")
implementation("com.google.android.material:compose-theme-adapter-3:1.1.1")
implementation("androidx.compose.material:material-icons-extended:1.3.1")
implementation("androidx.compose.ui:ui-tooling-preview:1.3.3")
debugImplementation("androidx.compose.ui:ui-tooling:1.3.3")
implementation("com.google.accompanist:accompanist-webview:0.28.0")
implementation("androidx.glance:glance-appwidget:1.0.0-alpha03")

// Modified dependencies
implementation("com.github.jays2kings:subsampling-scale-image-view:756849e") {
exclude(module = "image-decoder")
}
implementation("com.github.tachiyomiorg:image-decoder:7481a4a")

// Android X libraries
implementation("androidx.appcompat:appcompat:1.6.0-beta01")
implementation("androidx.appcompat:appcompat:1.6.1")
implementation("androidx.cardview:cardview:1.0.0")
implementation("com.google.android.material:material:1.7.0-rc01")
implementation("androidx.webkit:webkit:1.5.0")
implementation("com.google.android.material:material:1.8.0")
implementation("androidx.webkit:webkit:1.6.0")
implementation("androidx.recyclerview:recyclerview:1.2.1")
implementation("androidx.preference:preference:1.2.0")
implementation("androidx.annotation:annotation:1.4.0")
implementation("androidx.browser:browser:1.4.0")
implementation("androidx.annotation:annotation:1.5.0")
implementation("androidx.browser:browser:1.5.0")
implementation("androidx.biometric:biometric:1.1.0")
implementation("androidx.palette:palette:1.0.0")
implementation("androidx.core:core-ktx:1.8.0")
implementation("androidx.core:core-ktx:1.9.0")
implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1")
implementation("com.google.android.flexbox:flexbox:3.0.0")
implementation("androidx.window:window:1.0.0")

implementation("androidx.constraintlayout:constraintlayout:2.1.4")

Expand All @@ -149,7 +174,7 @@ dependencies {
implementation("com.google.firebase:firebase-core:21.1.0")
implementation("com.google.firebase:firebase-analytics-ktx:21.1.0")

val lifecycleVersion = "2.4.0-rc01"
val lifecycleVersion = "2.5.1"
kapt("androidx.lifecycle:lifecycle-compiler:$lifecycleVersion")
implementation("androidx.lifecycle:lifecycle-process:$lifecycleVersion")
implementation("androidx.lifecycle:lifecycle-runtime-ktx:$lifecycleVersion")
Expand All @@ -164,11 +189,11 @@ dependencies {
implementation("com.fredporciuncula:flow-preferences:1.6.0")

// Network client
val okhttpVersion = "4.10.0"
val okhttpVersion = "5.0.0-alpha.11"
implementation("com.squareup.okhttp3:okhttp:$okhttpVersion")
implementation("com.squareup.okhttp3:logging-interceptor:$okhttpVersion")
implementation("com.squareup.okhttp3:okhttp-dnsoverhttps:$okhttpVersion")
implementation("com.squareup.okio:okio:3.0.0")
implementation("com.squareup.okio:okio:3.3.0")

// Chucker
val chuckerVersion = "3.5.2"
Expand All @@ -179,9 +204,10 @@ dependencies {
implementation(kotlin("reflect", version = AndroidVersions.kotlin))

// JSON
val kotlinSerialization = "1.3.3"
val kotlinSerialization = "1.4.0"
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:${kotlinSerialization}")
implementation("org.jetbrains.kotlinx:kotlinx-serialization-protobuf:${kotlinSerialization}")
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json-okio:${kotlinSerialization}")

// JavaScript engine
implementation("app.cash.quickjs:quickjs-android:0.9.2")
Expand All @@ -192,7 +218,7 @@ dependencies {
implementation("com.github.junrar:junrar:7.5.0")

// HTML parser
implementation("org.jsoup:jsoup:1.14.3")
implementation("org.jsoup:jsoup:1.15.3")

// Job scheduling
implementation("androidx.work:work-runtime-ktx:2.6.0")
Expand Down
34 changes: 29 additions & 5 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,26 +2,36 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">

<!-- Internet -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

<!-- Storage -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
tools:ignore="ScopedStorage" />

<!-- For background jobs -->
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />

<!-- For managing extensions -->
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES" />
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
tools:ignore="ScopedStorage" />
<uses-permission android:name="android.permission.UPDATE_PACKAGES_WITHOUT_USER_ACTION" />

<!-- To view extension packages in API 30+ -->
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"
tools:ignore="QueryAllPackagesPermission" />

<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.READ_APP_SPECIFIC_LOCALES" />

<application
android:name=".App"
android:allowBackup="true"
Expand Down Expand Up @@ -220,6 +230,20 @@
</intent-filter>
</receiver>

<receiver
android:name=".appwidget.UpdatesGridGlanceReceiver"
android:enabled="@bool/glance_appwidget_available"
android:exported="false"
android:label="@string/updates">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>

<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/updates_grid_glance_widget_info" />
</receiver>

<service
android:name=".data.library.LibraryUpdateService"
android:exported="false" />
Expand Down
3 changes: 3 additions & 0 deletions app/src/main/java/eu/kanade/tachiyomi/AppModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import eu.kanade.tachiyomi.data.library.CustomMangaManager
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.data.track.TrackManager
import eu.kanade.tachiyomi.extension.ExtensionManager
import eu.kanade.tachiyomi.network.JavaScriptEngine
import eu.kanade.tachiyomi.network.NetworkHelper
import eu.kanade.tachiyomi.source.SourceManager
import eu.kanade.tachiyomi.util.chapter.ChapterFilter
Expand All @@ -36,6 +37,8 @@ class AppModule(val app: Application) : InjektModule {

addSingletonFactory { NetworkHelper(app) }

addSingletonFactory { JavaScriptEngine(app) }

addSingletonFactory { SourceManager(app).also { get<ExtensionManager>().init(it) } }

addSingletonFactory { ExtensionManager(app) }
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package eu.kanade.tachiyomi.appwidget

import android.content.Context
import androidx.glance.appwidget.GlanceAppWidgetManager

class TachiyomiWidgetManager {

suspend fun Context.init() {
val manager = GlanceAppWidgetManager(this)
if (manager.getGlanceIds(UpdatesGridGlanceWidget::class.java).isNotEmpty()) {
UpdatesGridGlanceWidget().loadData()
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package eu.kanade.tachiyomi.appwidget

import androidx.glance.appwidget.GlanceAppWidget
import androidx.glance.appwidget.GlanceAppWidgetReceiver

class UpdatesGridGlanceReceiver : GlanceAppWidgetReceiver() {
override val glanceAppWidget: GlanceAppWidget = UpdatesGridGlanceWidget().apply { loadData() }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
package eu.kanade.tachiyomi.appwidget

import android.app.Application
import android.graphics.Bitmap
import android.os.Build
import androidx.compose.runtime.Composable
import androidx.core.graphics.drawable.toBitmap
import androidx.glance.GlanceModifier
import androidx.glance.ImageProvider
import androidx.glance.appwidget.GlanceAppWidget
import androidx.glance.appwidget.GlanceAppWidgetManager
import androidx.glance.appwidget.SizeMode
import androidx.glance.appwidget.appWidgetBackground
import androidx.glance.appwidget.updateAll
import androidx.glance.background
import androidx.glance.layout.fillMaxSize
import coil.executeBlocking
import coil.imageLoader
import coil.request.CachePolicy
import coil.request.ImageRequest
import coil.size.Precision
import coil.size.Scale
import coil.transform.RoundedCornersTransformation
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.appwidget.components.CoverHeight
import eu.kanade.tachiyomi.appwidget.components.CoverWidth
import eu.kanade.tachiyomi.appwidget.components.LockedWidget
import eu.kanade.tachiyomi.appwidget.util.appWidgetBackgroundRadius
import eu.kanade.tachiyomi.appwidget.util.calculateRowAndColumnCount
import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.ui.recents.RecentsPresenter
import eu.kanade.tachiyomi.util.system.dpToPx
import eu.kanade.tachiyomi.util.system.launchIO
import kotlinx.coroutines.MainScope
import tachiyomi.presentation.widget.components.UpdatesWidget
import uy.kohesive.injekt.injectLazy
import java.util.Calendar
import java.util.Date

class UpdatesGridGlanceWidget : GlanceAppWidget() {
private val app: Application by injectLazy()
private val preferences: PreferencesHelper by injectLazy()

private val coroutineScope = MainScope()

private var data: List<Pair<Long, Bitmap?>>? = null

override val sizeMode = SizeMode.Exact

@Composable
override fun Content() {
// If app lock enabled, don't do anything
if (preferences.useBiometrics().get()) {
LockedWidget()
return
}
UpdatesWidget(data)
}

fun loadData(list: List<Pair<Manga, Long>>? = null) {
coroutineScope.launchIO {
// Don't show anything when lock is active
if (preferences.useBiometrics().get()) {
updateAll(app)
return@launchIO
}

val manager = GlanceAppWidgetManager(app)
val ids = manager.getGlanceIds(this@UpdatesGridGlanceWidget::class.java)
if (ids.isEmpty()) return@launchIO

val (rowCount, columnCount) = ids
.flatMap { manager.getAppWidgetSizes(it) }
.maxBy { it.height.value * it.width.value }
.calculateRowAndColumnCount()
val processList = list ?: RecentsPresenter.getRecentManga(customAmount = rowCount * columnCount)

data = prepareList(processList, rowCount * columnCount)
ids.forEach { update(app, it) }
}
}

private fun prepareList(processList: List<Pair<Manga, Long>>, take: Int): List<Pair<Long, Bitmap?>> {
// Resize to cover size
val widthPx = CoverWidth.value.toInt().dpToPx
val heightPx = CoverHeight.value.toInt().dpToPx
val roundPx = app.resources.getDimension(R.dimen.appwidget_inner_radius)
return processList
// .distinctBy { it.first.id }
.sortedByDescending { it.second }
.take(take)
.map { it.first }
.map { updatesView ->
val request = ImageRequest.Builder(app)
.data(updatesView)
.memoryCachePolicy(CachePolicy.DISABLED)
.precision(Precision.EXACT)
.size(widthPx, heightPx)
.scale(Scale.FILL)
.let {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) {
it.transformations(RoundedCornersTransformation(roundPx))
} else {
it // Handled by system
}
}
.build()
Pair(updatesView.id!!, app.imageLoader.executeBlocking(request).drawable?.toBitmap())
}
}

companion object {
val DateLimit: Calendar
get() = Calendar.getInstance().apply {
time = Date()
add(Calendar.MONTH, -3)
}
}
}

val ContainerModifier = GlanceModifier
.fillMaxSize()
.background(ImageProvider(R.drawable.appwidget_background))
.appWidgetBackground()
.appWidgetBackgroundRadius()
Loading

0 comments on commit c1537ae

Please sign in to comment.