package com.mcxiaoke.minicat;
import android.app.Activity;
import android.app.Application;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.util.Log;
import com.mcxiaoke.minicat.api.Api;
import com.mcxiaoke.minicat.api.ApiFactory;
import com.mcxiaoke.minicat.config.AccountInfo;
import com.mcxiaoke.minicat.config.AccountStore;
import com.mcxiaoke.minicat.controller.UIController;
import com.mcxiaoke.minicat.dao.model.UserModel;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import com.nostra13.universalimageloader.core.assist.QueueProcessingType;
import com.umeng.analytics.MobclickAgent;
import org.oauthsimple.model.OAuthToken;
import java.lang.ref.WeakReference;
import java.util.HashMap;
import static com.mcxiaoke.minicat.util.DateTimeHelper.FANFOU_DATE_FORMAT;
import static java.util.TimeZone.getTimeZone;
/**
* @author mcxiaoke
* @version 7.5 2012.02.27
*/
public class AppContext extends Application {
public final static boolean DEBUG = BuildConfig.DEBUG;
private static final String TAG = "Application";
public static int versionCode;
public static String versionName;
public static String packageName;
public static PackageInfo info;
public static boolean active;
public static boolean homeVisible;
private static HashMap<String, WeakReference<Activity>> contexts = new HashMap<String, WeakReference<Activity>>();
private static AccountInfo accountInfo;
private static Api api;
private static AppContext instance;
public static void doLogin(Context context) {
if (DEBUG) {
Log.v(TAG, "doLogin()");
}
AppContext.clearAccountInfo(context);
UIController.showLogin(context);
}
public static void clearAccountInfo(Context context) {
accountInfo.clear();
api.setAccessToken(null);
api.setAccount(null);
AccountStore store = new AccountStore(context);
store.clear();
if (DEBUG) {
Log.v(TAG, "clearAccountInfo()");
}
}
public static void updateLoginInfo(Context context, String loginName,
String loginPassword) {
accountInfo.setLoginInfo(loginName, loginPassword);
AccountStore store = new AccountStore(context);
store.saveLoginInfo(loginName, loginPassword);
if (DEBUG) {
Log.v("App", "loginPassword loginName: " + loginName);
Log.v("App", "loginPassword loginPassword: " + loginPassword);
}
}
public static void updateUserInfo(Context context, final UserModel u) {
String account = u.getId();
String screenName = u.getScreenName();
String profileImage = u.getProfileImageUrlLarge();
accountInfo.setAccount(account);
accountInfo.setScreenName(screenName);
accountInfo.setProfileImage(profileImage);
api.setAccount(account);
AccountStore store = new AccountStore(context);
store.saveUserInfo(account, screenName, profileImage);
if (DEBUG) {
Log.v("App", "updateUserInfo UserModel: " + u);
Log.v("App", "updateUserInfo accountInfo: " + accountInfo);
}
}
public static void updateAccessToken(Context context, OAuthToken token) {
accountInfo.setAccessToken(token);
api.setAccessToken(token);
AccountStore store = new AccountStore(context);
store.saveAccessToken(token);
if (DEBUG) {
Log.v("App", "updateAccessToken AccessToken: " + token);
Log.v("App", "updateAccessToken accountInfo: " + accountInfo);
}
}
public static String getAccount() {
return accountInfo.getAccount();
}
public static AccountInfo getAccountInfo() {
return accountInfo;
}
public static String getScreenName() {
return accountInfo.getScreenName();
}
public static Api getApi() {
return api;
}
public static AppContext getApp() {
return instance;
}
public static boolean isVerified() {
return accountInfo != null && accountInfo.isVerified();
}
public static synchronized void setActiveContext(Activity context) {
WeakReference<Activity> reference = new WeakReference<Activity>(context);
contexts.put(context.getClass().getSimpleName(), reference);
}
public static synchronized Activity getActiveContext(String className) {
WeakReference<Activity> reference = contexts.get(className);
if (reference == null) {
return null;
}
final Activity context = reference.get();
if (context == null) {
contexts.remove(className);
}
return context;
}
public AppContext getInstance() {
return instance;
}
@Override
public void onCreate() {
super.onCreate();
initAppInfo();
initialize();
initAccountInfo();
}
private void initialize() {
instance = this;
MobclickAgent.setDebugMode(DEBUG);
ImageLoader.getInstance().init(getDefaultImageLoaderConfiguration());
FANFOU_DATE_FORMAT.setTimeZone(
getTimeZone("GMT"));
}
private void initAccountInfo() {
AccountStore store = new AccountStore(this);
accountInfo = store.read();
api = ApiFactory.getDefaultApi();
if (accountInfo.isVerified()) {
api.setAccessToken(accountInfo.getAccessToken());
api.setAccount(accountInfo.getAccount());
}
if (DEBUG) {
Log.v(TAG, "initAccountInfo() accountInfo: " + accountInfo);
}
}
private void initAppInfo() {
PackageManager pm = getPackageManager();
try {
PackageInfo packageInfo = pm.getPackageInfo(getPackageName(), 0);
packageName = packageInfo.packageName;
versionCode = packageInfo.versionCode;
versionName = packageInfo.versionName;
Bundle bundle = pm.getApplicationInfo(packageName, PackageManager.GET_META_DATA).metaData;
if (DEBUG) {
Log.v(TAG, "initAppInfo() versionCode: " + versionCode
+ " versionName: " + versionName);
}
} catch (NameNotFoundException e) {
throw new RuntimeException(e);
}
}
private DisplayImageOptions getDefaultDisplayImageOptions() {
DisplayImageOptions.Builder builder = new DisplayImageOptions.Builder();
builder.cacheInMemory(true).cacheOnDisc(true);
builder.bitmapConfig(Bitmap.Config.RGB_565);
builder.showImageForEmptyUri(R.drawable.ic_head);
builder.showImageOnFail(R.drawable.ic_head);
builder.showImageOnLoading(R.drawable.ic_head);
builder.imageScaleType(ImageScaleType.IN_SAMPLE_INT);
return builder.build();
}
private ImageLoaderConfiguration getDefaultImageLoaderConfiguration() {
ImageLoaderConfiguration.Builder builder = new ImageLoaderConfiguration.Builder(
this);
builder.defaultDisplayImageOptions(getDefaultDisplayImageOptions());
builder.denyCacheImageMultipleSizesInMemory();
builder.discCacheSize(100 * 1024 * 1024);
builder.memoryCacheSizePercentage(25);
builder.tasksProcessingOrder(QueueProcessingType.FIFO);
return builder.build();
}
}