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; } }