---
about:
  description: Nimbus Feature Manifest for Fenix (Firefox Android)
  kotlin:
    package: org.mozilla.fenix
    class: .nimbus.FxNimbus
channels:
  - release
  - beta
  - nightly
  - developer
  - forkDebug
  - forkRelease
includes:
  - onboarding.fml.yaml
  - pbm.fml.yaml
import:
  - path: ../android-components/components/service/nimbus/messaging.fml.yaml
    channel: release
    features:
      messaging:
        - value:
            triggers:
              # Using attributes built into the Nimbus SDK
              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"
              USER_ES_SPEAKER: "'es' in locale"
              USER_DE_SPEAKER: "'de' in locale"
              USER_FR_SPEAKER: "'fr' in locale"
              DEVICE_ANDROID: os == 'Android'
              DEVICE_IOS: os == 'iOS'
              ALWAYS: "true"
              NEVER: "false"
              DAY_1_AFTER_INSTALL: days_since_install == 1
              DAY_2_AFTER_INSTALL: days_since_install == 2
              DAY_3_AFTER_INSTALL: days_since_install == 3
              DAY_4_AFTER_INSTALL: days_since_install == 4
              DAY_5_AFTER_INSTALL: days_since_install == 5
              MORE_THAN_24H_SINCE_INSTALLED_OR_UPDATED: days_since_update >= 1

              # Using custom attributes for the browser
              I_AM_DEFAULT_BROWSER: "is_default_browser"
              I_AM_NOT_DEFAULT_BROWSER: "is_default_browser == false"
              USER_ESTABLISHED_INSTALL: "number_of_app_launches >=4"

              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"

            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: 1
              PERSISTENT:
                priority: 50
                max-display-count: 20
              WARNING:
                priority: 60
                max-display-count: 10
              URGENT:
                priority: 100
                max-display-count: 10
              NOTIFICATION:
                priority: 50
                max-display-count: 1
            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
              default-browser-notification:
                title: nimbus_notification_default_browser_title
                text: nimbus_notification_default_browser_text
                surface: notification
                style: NOTIFICATION
                trigger:
                  - I_AM_NOT_DEFAULT_BROWSER
                  - DAY_3_AFTER_INSTALL
                action: MAKE_DEFAULT_BROWSER

        - channel: developer
          value:
            styles:
              DEFAULT:
                priority: 50
                max-display-count: 100
              EXPIRES_QUICKLY:
                priority: 100
                max-display-count: 1
            notification-config:
              refresh-interval: 120 # minutes (2 hours)
  - path: ../android-components/components/browser/engine-gecko/geckoview.fml.yaml
    channel: release
    features:
      pdfjs:
        - channel: developer
          value: {
          download-button: true,
          open-in-app-button: true
        }

features:
  toolbar:
    description: The searchbar/awesomebar that user uses to search.
    variables:
      toolbar-position-top:
        description: If true, toolbar appears at top of the screen.
        type: Boolean
        default: false
  homescreen:
    description: The homescreen that the user goes to when they press home or new tab.
    variables:
      sections-enabled:
        description: "This property provides a lookup table of whether or not the given section should be enabled.
        If the section is enabled, it should be toggleable in the settings screen, and on by default."
        type: Map<HomeScreenSection, Boolean>
        default:
          {
            "top-sites": true,
            "jump-back-in": true,
            "recently-saved": true,
            "recent-explorations": true,
            "pocket": true,
            "pocket-sponsored-stories": true,
          }
    defaults:
      - channel: nightly
        value: {
          "sections-enabled": {
            "top-sites": true,
            "jump-back-in": true,
            "recently-saved": true,
            "recent-explorations": true,
            "pocket": true,
          }
        }
  nimbus-validation:
    description: "A feature that does not correspond to an application feature suitable for showing
    that Nimbus is working. This should never be used in production."
    variables:
      settings-title:
        description: The title of displayed in the Settings screen and app menu.
        type: Text
        default: browser_menu_settings
      settings-punctuation:
        description: The emoji displayed in the Settings screen title.
        type: String
        default: ""
      settings-icon:
        description: The drawable displayed in the app menu for Settings
        type: String
        default: mozac_ic_settings
  search-term-groups:
    description: A feature allowing the grouping of URLs around the search term that it came from.
    variables:
      enabled:
        description: If true, the feature shows up on the homescreen and on the new tab screen.
        type: Boolean
        default: false
    defaults:
      - channel: nightly
        value:
          enabled: true
      - channel: developer
        value:
          enabled: true
  mr2022:
    description: Features for MR 2022.
    variables:
      sections-enabled:
        description: "This property provides a lookup table of whether or not the given section should be enabled."
        type: Map<MR2022Section, Boolean>
        default:
          {
            "home-onboarding-dialog-existing-users": true,
            "sync-cfr": true,
            "wallpapers-selection-tool": true,
            "jump-back-in-cfr": true,
            "tcp-cfr": true,
            "tcp-feature": true,
          }
    defaults:
      - channel: developer
        value: {
          "sections-enabled": {
            "home-onboarding-dialog-existing-users": true,
            "sync-cfr": true,
            "wallpapers-selection-tool": true,
            "jump-back-in-cfr": true,
          }
        }

  cookie-banners:
    description: Features for cookie banner handling.
    variables:
      sections-enabled:
        description: "This property provides a lookup table of whether or not the given section should be enabled."
        type: Map<CookieBannersSection, Int>
        default:
          {
            "feature-ui": 0,
            "feature-setting-value": 0,
            "dialog-re-engage-time": 4
          }
    defaults:
      - channel: developer
        value: {
          "sections-enabled": {
            "feature-ui": 1,
            "feature-setting-value": 0,
            "dialog-re-engage-time": 4
          }
        }
      - channel: nightly
        value: {
          "sections-enabled": {
            "feature-ui": 1,
            "feature-setting-value": 0,
            "dialog-re-engage-time": 4
          }
        }
  unified-search:
    description: A feature allowing user to easily search for specified results directly in the search bar.
    variables:
      enabled:
        description: If true, the feature shows up in the search bar.
        type: Boolean
        default: true

  extensions-process:
    description: A feature to rollout the extensions process.
    variables:
      enabled:
        description: If true, the extensions process is enabled.
        type: Boolean
        default: false

  growth-data:
    description: A feature measuring campaign growth data
    variables:
      enabled:
        description: If true, the feature is active
        type: Boolean
        default: false
    defaults:
      - channel: release
        value:
          enabled: true

  re-engagement-notification:
    description: A feature that shows the re-engagement notification if the user is inactive.
    variables:
      enabled:
        description: If true, the re-engagement notification is shown to the inactive user.
        type: Boolean
        default: false
      type:
        description: The type of re-engagement notification that is shown to the inactive user.
        type: Int
        default: 0

  pre-permission-notification-prompt:
    description: A feature that shows the pre-permission notification prompt.
    variables:
      enabled:
        description: if true, the pre-permission notification prompt is shown to the user.
        type: Boolean
        default: false

  onboarding:
    description: "A feature that configures the new user onboarding page.
    Note that onboarding is a **first run** feature, and should only be modified by first run experiments."
    variables:
      order:
        description: Determines the order of the onboarding page panels
        type: List<OnboardingPanel>
        default: ["themes", "toolbar-placement", "sync", "tcp", "privacy-notice"]

  glean:
    description: "A feature that provides server-side configurations for Glean metrics (aka Server Knobs)."
    variables:
      metrics-enabled:
        description: "A map of metric base-identifiers to booleans representing the state of the 'enabled' flag for that metric."
        type: Map<String, Boolean>
        default: {}

  splash-screen:
    description: "A feature that extends splash screen duration, allowing additional data fetching time for the app's initial run."
    variables:
      enabled:
        description: "If true, the feature is active."
        type: Boolean
        default: false
      maximum_duration_ms:
        description: The maximum amount of time in milliseconds the splashscreen will be visible while waiting for initialization calls to complete.
        type: Int
        default: 0

  shopping-experience:
    description: A feature that shows product review quality information.
    variables:
      enabled:
        description: if true, the shopping experience feature is shown to the user.
        type: Boolean
        default: false
    defaults:
      - channel: developer
        value:
          enabled: true

  print:
    description: A feature for printing from the share or browser menu.
    variables:
      share-print-enabled:
        description: If true, a print button from the share menu is available.
        type: Boolean
        default: true
      browser-print-enabled:
        description: If true, a print button from the browser menu is available.
        type: Boolean
        default: true

  search-extra-params:
    description: A feature that provides additional args for search.
    variables:
      enabled:
        description: If true, the feature is active.
        type: Boolean
        default: false
      search-engine:
        description: The search engine name.
        type: String
        default: ""
      feature-enabler:
        description: The feature enabler param name with arg, NOTE this map could be empty.
        type: Map<String, String>
        default: {}
      channel-id:
        description: The channel Id param name with arg.
        type: Map<String, String>
        default: {}
types:
  objects: {}

  enums:
    HomeScreenSection:
      description: The identifiers for the sections of the homescreen.
      variants:
        top-sites:
          description: The frecency and pinned sites.
        recently-saved:
          description: The sites the user has bookmarked recently.
        jump-back-in:
          description: The tabs the user was looking immediately before being interrupted.
        recent-explorations:
          description: The tab groups
        pocket:
          description: The pocket section. This should only be available in the US.
        pocket-sponsored-stories:
          description: Subsection of the Pocket homescreen section which shows sponsored stories.

    MR2022Section:
      description: The identifiers for the sections of the MR 2022.
      variants:
        home-onboarding-dialog-existing-users:
          description: Home onboarding dialog for upgraded users.
        sync-cfr:
          description: CFR for the first time you see a synced tab on the home screen.
        wallpapers-selection-tool:
          description: Wallpapers selection dialog tool for the home screen.
        jump-back-in-cfr:
          description: Jump back-in onboarding message.
        tcp-cfr:
          description: CFR for the first time you use the browse with Total Cookie Protection on the browser screen.
        tcp-feature:
          description: Controls the Total Cookie Protection feature.
    CookieBannersSection:
      description: The identifiers for the sections of the MR 2022.
      variants:
        feature-ui:
          description: An integer either 0 or 1 indicating if the UI for cookie banner handling should be visible,
            0 to hide the UI and 1 to show the UI. The actual UI is composed by cookie banner section
            in the settings page, the toolbar section and the re-engagement dialog.
        feature-setting-value:
          description: An integer either 0 or 1 indicating if cookie banner setting should be enabled or disabled,
             0 for setting the value to disabled, 1  for enabling the setting with the value reject_all.
        dialog-re-engage-time:
          description: An integer indicating the number of hours that needs to happen before
            the re-engagement dialog shows again since the last seen, for example if set to 4
            that means if the users has seen the dialog, it will see it 4 hours later.
    OnboardingPanel:
      description: The types of onboarding panels in the onboarding page
      variants:
        themes:
          description: The themes onboarding panel where users pick themes
        toolbar-placement:
          description: The onboarding panel where users choose their toolbar placement (bottom or top)
        sync:
          description: The onboarding panel where users can sign in to sync
        tcp:
          description: The onboarding panel where users can choose their total cookie protection settings
        privacy-notice:
          description: The onboarding panel where users can tap to view our privacy notice.
