2023-01-17 15:21:20 +00:00
|
|
|
---
|
|
|
|
features:
|
2023-02-06 23:02:42 +00:00
|
|
|
nimbus-system:
|
|
|
|
description: |
|
|
|
|
Configuration of the Nimbus System in Fenix.
|
|
|
|
variables:
|
|
|
|
refresh-interval-foreground:
|
|
|
|
description: |
|
|
|
|
The minimum interval in minutes between fetching experiment
|
|
|
|
recipes in the foreground.
|
|
|
|
type: Int
|
|
|
|
default: 60 # 1 hour
|
|
|
|
|
2023-01-17 15:21:20 +00:00
|
|
|
messaging:
|
|
|
|
description: |
|
|
|
|
Configuration for the messaging system.
|
|
|
|
|
|
|
|
In practice this is a set of growable lookup tables for the
|
|
|
|
message controller to piece together.
|
|
|
|
|
|
|
|
variables:
|
|
|
|
message-under-experiment:
|
|
|
|
description: Id or prefix of the message under experiment.
|
|
|
|
type: Option<String>
|
|
|
|
default: null
|
|
|
|
|
|
|
|
messages:
|
|
|
|
description: A growable collection of messages
|
|
|
|
type: Map<String, MessageData>
|
|
|
|
default: {}
|
|
|
|
|
|
|
|
triggers:
|
|
|
|
description: >
|
|
|
|
A collection of out the box trigger
|
|
|
|
expressions. Each entry maps to a
|
|
|
|
valid JEXL expression.
|
|
|
|
type: Map<String, String>
|
|
|
|
default: {}
|
|
|
|
styles:
|
|
|
|
description: >
|
|
|
|
A map of styles to configure message
|
|
|
|
appearance.
|
|
|
|
type: Map<String, StyleData>
|
|
|
|
default: {}
|
|
|
|
|
|
|
|
actions:
|
|
|
|
type: Map<String, String>
|
|
|
|
description: A growable map of action URLs.
|
|
|
|
default: {}
|
|
|
|
on-control:
|
|
|
|
type: ControlMessageBehavior
|
|
|
|
description: What should be displayed when a control message is selected.
|
|
|
|
default: show-next-message
|
|
|
|
notification-config:
|
|
|
|
description: Configuration of the notification worker for all notification messages.
|
|
|
|
type: NotificationConfig
|
|
|
|
default: {}
|
|
|
|
defaults:
|
|
|
|
- value:
|
|
|
|
triggers:
|
2023-01-25 18:39:43 +00:00
|
|
|
# Using attributes built into the Nimbus SDK
|
2023-01-17 15:21:20 +00:00
|
|
|
USER_RECENTLY_INSTALLED: days_since_install < 7
|
|
|
|
USER_RECENTLY_UPDATED: days_since_update < 7 && days_since_install != days_since_update
|
|
|
|
USER_TIER_ONE_COUNTRY: ('US' in locale || 'GB' in locale || 'CA' in locale || 'DE' in locale || 'FR' in locale)
|
|
|
|
USER_EN_SPEAKER: "'en' in locale"
|
2023-01-25 18:39:43 +00:00
|
|
|
USER_ES_SPEAKER: "'es' in locale"
|
2023-01-17 15:21:20 +00:00
|
|
|
USER_DE_SPEAKER: "'de' in locale"
|
|
|
|
USER_FR_SPEAKER: "'fr' in locale"
|
|
|
|
DEVICE_ANDROID: os == 'Android'
|
|
|
|
DEVICE_IOS: os == 'iOS'
|
|
|
|
ALWAYS: "true"
|
|
|
|
NEVER: "false"
|
2023-01-25 18:39:43 +00:00
|
|
|
|
|
|
|
# Using custom attributes for the browser
|
2023-01-17 15:21:20 +00:00
|
|
|
I_AM_DEFAULT_BROWSER: "is_default_browser"
|
|
|
|
I_AM_NOT_DEFAULT_BROWSER: "is_default_browser == false"
|
|
|
|
USER_ESTABLISHED_INSTALL: "number_of_app_launches >=4"
|
2023-01-25 18:39:43 +00:00
|
|
|
|
|
|
|
FUNNEL_PAID: "adjust_campaign != ''"
|
|
|
|
FUNNEL_ORGANIC: "adjust_campaign == ''"
|
|
|
|
|
|
|
|
# Using Glean events, specific to the browser
|
|
|
|
INACTIVE_1_DAY: "'app_launched'|eventLastSeen('Hours') >= 24"
|
|
|
|
INACTIVE_2_DAYS: "'app_launched'|eventLastSeen('Days', 0) >= 2"
|
|
|
|
INACTIVE_3_DAYS: "'app_launched'|eventLastSeen('Days', 0) >= 3"
|
|
|
|
INACTIVE_4_DAYS: "'app_launched'|eventLastSeen('Days', 0) >= 4"
|
|
|
|
INACTIVE_5_DAYS: "'app_launched'|eventLastSeen('Days', 0) >= 5"
|
|
|
|
|
|
|
|
# Has the user signed in the last 4 years
|
|
|
|
FXA_SIGNED_IN: "'sync_auth.sign_in'|eventLastSeen('Years', 0) <= 4"
|
|
|
|
FXA_NOT_SIGNED_IN: "'sync_auth.sign_in'|eventLastSeen('Years', 0) > 4"
|
|
|
|
|
|
|
|
# https://mozilla-hub.atlassian.net/wiki/spaces/FJT/pages/11469471/Core+Active
|
|
|
|
USER_INFREQUENT: "'app_launched'|eventCountNonZero('Days', 28) >= 1 && 'app_launched'|eventCountNonZero('Days', 28) < 7"
|
|
|
|
USER_CASUAL: "'app_launched'|eventCountNonZero('Days', 28) >= 7 && 'app_launched'|eventCountNonZero('Days', 28) < 14"
|
|
|
|
USER_REGULAR: "'app_launched'|eventCountNonZero('Days', 28) >= 14 && 'app_launched'|eventCountNonZero('Days', 28) < 21"
|
|
|
|
USER_CORE_ACTIVE: "'app_launched'|eventCountNonZero('Days', 28) >= 21"
|
|
|
|
|
|
|
|
LAUNCHED_ONCE_THIS_WEEK: "'app_launched'|eventSum('Days', 7) == 1"
|
|
|
|
|
2023-01-17 15:21:20 +00:00
|
|
|
actions:
|
|
|
|
ENABLE_PRIVATE_BROWSING: ://enable_private_browsing
|
|
|
|
INSTALL_SEARCH_WIDGET: ://install_search_widget
|
|
|
|
MAKE_DEFAULT_BROWSER: ://make_default_browser
|
|
|
|
VIEW_BOOKMARKS: ://urls_bookmarks
|
|
|
|
VIEW_COLLECTIONS: ://home_collections
|
|
|
|
VIEW_HISTORY: ://urls_history
|
|
|
|
VIEW_HOMESCREEN: ://home
|
|
|
|
OPEN_SETTINGS_ACCESSIBILITY: ://settings_accessibility
|
|
|
|
OPEN_SETTINGS_ADDON_MANAGER: ://settings_addon_manager
|
|
|
|
OPEN_SETTINGS_DELETE_BROWSING_DATA: ://settings_delete_browsing_data
|
|
|
|
OPEN_SETTINGS_LOGINS: ://settings_logins
|
|
|
|
OPEN_SETTINGS_NOTIFICATIONS: ://settings_notifications
|
|
|
|
OPEN_SETTINGS_PRIVACY: ://settings_privacy
|
|
|
|
OPEN_SETTINGS_SEARCH_ENGINE: ://settings_search_engine
|
|
|
|
OPEN_SETTINGS_TRACKING_PROTECTION: ://settings_tracking_protection
|
|
|
|
OPEN_SETTINGS_WALLPAPERS: ://settings_wallpapers
|
|
|
|
OPEN_SETTINGS: ://settings
|
|
|
|
TURN_ON_SYNC: ://turn_on_sync
|
|
|
|
styles:
|
|
|
|
DEFAULT:
|
|
|
|
priority: 50
|
|
|
|
max-display-count: 5
|
|
|
|
SURVEY:
|
|
|
|
priority: 55
|
|
|
|
max-display-count: 10
|
|
|
|
PERSISTENT:
|
|
|
|
priority: 50
|
|
|
|
max-display-count: 20
|
|
|
|
WARNING:
|
|
|
|
priority: 60
|
|
|
|
max-display-count: 10
|
|
|
|
URGENT:
|
|
|
|
priority: 100
|
|
|
|
max-display-count: 10
|
2023-02-07 14:09:49 +00:00
|
|
|
NOTIFICATION:
|
|
|
|
priority: 50
|
|
|
|
max-display-count: 1
|
2023-01-17 15:21:20 +00:00
|
|
|
messages:
|
|
|
|
default-browser:
|
|
|
|
text: default_browser_experiment_card_text
|
|
|
|
surface: homescreen
|
|
|
|
action: "MAKE_DEFAULT_BROWSER"
|
|
|
|
trigger: [ "I_AM_NOT_DEFAULT_BROWSER","USER_ESTABLISHED_INSTALL" ]
|
|
|
|
style: "PERSISTENT"
|
|
|
|
button-label: preferences_set_as_default_browser
|
|
|
|
|
|
|
|
- channel: developer
|
|
|
|
value:
|
|
|
|
styles:
|
|
|
|
DEFAULT:
|
|
|
|
priority: 50
|
|
|
|
max-display-count: 100
|
|
|
|
EXPIRES_QUICKLY:
|
|
|
|
priority: 100
|
|
|
|
max-display-count: 1
|
|
|
|
notification-config:
|
2023-02-07 14:09:49 +00:00
|
|
|
refresh-interval: 120 # minutes (2 hours)
|
2023-01-23 15:15:15 +00:00
|
|
|
messages:
|
2023-02-07 14:09:49 +00:00
|
|
|
default-browser-notification:
|
|
|
|
title: preferences_set_as_default_browser
|
|
|
|
text: default_browser_experiment_card_text
|
2023-01-23 15:15:15 +00:00
|
|
|
surface: notification
|
2023-02-07 14:09:49 +00:00
|
|
|
style: NOTIFICATION
|
|
|
|
action: MAKE_DEFAULT_BROWSER
|
|
|
|
trigger:
|
|
|
|
- I_AM_NOT_DEFAULT_BROWSER
|
|
|
|
- INACTIVE_2_DAYS
|
2023-01-17 15:21:20 +00:00
|
|
|
|
|
|
|
objects:
|
|
|
|
MessageData:
|
|
|
|
description: >
|
|
|
|
An object to describe a message. It uses human
|
|
|
|
readable strings to describe the triggers, action and
|
|
|
|
style of the message as well as the text of the message
|
|
|
|
and call to action.
|
|
|
|
fields:
|
|
|
|
action:
|
|
|
|
type: Text
|
|
|
|
description: >
|
|
|
|
A URL of a page or a deeplink.
|
|
|
|
This may have substitution variables in.
|
|
|
|
# This should never be defaulted.
|
|
|
|
default: empty_string
|
|
|
|
title:
|
|
|
|
type: Option<Text>
|
|
|
|
description: "The title text displayed to the user"
|
|
|
|
default: null
|
|
|
|
text:
|
|
|
|
type: Text
|
|
|
|
description: "The message text displayed to the user"
|
|
|
|
# This should never be defaulted.
|
|
|
|
default: empty_string
|
|
|
|
is-control:
|
|
|
|
type: Boolean
|
|
|
|
description: "Indicates if this message is the control message, if true shouldn't be displayed"
|
|
|
|
default: false
|
|
|
|
button-label:
|
|
|
|
type: Option<Text>
|
|
|
|
description: >
|
|
|
|
The text on the button. If no text
|
|
|
|
is present, the whole message is clickable.
|
|
|
|
default: null
|
|
|
|
style:
|
|
|
|
type: String
|
|
|
|
description: >
|
|
|
|
The style as described in a
|
|
|
|
`StyleData` from the styles table.
|
|
|
|
default: DEFAULT
|
|
|
|
surface:
|
|
|
|
description:
|
|
|
|
The surface identifier for this message.
|
|
|
|
type: MessageSurfaceId
|
|
|
|
default: homescreen
|
|
|
|
trigger:
|
|
|
|
type: List<String>
|
|
|
|
description: >
|
|
|
|
A list of strings corresponding to
|
|
|
|
targeting expressions. The message will be
|
|
|
|
shown if all expressions `true`.
|
|
|
|
default: []
|
|
|
|
StyleData:
|
|
|
|
description: >
|
2023-02-07 14:09:49 +00:00
|
|
|
A group of properties (predominantly visual) to
|
2023-01-17 15:21:20 +00:00
|
|
|
describe the style of the message.
|
|
|
|
fields:
|
|
|
|
priority:
|
|
|
|
type: Int
|
|
|
|
description: >
|
|
|
|
The importance of this message.
|
|
|
|
0 is not very important, 100 is very important.
|
|
|
|
default: 50
|
|
|
|
max-display-count:
|
|
|
|
type: Int
|
|
|
|
description: >
|
|
|
|
How many sessions will this message be shown to the user
|
|
|
|
before it is expired.
|
|
|
|
default: 5
|
|
|
|
NotificationConfig:
|
|
|
|
description: Attributes controlling the global configuration of notification messages.
|
|
|
|
fields:
|
2023-02-07 14:09:49 +00:00
|
|
|
refresh-interval:
|
2023-01-17 15:21:20 +00:00
|
|
|
type: Int
|
|
|
|
description: >
|
2023-01-23 15:15:15 +00:00
|
|
|
How often, in minutes, the notification message worker will wake up and check for new
|
2023-01-17 15:21:20 +00:00
|
|
|
messages.
|
2023-02-07 14:09:49 +00:00
|
|
|
default: 240 # 4 hours
|
2023-01-17 15:21:20 +00:00
|
|
|
|
|
|
|
enums:
|
|
|
|
ControlMessageBehavior:
|
|
|
|
description: An enum to influence what should be displayed when a control message is selected.
|
|
|
|
variants:
|
|
|
|
show-next-message:
|
|
|
|
description: The next eligible message should be shown.
|
|
|
|
show-none:
|
|
|
|
description: The surface should show no message.
|
|
|
|
MessageSurfaceId:
|
|
|
|
description: The identity of a message surface
|
|
|
|
variants:
|
|
|
|
homescreen:
|
|
|
|
description: A banner in the homescreen.
|
|
|
|
notification:
|
|
|
|
description: A local notification in the background, like a push notification.
|