content: package com.alibaba.json.bvtVO;
  
  import java.io.Serializable;
  import java.util.Date;
  import java.util.List;
  
  /**
   * Created by haihong.xiahh on 13-12-23.
   */
  public class PushMsg implements Serializable {
  
      public static final String DIR_PUSH = "push";
  
      /**
       * 
       */
      private static final long serialVersionUID = 8145512296629061628L;
  
      public static final String TAG = PushMsg.class.getSimpleName();
  
      public static final String TYPE_SYS = "sys";
  
      public static final String TYPE_WL = "wl";
  
      public static final long STATUS_TRANK_NO_NEW = 128;
  
      /**
       * id of PushMsg
       */
      private String id;
      /**
       * type
       */
      private String tp;
      /**
       * start time with unit second(s)
       */
      private long st;
      /**
       * end time with unit second(s)
       */
      private long et;
      /**
       * delay range 以10秒为单位，客户端会在[0 ~ dr*10seconds]的范围内，进行随机延时请求msg，防止服务器过载。
       */
      private long dr;
  
      private Msg msg;
  
      public String getId() {
          return id;
      }
  
      public void setId(String id) {
          this.id = id;
      }
  
      public String getTp() {
          return tp;
      }
  
      public void setTp(String tp) {
          this.tp = tp;
      }
  
      public long getSt() {
          return st;
      }
  
      public void setSt(long st) {
          this.st = st;
      }
  
      public long getEt() {
          return et;
      }
  
      public void setEt(long et) {
          this.et = et;
      }
  
      public Msg getMsg() {
          return msg;
      }
  
      public void setMsg(Msg msg) {
          this.msg = msg;
      }
  
      /**
       * 条件： <br/>
       * 1、没过期(et>=当前时间，st可以大于也可以小于当前时间)<br/>
       * 2、消息体有效<br/>
       * 
       * @return true if valid.
       */
      public boolean isValid() {
          long now = new Date().getTime() / 1000;
   
          if (now > et) {
              return false;
          }// end if
  
          if (msg == null) {
              return false;
          }// end if
  
          if (!msg.isValid()) {
              return false;
          }// end if
  
          return true;
      }
  
      /**
       * 条件 1. isValid 2. st <= now <= et
       * */
      public boolean isActiveNow() {
          if (!isValid()) {
              return false;
          }
          long now = new Date().getTime() / 1000;
  
          if (now < st) {
              return false;
          }// end if
  
          if (now > et) {
              return false;
          }// end if
  
          if (!isImagesReady()) {
              return false;
          }// end if
  
          return true;
      }
  
      /**
       * 消息的URL是否存在
       * 
       * @return true if exist.
       */
      public boolean hasUrl() {
          boolean result = true;
          if (null != msg) {
          } else {
              result = false;
          }
  
  
          return result;
      }
  
      public boolean hasText() {
          boolean result = true;
          if (null != msg) {
          } else {
              result = false;
          }
  
  
          return result;
      }
  
      /**
       * 通知所需的图片资源是否就绪
       * 
       * @return true if ready, otherwise return false.
       */
      private boolean isImagesReady() {
          List<String> list = getNewImageUrlList();
          boolean ret = null == list || 0 == list.size();
          if (!ret) {
              preparedImages(list);
          }
          return ret;
      }
  
      /**
       * 主动下载未缓存到客户端的资源图片
       */
      public void preparedImages() {
          List<String> list = getNewImageUrlList();
          preparedImages(list);
      }
  
      public void preparedImages(List<String> list) {
      }
  
      /**
       * 获取需要下载图片的URL列表
       * 
       * @return list of image URL which image's URL is not cached, otherwise
       *         return null.
       */
      private List<String> getNewImageUrlList() {
          return null;
      }
  
      public static class Msg implements Serializable {
          /**
           * 
           */
          private static final long serialVersionUID = -2020714577526457332L;
  
          private String gid;
          private String gtp;
          /**
           * 指显示在通知左侧的外部图标URL
           */
          private String ico;
          private String url;
          private String txt;
  
          private String flgs;
          private String stxt;
          private String surl;
          /**
           * 指在分享页附加的外部图片URL
           */
          private String simg;
  
          private ControlFlags controlFlags;
  
          public Msg() {
          }
  
          public String getGid() {
              return gid;
          }
  
          public void setGid(String gid) {
              this.gid = gid;
          }
  
          public String getGtp() {
              return gtp;
          }
  
          public void setGtp(String gtp) {
              this.gtp = gtp;
          }
  
          public String getIco() {
              return ico;
          }
  
          public void setIco(String icon) {
              this.ico = icon;
          }
  
          public String getUrl() {
              return url;
          }
  
          public void setUrl(String url) {
              if (null != url) {
                  url = url.trim();
              }
              this.url = url;
          }
  
          public String getTxt() {
              return txt;
          }
  
          public void setTxt(String txt) {
              this.txt = txt;
          }
  
          public String getFlgs() {
              return flgs;
          }
  
          public void setFlgs(String flgs) {
              this.flgs = flgs;
              controlFlags = new ControlFlags(flgs);
          }
  
          public String getStxt() {
              return stxt;
          }
  
          public void setStxt(String stxt) {
              this.stxt = stxt;
          }
  
          public String getSurl() {
              return surl;
          }
  
          public void setSurl(String surl) {
              this.surl = surl;
          }
  
          public String getSimg() {
              return simg;
          }
  
          public void setSimg(String simg) {
              this.simg = simg;
          }
  
          public ControlFlags getControlFlags() {
              return controlFlags;
          }
  
          /**
           * <p>
           * 条件
           * </p>
           * 0.gid 不为null 1.controlFlag 必须有效（即非空，则控制位数目足够）<br/>
           * 2.当开启分享功能时，stxt/surl/simg 至少有一个有效（非空）<br/>
           * 
           * @return true if valid.
           */
          public boolean isValid() {
  
              return true;
          }
  
          /**
           * 打印debug信息
           * 
           * @return
           */
          public String debug() {
              StringBuilder sb = new StringBuilder();
              sb.append("\n#gid=" + gid);
              sb.append("\n#gtp=" + gtp);
              sb.append("\n#ico=" + ico);
              sb.append("\n#url=" + url);
              sb.append("\n#txt=" + txt);
              sb.append("\n#flags=" + flgs);
              sb.append("\n#stxt=" + stxt);
              sb.append("\n#surl=" + surl);
              sb.append("\n#simg=" + simg);
              if (null != controlFlags) {
                  sb.append(controlFlags.debug());
              }// end if
              return sb.toString();
          }
  
          /**
           * 标志控制
           * 
           * @author wangyue.wy
           */
          public static class ControlFlags implements Serializable {
  
              /**
               * 
               */
              private static final long serialVersionUID = 6289110973325625431L;
  
              private enum INDEX_TYPE {
                  INDEX_POS, INDEX_OPEN_URL, INDEX_DIMISS, INDEX_CANCEL_BTN, INDEX_TEXT_EFFECTS, INDEX_SHARE, INDEX_ATTACH_IMAGE, INDEX_LIMIT_SHOW_MAX_ONCE
              }
  
              private final int COUNT = INDEX_TYPE.values().length;
  
              public static final int CTR_UNKNOWN = 0;
              private String text;
  
              /**
               * <p>
               * 展示位置（暂时只有顶部，居中）
               * </p>
               * <p>
               * A:顶部(default)<br/>
               * B：居中 <br/>
               * </p>
               */
              private char ctrlPos;
              /**
               * <p>
               * URL打开方式
               * </p>
               * <p>
               * A:内嵌打开(default)<br/>
               * B：外部浏览器打开 <br/>
               * </p>
               */
              private char ctrlOpenUrl;
              /**
               * <p>
               * 消失方式
               * </p>
               * <p>
               * A:不消失（直至过期失效）(default)<br/>
               * B:点击消失<br/>
               * C:解锁消失 <br/>
               * D:浏览消失<br/>
               * E:解锁+点击消失 <br/>
               * F:解锁+浏览消失 <br/>
               * G:解锁+点击+浏览消失 <br/>
               * </p>
               */
              private char ctrlDimiss;
              /**
               * <p>
               * 删除按钮
               * </p>
               * <p>
               * A:显示(default)<br/>
               * B:不显示 <br/>
               * </p>
               */
              private char ctrlCancelBtn;
              /**
               * <p>
               * 是否支持分享
               * </p>
               * <p>
               * A:开启(default)<br/>
               * B:关闭<br/>
               * </p>
               */
              private char ctrlShare;
              /**
               * <p>
               * 附加图片来源
               * </p>
               * <p>
               * A:无图片(default)<br/>
               * B:使用屏幕截图<br/>
               * C:使用服务器指定的URL网络图片
               * </p>
               */
              private char ctrlAttachImage;
              /**
               * <p>
               * 文案展示效果
               * </p>
               * <p>
               * A:静止显示(default)<br/>
               * B:滚动 <br/>
               * </p>
               */
              private char ctrlTextEffects;
  
              /**
               * <p>
               * <b>同一gid通知</b>，限制最多展示一次
               * </p>
               * <p>
               * A:否(default)
               * </p>
               * <p>
               * B:是
               * </p>
               */
              private char ctrlLimitShowMaxOnce;
  
              public ControlFlags(String param) {
  
                  this.text = param;
                  ctrlPos = text.charAt(INDEX_TYPE.INDEX_POS.ordinal());
                  ctrlOpenUrl = text.charAt(INDEX_TYPE.INDEX_OPEN_URL.ordinal());
                  ctrlDimiss = text.charAt(INDEX_TYPE.INDEX_DIMISS.ordinal());
                  ctrlCancelBtn = text.charAt(INDEX_TYPE.INDEX_CANCEL_BTN.ordinal());
                  ctrlShare = text.charAt(INDEX_TYPE.INDEX_SHARE.ordinal());
                  ctrlAttachImage = text.charAt(INDEX_TYPE.INDEX_ATTACH_IMAGE.ordinal());
                  ctrlTextEffects = text.charAt(INDEX_TYPE.INDEX_TEXT_EFFECTS.ordinal());
                  ctrlLimitShowMaxOnce = text.charAt(INDEX_TYPE.INDEX_LIMIT_SHOW_MAX_ONCE.ordinal());
              }
  
              /* control of position */
              public boolean posTop() {
                  // default
                  return 'A' == ctrlPos || ctrlPos > 'B' || ctrlPos < 'A';
              }
  
              public boolean posCenter() {
                  return 'B' == ctrlPos;
              }
  
              /* control of open URL mode */
              public boolean openUrlByInner() {
                  // default
                  return 'A' == ctrlOpenUrl || ctrlOpenUrl > 'B' || ctrlPos < 'A';
              }
  
              public boolean openUrlByOutside() {
                  return 'B' == ctrlOpenUrl;
              }
  
              /* control of dismiss */
              public boolean nerverDismiss() {
                  // default
                  return 'A' == ctrlDimiss || ctrlDimiss > 'G' || ctrlPos < 'A';
              }
  
              public boolean dismissByUnlock() {
                  return 'C' == ctrlDimiss || 'D' == ctrlDimiss;
              }
  
              public boolean dismissByClick() {
                  return 'B' == ctrlDimiss || 'D' == ctrlDimiss;
              }
  
              /* control of show cancel btn */
              public boolean showCancelBtn() {
                  // default
                  return 'A' == ctrlCancelBtn || ctrlCancelBtn > 'B' || ctrlPos < 'A';
              }
  
              /**
               * 是否首页 或 Web页，开启分享按钮
               * 
               * @return true if Not 'B'(B:首页 和 Web页均关闭分享按钮显示)
               */
              public boolean enableShare() {
                  return 'B' != ctrlShare;
              }
  
              /* control of share */
              /**
               * 首页是否支持通知显示分享按钮
               * 
               * @return true if equal 'A', 'C' or [*,A] || [D,*]
               */
              public boolean enableShareInHomePage() {
                  // default
                  return 'A' == ctrlShare || 'C' == ctrlShare || ctrlShare > 'D' || ctrlPos < 'A';
              }
  
              /**
               * Web页是否支持通知显示分享按钮
               * 
               * @return true if equal 'A' Or 'D'
               */
              public boolean enableShareInWebPage() {
                  // default
                  return 'A' == ctrlShare || 'D' == ctrlShare || ctrlShare > 'D' || ctrlPos < 'A';
              }
  
              /* control of use screen shot image */
              public boolean attachNoImage() {
                  // default
                  return 'A' == ctrlAttachImage || ctrlAttachImage > 'C' || ctrlPos < 'A';
              }
  
              public boolean attachScreenShot() {
                  return 'B' == ctrlAttachImage;
              }
  
              public boolean attachWebUrlImage() {
                  return 'C' == ctrlAttachImage;
              }
  
              /* control of text effects */
              public boolean isStaicTextEffects() {
                  return 'A' == ctrlTextEffects || ctrlTextEffects > 'C' || ctrlPos < 'A';
              }
  
              public boolean isScrollTextEffects() {
                  return 'B' == ctrlTextEffects;
              }
  
              public boolean isBlingTextEffects() {
                  return 'C' == ctrlTextEffects;
              }
  
              public boolean isLimitShowMaxOnce() {
                  return 'B' == ctrlLimitShowMaxOnce;
              }
  
              /**
               * 
               * 控制字不能为空<br/>
               * 控制字长度不少于所需长度
               * 
               * @return true if valid, otherwise return false.
               */
              public boolean isValid() {
  
                  return true;
              }
  
              /**
               * 打印调试信息
               * 
               * @return
               */
              public String debug() {
                  StringBuilder sb = new StringBuilder();
                  sb.append("\n>>>>>>>>>>>");
                  sb.append("\nflag:" + text);
                  sb.append("\n(" + INDEX_TYPE.INDEX_POS.ordinal() + ")ctrlPos=" + ctrlPos);
                  sb.append("\n(" + INDEX_TYPE.INDEX_OPEN_URL.ordinal() + ")ctrlOpenUrl=" + ctrlOpenUrl);
                  sb.append("\n(" + INDEX_TYPE.INDEX_DIMISS.ordinal() + ")ctrlDismiss=" + ctrlDimiss);
                  sb.append("\n(" + INDEX_TYPE.INDEX_CANCEL_BTN.ordinal() + ")ctrlCancelBtn=" + ctrlCancelBtn);
                  sb.append("\n(" + INDEX_TYPE.INDEX_TEXT_EFFECTS.ordinal() + ")ctrlTextEffects=" + ctrlTextEffects);
                  sb.append("\n(" + INDEX_TYPE.INDEX_SHARE.ordinal() + ")ctrlShare=" + ctrlShare);
                  sb.append("\n(" + INDEX_TYPE.INDEX_ATTACH_IMAGE.ordinal() + ")ctrlAttachImage=" + ctrlAttachImage);
                  sb.append("\n(" + INDEX_TYPE.INDEX_LIMIT_SHOW_MAX_ONCE.ordinal() + ")ctrlLimitShowMaxOnce="
                          + ctrlLimitShowMaxOnce);
                  sb.append("\n>>>>>>>>>>>");
                  return sb.toString();
              }
          }
      }
  
      /**
       * 打印debug信息
       * 
       * @return
       */
      public String debug() {
          StringBuilder sb = new StringBuilder();
          sb.append("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
          sb.append("\nid=" + id);
          sb.append("\nst=" + st);
          sb.append("\net=" + et);
          sb.append("\ndr=" + dr);
          sb.append("\nmsg=\n" + msg.debug());
          sb.append("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
          return sb.toString();
      }
  
      public long getDr() {
          return dr;
      }
  
      public void setDr(long dr) {
          this.dr = dr;
      }
  }
  