Skip to content

Commit 0c8187d

Browse files
committed
Merge branch 'release/5.47.4'
2 parents ffa229f + 03d554a commit 0c8187d

File tree

11 files changed

+56
-46
lines changed

11 files changed

+56
-46
lines changed

app/src/androidTest/java/com/duckduckgo/app/notification/NotificationSchedulerTest.kt renamed to app/src/androidTest/java/com/duckduckgo/app/notification/AndroidNotificationSchedulerTest.kt

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import androidx.test.platform.app.InstrumentationRegistry
2222
import androidx.work.WorkInfo
2323
import androidx.work.WorkManager
2424
import com.duckduckgo.app.CoroutineTestRule
25-
import com.duckduckgo.app.notification.AndroidNotificationScheduler.*
25+
import com.duckduckgo.app.notification.NotificationScheduler.*
2626
import com.duckduckgo.app.notification.model.SchedulableNotification
2727
import com.duckduckgo.app.notification.model.SearchNotification
2828
import com.duckduckgo.app.statistics.VariantManager
@@ -39,7 +39,7 @@ import org.junit.Rule
3939
import org.junit.Test
4040
import kotlin.reflect.jvm.jvmName
4141

42-
class NotificationSchedulerTest {
42+
class AndroidNotificationSchedulerTest {
4343

4444
@ExperimentalCoroutinesApi
4545
@get:Rule
@@ -57,7 +57,7 @@ class NotificationSchedulerTest {
5757
@Before
5858
fun before() {
5959
whenever(variantManager.getVariant(any())).thenReturn(DEFAULT_VARIANT)
60-
testee = AndroidNotificationScheduler(
60+
testee = NotificationScheduler(
6161
workManager,
6262
clearNotification,
6363
privacyNotification,
@@ -67,7 +67,7 @@ class NotificationSchedulerTest {
6767

6868
@After
6969
fun resetWorkers() {
70-
workManager.cancelAllWorkByTag(AndroidNotificationScheduler.CONTINUOUS_APP_USE_REQUEST_TAG)
70+
workManager.cancelAllWorkByTag(NotificationScheduler.CONTINUOUS_APP_USE_REQUEST_TAG)
7171
}
7272

7373
@Test
@@ -141,6 +141,7 @@ class NotificationSchedulerTest {
141141
whenever(privacyNotification.canShow()).thenReturn(false)
142142
whenever(clearNotification.canShow()).thenReturn(false)
143143
whenever(searchPromptNotification.canShow()).thenReturn(true)
144+
144145
testee.scheduleNextNotification()
145146

146147
assertContinuousAppUseNotificationScheduled(SearchPromptNotificationWorker::class.jvmName)
@@ -180,14 +181,14 @@ class NotificationSchedulerTest {
180181

181182
private fun getUnusedAppScheduledWorkers(): List<WorkInfo> {
182183
return workManager
183-
.getWorkInfosByTag(AndroidNotificationScheduler.UNUSED_APP_WORK_REQUEST_TAG)
184+
.getWorkInfosByTag(NotificationScheduler.UNUSED_APP_WORK_REQUEST_TAG)
184185
.get()
185186
.filter { it.state == WorkInfo.State.ENQUEUED }
186187
}
187188

188189
private fun getContinuousAppUseScheduledWorkers(): List<WorkInfo> {
189190
return workManager
190-
.getWorkInfosByTag(AndroidNotificationScheduler.CONTINUOUS_APP_USE_REQUEST_TAG)
191+
.getWorkInfosByTag(NotificationScheduler.CONTINUOUS_APP_USE_REQUEST_TAG)
191192
.get()
192193
.filter { it.state == WorkInfo.State.ENQUEUED }
193194
}

app/src/androidTest/java/com/duckduckgo/app/settings/SettingsViewModelTest.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import com.duckduckgo.app.browser.BuildConfig
2525
import com.duckduckgo.app.browser.defaultbrowsing.DefaultBrowserDetector
2626
import com.duckduckgo.app.global.DuckDuckGoTheme
2727
import com.duckduckgo.app.icon.api.AppIcon
28-
import com.duckduckgo.app.notification.NotificationScheduler
28+
import com.duckduckgo.app.notification.AndroidNotificationScheduler
2929
import com.duckduckgo.app.settings.SettingsViewModel.Command
3030
import com.duckduckgo.app.settings.clear.ClearWhatOption.CLEAR_NONE
3131
import com.duckduckgo.app.settings.clear.ClearWhenOption.APP_EXIT_ONLY
@@ -68,7 +68,7 @@ class SettingsViewModelTest {
6868
private lateinit var mockVariantManager: VariantManager
6969

7070
@Mock
71-
private lateinit var notificationScheduler: NotificationScheduler
71+
private lateinit var notificationScheduler: AndroidNotificationScheduler
7272

7373
@Mock
7474
private lateinit var mockPixel: Pixel

app/src/main/java/com/duckduckgo/app/di/DaggerWorkerFactory.kt

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,11 @@ import androidx.work.WorkerFactory
2323
import androidx.work.WorkerParameters
2424
import com.duckduckgo.app.fire.DataClearingWorker
2525
import com.duckduckgo.app.global.view.ClearDataAction
26-
import com.duckduckgo.app.notification.AndroidNotificationScheduler.*
26+
import com.duckduckgo.app.notification.NotificationScheduler.ClearDataNotificationWorker
27+
import com.duckduckgo.app.notification.NotificationScheduler.PrivacyNotificationWorker
28+
import com.duckduckgo.app.notification.NotificationScheduler.SearchPromptNotificationWorker
29+
import com.duckduckgo.app.notification.NotificationScheduler.StickySearchNotificationWorker
30+
import com.duckduckgo.app.notification.NotificationScheduler.DismissSearchNotificationWorker
2731
import com.duckduckgo.app.notification.NotificationFactory
2832
import com.duckduckgo.app.notification.db.NotificationDao
2933
import com.duckduckgo.app.notification.model.ClearDataNotification
@@ -52,22 +56,28 @@ class DaggerWorkerFactory(
5256

5357
override fun createWorker(appContext: Context, workerClassName: String, workerParameters: WorkerParameters): ListenableWorker? {
5458

55-
val workerClass = Class.forName(workerClassName).asSubclass(ListenableWorker::class.java)
56-
val constructor = workerClass.getDeclaredConstructor(Context::class.java, WorkerParameters::class.java)
57-
val instance = constructor.newInstance(appContext, workerParameters)
59+
try {
60+
val workerClass = Class.forName(workerClassName).asSubclass(ListenableWorker::class.java)
61+
val constructor = workerClass.getDeclaredConstructor(Context::class.java, WorkerParameters::class.java)
62+
val instance = constructor.newInstance(appContext, workerParameters)
5863

59-
when (instance) {
60-
is OfflinePixelScheduler.OfflinePixelWorker -> injectOfflinePixelWorker(instance)
61-
is DataClearingWorker -> injectDataClearWorker(instance)
62-
is ClearDataNotificationWorker -> injectClearDataNotificationWorker(instance)
63-
is PrivacyNotificationWorker -> injectPrivacyNotificationWorker(instance)
64-
is SearchPromptNotificationWorker -> injectSearchPromptNotificationWorker(instance)
65-
is StickySearchNotificationWorker -> injectStickySearchNotificationWorker(instance)
66-
is DismissSearchNotificationWorker -> injectDismissSearchNotificationWorker(instance)
67-
else -> Timber.i("No injection required for worker $workerClassName")
64+
when (instance) {
65+
is OfflinePixelScheduler.OfflinePixelWorker -> injectOfflinePixelWorker(instance)
66+
is DataClearingWorker -> injectDataClearWorker(instance)
67+
is ClearDataNotificationWorker -> injectClearDataNotificationWorker(instance)
68+
is PrivacyNotificationWorker -> injectPrivacyNotificationWorker(instance)
69+
is SearchPromptNotificationWorker -> injectSearchPromptNotificationWorker(instance)
70+
is StickySearchNotificationWorker -> injectStickySearchNotificationWorker(instance)
71+
is DismissSearchNotificationWorker -> injectDismissSearchNotificationWorker(instance)
72+
else -> Timber.i("No injection required for worker $workerClassName")
73+
}
74+
75+
return instance
76+
} catch (exception: Exception){
77+
Timber.e(exception, "Worker $workerClassName could not be created")
78+
return null
6879
}
6980

70-
return instance
7181
}
7282

7383
private fun injectOfflinePixelWorker(worker: OfflinePixelScheduler.OfflinePixelWorker) {

app/src/main/java/com/duckduckgo/app/di/NotificationModule.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,9 @@ import android.content.Context
2121
import androidx.core.app.NotificationManagerCompat
2222
import androidx.localbroadcastmanager.content.LocalBroadcastManager
2323
import androidx.work.WorkManager
24-
import com.duckduckgo.app.notification.AndroidNotificationScheduler
25-
import com.duckduckgo.app.notification.NotificationFactory
2624
import com.duckduckgo.app.notification.NotificationScheduler
25+
import com.duckduckgo.app.notification.NotificationFactory
26+
import com.duckduckgo.app.notification.AndroidNotificationScheduler
2727
import com.duckduckgo.app.notification.db.NotificationDao
2828
import com.duckduckgo.app.notification.model.ClearDataNotification
2929
import com.duckduckgo.app.notification.model.PrivacyProtectionNotification
@@ -100,8 +100,8 @@ class NotificationModule {
100100
clearDataNotification: ClearDataNotification,
101101
privacyProtectionNotification: PrivacyProtectionNotification,
102102
stickySearchNotification: StickySearchNotification
103-
): NotificationScheduler {
104-
return AndroidNotificationScheduler(
103+
): AndroidNotificationScheduler {
104+
return NotificationScheduler(
105105
workManager,
106106
clearDataNotification,
107107
privacyProtectionNotification,

app/src/main/java/com/duckduckgo/app/global/DuckDuckGoApplication.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ import com.duckduckgo.app.global.shortcut.AppShortcutCreator
4141
import com.duckduckgo.app.httpsupgrade.HttpsUpgrader
4242
import com.duckduckgo.app.job.AppConfigurationSyncer
4343
import com.duckduckgo.app.notification.NotificationRegistrar
44-
import com.duckduckgo.app.notification.NotificationScheduler
44+
import com.duckduckgo.app.notification.AndroidNotificationScheduler
4545
import com.duckduckgo.app.referral.AppInstallationReferrerStateListener
4646
import com.duckduckgo.app.settings.db.SettingsDataStore
4747
import com.duckduckgo.app.statistics.AtbInitializer
@@ -129,7 +129,7 @@ open class DuckDuckGoApplication : HasActivityInjector, HasServiceInjector, HasS
129129
lateinit var dataClearer: DataClearer
130130

131131
@Inject
132-
lateinit var notificationScheduler: NotificationScheduler
132+
lateinit var notificationScheduler: AndroidNotificationScheduler
133133

134134
@Inject
135135
lateinit var workerFactory: WorkerFactory

app/src/main/java/com/duckduckgo/app/global/Theming.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ import com.duckduckgo.app.browser.R
2525
import com.duckduckgo.app.global.Theming.Constants.BROADCAST_THEME_CHANGED
2626
import com.duckduckgo.app.global.Theming.Constants.THEME_MAP
2727
import com.duckduckgo.app.settings.db.SettingsDataStore
28-
import com.duckduckgo.app.statistics.VariantManager
2928

3029
enum class DuckDuckGoTheme {
3130
DARK,
@@ -74,5 +73,9 @@ fun DuckDuckGoActivity.sendThemeChangedBroadcast() {
7473
}
7574

7675
private fun DuckDuckGoActivity.manifestThemeId(): Int {
77-
return packageManager.getActivityInfo(componentName, 0).themeResource
76+
return try {
77+
packageManager.getActivityInfo(componentName, 0).themeResource
78+
} catch (exception: Exception) {
79+
R.style.AppTheme
80+
}
7881
}

app/src/main/java/com/duckduckgo/app/global/ViewModelFactory.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,10 @@ import com.duckduckgo.app.global.install.AppInstallStore
4141
import com.duckduckgo.app.global.model.SiteFactory
4242
import com.duckduckgo.app.global.rating.AppEnjoymentPromptEmitter
4343
import com.duckduckgo.app.global.rating.AppEnjoymentUserEventRecorder
44-
import com.duckduckgo.app.icon.api.AppIconModifier
4544
import com.duckduckgo.app.icon.api.IconModifier
4645
import com.duckduckgo.app.icon.ui.ChangeIconViewModel
4746
import com.duckduckgo.app.launch.LaunchViewModel
48-
import com.duckduckgo.app.notification.NotificationScheduler
47+
import com.duckduckgo.app.notification.AndroidNotificationScheduler
4948
import com.duckduckgo.app.onboarding.store.OnboardingStore
5049
import com.duckduckgo.app.onboarding.ui.OnboardingPageManager
5150
import com.duckduckgo.app.onboarding.ui.OnboardingViewModel
@@ -112,7 +111,7 @@ class ViewModelFactory @Inject constructor(
112111
private val onboardingPageManager: OnboardingPageManager,
113112
private val appInstallationReferrerStateListener: AppInstallationReferrerStateListener,
114113
private val appIconModifier: IconModifier,
115-
private val notificationScheduler: NotificationScheduler
114+
private val notificationScheduler: AndroidNotificationScheduler
116115
) : ViewModelProvider.NewInstanceFactory() {
117116

118117
override fun <T : ViewModel> create(modelClass: Class<T>) =

app/src/main/java/com/duckduckgo/app/notification/NotificationScheduler.kt renamed to app/src/main/java/com/duckduckgo/app/notification/AndroidNotificationScheduler.kt

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,42 +17,39 @@
1717
package com.duckduckgo.app.notification
1818

1919
import android.content.Context
20-
import android.content.Intent
2120
import androidx.annotation.WorkerThread
2221
import androidx.core.app.NotificationManagerCompat
2322
import androidx.work.CoroutineWorker
2423
import androidx.work.OneTimeWorkRequest
2524
import androidx.work.OneTimeWorkRequestBuilder
2625
import androidx.work.WorkManager
2726
import androidx.work.WorkerParameters
28-
import com.duckduckgo.app.notification.NotificationHandlerService.Companion.NOTIFICATION_AUTO_CANCEL
29-
import com.duckduckgo.app.notification.NotificationHandlerService.Companion.NOTIFICATION_SYSTEM_ID_EXTRA
30-
import com.duckduckgo.app.notification.NotificationHandlerService.Companion.PIXEL_SUFFIX_EXTRA
3127
import com.duckduckgo.app.notification.db.NotificationDao
3228
import com.duckduckgo.app.notification.model.Notification
3329
import com.duckduckgo.app.notification.model.SchedulableNotification
3430
import com.duckduckgo.app.notification.model.SearchNotification
35-
import com.duckduckgo.app.notification.model.SearchPromptNotification
36-
import com.duckduckgo.app.settings.db.SettingsDataStore
3731
import com.duckduckgo.app.statistics.pixels.Pixel
3832
import com.duckduckgo.app.statistics.pixels.Pixel.PixelName.NOTIFICATION_SHOWN
3933
import timber.log.Timber
4034
import java.util.concurrent.TimeUnit
4135

36+
37+
// Please don't rename any Worker class name or class path
38+
// More information: https://craigrussell.io/2019/04/a-workmanager-pitfall-modifying-a-scheduled-worker/
4239
@WorkerThread
43-
interface NotificationScheduler {
40+
interface AndroidNotificationScheduler {
4441
suspend fun scheduleNextNotification()
4542
fun launchStickySearchNotification()
4643
fun dismissStickySearchNotification()
4744
fun launchSearchPromptNotification()
4845
}
4946

50-
class AndroidNotificationScheduler(
47+
class NotificationScheduler(
5148
private val workManager: WorkManager,
5249
private val clearDataNotification: SchedulableNotification,
5350
private val privacyNotification: SchedulableNotification,
5451
private val searchPromptNotification: SearchNotification
55-
) : NotificationScheduler {
52+
) : AndroidNotificationScheduler {
5653

5754
override suspend fun scheduleNextNotification() {
5855
scheduleInactiveUserNotifications()

app/src/main/java/com/duckduckgo/app/notification/NotificationHandlerService.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ class NotificationHandlerService : IntentService("NotificationHandlerService") {
5454
lateinit var notificationManager: NotificationManagerCompat
5555

5656
@Inject
57-
lateinit var notificationScheduler: NotificationScheduler
57+
lateinit var notificationScheduler: AndroidNotificationScheduler
5858

5959
@Inject
6060
lateinit var settingsDataStore: SettingsDataStore

app/src/main/java/com/duckduckgo/app/settings/SettingsViewModel.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import com.duckduckgo.app.browser.defaultbrowsing.DefaultBrowserDetector
2323
import com.duckduckgo.app.global.DuckDuckGoTheme
2424
import com.duckduckgo.app.global.SingleLiveEvent
2525
import com.duckduckgo.app.icon.api.AppIcon
26-
import com.duckduckgo.app.notification.NotificationScheduler
26+
import com.duckduckgo.app.notification.AndroidNotificationScheduler
2727
import com.duckduckgo.app.settings.clear.ClearWhatOption
2828
import com.duckduckgo.app.settings.clear.ClearWhenOption
2929
import com.duckduckgo.app.settings.db.SettingsDataStore
@@ -40,7 +40,7 @@ class SettingsViewModel @Inject constructor(
4040
private val defaultWebBrowserCapability: DefaultBrowserDetector,
4141
private val variantManager: VariantManager,
4242
private val pixel: Pixel,
43-
private val notificationScheduler: NotificationScheduler
43+
private val notificationScheduler: AndroidNotificationScheduler
4444
) : ViewModel() {
4545

4646
data class ViewState(

0 commit comments

Comments
 (0)