package net.dev123.yibo;
import java.io.File;
import java.util.List;
import java.util.Locale;
import net.dev123.commons.http.HttpRequestHelper;
import net.dev123.commons.util.StringUtil;
import net.dev123.commons.util.TimeSpanUtil;
import net.dev123.yibo.common.CompatibilityUtil;
import net.dev123.yibo.common.Constants;
import net.dev123.yibo.common.EmotionLoader;
import net.dev123.yibo.common.GlobalResource;
import net.dev123.yibo.common.GlobalVars;
import net.dev123.yibo.common.ImageQuality;
import net.dev123.yibo.common.NetType;
import net.dev123.yibo.common.NetUtil;
import net.dev123.yibo.common.NetUtil.NetworkOperator;
import net.dev123.yibo.db.LocalAccount;
import android.app.AlarmManager;
import android.app.Application;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Environment;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Display;
import android.view.WindowManager;
import com.mobclick.android.MobclickAgent;
public class YiBoApplication extends Application {
private static final String TAG = YiBoApplication.class.getSimpleName();
private static String innerCachePath; //手机内部存储缓存(由于手机内部存储有限,考虑废弃)
private static String sdcardCachePath; //sdcard外部存储缓存;
private static int smallAvatarSize;
private static int normalAvatarSize;
private static int displayWidth;
private static int displayHeight;
private static int densityDpi;
private static float density;
private SharedPreferences prefs = null;
private LocalAccount currentAccount = null;
public static int getDisplayWidth() {
return displayWidth;
}
public static int getDisplayHeight() {
return displayHeight;
}
public static int getDensityDpi() {
return densityDpi;
}
public static float getDensity() {
return density;
}
public static String getSdcardCachePath() {
return sdcardCachePath;
}
public static String getInnerCachePath() {
return innerCachePath;
}
public static int getSmallAvatarSize() {
return smallAvatarSize;
}
public static int getNormalAvatarSize() {
return normalAvatarSize;
}
public static Locale changeLocale(Context context) {
Locale locale = Locale.getDefault();
if (context == null) {
return locale;
}
SharedPreferences prefs = context.getSharedPreferences(
Constants.PREFS_NAME_APP_SETTING, MODE_PRIVATE);
String value = prefs.getString(Constants.PREFS_KEY_LOCALE, "auto");
if (!value.equals("auto")) {
String[] values = value.split("_");
if (values.length == 2) {
locale = new Locale(values[0], values[1]);
} else {
locale = new Locale(values[0]);
}
}
Configuration config = new Configuration();
Resources res = context.getResources();
DisplayMetrics dm = res.getDisplayMetrics();
config.locale = locale;
res.updateConfiguration(config, dm);
return locale;
}
public int getFontSize() {
return Integer.parseInt(prefs.getString(Constants.PREFS_KEY_FONT_SIZE, "17"));
}
/**
* @return 是否在列表中显示用户头像
*/
public boolean isShowHead() {
return prefs.getBoolean(Constants.PREFS_KEY_SHOW_HEAD, true);
}
/**
* @return 是否在列表中显示图片缩略图
*/
public boolean isShowThumbnail() {
String policy = prefs.getString(Constants.PREFS_KEY_SHOW_THUMBNAIL, "2");
return NetUtil.isPolicyPositive(Integer.parseInt(policy));
}
public int getUpdateCount() {
String updateCount = prefs.getString(Constants.PREFS_KEY_UPDATE_COUNT, "" + Constants.PAGING_DEFAULT_COUNT);
return Integer.valueOf(updateCount);
}
/**
* @return 自动更新间隔
*/
public int getUpdateInterval() {
return Integer.valueOf(
prefs.getString(
Constants.PREFS_KEY_UPDATE_INTERVAL,
String.valueOf(Constants.DEFAULT_UPDATE_INTERVAL)
)
);
}
public boolean isAutoLoadMore() {
return prefs.getBoolean(Constants.PREFS_KEY_AUTO_LOAD_MORE, true);
}
/**
* @return 是否自动标注地理位置
*/
public boolean isAutoLocate() {
return prefs.getBoolean(Constants.PREFS_KEY_AUTO_LOCATE, false);
}
/**
* @return 是否允许在首次进入帐号时刷新
*/
public boolean isRefreshOnFirstEnter() {
return prefs.getBoolean(Constants.PREFS_KEY_REFRESH_ON_FIRST_ENTER, true);
}
/**
* @return 是否允许晃动刷新
*/
public boolean isRefreshOnShake() {
return prefs.getBoolean(Constants.PREFS_KEY_REFRESH_ON_SHAKE, false);
}
/**
* @return 是否启用手势操作
*/
public boolean isGestureEnabled() {
return prefs.getBoolean(Constants.PREFS_KEY_ENABLE_GESTURE, true);
}
/**
* @return 是否默认同步到所有帐号
*/
public boolean isSyncToAllAsDefault() {
return prefs.getBoolean(Constants.PREFS_KEY_SYNC_TO_ALL, false);
}
/**
* @return 是否启用列表滑块
*/
public boolean isSliderEnabled() {
return prefs.getBoolean(Constants.PREFS_KEY_USE_SLIDER, false);
}
/**
* @return 是否自动旋转屏幕
*/
public boolean isAutoScreenOrientation() {
return prefs.getBoolean(Constants.PREFS_KEY_AUTO_SCREEN_ORIENTATION, true);
}
/**
* @return 是否返回时退出
*/
public boolean isKeyBackExit(){
return prefs.getBoolean(Constants.PREFS_KEY_EXIT_ON_BACK, false);
}
/**
* @return 是否启用自动更新
*/
public boolean isUpdatesEnabled() {
return prefs.getBoolean(Constants.PREFS_KEY_ENABLE_UPDATES, true);
}
/**
* @return 是否震动提醒
*/
public boolean isVibrateNotification() {
return prefs.getBoolean(Constants.PREFS_KEY_VIBRATE, true);
}
/**
* @return 是否铃声提醒
*/
public boolean isRingtoneNotification() {
return prefs.getBoolean(Constants.PREFS_KEY_RINGTONE, true);
}
/**
* @return 是否闪烁LED灯提醒
*/
public boolean isFlashingLEDNotification() {
return prefs.getBoolean(Constants.PREFS_KEY_LED, true);
}
/**
* @return 是否检查微博更新
*/
public boolean isCheckStatuses() {
return isUpdatesEnabled() && prefs.getBoolean(Constants.PREFS_KEY_CHECK_STATUSES, true);
}
/**
* @return 是否检查“提到我的”更新
*/
public boolean isCheckMentions() {
return isUpdatesEnabled() && prefs.getBoolean(Constants.PREFS_KEY_CHECK_MENTIONS, true);
}
/**
* @return 是否检查评论更新
*/
public boolean isCheckComments() {
return isUpdatesEnabled() && prefs.getBoolean(Constants.PREFS_KEY_CHECK_COMMENTS, true);
}
/**
* @return 是否检查私信更新
*/
public boolean isCheckDirectMesages() {
return isUpdatesEnabled() && prefs.getBoolean(Constants.PREFS_KEY_CHECK_MESSAGES, true);
}
/**
* @return 是否检查关注者更新
*/
public boolean isCheckFollowers() {
return isUpdatesEnabled() && prefs.getBoolean(Constants.PREFS_KEY_CHECK_FOLLOWERS, true);
}
/**
* @return 是否显示提醒栏图标
*/
public boolean isShowStatusIcon() {
return prefs.getBoolean(Constants.PREFS_KEY_SHOW_STATUS_ICON, true);
}
/**
* @return 自定义的提醒铃声
*/
public String getRingtoneUri() {
return prefs.getString(Constants.PREFS_KEY_RINGTONE_URI, null);
}
/**
* @return 自定义的图片存储位置
*/
public String getImageFolder() {
return prefs.getString(Constants.PREFS_KEY_IMAGE_FOLDER, Constants.DCIM_PATH);
}
/**
* @return 上传图片质量
*/
public ImageQuality getImageUploadQuality() {
String qualityString = prefs.getString(Constants.PREFS_KEY_IMAGE_UPLOAD_QUALITY, ImageQuality.Middle.toString());
return ImageQuality.valueOf(qualityString);
}
public ImageQuality getImageDownloadQuality() {
String qualityString = prefs.getString(Constants.PREFS_KEY_IMAGE_DOWNLOAD_QUALITY, ImageQuality.Middle.toString());
return ImageQuality.valueOf(qualityString);
}
//获取缓存策略,默认为缓存5天内的数据
public int getCacheStrategy() {
return Integer.valueOf(prefs.getString(Constants.PREFS_KEY_CACHE_STRATEGY, "5"));
}
public boolean isCheckNewVersionOnStartup() {
return prefs.getBoolean(Constants.PREFS_KEY_VERSION_CHECK_ON_STARTUP, true);
}
public boolean isDetectImageInfo() {
return prefs.getBoolean(Constants.PREFS_KEY_DETECT_IMAGE_INFO, true);
}
public boolean isAutoLoadComments() {
String policy = "2";
try {
policy = prefs.getString(Constants.PREFS_KEY_AUTO_LOAD_COMMENTS, "2");
} catch (Exception e) {
Editor editor = prefs.edit();
editor.putString(Constants.PREFS_KEY_AUTO_LOAD_COMMENTS, "2");
editor.commit();
}
if (!StringUtil.isNumeric(policy)) {
policy = "2";
}
return NetUtil.isPolicyPositive(Integer.parseInt(policy));
}
/**
* 获取当前帐号
*
* @return 当前帐号
*/
public LocalAccount getCurrentAccount() {
if (Constants.DEBUG) {
Log.d(TAG, "Get Current Account : " + currentAccount);
}
return currentAccount;
}
/**
* 设置当前帐号
*
* @param currentAccount 当前帐号
*/
public void setCurrentAccount(LocalAccount currentAccount) {
if (Constants.DEBUG) {
Log.d(TAG, "Set Current Account : " + currentAccount);
}
this.currentAccount = currentAccount;
}
private AlarmManager alarmManager;
private static final String CONNECTIONS_EVICT_ACTION = "net.dev123.yibo.CONNECTIONS_EVICT";
@Override
public void onCreate() {
prefs = getSharedPreferences(Constants.PREFS_NAME_APP_SETTING, MODE_PRIVATE);
NetUtil.updateNetworkConfig(this);
this.registerReceiver(globalReceiver, new IntentFilter(CONNECTIONS_EVICT_ACTION));
Intent updateIntent = new Intent(CONNECTIONS_EVICT_ACTION);
PendingIntent pi = PendingIntent.getBroadcast(this, 0, updateIntent, 0);
alarmManager = (AlarmManager)this.getSystemService(ALARM_SERVICE);
alarmManager.setRepeating(
AlarmManager.RTC, System.currentTimeMillis() + 1000,
Constants.CONNECTION_EVICT_INTERVAL, pi
);
//m9时,设置成返回退出
if (!prefs.contains(Constants.PREFS_KEY_EXIT_ON_BACK)) {
String model = CompatibilityUtil.getModel();
if (StringUtil.isNotEmpty(model)
&& model.toLowerCase().indexOf("m9") > -1) {
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean(Constants.PREFS_KEY_EXIT_ON_BACK, true);
editor.commit();
}
}
initAvatarSize();
initLocalization(this);
initGlobalVars();
initCurrentAccount();
initCachePath();
// 初始化表情
EmotionLoader.init(this);
super.onCreate();
}
private void initGlobalVars() {
if (Constants.DEBUG) {
Log.d(TAG, "initGlobalVars Start : " + System.currentTimeMillis() / 1000);
}
GlobalVars.LOCALE = changeLocale(this);
GlobalVars.NET_OPERATOR = NetUtil.getNetworkOperator(this);
GlobalVars.NET_TYPE = NetUtil.getCurrentNetType(this);
GlobalVars.IS_SHOW_HEAD = isShowHead();
GlobalVars.IS_SHOW_THUMBNAIL = isShowThumbnail();
GlobalVars.UPDATE_COUNT = getUpdateCount();
GlobalVars.IMAGE_DOWNLOAD_QUALITY = getImageDownloadQuality();
GlobalVars.IS_ENABLE_GESTURE = isGestureEnabled();
GlobalVars.FONT_SIZE_HOME_BLOG = getFontSize();
GlobalVars.FONT_SIZE_HOME_RETWEET = getFontSize();
GlobalVars.IS_DETECT_IAMGE_INFO = isDetectImageInfo();
GlobalVars.IS_AUTO_LOAD_COMMENTS = isAutoLoadComments();
GlobalVars.reloadAccounts(this);
if (GlobalVars.NET_TYPE == NetType.WIFI) {
GlobalVars.NET_OPERATOR = NetworkOperator.UNKOWN;
}
String isObeySinaAgreement = MobclickAgent.getConfigParams(this, "IS_OBEY_SINA_AGREEMENT");
String isMobileNetUpdateVersion = MobclickAgent.getConfigParams(this, "IS_MOBILE_NET_UPDATE_VERSION");
GlobalVars.IS_OBEY_SINA_AGREEMENT = Boolean.parseBoolean(isObeySinaAgreement);
GlobalVars.IS_MOBILE_NET_UPDATE_VERSION = Boolean.parseBoolean(isMobileNetUpdateVersion);
if (Constants.DEBUG) Log.d(TAG, "IS_OBEY_SINA_AGREEMENT=" + isObeySinaAgreement);
if (Constants.DEBUG) {
Log.d(TAG, "initGlobalVars Finish : " + System.currentTimeMillis() / 1000);
}
}
private void initCurrentAccount() {
List<LocalAccount> accounts = GlobalVars.getAccountList(this, false);
for (LocalAccount account : accounts) {
if (account.isDefault()) {
currentAccount = account;
}
}
if (currentAccount == null && accounts.size() > 0) {
currentAccount = accounts.get(0);
}
}
public static void initLocalization(Context context) {
if (context == null) {
return;
}
//时间表示;
TimeSpanUtil.timeFormatWithinSeconds = " " + context.getString(R.string.label_time_format_within_seconds);
TimeSpanUtil.timeFormatHalfMinuteAgo = " " + context.getString(R.string.label_time_format_half_minute_ago);
TimeSpanUtil.timeFormatWithinOneMinute = " " + context.getString(R.string.label_time_format_within_one_minute);
TimeSpanUtil.timeFormatOneMinuteAgo = " " + context.getString(R.string.label_time_format_one_minute_ago);
TimeSpanUtil.timeFormatMinutesAgo = " " + context.getString(R.string.label_time_format_minutes_ago);
TimeSpanUtil.timeFormatToday = " " + context.getString(R.string.label_time_format_today);
TimeSpanUtil.timeFormatOneHourAgo = " " + context.getString(R.string.label_time_format_one_hour_ago);
TimeSpanUtil.timeFormatHoursAgo = " " + context.getString(R.string.label_time_format_hours_ago);
TimeSpanUtil.timeFormatOneDayAgo = " " + context.getString(R.string.label_time_format_one_day_ago);
TimeSpanUtil.timeFormatDaysAgo = " " + context.getString(R.string.label_time_format_days_ago);
TimeSpanUtil.timeFormatWeeksAgo = " " + context.getString(R.string.label_time_format_weeks_ago);
GlobalResource.clearResource();
}
private void initAvatarSize() {
if (Constants.DEBUG) {
Log.d(TAG, "initAvatarSize Start : " + System.currentTimeMillis() / 1000);
}
WindowManager windowManager = (WindowManager)getSystemService(Context.WINDOW_SERVICE);
Display display = windowManager.getDefaultDisplay();
displayWidth = display.getWidth();
displayHeight = display.getHeight();
//使用display.getOrientation() 判断横竖屏不准确
if (displayWidth > displayHeight) {
displayWidth = display.getHeight();
displayHeight = display.getWidth();
}
DisplayMetrics metrics = new DisplayMetrics();
display.getMetrics(metrics);
density = metrics.density;
densityDpi = metrics.densityDpi;
if (densityDpi <= DisplayMetrics.DENSITY_LOW) {
smallAvatarSize = Constants.IMAGE_HEAD_MINI_SIZE_LDPI;
normalAvatarSize = Constants.IMAGE_HEAD_NORMAL_SIZE_LDPI;
} else if (densityDpi <= DisplayMetrics.DENSITY_MEDIUM) {
smallAvatarSize = Constants.IMAGE_HEAD_MINI_SIZE_MDPI;
normalAvatarSize = Constants.IMAGE_HEAD_NORMAL_SIZE_MDPI;
} else if (densityDpi <= DisplayMetrics.DENSITY_HIGH
&& displayWidth <= Constants.DISPLAY_HDPI_WIDTH) {
smallAvatarSize = Constants.IMAGE_HEAD_MINI_SIZE_HDPI;
normalAvatarSize = Constants.IMAGE_HEAD_NORMAL_SIZE_HDPI;
} else {
smallAvatarSize = Constants.IMAGE_HEAD_MINI_SIZE_XHDPI;
normalAvatarSize = Constants.IMAGE_HEAD_NORMAL_SIZE_XHDPI;
}
if (Constants.DEBUG) {
Log.v("Display Width: ", " " + displayWidth);
Log.v("Display Height: ", " " + displayHeight);
Log.v("Display Density: ", " " + densityDpi);
Log.d(TAG, "initAvatarSize Finish : " + System.currentTimeMillis() / 1000);
}
}
private void initCachePath() {
innerCachePath = getCacheDir().getAbsolutePath();
String oldSdcardCachePath = null;
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
File sdcardPath = Environment.getExternalStorageDirectory();
oldSdcardCachePath = sdcardPath.getAbsolutePath() + File.separator + "yibo";
sdcardCachePath = sdcardPath.getAbsolutePath() + File.separator + ".yibo";
} else {
File sdcardPath = getFilesDir();
oldSdcardCachePath = sdcardPath.getAbsolutePath() + File.separator + "yibo";
sdcardCachePath = sdcardPath.getAbsolutePath() + File.separator + ".yibo";
}
File newYiBoFile = new File(sdcardCachePath);
File oldYiBoFile = new File(oldSdcardCachePath);
if (oldYiBoFile.exists() && !newYiBoFile.exists()) {
oldYiBoFile.renameTo(newYiBoFile);
}
if (oldYiBoFile.exists()) {
oldYiBoFile.delete();
}
}
@Override
public void onTerminate() {
HttpRequestHelper.shutdown();
Intent updateIntent = new Intent(CONNECTIONS_EVICT_ACTION);
PendingIntent pi = PendingIntent.getBroadcast(this, 0, updateIntent, 0);
if (alarmManager != null) {
alarmManager.cancel(pi);
}
super.onTerminate();
}
private BroadcastReceiver globalReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
HttpRequestHelper.evictConnections();
if (Constants.DEBUG) {
Log.v("globalReceiver", "connection evict!");
}
}
};
}