Upgrade targetSdk to 34
This commit is contained in:
@@ -8,15 +8,14 @@ plugins {
|
|||||||
}
|
}
|
||||||
|
|
||||||
android {
|
android {
|
||||||
compileSdk = 33
|
compileSdk = 34
|
||||||
// compileSdkExtension = 4
|
|
||||||
buildToolsVersion = '34.0.0'
|
buildToolsVersion = '34.0.0'
|
||||||
namespace = 'org.koitharu.kotatsu'
|
namespace = 'org.koitharu.kotatsu'
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
applicationId 'org.koitharu.kotatsu'
|
applicationId 'org.koitharu.kotatsu'
|
||||||
minSdkVersion 21
|
minSdkVersion 21
|
||||||
targetSdkVersion 33
|
targetSdkVersion 34
|
||||||
versionCode 570
|
versionCode 570
|
||||||
versionName '6.0-a1'
|
versionName '6.0-a1'
|
||||||
generatedDensities = []
|
generatedDensities = []
|
||||||
|
|||||||
@@ -18,6 +18,7 @@
|
|||||||
<uses-permission android:name="android.permission.READ_SYNC_SETTINGS" />
|
<uses-permission android:name="android.permission.READ_SYNC_SETTINGS" />
|
||||||
<uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" />
|
<uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" />
|
||||||
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
|
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
|
||||||
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />
|
||||||
<uses-permission
|
<uses-permission
|
||||||
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
|
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
|
||||||
android:maxSdkVersion="29" />
|
android:maxSdkVersion="29" />
|
||||||
@@ -185,7 +186,13 @@
|
|||||||
|
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
<service android:name="org.koitharu.kotatsu.local.ui.LocalChaptersRemoveService" />
|
<service
|
||||||
|
android:name="androidx.work.impl.foreground.SystemForegroundService"
|
||||||
|
android:foregroundServiceType="dataSync"
|
||||||
|
tools:node="merge" />
|
||||||
|
<service
|
||||||
|
android:name="org.koitharu.kotatsu.local.ui.LocalChaptersRemoveService"
|
||||||
|
android:foregroundServiceType="dataSync" />
|
||||||
<service
|
<service
|
||||||
android:name="org.koitharu.kotatsu.widget.shelf.ShelfWidgetService"
|
android:name="org.koitharu.kotatsu.widget.shelf.ShelfWidgetService"
|
||||||
android:permission="android.permission.BIND_REMOTEVIEWS" />
|
android:permission="android.permission.BIND_REMOTEVIEWS" />
|
||||||
|
|||||||
@@ -83,7 +83,7 @@ fun <I> ActivityResultLauncher<I>.tryLaunch(
|
|||||||
e.printStackTraceDebug()
|
e.printStackTraceDebug()
|
||||||
}.isSuccess
|
}.isSuccess
|
||||||
|
|
||||||
fun SharedPreferences.observe() = callbackFlow<String> {
|
fun SharedPreferences.observe() = callbackFlow<String?> {
|
||||||
val listener = SharedPreferences.OnSharedPreferenceChangeListener { _, key ->
|
val listener = SharedPreferences.OnSharedPreferenceChangeListener { _, key ->
|
||||||
trySendBlocking(key)
|
trySendBlocking(key)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -98,11 +98,11 @@ class DownloadsActivity : BaseActivity<ActivityDownloadsBinding>(),
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun onPauseClick(item: DownloadItemModel) {
|
override fun onPauseClick(item: DownloadItemModel) {
|
||||||
sendBroadcast(PausingReceiver.getPauseIntent(item.id))
|
sendBroadcast(PausingReceiver.getPauseIntent(this, item.id))
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onResumeClick(item: DownloadItemModel) {
|
override fun onResumeClick(item: DownloadItemModel) {
|
||||||
sendBroadcast(PausingReceiver.getResumeIntent(item.id))
|
sendBroadcast(PausingReceiver.getResumeIntent(this, item.id))
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onSelectionChanged(controller: ListSelectionController, count: Int) {
|
override fun onSelectionChanged(controller: ListSelectionController, count: Int) {
|
||||||
|
|||||||
@@ -2,6 +2,8 @@ package org.koitharu.kotatsu.download.ui.worker
|
|||||||
|
|
||||||
import android.app.NotificationManager
|
import android.app.NotificationManager
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
|
import android.content.pm.ServiceInfo
|
||||||
|
import android.os.Build
|
||||||
import android.webkit.MimeTypeMap
|
import android.webkit.MimeTypeMap
|
||||||
import androidx.core.content.ContextCompat
|
import androidx.core.content.ContextCompat
|
||||||
import androidx.hilt.work.HiltWorker
|
import androidx.hilt.work.HiltWorker
|
||||||
@@ -130,10 +132,18 @@ class DownloadWorker @AssistedInject constructor(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override suspend fun getForegroundInfo() = ForegroundInfo(
|
override suspend fun getForegroundInfo() = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
|
||||||
id.hashCode(),
|
ForegroundInfo(
|
||||||
notificationFactory.create(lastPublishedState),
|
id.hashCode(),
|
||||||
)
|
notificationFactory.create(lastPublishedState),
|
||||||
|
ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC,
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
ForegroundInfo(
|
||||||
|
id.hashCode(),
|
||||||
|
notificationFactory.create(lastPublishedState),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
private suspend fun downloadMangaImpl(
|
private suspend fun downloadMangaImpl(
|
||||||
includedIds: LongArray?,
|
includedIds: LongArray?,
|
||||||
@@ -389,12 +399,12 @@ class DownloadWorker @AssistedInject constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun pause(id: UUID) {
|
fun pause(id: UUID) {
|
||||||
val intent = PausingReceiver.getPauseIntent(id)
|
val intent = PausingReceiver.getPauseIntent(context, id)
|
||||||
context.sendBroadcast(intent)
|
context.sendBroadcast(intent)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun resume(id: UUID) {
|
fun resume(id: UUID) {
|
||||||
val intent = PausingReceiver.getResumeIntent(id)
|
val intent = PausingReceiver.getResumeIntent(context, id)
|
||||||
context.sendBroadcast(intent)
|
context.sendBroadcast(intent)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -40,18 +40,20 @@ class PausingReceiver(
|
|||||||
addDataPath(id.toString(), PatternMatcher.PATTERN_SIMPLE_GLOB)
|
addDataPath(id.toString(), PatternMatcher.PATTERN_SIMPLE_GLOB)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getPauseIntent(id: UUID) = Intent(ACTION_PAUSE)
|
fun getPauseIntent(context: Context, id: UUID) = Intent(ACTION_PAUSE)
|
||||||
.setData(Uri.parse("$SCHEME://$id"))
|
.setData(Uri.parse("$SCHEME://$id"))
|
||||||
|
.setPackage(context.packageName)
|
||||||
.putExtra(EXTRA_UUID, id.toString())
|
.putExtra(EXTRA_UUID, id.toString())
|
||||||
|
|
||||||
fun getResumeIntent(id: UUID) = Intent(ACTION_RESUME)
|
fun getResumeIntent(context: Context, id: UUID) = Intent(ACTION_RESUME)
|
||||||
.setData(Uri.parse("$SCHEME://$id"))
|
.setData(Uri.parse("$SCHEME://$id"))
|
||||||
|
.setPackage(context.packageName)
|
||||||
.putExtra(EXTRA_UUID, id.toString())
|
.putExtra(EXTRA_UUID, id.toString())
|
||||||
|
|
||||||
fun createPausePendingIntent(context: Context, id: UUID) = PendingIntentCompat.getBroadcast(
|
fun createPausePendingIntent(context: Context, id: UUID) = PendingIntentCompat.getBroadcast(
|
||||||
context,
|
context,
|
||||||
0,
|
0,
|
||||||
getPauseIntent(id),
|
getPauseIntent(context, id),
|
||||||
0,
|
0,
|
||||||
false,
|
false,
|
||||||
)
|
)
|
||||||
@@ -59,7 +61,7 @@ class PausingReceiver(
|
|||||||
fun createResumePendingIntent(context: Context, id: UUID) = PendingIntentCompat.getBroadcast(
|
fun createResumePendingIntent(context: Context, id: UUID) = PendingIntentCompat.getBroadcast(
|
||||||
context,
|
context,
|
||||||
0,
|
0,
|
||||||
getResumeIntent(id),
|
getResumeIntent(context, id),
|
||||||
0,
|
0,
|
||||||
false,
|
false,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -3,7 +3,9 @@ package org.koitharu.kotatsu.local.ui
|
|||||||
import android.app.Notification
|
import android.app.Notification
|
||||||
import android.app.PendingIntent
|
import android.app.PendingIntent
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
|
import android.content.pm.ServiceInfo
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
|
import android.os.Build
|
||||||
import androidx.core.app.NotificationChannelCompat
|
import androidx.core.app.NotificationChannelCompat
|
||||||
import androidx.core.app.NotificationCompat
|
import androidx.core.app.NotificationCompat
|
||||||
import androidx.core.app.NotificationManagerCompat
|
import androidx.core.app.NotificationManagerCompat
|
||||||
@@ -22,6 +24,7 @@ import coil.request.ImageRequest
|
|||||||
import dagger.assisted.Assisted
|
import dagger.assisted.Assisted
|
||||||
import dagger.assisted.AssistedInject
|
import dagger.assisted.AssistedInject
|
||||||
import org.koitharu.kotatsu.R
|
import org.koitharu.kotatsu.R
|
||||||
|
import org.koitharu.kotatsu.core.util.ext.checkNotificationPermission
|
||||||
import org.koitharu.kotatsu.core.util.ext.getDisplayMessage
|
import org.koitharu.kotatsu.core.util.ext.getDisplayMessage
|
||||||
import org.koitharu.kotatsu.core.util.ext.toBitmapOrNull
|
import org.koitharu.kotatsu.core.util.ext.toBitmapOrNull
|
||||||
import org.koitharu.kotatsu.core.util.ext.toUriOrNull
|
import org.koitharu.kotatsu.core.util.ext.toUriOrNull
|
||||||
@@ -46,7 +49,7 @@ class ImportWorker @AssistedInject constructor(
|
|||||||
val result = runCatchingCancellable {
|
val result = runCatchingCancellable {
|
||||||
importer.import(uri).manga
|
importer.import(uri).manga
|
||||||
}
|
}
|
||||||
if (notificationManager.areNotificationsEnabled()) {
|
if (applicationContext.checkNotificationPermission()) {
|
||||||
val notification = buildNotification(result)
|
val notification = buildNotification(result)
|
||||||
notificationManager.notify(uri.hashCode(), notification)
|
notificationManager.notify(uri.hashCode(), notification)
|
||||||
}
|
}
|
||||||
@@ -76,7 +79,11 @@ class ImportWorker @AssistedInject constructor(
|
|||||||
.setCategory(NotificationCompat.CATEGORY_PROGRESS)
|
.setCategory(NotificationCompat.CATEGORY_PROGRESS)
|
||||||
.build()
|
.build()
|
||||||
|
|
||||||
return ForegroundInfo(FOREGROUND_NOTIFICATION_ID, notification)
|
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
|
||||||
|
ForegroundInfo(FOREGROUND_NOTIFICATION_ID, notification, ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC)
|
||||||
|
} else {
|
||||||
|
ForegroundInfo(FOREGROUND_NOTIFICATION_ID, notification)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private suspend fun buildNotification(result: kotlin.Result<Manga>): Notification {
|
private suspend fun buildNotification(result: kotlin.Result<Manga>): Notification {
|
||||||
|
|||||||
@@ -13,16 +13,17 @@ import android.util.AttributeSet
|
|||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.WindowInsets
|
import android.view.WindowInsets
|
||||||
import androidx.annotation.AttrRes
|
import androidx.annotation.AttrRes
|
||||||
|
import androidx.core.content.ContextCompat
|
||||||
import androidx.core.graphics.ColorUtils
|
import androidx.core.graphics.ColorUtils
|
||||||
import androidx.core.view.ViewCompat
|
import androidx.core.view.ViewCompat
|
||||||
import androidx.core.view.WindowInsetsCompat
|
import androidx.core.view.WindowInsetsCompat
|
||||||
import org.koitharu.kotatsu.R
|
import org.koitharu.kotatsu.R
|
||||||
import org.koitharu.kotatsu.core.util.ext.getThemeColor
|
import org.koitharu.kotatsu.core.util.ext.getThemeColor
|
||||||
import org.koitharu.kotatsu.core.util.ext.measureDimension
|
import org.koitharu.kotatsu.core.util.ext.measureDimension
|
||||||
|
import org.koitharu.kotatsu.core.util.ext.printStackTraceDebug
|
||||||
import org.koitharu.kotatsu.core.util.ext.resolveDp
|
import org.koitharu.kotatsu.core.util.ext.resolveDp
|
||||||
import org.koitharu.kotatsu.parsers.util.format
|
import org.koitharu.kotatsu.parsers.util.format
|
||||||
import org.koitharu.kotatsu.reader.ui.pager.ReaderUiState
|
import org.koitharu.kotatsu.reader.ui.pager.ReaderUiState
|
||||||
import org.koitharu.kotatsu.core.util.ext.printStackTraceDebug
|
|
||||||
import java.text.SimpleDateFormat
|
import java.text.SimpleDateFormat
|
||||||
import java.util.Date
|
import java.util.Date
|
||||||
import com.google.android.material.R as materialR
|
import com.google.android.material.R as materialR
|
||||||
@@ -111,7 +112,12 @@ class ReaderInfoBarView @JvmOverloads constructor(
|
|||||||
|
|
||||||
override fun onAttachedToWindow() {
|
override fun onAttachedToWindow() {
|
||||||
super.onAttachedToWindow()
|
super.onAttachedToWindow()
|
||||||
context.registerReceiver(timeReceiver, IntentFilter(Intent.ACTION_TIME_TICK))
|
ContextCompat.registerReceiver(
|
||||||
|
context,
|
||||||
|
timeReceiver,
|
||||||
|
IntentFilter(Intent.ACTION_TIME_TICK),
|
||||||
|
ContextCompat.RECEIVER_EXPORTED,
|
||||||
|
)
|
||||||
updateCutoutInsets(ViewCompat.getRootWindowInsets(this))
|
updateCutoutInsets(ViewCompat.getRootWindowInsets(this))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -165,7 +165,8 @@ class WebtoonScalingFrame @JvmOverloads constructor(
|
|||||||
|
|
||||||
|
|
||||||
private inner class GestureListener : GestureDetector.SimpleOnGestureListener(), Runnable {
|
private inner class GestureListener : GestureDetector.SimpleOnGestureListener(), Runnable {
|
||||||
override fun onScroll(e1: MotionEvent, e2: MotionEvent, distanceX: Float, distanceY: Float): Boolean {
|
|
||||||
|
override fun onScroll(e1: MotionEvent?, e2: MotionEvent, distanceX: Float, distanceY: Float): Boolean {
|
||||||
if (scale <= 1f) return false
|
if (scale <= 1f) return false
|
||||||
transformMatrix.postTranslate(-distanceX, -distanceY)
|
transformMatrix.postTranslate(-distanceX, -distanceY)
|
||||||
invalidateTarget()
|
invalidateTarget()
|
||||||
@@ -185,7 +186,7 @@ class WebtoonScalingFrame @JvmOverloads constructor(
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onFling(e1: MotionEvent, e2: MotionEvent, velocityX: Float, velocityY: Float): Boolean {
|
override fun onFling(e1: MotionEvent?, e2: MotionEvent, velocityX: Float, velocityY: Float): Boolean {
|
||||||
if (scale <= 1) return false
|
if (scale <= 1) return false
|
||||||
|
|
||||||
overScroller.fling(
|
overScroller.fling(
|
||||||
|
|||||||
@@ -2,6 +2,8 @@ package org.koitharu.kotatsu.suggestions.ui
|
|||||||
|
|
||||||
import android.app.PendingIntent
|
import android.app.PendingIntent
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
|
import android.content.pm.ServiceInfo
|
||||||
|
import android.os.Build
|
||||||
import androidx.annotation.FloatRange
|
import androidx.annotation.FloatRange
|
||||||
import androidx.core.app.NotificationChannelCompat
|
import androidx.core.app.NotificationChannelCompat
|
||||||
import androidx.core.app.NotificationCompat
|
import androidx.core.app.NotificationCompat
|
||||||
@@ -120,7 +122,11 @@ class SuggestionsWorker @AssistedInject constructor(
|
|||||||
.setForegroundServiceBehavior(NotificationCompat.FOREGROUND_SERVICE_DEFERRED)
|
.setForegroundServiceBehavior(NotificationCompat.FOREGROUND_SERVICE_DEFERRED)
|
||||||
.build()
|
.build()
|
||||||
|
|
||||||
return ForegroundInfo(WORKER_NOTIFICATION_ID, notification)
|
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
|
||||||
|
ForegroundInfo(WORKER_NOTIFICATION_ID, notification, ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC)
|
||||||
|
} else {
|
||||||
|
ForegroundInfo(WORKER_NOTIFICATION_ID, notification)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private suspend fun doWorkImpl(): Int {
|
private suspend fun doWorkImpl(): Int {
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package org.koitharu.kotatsu.tracker.work
|
|||||||
|
|
||||||
import android.app.PendingIntent
|
import android.app.PendingIntent
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
|
import android.content.pm.ServiceInfo
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import androidx.core.app.NotificationChannelCompat
|
import androidx.core.app.NotificationChannelCompat
|
||||||
import androidx.core.app.NotificationCompat
|
import androidx.core.app.NotificationCompat
|
||||||
@@ -258,7 +259,11 @@ class TrackWorker @AssistedInject constructor(
|
|||||||
.setSmallIcon(android.R.drawable.stat_notify_sync)
|
.setSmallIcon(android.R.drawable.stat_notify_sync)
|
||||||
.setForegroundServiceBehavior(NotificationCompat.FOREGROUND_SERVICE_DEFERRED)
|
.setForegroundServiceBehavior(NotificationCompat.FOREGROUND_SERVICE_DEFERRED)
|
||||||
.build()
|
.build()
|
||||||
return ForegroundInfo(WORKER_NOTIFICATION_ID, notification)
|
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
|
||||||
|
ForegroundInfo(WORKER_NOTIFICATION_ID, notification, ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC)
|
||||||
|
} else {
|
||||||
|
ForegroundInfo(WORKER_NOTIFICATION_ID, notification)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private suspend fun setRetryIds(ids: Set<Long>) = runInterruptible(Dispatchers.IO) {
|
private suspend fun setRetryIds(ids: Set<Long>) = runInterruptible(Dispatchers.IO) {
|
||||||
|
|||||||
Reference in New Issue
Block a user