Skip to content

Commit efad5b3

Browse files
committed
Merge remote-tracking branch 'firefox-android/fenix/139.0.3' into iceraven
2 parents 2c8a78d + 9ef0921 commit efad5b3

File tree

8 files changed

+138
-30
lines changed

8 files changed

+138
-30
lines changed

app/src/main/java/org/mozilla/fenix/FenixApplication.kt

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ import kotlinx.coroutines.launch
3030
import mozilla.appservices.Megazord
3131
import mozilla.appservices.autofill.AutofillApiException
3232
import mozilla.components.browser.state.action.SystemAction
33-
import mozilla.components.browser.state.action.TranslationsAction
3433
import mozilla.components.browser.state.selector.selectedTab
3534
import mozilla.components.browser.state.state.searchEngines
3635
import mozilla.components.browser.state.state.selectedOrDefaultSearchEngine
@@ -426,12 +425,6 @@ open class FenixApplication : LocaleAwareApplication(), Provider {
426425
}
427426
}
428427

429-
fun queueInitializingTranslations() {
430-
queue.runIfReadyOrQueue {
431-
components.core.store.dispatch(TranslationsAction.InitTranslationsBrowserState)
432-
}
433-
}
434-
435428
@OptIn(DelicateCoroutinesApi::class) // GlobalScope usage
436429
fun queueSuggestIngest() {
437430
queue.runIfReadyOrQueue {
@@ -451,7 +444,6 @@ open class FenixApplication : LocaleAwareApplication(), Provider {
451444
queueRestoreLocale()
452445
queueStorageMaintenance()
453446
queueNimbusFetchInForeground()
454-
queueInitializingTranslations()
455447
if (settings().enableFxSuggest) {
456448
queueSuggestIngest()
457449
}

app/src/main/java/org/mozilla/fenix/home/intent/HomeDeepLinkIntentProcessor.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,14 @@ import org.mozilla.fenix.NavGraphDirections
2323
import org.mozilla.fenix.browser.browsingmode.BrowsingMode
2424
import org.mozilla.fenix.ext.alreadyOnDestination
2525
import org.mozilla.fenix.ext.openSetDefaultBrowserOption
26-
import org.mozilla.fenix.utils.showAddSearchWidgetPrompt
26+
import org.mozilla.fenix.utils.maybeShowAddSearchWidgetPrompt
2727

2828
/**
2929
* Deep links in the form of `fenix://host` open different parts of the app.
3030
*/
3131
class HomeDeepLinkIntentProcessor(
3232
private val activity: HomeActivity,
33-
private val showAddSearchWidgetPrompt: (Activity) -> Unit = ::showAddSearchWidgetPrompt,
33+
private val showAddSearchWidgetPrompt: (Activity) -> Unit = ::maybeShowAddSearchWidgetPrompt,
3434
) : HomeIntentProcessor {
3535
private val logger = Logger("DeepLinkIntentProcessor")
3636

app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlController.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ import org.mozilla.fenix.messaging.MessageController
6969
import org.mozilla.fenix.onboarding.WallpaperOnboardingDialogFragment.Companion.THUMBNAILS_SELECTION_COUNT
7070
import org.mozilla.fenix.settings.SupportUtils
7171
import org.mozilla.fenix.utils.Settings
72-
import org.mozilla.fenix.utils.showAddSearchWidgetPrompt
72+
import org.mozilla.fenix.utils.maybeShowAddSearchWidgetPrompt
7373
import org.mozilla.fenix.wallpapers.Wallpaper
7474
import org.mozilla.fenix.wallpapers.WallpaperState
7575
import mozilla.components.feature.tab.collections.Tab as ComponentTab
@@ -699,7 +699,7 @@ class DefaultSessionControlController(
699699
ChecklistItem.Task.Type.CHANGE_TOOLBAR_PLACEMENT ->
700700
navigateTo(HomeFragmentDirections.actionGlobalCustomizationFragment())
701701

702-
ChecklistItem.Task.Type.INSTALL_SEARCH_WIDGET -> showAddSearchWidgetPrompt(activity)
702+
ChecklistItem.Task.Type.INSTALL_SEARCH_WIDGET -> maybeShowAddSearchWidgetPrompt(activity)
703703

704704
ChecklistItem.Task.Type.EXPLORE_EXTENSION ->
705705
navigateTo(HomeFragmentDirections.actionGlobalAddonsManagementFragment())

app/src/main/java/org/mozilla/fenix/onboarding/OnboardingFragment.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
package org.mozilla.fenix.onboarding
66

77
import android.annotation.SuppressLint
8+
import android.appwidget.AppWidgetManager
89
import android.content.Context
910
import android.content.IntentFilter
1011
import android.content.pm.ActivityInfo
@@ -60,7 +61,7 @@ import org.mozilla.fenix.onboarding.view.toPageUiData
6061
import org.mozilla.fenix.settings.SupportUtils
6162
import org.mozilla.fenix.theme.FirefoxTheme
6263
import org.mozilla.fenix.utils.canShowAddSearchWidgetPrompt
63-
import org.mozilla.fenix.utils.showAddSearchWidgetPrompt
64+
import org.mozilla.fenix.utils.maybeShowAddSearchWidgetPrompt
6465

6566
/**
6667
* Fragment displaying the onboarding flow.
@@ -82,7 +83,7 @@ class OnboardingFragment : Fragment() {
8283
pagesToDisplay(
8384
showDefaultBrowserPage = isNotDefaultBrowser(this) && !isDefaultBrowserPromptSupported(),
8485
showNotificationPage = canShowNotificationPage(),
85-
showAddWidgetPage = canShowAddSearchWidgetPrompt(),
86+
showAddWidgetPage = canShowAddSearchWidgetPrompt(AppWidgetManager.getInstance(activity)),
8687
).toMutableList()
8788
}
8889
}
@@ -245,7 +246,7 @@ class OnboardingFragment : Fragment() {
245246
pagesToDisplay.telemetrySequenceId(),
246247
pagesToDisplay.sequencePosition(OnboardingPageUiData.Type.ADD_SEARCH_WIDGET),
247248
)
248-
showAddSearchWidgetPrompt(requireActivity())
249+
maybeShowAddSearchWidgetPrompt(requireActivity())
249250
},
250251
onSkipFirefoxWidgetClick = {
251252
telemetryRecorder.onSkipAddWidgetClick(

app/src/main/java/org/mozilla/fenix/utils/AddSearchWidgetPrompt.kt

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,20 +16,29 @@ import org.mozilla.gecko.search.SearchWidgetProvider
1616
*
1717
* @param activity the parent [Activity].
1818
*/
19-
fun showAddSearchWidgetPrompt(activity: Activity) {
20-
// Requesting to pin app widget is only available for Android 8.0 and above
21-
if (canShowAddSearchWidgetPrompt()) {
22-
val appWidgetManager = AppWidgetManager.getInstance(activity)
23-
val searchWidgetProvider =
24-
ComponentName(activity, SearchWidgetProvider::class.java)
25-
if (appWidgetManager.isRequestPinAppWidgetSupported) {
26-
val successCallback = WidgetPinnedReceiver.getPendingIntent(activity)
27-
appWidgetManager.requestPinAppWidget(searchWidgetProvider, null, successCallback)
28-
}
19+
fun maybeShowAddSearchWidgetPrompt(activity: Activity) {
20+
val appWidgetManager = AppWidgetManager.getInstance(activity)
21+
22+
// Requesting to pin app widget is only available for Android 8.0 and above.
23+
// We don't use canShowAddSearchWidgetPrompt here directly as lint does not pick on the version check.
24+
if (androidVersionSupportsWidgetPinning() && appWidgetManager.isRequestPinAppWidgetSupported) {
25+
val searchWidgetProvider = ComponentName(activity, SearchWidgetProvider::class.java)
26+
val successCallback = WidgetPinnedReceiver.getPendingIntent(activity)
27+
appWidgetManager.requestPinAppWidget(searchWidgetProvider, null, successCallback)
2928
}
3029
}
3130

3231
/**
3332
* Checks whether the device is capable of displaying the "add search widget" prompt.
3433
*/
35-
fun canShowAddSearchWidgetPrompt() = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O
34+
fun canShowAddSearchWidgetPrompt(appWidgetManager: AppWidgetManager) =
35+
if (androidVersionSupportsWidgetPinning()) {
36+
appWidgetManager.isRequestPinAppWidgetSupported
37+
} else {
38+
false
39+
}
40+
41+
/**
42+
* Checks whether the device Android version is capable of displaying the "add search widget" prompt.
43+
*/
44+
private fun androidVersionSupportsWidgetPinning() = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O

app/src/main/java/org/mozilla/fenix/utils/Settings.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
package org.mozilla.fenix.utils
66

77
import android.accessibilityservice.AccessibilityServiceInfo.CAPABILITY_CAN_PERFORM_GESTURES
8+
import android.appwidget.AppWidgetManager
89
import android.content.Context
910
import android.content.Context.MODE_PRIVATE
1011
import android.content.SharedPreferences
@@ -2607,7 +2608,10 @@ class Settings(private val appContext: Context) : PreferencesHolder {
26072608
*/
26082609
var showSetupChecklist by lazyFeatureFlagPreference(
26092610
key = appContext.getPreferenceKey(R.string.pref_key_setup_checklist_complete),
2610-
default = { FxNimbus.features.setupChecklist.value().enabled },
2611+
default = {
2612+
FxNimbus.features.setupChecklist.value().enabled &&
2613+
canShowAddSearchWidgetPrompt(AppWidgetManager.getInstance(appContext))
2614+
},
26112615
featureFlag = true,
26122616
)
26132617
}

app/src/main/res/raw/initial_experiments.json

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,108 @@
376376
"firefoxLabsDescriptionLinks": null,
377377
"firefoxLabsGroup": null,
378378
"requiresRestart": false
379+
},
380+
{
381+
"schemaVersion": "1.12.0",
382+
"slug": "off-train-aa-test-release",
383+
"id": "off-train-aa-test-release",
384+
"arguments": {},
385+
"application": "org.mozilla.firefox",
386+
"appName": "fenix",
387+
"appId": "org.mozilla.firefox",
388+
"channel": "release",
389+
"userFacingName": "Off Train A/A Test Release",
390+
"userFacingDescription": "Show a splash screen for nimbus calls during first run app launch.",
391+
"isEnrollmentPaused": false,
392+
"isRollout": false,
393+
"bucketConfig": {
394+
"randomizationUnit": "nimbus_id",
395+
"namespace": "fenix-splash-screen-release-4",
396+
"start": 2000,
397+
"count": 2000,
398+
"total": 10000
399+
},
400+
"featureIds": [
401+
"splash-screen"
402+
],
403+
"probeSets": [],
404+
"outcomes": [
405+
{
406+
"slug": "onboarding",
407+
"priority": "primary"
408+
},
409+
{
410+
"slug": "default-browser",
411+
"priority": "secondary"
412+
},
413+
{
414+
"slug": "sponsored_tiles",
415+
"priority": "secondary"
416+
},
417+
{
418+
"slug": "awesomebar",
419+
"priority": "secondary"
420+
}
421+
],
422+
"branches": [
423+
{
424+
"slug": "control",
425+
"ratio": 1,
426+
"feature": {
427+
"featureId": "this-is-included-for-mobile-pre-96-support",
428+
"enabled": false,
429+
"value": {}
430+
},
431+
"features": [
432+
{
433+
"featureId": "splash-screen",
434+
"enabled": true,
435+
"value": {
436+
"enabled": true,
437+
"maximum_duration_ms": 2500,
438+
"off-train-onboarding": true
439+
}
440+
}
441+
]
442+
},
443+
{
444+
"slug": "treatment-a",
445+
"ratio": 1,
446+
"feature": {
447+
"featureId": "this-is-included-for-mobile-pre-96-support",
448+
"enabled": false,
449+
"value": {}
450+
},
451+
"features": [
452+
{
453+
"featureId": "splash-screen",
454+
"enabled": true,
455+
"value": {
456+
"enabled": true,
457+
"maximum_duration_ms": 2500,
458+
"off-train-onboarding": true
459+
}
460+
}
461+
]
462+
}
463+
],
464+
"targeting": "((is_already_enrolled) || ((isFirstRun == 'true') && (app_version|versionCompare('138.!') >= 0)))",
465+
"startDate": "2025-05-27",
466+
"enrollmentEndDate": null,
467+
"endDate": null,
468+
"proposedDuration": 21,
469+
"proposedEnrollment": 7,
470+
"referenceBranch": "control",
471+
"featureValidationOptOut": false,
472+
"localizations": null,
473+
"locales": null,
474+
"publishedDate": "2025-05-27T15:16:03.138389Z",
475+
"isFirefoxLabsOptIn": false,
476+
"firefoxLabsTitle": null,
477+
"firefoxLabsDescription": null,
478+
"firefoxLabsDescriptionLinks": null,
479+
"firefoxLabsGroup": null,
480+
"requiresRestart": false
379481
}
380482
]
381483
}

app/src/test/java/org/mozilla/fenix/home/DefaultSessionControlControllerTest.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ import org.mozilla.fenix.messaging.MessageController
7676
import org.mozilla.fenix.onboarding.WallpaperOnboardingDialogFragment.Companion.THUMBNAILS_SELECTION_COUNT
7777
import org.mozilla.fenix.settings.SupportUtils
7878
import org.mozilla.fenix.utils.Settings
79-
import org.mozilla.fenix.utils.showAddSearchWidgetPrompt
79+
import org.mozilla.fenix.utils.maybeShowAddSearchWidgetPrompt
8080
import org.mozilla.fenix.wallpapers.Wallpaper
8181
import org.mozilla.fenix.wallpapers.WallpaperState
8282
import java.io.File
@@ -1627,13 +1627,13 @@ class DefaultSessionControlControllerTest {
16271627
val controller = createController()
16281628
val task = mockk<ChecklistItem.Task>()
16291629
mockkStatic("org.mozilla.fenix.utils.AddSearchWidgetPromptKt")
1630-
every { showAddSearchWidgetPrompt(activity) } just Runs
1630+
every { maybeShowAddSearchWidgetPrompt(activity) } just Runs
16311631
every { task.type } returns ChecklistItem.Task.Type.INSTALL_SEARCH_WIDGET
16321632

16331633
controller.navigationActionFor(task)
16341634

16351635
verify {
1636-
showAddSearchWidgetPrompt(activity)
1636+
maybeShowAddSearchWidgetPrompt(activity)
16371637
}
16381638
}
16391639

0 commit comments

Comments
 (0)