package com.metis.base.manager; import android.content.Context; import android.content.SharedPreferences; import android.os.Bundle; import android.os.Parcelable; import android.util.Patterns; import android.widget.Toast; import com.google.gson.JsonObject; import com.google.gson.reflect.TypeToken; import com.metis.base.ActivityDispatcher; import com.metis.base.framework.NetProxy; import com.metis.base.module.User; import com.metis.base.utils.Log; import com.metis.msnetworklib.contract.OptionSettings; import com.metis.msnetworklib.contract.ReturnInfo; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.StreamCorruptedException; import java.io.UnsupportedEncodingException; import java.lang.reflect.Field; import java.net.URLEncoder; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import cn.sharesdk.framework.Platform; import cn.sharesdk.framework.PlatformActionListener; import cn.sharesdk.framework.ShareSDK; import cn.sharesdk.sina.weibo.SinaWeibo; import cn.sharesdk.tencent.qq.QQ; import cn.sharesdk.wechat.friends.Wechat; import cn.smssdk.EventHandler; import cn.smssdk.SMSSDK; /** * Created by Beak on 2015/7/24. */ public class AccountManager extends AbsManager { private static final String TAG = AccountManager.class.getSimpleName(); private static AccountManager sManager = null; public synchronized static AccountManager getInstance (Context context) { if (sManager == null) { sManager = new AccountManager(context.getApplicationContext()); } return sManager; } public static final int AUTH_TYPE_WE_CHAT = 1, AUTH_TYPE_SINA = 2, AUTH_TYPE_QQ = 3, AUTH_TYPE_NONE = 0; private static final String LOGIN = "v1.1/UserCenter/Login", REGISTER = "v1.1/UserCenter/Register",//获取验证码;/*?phone={phone}&code={code}&pwd={pwd}&roleId={roleId}*/ REQUEST_CODE = "v1.1/UserCenter/RegisterCode?phone={phone}&operation={operation}", URL_ATTENTION = "v1.1/Circle/FocusUserForGroup?userId={userId}&groupId={groupId}&session={session}", URL_CANCEL_ATTENTION = "v1.1/Circle/CancelAttention?userId={userId}&session={session}", FORGET_PWD = "v1.1/UserCenter/ForgetPassword?account={account}&code={code}&newPwd={newPwd}&type={type}", URL_UPDATE_USER_INFO = "v1.1/UserCenter/UpdateUserInfo?param={param}&session={session}", URL_UPDATE_USER_INFO_POST = "v1.1/UserCenter/UpdateUserInfoPost?session={session}", URL_AUTH_LOGIN = "v1.1/UserCenter/LoginByAuthorize", CHECK_LOGIN_STATE = "v1.1/Default/Start?session=",//校验账号状态 MOMENTSGROUPS = "v1.1/Circle/MyDiscussions?userid={userid}&type={type}&session={session}";//朋友圈分组信息 private static final String SMS_KEY = "9f2e7cad8207", SMS_SECRET = "0dec3be14cc54f4f8efd468a1b4397a7"; private boolean isSmsSdkInit = false; private User mMe = null; private List<OnUserChangeListener> mUserChangeListenerList = new ArrayList<OnUserChangeListener>(); private File mMeFile = null; private AccountManager(Context context) { super(context); ShareSDK.initSDK(context); mMeFile = new File(getContext().getExternalCacheDir(), "me"); readMe(); } private void readMe () { try { FileInputStream fis = new FileInputStream(mMeFile); ObjectInputStream ois = new ObjectInputStream(fis); mMe = (User)ois.readObject(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (StreamCorruptedException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public void commitUser () { if (mMe == null) { return; } try { FileOutputStream fos = new FileOutputStream(mMeFile); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(mMe); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public void clearUser () { if (mMeFile.exists()) { mMeFile.delete(); } } public void onSaveInstanceState(Bundle outState) { outState.putSerializable("me", mMe); /*List<Fragment> fragments = getSupportFragmentManager().getFragments(); final int length = fragments.size(); for (int i = 0; i < length; i++) { FragmentUtils.removeFragment(getSupportFragmentManager(), fragments.get(i)); } mCurrentFragment = null;*/ } public void onRestoreInstanceState(Bundle savedInstanceState) { mMe = (User)savedInstanceState.getSerializable("me"); } public User getMe () { return mMe; } public String getCookies () { if (mMe != null) { return mMe.getCookie(); } ActivityDispatcher.loginActivityWhenAlreadyIn(getContext()); return ""; } public void saveUserLoginInfo (LoginInfo info) { SharedPreferences sharedPreferences = getContext().getSharedPreferences("account", Context.MODE_PRIVATE); SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putString("loginType", info.loginType); editor.commit(); } public LoginInfo readUserLoginInfo() { SharedPreferences sharedPreferences = getContext().getSharedPreferences("account", Context.MODE_PRIVATE); LoginInfo info = new LoginInfo(sharedPreferences.getString("loginType", "none")); return info; } public void clearUserLoginInfo () { SharedPreferences sharedPreferences = getContext().getSharedPreferences("account", Context.MODE_PRIVATE); SharedPreferences.Editor editor = sharedPreferences.edit(); editor.clear(); editor.commit(); } public static int getTypeId (String loginTypeStr) { if (Wechat.NAME.equals(loginTypeStr)) { return 0; } else if (SinaWeibo.NAME.equals(loginTypeStr)) { return 1; } else if (QQ.NAME.equals(loginTypeStr)) { return 2; } return -1; } private void smsSdkInit () { if (!isSmsSdkInit) { SMSSDK.initSDK(getContext(), SMS_KEY, SMS_SECRET); isSmsSdkInit = true; } } public void registerEventHandler (EventHandler handler) { smsSdkInit(); SMSSDK.registerEventHandler(handler); } public void askForSms (String phoneNum) { smsSdkInit(); //SMSSDK.getSupportedCountries(); SMSSDK.getVerificationCode(86 + "", phoneNum); } public void submitVerificationCode(String phone, String code) { SMSSDK.submitVerificationCode(86 + "", phone, code); } public void unregisterEventHandler (EventHandler handler) { smsSdkInit(); SMSSDK.unregisterEventHandler(handler); } public void checkLoginState (final RequestCallback callback) { if (mMe == null) { ReturnInfo returnInfo = new ReturnInfo(); OptionSettings optionSettings = new OptionSettings(); optionSettings.status = "-10086"; optionSettings.message = "mMe is null"; optionSettings.errorCode = "-10086"; returnInfo.setOption(optionSettings); callback.callback(returnInfo, ""); return; } String request = CHECK_LOGIN_STATE + mMe.getCookie(); NetProxy.getInstance(getContext()).doGetRequest(request, new NetProxy.OnResponseListener() { @Override public void onResponse(String result, String requestId) { ReturnInfo returnInfo = getGson().fromJson(result, new TypeToken<ReturnInfo>(){}.getType()); if (callback != null) { callback.callback(returnInfo, requestId); } } }); } public String login (String account, String pwd, final RequestCallback<User> callback) { Map<String, String> map = new HashMap<String, String>(); map.put("account", account); map.put("pwd", pwd); return NetProxy.getInstance(getContext()).doPostRequest(LOGIN, map, new NetProxy.OnResponseListener() { @Override public void onResponse(String result, String requestId) { ReturnInfo<User> returnInfo = null; try { returnInfo = getGson().fromJson( result, new TypeToken<ReturnInfo<User>>(){}.getType()); } catch (IllegalStateException e) { String errorMsg = e.getMessage(); } if (returnInfo.isSuccess()) { mMe = returnInfo.getData(); LoginInfo info = new LoginInfo(0); saveUserLoginInfo(info); } if (callback != null) { callback.callback(returnInfo, requestId); } if (!mUserChangeListenerList.isEmpty()) { final int length = mUserChangeListenerList.size(); for (int i = 0; i < length; i++) { OnUserChangeListener userChangeListener = mUserChangeListenerList.get(i); userChangeListener.onUserChanged(mMe, returnInfo.isSuccess()); } } } }); } public void logout () { mMe = null; ShareManager.getInstance(getContext()).loginQuit(null); clearUserLoginInfo(); clearUser(); final int length = mUserChangeListenerList.size(); if (length > 0) { for (int i = 0; i < length; i++) { mUserChangeListenerList.get(i).onUserLogout(); } } } /** * * @param phone * @param codeType 1 or 2 */ public void getRequestCode (String phone, RequestCodeTypeEnum codeType, final RequestCallback<Integer> callback) { String request = REQUEST_CODE .replace("{phone}", phone) .replace("{operation}", codeType.getVal() + ""); NetProxy.getInstance(getContext()).doGetRequest(request, new NetProxy.OnResponseListener() { @Override public void onResponse(String result, String requestId) { ReturnInfo<Integer> returnInfo = getGson().fromJson(result, new TypeToken<ReturnInfo<Integer>>() { }.getType()); if (callback != null) { callback.callback(returnInfo, requestId); } } }); } public void resetPwd (String account, String code, String newPwd, final RequestCallback callback) { final String request = FORGET_PWD .replace("{account}", account) .replace("{code}", code) .replace("{newPwd}", newPwd) .replace("{type}", 1 + ""); NetProxy.getInstance(getContext()).doGetRequest(request, new NetProxy.OnResponseListener() { @Override public void onResponse(String result, String requestId) { ReturnInfo returnInfo = getGson().fromJson(result, new TypeToken<ReturnInfo>() { }.getType()); if (callback != null) { callback.callback(returnInfo, requestId); } } }); } public void register (String phone, String code, String pwd, int roleId, final RequestCallback<User> callback) { String request = REGISTER; Map<String, String> map = new HashMap<String, String>(); map.put("phone", phone); map.put("code", code); map.put("pwd", pwd); map.put("roleId", roleId + ""); NetProxy.getInstance(getContext()).doPostRequest(request, map, new NetProxy.OnResponseListener() { @Override public void onResponse(String result, String requestId) { ReturnInfo<User> returnInfo = null; try { returnInfo = getGson().fromJson( result, new TypeToken<ReturnInfo<User>>() { }.getType()); } catch (IllegalStateException e) { String errorMsg = e.getMessage(); } if (returnInfo.isSuccess()) { mMe = returnInfo.getData(); LoginInfo info = new LoginInfo(0); saveUserLoginInfo(info); } if (callback != null) { callback.callback(returnInfo, requestId); } if (!mUserChangeListenerList.isEmpty()) { final int length = mUserChangeListenerList.size(); for (int i = 0; i < length; i++) { OnUserChangeListener userChangeListener = mUserChangeListenerList.get(i); userChangeListener.onUserChanged(mMe, returnInfo.isSuccess()); } } } }); } /* 1.1/UserCenter/LoginByAuthorize?openid={openid}&typeid={typeid} openid:第三方唯一ID typeid:1 微信,2 新浪微博,3 QQ */ public void authLogin (String openId, final int typeId, final RequestCallback<User> callback) { Map<String, String> map = new HashMap<String, String>(); map.put("openid", openId); map.put("typeid", typeId + ""); /*String request = URL_AUTH_LOGIN .replace("{openid}", openId) .replace("{typeid}", typeId + "");*/ NetProxy.getInstance(getContext()).doPostRequest( URL_AUTH_LOGIN, map, new NetProxy.OnResponseListener() { @Override public void onResponse(String result, String requestId) { ReturnInfo<User> returnInfo = null; try { returnInfo = getGson().fromJson( result, new TypeToken<ReturnInfo<User>>() { }.getType()); } catch (IllegalStateException e) { String errorMsg = e.getMessage(); } if (returnInfo.isSuccess()) { mMe = returnInfo.getData(); LoginInfo info = new LoginInfo(typeId); saveUserLoginInfo(info); } if (callback != null) { callback.callback(returnInfo, requestId); } if (!mUserChangeListenerList.isEmpty()) { final int length = mUserChangeListenerList.size(); for (int i = 0; i < length; i++) { OnUserChangeListener userChangeListener = mUserChangeListenerList.get(i); userChangeListener.onUserChanged(mMe, returnInfo.isSuccess()); } } } } ); } public void attention (long userId, long groupId, final RequestCallback callback) { if (mMe == null) { //TODO com.metis.base.ActivityDispatcher.loginActivityWhenAlreadyIn(getContext()); return; } String request = URL_ATTENTION .replace("{userId}", userId + "") .replace("{groupId}", groupId + "") .replace("{session}", mMe.getCookie()); NetProxy.getInstance(getContext()).doGetRequest(request, new NetProxy.OnResponseListener() { @Override public void onResponse(String result, String requestId) { ReturnInfo returnInfo = getGson().fromJson(result, new TypeToken<ReturnInfo>() { }.getType()); if (callback != null) { callback.callback(returnInfo, requestId); } } }); } public void cancelAttention (long userId, final RequestCallback callback) { if (mMe == null) { //TODO com.metis.base.ActivityDispatcher.loginActivityWhenAlreadyIn(getContext()); return; } String request = URL_CANCEL_ATTENTION .replace("{userId}", userId + "") .replace("{session}", mMe.getCookie()); NetProxy.getInstance(getContext()).doGetRequest(request, new NetProxy.OnResponseListener() { @Override public void onResponse(String result, String requestId) { ReturnInfo returnInfo = getGson().fromJson(result, new TypeToken<ReturnInfo>() { }.getType()); if (callback != null) { callback.callback(returnInfo, requestId); } } }); } public void getAttentionGroup () { if (mMe == null) { return; } String request = MOMENTSGROUPS .replace("{userid}", mMe.userId + "") .replace("{type}", 1 + "") .replace("{session}", mMe.getCookie()); NetProxy.getInstance(getContext()).doGetRequest(request, new NetProxy.OnResponseListener() { @Override public void onResponse(String result, String requestId) { } }); } public void updateUserRole (int userRole, final RequestCallback callback) { if (mMe == null) { //TODO return; } mMe.userRole = userRole; Map<String, String> map = new HashMap<String, String>(); map.put("userRole", userRole + ""); updateUserInfo(map, callback); } /*public void updateUserInfoPost (User user, final RequestCallback callback) { if (mMe == null) { return; } NetProxy.getInstance(getContext()).doPostRequest(URL_UPDATE_USER_INFO_POST.replace("{session}", mMe.getCookie()), user, new NetProxy.OnResponseListener() { @Override public void onResponse(String result, String requestId) { ReturnInfo returnInfo = getGson().fromJson(result, new TypeToken<ReturnInfo>() { }.getType()); if (callback != null) { callback.callback(returnInfo, requestId); } } }); }*/ public void updateUserInfoPost (Map<String, String> map, final RequestCallback callback) { if (mMe == null) { return; } map.put("userId", mMe.userId + ""); JsonObject json = new JsonObject(); Set<String> set = map.keySet(); for (String key : set) { String value = map.get(key); json.addProperty(key, value); /*if (!Patterns.WEB_URL.matcher(value).matches()) { value = URLEncoder.encode(value); } try { json.addProperty(key, URLEncoder.encode(value, "UTF-8")); } catch (UnsupportedEncodingException e) { e.printStackTrace(); }*/ } Map<String, String> params = new HashMap<String, String>(); params.put("param", json.toString()); NetProxy.getInstance(getContext()).doPostRequest(URL_UPDATE_USER_INFO_POST.replace("{session}", mMe.getCookie()), params, new NetProxy.OnResponseListener() { @Override public void onResponse(String result, final String requestId) { ReturnInfo returnInfo = getGson().fromJson(result, new TypeToken<ReturnInfo>() { }.getType()); if (callback != null) { callback.callback(returnInfo, requestId); } final int length = mUserChangeListenerList.size(); if (length > 0) { UserManager.getInstance(getContext()).getUserInfo(mMe.userId, new RequestCallback<User>() { @Override public void callback(ReturnInfo<User> returnInfo, String callbackId) { if (returnInfo.isSuccess()) { mMe.mergeFrom(returnInfo.getData()); for (int i = 0 ;i < length; i++) { mUserChangeListenerList.get(i).onUserInfoChanged(mMe); } } } }); } } }); } private void updateUserInfo (Map<String, String> map, final RequestCallback callback) { if (mMe == null) { //TODO return; } JsonObject json = new JsonObject(); json.addProperty("userId", mMe.userId); Set<String> set = map.keySet(); for (String key : set) { String value = map.get(key); if (!Patterns.WEB_URL.matcher(value).matches()) { value = URLEncoder.encode(value); } try { json.addProperty(key, URLEncoder.encode(value, "UTF-8")); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } //builder.setCharAt(builder.length() - 1, '}'); String request = URL_UPDATE_USER_INFO .replace("{param}", json.toString()) .replace("{session}", mMe.getCookie()); NetProxy.getInstance(getContext()).doGetRequest(request, new NetProxy.OnResponseListener() { @Override public void onResponse(String result, String requestId) { ReturnInfo returnInfo = getGson().fromJson(result, new TypeToken<ReturnInfo>(){}.getType()); if (callback != null) { callback.callback(returnInfo, requestId); } } }); } public enum RequestCodeTypeEnum { REGISTER(1), RESET_PWD(2); private final int val; private RequestCodeTypeEnum(int val) { this.val = val; } public int getVal() { return this.val; } } public void registerOnUserChangeListener (OnUserChangeListener listener) { if (mUserChangeListenerList.contains(listener)) { return; } mUserChangeListenerList.add(listener); } public void unregisterOnUserChangeListener (OnUserChangeListener listener) { if (!mUserChangeListenerList.contains(listener)) { return; } mUserChangeListenerList.remove(listener); } public static interface OnUserChangeListener { public void onUserChanged (User user, boolean onLine); public void onUserInfoChanged (User user); public void onUserLogout(); } public class LoginInfo { private String loginType = ""; public LoginInfo (int typeId) { switch (typeId) { case AUTH_TYPE_NONE: loginType = "none"; break; case AUTH_TYPE_WE_CHAT: loginType = Wechat.NAME; break; case AUTH_TYPE_SINA: loginType = SinaWeibo.NAME; break; case AUTH_TYPE_QQ: loginType = QQ.NAME; break; } } public LoginInfo (String login) { loginType = login; } public String getLoginType() { return loginType; } public void setLoginType(String loginType) { this.loginType = loginType; } } }