package org.qii.weiciyuan.support.utils;
import com.crashlytics.android.Crashlytics;
import org.qii.weiciyuan.R;
import org.qii.weiciyuan.bean.AccountBean;
import org.qii.weiciyuan.bean.GroupListBean;
import org.qii.weiciyuan.bean.UserBean;
import org.qii.weiciyuan.bean.android.MusicInfo;
import org.qii.weiciyuan.othercomponent.AppActivityLifecycleCallbacks;
import org.qii.weiciyuan.support.crashmanager.CrashManager;
import org.qii.weiciyuan.support.crashmanager.CrashManagerConstants;
import org.qii.weiciyuan.support.database.AccountDBTask;
import org.qii.weiciyuan.support.database.GroupDBTask;
import org.qii.weiciyuan.support.settinghelper.SettingUtility;
import org.qii.weiciyuan.support.smileypicker.SmileyMap;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.Application;
import android.content.Context;
import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Handler;
import android.text.TextUtils;
import android.util.DisplayMetrics;
import android.util.LruCache;
import android.view.Display;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* User: Jiang Qi
* Date: 12-7-27
*/
public final class GlobalContext extends Application {
//singleton
private static GlobalContext globalContext = null;
//image size
private Activity activity = null;
private Activity currentRunningActivity = null;
private DisplayMetrics displayMetrics = null;
private Handler handler = new Handler();
//image memory cache
private LruCache<String, Bitmap> appBitmapCache = null;
//current account info
private AccountBean accountBean = null;
private GroupListBean group = null;
private LinkedHashMap<Integer, LinkedHashMap<String, Bitmap>> emotionsPic
= new LinkedHashMap<Integer, LinkedHashMap<String, Bitmap>>();
private MusicInfo musicInfo = new MusicInfo();
public boolean tokenExpiredDialogIsShowing = false;
@Override
public void onCreate() {
super.onCreate();
globalContext = this;
buildCache();
CrashManagerConstants.loadFromContext(this);
CrashManager.registerHandler();
if (Utility.isCertificateFingerprintCorrect(this)) {
Crashlytics.start(this);
}
registerActivityLifecycleCallbacks(new AppActivityLifecycleCallbacks());
}
public static GlobalContext getInstance() {
return globalContext;
}
public Handler getUIHandler() {
return handler;
}
public GroupListBean getGroup() {
if (group == null) {
group = GroupDBTask.get(GlobalContext.getInstance().getCurrentAccountId());
}
return group;
}
public void setGroup(GroupListBean group) {
this.group = group;
}
public DisplayMetrics getDisplayMetrics() {
if (displayMetrics != null) {
return displayMetrics;
} else {
Activity a = getActivity();
if (a != null) {
Display display = getActivity().getWindowManager().getDefaultDisplay();
DisplayMetrics metrics = new DisplayMetrics();
display.getMetrics(metrics);
this.displayMetrics = metrics;
return metrics;
} else {
//default screen is 800x480
DisplayMetrics metrics = new DisplayMetrics();
metrics.widthPixels = 480;
metrics.heightPixels = 800;
return metrics;
}
}
}
public void setAccountBean(final AccountBean accountBean) {
this.accountBean = accountBean;
}
public void updateUserInfo(final UserBean userBean) {
this.accountBean.setInfo(userBean);
handler.post(new Runnable() {
@Override
public void run() {
for (MyProfileInfoChangeListener listener : profileListenerSet) {
listener.onChange(userBean);
}
}
});
}
public AccountBean getAccountBean() {
if (accountBean == null) {
String id = SettingUtility.getDefaultAccountId();
if (!TextUtils.isEmpty(id)) {
accountBean = AccountDBTask.getAccount(id);
} else {
List<AccountBean> accountList = AccountDBTask.getAccountList();
if (accountList != null && accountList.size() > 0) {
accountBean = accountList.get(0);
}
}
}
return accountBean;
}
private Set<MyProfileInfoChangeListener> profileListenerSet
= new HashSet<MyProfileInfoChangeListener>();
public void registerForAccountChangeListener(MyProfileInfoChangeListener listener) {
if (listener != null) {
profileListenerSet.add(listener);
}
}
public void unRegisterForAccountChangeListener(MyProfileInfoChangeListener listener) {
profileListenerSet.remove(listener);
}
public static interface MyProfileInfoChangeListener {
public void onChange(UserBean newUserBean);
}
public String getCurrentAccountId() {
return getAccountBean().getUid();
}
public String getCurrentAccountName() {
return getAccountBean().getUsernick();
}
public synchronized LruCache<String, Bitmap> getBitmapCache() {
if (appBitmapCache == null) {
buildCache();
}
return appBitmapCache;
}
public String getSpecialToken() {
if (getAccountBean() != null) {
return getAccountBean().getAccess_token();
} else {
return "";
}
}
public Activity getActivity() {
return activity;
}
public void setActivity(Activity activity) {
this.activity = activity;
}
public Activity getCurrentRunningActivity() {
return currentRunningActivity;
}
public void setCurrentRunningActivity(Activity currentRunningActivity) {
this.currentRunningActivity = currentRunningActivity;
}
private void buildCache() {
int memClass = ((ActivityManager) getSystemService(
Context.ACTIVITY_SERVICE)).getMemoryClass();
int cacheSize = Math.max(1024 * 1024 * 8, 1024 * 1024 * memClass / 5);
appBitmapCache = new LruCache<String, Bitmap>(cacheSize) {
@Override
protected int sizeOf(String key, Bitmap bitmap) {
return bitmap.getByteCount();
}
};
}
public synchronized Map<String, Bitmap> getEmotionsPics() {
if (emotionsPic != null && emotionsPic.size() > 0) {
return emotionsPic.get(SmileyMap.GENERAL_EMOTION_POSITION);
} else {
getEmotionsTask();
return emotionsPic.get(SmileyMap.GENERAL_EMOTION_POSITION);
}
}
public synchronized Map<String, Bitmap> getHuahuaPics() {
if (emotionsPic != null && emotionsPic.size() > 0) {
return emotionsPic.get(SmileyMap.HUAHUA_EMOTION_POSITION);
} else {
getEmotionsTask();
return emotionsPic.get(SmileyMap.HUAHUA_EMOTION_POSITION);
}
}
private void getEmotionsTask() {
Map<String, String> general = SmileyMap.getInstance().getGeneral();
emotionsPic.put(SmileyMap.GENERAL_EMOTION_POSITION, getEmotionsTask(general));
Map<String, String> huahua = SmileyMap.getInstance().getHuahua();
emotionsPic.put(SmileyMap.HUAHUA_EMOTION_POSITION, getEmotionsTask(huahua));
}
private LinkedHashMap<String, Bitmap> getEmotionsTask(Map<String, String> emotionMap) {
List<String> index = new ArrayList<String>();
index.addAll(emotionMap.keySet());
LinkedHashMap<String, Bitmap> bitmapMap = new LinkedHashMap<String, Bitmap>();
for (String str : index) {
String name = emotionMap.get(str);
AssetManager assetManager = GlobalContext.getInstance().getAssets();
InputStream inputStream;
try {
inputStream = assetManager.open(name);
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
if (bitmap != null) {
Bitmap scaledBitmap = Bitmap.createScaledBitmap(bitmap,
Utility.dip2px(getResources().getInteger(R.integer.emotion_size)),
Utility.dip2px(getResources().getInteger(R.integer.emotion_size)),
true);
if (bitmap != scaledBitmap) {
bitmap.recycle();
bitmap = scaledBitmap;
}
bitmapMap.put(str, bitmap);
}
} catch (IOException ignored) {
}
}
return bitmapMap;
}
public void updateMusicInfo(MusicInfo musicInfo) {
this.musicInfo = musicInfo;
}
public MusicInfo getMusicInfo() {
return musicInfo;
}
public boolean checkUserIsLogin() {
return getInstance().getAccountBean() != null;
}
}