# Copyright 2015 Google Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

require 'date'
require 'google/apis/core/base_service'
require 'google/apis/core/json_representation'
require 'google/apis/core/hashable'
require 'google/apis/errors'

module Google
  module Apis
    module FcmV1
      
      # Android specific options for messages sent through
      # [FCM connection server](https://goo.gl/4GLdUl).
      class AndroidConfig
        include Google::Apis::Core::Hashable
      
        # An identifier of a group of messages that can be collapsed, so that only
        # the last message gets sent when delivery can be resumed. A maximum of 4
        # different collapse keys is allowed at any given time.
        # Corresponds to the JSON property `collapseKey`
        # @return [String]
        attr_accessor :collapse_key
      
        # Arbitrary key/value payload. If present, it will override
        # google.firebase.fcm.v1.Message.data.
        # Corresponds to the JSON property `data`
        # @return [Hash<String,String>]
        attr_accessor :data
      
        # If set to true, messages will be allowed to be delivered to the app while
        # the device is in direct boot mode. See [Support Direct Boot
        # mode](https://developer.android.com/training/articles/direct-boot).
        # Corresponds to the JSON property `directBootOk`
        # @return [Boolean]
        attr_accessor :direct_boot_ok
        alias_method :direct_boot_ok?, :direct_boot_ok
      
        # Options for features provided by the FCM SDK for Android.
        # Corresponds to the JSON property `fcmOptions`
        # @return [Google::Apis::FcmV1::AndroidFcmOptions]
        attr_accessor :fcm_options
      
        # Notification to send to android devices.
        # Corresponds to the JSON property `notification`
        # @return [Google::Apis::FcmV1::AndroidNotification]
        attr_accessor :notification
      
        # Message priority. Can take "normal" and "high" values.
        # For more information, see [Setting the priority of a
        # message](https://goo.gl/GjONJv).
        # Corresponds to the JSON property `priority`
        # @return [String]
        attr_accessor :priority
      
        # Package name of the application where the registration token must match in
        # order to receive the message.
        # Corresponds to the JSON property `restrictedPackageName`
        # @return [String]
        attr_accessor :restricted_package_name
      
        # How long (in seconds) the message should be kept in FCM storage if the
        # device is offline. The maximum time to live supported is 4 weeks, and the
        # default value is 4 weeks if not set. Set it to 0 if want to send the
        # message immediately.
        # In JSON format, the Duration type is encoded as a string rather than an
        # object, where the string ends in the suffix "s" (indicating seconds) and
        # is preceded by the number of seconds, with nanoseconds expressed as
        # fractional seconds. For example, 3 seconds with 0 nanoseconds should be
        # encoded in JSON format as "3s", while 3 seconds and 1 nanosecond should
        # be expressed in JSON format as "3.000000001s". The ttl will be rounded down
        # to the nearest second.
        # Corresponds to the JSON property `ttl`
        # @return [String]
        attr_accessor :ttl
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @collapse_key = args[:collapse_key] if args.key?(:collapse_key)
          @data = args[:data] if args.key?(:data)
          @direct_boot_ok = args[:direct_boot_ok] if args.key?(:direct_boot_ok)
          @fcm_options = args[:fcm_options] if args.key?(:fcm_options)
          @notification = args[:notification] if args.key?(:notification)
          @priority = args[:priority] if args.key?(:priority)
          @restricted_package_name = args[:restricted_package_name] if args.key?(:restricted_package_name)
          @ttl = args[:ttl] if args.key?(:ttl)
        end
      end
      
      # Options for features provided by the FCM SDK for Android.
      class AndroidFcmOptions
        include Google::Apis::Core::Hashable
      
        # Label associated with the message's analytics data.
        # Corresponds to the JSON property `analyticsLabel`
        # @return [String]
        attr_accessor :analytics_label
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @analytics_label = args[:analytics_label] if args.key?(:analytics_label)
        end
      end
      
      # Notification to send to android devices.
      class AndroidNotification
        include Google::Apis::Core::Hashable
      
        # The notification's body text. If present, it will override
        # google.firebase.fcm.v1.Notification.body.
        # Corresponds to the JSON property `body`
        # @return [String]
        attr_accessor :body
      
        # Variable string values to be used in place of the format specifiers in
        # body_loc_key to use to localize the body text to the user's current
        # localization.
        # See [Formatting and Styling](https://goo.gl/MalYE3) for more information.
        # Corresponds to the JSON property `bodyLocArgs`
        # @return [Array<String>]
        attr_accessor :body_loc_args
      
        # The key to the body string in the app's string resources to use to localize
        # the body text to the user's current localization.
        # See [String Resources](https://goo.gl/NdFZGI) for more information.
        # Corresponds to the JSON property `bodyLocKey`
        # @return [String]
        attr_accessor :body_loc_key
      
        # The [notification's channel
        # id](https://developer.android.com/guide/topics/ui/notifiers/notifications#
        # ManageChannels)
        # (new in Android O). The app must create a channel with this channel ID
        # before any notification with this channel ID is received. If you don't send
        # this channel ID in the request, or if the channel ID provided has not yet
        # been created by the app, FCM uses the channel ID specified in the app
        # manifest.
        # Corresponds to the JSON property `channelId`
        # @return [String]
        attr_accessor :channel_id
      
        # The action associated with a user click on the notification.
        # If specified, an activity with a matching intent filter is launched when
        # a user clicks on the notification.
        # Corresponds to the JSON property `clickAction`
        # @return [String]
        attr_accessor :click_action
      
        # The notification's icon color, expressed in #rrggbb format.
        # Corresponds to the JSON property `color`
        # @return [String]
        attr_accessor :color
      
        # If set to true, use the Android framework's default LED light settings for
        # the notification. Default values are specified in
        # [config.xml](https://android.googlesource.com/platform/frameworks/base/+/
        # master/core/res/res/values/config.xml).
        # If `default_light_settings` is set to true and `light_settings` is also
        # set, the user-specified `light_settings` is used instead of the
        # default value.
        # Corresponds to the JSON property `defaultLightSettings`
        # @return [Boolean]
        attr_accessor :default_light_settings
        alias_method :default_light_settings?, :default_light_settings
      
        # If set to true, use the Android framework's default sound for the
        # notification. Default values are specified in
        # [config.xml](https://android.googlesource.com/platform/frameworks/base/+/
        # master/core/res/res/values/config.xml).
        # Corresponds to the JSON property `defaultSound`
        # @return [Boolean]
        attr_accessor :default_sound
        alias_method :default_sound?, :default_sound
      
        # If set to true, use the Android framework's default vibrate pattern for the
        # notification. Default values are specified in
        # [config.xml](https://android.googlesource.com/platform/frameworks/base/+/
        # master/core/res/res/values/config.xml).
        # If `default_vibrate_timings` is set to true and `vibrate_timings` is also
        # set, the default value is used instead of the user-specified
        # `vibrate_timings`.
        # Corresponds to the JSON property `defaultVibrateTimings`
        # @return [Boolean]
        attr_accessor :default_vibrate_timings
        alias_method :default_vibrate_timings?, :default_vibrate_timings
      
        # Set the time that the event in the notification occurred. Notifications in
        # the panel are sorted by this time. A point in time is represented using
        # [protobuf.Timestamp](https://developers.google.com/protocol-buffers/docs/
        # reference/java/com/google/protobuf/Timestamp).
        # Corresponds to the JSON property `eventTime`
        # @return [String]
        attr_accessor :event_time
      
        # The notification's icon.
        # Sets the notification icon to myicon for drawable resource myicon.
        # If you don't send this key in the request, FCM displays the launcher icon
        # specified in your app manifest.
        # Corresponds to the JSON property `icon`
        # @return [String]
        attr_accessor :icon
      
        # Contains the URL of an image that is going to be displayed in a
        # notification. If present, it will override
        # google.firebase.fcm.v1.Notification.image.
        # Corresponds to the JSON property `image`
        # @return [String]
        attr_accessor :image
      
        # Settings to control notification LED.
        # Corresponds to the JSON property `lightSettings`
        # @return [Google::Apis::FcmV1::LightSettings]
        attr_accessor :light_settings
      
        # Set whether or not this notification is relevant only to the current
        # device. Some notifications can be bridged to other devices for remote
        # display, such as a Wear OS watch. This hint can be set to recommend this
        # notification not be bridged. See [Wear OS
        # guides](https://developer.android.com/training/wearables/notifications/bridger#
        # existing-method-of-preventing-bridging)
        # Corresponds to the JSON property `localOnly`
        # @return [Boolean]
        attr_accessor :local_only
        alias_method :local_only?, :local_only
      
        # Sets the number of items this notification represents. May be displayed as
        # a badge count for launchers that support badging.See [Notification
        # Badge](https://developer.android.com/training/notify-user/badges).
        # For example, this might be useful if you're using just one notification to
        # represent multiple new messages but you want the count here to represent
        # the number of total new messages.
        # If zero or unspecified, systems that support badging use the default, which
        # is to increment a number displayed on the long-press menu each time a new
        # notification arrives.
        # Corresponds to the JSON property `notificationCount`
        # @return [Fixnum]
        attr_accessor :notification_count
      
        # Set the relative priority for this notification. Priority is an indication
        # of how much of the user's attention should be consumed by this
        # notification. Low-priority notifications may be hidden from the user in
        # certain situations, while the user might be interrupted for a
        # higher-priority notification. The effect of setting the same priorities may
        # differ slightly on different platforms. Note this priority differs from
        # `AndroidMessagePriority`. This priority is processed by the client after
        # the message has been delivered, whereas
        # [AndroidMessagePriority](https://firebase.google.com/docs/reference/fcm/rest/
        # v1/projects.messages#androidmessagepriority)
        # is an FCM concept that controls when the message is delivered.
        # Corresponds to the JSON property `notificationPriority`
        # @return [String]
        attr_accessor :notification_priority
      
        # The sound to play when the device receives the notification.
        # Supports "default" or the filename of a sound resource bundled in the app.
        # Sound files must reside in /res/raw/.
        # Corresponds to the JSON property `sound`
        # @return [String]
        attr_accessor :sound
      
        # When set to false or unset, the notification is automatically
        # dismissed when the user clicks it in the panel. When set to true, the
        # notification persists even when the user clicks it.
        # Corresponds to the JSON property `sticky`
        # @return [Boolean]
        attr_accessor :sticky
        alias_method :sticky?, :sticky
      
        # Identifier used to replace existing notifications in the notification
        # drawer.
        # If not specified, each request creates a new notification.
        # If specified and a notification with the same tag is already being shown,
        # the new notification replaces the existing one in the notification drawer.
        # Corresponds to the JSON property `tag`
        # @return [String]
        attr_accessor :tag
      
        # Sets the "ticker" text, which is sent to accessibility services.
        # Prior to API level 21 (`Lollipop`), sets the text that is displayed in the
        # status bar when the notification first arrives.
        # Corresponds to the JSON property `ticker`
        # @return [String]
        attr_accessor :ticker
      
        # The notification's title. If present, it will override
        # google.firebase.fcm.v1.Notification.title.
        # Corresponds to the JSON property `title`
        # @return [String]
        attr_accessor :title
      
        # Variable string values to be used in place of the format specifiers in
        # title_loc_key to use to localize the title text to the user's current
        # localization.
        # See [Formatting and Styling](https://goo.gl/MalYE3) for more information.
        # Corresponds to the JSON property `titleLocArgs`
        # @return [Array<String>]
        attr_accessor :title_loc_args
      
        # The key to the title string in the app's string resources to use to
        # localize the title text to the user's current localization.
        # See [String Resources](https://goo.gl/NdFZGI) for more information.
        # Corresponds to the JSON property `titleLocKey`
        # @return [String]
        attr_accessor :title_loc_key
      
        # Set the vibration pattern to use. Pass in an array of
        # [protobuf.Duration](https://developers.google.com/protocol-buffers/docs/
        # reference/google.protobuf#google.protobuf.Duration)
        # to turn on or off the vibrator. The first value indicates the `Duration` to
        # wait before turning the vibrator on. The next value indicates the
        # `Duration` to keep the vibrator on. Subsequent values alternate between
        # `Duration` to turn the vibrator off and to turn the vibrator on.
        # If `vibrate_timings` is set and `default_vibrate_timings` is set to `true`,
        # the default value is used instead of the user-specified `vibrate_timings`.
        # Corresponds to the JSON property `vibrateTimings`
        # @return [Array<String>]
        attr_accessor :vibrate_timings
      
        # Set the
        # [Notification.visibility](https://developer.android.com/reference/android/app/
        # Notification.html#visibility)
        # of the notification.
        # Corresponds to the JSON property `visibility`
        # @return [String]
        attr_accessor :visibility
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @body = args[:body] if args.key?(:body)
          @body_loc_args = args[:body_loc_args] if args.key?(:body_loc_args)
          @body_loc_key = args[:body_loc_key] if args.key?(:body_loc_key)
          @channel_id = args[:channel_id] if args.key?(:channel_id)
          @click_action = args[:click_action] if args.key?(:click_action)
          @color = args[:color] if args.key?(:color)
          @default_light_settings = args[:default_light_settings] if args.key?(:default_light_settings)
          @default_sound = args[:default_sound] if args.key?(:default_sound)
          @default_vibrate_timings = args[:default_vibrate_timings] if args.key?(:default_vibrate_timings)
          @event_time = args[:event_time] if args.key?(:event_time)
          @icon = args[:icon] if args.key?(:icon)
          @image = args[:image] if args.key?(:image)
          @light_settings = args[:light_settings] if args.key?(:light_settings)
          @local_only = args[:local_only] if args.key?(:local_only)
          @notification_count = args[:notification_count] if args.key?(:notification_count)
          @notification_priority = args[:notification_priority] if args.key?(:notification_priority)
          @sound = args[:sound] if args.key?(:sound)
          @sticky = args[:sticky] if args.key?(:sticky)
          @tag = args[:tag] if args.key?(:tag)
          @ticker = args[:ticker] if args.key?(:ticker)
          @title = args[:title] if args.key?(:title)
          @title_loc_args = args[:title_loc_args] if args.key?(:title_loc_args)
          @title_loc_key = args[:title_loc_key] if args.key?(:title_loc_key)
          @vibrate_timings = args[:vibrate_timings] if args.key?(:vibrate_timings)
          @visibility = args[:visibility] if args.key?(:visibility)
        end
      end
      
      # [Apple Push Notification Service](https://goo.gl/MXRTPa) specific options.
      class ApnsConfig
        include Google::Apis::Core::Hashable
      
        # Options for features provided by the FCM SDK for iOS.
        # Corresponds to the JSON property `fcmOptions`
        # @return [Google::Apis::FcmV1::ApnsFcmOptions]
        attr_accessor :fcm_options
      
        # HTTP request headers defined in Apple Push Notification Service. Refer to
        # [APNs request
        # headers](https://developer.apple.com/documentation/usernotifications/
        # setting_up_a_remote_notification_server/sending_notification_requests_to_apns)
        # for supported headers, e.g. "apns-priority": "10".
        # Corresponds to the JSON property `headers`
        # @return [Hash<String,String>]
        attr_accessor :headers
      
        # APNs payload as a JSON object, including both `aps` dictionary and custom
        # payload. See [Payload Key
        # Reference](https://developer.apple.com/documentation/usernotifications/
        # setting_up_a_remote_notification_server/generating_a_remote_notification).
        # If present, it overrides google.firebase.fcm.v1.Notification.title
        # and google.firebase.fcm.v1.Notification.body.
        # Corresponds to the JSON property `payload`
        # @return [Hash<String,Object>]
        attr_accessor :payload
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @fcm_options = args[:fcm_options] if args.key?(:fcm_options)
          @headers = args[:headers] if args.key?(:headers)
          @payload = args[:payload] if args.key?(:payload)
        end
      end
      
      # Options for features provided by the FCM SDK for iOS.
      class ApnsFcmOptions
        include Google::Apis::Core::Hashable
      
        # Label associated with the message's analytics data.
        # Corresponds to the JSON property `analyticsLabel`
        # @return [String]
        attr_accessor :analytics_label
      
        # Contains the URL of an image that is going to be displayed in a
        # notification. If present, it will override
        # google.firebase.fcm.v1.Notification.image.
        # Corresponds to the JSON property `image`
        # @return [String]
        attr_accessor :image
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @analytics_label = args[:analytics_label] if args.key?(:analytics_label)
          @image = args[:image] if args.key?(:image)
        end
      end
      
      # Represents a color in the RGBA color space. This representation is designed
      # for simplicity of conversion to/from color representations in various
      # languages over compactness; for example, the fields of this representation
      # can be trivially provided to the constructor of "java.awt.Color" in Java; it
      # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
      # method in iOS; and, with just a little work, it can be easily formatted into
      # a CSS "rgba()" string in JavaScript, as well.
      # Note: this proto does not carry information about the absolute color space
      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
      # space.
      # Example (Java):
      # import com.google.type.Color;
      # // ...
      # public static java.awt.Color fromProto(Color protocolor) `
      # float alpha = protocolor.hasAlpha()
      # ? protocolor.getAlpha().getValue()
      # : 1.0;
      # return new java.awt.Color(
      # protocolor.getRed(),
      # protocolor.getGreen(),
      # protocolor.getBlue(),
      # alpha);
      # `
      # public static Color toProto(java.awt.Color color) `
      # float red = (float) color.getRed();
      # float green = (float) color.getGreen();
      # float blue = (float) color.getBlue();
      # float denominator = 255.0;
      # Color.Builder resultBuilder =
      # Color
      # .newBuilder()
      # .setRed(red / denominator)
      # .setGreen(green / denominator)
      # .setBlue(blue / denominator);
      # int alpha = color.getAlpha();
      # if (alpha != 255) `
      # result.setAlpha(
      # FloatValue
      # .newBuilder()
      # .setValue(((float) alpha) / denominator)
      # .build());
      # `
      # return resultBuilder.build();
      # `
      # // ...
      # Example (iOS / Obj-C):
      # // ...
      # static UIColor* fromProto(Color* protocolor) `
      # float red = [protocolor red];
      # float green = [protocolor green];
      # float blue = [protocolor blue];
      # FloatValue* alpha_wrapper = [protocolor alpha];
      # float alpha = 1.0;
      # if (alpha_wrapper != nil) `
      # alpha = [alpha_wrapper value];
      # `
      # return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
      # `
      # static Color* toProto(UIColor* color) `
      # CGFloat red, green, blue, alpha;
      # if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) `
      # return nil;
      # `
      # Color* result = [[Color alloc] init];
      # [result setRed:red];
      # [result setGreen:green];
      # [result setBlue:blue];
      # if (alpha <= 0.9999) `
      # [result setAlpha:floatWrapperWithValue(alpha)];
      # `
      # [result autorelease];
      # return result;
      # `
      # // ...
      # Example (JavaScript):
      # // ...
      # var protoToCssColor = function(rgb_color) `
      # var redFrac = rgb_color.red || 0.0;
      # var greenFrac = rgb_color.green || 0.0;
      # var blueFrac = rgb_color.blue || 0.0;
      # var red = Math.floor(redFrac * 255);
      # var green = Math.floor(greenFrac * 255);
      # var blue = Math.floor(blueFrac * 255);
      # if (!('alpha' in rgb_color)) `
      # return rgbToCssColor_(red, green, blue);
      # `
      # var alphaFrac = rgb_color.alpha.value || 0.0;
      # var rgbParams = [red, green, blue].join(',');
      # return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
      # `;
      # var rgbToCssColor_ = function(red, green, blue) `
      # var rgbNumber = new Number((red << 16) | (green << 8) | blue);
      # var hexString = rgbNumber.toString(16);
      # var missingZeros = 6 - hexString.length;
      # var resultBuilder = ['#'];
      # for (var i = 0; i < missingZeros; i++) `
      # resultBuilder.push('0');
      # `
      # resultBuilder.push(hexString);
      # return resultBuilder.join('');
      # `;
      # // ...
      class Color
        include Google::Apis::Core::Hashable
      
        # The fraction of this color that should be applied to the pixel. That is,
        # the final pixel color is defined by the equation:
        # pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
        # This means that a value of 1.0 corresponds to a solid color, whereas
        # a value of 0.0 corresponds to a completely transparent color. This
        # uses a wrapper message rather than a simple float scalar so that it is
        # possible to distinguish between a default value and the value being unset.
        # If omitted, this color object is to be rendered as a solid color
        # (as if the alpha value had been explicitly given with a value of 1.0).
        # Corresponds to the JSON property `alpha`
        # @return [Float]
        attr_accessor :alpha
      
        # The amount of blue in the color as a value in the interval [0, 1].
        # Corresponds to the JSON property `blue`
        # @return [Float]
        attr_accessor :blue
      
        # The amount of green in the color as a value in the interval [0, 1].
        # Corresponds to the JSON property `green`
        # @return [Float]
        attr_accessor :green
      
        # The amount of red in the color as a value in the interval [0, 1].
        # Corresponds to the JSON property `red`
        # @return [Float]
        attr_accessor :red
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @alpha = args[:alpha] if args.key?(:alpha)
          @blue = args[:blue] if args.key?(:blue)
          @green = args[:green] if args.key?(:green)
          @red = args[:red] if args.key?(:red)
        end
      end
      
      # Platform independent options for features provided by the FCM SDKs.
      class FcmOptions
        include Google::Apis::Core::Hashable
      
        # Label associated with the message's analytics data.
        # Corresponds to the JSON property `analyticsLabel`
        # @return [String]
        attr_accessor :analytics_label
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @analytics_label = args[:analytics_label] if args.key?(:analytics_label)
        end
      end
      
      # Settings to control notification LED.
      class LightSettings
        include Google::Apis::Core::Hashable
      
        # Represents a color in the RGBA color space. This representation is designed
        # for simplicity of conversion to/from color representations in various
        # languages over compactness; for example, the fields of this representation
        # can be trivially provided to the constructor of "java.awt.Color" in Java; it
        # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
        # method in iOS; and, with just a little work, it can be easily formatted into
        # a CSS "rgba()" string in JavaScript, as well.
        # Note: this proto does not carry information about the absolute color space
        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
        # space.
        # Example (Java):
        # import com.google.type.Color;
        # // ...
        # public static java.awt.Color fromProto(Color protocolor) `
        # float alpha = protocolor.hasAlpha()
        # ? protocolor.getAlpha().getValue()
        # : 1.0;
        # return new java.awt.Color(
        # protocolor.getRed(),
        # protocolor.getGreen(),
        # protocolor.getBlue(),
        # alpha);
        # `
        # public static Color toProto(java.awt.Color color) `
        # float red = (float) color.getRed();
        # float green = (float) color.getGreen();
        # float blue = (float) color.getBlue();
        # float denominator = 255.0;
        # Color.Builder resultBuilder =
        # Color
        # .newBuilder()
        # .setRed(red / denominator)
        # .setGreen(green / denominator)
        # .setBlue(blue / denominator);
        # int alpha = color.getAlpha();
        # if (alpha != 255) `
        # result.setAlpha(
        # FloatValue
        # .newBuilder()
        # .setValue(((float) alpha) / denominator)
        # .build());
        # `
        # return resultBuilder.build();
        # `
        # // ...
        # Example (iOS / Obj-C):
        # // ...
        # static UIColor* fromProto(Color* protocolor) `
        # float red = [protocolor red];
        # float green = [protocolor green];
        # float blue = [protocolor blue];
        # FloatValue* alpha_wrapper = [protocolor alpha];
        # float alpha = 1.0;
        # if (alpha_wrapper != nil) `
        # alpha = [alpha_wrapper value];
        # `
        # return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
        # `
        # static Color* toProto(UIColor* color) `
        # CGFloat red, green, blue, alpha;
        # if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) `
        # return nil;
        # `
        # Color* result = [[Color alloc] init];
        # [result setRed:red];
        # [result setGreen:green];
        # [result setBlue:blue];
        # if (alpha <= 0.9999) `
        # [result setAlpha:floatWrapperWithValue(alpha)];
        # `
        # [result autorelease];
        # return result;
        # `
        # // ...
        # Example (JavaScript):
        # // ...
        # var protoToCssColor = function(rgb_color) `
        # var redFrac = rgb_color.red || 0.0;
        # var greenFrac = rgb_color.green || 0.0;
        # var blueFrac = rgb_color.blue || 0.0;
        # var red = Math.floor(redFrac * 255);
        # var green = Math.floor(greenFrac * 255);
        # var blue = Math.floor(blueFrac * 255);
        # if (!('alpha' in rgb_color)) `
        # return rgbToCssColor_(red, green, blue);
        # `
        # var alphaFrac = rgb_color.alpha.value || 0.0;
        # var rgbParams = [red, green, blue].join(',');
        # return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
        # `;
        # var rgbToCssColor_ = function(red, green, blue) `
        # var rgbNumber = new Number((red << 16) | (green << 8) | blue);
        # var hexString = rgbNumber.toString(16);
        # var missingZeros = 6 - hexString.length;
        # var resultBuilder = ['#'];
        # for (var i = 0; i < missingZeros; i++) `
        # resultBuilder.push('0');
        # `
        # resultBuilder.push(hexString);
        # return resultBuilder.join('');
        # `;
        # // ...
        # Corresponds to the JSON property `color`
        # @return [Google::Apis::FcmV1::Color]
        attr_accessor :color
      
        # Required. Along with `light_on_duration `, define the blink rate of LED
        # flashes. Resolution defined by
        # [proto.Duration](https://developers.google.com/protocol-buffers/docs/reference/
        # google.protobuf#google.protobuf.Duration)
        # Corresponds to the JSON property `lightOffDuration`
        # @return [String]
        attr_accessor :light_off_duration
      
        # Required. Along with `light_off_duration`, define the blink rate of LED
        # flashes. Resolution defined by
        # [proto.Duration](https://developers.google.com/protocol-buffers/docs/reference/
        # google.protobuf#google.protobuf.Duration)
        # Corresponds to the JSON property `lightOnDuration`
        # @return [String]
        attr_accessor :light_on_duration
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @color = args[:color] if args.key?(:color)
          @light_off_duration = args[:light_off_duration] if args.key?(:light_off_duration)
          @light_on_duration = args[:light_on_duration] if args.key?(:light_on_duration)
        end
      end
      
      # Message to send by Firebase Cloud Messaging Service.
      class Message
        include Google::Apis::Core::Hashable
      
        # Android specific options for messages sent through
        # [FCM connection server](https://goo.gl/4GLdUl).
        # Corresponds to the JSON property `android`
        # @return [Google::Apis::FcmV1::AndroidConfig]
        attr_accessor :android
      
        # [Apple Push Notification Service](https://goo.gl/MXRTPa) specific options.
        # Corresponds to the JSON property `apns`
        # @return [Google::Apis::FcmV1::ApnsConfig]
        attr_accessor :apns
      
        # Condition to send a message to,
        # e.g. "'foo' in topics && 'bar' in topics".
        # Corresponds to the JSON property `condition`
        # @return [String]
        attr_accessor :condition
      
        # Input only. Arbitrary key/value payload. The key should not be a reserved
        # word ("from", "message_type", or any word starting with "google" or "gcm").
        # Corresponds to the JSON property `data`
        # @return [Hash<String,String>]
        attr_accessor :data
      
        # Platform independent options for features provided by the FCM SDKs.
        # Corresponds to the JSON property `fcmOptions`
        # @return [Google::Apis::FcmV1::FcmOptions]
        attr_accessor :fcm_options
      
        # Output Only. The identifier of the message sent, in the format of
        # `projects/*/messages/`message_id``.
        # Corresponds to the JSON property `name`
        # @return [String]
        attr_accessor :name
      
        # Basic notification template to use across all platforms.
        # Corresponds to the JSON property `notification`
        # @return [Google::Apis::FcmV1::Notification]
        attr_accessor :notification
      
        # Registration token to send a message to.
        # Corresponds to the JSON property `token`
        # @return [String]
        attr_accessor :token
      
        # Topic name to send a message to, e.g. "weather".
        # Note: "/topics/" prefix should not be provided.
        # Corresponds to the JSON property `topic`
        # @return [String]
        attr_accessor :topic
      
        # [Webpush protocol](https://tools.ietf.org/html/rfc8030) options.
        # Corresponds to the JSON property `webpush`
        # @return [Google::Apis::FcmV1::WebpushConfig]
        attr_accessor :webpush
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @android = args[:android] if args.key?(:android)
          @apns = args[:apns] if args.key?(:apns)
          @condition = args[:condition] if args.key?(:condition)
          @data = args[:data] if args.key?(:data)
          @fcm_options = args[:fcm_options] if args.key?(:fcm_options)
          @name = args[:name] if args.key?(:name)
          @notification = args[:notification] if args.key?(:notification)
          @token = args[:token] if args.key?(:token)
          @topic = args[:topic] if args.key?(:topic)
          @webpush = args[:webpush] if args.key?(:webpush)
        end
      end
      
      # Basic notification template to use across all platforms.
      class Notification
        include Google::Apis::Core::Hashable
      
        # The notification's body text.
        # Corresponds to the JSON property `body`
        # @return [String]
        attr_accessor :body
      
        # Contains the URL of an image that is going to be downloaded on the device
        # and displayed in a notification.
        # JPEG, PNG, BMP have full support across platforms. Animated GIF and video
        # only work on iOS. WebP and HEIF have varying levels of support across
        # platforms and platform versions.
        # Android has 1MB image size limit.
        # Quota usage and implications/costs for hosting image on Firebase Storage:
        # https://firebase.google.com/pricing
        # Corresponds to the JSON property `image`
        # @return [String]
        attr_accessor :image
      
        # The notification's title.
        # Corresponds to the JSON property `title`
        # @return [String]
        attr_accessor :title
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @body = args[:body] if args.key?(:body)
          @image = args[:image] if args.key?(:image)
          @title = args[:title] if args.key?(:title)
        end
      end
      
      # Request to send a message to specified target.
      class SendMessageRequest
        include Google::Apis::Core::Hashable
      
        # Message to send by Firebase Cloud Messaging Service.
        # Corresponds to the JSON property `message`
        # @return [Google::Apis::FcmV1::Message]
        attr_accessor :message
      
        # Flag for testing the request without actually delivering the message.
        # Corresponds to the JSON property `validateOnly`
        # @return [Boolean]
        attr_accessor :validate_only
        alias_method :validate_only?, :validate_only
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @message = args[:message] if args.key?(:message)
          @validate_only = args[:validate_only] if args.key?(:validate_only)
        end
      end
      
      # [Webpush protocol](https://tools.ietf.org/html/rfc8030) options.
      class WebpushConfig
        include Google::Apis::Core::Hashable
      
        # Arbitrary key/value payload. If present, it will override
        # google.firebase.fcm.v1.Message.data.
        # Corresponds to the JSON property `data`
        # @return [Hash<String,String>]
        attr_accessor :data
      
        # Options for features provided by the FCM SDK for Web.
        # Corresponds to the JSON property `fcmOptions`
        # @return [Google::Apis::FcmV1::WebpushFcmOptions]
        attr_accessor :fcm_options
      
        # HTTP headers defined in webpush protocol. Refer to
        # [Webpush protocol](https://tools.ietf.org/html/rfc8030#section-5) for
        # supported headers, e.g. "TTL": "15".
        # Corresponds to the JSON property `headers`
        # @return [Hash<String,String>]
        attr_accessor :headers
      
        # Web Notification options as a JSON object. Supports Notification instance
        # properties as defined in [Web Notification
        # API](https://developer.mozilla.org/en-US/docs/Web/API/Notification). If
        # present, "title" and "body" fields override
        # [google.firebase.fcm.v1.Notification.title] and
        # [google.firebase.fcm.v1.Notification.body].
        # Corresponds to the JSON property `notification`
        # @return [Hash<String,Object>]
        attr_accessor :notification
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @data = args[:data] if args.key?(:data)
          @fcm_options = args[:fcm_options] if args.key?(:fcm_options)
          @headers = args[:headers] if args.key?(:headers)
          @notification = args[:notification] if args.key?(:notification)
        end
      end
      
      # Options for features provided by the FCM SDK for Web.
      class WebpushFcmOptions
        include Google::Apis::Core::Hashable
      
        # Label associated with the message's analytics data.
        # Corresponds to the JSON property `analyticsLabel`
        # @return [String]
        attr_accessor :analytics_label
      
        # The link to open when the user clicks on the notification.
        # For all URL values, HTTPS is required.
        # Corresponds to the JSON property `link`
        # @return [String]
        attr_accessor :link
      
        def initialize(**args)
           update!(**args)
        end
      
        # Update properties of this object
        def update!(**args)
          @analytics_label = args[:analytics_label] if args.key?(:analytics_label)
          @link = args[:link] if args.key?(:link)
        end
      end
    end
  end
end
