Commit 400e1568 authored by Mygod's avatar Mygod

Do not use WorkManager in device storage

parent 70457b42
...@@ -68,7 +68,7 @@ tasks.clean.dependsOn("cargoClean") ...@@ -68,7 +68,7 @@ tasks.clean.dependsOn("cargoClean")
dependencies { dependencies {
val coroutinesVersion = "1.3.6" val coroutinesVersion = "1.3.6"
val roomVersion = "2.2.5" val roomVersion = "2.2.5"
val workVersion = "2.3.4" val workVersion = "2.4.0-beta01"
api(project(":plugin")) api(project(":plugin"))
api("androidx.fragment:fragment-ktx:1.2.4") api("androidx.fragment:fragment-ktx:1.2.4")
......
...@@ -26,8 +26,6 @@ import android.content.Context ...@@ -26,8 +26,6 @@ import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.pm.PackageManager import android.content.pm.PackageManager
import android.os.Build import android.os.Build
import android.os.UserManager
import androidx.core.content.getSystemService
import com.github.shadowsocks.Core.app import com.github.shadowsocks.Core.app
import com.github.shadowsocks.preference.DataStore import com.github.shadowsocks.preference.DataStore
...@@ -50,8 +48,7 @@ class BootReceiver : BroadcastReceiver() { ...@@ -50,8 +48,7 @@ class BootReceiver : BroadcastReceiver() {
val doStart = when (intent.action) { val doStart = when (intent.action) {
Intent.ACTION_BOOT_COMPLETED -> !DataStore.directBootAware Intent.ACTION_BOOT_COMPLETED -> !DataStore.directBootAware
Intent.ACTION_LOCKED_BOOT_COMPLETED -> DataStore.directBootAware Intent.ACTION_LOCKED_BOOT_COMPLETED -> DataStore.directBootAware
else -> DataStore.directBootAware || else -> DataStore.directBootAware || Build.VERSION.SDK_INT >= 24 && Core.user.isUserUnlocked
Build.VERSION.SDK_INT >= 24 && app.getSystemService<UserManager>()?.isUserUnlocked != false
} }
if (doStart) Core.startService() if (doStart) Core.startService()
} }
......
...@@ -37,7 +37,6 @@ import androidx.annotation.VisibleForTesting ...@@ -37,7 +37,6 @@ import androidx.annotation.VisibleForTesting
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.core.content.getSystemService import androidx.core.content.getSystemService
import androidx.work.Configuration import androidx.work.Configuration
import androidx.work.WorkManager
import com.github.shadowsocks.acl.Acl import com.github.shadowsocks.acl.Acl
import com.github.shadowsocks.aidl.ShadowsocksConnection import com.github.shadowsocks.aidl.ShadowsocksConnection
import com.github.shadowsocks.core.BuildConfig import com.github.shadowsocks.core.BuildConfig
...@@ -62,7 +61,7 @@ import java.io.File ...@@ -62,7 +61,7 @@ import java.io.File
import java.io.IOException import java.io.IOException
import kotlin.reflect.KClass import kotlin.reflect.KClass
object Core { object Core : Configuration.Provider {
lateinit var app: Application lateinit var app: Application
@VisibleForTesting set @VisibleForTesting set
lateinit var configureIntent: (Context) -> PendingIntent lateinit var configureIntent: (Context) -> PendingIntent
...@@ -70,6 +69,7 @@ object Core { ...@@ -70,6 +69,7 @@ object Core {
val clipboard by lazy { app.getSystemService<ClipboardManager>()!! } val clipboard by lazy { app.getSystemService<ClipboardManager>()!! }
val connectivity by lazy { app.getSystemService<ConnectivityManager>()!! } val connectivity by lazy { app.getSystemService<ConnectivityManager>()!! }
val notification by lazy { app.getSystemService<NotificationManager>()!! } val notification by lazy { app.getSystemService<NotificationManager>()!! }
val user by lazy { app.getSystemService<UserManager>()!! }
val packageInfo: PackageInfo by lazy { getPackageInfo(app.packageName) } val packageInfo: PackageInfo by lazy { getPackageInfo(app.packageName) }
val deviceStorage by lazy { if (Build.VERSION.SDK_INT < 24) app else DeviceStorageApp(app) } val deviceStorage by lazy { if (Build.VERSION.SDK_INT < 24) app else DeviceStorageApp(app) }
val directBootSupported by lazy { val directBootSupported by lazy {
...@@ -121,14 +121,11 @@ object Core { ...@@ -121,14 +121,11 @@ object Core {
} }
} }
}) })
WorkManager.initialize(deviceStorage, Configuration.Builder().apply {
setExecutor { GlobalScope.launch { it.run() } }
setTaskExecutor { GlobalScope.launch { it.run() } }
}.build())
// handle data restored/crash // handle data restored/crash
if (Build.VERSION.SDK_INT >= 24 && DataStore.directBootAware && if (Build.VERSION.SDK_INT >= 24 && DataStore.directBootAware && user.isUserUnlocked) {
app.getSystemService<UserManager>()?.isUserUnlocked == true) DirectBoot.flushTrafficStats() DirectBoot.flushTrafficStats()
}
if (DataStore.publicStore.getLong(Key.assetUpdateTime, -1) != packageInfo.lastUpdateTime) { if (DataStore.publicStore.getLong(Key.assetUpdateTime, -1) != packageInfo.lastUpdateTime) {
val assetManager = app.assets val assetManager = app.assets
try { try {
...@@ -143,6 +140,12 @@ object Core { ...@@ -143,6 +140,12 @@ object Core {
updateNotificationChannels() updateNotificationChannels()
} }
override fun getWorkManagerConfiguration() = Configuration.Builder().apply {
setMinimumLoggingLevel(if (BuildConfig.DEBUG) Log.VERBOSE else Log.INFO)
setExecutor { GlobalScope.launch { it.run() } }
setTaskExecutor { GlobalScope.launch { it.run() } }
}.build()
fun updateNotificationChannels() { fun updateNotificationChannels() {
if (Build.VERSION.SDK_INT >= 26) @RequiresApi(26) { if (Build.VERSION.SDK_INT >= 26) @RequiresApi(26) {
notification.createNotificationChannels(listOf( notification.createNotificationChannels(listOf(
......
...@@ -21,8 +21,10 @@ ...@@ -21,8 +21,10 @@
package com.github.shadowsocks.acl package com.github.shadowsocks.acl
import android.content.Context import android.content.Context
import android.os.Build
import androidx.work.* import androidx.work.*
import com.github.shadowsocks.Core import com.github.shadowsocks.Core
import com.github.shadowsocks.Core.app
import com.github.shadowsocks.utils.useCancellable import com.github.shadowsocks.utils.useCancellable
import timber.log.Timber import timber.log.Timber
import java.io.IOException import java.io.IOException
...@@ -34,7 +36,9 @@ class AclSyncer(context: Context, workerParams: WorkerParameters) : CoroutineWor ...@@ -34,7 +36,9 @@ class AclSyncer(context: Context, workerParams: WorkerParameters) : CoroutineWor
companion object { companion object {
private const val KEY_ROUTE = "route" private const val KEY_ROUTE = "route"
fun schedule(route: String) = WorkManager.getInstance(Core.deviceStorage).enqueueUniqueWork( fun schedule(route: String) {
if (Build.VERSION.SDK_INT >= 24 && !Core.user.isUserUnlocked) return // work does not support this
WorkManager.getInstance(app).enqueueUniqueWork(
route, ExistingWorkPolicy.REPLACE, OneTimeWorkRequestBuilder<AclSyncer>().run { route, ExistingWorkPolicy.REPLACE, OneTimeWorkRequestBuilder<AclSyncer>().run {
setInputData(Data.Builder().putString(KEY_ROUTE, route).build()) setInputData(Data.Builder().putString(KEY_ROUTE, route).build())
setConstraints(Constraints.Builder() setConstraints(Constraints.Builder()
...@@ -45,6 +49,7 @@ class AclSyncer(context: Context, workerParams: WorkerParameters) : CoroutineWor ...@@ -45,6 +49,7 @@ class AclSyncer(context: Context, workerParams: WorkerParameters) : CoroutineWor
build() build()
}) })
} }
}
override suspend fun doWork(): Result = try { override suspend fun doWork(): Result = try {
val route = inputData.getString(KEY_ROUTE)!! val route = inputData.getString(KEY_ROUTE)!!
......
...@@ -24,8 +24,10 @@ import android.app.Service ...@@ -24,8 +24,10 @@ import android.app.Service
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.IntentFilter import android.content.IntentFilter
import android.os.* import android.os.Build
import androidx.core.content.getSystemService import android.os.IBinder
import android.os.RemoteCallbackList
import android.os.RemoteException
import com.github.shadowsocks.BootReceiver import com.github.shadowsocks.BootReceiver
import com.github.shadowsocks.Core import com.github.shadowsocks.Core
import com.github.shadowsocks.Core.app import com.github.shadowsocks.Core.app
...@@ -238,8 +240,8 @@ object BaseService { ...@@ -238,8 +240,8 @@ object BaseService {
val isVpnService get() = false val isVpnService get() = false
suspend fun startProcesses() { suspend fun startProcesses() {
val configRoot = (if (Build.VERSION.SDK_INT < 24 || app.getSystemService<UserManager>() val context = if (Build.VERSION.SDK_INT < 24 || Core.user.isUserUnlocked) app else Core.deviceStorage
?.isUserUnlocked != false) app else Core.deviceStorage).noBackupFilesDir val configRoot = context.noBackupFilesDir
val udpFallback = data.udpFallback val udpFallback = data.udpFallback
data.proxy!!.start(this, data.proxy!!.start(this,
File(Core.deviceStorage.noBackupFilesDir, "stat_main"), File(Core.deviceStorage.noBackupFilesDir, "stat_main"),
......
...@@ -24,7 +24,7 @@ import android.app.Application ...@@ -24,7 +24,7 @@ import android.app.Application
import android.content.res.Configuration import android.content.res.Configuration
import androidx.appcompat.app.AppCompatDelegate import androidx.appcompat.app.AppCompatDelegate
class App : Application() { class App : Application(), androidx.work.Configuration.Provider by Core {
override fun onCreate() { override fun onCreate() {
super.onCreate() super.onCreate()
Core.init(this, MainActivity::class) Core.init(this, MainActivity::class)
......
...@@ -24,7 +24,7 @@ import android.app.Application ...@@ -24,7 +24,7 @@ import android.app.Application
import android.content.res.Configuration import android.content.res.Configuration
import com.github.shadowsocks.Core import com.github.shadowsocks.Core
class App : Application() { class App : Application(), androidx.work.Configuration.Provider by Core {
override fun onCreate() { override fun onCreate() {
super.onCreate() super.onCreate()
Core.init(this, MainActivity::class) Core.init(this, MainActivity::class)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment