Skip to content

Commit 0aa90fa

Browse files
authored
Merge pull request #69 from infinum/fix/investigate-initializer-errors
Fix: Investigate initializer errors
2 parents 3527381 + bbd0d8a commit 0aa90fa

File tree

7 files changed

+91
-48
lines changed

7 files changed

+91
-48
lines changed

sentinel/src/main/AndroidManifest.xml

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@
1313
android:name=".ui.main.SentinelActivity"
1414
android:exported="true"
1515
android:label="@string/sentinel_name"
16+
android:permission="com.infinum.sentinel.permission.ACCESS_SENTINEL"
1617
android:taskAffinity="com.infinum.sentinel"
17-
android:theme="@style/Sentinel.Theme"
18-
android:permission="com.infinum.sentinel.permission.ACCESS_SENTINEL">
19-
<meta-data
18+
android:theme="@style/Sentinel.Theme">
19+
<meta-data
2020
android:name="@string/sentinel_infinum_monitored"
2121
android:value="false" />
2222
</activity>
@@ -119,17 +119,6 @@
119119
android:value="androidx.startup" />
120120
</provider>
121121

122-
<provider
123-
android:name="androidx.startup.InitializationProvider"
124-
android:authorities="${applicationId}.androidx-startup"
125-
android:exported="false"
126-
tools:node="merge">
127-
<meta-data
128-
android:name="androidx.work.WorkManagerInitializer"
129-
android:value="androidx.startup"
130-
tools:node="remove" />
131-
</provider>
132-
133122
</application>
134123

135124
</manifest>

sentinel/src/main/kotlin/com/infinum/sentinel/di/LibraryComponents.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ internal object LibraryComponents {
4242
tools.filterIsInstance<CertificateTool>().firstOrNull()?.userCertificates.orEmpty(),
4343
onTriggered
4444
)
45+
WorkManagerInitializer.init(domainComponent)
4546
domainComponent.setup()
4647
}
4748

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.infinum.sentinel.di
2+
3+
import com.infinum.sentinel.di.component.DomainComponent
4+
import com.infinum.sentinel.ui.certificates.observer.CertificateCheckWorker
5+
import com.infinum.sentinel.ui.certificates.observer.DelegateWorker
6+
import com.infinum.sentinel.ui.certificates.observer.SentinelWorkerFactory
7+
8+
internal object WorkManagerInitializer {
9+
10+
fun init(domainComponent: DomainComponent) {
11+
DelegateWorker.workerFactories[CertificateCheckWorker.NAME] =
12+
SentinelWorkerFactory(domainComponent.collectors, domainComponent.notificationFactory)
13+
}
14+
}

sentinel/src/main/kotlin/com/infinum/sentinel/di/component/DomainComponent.kt

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@ import com.infinum.sentinel.ui.bundles.callbacks.BundleMonitorNotificationCallba
5050
import com.infinum.sentinel.ui.bundles.details.BundleDetailsActivity
5151
import com.infinum.sentinel.ui.certificates.observer.CertificatesObserver
5252
import com.infinum.sentinel.ui.certificates.observer.SentinelWorkManager
53-
import com.infinum.sentinel.ui.certificates.observer.SentinelWorkerFactory
5453
import com.infinum.sentinel.ui.crash.anr.SentinelAnrObserver
5554
import com.infinum.sentinel.ui.crash.anr.SentinelAnrObserverRunnable
5655
import com.infinum.sentinel.ui.crash.anr.SentinelUiAnrObserver
@@ -91,8 +90,6 @@ internal abstract class DomainComponent(
9190

9291
abstract val sentinelAnrObserver: SentinelAnrObserver
9392

94-
abstract val sentinelWorkerFactory: SentinelWorkerFactory
95-
9693
abstract val sentinelWorkManager: SentinelWorkManager
9794

9895
abstract val sentinelAnrObserverRunnable: SentinelAnrObserverRunnable
@@ -157,15 +154,10 @@ internal abstract class DomainComponent(
157154
fun sentinelAnrObserverRunnable(dao: CrashesDao): SentinelAnrObserverRunnable =
158155
SentinelAnrObserverRunnable(context, notificationFactory, dao)
159156

160-
@Provides
161-
@DomainScope
162-
fun sentinelWorkerFactory(): SentinelWorkerFactory =
163-
SentinelWorkerFactory(collectors, notificationFactory)
164-
165157
@Provides
166158
@DomainScope
167159
fun sentinelWorkManager(): SentinelWorkManager =
168-
SentinelWorkManager(context, sentinelWorkerFactory)
160+
SentinelWorkManager(context)
169161

170162
@Provides
171163
@DomainScope
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package com.infinum.sentinel.ui.certificates.observer
2+
3+
import android.content.Context
4+
import androidx.annotation.UiThread
5+
import androidx.work.ListenableWorker
6+
import androidx.work.WorkerFactory
7+
import androidx.work.WorkerParameters
8+
import com.google.common.util.concurrent.ListenableFuture
9+
import com.infinum.sentinel.ui.shared.Constants.Keys.WORKER_CLASS_NAME
10+
import com.infinum.sentinel.ui.shared.Constants.Keys.WORKER_ID
11+
12+
/**
13+
* A worker to delegate work requests from within the library to workers
14+
* that require factories with custom dependencies.
15+
*/
16+
internal class DelegateWorker(
17+
appContext: Context,
18+
parameters: WorkerParameters,
19+
) : ListenableWorker(appContext, parameters) {
20+
21+
private val workerClassName =
22+
parameters.inputData.getString(WORKER_CLASS_NAME) ?: ""
23+
private val workerId = parameters.inputData.getString(WORKER_ID)
24+
private val delegateWorkerFactory = workerFactories[workerId]
25+
private val delegatedWorker = delegateWorkerFactory?.createWorker(appContext, workerClassName, parameters)
26+
27+
override fun startWork(): ListenableFuture<Result> {
28+
return if (delegatedWorker != null) {
29+
delegatedWorker.startWork()
30+
} else {
31+
val errorMessage = "No delegateWorker available for $workerId" +
32+
" with workerClassName of $workerClassName. Is the " +
33+
"DelegateWorker.workerFactories populated correctly?"
34+
throw IllegalStateException(errorMessage)
35+
}
36+
}
37+
38+
companion object {
39+
const val DELEGATE_WORKER_ID = "com.infinum.sentinel.ui.certificates.observer.CertificateCheckWorker"
40+
41+
val workerFactories = object : AbstractMutableMap<String, WorkerFactory>() {
42+
43+
private val backingWorkerMap = mutableMapOf<String, WorkerFactory>()
44+
45+
@UiThread
46+
override fun put(key: String, value: WorkerFactory): WorkerFactory? {
47+
return backingWorkerMap.put(key, value)
48+
}
49+
50+
override val entries: MutableSet<MutableMap.MutableEntry<String, WorkerFactory>>
51+
get() = backingWorkerMap.entries
52+
}
53+
}
54+
}

sentinel/src/main/kotlin/com/infinum/sentinel/ui/certificates/observer/SentinelWorkManager.kt

Lines changed: 16 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,21 @@ import android.content.Context
44
import android.os.Build
55
import androidx.annotation.RequiresApi
66
import androidx.lifecycle.asFlow
7-
import androidx.work.Configuration
87
import androidx.work.Constraints
98
import androidx.work.ExistingPeriodicWorkPolicy
109
import androidx.work.NetworkType
1110
import androidx.work.PeriodicWorkRequestBuilder
1211
import androidx.work.WorkInfo
1312
import androidx.work.WorkManager
14-
import androidx.work.WorkerFactory
1513
import androidx.work.workDataOf
1614
import com.infinum.sentinel.BuildConfig
1715
import com.infinum.sentinel.data.models.local.CertificateMonitorEntity
1816
import com.infinum.sentinel.ui.shared.Constants.Keys.EXPIRE_IN_AMOUNT
1917
import com.infinum.sentinel.ui.shared.Constants.Keys.EXPIRE_IN_UNIT
2018
import com.infinum.sentinel.ui.shared.Constants.Keys.NOTIFY_INVALID_NOW
2119
import com.infinum.sentinel.ui.shared.Constants.Keys.NOTIFY_TO_EXPIRE
20+
import com.infinum.sentinel.ui.shared.Constants.Keys.WORKER_CLASS_NAME
21+
import com.infinum.sentinel.ui.shared.Constants.Keys.WORKER_ID
2222
import java.time.Duration
2323
import kotlinx.coroutines.flow.Flow
2424
import kotlinx.coroutines.flow.flowOf
@@ -28,44 +28,34 @@ import me.tatarka.inject.annotations.Inject
2828
@Inject
2929
internal class SentinelWorkManager(
3030
private val context: Context,
31-
private val workerFactory: WorkerFactory
3231
) {
3332

3433
companion object {
3534
private const val DEBUG_INTERVAL = 15L
3635
private const val RELEASE_INTERVAL = 1440L
3736
}
3837

39-
init {
40-
WorkManager.initialize(
41-
context,
42-
Configuration.Builder()
43-
.setMinimumLoggingLevel(android.util.Log.INFO)
44-
.setWorkerFactory(workerFactory)
45-
.build()
46-
)
47-
}
48-
4938
@RequiresApi(Build.VERSION_CODES.O)
50-
fun startCertificatesCheck(entity: CertificateMonitorEntity) =
39+
fun startCertificatesCheck(entity: CertificateMonitorEntity) {
40+
41+
val delegatedWorkData = workDataOf(
42+
WORKER_CLASS_NAME to CertificateCheckWorker::class.qualifiedName,
43+
WORKER_ID to CertificateCheckWorker.NAME,
44+
NOTIFY_INVALID_NOW to entity.notifyInvalidNow,
45+
NOTIFY_TO_EXPIRE to entity.notifyToExpire,
46+
EXPIRE_IN_AMOUNT to entity.expireInAmount,
47+
EXPIRE_IN_UNIT to entity.expireInUnit.name
48+
)
5149
WorkManager.getInstance(context)
5250
.enqueueUniquePeriodicWork(
53-
CertificateCheckWorker.NAME,
51+
DelegateWorker.DELEGATE_WORKER_ID,
5452
ExistingPeriodicWorkPolicy.CANCEL_AND_REENQUEUE,
55-
PeriodicWorkRequestBuilder<CertificateCheckWorker>(
53+
PeriodicWorkRequestBuilder<DelegateWorker>(
5654
when (BuildConfig.DEBUG) {
5755
true -> Duration.ofMinutes(DEBUG_INTERVAL)
5856
false -> Duration.ofMinutes(RELEASE_INTERVAL)
5957
}
60-
)
61-
.setInputData(
62-
workDataOf(
63-
NOTIFY_INVALID_NOW to entity.notifyInvalidNow,
64-
NOTIFY_TO_EXPIRE to entity.notifyToExpire,
65-
EXPIRE_IN_AMOUNT to entity.expireInAmount,
66-
EXPIRE_IN_UNIT to entity.expireInUnit.name
67-
)
68-
)
58+
).setInputData(delegatedWorkData)
6959
.setConstraints(
7060
Constraints.Builder()
7161
.setRequiredNetworkType(NetworkType.NOT_REQUIRED)
@@ -80,6 +70,7 @@ internal class SentinelWorkManager(
8070
)
8171
.build()
8272
)
73+
}
8374

8475
fun certificatesCheckState(): Flow<Boolean> =
8576
WorkManager.getInstance(context)

sentinel/src/main/kotlin/com/infinum/sentinel/ui/shared/Constants.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,7 @@ internal object Constants {
1414
const val NOTIFY_TO_EXPIRE: String = "KEY_NOTIFY_TO_EXPIRE"
1515
const val EXPIRE_IN_AMOUNT: String = "KEY_EXPIRE_IN_AMOUNT"
1616
const val EXPIRE_IN_UNIT: String = "KEY_EXPIRE_IN_UNIT"
17+
const val WORKER_CLASS_NAME = "WORKER_CLASS_NAME"
18+
const val WORKER_ID = "WORKER_ID"
1719
}
1820
}

0 commit comments

Comments
 (0)