package net.oschina.app; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InvalidClassException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; import java.net.URLEncoder; import java.util.Hashtable; import java.util.Properties; import java.util.UUID; import net.oschina.app.api.ApiClient; import net.oschina.app.bean.ActiveList; import net.oschina.app.bean.Blog; import net.oschina.app.bean.BlogCommentList; import net.oschina.app.bean.BlogList; import net.oschina.app.bean.CommentList; import net.oschina.app.bean.FavoriteList; import net.oschina.app.bean.FriendList; import net.oschina.app.bean.MessageList; import net.oschina.app.bean.MyInformation; import net.oschina.app.bean.News; import net.oschina.app.bean.NewsList; import net.oschina.app.bean.Notice; import net.oschina.app.bean.Post; import net.oschina.app.bean.PostList; import net.oschina.app.bean.Result; import net.oschina.app.bean.SearchList; import net.oschina.app.bean.Software; import net.oschina.app.bean.SoftwareCatalogList; import net.oschina.app.bean.SoftwareList; import net.oschina.app.bean.Tweet; import net.oschina.app.bean.TweetList; import net.oschina.app.bean.User; import net.oschina.app.bean.UserInformation; import net.oschina.app.common.CyptoUtils; import net.oschina.app.common.FileUtils; import net.oschina.app.common.ImageUtils; import net.oschina.app.common.MethodsCompat; import net.oschina.app.common.StringUtils; import net.oschina.app.common.UIHelper; import android.app.Application; import android.content.Context; import android.content.pm.PackageInfo; import android.content.pm.PackageManager.NameNotFoundException; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.media.AudioManager; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.os.Handler; import android.os.Message; import android.webkit.CacheManager; /** * 全局应用程序类:用于保存和调用全局应用配置及访问网络数据 * @author liux (http://my.oschina.net/liux) * @version 1.0 * @created 2012-3-21 */ public class AppContext extends Application { public static final int NETTYPE_WIFI = 0x01; public static final int NETTYPE_CMWAP = 0x02; public static final int NETTYPE_CMNET = 0x03; public static final int PAGE_SIZE = 20;//默认分页大小 private static final int CACHE_TIME = 60*60000;//缓存失效时间 private boolean login = false; //登录状态 private int loginUid = 0; //登录用户的id private Hashtable<String, Object> memCacheRegion = new Hashtable<String, Object>(); private Handler unLoginHandler = new Handler(){ public void handleMessage(Message msg) { if(msg.what == 1){ UIHelper.ToastMessage(AppContext.this, getString(R.string.msg_login_error)); UIHelper.showLoginDialog(AppContext.this); } } }; @Override public void onCreate() { super.onCreate(); //注册App异常崩溃处理器 Thread.setDefaultUncaughtExceptionHandler(AppException.getAppExceptionHandler()); } /** * 检测当前系统声音是否为正常模式 * @return */ public boolean isAudioNormal() { AudioManager mAudioManager = (AudioManager)getSystemService(AUDIO_SERVICE); return mAudioManager.getRingerMode() == AudioManager.RINGER_MODE_NORMAL; } /** * 应用程序是否发出提示音 * @return */ public boolean isAppSound() { return isAudioNormal() && isVoice(); } /** * 检测网络是否可用 * @return */ public boolean isNetworkConnected() { ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo ni = cm.getActiveNetworkInfo(); return ni != null && ni.isConnectedOrConnecting(); } /** * 获取当前网络类型 * @return 0:没有网络 1:WIFI网络 2:WAP网络 3:NET网络 */ public int getNetworkType() { int netType = 0; ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); if (networkInfo == null) { return netType; } int nType = networkInfo.getType(); if (nType == ConnectivityManager.TYPE_MOBILE) { String extraInfo = networkInfo.getExtraInfo(); if(!StringUtils.isEmpty(extraInfo)){ if (extraInfo.toLowerCase().equals("cmnet")) { netType = NETTYPE_CMNET; } else { netType = NETTYPE_CMWAP; } } } else if (nType == ConnectivityManager.TYPE_WIFI) { netType = NETTYPE_WIFI; } return netType; } /** * 判断当前版本是否兼容目标版本的方法 * @param VersionCode * @return */ public static boolean isMethodsCompat(int VersionCode) { int currentVersion = android.os.Build.VERSION.SDK_INT; return currentVersion >= VersionCode; } /** * 获取App安装包信息 * @return */ public PackageInfo getPackageInfo() { PackageInfo info = null; try { info = getPackageManager().getPackageInfo(getPackageName(), 0); } catch (NameNotFoundException e) { e.printStackTrace(System.err); } if(info == null) info = new PackageInfo(); return info; } /** * 获取App唯一标识 * @return */ public String getAppId() { String uniqueID = getProperty(AppConfig.CONF_APP_UNIQUEID); if(StringUtils.isEmpty(uniqueID)){ uniqueID = UUID.randomUUID().toString(); setProperty(AppConfig.CONF_APP_UNIQUEID, uniqueID); } return uniqueID; } /** * 用户是否登录 * @return */ public boolean isLogin() { return login; } /** * 获取登录用户id * @return */ public int getLoginUid() { return this.loginUid; } /** * 用户注销 */ public void Logout() { ApiClient.cleanCookie(); this.cleanCookie(); this.login = false; this.loginUid = 0; } /** * 未登录或修改密码后的处理 */ public Handler getUnLoginHandler() { return this.unLoginHandler; } /** * 初始化用户登录信息 */ public void initLoginInfo() { User loginUser = getLoginInfo(); if(loginUser!=null && loginUser.getUid()>0 && loginUser.isRememberMe()){ this.loginUid = loginUser.getUid(); this.login = true; }else{ this.Logout(); } } /** * 用户登录验证 * @param account * @param pwd * @return * @throws AppException */ public User loginVerify(String account, String pwd) throws AppException { return ApiClient.login(this, account, pwd); } /** * 我的个人资料 * @param isRefresh 是否主动刷新 * @return * @throws AppException */ public MyInformation getMyInformation(boolean isRefresh) throws AppException { MyInformation myinfo = null; String key = "myinfo_"+loginUid; if(isNetworkConnected() && (!isReadDataCache(key) || isRefresh)) { try{ myinfo = ApiClient.myInformation(this, loginUid); if(myinfo != null && myinfo.getName().length() > 0){ Notice notice = myinfo.getNotice(); myinfo.setNotice(null); myinfo.setCacheKey(key); saveObject(myinfo, key); myinfo.setNotice(notice); } }catch(AppException e){ myinfo = (MyInformation)readObject(key); if(myinfo == null) throw e; } } else { myinfo = (MyInformation)readObject(key); if(myinfo == null) myinfo = new MyInformation(); } return myinfo; } /** * 获取用户信息个人专页(包含该用户的动态信息以及个人信息) * @param uid 自己的uid * @param hisuid 被查看用户的uid * @param hisname 被查看用户的用户名 * @param pageIndex 页面索引 * @return * @throws AppException */ public UserInformation getInformation(int uid, int hisuid, String hisname, int pageIndex, boolean isRefresh) throws AppException { String _hisname = ""; if(!StringUtils.isEmpty(hisname)){ _hisname = hisname; } UserInformation userinfo = null; String key = "userinfo_"+uid+"_"+hisuid+"_"+(URLEncoder.encode(hisname))+"_"+pageIndex+"_"+PAGE_SIZE; if(isNetworkConnected() && (!isReadDataCache(key) || isRefresh)) { try{ userinfo = ApiClient.information(this, uid, hisuid, _hisname, pageIndex, PAGE_SIZE); if(userinfo != null && pageIndex == 0){ Notice notice = userinfo.getNotice(); userinfo.setNotice(null); userinfo.setCacheKey(key); saveObject(userinfo, key); userinfo.setNotice(notice); } }catch(AppException e){ userinfo = (UserInformation)readObject(key); if(userinfo == null) throw e; } } else { userinfo = (UserInformation)readObject(key); if(userinfo == null) userinfo = new UserInformation(); } return userinfo; } /** * 更新用户之间关系(加关注、取消关注) * @param uid 自己的uid * @param hisuid 对方用户的uid * @param newrelation 0:取消对他的关注 1:关注他 * @return * @throws AppException */ public Result updateRelation(int uid, int hisuid, int newrelation) throws AppException { return ApiClient.updateRelation(this, uid, hisuid, newrelation); } /** * 更新用户头像 * @param portrait 新上传的头像 * @return * @throws AppException */ public Result updatePortrait(File portrait) throws AppException { return ApiClient.updatePortrait(this, loginUid, portrait); } /** * 清空通知消息 * @param uid * @param type 1:@我的信息 2:未读消息 3:评论个数 4:新粉丝个数 * @return * @throws AppException */ public Result noticeClear(int uid, int type) throws AppException { return ApiClient.noticeClear(this, uid, type); } /** * 获取用户通知信息 * @param uid * @return * @throws AppException */ public Notice getUserNotice(int uid) throws AppException { return ApiClient.getUserNotice(this, uid); } /** * 用户收藏列表 * @param type 0:全部收藏 1:软件 2:话题 3:博客 4:新闻 5:代码 * @param pageIndex 页面索引 0表示第一页 * @return * @throws AppException */ public FavoriteList getFavoriteList(int type, int pageIndex, boolean isRefresh) throws AppException { FavoriteList list = null; String key = "favoritelist_"+loginUid+"_"+type+"_"+pageIndex+"_"+PAGE_SIZE; if(isNetworkConnected() && (!isReadDataCache(key) || isRefresh)) { try{ list = ApiClient.getFavoriteList(this, loginUid, type, pageIndex, PAGE_SIZE); if(list != null && pageIndex == 0){ Notice notice = list.getNotice(); list.setNotice(null); list.setCacheKey(key); saveObject(list, key); list.setNotice(notice); } }catch(AppException e){ list = (FavoriteList)readObject(key); if(list == null) throw e; } } else { list = (FavoriteList)readObject(key); if(list == null) list = new FavoriteList(); } return list; } /** * 用户粉丝、关注人列表 * @param relation 0:显示自己的粉丝 1:显示自己的关注者 * @param pageIndex * @return * @throws AppException */ public FriendList getFriendList(int relation, int pageIndex, boolean isRefresh) throws AppException { FriendList list = null; String key = "friendlist_"+loginUid+"_"+relation+"_"+pageIndex+"_"+PAGE_SIZE; if(isNetworkConnected() && (!isReadDataCache(key) || isRefresh)) { try{ list = ApiClient.getFriendList(this, loginUid, relation, pageIndex, PAGE_SIZE); if(list != null && pageIndex == 0){ Notice notice = list.getNotice(); list.setNotice(null); list.setCacheKey(key); saveObject(list, key); list.setNotice(notice); } }catch(AppException e){ list = (FriendList)readObject(key); if(list == null) throw e; } } else { list = (FriendList)readObject(key); if(list == null) list = new FriendList(); } return list; } /** * 新闻列表 * @param catalog * @param pageIndex * @param pageSize * @return * @throws ApiException */ public NewsList getNewsList(int catalog, int pageIndex, boolean isRefresh) throws AppException { NewsList list = null; String key = "newslist_"+catalog+"_"+pageIndex+"_"+PAGE_SIZE; if(isNetworkConnected() && (!isReadDataCache(key) || isRefresh)) { try{ list = ApiClient.getNewsList(this, catalog, pageIndex, PAGE_SIZE); if(list != null && pageIndex == 0){ Notice notice = list.getNotice(); list.setNotice(null); list.setCacheKey(key); saveObject(list, key); list.setNotice(notice); } }catch(AppException e){ list = (NewsList)readObject(key); if(list == null) throw e; } } else { list = (NewsList)readObject(key); if(list == null) list = new NewsList(); } return list; } /** * 新闻详情 * @param news_id * @return * @throws ApiException */ public News getNews(int news_id, boolean isRefresh) throws AppException { News news = null; String key = "news_"+news_id; if(isNetworkConnected() && (!isReadDataCache(key) || isRefresh)) { try{ news = ApiClient.getNewsDetail(this, news_id); if(news != null){ Notice notice = news.getNotice(); news.setNotice(null); news.setCacheKey(key); saveObject(news, key); news.setNotice(notice); } }catch(AppException e){ news = (News)readObject(key); if(news == null) throw e; } } else { news = (News)readObject(key); if(news == null) news = new News(); } return news; } /** * 用户博客列表 * @param authoruid * @param pageIndex * @return * @throws AppException */ public BlogList getUserBlogList(int authoruid, String authorname, int pageIndex, boolean isRefresh) throws AppException { BlogList list = null; String key = "userbloglist_"+authoruid+"_"+(URLEncoder.encode(authorname))+"_"+loginUid+"_"+pageIndex+"_"+PAGE_SIZE; if(isNetworkConnected() && (!isReadDataCache(key) || isRefresh)) { try{ list = ApiClient.getUserBlogList(this, authoruid, authorname, loginUid, pageIndex, PAGE_SIZE); if(list != null && pageIndex == 0){ Notice notice = list.getNotice(); list.setNotice(null); list.setCacheKey(key); saveObject(list, key); list.setNotice(notice); } }catch(AppException e){ list = (BlogList)readObject(key); if(list == null) throw e; } } else { list = (BlogList)readObject(key); if(list == null) list = new BlogList(); } return list; } /** * 博客列表 * @param type 推荐:recommend 最新:latest * @param pageIndex * @return * @throws AppException */ public BlogList getBlogList(String type, int pageIndex, boolean isRefresh) throws AppException { BlogList list = null; String key = "bloglist_"+type+"_"+pageIndex+"_"+PAGE_SIZE; if(isNetworkConnected() && (!isReadDataCache(key) || isRefresh)) { try{ list = ApiClient.getBlogList(this, type, pageIndex, PAGE_SIZE); if(list != null && pageIndex == 0){ Notice notice = list.getNotice(); list.setNotice(null); list.setCacheKey(key); saveObject(list, key); list.setNotice(notice); } }catch(AppException e){ list = (BlogList)readObject(key); if(list == null) throw e; } } else { list = (BlogList)readObject(key); if(list == null) list = new BlogList(); } return list; } /** * 博客详情 * @param blog_id * @return * @throws AppException */ public Blog getBlog(int blog_id, boolean isRefresh) throws AppException { Blog blog = null; String key = "blog_"+blog_id; if(isNetworkConnected() && (!isReadDataCache(key) || isRefresh)) { try{ blog = ApiClient.getBlogDetail(this, blog_id); if(blog != null){ Notice notice = blog.getNotice(); blog.setNotice(null); blog.setCacheKey(key); saveObject(blog, key); blog.setNotice(notice); } }catch(AppException e){ blog = (Blog)readObject(key); if(blog == null) throw e; } } else { blog = (Blog)readObject(key); if(blog == null) blog = new Blog(); } return blog; } /** * 软件列表 * @param searchTag 软件分类 推荐:recommend 最新:time 热门:view 国产:list_cn * @param pageIndex * @return * @throws AppException */ public SoftwareList getSoftwareList(String searchTag, int pageIndex, boolean isRefresh) throws AppException { SoftwareList list = null; String key = "softwarelist_"+searchTag+"_"+pageIndex+"_"+PAGE_SIZE; if(isNetworkConnected() && (!isReadDataCache(key) || isRefresh)) { try{ list = ApiClient.getSoftwareList(this, searchTag, pageIndex, PAGE_SIZE); if(list != null && pageIndex == 0){ Notice notice = list.getNotice(); list.setNotice(null); list.setCacheKey(key); saveObject(list, key); list.setNotice(notice); } }catch(AppException e){ list = (SoftwareList)readObject(key); if(list == null) throw e; } } else { list = (SoftwareList)readObject(key); if(list == null) list = new SoftwareList(); } return list; } /** * 软件分类的软件列表 * @param searchTag 从softwarecatalog_list获取的tag * @param pageIndex * @return * @throws AppException */ public SoftwareList getSoftwareTagList(int searchTag, int pageIndex, boolean isRefresh) throws AppException { SoftwareList list = null; String key = "softwaretaglist_"+searchTag+"_"+pageIndex+"_"+PAGE_SIZE; if(isNetworkConnected() && (isCacheDataFailure(key) || isRefresh)) { try{ list = ApiClient.getSoftwareTagList(this, searchTag, pageIndex, PAGE_SIZE); if(list != null && pageIndex == 0){ Notice notice = list.getNotice(); list.setNotice(null); list.setCacheKey(key); saveObject(list, key); list.setNotice(notice); } }catch(AppException e){ list = (SoftwareList)readObject(key); if(list == null) throw e; } } else { list = (SoftwareList)readObject(key); if(list == null) list = new SoftwareList(); } return list; } /** * 软件分类列表 * @param tag 第一级:0 第二级:tag * @return * @throws AppException */ public SoftwareCatalogList getSoftwareCatalogList(int tag) throws AppException { SoftwareCatalogList list = null; String key = "softwarecataloglist_"+tag; if(isNetworkConnected() && isCacheDataFailure(key)) { try{ list = ApiClient.getSoftwareCatalogList(this, tag); if(list != null){ Notice notice = list.getNotice(); list.setNotice(null); list.setCacheKey(key); saveObject(list, key); list.setNotice(notice); } }catch(AppException e){ list = (SoftwareCatalogList)readObject(key); if(list == null) throw e; } } else { list = (SoftwareCatalogList)readObject(key); if(list == null) list = new SoftwareCatalogList(); } return list; } /** * 软件详情 * @param soft_id * @return * @throws AppException */ public Software getSoftware(String ident, boolean isRefresh) throws AppException { Software soft = null; String key = "software_"+(URLEncoder.encode(ident)); if(isNetworkConnected() && (isCacheDataFailure(key) || isRefresh)) { try{ soft = ApiClient.getSoftwareDetail(this, ident); if(soft != null){ Notice notice = soft.getNotice(); soft.setNotice(null); soft.setCacheKey(key); saveObject(soft, key); soft.setNotice(notice); } }catch(AppException e){ soft = (Software)readObject(key); if(soft == null) throw e; } } else { soft = (Software)readObject(key); if(soft == null) soft = new Software(); } return soft; } /** * 帖子列表 * @param catalog * @param pageIndex * @return * @throws ApiException */ public PostList getPostList(int catalog, int pageIndex, boolean isRefresh) throws AppException { PostList list = null; String key = "postlist_"+catalog+"_"+pageIndex+"_"+PAGE_SIZE; if(isNetworkConnected() && (!isReadDataCache(key) || isRefresh)) { try{ list = ApiClient.getPostList(this, catalog, pageIndex, PAGE_SIZE); if(list != null && pageIndex == 0){ Notice notice = list.getNotice(); list.setNotice(null); list.setCacheKey(key); saveObject(list, key); list.setNotice(notice); } }catch(AppException e){ list = (PostList)readObject(key); if(list == null) throw e; } } else { list = (PostList)readObject(key); if(list == null) list = new PostList(); } return list; } /** * Tag相关帖子列表 * @param tag * @param pageIndex * @return * @throws ApiException */ public PostList getPostListByTag(String tag, int pageIndex, boolean isRefresh) throws AppException { PostList list = null; String key = "postlist_"+(URLEncoder.encode(tag))+"_"+pageIndex+"_"+PAGE_SIZE; if(isNetworkConnected() && (!isReadDataCache(key) || isRefresh)) { try{ list = ApiClient.getPostListByTag(this, tag, pageIndex, PAGE_SIZE); if(list != null && pageIndex == 0){ Notice notice = list.getNotice(); list.setNotice(null); list.setCacheKey(key); saveObject(list, key); list.setNotice(notice); } }catch(AppException e){ list = (PostList)readObject(key); if(list == null) throw e; } } else { list = (PostList)readObject(key); if(list == null) list = new PostList(); } return list; } /** * 读取帖子详情 * @param post_id * @return * @throws ApiException */ public Post getPost(int post_id, boolean isRefresh) throws AppException { Post post = null; String key = "post_"+post_id; if(isNetworkConnected() && (!isReadDataCache(key) || isRefresh)) { try{ post = ApiClient.getPostDetail(this, post_id); if(post != null){ Notice notice = post.getNotice(); post.setNotice(null); post.setCacheKey(key); saveObject(post, key); post.setNotice(notice); } }catch(AppException e){ post = (Post)readObject(key); if(post == null) throw e; } } else { post = (Post)readObject(key); if(post == null) post = new Post(); } return post; } /** * 动弹列表 * @param catalog -1 热门,0 最新,大于0 某用户的动弹(uid) * @param pageIndex * @return * @throws AppException */ public TweetList getTweetList(int catalog, int pageIndex, boolean isRefresh) throws AppException { TweetList list = null; String key = "tweetlist_"+catalog+"_"+pageIndex+"_"+PAGE_SIZE; if(isNetworkConnected() && (!isReadDataCache(key) || isRefresh)) { try{ list = ApiClient.getTweetList(this, catalog, pageIndex, PAGE_SIZE); if(list != null && pageIndex == 0){ Notice notice = list.getNotice(); list.setNotice(null); list.setCacheKey(key); saveObject(list, key); list.setNotice(notice); } }catch(AppException e){ list = (TweetList)readObject(key); if(list == null) throw e; } } else { list = (TweetList)readObject(key); if(list == null) list = new TweetList(); } return list; } /** * 获取动弹详情 * @param tweet_id * @return * @throws AppException */ public Tweet getTweet(int tweet_id, boolean isRefresh) throws AppException { Tweet tweet = null; String key = "tweet_"+tweet_id; if(isNetworkConnected() && (!isReadDataCache(key) || isRefresh)) { try{ tweet = ApiClient.getTweetDetail(this, tweet_id); if(tweet != null){ Notice notice = tweet.getNotice(); tweet.setNotice(null); tweet.setCacheKey(key); saveObject(tweet, key); tweet.setNotice(notice); } }catch(AppException e){ tweet = (Tweet)readObject(key); if(tweet == null) throw e; } } else { tweet = (Tweet)readObject(key); if(tweet == null) tweet = new Tweet(); } return tweet; } /** * 动态列表 * @param catalog 1最新动态 2@我 3评论 4我自己 * @param id * @param pageIndex * @return * @throws AppException */ public ActiveList getActiveList(int catalog, int pageIndex, boolean isRefresh) throws AppException { ActiveList list = null; String key = "activelist_"+loginUid+"_"+catalog+"_"+pageIndex+"_"+PAGE_SIZE; if(isNetworkConnected() && (!isReadDataCache(key) || isRefresh)) { try{ list = ApiClient.getActiveList(this, loginUid, catalog, pageIndex, PAGE_SIZE); if(list != null && pageIndex == 0){ Notice notice = list.getNotice(); list.setNotice(null); list.setCacheKey(key); saveObject(list, key); list.setNotice(notice); } }catch(AppException e){ list = (ActiveList)readObject(key); if(list == null) throw e; } } else { list = (ActiveList)readObject(key); if(list == null) list = new ActiveList(); } return list; } /** * 留言列表 * @param pageIndex * @return * @throws AppException */ public MessageList getMessageList(int pageIndex, boolean isRefresh) throws AppException { MessageList list = null; String key = "messagelist_"+loginUid+"_"+pageIndex+"_"+PAGE_SIZE; if(isNetworkConnected() && (!isReadDataCache(key) || isRefresh)) { try{ list = ApiClient.getMessageList(this, loginUid, pageIndex, PAGE_SIZE); if(list != null && pageIndex == 0){ Notice notice = list.getNotice(); list.setNotice(null); list.setCacheKey(key); saveObject(list, key); list.setNotice(notice); } }catch(AppException e){ list = (MessageList)readObject(key); if(list == null) throw e; } } else { list = (MessageList)readObject(key); if(list == null) list = new MessageList(); } return list; } /** * 博客评论列表 * @param id 博客Id * @param pageIndex * @return * @throws AppException */ public BlogCommentList getBlogCommentList(int id, int pageIndex, boolean isRefresh) throws AppException { BlogCommentList list = null; String key = "blogcommentlist_"+id+"_"+pageIndex+"_"+PAGE_SIZE; if(isNetworkConnected() && (!isReadDataCache(key) || isRefresh)) { try{ list = ApiClient.getBlogCommentList(this, id, pageIndex, PAGE_SIZE); if(list != null && pageIndex == 0){ Notice notice = list.getNotice(); list.setNotice(null); list.setCacheKey(key); saveObject(list, key); list.setNotice(notice); } }catch(AppException e){ list = (BlogCommentList)readObject(key); if(list == null) throw e; } } else { list = (BlogCommentList)readObject(key); if(list == null) list = new BlogCommentList(); } return list; } /** * 评论列表 * @param catalog 1新闻 2帖子 3动弹 4动态 * @param id 某条新闻,帖子,动弹的id 或者某条留言的friendid * @param pageIndex * @return * @throws AppException */ public CommentList getCommentList(int catalog, int id, int pageIndex, boolean isRefresh) throws AppException { CommentList list = null; String key = "commentlist_"+catalog+"_"+id+"_"+pageIndex+"_"+PAGE_SIZE; if(isNetworkConnected() && (!isReadDataCache(key) || isRefresh)) { try{ list = ApiClient.getCommentList(this, catalog, id, pageIndex, PAGE_SIZE); if(list != null && pageIndex == 0){ Notice notice = list.getNotice(); list.setNotice(null); list.setCacheKey(key); saveObject(list, key); list.setNotice(notice); } }catch(AppException e){ list = (CommentList)readObject(key); if(list == null) throw e; } } else { list = (CommentList)readObject(key); if(list == null) list = new CommentList(); } return list; } /** * 获取搜索列表 * @param catalog 全部:all 新闻:news 问答:post 软件:software 博客:blog 代码:code * @param content 搜索的内容 * @param pageIndex * @param pageSize * @return * @throws AppException */ public SearchList getSearchList(String catalog, String content, int pageIndex, int pageSize) throws AppException { return ApiClient.getSearchList(this, catalog, content, pageIndex, pageSize); } /** * 发帖子 * @param post (uid、title、catalog、content、isNoticeMe) * @return * @throws AppException */ public Result pubPost(Post post) throws AppException { return ApiClient.pubPost(this, post); } /** * 发动弹 * @param Tweet-uid & msg & image * @return * @throws AppException */ public Result pubTweet(Tweet tweet) throws AppException { return ApiClient.pubTweet(this, tweet); } /** * 删除动弹 * @param uid * @param tweetid * @return * @throws AppException */ public Result delTweet(int uid, int tweetid) throws AppException { return ApiClient.delTweet(this, uid, tweetid); } /** * 发送留言 * @param uid 登录用户uid * @param receiver 接受者的用户id * @param content 消息内容,注意不能超过250个字符 * @return * @throws AppException */ public Result pubMessage(int uid, int receiver, String content) throws AppException { return ApiClient.pubMessage(this, uid, receiver, content); } /** * 转发留言 * @param uid 登录用户uid * @param receiver 接受者的用户名 * @param content 消息内容,注意不能超过250个字符 * @return * @throws AppException */ public Result forwardMessage(int uid, String receiver, String content) throws AppException { return ApiClient.forwardMessage(this, uid, receiver, content); } /** * 删除留言 * @param uid 登录用户uid * @param friendid 留言者id * @return * @throws AppException */ public Result delMessage(int uid, int friendid) throws AppException { return ApiClient.delMessage(this, uid, friendid); } /** * 发表评论 * @param catalog 1新闻 2帖子 3动弹 4动态 * @param id 某条新闻,帖子,动弹的id * @param uid 用户uid * @param content 发表评论的内容 * @param isPostToMyZone 是否转发到我的空间 0不转发 1转发 * @return * @throws AppException */ public Result pubComment(int catalog, int id, int uid, String content, int isPostToMyZone) throws AppException { return ApiClient.pubComment(this, catalog, id, uid, content, isPostToMyZone); } /** * * @param id 表示被评论的某条新闻,帖子,动弹的id 或者某条消息的 friendid * @param catalog 表示该评论所属什么类型:1新闻 2帖子 3动弹 4动态 * @param replyid 表示被回复的单个评论id * @param authorid 表示该评论的原始作者id * @param uid 用户uid 一般都是当前登录用户uid * @param content 发表评论的内容 * @return * @throws AppException */ public Result replyComment(int id, int catalog, int replyid, int authorid, int uid, String content) throws AppException { return ApiClient.replyComment(this, id, catalog, replyid, authorid, uid, content); } /** * 删除评论 * @param id 表示被评论对应的某条新闻,帖子,动弹的id 或者某条消息的 friendid * @param catalog 表示该评论所属什么类型:1新闻 2帖子 3动弹 4动态&留言 * @param replyid 表示被回复的单个评论id * @param authorid 表示该评论的原始作者id * @return * @throws AppException */ public Result delComment(int id, int catalog, int replyid, int authorid) throws AppException { return ApiClient.delComment(this, id, catalog, replyid, authorid); } /** * 发表博客评论 * @param blog 博客id * @param uid 登陆用户的uid * @param content 评论内容 * @return * @throws AppException */ public Result pubBlogComment(int blog, int uid, String content) throws AppException { return ApiClient.pubBlogComment(this, blog, uid, content); } /** * 发表博客评论 * @param blog 博客id * @param uid 登陆用户的uid * @param content 评论内容 * @param reply_id 评论id * @param objuid 被评论的评论发表者的uid * @return * @throws AppException */ public Result replyBlogComment(int blog, int uid, String content, int reply_id, int objuid) throws AppException { return ApiClient.replyBlogComment(this, blog, uid, content, reply_id, objuid); } /** * 删除博客评论 * @param uid 登录用户的uid * @param blogid 博客id * @param replyid 评论id * @param authorid 评论发表者的uid * @param owneruid 博客作者uid * @return * @throws AppException */ public Result delBlogComment(int uid, int blogid, int replyid, int authorid, int owneruid) throws AppException { return ApiClient.delBlogComment(this, uid, blogid, replyid, authorid, owneruid); } /** * 删除博客 * @param uid 登录用户的uid * @param authoruid 博客作者uid * @param id 博客id * @return * @throws AppException */ public Result delBlog(int uid, int authoruid, int id) throws AppException { return ApiClient.delBlog(this, uid, authoruid, id); } /** * 用户添加收藏 * @param uid 用户UID * @param objid 比如是新闻ID 或者问答ID 或者动弹ID * @param type 1:软件 2:话题 3:博客 4:新闻 5:代码 * @return * @throws AppException */ public Result addFavorite(int uid, int objid, int type) throws AppException { return ApiClient.addFavorite(this, uid, objid, type); } /** * 用户删除收藏 * @param uid 用户UID * @param objid 比如是新闻ID 或者问答ID 或者动弹ID * @param type 1:软件 2:话题 3:博客 4:新闻 5:代码 * @return * @throws AppException */ public Result delFavorite(int uid, int objid, int type) throws AppException { return ApiClient.delFavorite(this, uid, objid, type); } /** * 保存登录信息 * @param username * @param pwd */ public void saveLoginInfo(final User user) { this.loginUid = user.getUid(); this.login = true; setProperties(new Properties(){{ setProperty("user.uid", String.valueOf(user.getUid())); setProperty("user.name", user.getName()); setProperty("user.face", FileUtils.getFileName(user.getFace()));//用户头像-文件名 setProperty("user.account", user.getAccount()); setProperty("user.pwd", CyptoUtils.encode("oschinaApp",user.getPwd())); setProperty("user.location", user.getLocation()); setProperty("user.followers", String.valueOf(user.getFollowers())); setProperty("user.fans", String.valueOf(user.getFans())); setProperty("user.score", String.valueOf(user.getScore())); setProperty("user.isRememberMe", String.valueOf(user.isRememberMe()));//是否记住我的信息 }}); } /** * 清除登录信息 */ public void cleanLoginInfo() { this.loginUid = 0; this.login = false; removeProperty("user.uid","user.name","user.face","user.account","user.pwd", "user.location","user.followers","user.fans","user.score","user.isRememberMe"); } /** * 获取登录信息 * @return */ public User getLoginInfo() { User lu = new User(); lu.setUid(StringUtils.toInt(getProperty("user.uid"), 0)); lu.setName(getProperty("user.name")); lu.setFace(getProperty("user.face")); lu.setAccount(getProperty("user.account")); lu.setPwd(CyptoUtils.decode("oschinaApp",getProperty("user.pwd"))); lu.setLocation(getProperty("user.location")); lu.setFollowers(StringUtils.toInt(getProperty("user.followers"), 0)); lu.setFans(StringUtils.toInt(getProperty("user.fans"), 0)); lu.setScore(StringUtils.toInt(getProperty("user.score"), 0)); lu.setRememberMe(StringUtils.toBool(getProperty("user.isRememberMe"))); return lu; } /** * 保存用户头像 * @param fileName * @param bitmap */ public void saveUserFace(String fileName,Bitmap bitmap) { try { ImageUtils.saveImage(this, fileName, bitmap); } catch (IOException e) { e.printStackTrace(); } } /** * 获取用户头像 * @param key * @return * @throws AppException */ public Bitmap getUserFace(String key) throws AppException { FileInputStream fis = null; try{ fis = openFileInput(key); return BitmapFactory.decodeStream(fis); }catch(Exception e){ throw AppException.run(e); }finally{ try { fis.close(); } catch (Exception e) {} } } /** * 是否加载显示文章图片 * @return */ public boolean isLoadImage() { String perf_loadimage = getProperty(AppConfig.CONF_LOAD_IMAGE); //默认是加载的 if(StringUtils.isEmpty(perf_loadimage)) return true; else return StringUtils.toBool(perf_loadimage); } /** * 设置是否加载文章图片 * @param b */ public void setConfigLoadimage(boolean b) { setProperty(AppConfig.CONF_LOAD_IMAGE, String.valueOf(b)); } /** * 是否发出提示音 * @return */ public boolean isVoice() { String perf_voice = getProperty(AppConfig.CONF_VOICE); //默认是开启提示声音 if(StringUtils.isEmpty(perf_voice)) return true; else return StringUtils.toBool(perf_voice); } /** * 设置是否发出提示音 * @param b */ public void setConfigVoice(boolean b) { setProperty(AppConfig.CONF_VOICE, String.valueOf(b)); } /** * 是否启动检查更新 * @return */ public boolean isCheckUp() { String perf_checkup = getProperty(AppConfig.CONF_CHECKUP); //默认是开启 if(StringUtils.isEmpty(perf_checkup)) return true; else return StringUtils.toBool(perf_checkup); } /** * 设置启动检查更新 * @param b */ public void setConfigCheckUp(boolean b) { setProperty(AppConfig.CONF_CHECKUP, String.valueOf(b)); } /** * 是否左右滑动 * @return */ public boolean isScroll() { String perf_scroll = getProperty(AppConfig.CONF_SCROLL); //默认是关闭左右滑动 if(StringUtils.isEmpty(perf_scroll)) return false; else return StringUtils.toBool(perf_scroll); } /** * 设置是否左右滑动 * @param b */ public void setConfigScroll(boolean b) { setProperty(AppConfig.CONF_SCROLL, String.valueOf(b)); } /** * 是否Https登录 * @return */ public boolean isHttpsLogin() { String perf_httpslogin = getProperty(AppConfig.CONF_HTTPS_LOGIN); //默认是http if(StringUtils.isEmpty(perf_httpslogin)) return false; else return StringUtils.toBool(perf_httpslogin); } /** * 设置是是否Https登录 * @param b */ public void setConfigHttpsLogin(boolean b) { setProperty(AppConfig.CONF_HTTPS_LOGIN, String.valueOf(b)); } /** * 清除保存的缓存 */ public void cleanCookie() { removeProperty(AppConfig.CONF_COOKIE); } /** * 判断缓存数据是否可读 * @param cachefile * @return */ private boolean isReadDataCache(String cachefile) { return readObject(cachefile) != null; } /** * 判断缓存是否存在 * @param cachefile * @return */ private boolean isExistDataCache(String cachefile) { boolean exist = false; File data = getFileStreamPath(cachefile); if(data.exists()) exist = true; return exist; } /** * 判断缓存是否失效 * @param cachefile * @return */ public boolean isCacheDataFailure(String cachefile) { boolean failure = false; File data = getFileStreamPath(cachefile); if(data.exists() && (System.currentTimeMillis() - data.lastModified()) > CACHE_TIME) failure = true; else if(!data.exists()) failure = true; return failure; } /** * 清除app缓存 */ public void clearAppCache() { //清除webview缓存 File file = CacheManager.getCacheFileBaseDir(); if (file != null && file.exists() && file.isDirectory()) { for (File item : file.listFiles()) { item.delete(); } file.delete(); } deleteDatabase("webview.db"); deleteDatabase("webview.db-shm"); deleteDatabase("webview.db-wal"); deleteDatabase("webviewCache.db"); deleteDatabase("webviewCache.db-shm"); deleteDatabase("webviewCache.db-wal"); //清除数据缓存 clearCacheFolder(getFilesDir(),System.currentTimeMillis()); clearCacheFolder(getCacheDir(),System.currentTimeMillis()); //2.2版本才有将应用缓存转移到sd卡的功能 if(isMethodsCompat(android.os.Build.VERSION_CODES.FROYO)){ clearCacheFolder(MethodsCompat.getExternalCacheDir(this),System.currentTimeMillis()); } //清除编辑器保存的临时内容 Properties props = getProperties(); for(Object key : props.keySet()) { String _key = key.toString(); if(_key.startsWith("temp")) removeProperty(_key); } } /** * 清除缓存目录 * @param dir 目录 * @param numDays 当前系统时间 * @return */ private int clearCacheFolder(File dir, long curTime) { int deletedFiles = 0; if (dir!= null && dir.isDirectory()) { try { for (File child:dir.listFiles()) { if (child.isDirectory()) { deletedFiles += clearCacheFolder(child, curTime); } if (child.lastModified() < curTime) { if (child.delete()) { deletedFiles++; } } } } catch(Exception e) { e.printStackTrace(); } } return deletedFiles; } /** * 将对象保存到内存缓存中 * @param key * @param value */ public void setMemCache(String key, Object value) { memCacheRegion.put(key, value); } /** * 从内存缓存中获取对象 * @param key * @return */ public Object getMemCache(String key){ return memCacheRegion.get(key); } /** * 保存磁盘缓存 * @param key * @param value * @throws IOException */ public void setDiskCache(String key, String value) throws IOException { FileOutputStream fos = null; try{ fos = openFileOutput("cache_"+key+".data", Context.MODE_PRIVATE); fos.write(value.getBytes()); fos.flush(); }finally{ try { fos.close(); } catch (Exception e) {} } } /** * 获取磁盘缓存数据 * @param key * @return * @throws IOException */ public String getDiskCache(String key) throws IOException { FileInputStream fis = null; try{ fis = openFileInput("cache_"+key+".data"); byte[] datas = new byte[fis.available()]; fis.read(datas); return new String(datas); }finally{ try { fis.close(); } catch (Exception e) {} } } /** * 保存对象 * @param ser * @param file * @throws IOException */ public boolean saveObject(Serializable ser, String file) { FileOutputStream fos = null; ObjectOutputStream oos = null; try{ fos = openFileOutput(file, MODE_PRIVATE); oos = new ObjectOutputStream(fos); oos.writeObject(ser); oos.flush(); return true; }catch(Exception e){ e.printStackTrace(); return false; }finally{ try { oos.close(); } catch (Exception e) {} try { fos.close(); } catch (Exception e) {} } } /** * 读取对象 * @param file * @return * @throws IOException */ public Serializable readObject(String file){ if(!isExistDataCache(file)) return null; FileInputStream fis = null; ObjectInputStream ois = null; try{ fis = openFileInput(file); ois = new ObjectInputStream(fis); return (Serializable)ois.readObject(); }catch(FileNotFoundException e){ }catch(Exception e){ e.printStackTrace(); //反序列化失败 - 删除缓存文件 if(e instanceof InvalidClassException){ File data = getFileStreamPath(file); data.delete(); } }finally{ try { ois.close(); } catch (Exception e) {} try { fis.close(); } catch (Exception e) {} } return null; } public boolean containsProperty(String key){ Properties props = getProperties(); return props.containsKey(key); } public void setProperties(Properties ps){ AppConfig.getAppConfig(this).set(ps); } public Properties getProperties(){ return AppConfig.getAppConfig(this).get(); } public void setProperty(String key,String value){ AppConfig.getAppConfig(this).set(key, value); } public String getProperty(String key){ return AppConfig.getAppConfig(this).get(key); } public void removeProperty(String...key){ AppConfig.getAppConfig(this).remove(key); } }