package net.oschina.gitapp; import static net.oschina.gitapp.common.Contanst.*; 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.util.Hashtable; import java.util.List; import java.util.Properties; import java.util.UUID; import net.oschina.gitapp.AppException; import net.oschina.gitapp.api.ApiClient; import net.oschina.gitapp.bean.Branch; import net.oschina.gitapp.bean.CodeFile; import net.oschina.gitapp.bean.CodeTree; import net.oschina.gitapp.bean.Comment; import net.oschina.gitapp.bean.Commit; import net.oschina.gitapp.bean.CommitDiff; import net.oschina.gitapp.bean.CommonList; import net.oschina.gitapp.bean.Event; import net.oschina.gitapp.bean.Follow; import net.oschina.gitapp.bean.GitNote; import net.oschina.gitapp.bean.Issue; import net.oschina.gitapp.bean.Language; import net.oschina.gitapp.bean.Milestone; import net.oschina.gitapp.bean.NotificationReadResult; import net.oschina.gitapp.bean.Project; import net.oschina.gitapp.bean.ProjectNotificationArray; import net.oschina.gitapp.bean.RandomProject; import net.oschina.gitapp.bean.ReadMe; import net.oschina.gitapp.bean.UpLoadFile; import net.oschina.gitapp.bean.Update; import net.oschina.gitapp.bean.User; import net.oschina.gitapp.common.BroadcastController; import net.oschina.gitapp.common.MethodsCompat; import net.oschina.gitapp.common.StringUtils; import net.oschina.gitapp.common.UIHelper; import android.app.Application; import android.content.Context; import android.content.pm.PackageInfo; import android.content.pm.PackageManager.NameNotFoundException; import android.media.AudioManager; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.os.Handler; import android.os.Message; /** * 全局应用程序类:用于保存和调用全局应用配置及访问网络数据 * * @author 火蚁 (http://my.oschina.net/LittleDY) * @version 1.0 * @created 2014-04-22 */ 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.showLoginActivity(AppContext.this); } } }; @Override public void onCreate() { super.onCreate(); // 注册App异常崩溃处理器 Thread.setDefaultUncaughtExceptionHandler(AppException .getAppExceptionHandler(this)); init(); } /** * 获得未登录的handle * @return */ public Handler getUnLoginHandler(final Context context) { Handler unLoginHandler = new Handler() { public void handleMessage(Message msg) { if (msg.what == 1) { UIHelper.ToastMessage(AppContext.this, getString(R.string.msg_login_error)); UIHelper.showLoginActivity(context); } } }; return unLoginHandler; } /** * 初始化Application */ private void init() { // 初始化用记的登录信息 User loginUser = getLoginInfo(); if (null != loginUser && StringUtils.toInt(loginUser.getId()) > 0 && !StringUtils.isEmpty(getProperty(PROP_KEY_PRIVATE_TOKEN))) { // 记录用户的id和状态 this.loginUid = StringUtils.toInt(loginUser.getId()); this.login = true; } } 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) { String res = AppConfig.getAppConfig(this).get(key); return res; } public void removeProperty(String... key) { AppConfig.getAppConfig(this).remove(key); } /** * 是否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)); } /** * 是否是第一次启动App * @return */ public boolean isFristStart() { boolean res = false; String perf_frist = getProperty(AppConfig.CONF_FRIST_START); // 默认是http if (StringUtils.isEmpty(perf_frist)) { res = true; setProperty(AppConfig.CONF_FRIST_START, "false"); } return res; } /** * 是否加载显示文章图片 * * @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)); } /** * 设置是否发出提示音 * * @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 isAudioNormal() { AudioManager mAudioManager = (AudioManager) getSystemService(AUDIO_SERVICE); return mAudioManager.getRingerMode() == AudioManager.RINGER_MODE_NORMAL; } /** * 应用程序是否发出提示音 * * @return */ public boolean isAppSound() { return isAudioNormal() && isVoice(); } /** * 是否接收通知 * @return */ public boolean isReceiveNotice() { String perf_notice = getProperty(AppConfig.CONF_RECEIVENOTICE); // 默认是开启提示声音 if (StringUtils.isEmpty(perf_notice)) { return true; } else { return StringUtils.toBool(perf_notice); } } /** * 设置是否接收通知 */ public void setConfigReceiveNotice(boolean isReceiveNotice) { setProperty(AppConfig.CONF_RECEIVENOTICE, String.valueOf(isReceiveNotice)); } /** * 是否发出提示音 * * @return */ public boolean isVoice() { String perf_voice = getProperty(AppConfig.CONF_VOICE); // 默认是开启提示声音 if (StringUtils.isEmpty(perf_voice)) { return true; } else { return StringUtils.toBool(perf_voice); } } /** * 检测网络是否可用 * * @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 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; } /** * 获取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; } /** * 判断缓存数据是否可读 * * @param cachefile * @return */ private boolean isReadDataCache(String cachefile) { return readObject(cachefile) != null; } /** * 保存对象 * * @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; } /** * 判断缓存是否存在 * * @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; } /** * 用户登录 * * @param account * @param pwd * @return * @throws AppException * @throws IOException */ public User loginVerify(String account, String pwd) throws AppException { User user = ApiClient.login(this, account, pwd); if (null != user) { // 保存登录用户的信息 saveLoginInfo(user); } return user; } /** * 获取登录信息 * * @return */ public User getLoginInfo() { User user = new User(); user.setId(getProperty(PROP_KEY_UID)); user.setUsername(getProperty(PROP_KEY_USERNAME)); user.setName(getProperty(PROP_KEY_NAME)); user.setBio(getProperty(PROP_KEY_BIO)); user.setWeibo(getProperty(PROP_KEY_WEIBO)); user.setBlog(getProperty(PROP_KEY_BLOG)); user.setTheme_id(StringUtils.toInt(getProperty(PROP_KEY_THEME_ID), 1)); user.setState(getProperty(PROP_KEY_STATE)); user.setCreated_at(getProperty(PROP_KEY_CREATED_AT)); user.setPortrait(getProperty(PROP_KEY_PORTRAIT)); user.setIsAdmin(StringUtils.toBool(getProperty(PROP_KEY_IS_ADMIN))); user.setCanCreateGroup(StringUtils .toBool(getProperty(PROP_KEY_CAN_CREATE_GROUP))); user.setCanCreateProject(StringUtils .toBool(getProperty(PROP_KEY_CAN_CREATE_PROJECT))); user.setCanCreateTeam(StringUtils .toBool(getProperty(PROP_KEY_CAN_CREATE_TEAM))); Follow follow = new Follow(); follow.setFollowers(StringUtils.toInt(getProperty(ROP_KEY_FOLLOWERS))); follow.setStarred(StringUtils.toInt(getProperty(ROP_KEY_STARRED))); follow.setFollowing(StringUtils.toInt(getProperty(ROP_KEY_FOLLOWING))); follow.setWatched(StringUtils.toInt(getProperty(ROP_KEY_WATCHED))); user.setFollow(follow); return user; } /** * 保存用户的email和pwd * @param email * @param pwd */ public void saveAccountInfo(String email, String pwd) { setProperty(ACCOUNT_EMAIL, email); setProperty(ACCOUNT_PWD, pwd); } /** * 保存登录用户的信息 * * @param user */ @SuppressWarnings("serial") private void saveLoginInfo(final User user) { if (null == user) { return; } // 保存用户的信息 this.loginUid = StringUtils.toInt(user.getId()); this.login = true; setProperties(new Properties() { { setProperty(PROP_KEY_UID, String.valueOf(user.getId())); setProperty(PROP_KEY_USERNAME, String.valueOf(user.getUsername())); setProperty(PROP_KEY_NAME, String.valueOf(user.getName())); setProperty(PROP_KEY_BIO, String.valueOf(user.getBio()));// 个人介绍 setProperty(PROP_KEY_WEIBO, String.valueOf(user.getWeibo())); setProperty(PROP_KEY_BLOG, String.valueOf(user.getBlog())); setProperty(PROP_KEY_THEME_ID, String.valueOf(user.getTheme_id())); setProperty(PROP_KEY_STATE, String.valueOf(user.getState())); setProperty(PROP_KEY_CREATED_AT, String.valueOf(user.getCreated_at())); setProperty(PROP_KEY_PORTRAIT, String.valueOf(user.getPortrait()));// 个人头像 setProperty(PROP_KEY_IS_ADMIN, String.valueOf(user.isIsAdmin())); setProperty(PROP_KEY_CAN_CREATE_GROUP, String.valueOf(user.isCanCreateGroup())); setProperty(PROP_KEY_CAN_CREATE_PROJECT, String.valueOf(user.isCanCreateProject())); setProperty(PROP_KEY_CAN_CREATE_TEAM, String.valueOf(user.isCanCreateTeam())); setProperty(ROP_KEY_FOLLOWERS, String.valueOf(user.getFollow().getFollowers())); setProperty(ROP_KEY_STARRED, String.valueOf(user.getFollow().getStarred())); setProperty(ROP_KEY_FOLLOWING, String.valueOf(user.getFollow().getFollowing())); setProperty(ROP_KEY_WATCHED, String.valueOf(user.getFollow().getWatched())); } }); } /** * 清除登录信息,用户的私有token也一并清除 */ private void cleanLoginInfo() { this.loginUid = 0; this.login = false; removeProperty(PROP_KEY_PRIVATE_TOKEN, PROP_KEY_UID, PROP_KEY_USERNAME, PROP_KEY_EMAIL, PROP_KEY_NAME, PROP_KEY_BIO, PROP_KEY_WEIBO, PROP_KEY_BLOG, PROP_KEY_THEME_ID, PROP_KEY_STATE, PROP_KEY_CREATED_AT, PROP_KEY_PORTRAIT, PROP_KEY_IS_ADMIN, PROP_KEY_CAN_CREATE_GROUP, PROP_KEY_CAN_CREATE_PROJECT, PROP_KEY_CAN_CREATE_TEAM, ROP_KEY_FOLLOWERS, ROP_KEY_STARRED, ROP_KEY_FOLLOWING, ROP_KEY_WATCHED); } /** * 用户是否登录 * * @return */ public boolean isLogin() { return login; } /** * 获取登录用户id * * @return */ public int getLoginUid() { return this.loginUid; } /** * 用户注销 */ public void loginout() { ApiClient.cleanToken(); // 清除已登录用户的信息 cleanLoginInfo(); this.login = false; this.loginUid = 0; // 发送广播通知 BroadcastController.sendUserChangeBroadcase(this); } /** * 清除app缓存 */ public void clearAppCache() { 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 projectId * @return * @throws AppException */ public Project getProject(String projectId) throws AppException { return ApiClient.getProject(this, projectId); } /** * 获得具体用户的项目列表 * @param userId * @param page * @return * @throws AppException */ public CommonList<Project> getUserProjects(String userId, int page) throws AppException { return ApiClient.getUserProjects(this, userId, page); } /** * 获得最近更新的项目 * * @param page * @return * @throws AppException */ @SuppressWarnings("unchecked") public CommonList<Project> getExploreLatestProject(int page, boolean isRefresh) throws AppException { CommonList<Project> list = null; String cacheKey = "latestProjectList_" + page + "_" + PAGE_SIZE; if (!isReadDataCache(cacheKey) || isRefresh) { try { list = ApiClient.getExploreLatestProject(this, page); if (list != null && page == 1) { list.setCacheKey(cacheKey); saveObject(list, cacheKey); } } catch (AppException e) { e.printStackTrace(); list = (CommonList<Project>) readObject(cacheKey); if (list == null) throw e; } } else { // 从缓存中读取 list = (CommonList<Project>) readObject(cacheKey); if (list == null) list = new CommonList<Project>(); } return list; } /** * 获取热门项目 * * @param page * @return * @throws AppException */ @SuppressWarnings("unchecked") public CommonList<Project> getExplorePopularProject(int page, boolean isRefresh) throws AppException { CommonList<Project> list = null; String cacheKey = "popularProjectList_" + page + "_" + PAGE_SIZE; if (!isReadDataCache(cacheKey) || isRefresh) { try { list = ApiClient.getExplorePopularProject(this, page); if (list != null && page == 1) { list.setCacheKey(cacheKey); saveObject(list, cacheKey); } } catch (AppException e) { e.printStackTrace(); list = (CommonList<Project>) readObject(cacheKey); if (list == null) throw e; } } else { // 从缓存中读取 list = (CommonList<Project>) readObject(cacheKey); if (list == null) list = new CommonList<Project>(); } return list; } /** * 获取推荐项目 * * @param page * @return * @throws AppException */ @SuppressWarnings("unchecked") public CommonList<Project> getExploreFeaturedProject(int page, boolean isRefresh) throws AppException { CommonList<Project> list = null; String cacheKey = "faturedProjectList_" + page + "_" + PAGE_SIZE; if (!isReadDataCache(cacheKey) || isRefresh) { try { list = ApiClient.getExploreFeaturedProject(this, page); if (list != null && page == 1) { list.setCacheKey(cacheKey); saveObject(list, cacheKey); } } catch (AppException e) { e.printStackTrace(); list = (CommonList<Project>) readObject(cacheKey); if (list == null) throw e; } } else { // 从缓存中读取 list = (CommonList<Project>) readObject(cacheKey); if (list == null) list = new CommonList<Project>(); } return list; } /** * 获得查询项目的结果 * @param page * @return * @throws AppException */ public List<Project> getSearcheProject(String query, int page) throws AppException { return ApiClient.getSearcheProject(this, query, page); } /** * 获得个人动态列表 * * @param pageIndex * @param isRefresh * @return * @throws AppException */ @SuppressWarnings("unchecked") public CommonList<Event> getMySelfEvents(int page, boolean isRefresh) throws AppException { CommonList<Event> list = null; String cacheKey = "myselfEventsList_" + +page + "_" + PAGE_SIZE; if (!isReadDataCache(cacheKey) || isRefresh) { try { list = ApiClient.getMySelfEvents(this, page); if (list != null && page == 1) { list.setCacheKey(cacheKey); saveObject(list, cacheKey); } } catch (AppException e) { e.printStackTrace(); list = (CommonList<Event>) readObject(cacheKey); if (list == null) throw e; } } else { // 从缓存中读取 list = (CommonList<Event>) readObject(cacheKey); if (list == null) list = new CommonList<Event>(); } return list; } /** * 获得个人的所有项目 * * @param page * @return * @throws AppException */ @SuppressWarnings("unchecked") public CommonList<Project> getMySelfProjectList(int page, boolean isRefresh) throws AppException { CommonList<Project> list = null; String cacheKey = "myselfProjectList_" + page + "_" + PAGE_SIZE; if (!isReadDataCache(cacheKey) || isRefresh) { try { list = ApiClient.getMySelfProjectList(this, page); if (list != null && page == 1) { list.setCacheKey(cacheKey); saveObject(list, cacheKey); } } catch (AppException e) { e.printStackTrace(); list = (CommonList<Project>) readObject(cacheKey); if (list == null) throw e; } } else { // 从缓存中读取 list = (CommonList<Project>) readObject(cacheKey); if (list == null) list = new CommonList<Project>(); } return list; } /** * 获得一个项目的commit列表 * * @param projectId * @param pageIndex * @param isRefresh * @param ref_name * 分支(optional) * @return * @throws AppException */ @SuppressWarnings("unchecked") public CommonList<Commit> getProjectCommitList(int projectId, int page, boolean isRefresh, String ref_name) throws AppException { CommonList<Commit> list = null; String cacheKey = "projectCommitList_" + projectId + "_" + page + "_" + PAGE_SIZE; if (!isReadDataCache(cacheKey) || isRefresh) { try { list = ApiClient.getProjectCommitList(this, projectId, page, ref_name); if (list != null && page == 1) { list.setCacheKey(cacheKey); saveObject(list, cacheKey); } } catch (AppException e) { e.printStackTrace(); list = (CommonList<Commit>) readObject(cacheKey); if (list == null) throw e; } } else { // 从缓存中读取 list = (CommonList<Commit>) readObject(cacheKey); if (list == null) list = new CommonList<Commit>(); } return list; } /** * 获取具体用户的最近动态列表 * @param user_id * @param page * @return * @throws AppException */ public CommonList<Event> getUserEvents(String user_id ,int page) throws AppException { return ApiClient.getUserEvents(this, user_id, page); } /** * 获得项目的代码树列表 * * @param appContext * @param projectId * 项目的id * @param path * (optional) 路径(可以拿到项目文件夹下的文件树) * @param ref_name * (optional) 分支或者标签,空则为默认的master分支 * @return * @throws AppException */ @SuppressWarnings("unchecked") public CommonList<CodeTree> getProjectCodeTree(int projectId, String path, String ref_name, boolean isRefresh) throws Exception { CommonList<CodeTree> list = null; String pathKey = path; if (pathKey.contains("/")) { pathKey = pathKey.replaceAll("/", "."); } String cacheKey = "projectCodeLsit_" + projectId + "_" + pathKey + "_" + ref_name; if (!isReadDataCache(cacheKey) || isRefresh) { try { list = ApiClient.getProjectCodeTree(this, projectId, path, ref_name); if (list != null) { list.setCacheKey(cacheKey); saveObject(list, cacheKey); } } catch (AppException e) { e.printStackTrace(); list = (CommonList<CodeTree>) readObject(cacheKey); if (list == null) throw e; } catch (Exception e) { throw e; } } else { // 从缓存中读取 list = (CommonList<CodeTree>) readObject(cacheKey); if (list == null) list = new CommonList<CodeTree>(); } return list; } /** * 获得一个项目issues列表 * * @param appContext * @param projectId * @param pageIndex * @param isRefresh * @return * @throws AppException */ @SuppressWarnings("unchecked") public CommonList<Issue> getProjectIssuesList(int projectId, int page, boolean isRefresh) throws AppException { CommonList<Issue> list = null; String cacheKey = "projectIssuesList_" + projectId + "_" + page + "_" + PAGE_SIZE; if (!isReadDataCache(cacheKey) || isRefresh) { try { list = ApiClient.getProjectIssuesList(this, projectId, page); if (list != null && page == 1) { list.setCacheKey(cacheKey); saveObject(list, cacheKey); } } catch (AppException e) { e.printStackTrace(); list = (CommonList<Issue>) readObject(cacheKey); if (list == null) throw e; } } else { // 从缓存中读取 list = (CommonList<Issue>) readObject(cacheKey); if (list == null) list = new CommonList<Issue>(); } return list; } /** * 获得issue详情 * @param projectId * @param issueId * @return * @throws AppException */ public Issue getIssue(String projectId, String issueId) throws AppException { return ApiClient.getIssue(this, projectId, issueId); } /** * 获得issue的评论列表 * * @param appContext * @param projectId * @param noteId * @param page * @param isRefresh * @return * @throws Exception */ @SuppressWarnings("unchecked") public CommonList<GitNote> getIssueCommentList(String projectId, String issueId, int page, boolean isRefresh) throws Exception { CommonList<GitNote> list = null; String cacheKey = "issueCommentList" + projectId + "_" + issueId + "_" + page; if (!isReadDataCache(cacheKey) || isRefresh) { try { list = ApiClient.getIssueCommentList(this, projectId, issueId, page); if (list != null && page == 1) { list.setCacheKey(cacheKey); saveObject(list, cacheKey); } } catch (Exception e) { e.printStackTrace(); list = (CommonList<GitNote>) readObject(cacheKey); if (list == null) throw e; } } else { // 从缓存中读取 list = (CommonList<GitNote>) readObject(cacheKey); if (list == null) list = new CommonList<GitNote>(); } return list; } /** * 提交commit评论 * * @param projectId * @param issueId * @param body * @return * @throws AppException */ public GitNote pubIssueComment(String projectId, String issueId, String body) throws AppException { return ApiClient.pubIssueComment(this, projectId, issueId, body); } @SuppressWarnings("unchecked") public CommonList<Branch> getProjectBranchsOrTagsLsit(String projectId, int page, String branchOrTag, boolean isRefresh) throws Exception { CommonList<Branch> list = null; String cacheKey = "projectBranchsOrTagsLsit_" + projectId + "_" + page + "_" + branchOrTag; if (!isReadDataCache(cacheKey) || isRefresh) { try { list = ApiClient.getProjectBranchsOrTagsLsit(this, projectId, page, branchOrTag); if (list != null && page == 1) { list.setCacheKey(cacheKey); saveObject(list, cacheKey); } } catch (Exception e) { e.printStackTrace(); list = (CommonList<Branch>) readObject(cacheKey); if (list == null) throw e; } } else { // 从缓存中读取 list = (CommonList<Branch>) readObject(cacheKey); if (list == null) list = new CommonList<Branch>(); } return list; } /** * 获得代码文件详情 * * @param projectId * 项目的id * @param file_path * 文件的路径 * @param ref * 分支或者标签 * @return * @throws Exception */ public CodeFile getCodeFile(String projectId, String file_path, String ref) throws Exception { CodeFile codeFile = null; try { codeFile = ApiClient.getCodeFile(this, projectId, file_path, ref); } catch (AppException e) { e.printStackTrace(); if (codeFile == null) throw e; } catch (Exception e) { throw e; } return codeFile; } /** * 获得一个项目的readme文件内容 * @param projectId * @return * @throws AppException */ public ReadMe getReadMeFile(String projectId) throws AppException { return ApiClient.getReadMeFile(this, projectId); } /** * 获得commit文件的diff * * @param projectId * @param commitId * @param isRefresh * @return * @throws Exception */ @SuppressWarnings("unchecked") public CommonList<CommitDiff> getCommitDiffList(String projectId, String commitId, boolean isRefresh) throws Exception { CommonList<CommitDiff> list = null; String cacheKey = "CommitDiffLsit_" + projectId + "_" + commitId; if (!isReadDataCache(cacheKey) || isRefresh) { try { list = ApiClient.getCommitDiffList(this, projectId, commitId); if (list != null) { list.setCacheKey(cacheKey); saveObject(list, cacheKey); } } catch (Exception e) { e.printStackTrace(); list = (CommonList<CommitDiff>) readObject(cacheKey); if (list == null) throw e; } } else { // 从缓存中读取 list = (CommonList<CommitDiff>) readObject(cacheKey); if (list == null) list = new CommonList<CommitDiff>(); } return list; } @SuppressWarnings("unchecked") public CommonList<Comment> getCommitCommentList(String projectId, String commitId, boolean isRefresh) throws AppException { CommonList<Comment> list = null; String cacheKey = "CommitCommentLsit_" + projectId + "_" + commitId; if (!isReadDataCache(cacheKey) || isRefresh) { try { list = ApiClient.getCommitCommentList(this, projectId, commitId, isRefresh); if (list != null) { list.setCacheKey(cacheKey); saveObject(list, cacheKey); } } catch (Exception e) { e.printStackTrace(); list = (CommonList<Comment>) readObject(cacheKey); } } else { // 从缓存中读取 list = (CommonList<Comment>) readObject(cacheKey); if (list == null) list = new CommonList<Comment>(); } return list; } /** * 通过commits获取代码文件的内容 * * @param appContext * @param projectId * @param commitId * @param filePath * @return * @throws Exception */ public String getCommitFileDetail(String projectId, String commitId, String filePath) throws Exception { return ApiClient.getCommitFileDetail(this, projectId, commitId, filePath); } /** * 获得项目的参与成员 * * @param projectId * @return * @throws AppException */ public List<User> getProjectMembers(String projectId) throws AppException { return ApiClient.getProjectMembers(this, projectId); } /** * 获得项目的里程碑 * * @param projectId * @return * @throws AppException */ public List<Milestone> getProjectMilestone(String projectId) throws AppException { return ApiClient.getProjectMilestone(this, projectId); } /** * 创建一个issue * * @param projectId * 项目ID * @param title * 标题 * @param description * 描述 * @param assignee_id * 被指派人的ID * @param milestone_id * 里程碑的ID * @return * @throws AppException */ public Issue pubCreateIssue(String projectId, String title, String description, String assignee_id, String milestone_id) throws AppException { return ApiClient.pubCreateIssue(this, projectId, title, description, assignee_id, milestone_id); } /** * 上传文件 * * @param files * @return * @throws AppException */ public UpLoadFile upLoad(File file) throws AppException { return ApiClient.upLoadFile(this, file); } /** * 获得通知 * @param filter * @param all * @param project_id * @return * @throws AppException */ public CommonList<ProjectNotificationArray> getNotification(String filter, String all, String project_id) throws AppException { return ApiClient.getNotification(this, filter, all, project_id); } /** * 设置通知为已读 * @param appContext * @param notificationId * @return * @throws AppException */ public NotificationReadResult setNotificationIsRead(String notificationId) throws AppException { return ApiClient.setNotificationIsRead(this, notificationId); } /** * 获取App更新信息 * @return * @throws AppException */ public Update getUpdateInfo() throws AppException { return ApiClient.getUpdateInfo(this); } /** * 获得语言列表 * @return * @throws AppException */ public CommonList<Language> getLanguageList() throws AppException { CommonList<Language> list = null; String cacheKey = "languages_list"; if (!isReadDataCache(cacheKey)) { try { list = ApiClient.getLanguageList(this); if (list != null) { list.setCacheKey(cacheKey); saveObject(list, cacheKey); } } catch (Exception e) { e.printStackTrace(); list = (CommonList<Language>) readObject(cacheKey); } } else { // 从缓存中读取 list = (CommonList<Language>) readObject(cacheKey); if (list == null) list = new CommonList<Language>(); } return list; } /** * 根据语言的ID来获得项目的列表 * @param languageId * @param page * @return * @throws AppException */ public List<Project> getLanguageProjectList(String languageId, int page) throws AppException { return ApiClient.getLanguageProjectList(this, languageId, page); } /** * 获得一个随机的项目 * @return * @throws AppException */ public RandomProject getRandomProject() throws AppException { return ApiClient.getRandomProject(this); } /** * 更新代码库中的代码文件 * @param appContext * @param project_id * @param branch_name * @param content * @param commit_message * @return * @throws AppException */ public String updateRepositoryFiles(String project_id, String ref, String file_path, String branch_name, String content, String commit_message) throws AppException { return ApiClient.updateRepositoryFiles(this, project_id, ref, file_path, branch_name, content, commit_message); } /** * 获得某个用户的star列表 * @param user_id * @param page * @param isRefresh * @return * @throws AppException */ @SuppressWarnings("unchecked") public CommonList<Project> getStarProjectList(String user_id, int page, boolean isRefresh) throws AppException { CommonList<Project> list = null; String cacheKey = "StarProjectList_" + user_id; if (!isReadDataCache(cacheKey) || isRefresh) { try { list = ApiClient.getStarProjectList(this, user_id, page, isRefresh); if (list != null) { list.setCacheKey(cacheKey); saveObject(list, cacheKey); } } catch (Exception e) { e.printStackTrace(); list = (CommonList<Project>) readObject(cacheKey); } } else { // 从缓存中读取 list = (CommonList<Project>) readObject(cacheKey); if (list == null) list = new CommonList<Project>(); } return list; } /** * 获得某个用户的watch列表 * @param user_id * @param page * @param isRefresh * @return * @throws AppException */ @SuppressWarnings("unchecked") public CommonList<Project> getWatchProjectList(String user_id, int page, boolean isRefresh) throws AppException { CommonList<Project> list = null; String cacheKey = "WatchProjectList_" + user_id; if (!isReadDataCache(cacheKey) || isRefresh) { try { list = ApiClient.getWatchProjectList(this, user_id, page, isRefresh); if (list != null) { list.setCacheKey(cacheKey); saveObject(list, cacheKey); } } catch (Exception e) { e.printStackTrace(); list = (CommonList<Project>) readObject(cacheKey); } } else { // 从缓存中读取 list = (CommonList<Project>) readObject(cacheKey); if (list == null) list = new CommonList<Project>(); } return list; } }