diff --git a/app/src/main/java/com/gh/common/constant/Constants.java b/app/src/main/java/com/gh/common/constant/Constants.java index b4711af062..60c21b77a4 100644 --- a/app/src/main/java/com/gh/common/constant/Constants.java +++ b/app/src/main/java/com/gh/common/constant/Constants.java @@ -12,6 +12,9 @@ public class Constants { public static final String LOGIN_TOKEN_ID = "userToken_id"; // 用户ID 与服务器无关 + public static final String USER_TOKEN_KEY = "userTokenKey"; + public static final String USER_INFO_KEY = "userInfoKey"; + //手机号码匹配规则 public static final String REGEX_MOBILE = "^((13[0-9])|(15[^4,\\D])|(18[0,5-9]))\\d{8}$"; public static final String REGEX_ACCOUNT = "^[a-zA-Z_]\\w{5,17}$"; diff --git a/app/src/main/java/com/gh/gamecenter/manager/UserManager.java b/app/src/main/java/com/gh/gamecenter/manager/UserManager.java index 60832fa3fd..a5e191061d 100644 --- a/app/src/main/java/com/gh/gamecenter/manager/UserManager.java +++ b/app/src/main/java/com/gh/gamecenter/manager/UserManager.java @@ -1,6 +1,5 @@ package com.gh.gamecenter.manager; -import android.content.Context; import android.content.SharedPreferences; import android.preference.PreferenceManager; import android.text.TextUtils; @@ -21,7 +20,6 @@ import com.gh.gamecenter.retrofit.Response; import com.gh.gamecenter.retrofit.RetrofitManager; import com.gh.gamecenter.retrofit.service.ApiService; import com.gh.gamecenter.retrofit.service.UserseaService; -import com.gh.gamecenter.user.AppDatabase; import com.halo.assistant.HaloApp; import com.lightgame.utils.Utils; @@ -45,7 +43,6 @@ public class UserManager { private SharedPreferences mSp; - private AppDatabase mDatabase; private UserseaService mUserseaService; private ApiService mApiService; @@ -64,7 +61,6 @@ public class UserManager { private UserManager() { mSp = PreferenceManager.getDefaultSharedPreferences(HaloApp.getInstance().getApplication()); - mDatabase = AppDatabase.getInstance(HaloApp.getInstance().getApplication()); mUserseaService = RetrofitManager.getInstance(HaloApp.getInstance().getApplication()).getUsersea(); mApiService = RetrofitManager.getInstance(HaloApp.getInstance().getApplication()).getApi(); } @@ -166,7 +162,7 @@ public class UserManager { public void onResponse(LoginTokenEntity response) { super.onResponse(response); - saveLoginToken(response, HaloApp.getInstance().getApplication()); + saveLoginToken(response); refreshUserInfo(callBack, response.getId()); } @@ -227,27 +223,19 @@ public class UserManager { }); } - private void saveLoginToken(final LoginTokenEntity tokenEntity, final Context context) { + private void saveLoginToken(final LoginTokenEntity tokenEntity) { LoginTokenEntity loginTokenEntity = getLoginTokenEntity(); if (loginTokenEntity != null) { tokenEntity.setLoginType(loginTokenEntity.getLoginType()); tokenEntity.setId(loginTokenEntity.getId()); } - setLoginTokenEntity(tokenEntity); - if (TextUtils.isEmpty(tokenEntity.getId())) return; - if (mDatabase.loginTokenDao().updateToken(tokenEntity) <= 0) { - mDatabase.loginTokenDao().addToken(tokenEntity); - } - mSp.edit().putString(Constants.LOGIN_TOKEN_ID, tokenEntity.getId()).apply(); + mSp.edit().putString(Constants.USER_TOKEN_KEY, GsonUtils.Companion.getInstance().toJson(tokenEntity)).apply(); } private void saveUserInfo(final UserInfoEntity userInfo) { - setUserInfoEntity(userInfo); - if (TextUtils.isEmpty(userInfo.getId())) return; - if (mDatabase.userInfoDao().updateUserInfo(userInfo) <= 0) { - mDatabase.userInfoDao().addUserInfo(userInfo); - } + setUserInfoEntity(userInfo); + mSp.edit().putString(Constants.USER_INFO_KEY, GsonUtils.Companion.getInstance().toJson(userInfo)).apply(); } public interface refreshCallBack { diff --git a/app/src/main/java/com/gh/gamecenter/user/AppDatabase.java b/app/src/main/java/com/gh/gamecenter/user/AppDatabase.java index 4459226083..ff8f186ac5 100644 --- a/app/src/main/java/com/gh/gamecenter/user/AppDatabase.java +++ b/app/src/main/java/com/gh/gamecenter/user/AppDatabase.java @@ -53,9 +53,17 @@ public abstract class AppDatabase extends RoomDatabase { } }; + static final Migration MIGRATION_4_5 = new Migration(4, 5) { + @Override + public void migrate(SupportSQLiteDatabase database) { + database.execSQL("Alter TABLE UserInfoEntity add idCard TEXT"); + database.execSQL("Alter TABLE AnswerEntity add active INTEGER NOT NULL DEFAULT 1"); + } + }; + private static AppDatabase buildDatabase(Context context) { return Room.databaseBuilder(context, AppDatabase.class, DATABASE_NAME) - .addMigrations(MIGRATION_2_4) + .addMigrations(MIGRATION_2_4, MIGRATION_4_5) //TODO 不允许主线程查询 .allowMainThreadQueries() // //TODO 提供db升级的策略而不是强行销毁 diff --git a/app/src/main/java/com/gh/gamecenter/user/UserRepository.java b/app/src/main/java/com/gh/gamecenter/user/UserRepository.java index 0271bd7793..7e81e2c68b 100644 --- a/app/src/main/java/com/gh/gamecenter/user/UserRepository.java +++ b/app/src/main/java/com/gh/gamecenter/user/UserRepository.java @@ -32,8 +32,6 @@ import org.json.JSONObject; import java.io.IOException; import java.util.HashMap; -import java.util.concurrent.Executor; -import java.util.concurrent.Executors; import okhttp3.MediaType; import okhttp3.RequestBody; @@ -50,8 +48,7 @@ import rx.schedulers.Schedulers; class UserRepository { private static UserRepository mInstance; - - private Executor SINGLE_EXECUTOR = Executors.newSingleThreadExecutor(); + private final SharedPreferences mPreferences; private Context mContext; @@ -86,12 +83,23 @@ class UserRepository { mUserseaService = RetrofitManager.getInstance(context).getUsersea(); mApiService = RetrofitManager.getInstance(context).getApi(); mAppDatabase = database; - mCachedId = PreferenceManager.getDefaultSharedPreferences(context).getString(Constants.LOGIN_TOKEN_ID, null); - if (!TextUtils.isEmpty(mCachedId)) checkLogin(); + mPreferences = PreferenceManager.getDefaultSharedPreferences(context); + checkLogin(); } protected void checkLogin() { - LoginTokenEntity tokenEntity = mAppDatabase.loginTokenDao().getTokenById(mCachedId); + LoginTokenEntity tokenEntity = null; + String userToken = mPreferences.getString(Constants.USER_TOKEN_KEY, null); + if (!TextUtils.isEmpty(userToken)) { + tokenEntity = GsonUtils.Companion.getInstance().fromJsonBean(userToken, LoginTokenEntity.class); + } else { //针对旧版本的数据迁移 + mCachedId = mPreferences.getString(Constants.LOGIN_TOKEN_ID, null); + if (!TextUtils.isEmpty(mCachedId)) { + tokenEntity = mAppDatabase.loginTokenDao().getTokenById(mCachedId); + mPreferences.edit().putString(Constants.USER_TOKEN_KEY, GsonUtils.Companion.getInstance().toJson(tokenEntity)).apply(); + } + } + if (tokenEntity == null || tokenEntity.getRefreshToken() == null || tokenEntity.getAccessToken() == null) { return; } @@ -118,6 +126,9 @@ class UserRepository { mCacheUserInfoEntity = null; } + mPreferences.edit().putString(Constants.USER_TOKEN_KEY, null).apply(); + mPreferences.edit().putString(Constants.USER_INFO_KEY, null).apply(); + mCachedId = null; PreferenceManager.getDefaultSharedPreferences(mContext).edit().putString(Constants.LOGIN_TOKEN_ID, null).apply(); GetLoginDataUtils.getInstance(mContext).QQLogout(); @@ -128,13 +139,20 @@ class UserRepository { if (mCacheUserInfoEntity != null) { mLoginObsResponseUserInfo.postValue(new ApiResponse<>(mCacheUserInfoEntity)); } else { - final LiveData liveUserInfo = mAppDatabase.userInfoDao().getLiveUserInfoById(mCachedId); - mLoginObsResponseUserInfo.addSource(liveUserInfo, userInfoEntity -> { - mLoginObsResponseUserInfo.removeSource(liveUserInfo); - if (userInfoEntity != null) { - userInfoHandle(userInfoEntity, false); - } - }); + String userInfo = mPreferences.getString(Constants.USER_INFO_KEY, null); + if (!TextUtils.isEmpty(userInfo)) { + UserInfoEntity infoEntity = GsonUtils.Companion.getInstance().fromJsonBean(userInfo, UserInfoEntity.class); + mLoginObsResponseUserInfo.postValue(new ApiResponse<>(infoEntity)); + cacheAndNotifyUserInfo(infoEntity, false); + } else if (!TextUtils.isEmpty(mCachedId)) { //针对旧版本的数据迁移 + final LiveData liveUserInfo = mAppDatabase.userInfoDao().getLiveUserInfoById(mCachedId); + mLoginObsResponseUserInfo.addSource(liveUserInfo, userInfoEntity -> { + mLoginObsResponseUserInfo.removeSource(liveUserInfo); + if (userInfoEntity != null) { + userInfoHandle(userInfoEntity, false); + } + }); + } } return mLoginObsResponseUserInfo; @@ -386,32 +404,13 @@ class UserRepository { private void userInfoHandle(final UserInfoEntity userInfo, boolean isEditUserInfo) { - if (userInfo == null || TextUtils.isEmpty(userInfo.getId())) return; // 未知原因 为防止闪退先不处理 - SINGLE_EXECUTOR.execute(new Runnable() { - @Override - public void run() { - if (mAppDatabase.userInfoDao().updateUserInfo(userInfo) <= 0) { - mAppDatabase.userInfoDao().addUserInfo(userInfo); - } - } - }); + mPreferences.edit().putString(Constants.USER_INFO_KEY, GsonUtils.Companion.getInstance().toJson(userInfo)).apply(); cacheAndNotifyUserInfo(userInfo, isEditUserInfo); } private void userTokenHandle(final LoginTokenEntity tokenEntity, LoginTag loginTag) { - mCachedId = tokenEntity.getId(); - SINGLE_EXECUTOR.execute(new Runnable() { - @Override - public void run() { - if (mAppDatabase.loginTokenDao().updateToken(tokenEntity) <= 0) { - mAppDatabase.loginTokenDao().addToken(tokenEntity); - } - - PreferenceManager.getDefaultSharedPreferences(mContext).edit().putString(Constants.LOGIN_TOKEN_ID, mCachedId).apply(); - } - }); - + mPreferences.edit().putString(Constants.USER_TOKEN_KEY, GsonUtils.Companion.getInstance().toJson(tokenEntity)).apply(); cacheAndNotifyLoginToken(tokenEntity); // 检查是否需要同步老用户数据