/*
* Copyright (c) 2013-2016. Urban Airship and Contributors
*/
package com.urbanairship.api.push.model.notification.android;
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableMap;
import com.urbanairship.api.push.model.DeviceType;
import com.urbanairship.api.push.model.PushExpiry;
import com.urbanairship.api.push.model.PushModelObject;
import com.urbanairship.api.push.model.notification.DevicePayloadOverride;
import com.urbanairship.api.push.model.notification.Interactive;
import java.util.Map;
public final class AndroidDevicePayload extends PushModelObject implements DevicePayloadOverride {
private final Optional<String> alert;
private final Optional<String> collapseKey;
private final Optional<PushExpiry> timeToLive;
private final Optional<String> deliveryPriority;
private final Optional<Boolean> delayWhileIdle;
private final Optional<ImmutableMap<String, String>> extra;
private final Optional<Interactive> interactive;
private final Optional<String> title;
private final Optional<Boolean> localOnly;
private final Optional<Wearable> wearable;
private final Optional<String> summary;
private final Optional<Style> style;
private final Optional<String> sound;
// Android L features
private final Optional<Integer> priority;
private final Optional<Category> category;
private final Optional<Integer> visibility;
private final Optional<PublicNotification> publicNotification;
private AndroidDevicePayload(Builder builder) {
this.alert = Optional.fromNullable(builder.alert);
this.collapseKey = Optional.fromNullable(builder.collapseKey);
this.timeToLive = Optional.fromNullable(builder.timeToLive);
this.deliveryPriority = Optional.fromNullable(builder.deliveryPriority);
this.delayWhileIdle = Optional.fromNullable(builder.delayWhileIdle);
if (builder.extra.build().isEmpty()) {
this.extra = Optional.absent();
} else {
this.extra = Optional.of(builder.extra.build());
}
this.interactive = Optional.fromNullable(builder.interactive);
this.title = Optional.fromNullable(builder.title);
this.localOnly = Optional.fromNullable(builder.localOnly);
this.wearable = Optional.fromNullable(builder.wearable);
this.summary = Optional.fromNullable(builder.summary);
this.style = Optional.fromNullable(builder.style);
this.sound = Optional.fromNullable(builder.sound);
this.priority = Optional.fromNullable(builder.priority);
this.category = Optional.fromNullable(builder.category);
this.visibility = Optional.fromNullable(builder.visibility);
this.publicNotification = Optional.fromNullable(builder.publicNotification);
}
/**
* New AndroidDevicePayload Builder.
*
* @return Builder
*/
public static Builder newBuilder() {
return new Builder();
}
/**
* Get the device type.
*
* @return DeviceType.ANDROID
*/
@Override
public DeviceType getDeviceType() {
return DeviceType.ANDROID;
}
/**
* Get the alert.
*
* @return Optional String alert
*/
@Override
public Optional<String> getAlert() {
return alert;
}
/**
* Get the collapse key.
*
* @return Optional String collapse key
*/
public Optional<String> getCollapseKey() {
return collapseKey;
}
/**
* Get the push expiry.
*
* @return Optional PushExpiry object
*/
public Optional<PushExpiry> getTimeToLive() {
return timeToLive;
}
/**
* Get the delivery priority.
*
* @return Optional String
*/
public Optional<String> getDeliveryPriority() {
return deliveryPriority;
}
/**
* Get the delay while idle flag.
*
* @return Optional boolean delay while idle
*/
public Optional<Boolean> getDelayWhileIdle() {
return delayWhileIdle;
}
/**
* Get an extra mapping of key-value pairs.
*
* @return Optional ImmutableMap of Strings
*/
public Optional<ImmutableMap<String, String>> getExtra() {
return extra;
}
/**
* Get the interactive notification payload.
*
* @return Optional Interactive object
*/
public Optional<Interactive> getInteractive() {
return interactive;
}
/**
* Get the title string.
*
* @return Optional String title
*/
public Optional<String> getTitle() {
return title;
}
/**
* Get the local only flag.
*
* @return Optional Boolean local only flag.
*/
public Optional<Boolean> getLocalOnly() {
return localOnly;
}
/**
* Get the wearable payload.
*
* @return Optional Wearable object.
*/
public Optional<Wearable> getWearable() {
return wearable;
}
/**
* Get the summary string.
*
* @return Optional String summary
*/
public Optional<String> getSummary() {
return summary;
}
/**
* Get the style payload.
*
* @return Optional Style object
*/
public Optional<Style> getStyle() {
return style;
}
/**
* Get the sound string.
*
* @return Optional String sound
*/
public Optional<String> getSound() {
return sound;
}
/**
* Get the priority specifier.
*
* @return Optional integer between -2 and 2.
*/
public Optional<Integer> getPriority() {
return priority;
}
/**
* Get the category specifier.
*
* @return Optional Category object.
*/
public Optional<Category> getCategory() {
return category;
}
/**
* Get the visibility specifier.
*
* @return Optional integer between -1 and 1
*/
public Optional<Integer> getVisibility() {
return visibility;
}
/**
* Get the public notification payload.
*
* @return Optional PublicNotification object.
*/
public Optional<PublicNotification> getPublicNotification() {
return publicNotification;
}
@Override
public String toString() {
return "AndroidDevicePayload{" +
"alert=" + alert +
", collapseKey=" + collapseKey +
", timeToLive=" + timeToLive +
", delayWhileIdle=" + delayWhileIdle +
", deliveryPriority=" + deliveryPriority +
", extra=" + extra +
", interactive=" + interactive +
", title=" + title +
", localOnly=" + localOnly +
", wearable=" + wearable +
", summary=" + summary +
", style=" + style +
", sound=" + sound +
", priority=" + priority +
", category=" + category +
", visibility=" + visibility +
", publicNotification=" + publicNotification +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
AndroidDevicePayload that = (AndroidDevicePayload) o;
if (!alert.equals(that.alert)) return false;
if (!category.equals(that.category)) return false;
if (!collapseKey.equals(that.collapseKey)) return false;
if (!delayWhileIdle.equals(that.delayWhileIdle)) return false;
if (!deliveryPriority.equals(that.deliveryPriority)) return false;
if (!extra.equals(that.extra)) return false;
if (!interactive.equals(that.interactive)) return false;
if (!localOnly.equals(that.localOnly)) return false;
if (!priority.equals(that.priority)) return false;
if (!style.equals(that.style)) return false;
if (!sound.equals(that.sound)) return false;
if (!summary.equals(that.summary)) return false;
if (!timeToLive.equals(that.timeToLive)) return false;
if (!title.equals(that.title)) return false;
if (!visibility.equals(that.visibility)) return false;
if (!wearable.equals(that.wearable)) return false;
if (!publicNotification.equals(this.publicNotification)) return false;
return true;
}
@Override
public int hashCode() {
int result = alert.hashCode();
result = 31 * result + collapseKey.hashCode();
result = 31 * result + timeToLive.hashCode();
result = 31 * result + delayWhileIdle.hashCode();
result = 31 * result + deliveryPriority.hashCode();
result = 31 * result + extra.hashCode();
result = 31 * result + interactive.hashCode();
result = 31 * result + title.hashCode();
result = 31 * result + localOnly.hashCode();
result = 31 * result + wearable.hashCode();
result = 31 * result + summary.hashCode();
result = 31 * result + style.hashCode();
result = 31 * result + sound.hashCode();
result = 31 * result + priority.hashCode();
result = 31 * result + category.hashCode();
result = 31 * result + visibility.hashCode();
result = 31 * result + publicNotification.hashCode();
return result;
}
public static class Builder {
private String alert = null;
private String collapseKey = null;
private PushExpiry timeToLive = null;
private Boolean delayWhileIdle = null;
private String deliveryPriority = null;
private ImmutableMap.Builder<String, String> extra = ImmutableMap.builder();
private Interactive interactive = null;
private String title = null;
private Boolean localOnly = null;
private Wearable wearable = null;
private String summary = null;
private Style style = null;
private String sound = null;
// Android L features
private Integer priority = null;
private Category category = null;
private Integer visibility = null;
private PublicNotification publicNotification = null;
private Builder() { }
/**
* Set the alert string.
*
* @param alert String
* @return Builder
*/
public Builder setAlert(String alert) {
this.alert = alert;
return this;
}
/**
* Set the collapse key string.
*
* @param collapseKey String
* @return Builder
*/
public Builder setCollapseKey(String collapseKey) {
this.collapseKey = collapseKey;
return this;
}
/**
* Set the push expiry.
*
* @param value PushExpiry
* @return Builder
*/
public Builder setTimeToLive(PushExpiry value) {
this.timeToLive = value;
return this;
}
/**
* Set the delivery priority.
*
* @param deliveryPriority String
* @return Builder
*/
public Builder setDeliveryPriority(String deliveryPriority) {
Preconditions.checkArgument(
deliveryPriority.equals("high") || deliveryPriority.equals("normal"),
"Delivery priority must be one of \"high\" or \"normal\"."
);
this.deliveryPriority = deliveryPriority;
return this;
}
/**
* Set the delay while idle flag.
*
* @param value boolean
* @return Builder
*/
public Builder setDelayWhileIdle(boolean value) {
this.delayWhileIdle = value;
return this;
}
/**
* Add an extra key-value pair.
*
* @param key String
* @param value String
* @return Builder
*/
public Builder addExtraEntry(String key, String value) {
this.extra.put(key, value);
return this;
}
/**
* Add a Map of key-value pairs.
*
* @param entries A Map of Strings
* @return Builder
*/
public Builder addAllExtraEntries(Map<String, String> entries) {
this.extra.putAll(entries);
return this;
}
/**
* Set the interactive payload.
*
* @param value Interactive
* @return Builder
*/
public Builder setInteractive(Interactive value) {
this.interactive = value;
return this;
}
/**
* Set the title string.
*
* @param value String
* @return Builder
*/
public Builder setTitle(String value) {
this.title = value;
return this;
}
/**
* Set the local only flag.
*
* @param value Boolean
* @return Builder
*/
public Builder setLocalOnly(Boolean value) {
this.localOnly = value;
return this;
}
/**
* Set the wearable payload.
*
* @param value Wearable
* @return Builder
*/
public Builder setWearable(Wearable value) {
this.wearable = value;
return this;
}
/**
* Set the summary string.
*
* @param value String
* @return Builder
*/
public Builder setSummary(String value) {
this.summary = value;
return this;
}
/**
* Set the style payload.
*
* @param value Style
* @return Builder
*/
public Builder setStyle(Style value) {
this.style = value;
return this;
}
/**
* Set the sound string.
*
* @param sound String
* @return Builder
*/
public Builder setSound(String sound) {
this.sound = sound;
return this;
}
/**
* Set the priority specifier.
*
* @param value Integer
* @return Builder
*/
public Builder setPriority(Integer value) {
Preconditions.checkArgument(value < 3 && value > -3, "priority must be an integer between -2 and 2");
this.priority = value;
return this;
}
/**
* Set the category specifier.
*
* @param value Category
* @return Builder
*/
public Builder setCategory(Category value) {
this.category = value;
return this;
}
/**
* Set the visibility specifier.
*
* @param value Integer
* @return Builder
*/
public Builder setVisibility(Integer value) {
Preconditions.checkArgument(value < 2 && value > -2, "visibility must be an integer between -2 and 2");
this.visibility = value;
return this;
}
/**
* Set the public notification payload.
*
* @param publicNotification PublicNotification
* @return Builder
*/
public Builder setPublicNotification(PublicNotification publicNotification) {
this.publicNotification = publicNotification;
return this;
}
/**
* Build the AndroidDevicePayload object.
*
* @return AndroidDevicePayload
*/
public AndroidDevicePayload build() {
return new AndroidDevicePayload(this);
}
}
}