package net.coding.program.model; import android.app.NotificationManager; import android.content.Context; import android.content.SharedPreferences; import android.net.Uri; import net.coding.program.MyApp; import net.coding.program.common.Global; import net.coding.program.common.LoginBackground; import net.coding.program.common.SimpleSHA1; import net.coding.program.login.MarketingHelp; import net.coding.program.login.ZhongQiuGuideActivity; import net.coding.program.maopao.MaopaoAddActivity; import net.coding.program.message.MessageListActivity; import net.coding.program.project.detail.TopicAddActivity; import net.coding.program.user.UsersListActivity; import org.json.JSONObject; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; import java.util.ArrayList; import java.util.Calendar; /** * Created by cc191954 on 14-8-7. * 保存数据到本地,包括用户数据和全局数据. */ public class AccountInfo { private static final String ACCOUNT = "ACCOUNT"; private static final String PROJECTS = "PROJECTS"; private static final String MESSAGE_USERS = "MESSAGE_USERS"; private static final String CACHE_FRIEND_FOLLOW = "CACHE_FRIEND_FOLLOW"; private static final String CACHE_FRIEND_FANS = "CACHE_FRIEND_FANS"; private static final String AUTH_URI_DATAS = "AUTH_URI_DATAS"; private static final String PROJECT_MEMBER = "PROJECT_MEMBER"; private static final String MESSAGE_DRAFT = "MESSAGE_DRAFT"; private static final String GLOBAL_SETTING = "GLOBAL_SETTING"; private static final String GLOBAL_SETTING_BACKGROUND = "GLOBAL_SETTING_BACKGROUND"; private static final String GLOBAL_MARKED_MARKETING = "GLOBAL_MARKED_MARKETING"; private static final String USER_MAOPAO = "USER_MAOPAO"; private static final String MAOPAO_DRAFT = "MAOPAO_DRAFT"; private static final String USER_RELOGIN_INFO = "USER_RELOGIN_INFO2"; // 修改了数据类型,由Pair改为UserObject // 上次成功登录时用户输入的用户名,可能是邮箱或个性后缀 private static final String GLOBAL_LAST_LOGIN_NAME = "GLOBAL_LAST_LOGIN_NAME"; private static final String USER_TASK_PROJECTS = "USER_TASK_PROJECTS"; private static final String USER_TASKS = "USER_TASKS_%d_%d"; private static final String USER_NO_SEND_MESSAGE = "USER_NO_SEND_MESSAGE"; private static final String BACKGROUNDS = "BACKGROUNDS"; private static final String FILE_PUSH = "FILE_PUSH"; private static final String KEY_NEED_PUSH = "KEY_NEED_PUSH"; private static final String KEY_CUSTOM_HOST = "KEY_CUSTOM_HOST"; private static final String KEY_MAOPAO_BANNER = "KEY_MAOPAO_BANNER"; private static final String KEY_MALL_BANNER = "KEY_MALL_BANNER"; private static final String KEY_CACHE_GET_REQUEST = "KEY_CACHE_GET_REQUEST"; // 每添加一个 private static final String MARK_GUIDE_32 = "MARK_GUIDE_32"; // 标记3.2中的引导页面 private static final String MARK_GUIDE_FEATURES = "MARK_GUIDE_325"; // 修改这个值就可以了 public static void loginOut(Context ctx) { File dir = ctx.getFilesDir(); String[] fileNameList = dir.list(); for (String item : fileNameList) { File file = new File(dir, item); if (file.exists() && !file.isDirectory()) { file.delete(); } } AccountInfo.setNeedPush(ctx, true); NotificationManager notificationManager = (NotificationManager) ctx.getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.cancelAll(); } public static void saveAccount(Context ctx, UserObject data) { File file = new File(ctx.getFilesDir(), ACCOUNT); if (file.exists()) { file.delete(); } try { ObjectOutputStream oos = new ObjectOutputStream(ctx.openFileOutput(ACCOUNT, Context.MODE_PRIVATE)); oos.writeObject(data); oos.close(); } catch (Exception e) { e.printStackTrace(); } } public static UserObject loadAccount(Context ctx) { UserObject data = null; File file = new File(ctx.getFilesDir(), ACCOUNT); if (file.exists()) { try { ObjectInputStream ois = new ObjectInputStream(ctx.openFileInput(ACCOUNT)); data = (UserObject) ois.readObject(); ois.close(); } catch (Exception e) { e.printStackTrace(); } } if (data == null) { data = new UserObject(); } return data; } public static boolean isLogin(Context ctx) { File file = new File(ctx.getFilesDir(), ACCOUNT); return file.exists(); } public static void saveProjects(Context ctx, ArrayList<ProjectObject> data) { if (ctx == null) { return; } File file = new File(ctx.getFilesDir(), PROJECTS); if (file.exists()) { file.delete(); } try { ObjectOutputStream oos = new ObjectOutputStream(ctx.openFileOutput(PROJECTS, Context.MODE_PRIVATE)); oos.writeObject(data); oos.close(); } catch (Exception e) { e.printStackTrace(); } } public static JSONObject getGetRequestCache(Context context, String request) { String s = new DataCache<String>().loadObject(context, Global.encodeUtf8(request), KEY_CACHE_GET_REQUEST); try { return new JSONObject(s); } catch (Exception e) { return new JSONObject(); } } public static void saveGetRequestCache(Context context, String request, JSONObject json) { new DataCache<String>().save(context, json.toString(), Global.encodeUtf8(request), KEY_CACHE_GET_REQUEST); } @SuppressWarnings("unchecked") public static ArrayList<ProjectObject> loadProjects(Context ctx) { ArrayList<ProjectObject> data = null; File file = new File(ctx.getFilesDir(), PROJECTS); if (file.exists()) { try { ObjectInputStream ois = new ObjectInputStream(ctx.openFileInput(PROJECTS)); data = (ArrayList<ProjectObject>) ois.readObject(); ois.close(); } catch (Exception e) { e.printStackTrace(); } } if (data == null) { data = new ArrayList<>(); } return data; } public static boolean needDisplayGuide(Context context) { if (!ZhongQiuGuideActivity.isZhongqiu()) { return false; } Boolean result = new DataCache<Boolean>().loadGlobalObject(context, MARK_GUIDE_FEATURES); if (result == null) { return true; } return result; } public static void markGuideReaded(Context context) { new DataCache<Boolean>().saveGlobal(context, Boolean.FALSE, MARK_GUIDE_FEATURES); } public static boolean isCacheProjects(Context ctx) { File file = new File(ctx.getFilesDir(), PROJECTS); return file.exists(); } public static void saveMessageUsers(Context ctx, ArrayList<Message.MessageObject> data) { if (ctx == null) { return; } File file = new File(ctx.getFilesDir(), MESSAGE_USERS); if (file.exists()) { file.delete(); } try { ObjectOutputStream oos = new ObjectOutputStream(ctx.openFileOutput(MESSAGE_USERS, Context.MODE_PRIVATE)); oos.writeObject(data); oos.close(); } catch (Exception e) { e.printStackTrace(); } } @SuppressWarnings("unchecked") public static ArrayList<Message.MessageObject> loadMessageUsers(Context ctx) { ArrayList<Message.MessageObject> data = null; File file = new File(ctx.getFilesDir(), MESSAGE_USERS); if (file.exists()) { try { ObjectInputStream ois = new ObjectInputStream(ctx.openFileInput(MESSAGE_USERS)); data = (ArrayList<Message.MessageObject>) ois.readObject(); ois.close(); } catch (Exception e) { e.printStackTrace(); } } if (data == null) { data = new ArrayList<>(); } return data; } public static void saveMessages(Context ctx, String globalKey, ArrayList<Message.MessageObject> data) { if (ctx == null) { return; } File file = new File(ctx.getFilesDir(), globalKey); if (file.exists()) { file.delete(); } try { ObjectOutputStream oos = new ObjectOutputStream(ctx.openFileOutput(globalKey, Context.MODE_PRIVATE)); oos.writeObject(data); oos.close(); } catch (Exception e) { e.printStackTrace(); } } @SuppressWarnings("unchecked") public static ArrayList<Message.MessageObject> loadMessages(Context ctx, String globalKey) { ArrayList<Message.MessageObject> data = null; File file = new File(ctx.getFilesDir(), globalKey); if (file.exists()) { try { ObjectInputStream ois = new ObjectInputStream(ctx.openFileInput(globalKey)); data = (ArrayList<Message.MessageObject>) ois.readObject(); ois.close(); } catch (Exception e) { e.printStackTrace(); } } if (data == null) { data = new ArrayList<>(); } return data; } public static void saveFriends(Context ctx, ArrayList<UserObject> data, UsersListActivity.Friend type) { String name = friendTypeToFileName(type); new DataCache<UserObject>().save(ctx, data, name); } public static ArrayList<UserObject> loadFriends(Context ctx, UsersListActivity.Friend type) { String fileName = friendTypeToFileName(type); return new DataCache<UserObject>().load(ctx, fileName); } private static String friendTypeToFileName(UsersListActivity.Friend type) { if (type == UsersListActivity.Friend.Follow) { return CACHE_FRIEND_FOLLOW; } return CACHE_FRIEND_FANS; } public static void saveAuthDatas(Context context, ArrayList<String> data) { new DataCache<String>().saveGlobal(context, data, AUTH_URI_DATAS); } public static ArrayList<String> loadAuthDatas(Context context) { return new DataCache<String>().loadGlobal(context, AUTH_URI_DATAS); } public static String loadAuth(Context context, String globalKey) { if (globalKey == null || globalKey.isEmpty()) { return ""; } globalKey = "/" + globalKey; ArrayList<String> uris = loadAuthDatas(context); for (String uriString : uris) { Uri uri = Uri.parse(uriString); String[] item = uri.getPath().split("@"); if (item.length >= 2 && item[1].equals("Coding") && item[0].equals(globalKey)) { return uriString; } } return ""; } // public static void saveProjectMembers(Context ctx, ArrayList<TaskObject.Members> data, int projectId) { // new DataCache<TaskObject.Members>().save(ctx, data, PROJECT_MEMBER + projectId); // } // public static ArrayList<TaskObject.Members> loadProjectMembers(Context ctx, int projectId) { // return new DataCache<TaskObject.Members>().load(ctx, PROJECT_MEMBER + projectId); // } // input 为 "" 时,删除上次的输入 public static void saveMessageDraft(Context ctx, String input, String globalkey) { if (input.isEmpty()) { // new DataCache<String>().delete(ctx, MESSAGE_DRAFT + globalkey); } else { ArrayList<String> data = new ArrayList<>(); data.add(input); new DataCache<String>().save(ctx, data, MESSAGE_DRAFT + globalkey); } } public static String loadMessageDraft(Context ctx, String globalKey) { ArrayList<String> data = new DataCache<String>().load(ctx, MESSAGE_DRAFT + globalKey); if (data.isEmpty()) { return ""; } else { return data.get(0); } } public static boolean getNeedPush(Context ctx) { SharedPreferences sp = ctx.getSharedPreferences(FILE_PUSH, Context.MODE_PRIVATE); return sp.getBoolean(KEY_NEED_PUSH, true); } public static void setNeedPush(Context ctx, boolean push) { SharedPreferences sp = ctx.getSharedPreferences(FILE_PUSH, Context.MODE_PRIVATE); SharedPreferences.Editor editor = sp.edit(); editor.putBoolean(KEY_NEED_PUSH, push); editor.commit(); } public static void setCheckLoginBackground(Context ctx) { Calendar calendar = Calendar.getInstance(); SharedPreferences.Editor editor = ctx.getSharedPreferences(GLOBAL_SETTING, Context.MODE_PRIVATE).edit(); editor.putLong(GLOBAL_SETTING_BACKGROUND, calendar.getTimeInMillis()); editor.commit(); } // 距离上次检查24小时后再检查 public static boolean needCheckLoginBackground(Context ctx) { long last = ctx.getSharedPreferences(GLOBAL_SETTING, Context.MODE_PRIVATE) .getLong(GLOBAL_SETTING_BACKGROUND, 0); return (Calendar.getInstance().getTimeInMillis() - last) > 1000 * 3600 * 24; } public static void saveMaopao(Context ctx, ArrayList<Maopao.MaopaoObject> data, String type, int id) { new DataCache<Maopao.MaopaoObject>().save(ctx, data, USER_MAOPAO + type + id); } public static ArrayList<Maopao.MaopaoObject> loadMaopao(Context ctx, String type, int id) { return new DataCache<Maopao.MaopaoObject>().load(ctx, USER_MAOPAO + type + id); } public static void saveMaopaoDraft(Context ctx, MaopaoAddActivity.MaopaoDraft draft) { if (draft.isEmpty()) { new DataCache<MaopaoAddActivity.MaopaoDraft>().delete(ctx, MAOPAO_DRAFT); } else { ArrayList<MaopaoAddActivity.MaopaoDraft> data = new ArrayList<>(); data.add(draft); new DataCache<MaopaoAddActivity.MaopaoDraft>().save(ctx, data, MAOPAO_DRAFT); } } public static void saveTopicDraft(Context ctx, TopicAddActivity.TopicDraft draft, String projectPath, int topicId) { ArrayList<TopicAddActivity.TopicDraft> data = new ArrayList<>(); data.add(draft); new DataCache<TopicAddActivity.TopicDraft>().save(ctx, data, SimpleSHA1.sha1(projectPath + topicId)); } public static ArrayList<TopicAddActivity.TopicDraft> loadTopicDraft(Context ctx, String projectPath, int topicId) { return new DataCache<TopicAddActivity.TopicDraft>().load(ctx, SimpleSHA1.sha1(projectPath + topicId)); } public static void deleteTopicDraft(Context ctx, String projectPath, int topicId) { new DataCache<TopicAddActivity.TopicDraft>().delete(ctx, SimpleSHA1.sha1(projectPath + topicId)); } public static MaopaoAddActivity.MaopaoDraft loadMaopaoDraft(Context ctx) { ArrayList<MaopaoAddActivity.MaopaoDraft> data = new DataCache<MaopaoAddActivity.MaopaoDraft>().load(ctx, MAOPAO_DRAFT); if (data.isEmpty()) { return new MaopaoAddActivity.MaopaoDraft(); } else { return data.get(0); } } public static void saveReloginInfo(Context ctx, UserObject user) { DataCache<UserObject> dateCache = new DataCache<>(); ArrayList<UserObject> listData = dateCache.loadGlobal(ctx, USER_RELOGIN_INFO); for (int i = 0; i < listData.size(); ++i) { if (listData.get(i).global_key.equals(user.global_key)) { listData.remove(i); --i; } } listData.add(user); dateCache.saveGlobal(ctx, listData, USER_RELOGIN_INFO); } public static void saveLastLoginName(Context context, String name) { new DataCache<String>().saveGlobal(context, name, GLOBAL_LAST_LOGIN_NAME); } public static String loadLastLoginName(Context context) { String s = new DataCache<String>().loadGlobalObject(context, GLOBAL_LAST_LOGIN_NAME); if (s == null) { return ""; } return s; } public static void saveTaskProjects(Context context, ArrayList<ProjectObject> data) { new DataCache<ProjectObject>().save(context, data, USER_TASK_PROJECTS); } public static ArrayList<ProjectObject> loadTaskProjects(Context context) { return new DataCache<ProjectObject>().load(context, USER_TASK_PROJECTS); } public static void saveTasks(Context context, ArrayList<TaskObject.SingleTask> data, int projectId, int userId) { new DataCache<TaskObject.SingleTask>().save(context, data, String.format(USER_TASKS, projectId, userId)); } public static ArrayList<TaskObject.SingleTask> loadTasks(Context context, int projectId, int userId) { return new DataCache<TaskObject.SingleTask>().load(context, String.format(USER_TASKS, projectId, userId)); } public static void saveNoSendMessage(Context context, MessageListActivity.MyMessage message) { ArrayList<MessageListActivity.MyMessage> allMessages = loadNoSendMessage(context); allMessages.add(message); new DataCache<MessageListActivity.MyMessage>().save(context, allMessages, USER_NO_SEND_MESSAGE); } public static void saveCustomHost(Context context, CustomHost data) { new DataCache<CustomHost>().saveGlobal(context, data, KEY_CUSTOM_HOST); } public static CustomHost getCustomHost(Context context) { CustomHost host = new DataCache<CustomHost>().loadGlobalObject(context, KEY_CUSTOM_HOST); if (host == null) { host = new CustomHost(); } return host; } public static void removeCustomHost(Context context) { new DataCache<String>().deleteGlobal(context, KEY_CUSTOM_HOST); } public static void saveMaopaoBanners(Context context, ArrayList<BannerObject> data) { new DataCache<BannerObject>().saveGlobal(context, data, KEY_MAOPAO_BANNER); } public static ArrayList<BannerObject> getMaopaoBanners(Context context) { return new DataCache<BannerObject>().loadGlobal(context, KEY_MAOPAO_BANNER); } public static void saveMallBanners(Context context, ArrayList<MallBannerObject> data) { new DataCache<MallBannerObject>().saveGlobal(context, data, KEY_MALL_BANNER); } public static ArrayList<MallBannerObject> getMallBanners(Context context) { return new DataCache<MallBannerObject>().loadGlobal(context, KEY_MALL_BANNER); } public static void removeNoSendMessage(Context context, long createTime) { ArrayList<MessageListActivity.MyMessage> allMessages = loadNoSendMessage(context); for (int i = 0; i < allMessages.size(); ++i) { MessageListActivity.MyMessage item = allMessages.get(i); if (item.getCreateTime() == createTime) { allMessages.remove(i); break; } } new DataCache<MessageListActivity.MyMessage>().save(context, allMessages, USER_NO_SEND_MESSAGE); } public static ArrayList<MessageListActivity.MyMessage> loadNoSendMessage(Context context, String globalKey) { ArrayList<MessageListActivity.MyMessage> allMessages = loadNoSendMessage(context); ArrayList<MessageListActivity.MyMessage> messages = new ArrayList<>(); for (MessageListActivity.MyMessage item : allMessages) { if (item.friend.global_key.equals(globalKey)) { messages.add(item); } } return messages; } public static ArrayList<MessageListActivity.MyMessage> loadNoSendMessage(Context context) { return new DataCache<MessageListActivity.MyMessage>().load(context, USER_NO_SEND_MESSAGE); } public static String loadRelogininfo(Context ctx, String key) { ArrayList<UserObject> listData = new DataCache<UserObject>().loadGlobal(ctx, USER_RELOGIN_INFO); for (UserObject item : listData) { if (item.email.equals(key) || item.phone.equals(key) || item.global_key.equals(key)) { return item.global_key; } } return ""; } public static String[] loadAllRelogininfo(Context ctx) { ArrayList<UserObject> listData = new DataCache<UserObject>().loadGlobal(ctx, USER_RELOGIN_INFO); ArrayList<String> array = new ArrayList<>(); for (UserObject item : listData) { array.add(item.email); array.add(item.phone); array.add(item.global_key); } String[] data = new String[array.size()]; return array.toArray(data); } public static MarketingHelp.MarkedMarketingData loadGlobalMarkedMarketing(Context context) { String global_key = MyApp.sUserObject.global_key; ArrayList<MarketingHelp.MarkedMarketingData> allUser = new DataCache<MarketingHelp.MarkedMarketingData>().load(context, GLOBAL_MARKED_MARKETING); for (MarketingHelp.MarkedMarketingData item : allUser) { if (item.mGlobalKey.equals(global_key)) { return item; } } return new MarketingHelp.MarkedMarketingData(global_key); } public static void saveGlobalMarkedMarketing(Context context, MarketingHelp.MarkedMarketingData data) { ArrayList<MarketingHelp.MarkedMarketingData> allUser = new DataCache<MarketingHelp.MarkedMarketingData>().load(context, GLOBAL_MARKED_MARKETING); boolean find = false; for (int i = 0; i < allUser.size(); ++i) { MarketingHelp.MarkedMarketingData item = allUser.get(i); if (data.mGlobalKey.equals(item.mGlobalKey)) { find = true; item.mReadData = data.mReadData; break; } } if (!find) { allUser.add(data); } new DataCache<MarketingHelp.MarkedMarketingData>().save(context, allUser, GLOBAL_MARKED_MARKETING); } public static void saveBackgrounds(Context ctx, ArrayList<LoginBackground.PhotoItem> data) { new DataCache<LoginBackground.PhotoItem>().saveGlobal(ctx, data, BACKGROUNDS); } public static ArrayList<LoginBackground.PhotoItem> loadBackgrounds(Context ctx) { return new DataCache<LoginBackground.PhotoItem>().loadGlobal(ctx, BACKGROUNDS); } static class DataCache<T> { public final static String FILDER_GLOBAL = "FILDER_GLOBAL"; public void save(Context ctx, ArrayList<T> data, String name) { save(ctx, data, name, ""); } public void saveGlobal(Context ctx, Object data, String name) { save(ctx, data, name, FILDER_GLOBAL); } private void deleteFile(File folder, String name) { File file = new File(folder, name); if (file.exists()) { file.delete(); } } public void delete(Context ctx, String name) { deleteFile(ctx.getFilesDir(), name); } public void deleteGlobal(Context ctx, String name) { File globalFolder = new File(ctx.getFilesDir(), FILDER_GLOBAL); if (!globalFolder.exists()) { return; } deleteFile(globalFolder, name); } private void save(Context ctx, Object data, String name, String folder) { if (ctx == null) { return; } File file; if (!folder.isEmpty()) { File fileDir = new File(ctx.getFilesDir(), folder); if (!fileDir.exists() || !fileDir.isDirectory()) { fileDir.mkdir(); } file = new File(fileDir, name); } else { file = new File(ctx.getFilesDir(), name); } if (file.exists()) { file.delete(); } try { ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file)); oos.writeObject(data); oos.close(); } catch (Exception e) { e.printStackTrace(); } } public ArrayList<T> load(Context ctx, String name) { return load(ctx, name, ""); } public ArrayList<T> loadGlobal(Context ctx, String name) { return load(ctx, name, FILDER_GLOBAL); } @SuppressWarnings("unchecked") public T loadGlobalObject(Context ctx, String name) { String folder = FILDER_GLOBAL; T data = null; File file; if (!folder.isEmpty()) { File fileDir = new File(ctx.getFilesDir(), folder); if (!fileDir.exists() || !fileDir.isDirectory()) { fileDir.mkdir(); } file = new File(fileDir, name); } else { file = new File(ctx.getFilesDir(), name); } if (file.exists()) { try { ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file)); data = (T) ois.readObject(); ois.close(); } catch (Exception e) { e.printStackTrace(); } } return data; } @SuppressWarnings("unchecked") private T loadObject(Context ctx, String name, String folder) { T data = null; File file; if (!folder.isEmpty()) { File fileDir = new File(ctx.getFilesDir(), folder); if (!fileDir.exists() || !fileDir.isDirectory()) { fileDir.mkdir(); } file = new File(fileDir, name); } else { file = new File(ctx.getFilesDir(), name); } if (file.exists()) { try { ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file)); data = (T) ois.readObject(); ois.close(); } catch (Exception e) { e.printStackTrace(); } } return data; } @SuppressWarnings("unchecked") private ArrayList<T> load(Context ctx, String name, String folder) { ArrayList<T> data = null; File file; if (!folder.isEmpty()) { File fileDir = new File(ctx.getFilesDir(), folder); if (!fileDir.exists() || !fileDir.isDirectory()) { fileDir.mkdir(); } file = new File(fileDir, name); } else { file = new File(ctx.getFilesDir(), name); } if (file.exists()) { try { ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file)); data = (ArrayList<T>) ois.readObject(); ois.close(); } catch (Exception e) { e.printStackTrace(); } } if (data == null) { data = new ArrayList<>(); } return data; } } public static class CustomHost implements Serializable { private String host = ""; private String code = ""; public CustomHost() { } public CustomHost(String host, String code) { this.host = host; this.code = code; } public String getHost() { return host; } public String getCode() { return code; } } static class Pair implements Serializable { public String first; public String second; Pair(String first, String second) { this.first = first; this.second = second; } } }