package tk.djcrazy.MyCC98.application;
import android.app.Application;
import android.content.Context;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.HttpClientStack;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.Volley;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.InstanceCreator;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.builder.ToStringBuilder;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.lang.reflect.Type;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;
import ch.boye.httpclientandroidlib.HttpVersion;
import ch.boye.httpclientandroidlib.auth.AuthScope;
import ch.boye.httpclientandroidlib.auth.UsernamePasswordCredentials;
import ch.boye.httpclientandroidlib.conn.scheme.PlainSocketFactory;
import ch.boye.httpclientandroidlib.conn.scheme.Scheme;
import ch.boye.httpclientandroidlib.conn.scheme.SchemeRegistry;
import ch.boye.httpclientandroidlib.conn.ssl.SSLSocketFactory;
import ch.boye.httpclientandroidlib.cookie.Cookie;
import ch.boye.httpclientandroidlib.impl.client.BasicCookieStore;
import ch.boye.httpclientandroidlib.impl.client.ContentEncodingHttpClient;
import ch.boye.httpclientandroidlib.impl.client.DefaultHttpClient;
import ch.boye.httpclientandroidlib.impl.conn.PoolingClientConnectionManager;
import ch.boye.httpclientandroidlib.impl.cookie.BasicClientCookie2;
import ch.boye.httpclientandroidlib.params.BasicHttpParams;
import ch.boye.httpclientandroidlib.params.CoreConnectionPNames;
import ch.boye.httpclientandroidlib.params.HttpParams;
import ch.boye.httpclientandroidlib.params.HttpProtocolParams;
import tk.djcrazy.MyCC98.util.BitmapLruCache;
import tk.djcrazy.libCC98.data.LoginType;
import tk.djcrazy.libCC98.data.UserData;
import tk.djcrazy.libCC98.exception.CC98Exception;
public class MyApplication extends Application {
public static final String USERS_STRING_INFO = "userStringData";
public static final String USER_AVATAR_PREFIX = "userAvatar.png";
private static Context mContext;
public RequestQueue mRequestQueue;
public ImageLoader mImageLoader;
public DefaultHttpClient mHttpClient;
private UsersInfo usersInfo;
private List<Bitmap> userAvatars = new ArrayList<Bitmap>();
private Gson mGson = new GsonBuilder().registerTypeAdapter(BasicClientCookie2.class, new InstanceCreator<BasicClientCookie2>() {
@Override
public BasicClientCookie2 createInstance(Type type) {
return new BasicClientCookie2("", "");
}
}).create();
public static Context getAppContext() {
return mContext;
}
@Override
public void onCreate() {
super.onCreate();
mHttpClient = genHttpClient();
initVolley();
initUsersInfo();
syncUserDataAndHttpClient();
mContext = getApplicationContext();
}
private void initVolley() {
HttpClientStack stack = new HttpClientStack(mHttpClient);
mRequestQueue = Volley.newRequestQueue(this, stack);
mRequestQueue.start();
mImageLoader = new ImageLoader(mRequestQueue, new BitmapLruCache());
}
/**
*
*/
private void initUsersInfo() {
try {
SharedPreferences preferences = getSharedPreferences(USERS_STRING_INFO, MODE_PRIVATE);
String data = preferences.getString(USERS_STRING_INFO, "{}");
usersInfo = mGson.fromJson(data, UsersInfo.class);
for (int i = 0; i < usersInfo.users.size(); i++) {
userAvatars.add(BitmapFactory.decodeStream(openFileInput(USER_AVATAR_PREFIX + i)));
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void storeUsersInfo() {
ObjectOutputStream oos = null;
try {
getSharedPreferences(USERS_STRING_INFO, MODE_PRIVATE).edit()
.putString(USERS_STRING_INFO, mGson.toJson(usersInfo)).commit();
for (int i = 0; i < userAvatars.size(); i++) {
userAvatars.get(i).compress(Bitmap.CompressFormat.PNG, 70,
openFileOutput(USER_AVATAR_PREFIX + i, MODE_PRIVATE));
}
} catch (IOException e) {
e.printStackTrace();
throw new Error(e);
} finally {
try {
if (oos != null) {
oos.flush();
oos.close();
}
} catch (IOException e) {
throw new Error(e);
}
}
}
@SuppressWarnings("deprecation")
private DefaultHttpClient genHttpClient() {
HttpParams params = new BasicHttpParams();
SchemeRegistry schReg = new SchemeRegistry();
schReg.register(new Scheme("http", 80, PlainSocketFactory
.getSocketFactory()));
schReg.register(new Scheme("https", 443, SSLSocketFactory.getSocketFactory()));
DefaultHttpClient client = new ContentEncodingHttpClient(new PoolingClientConnectionManager(schReg), params);
client.getParams().setParameter(
CoreConnectionPNames.CONNECTION_TIMEOUT, 30000);
client.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT,
30000);
return client;
}
public void syncUserDataAndHttpClient() {
try {
UserData data = getCurrentUserData();
BasicCookieStore cookieStore = new BasicCookieStore();
for (Cookie cookie : data.getCookies()) {
cookieStore.addCookie(cookie);
}
if (data.getLoginType() == LoginType.USER_DEFINED
&& (StringUtils.isNotBlank(data.getProxyUserName()))) {
addHttpBasicAuthorization(data.getProxyHost(), data.getProxyUserName(), data.getProxyPassword());
}
mHttpClient.setCookieStore(cookieStore);
} catch (NoCurrentUserException e) {
//do nothing here
}
}
public void syncUserDataAndHttpClient(UserData data) {
try {
BasicCookieStore cookieStore = new BasicCookieStore();
for (Cookie cookie : data.getCookies()) {
cookieStore.addCookie(cookie);
}
if (data.getLoginType() == LoginType.USER_DEFINED
&& (StringUtils.isNotBlank(data.getProxyUserName()))) {
addHttpBasicAuthorization(data.getProxyHost(), data.getProxyUserName(), data.getProxyPassword());
}
mHttpClient.setCookieStore(cookieStore);
} catch (NoCurrentUserException e) {
//do nothing here
}
}
public void addHttpBasicAuthorization(String host, String authName,
String authPassword) {
try {
URI uri = new URI(host);
mHttpClient.getCredentialsProvider().setCredentials(
new AuthScope(uri.getHost(), uri.getPort(),
AuthScope.ANY_SCHEME),
new UsernamePasswordCredentials(authName, authPassword));
} catch (URISyntaxException e) {
throw new CC98Exception("Invalid Uri problem");
}
}
/**
* @return the userData
*/
public UserData getCurrentUserData() throws NoCurrentUserException {
return usersInfo.getCurrentUserData();
}
public List<UserData> getAllUserDatas() {
return usersInfo.users;
}
public void addNewUser(UserData userData, Bitmap avatar, boolean isCurrentUser) {
if (!usersInfo.users.contains(userData)) {
usersInfo.users.add(userData);
userAvatars.add(avatar);
} else {
usersInfo.users.set(usersInfo.users.indexOf(userData), userData);
userAvatars.set(usersInfo.users.indexOf(userData), avatar);
}
if (isCurrentUser) {
usersInfo.currentUserIndex = usersInfo.users.indexOf(userData);
}
storeUsersInfo();
}
/**
* @return the userAvatar
*/
public Bitmap getCurrentUserAvatar() {
if (usersInfo.users.size() > 0) {
return userAvatars.get(usersInfo.currentUserIndex);
} else {
throw new IllegalArgumentException("No user in current");
}
}
public UsersInfo getUsersInfo() {
return usersInfo;
}
public List<Bitmap> getUserAvatars() {
return userAvatars;
}
public static class UsersInfo implements Serializable {
private static final long serialVersionUID = 1161679319055452529L;
public int currentUserIndex;
public ArrayList<UserData> users = new ArrayList<UserData>();
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this);
}
public UserData getCurrentUserData() throws NoCurrentUserException {
if (users.size() > 0) {
return users.get(currentUserIndex);
} else {
throw new NoCurrentUserException("No user in current!");
}
}
}
public static class NoCurrentUserException extends RuntimeException {
public NoCurrentUserException() {
super();
}
public NoCurrentUserException(String msg) {
super(msg);
}
}
}