package com.athena.asm;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Set;
import android.app.Application;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.preference.PreferenceManager;
import android.util.Log;
import com.athena.asm.data.Board;
import com.athena.asm.data.Preferences;
import com.athena.asm.util.CrashHandler;
import com.athena.asm.util.MyDatabase;
import com.athena.asm.util.SimpleCrypto;
import com.athena.asm.util.StringUtility;
import com.athena.asm.viewmodel.HomeViewModel;
import com.athena.asm.viewmodel.MailViewModel;
import com.athena.asm.viewmodel.PostListViewModel;
import com.athena.asm.viewmodel.SubjectListViewModel;
public class aSMApplication extends Application {
private static aSMApplication m_application;
public static int THEME = R.style.Theme_Sherlock;
public static int ORIENTATION = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
public static int IMAGE_ORIENTATION = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
private boolean m_isFirstLaunch = false;
private boolean m_isLoadDefaultCategoryFile = false;
/*
* settings: to change the default value of one setting: 1. change
* android:defaultValue of the element in preference.xml 2. change default
* value for the variable 3. change default value when editor.putBoolean /
* settings.getBoolean
*/
private boolean m_isRememberUser = true;
private boolean m_isAutoLogin = false;
private String m_autoUserName = "";
private String m_autoPassword = "";
private String currentUserID = "";
private String defaultTab = StringUtility.TAB_GUIDANCE;
private String defaultBoardType = "001";
private boolean isShowCheck = true;
private boolean isUseVibrate = true;
private String checkInterval = "3";
private int lastLaunchVersionCode = 4;
private int currentVersionCode = 5;
private boolean isWeiboStyle = false;
private boolean isShowIp = true;
private int guidanceFontSize = 25;
private int guidanceSecondFontSize = 20;
private int subjectFontSize = 18;
private int postFontSize = 17;
private LinkedList<Board> recentBoards = null;
private Set<String> recentBoardNameSet = null;
private boolean isAutoOptimize = true;
private float imageSizeThreshold = 50;
private boolean isTouchScroll = true;
private boolean isTouchSwipe = true;
private boolean isTouchSwipeBack = true;
private boolean isTouchHint = true;
private boolean isHidePinSubject = false;
private boolean isNightTheme = true;
private int defaultOrientation = 0;
private int defaultImageOrientation = 0;
private boolean isPromotionShow = true;
private String promotionContent = "";
private ArrayList<String> blackList = new ArrayList<String>();
private String forwardEmailAddr = "";
// View models for Activities
private HomeViewModel m_homeViewModel = new HomeViewModel();
private SubjectListViewModel m_subjectListViewModel = new SubjectListViewModel();
private PostListViewModel m_postListViewModel = new PostListViewModel();
private MailViewModel m_mailViewModel = new MailViewModel();
// IP database
public static MyDatabase db;
@Override
public void onCreate() {
super.onCreate();
CrashHandler crashHandler = CrashHandler.getInstance();
crashHandler.init(getApplicationContext());
db = new MyDatabase(this);
m_application = this;
m_application.initPreferences();
}
protected void onDestroy() {
db.close();
}
public static aSMApplication getCurrentApplication() {
return m_application;
}
public void syncPreferences() {
try {
FileOutputStream fos = openFileOutput("RecentFavList", Context.MODE_PRIVATE);
ObjectOutputStream os = new ObjectOutputStream(fos);
os.writeObject(recentBoards);
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public boolean isFirstLaunchApp() {
return m_isFirstLaunch;
}
public void markFirstLaunchApp() {
m_isFirstLaunch = false;
lastLaunchVersionCode = currentVersionCode;
}
public boolean isFirstLaunchAfterUpdate() {
if (lastLaunchVersionCode < currentVersionCode) {
return true;
} else {
return false;
}
}
public void updateDefaultCategoryLoadStatus(boolean isLoaded) {
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean(Preferences.DEFAULT_CATEGORY_LOADED, isLoaded);
editor.commit();
}
@SuppressWarnings("unchecked")
public void initPreferences() {
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);
SharedPreferences.Editor editor = settings.edit();
if (!settings.contains(Preferences.DEFAULT_CATEGORY_LOADED)) {
editor.putBoolean(Preferences.DEFAULT_CATEGORY_LOADED, false);
} else {
setLoadDefaultCategoryFile(settings.getBoolean(Preferences.DEFAULT_CATEGORY_LOADED, true));
}
if (!settings.contains(Preferences.REMEMBER_USER)) {
editor.putBoolean(Preferences.REMEMBER_USER, true);
} else {
m_isRememberUser = settings.getBoolean(Preferences.REMEMBER_USER, true);
}
if (!settings.contains(Preferences.AUTO_LOGIN)) {
editor.putBoolean(Preferences.AUTO_LOGIN, false);
} else {
m_isAutoLogin = settings.getBoolean(Preferences.AUTO_LOGIN, false);
;
}
if (!settings.contains(Preferences.DEFAULT_TAB)) {
editor.putString(Preferences.DEFAULT_TAB, StringUtility.TAB_GUIDANCE);
} else {
defaultTab = settings.getString(Preferences.DEFAULT_TAB, StringUtility.TAB_GUIDANCE);
}
if (!settings.contains(Preferences.DEFAULT_BOARD_TYPE)) {
editor.putString(Preferences.DEFAULT_BOARD_TYPE, "001");
} else {
defaultBoardType = settings.getString(Preferences.DEFAULT_BOARD_TYPE, "001");
}
if (!settings.contains(Preferences.SHOW_CHECK)) {
editor.putBoolean(Preferences.SHOW_CHECK, true);
} else {
setShowCheck(settings.getBoolean(Preferences.SHOW_CHECK, true));
}
if (!settings.contains(Preferences.USE_VIBRATE)) {
editor.putBoolean(Preferences.USE_VIBRATE, true);
} else {
setUseVibrate(settings.getBoolean(Preferences.USE_VIBRATE, true));
}
if (!settings.contains(Preferences.CHECK_INTERVAL)) {
editor.putString(Preferences.CHECK_INTERVAL, "3");
} else {
setCheckInterval(settings.getString(Preferences.CHECK_INTERVAL, "3"));
}
if (!settings.contains(Preferences.WEIBO_STYLE)) {
editor.putBoolean(Preferences.WEIBO_STYLE, false);
} else {
setWeiboStyle(settings.getBoolean(Preferences.WEIBO_STYLE, false));
}
if (!settings.contains(Preferences.SHOW_IP)) {
editor.putBoolean(Preferences.SHOW_IP, true);
} else {
setShowIp(settings.getBoolean(Preferences.SHOW_IP, true));
}
if (!settings.contains(Preferences.GUIDANCE_FONT_SIZE)) {
editor.putString(Preferences.GUIDANCE_FONT_SIZE, "25");
} else {
String size = settings.getString(Preferences.GUIDANCE_FONT_SIZE, "25");
guidanceFontSize = StringUtility.filterUnNumber(size);
if (guidanceFontSize == 0) {
guidanceFontSize = 25;
}
}
if (!settings.contains(Preferences.GUIDANCE_SECOND_FONT_SIZE)) {
editor.putString(Preferences.GUIDANCE_SECOND_FONT_SIZE, "20");
} else {
String size = settings.getString(Preferences.GUIDANCE_SECOND_FONT_SIZE, "20");
guidanceSecondFontSize = StringUtility.filterUnNumber(size);
if (guidanceSecondFontSize == 0) {
guidanceSecondFontSize = 20;
}
}
if (!settings.contains(Preferences.SUBJECT_FONT_SIZE)) {
editor.putString(Preferences.SUBJECT_FONT_SIZE, "18");
} else {
String size = settings.getString(Preferences.SUBJECT_FONT_SIZE, "18");
subjectFontSize = StringUtility.filterUnNumber(size);
if (subjectFontSize == 0) {
subjectFontSize = 18;
}
}
if (!settings.contains(Preferences.POST_FONT_SIZE)) {
editor.putString(Preferences.POST_FONT_SIZE, "17");
} else {
String size = settings.getString(Preferences.POST_FONT_SIZE, "17");
postFontSize = StringUtility.filterUnNumber(size);
if (postFontSize == 0) {
postFontSize = 17;
}
}
if (!settings.contains(Preferences.TOUCH_SCROLL)) {
editor.putBoolean(Preferences.TOUCH_SCROLL, true);
} else {
isTouchScroll = settings.getBoolean(Preferences.TOUCH_SCROLL, true);
}
if (!settings.contains(Preferences.TOUCH_SWIPE)) {
editor.putBoolean(Preferences.TOUCH_SWIPE, true);
} else {
isTouchSwipe = settings.getBoolean(Preferences.TOUCH_SWIPE, true);
}
if (!settings.contains(Preferences.TOUCH_SWIPE_BACK)) {
editor.putBoolean(Preferences.TOUCH_SWIPE_BACK, true);
} else {
isTouchSwipeBack = settings.getBoolean(Preferences.TOUCH_SWIPE_BACK, true);
}
if (!settings.contains(Preferences.TOUCH_HINT)) {
editor.putBoolean(Preferences.TOUCH_HINT, true);
} else {
isTouchHint = settings.getBoolean(Preferences.TOUCH_HINT, true);
}
if (!settings.contains(Preferences.HIDE_PIN_SUBJECT)) {
editor.putBoolean(Preferences.HIDE_PIN_SUBJECT, false);
} else {
setHidePinSubject(settings.getBoolean(Preferences.HIDE_PIN_SUBJECT, false));
}
if (!settings.contains(Preferences.NIGHT_THEME)) {
editor.putBoolean(Preferences.NIGHT_THEME, true);
} else {
setNightTheme(settings.getBoolean(Preferences.NIGHT_THEME, true));
}
if (!settings.contains(Preferences.DEFAULT_ORIENTATION)) {
editor.putString(Preferences.DEFAULT_ORIENTATION, "0");
} else {
setDefaultOrientation(StringUtility
.filterUnNumber(settings.getString(Preferences.DEFAULT_ORIENTATION, "0")));
}
if (!settings.contains(Preferences.DEFAULT_IMAGE_ORIENTATION)) {
editor.putString(Preferences.DEFAULT_IMAGE_ORIENTATION, "0");
} else {
setDefaultImageOrientation(StringUtility
.filterUnNumber(settings.getString(Preferences.DEFAULT_IMAGE_ORIENTATION, "0")));
}
if (!settings.contains(Preferences.PROMOTION_SHOW)) {
editor.putBoolean(Preferences.PROMOTION_SHOW, true);
} else {
setPromotionShow(settings.getBoolean(Preferences.PROMOTION_SHOW, true));
}
if (!settings.contains(Preferences.PROMOTION_CONTENT)) {
editor.putString(Preferences.PROMOTION_CONTENT, "");
} else {
setPromotionContent(settings.getString(Preferences.PROMOTION_CONTENT, ""));
}
if (!settings.contains(Preferences.AUTO_OPTIMIZE)) {
editor.putBoolean(Preferences.AUTO_OPTIMIZE, true);
} else {
setAutoOptimize(settings.getBoolean(Preferences.AUTO_OPTIMIZE, true));
}
if (!settings.contains(Preferences.IMAGE_SIZE_THRESHOLD)) {
editor.putString(Preferences.IMAGE_SIZE_THRESHOLD, "50");
} else {
String size = settings.getString(Preferences.IMAGE_SIZE_THRESHOLD, "50");
setImageSizeThreshold(StringUtility.filterUnNumber(size));
}
if (!settings.contains(Preferences.BLACK_LIST)) {
editor.putString(Preferences.BLACK_LIST, "");
} else {
blackList.clear();
String blackListString = settings.getString(Preferences.BLACK_LIST, "");
blackListString = blackListString.replaceAll(" ", " ");
String[] ids = blackListString.split(" ");
for (int i = 0; i < ids.length; i++) {
String idString = ids[i].trim();
if (idString.length() > 0) {
blackList.add(ids[i]);
}
}
}
if (!settings.contains(Preferences.FORWARD_EMAIL)) {
editor.putString(Preferences.FORWARD_EMAIL, "");
} else {
setForwardEmailAddr(settings.getString(Preferences.FORWARD_EMAIL, ""));
;
}
PackageManager pm = getPackageManager();
try {
PackageInfo pi = pm.getPackageInfo(getPackageName(), 0);
currentVersionCode = pi.versionCode;
} catch (NameNotFoundException e1) {
e1.printStackTrace();
}
if (settings.contains(Preferences.LAST_LAUNCH_VERSION)) {
String versionCode = settings.getString(Preferences.LAST_LAUNCH_VERSION, "4");
lastLaunchVersionCode = StringUtility.filterUnNumber(versionCode);
} else {
m_isFirstLaunch = true;
}
editor.putString(Preferences.LAST_LAUNCH_VERSION, currentVersionCode + "");
setAutoUserName(settings.getString(Preferences.USERNAME_KEY, ""));
setAutoPassword(settings.getString(Preferences.PASSWORD_KEY, ""));
if (lastLaunchVersionCode == 4) {
try {
m_autoPassword = SimpleCrypto.encrypt("comathenaasm", m_autoPassword);
editor.putString(Preferences.PASSWORD_KEY, m_autoPassword);
} catch (Exception e) {
e.printStackTrace();
}
}
editor.commit();
try {
m_autoPassword = SimpleCrypto.decrypt("comathenaasm", m_autoPassword);
} catch (Exception e) {
e.printStackTrace();
}
if (recentBoards == null) {
try {
FileInputStream fis = openFileInput("RecentFavList");
ObjectInputStream ois = new ObjectInputStream(fis);
recentBoards = (LinkedList<Board>) ois.readObject();
recentBoardNameSet = new HashSet<String>();
ArrayList<Board> toDeleteBoards = new ArrayList<Board>();
for (Iterator<Board> iterator = recentBoards.iterator(); iterator.hasNext();) {
Board board = (Board) iterator.next();
if (recentBoardNameSet.contains(board.getEngName())) {
toDeleteBoards.add(board);
} else {
recentBoardNameSet.add(board.getEngName());
}
}
Log.d("aSMApplication.initPreferences", "loading from file");
fis.close();
for (Iterator<Board> iterator = toDeleteBoards.iterator(); iterator.hasNext();) {
Board board = (Board) iterator.next();
recentBoards.remove(board);
}
} catch (Exception e) {
e.printStackTrace();
}
}
if (isNightTheme()) {
THEME = R.style.Theme_Sherlock;
} else {
THEME = R.style.Theme_Sherlock_Light;
}
switch (defaultOrientation) {
case 0:
// http://developer.android.com/reference/android/R.attr.html#screenOrientation
ORIENTATION = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
break;
case 1:
ORIENTATION = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
break;
case 2:
ORIENTATION = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
break;
default:
break;
}
switch (defaultImageOrientation) {
case 0:
// http://developer.android.com/reference/android/R.attr.html#screenOrientation
IMAGE_ORIENTATION = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
break;
case 1:
IMAGE_ORIENTATION = ActivityInfo.SCREEN_ORIENTATION_SENSOR;
break;
default:
break;
}
}
public void updateAutoUserNameAndPassword(String username, String password) {
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);
SharedPreferences.Editor editor = settings.edit();
editor.putString(Preferences.USERNAME_KEY, username);
try {
password = SimpleCrypto.encrypt("comathenaasm", password);
} catch (Exception e) {
e.printStackTrace();
}
editor.putString(Preferences.PASSWORD_KEY, password);
editor.commit();
}
public void setRememberUser(boolean isRememberUser) {
this.m_isRememberUser = isRememberUser;
}
public boolean isRememberUser() {
return m_isRememberUser;
}
public void setAutoLogin(boolean isAutoLogin) {
this.m_isAutoLogin = isAutoLogin;
}
public boolean isAutoLogin() {
return m_isAutoLogin;
}
public void setCurrentUserID(String currentUserID) {
this.currentUserID = currentUserID;
}
public String getCurrentUserID() {
return currentUserID;
}
public void setDefaultTab(String defaultTab) {
this.defaultTab = defaultTab;
}
public String getDefaultTab() {
return defaultTab;
}
public void setDefaultBoardType(String defaultBoardType) {
this.defaultBoardType = defaultBoardType;
}
public String getDefaultBoardType() {
return defaultBoardType;
}
public void setAutoUserName(String autoUserName) {
this.m_autoUserName = autoUserName;
}
public String getAutoUserName() {
return m_autoUserName;
}
public void setAutoPassword(String autoPassword) {
this.m_autoPassword = autoPassword;
}
public String getAutoPassword() {
return m_autoPassword;
}
public void setGuidanceFontSize(int guidanceFontSize) {
this.guidanceFontSize = guidanceFontSize;
}
public int getGuidanceFontSize() {
return guidanceFontSize;
}
public void setGuidanceSecondFontSize(int guidanceFontSize) {
this.guidanceSecondFontSize = guidanceFontSize;
}
public int getGuidanceSecondFontSize() {
return guidanceSecondFontSize;
}
public void setSubjectFontSize(int subjectFontSize) {
this.subjectFontSize = subjectFontSize;
}
public int getSubjectFontSize() {
return subjectFontSize;
}
public void setPostFontSize(int postFontSize) {
this.postFontSize = postFontSize;
}
public int getPostFontSize() {
return postFontSize;
}
public ArrayList<String> getBlackList() {
return blackList;
}
public void addRecentBoard(Board board) {
if (recentBoards == null) {
recentBoards = new LinkedList<Board>();
}
if (recentBoardNameSet == null) {
recentBoardNameSet = new HashSet<String>();
}
if (recentBoardNameSet.contains(board.getEngName())) {
for (Iterator<Board> iterator = recentBoards.iterator(); iterator.hasNext();) {
Board board2 = (Board) iterator.next();
if (board2.getEngName().equals(board.getEngName())) {
recentBoards.remove(board2);
break;
}
}
}
recentBoards.addFirst(board);
recentBoardNameSet.add(board.getEngName());
if (recentBoards.size() > 10) {
recentBoards.removeLast();
}
}
public void setRecentBoards(LinkedList<Board> recentBoards) {
this.recentBoards = recentBoards;
}
public Queue<Board> getRecentBoards() {
if (recentBoards == null) {
recentBoards = new LinkedList<Board>();
}
return recentBoards;
}
public boolean isTouchScroll() {
return isTouchScroll;
}
public boolean isTouchSwipe() {
return isTouchSwipe;
}
public boolean isTouchSwipeBack() {
return isTouchSwipeBack;
}
public boolean isTouchHint() {
return isTouchHint;
}
public void setTouchScroll(boolean isTouchScroll) {
this.isTouchScroll = isTouchScroll;
}
public boolean isHidePinSubject() {
return isHidePinSubject;
}
public void setHidePinSubject(boolean isHidePinSubject) {
this.isHidePinSubject = isHidePinSubject;
}
public void switchHidePinSubject() {
this.isHidePinSubject = !this.isHidePinSubject;
}
public boolean isPromotionShow() {
return isPromotionShow;
}
public void setPromotionShow(boolean isPromotionShow) {
this.isPromotionShow = isPromotionShow;
}
public boolean isAutoOptimize() {
return isAutoOptimize;
}
public void setAutoOptimize(boolean isAutoOptimize) {
this.isAutoOptimize = isAutoOptimize;
}
public float getImageSizeThreshold() {
return imageSizeThreshold;
}
public void setImageSizeThreshold(float imageSizeThreshold) {
this.imageSizeThreshold = imageSizeThreshold;
}
public boolean isNightTheme() {
return isNightTheme;
}
public void setNightTheme(boolean isNightTheme) {
this.isNightTheme = isNightTheme;
}
public HomeViewModel getHomeViewModel() {
return m_homeViewModel;
}
public SubjectListViewModel getSubjectListViewModel() {
return m_subjectListViewModel;
}
public PostListViewModel getPostListViewModel() {
return m_postListViewModel;
}
public MailViewModel getMailViewModel() {
return m_mailViewModel;
}
public String getForwardEmailAddr() {
return forwardEmailAddr;
}
public void setForwardEmailAddr(String forwardEmailAddr) {
this.forwardEmailAddr = forwardEmailAddr;
}
public void updateForwardEmailAddr(String email) {
this.forwardEmailAddr = email;
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);
SharedPreferences.Editor editor = settings.edit();
editor.putString(Preferences.FORWARD_EMAIL, email);
editor.commit();
}
public String getPromotionContent() {
return promotionContent;
}
public void setPromotionContent(String promotionContent) {
this.promotionContent = promotionContent;
}
public boolean isShowCheck() {
return isShowCheck;
}
public void setShowCheck(boolean isShowCheck) {
this.isShowCheck = isShowCheck;
}
public boolean isWeiboStyle() {
return isWeiboStyle;
}
public void setWeiboStyle(boolean isWeiboStyle) {
this.isWeiboStyle = isWeiboStyle;
}
public boolean isShowIp() {
return isShowIp;
}
public void setShowIp(boolean isShowIp) {
this.isShowIp = isShowIp;
}
public String getCheckInterval() {
return checkInterval;
}
public void setCheckInterval(String checkInterval) {
this.checkInterval = checkInterval;
}
public boolean isUseVibrate() {
return isUseVibrate;
}
public void setUseVibrate(boolean isUseVibrate) {
this.isUseVibrate = isUseVibrate;
}
public boolean isLoadDefaultCategoryFile() {
return m_isLoadDefaultCategoryFile;
}
public void setLoadDefaultCategoryFile(boolean isLoadDefaultCategoryFile) {
this.m_isLoadDefaultCategoryFile = isLoadDefaultCategoryFile;
}
public int getDefaultOrientation() {
return defaultOrientation;
}
public void setDefaultOrientation(int defaultOrientation) {
this.defaultOrientation = defaultOrientation;
}
public int getDefaultImageOrientation() {
return defaultImageOrientation;
}
public void setDefaultImageOrientation(int defaultImageOrientation) {
this.defaultImageOrientation = defaultImageOrientation;
}
}