| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 111
 112
 113
 114
 115
 116
 117
 118
 119
 120
 121
 122
 123
 124
 125
 126
 127
 128
 129
 130
 131
 132
 133
 134
 135
 136
 137
 138
 139
 140
 141
 142
 143
 144
 145
 146
 147
 148
 149
 150
 151
 152
 153
 154
 155
 156
 157
 158
 159
 160
 161
 162
 163
 164
 165
 166
 167
 168
 169
 170
 171
 172
 173
 174
 175
 176
 177
 178
 179
 180
 181
 182
 183
 184
 185
 186
 187
 188
 189
 190
 191
 192
 193
 194
 195
 196
 197
 198
 199
 200
 201
 202
 203
 204
 205
 206
 207
 208
 209
 210
 211
 212
 213
 214
 215
 216
 217
 218
 219
 220
 221
 222
 223
 224
 
 | ---
about:
  description: Nimbus Feature Manifest for Android
  kotlin:
    package: mozilla.components.service.nimbus
    class: .messaging.FxNimbusMessaging
channels:
  - release
  - debug
features:
  nimbus-system:
    description: |
      Configuration of the Nimbus System in Android.
    variables:
      refresh-interval-foreground:
        description: |
          The minimum interval in minutes between fetching experiment
          recipes in the foreground.
        type: Int
        default: 60 # 1 hour
  messaging:
    description: |
      The in-app messaging system.
    allow-coenrollment: true
    variables:
      messages:
        description: A growable collection of messages
        type: Map<MessageKey, MessageData>
        string-alias: MessageKey
        default: {}
      triggers:
        description: >
          A collection of out the box trigger
          expressions. Each entry maps to a
          valid JEXL expression.
        type: Map<TriggerName, String>
        string-alias: TriggerName
        default: {}
      styles:
        description: >
          A map of styles to configure message
          appearance.
        type: Map<StyleName, StyleData>
        string-alias: StyleName
        default: {}
      $$surfaces:
        description: |
          A list available surfaces for this app.
          This should not be written to by experiments, and should be hidden to users.
        type: List<SurfaceName>
        string-alias: SurfaceName
        default: []
      actions:
        type: Map<ActionName, String>
        description: A growable map of action URLs.
        string-alias: ActionName
        default:
          OPEN_URL: ://open
      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: {}
      message-under-experiment:
        description: Deprecated in favor of `MessageData#experiment`. This will be removed in future releases.
        type: Option<MessageKey>
        default: null
      $$experiment:
        description: The only acceptable value for `MessageData#experiment`. This should not be set by experiment.
        type: ExperimentSlug
        string-alias: ExperimentSlug
        default: "{experiment}"
    defaults:
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: ActionName
        description: >
          A URL of a page or a deeplink.
          This may have substitution variables in.
        default: OPEN_URL # This should never be defaulted.
      action-params:
        description: >
          A string map containing query parameters that will be appended to the action URL.
          This is useful for opening URLs in tabs, or specifying that the tab should be private.
          The values may have substitutions, e.g. "url": "https://example.com/id={uuid}",
          "private": "true".
          The params and their values are all determined downstream of the messaging component, by
          the embedding app's deeplink processing machinery.
        type: Map<String, String>
        default: {}
      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
        default: "" # This should never be defaulted.
      microsurvey-config:
        type: Option<MicrosurveyConfig>
        description: Optional configuration data for a microsurvey.
      is-control:
        type: Boolean
        description: Indicates if this message is the control message, if true shouldn't be displayed
        default: false
      experiment:
        type: Option<ExperimentSlug>
        description: The slug of the experiment that this message came from.
        default: null
      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: StyleName
        description: >
          The style as described in a
          `StyleData` from the styles table.
        default: DEFAULT
      surface:
        description:
          The surface identifier for this message.
        type: SurfaceName
        default: homescreen
      trigger-if-all:
        type: List<TriggerName>
        description: >
          A list of strings corresponding to
          targeting expressions. The message will be
          shown if all expressions are `true`.
        default: []
      exclude-if-any:
        type: List<TriggerName>
        description: >
          A list of strings corresponding to
          targeting expressions. The message will not be
          shown if any of the expressions are `true`.
        default: [ ]
  StyleData:
    description: >
      A group of properties (predominantly visual) to
      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:
      refresh-interval:
        type: Int
        description: >
          How often, in minutes, the notification message worker will wake up and check for new
          messages.
        default: 240 # 4 hours
  MicrosurveyConfig:
    description: Attributes relating to microsurvey content.
    fields:
      utm-content:
        description: Optional "utm_content" parameter for the privacy notice URL to specify the feature being surveyed.
        type: Option<String>
        default: null
      icon:
        type: Option<Image>
        description: The icon shown in the survey.
        default: null # If null, a default will be provided.
      answers:
        description: The list of answers to present to the user e.g. "Satisfied, Dissatisfied...".
        type: List<MicrosurveyAnswer>
        default: [] # Should not be defaulted
  MicrosurveyAnswer:
    description: Attributes relating to microsurvey content.
    fields:
      ordering:
        type: Int
        description: >
          Used to sequence the answers top to bottom. E.g. 0 will be the first/top item, 1 will be next and so on.
          Always set either ALL the provided answers ordering or NONE. If ALL answers are default, the the ordering
          used will be the same as provided by the experiment.
        default: 0
      text:
        type: Text
        description: The text for the answer.
        default: "" # This should never be defaulted.
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.
 |