Skip to content

Commit 400e156

Browse files
committed
Do not use WorkManager in device storage
1 parent 70457b4 commit 400e156

File tree

7 files changed

+36
-29
lines changed

7 files changed

+36
-29
lines changed

core/build.gradle.kts

+1-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ tasks.clean.dependsOn("cargoClean")
6868
dependencies {
6969
val coroutinesVersion = "1.3.6"
7070
val roomVersion = "2.2.5"
71-
val workVersion = "2.3.4"
71+
val workVersion = "2.4.0-beta01"
7272

7373
api(project(":plugin"))
7474
api("androidx.fragment:fragment-ktx:1.2.4")

core/src/main/java/com/github/shadowsocks/BootReceiver.kt

+1-4
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,6 @@ import android.content.Context
2626
import android.content.Intent
2727
import android.content.pm.PackageManager
2828
import android.os.Build
29-
import android.os.UserManager
30-
import androidx.core.content.getSystemService
3129
import com.github.shadowsocks.Core.app
3230
import com.github.shadowsocks.preference.DataStore
3331

@@ -50,8 +48,7 @@ class BootReceiver : BroadcastReceiver() {
5048
val doStart = when (intent.action) {
5149
Intent.ACTION_BOOT_COMPLETED -> !DataStore.directBootAware
5250
Intent.ACTION_LOCKED_BOOT_COMPLETED -> DataStore.directBootAware
53-
else -> DataStore.directBootAware ||
54-
Build.VERSION.SDK_INT >= 24 && app.getSystemService<UserManager>()?.isUserUnlocked != false
51+
else -> DataStore.directBootAware || Build.VERSION.SDK_INT >= 24 && Core.user.isUserUnlocked
5552
}
5653
if (doStart) Core.startService()
5754
}

core/src/main/java/com/github/shadowsocks/Core.kt

+11-8
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ import androidx.annotation.VisibleForTesting
3737
import androidx.core.content.ContextCompat
3838
import androidx.core.content.getSystemService
3939
import androidx.work.Configuration
40-
import androidx.work.WorkManager
4140
import com.github.shadowsocks.acl.Acl
4241
import com.github.shadowsocks.aidl.ShadowsocksConnection
4342
import com.github.shadowsocks.core.BuildConfig
@@ -62,14 +61,15 @@ import java.io.File
6261
import java.io.IOException
6362
import kotlin.reflect.KClass
6463

65-
object Core {
64+
object Core : Configuration.Provider {
6665
lateinit var app: Application
6766
@VisibleForTesting set
6867
lateinit var configureIntent: (Context) -> PendingIntent
6968
val activity by lazy { app.getSystemService<ActivityManager>()!! }
7069
val clipboard by lazy { app.getSystemService<ClipboardManager>()!! }
7170
val connectivity by lazy { app.getSystemService<ConnectivityManager>()!! }
7271
val notification by lazy { app.getSystemService<NotificationManager>()!! }
72+
val user by lazy { app.getSystemService<UserManager>()!! }
7373
val packageInfo: PackageInfo by lazy { getPackageInfo(app.packageName) }
7474
val deviceStorage by lazy { if (Build.VERSION.SDK_INT < 24) app else DeviceStorageApp(app) }
7575
val directBootSupported by lazy {
@@ -121,14 +121,11 @@ object Core {
121121
}
122122
}
123123
})
124-
WorkManager.initialize(deviceStorage, Configuration.Builder().apply {
125-
setExecutor { GlobalScope.launch { it.run() } }
126-
setTaskExecutor { GlobalScope.launch { it.run() } }
127-
}.build())
128124

129125
// handle data restored/crash
130-
if (Build.VERSION.SDK_INT >= 24 && DataStore.directBootAware &&
131-
app.getSystemService<UserManager>()?.isUserUnlocked == true) DirectBoot.flushTrafficStats()
126+
if (Build.VERSION.SDK_INT >= 24 && DataStore.directBootAware && user.isUserUnlocked) {
127+
DirectBoot.flushTrafficStats()
128+
}
132129
if (DataStore.publicStore.getLong(Key.assetUpdateTime, -1) != packageInfo.lastUpdateTime) {
133130
val assetManager = app.assets
134131
try {
@@ -143,6 +140,12 @@ object Core {
143140
updateNotificationChannels()
144141
}
145142

143+
override fun getWorkManagerConfiguration() = Configuration.Builder().apply {
144+
setMinimumLoggingLevel(if (BuildConfig.DEBUG) Log.VERBOSE else Log.INFO)
145+
setExecutor { GlobalScope.launch { it.run() } }
146+
setTaskExecutor { GlobalScope.launch { it.run() } }
147+
}.build()
148+
146149
fun updateNotificationChannels() {
147150
if (Build.VERSION.SDK_INT >= 26) @RequiresApi(26) {
148151
notification.createNotificationChannels(listOf(

core/src/main/java/com/github/shadowsocks/acl/AclSyncer.kt

+15-10
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,10 @@
2121
package com.github.shadowsocks.acl
2222

2323
import android.content.Context
24+
import android.os.Build
2425
import androidx.work.*
2526
import com.github.shadowsocks.Core
27+
import com.github.shadowsocks.Core.app
2628
import com.github.shadowsocks.utils.useCancellable
2729
import timber.log.Timber
2830
import java.io.IOException
@@ -34,16 +36,19 @@ class AclSyncer(context: Context, workerParams: WorkerParameters) : CoroutineWor
3436
companion object {
3537
private const val KEY_ROUTE = "route"
3638

37-
fun schedule(route: String) = WorkManager.getInstance(Core.deviceStorage).enqueueUniqueWork(
38-
route, ExistingWorkPolicy.REPLACE, OneTimeWorkRequestBuilder<AclSyncer>().run {
39-
setInputData(Data.Builder().putString(KEY_ROUTE, route).build())
40-
setConstraints(Constraints.Builder()
41-
.setRequiredNetworkType(NetworkType.UNMETERED)
42-
.setRequiresCharging(true)
43-
.build())
44-
setInitialDelay(10, TimeUnit.SECONDS)
45-
build()
46-
})
39+
fun schedule(route: String) {
40+
if (Build.VERSION.SDK_INT >= 24 && !Core.user.isUserUnlocked) return // work does not support this
41+
WorkManager.getInstance(app).enqueueUniqueWork(
42+
route, ExistingWorkPolicy.REPLACE, OneTimeWorkRequestBuilder<AclSyncer>().run {
43+
setInputData(Data.Builder().putString(KEY_ROUTE, route).build())
44+
setConstraints(Constraints.Builder()
45+
.setRequiredNetworkType(NetworkType.UNMETERED)
46+
.setRequiresCharging(true)
47+
.build())
48+
setInitialDelay(10, TimeUnit.SECONDS)
49+
build()
50+
})
51+
}
4752
}
4853

4954
override suspend fun doWork(): Result = try {

core/src/main/java/com/github/shadowsocks/bg/BaseService.kt

+6-4
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,10 @@ import android.app.Service
2424
import android.content.Context
2525
import android.content.Intent
2626
import android.content.IntentFilter
27-
import android.os.*
28-
import androidx.core.content.getSystemService
27+
import android.os.Build
28+
import android.os.IBinder
29+
import android.os.RemoteCallbackList
30+
import android.os.RemoteException
2931
import com.github.shadowsocks.BootReceiver
3032
import com.github.shadowsocks.Core
3133
import com.github.shadowsocks.Core.app
@@ -238,8 +240,8 @@ object BaseService {
238240
val isVpnService get() = false
239241

240242
suspend fun startProcesses() {
241-
val configRoot = (if (Build.VERSION.SDK_INT < 24 || app.getSystemService<UserManager>()
242-
?.isUserUnlocked != false) app else Core.deviceStorage).noBackupFilesDir
243+
val context = if (Build.VERSION.SDK_INT < 24 || Core.user.isUserUnlocked) app else Core.deviceStorage
244+
val configRoot = context.noBackupFilesDir
243245
val udpFallback = data.udpFallback
244246
data.proxy!!.start(this,
245247
File(Core.deviceStorage.noBackupFilesDir, "stat_main"),

mobile/src/main/java/com/github/shadowsocks/App.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import android.app.Application
2424
import android.content.res.Configuration
2525
import androidx.appcompat.app.AppCompatDelegate
2626

27-
class App : Application() {
27+
class App : Application(), androidx.work.Configuration.Provider by Core {
2828
override fun onCreate() {
2929
super.onCreate()
3030
Core.init(this, MainActivity::class)

tv/src/main/java/com/github/shadowsocks/tv/App.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import android.app.Application
2424
import android.content.res.Configuration
2525
import com.github.shadowsocks.Core
2626

27-
class App : Application() {
27+
class App : Application(), androidx.work.Configuration.Provider by Core {
2828
override fun onCreate() {
2929
super.onCreate()
3030
Core.init(this, MainActivity::class)

0 commit comments

Comments
 (0)