private static int sendSegmentPush(String text, String targetOS, int ttl, APIClient apiClient)
      throws IOException {
    Alert<String> alert = new Alert<String>(text);
    // remove this line if you just want to send it to all registered
    // devices
    alert.setTargetOS(targetOS);
    // do not keep the push more than 2 minutes if device is not
    // available
    alert.setTTL(ttl);

    // push to all devices that didn't open the app since
    // last day (last 24 hours).
    List<Alert.BehaviorSegment> segments = new ArrayList<Alert.BehaviorSegment>();
    Alert.BehaviorSegment segment =
        new Alert.BehaviorSegment(
            Alert.Behavior.last_app_open,
            new Alert.BehaviorSegment.Interval(Alert.IntervalUnit.day, 1));
    // we are interested on devices that did NOT open the app, so we want to exclude devices
    // that did match the above interval
    segment.setExclude(true);
    segments.add(segment);

    alert.setBehaviorSegments(segments);

    return apiClient.publish(alert);
  }
  private static int sendPush(String text, String targetOS, int ttl, APIClient apiClient)
      throws IOException {
    Alert<String> alert = new Alert<String>(text);
    // remove this line if you just want to send it to all registered
    // devices
    alert.setTargetOS(targetOS);
    // do not keep the push more than 2 minutes if device is not
    // available
    alert.setTTL(ttl);

    // Uncomment this line if you prefer to implicitly create tags
    // if there are tags passed on this alert that do not
    // exist on the project
    // alert.setImplicitTagCreation(true);

    List<String> tags = new ArrayList<String>();
    // send push to all registered devices
    tags.add(Alert.ALL_PUSH_TAG);
    alert.setTags(tags);

    // make this push 'normal' priority, meaning the gateway (GCM, APNS)
    // could delay it if device is sleeping
    alert.setNotificationPriority(Alert.Priority.normal);

    return apiClient.publish(alert);
  }
  private static Alert<String> buildScheduledPush(
      String text, Date scheduledAt, String targetOS, int ttl) {
    Alert<String> alert = new Alert<String>(text);
    // remove this line if you just want to send it to all registered
    // devices
    alert.setTargetOS(targetOS);
    // do not keep the push more than 2 minutes if device is not
    // available
    alert.setTTL(ttl);

    List<String> tags = new ArrayList<String>();
    // send push to all registered devices
    tags.add("test-channel");
    tags.add("dev-channel");
    alert.setTags(tags, Alert.TAG_MATCH_OP_AND);

    // make this push 'normal' priority, meaning the gateway (GCM, APNS)
    // could delay it if device is sleeping
    alert.setNotificationPriority(Alert.Priority.normal);

    alert.setScheduledAt(scheduledAt);

    return alert;
  }
  /** @param args */
  public static void main(String[] args) {

    APIClient apiClient = null;

    // 1. Build the api client

    try {

      Properties properties = loadProperties();

      PUBLISH_KEY = properties.getProperty(PROP_PUBLISH_KEY);
      PUBLISH_SECRET = properties.getProperty(PROP_PUBLISH_SECRET);

      apiClient =
          new APIClient(properties, PUBLISH_KEY, PUBLISH_SECRET, RequestStrategy.URL_SIGNATURE);
    } catch (Exception e) {
      e.printStackTrace();
      System.exit(1);
    }

    // 2. Publish

    try {
      StringBuffer text = getText(args);
      int id = sendPush(text.toString(), "android", 120, apiClient);
      logger.debug("Push sent with id " + id);
    } catch (Exception e) {
      e.printStackTrace();
      System.exit(1);
    }

    // 3. List tags
    try {
      List<Tag> tags = getTags(apiClient);
      logger.debug("Available tags on SaaS: ");
      for (Tag tag : tags) {
        logger.debug(
            "Tag "
                + tag.getName()
                + " - id "
                + tag.getId()
                + " - created at : "
                + tag.getCreatedAt()
                + " - devices: "
                + tag.getDevices()
                + " - deprecated: "
                + tag.isDeprecated());
      }
    } catch (Exception e) {
      e.printStackTrace();
      System.exit(1);
    }

    // 4. Create, get, deprecate and remove a tag
    try {
      String tagName = "api-test";
      int id = createTag(tagName, apiClient);
      logger.debug("Tag " + tagName + " created with id " + id);
      Tag tag = getTag(id, apiClient);
      logger.debug(
          "Tag "
              + tag.getName()
              + " - id "
              + tag.getId()
              + " - created at : "
              + tag.getCreatedAt()
              + " - devices: "
              + tag.getDevices()
              + " - deprecated: "
              + tag.isDeprecated());
      deprecateTag(id, apiClient);
      logger.debug("Tag with id " + id + " was deprecated");
      tag = getTag(id, apiClient);
      logger.debug(
          "Tag "
              + tag.getName()
              + " - id "
              + tag.getId()
              + " - created at : "
              + tag.getCreatedAt()
              + " - devices: "
              + tag.getDevices()
              + " - deprecated: "
              + tag.isDeprecated());
      deleteTag(id, apiClient);
      logger.debug("Tag with id " + id + " was removed");
    } catch (Exception e) {
      e.printStackTrace();
      System.exit(1);
    }

    // 5. Schedule a push
    try {
      Calendar later = (Calendar) Calendar.getInstance().clone();
      later.add(Calendar.MINUTE, 15);
      Date scheduledAt = later.getTime();
      Alert<String> alert =
          buildScheduledPush("This is a scheduled push", scheduledAt, "android", 120);

      int id = apiClient.publish(alert);
      logger.debug("Push scheduled with id " + id);

      // 6. Get push info
      logger.debug("Get push info for id " + id);
      try {
        PushInfo info = apiClient.getPush(id);
        logger.debug("Info about recently created push: " + info);
      } catch (Exception e) {
        e.printStackTrace();
      }
      ;

      // 7. List all scheduled pushes
      logger.debug("List all scheduled pushes");
      try {
        ListPage<PushInfo> page;
        boolean eol = false;
        int offset = 0;
        while (!eol) {
          page = apiClient.getScheduledPushes(offset);
          for (PushInfo pushInfo : page.getItems()) {
            logger.debug(pushInfo);
          }
          offset += page.getItems().size();
          eol = page.getItems().size() < page.getPageSize();
        }
      } catch (Exception e) {
        e.printStackTrace();
      }
      ;

      // 7. Update push
      logger.debug("Update scheduled push with id " + id);
      // Delay alert 15 minutes more
      later.add(Calendar.MINUTE, 15);
      alert.setScheduledAt(later.getTime());
      // And change text
      alert.setAlert("This is a nice scheduled push");
      apiClient.updatePush(id, alert);

      // 8. Remove the push we have just scheduled
      deleteScheduledPush(id, apiClient);
      logger.debug("Push scheduled with id " + id + " was removed");
    } catch (Exception e) {
      e.printStackTrace();
      System.exit(1);
    }
  }