content: /**
   * Copyright 2010-present Facebook.
   *
   * 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.
   */
  
  package com.facebook.model;
  
  import org.json.JSONObject;
  
  import java.util.Date;
  import java.util.List;
  
  /**
   * Provides a strongly-typed representation of an Open Graph Action.
   * For more documentation of OG Actions, see: https://developers.facebook.com/docs/opengraph/actions/
   *
   * Note that this interface is intended to be used with GraphObject.Factory or OpenGraphAction.Factory
   * and not implemented directly.
   */
  public interface OpenGraphAction extends GraphObject {
      /**
       * Gets the ID of the action.
       * @return the ID
       */
      String getId();
  
      /**
       * Sets the ID of the action.
       * @param id the ID
       */
      void setId(String id);
  
      /**
       * Gets the type of the action, which is a string in the form "mynamespace:mytype".
       * @return the type
       */
      String getType();
  
      /**
       * Sets the type of the action, which is a string in the form "mynamespace:mytype".
       * @param type the type
       */
      void setType(String type);
  
      /**
       * Gets the start time of the action.
       * @return the start time
       */
      Date getStartTime();
  
      /**
       * Sets the start time of the action.
       * @param startTime the start time
       */
      void setStartTime(Date startTime);
  
      /**
       * Gets the end time of the action.
       * @return the end time
       */
      Date getEndTime();
  
      /**
       * Sets the end time of the action.
       * @param endTime the end time
       */
      void setEndTime(Date endTime);
  
      /**
       * Gets the time the action was published, if any.
       * @return the publish time
       */
      Date getPublishTime();
  
      /**
       * Sets the time the action was published.
       * @param publishTime the publish time
       */
      void setPublishTime(Date publishTime);
  
      /**
       * Gets the time the action was created.
       * @return the creation time
       */
      public Date getCreatedTime();
  
      /**
       * Sets the time the action was created.
       * @param createdTime the creation time
       */
      public void setCreatedTime(Date createdTime);
  
      /**
       * Gets the time the action expires at.
       * @return the expiration time
       */
      public Date getExpiresTime();
  
      /**
       * Sets the time the action expires at.
       * @param expiresTime the expiration time
       */
      public void setExpiresTime(Date expiresTime);
  
      /**
       * Gets the unique string which will be passed to the OG Action owner's website
       * when a user clicks through this action on Facebook.
       * @return the ref string
       */
      String getRef();
  
      /**
       * Sets the unique string which will be passed to the OG Action owner's website
       * when a user clicks through this action on Facebook.
       * @param ref the ref string
       */
      void setRef(String ref);
  
      /**
       * Gets the message assoicated with the action.
       * @return the message
       */
      String getMessage();
  
      /**
       * Sets the message associated with the action.
       * @param message the message
       */
      void setMessage(String message);
  
      /**
       * Gets the place where the action took place.
       * @return the place
       */
      GraphPlace getPlace();
  
      /**
       * Sets the place where the action took place.
       * @param place the place
       */
      void setPlace(GraphPlace place);
  
      /**
       * Gets the list of profiles that were tagged in the action.
       * @return the profiles that were tagged in the action
       */
      GraphObjectList<GraphObject> getTags();
  
      /**
       * Sets the list of profiles that were tagged in the action.
       * @param tags the profiles that were tagged in the action
       */
      void setTags(List<? extends GraphObject> tags);
  
      /**
       * Gets the images that were associated with the action.
       * @return the images
       */
      List<JSONObject> getImage();
  
      /**
       * Sets the images that were associated with the action.
       * @param image the images
       */
      void setImage(List<JSONObject> image);
  
      /**
       * Sets the images associated with the Open Graph action by specifying their URLs. This is a helper
       * that will create GraphObjects with the correct URLs and populate the property with those objects.
       * @param urls the URLs
       */
      @CreateGraphObject("url")
      @PropertyName("image")
      void setImageUrls(List<String> urls);
  
      /**
       * Gets the from-user associated with the action.
       * @return the user
       */
      GraphUser getFrom();
  
      /**
       * Sets the from-user associated with the action.
       * @param from the from-user
       */
      void setFrom(GraphUser from);
  
      /**
       * Gets the 'likes' that have been performed on this action.
       * @return the likes
       */
      public JSONObject getLikes();
  
      /**
       * Sets the 'likes' that have been performed on this action.
       * @param likes the likes
       */
      public void setLikes(JSONObject likes);
  
      /**
       * Gets the application that created this action.
       * @return the application
       */
      GraphObject getApplication();
  
      /**
       * Sets the application that created this action.
       * @param application the application
       */
      void setApplication(GraphObject application);
  
      /**
       * Gets the comments that have been made on this action.
       * @return the comments
       */
      public JSONObject getComments();
  
      /**
       * Sets the comments that have been made on this action.
       * @param comments the comments
       */
      void setComments(JSONObject comments);
  
      /**
       * Gets the type-specific data for this action; for instance, any properties
       * referencing Open Graph objects will appear under here.
       * @return a GraphObject representing the type-specific data
       */
      GraphObject getData();
  
      /**
       * Sets the type-specific data for this action.
       * @param data a GraphObject representing the type-specific data
       */
      void setData(GraphObject data);
  
  
      /**
       * Gets whether the action has been explicitly shared by the user. See
       * <a href="https://developers.facebook.com/docs/opengraph/guides/explicit-sharing/">Explicit Sharing</a> for
       * more information.
       * @return true if this action was explicitly shared
       */
      @PropertyName("fb:explicitly_shared")
      boolean getExplicitlyShared();
  
      /**
       * Sets whether the action has been explicitly shared by the user. See
       * <a href="https://developers.facebook.com/docs/opengraph/guides/explicit-sharing/">Explicit Sharing</a> for
       * more information. You should only specify this property if explicit sharing has been enabled for an
       * Open Graph action type.
       * @param explicitlyShared true if this action was explicitly shared
       */
      @PropertyName("fb:explicitly_shared")
      void setExplicitlyShared(boolean explicitlyShared);
  
      /**
       * Exposes helpers for creating instances of OpenGraphAction.
       */
      final class Factory {
          /**
           * Creates an OpenGraphAction suitable for posting via, e.g., a native Share dialog.
           * @return an OpenGraphAction
           */
          @Deprecated
          public static OpenGraphAction createForPost() {
              return createForPost(OpenGraphAction.class, null);
          }
  
          /**
           * Creates an OpenGraphAction suitable for posting via, e.g., a native Share dialog.
           * @param type the Open Graph action type for the action, or null if it will be specified later
           * @return an OpenGraphAction
           */
          public static OpenGraphAction createForPost(String type) {
              return createForPost(OpenGraphAction.class, type);
          }
  
          /**
           * Creates an OpenGraphAction suitable for posting via, e.g., a native Share dialog.
           * @param type the Open Graph action type for the action, or null if it will be specified later
           * @param graphObjectClass the OpenGraphAction-derived type to return
           * @return an OpenGraphAction
           */
          public static <T extends OpenGraphAction> T createForPost(Class<T> graphObjectClass, String type) {
              T object = GraphObject.Factory.create(graphObjectClass);
  
              if (type != null) {
                  object.setType(type);
              }
  
              return object;
          }
      }
  }
  