瀏覽代碼

Refactor: Add UserDao NotfyDao and their repository and refactor their view model. And rename UserLocalRepository.

kenny67nju 5 年之前
父節點
當前提交
3f3983d991
共有 18 個文件被更改,包括 325 次插入241 次删除
  1. 2 2
      app/src/main/java/cn/seecoder/courselearningdemo/dao/NotifyDao.java
  2. 23 34
      app/src/main/java/cn/seecoder/courselearningdemo/dao/UserDao.java
  3. 6 4
      app/src/main/java/cn/seecoder/courselearningdemo/network/RetrofitClient.java
  4. 0 27
      app/src/main/java/cn/seecoder/courselearningdemo/network/UserService.java
  5. 2 3
      app/src/main/java/cn/seecoder/courselearningdemo/repository/CourseOrderRepository.java
  6. 33 9
      app/src/main/java/cn/seecoder/courselearningdemo/repository/CourseRepository.java
  7. 17 9
      app/src/main/java/cn/seecoder/courselearningdemo/repository/CourseWareRepository.java
  8. 38 0
      app/src/main/java/cn/seecoder/courselearningdemo/repository/UserLocalRepository.java
  9. 136 0
      app/src/main/java/cn/seecoder/courselearningdemo/repository/UserRepository.java
  10. 3 3
      app/src/main/java/cn/seecoder/courselearningdemo/service/MyPushService.java
  11. 4 8
      app/src/main/java/cn/seecoder/courselearningdemo/ui/activity/CourseActivity.java
  12. 2 31
      app/src/main/java/cn/seecoder/courselearningdemo/ui/activity/MainActivity.java
  13. 2 5
      app/src/main/java/cn/seecoder/courselearningdemo/ui/fragment/StudyFragment.java
  14. 9 16
      app/src/main/java/cn/seecoder/courselearningdemo/viewmodel/CourseViewModel.java
  15. 2 9
      app/src/main/java/cn/seecoder/courselearningdemo/viewmodel/HomeViewModel.java
  16. 1 2
      app/src/main/java/cn/seecoder/courselearningdemo/viewmodel/RechargeViewModel.java
  17. 23 51
      app/src/main/java/cn/seecoder/courselearningdemo/viewmodel/SharedViewModel.java
  18. 22 28
      app/src/main/java/cn/seecoder/courselearningdemo/viewmodel/StudyViewModel.java

+ 2 - 2
app/src/main/java/cn/seecoder/courselearningdemo/network/NotifyService.java → app/src/main/java/cn/seecoder/courselearningdemo/dao/NotifyDao.java

@@ -1,11 +1,11 @@
-package cn.seecoder.courselearningdemo.network;
+package cn.seecoder.courselearningdemo.dao;
 
 import cn.seecoder.courselearningdemo.model.ResultVO;
 import retrofit2.Call;
 import retrofit2.http.POST;
 import retrofit2.http.Query;
 
-public interface NotifyService {
+public interface NotifyDao {
     /**
      * 发送用户购买课程成功的推送通知
      * @param uid 用户

+ 23 - 34
app/src/main/java/cn/seecoder/courselearningdemo/dao/UserDao.java

@@ -1,38 +1,27 @@
 package cn.seecoder.courselearningdemo.dao;
 
-import android.content.Context;
-import android.content.SharedPreferences;
-
-import com.google.gson.Gson;
-
-import cn.seecoder.courselearningdemo.CourseLearningDemoApplication;
+import cn.seecoder.courselearningdemo.model.RechargeOrder;
+import cn.seecoder.courselearningdemo.model.ResultVO;
 import cn.seecoder.courselearningdemo.model.User;
-
-/**
- * 使用SharedPreferences 实现本地数据库
- */
-public class UserDao {
-
-    private static final SharedPreferences sharedPreferences = CourseLearningDemoApplication.getContext().getSharedPreferences("course_learning", Context.MODE_PRIVATE);
-
-    public static void saveUser(User user){
-        SharedPreferences.Editor editor = sharedPreferences.edit();
-        editor.putString("user", new Gson().toJson(user));
-        editor.apply();
-    }
-
-    public static void clearUser(){
-        SharedPreferences.Editor editor = sharedPreferences.edit();
-        editor.remove("user");
-        editor.apply();
-    }
-
-    public static User getUser(){
-        String userJson = sharedPreferences.getString("user", "");
-        return new Gson().fromJson(userJson, User.class);
-    }
-
-    public static boolean isUserSaved(){
-        return sharedPreferences.contains("user");
-    }
+import retrofit2.Call;
+import retrofit2.http.Body;
+import retrofit2.http.Field;
+import retrofit2.http.FormUrlEncoded;
+import retrofit2.http.GET;
+import retrofit2.http.POST;
+import retrofit2.http.Path;
+import retrofit2.http.Query;
+
+public interface UserDao {
+    @GET("/user/{uid}")
+    Call<User> getUser(@Path(value = "uid" )String uid);
+    @POST("/user/login")
+    Call<User> login(@Body User user);
+    @POST("/user/recharge")
+    Call<ResultVO<User>> recharge(@Body RechargeOrder rechargeOrder);
+    @POST("/user_token/refresh")
+    Call<ResultVO<String>> refreshUserToken(@Query(value = "uid") String uid, @Query(value = "token") String token);
+    @FormUrlEncoded
+    @POST("/user/verify_id_token")
+    Call<ResultVO<String>> verifyIdToken(@Field("token") String idToken);
 }

+ 6 - 4
app/src/main/java/cn/seecoder/courselearningdemo/network/RetrofitClient.java

@@ -3,6 +3,8 @@ package cn.seecoder.courselearningdemo.network;
 import cn.seecoder.courselearningdemo.dao.CourseDao;
 import cn.seecoder.courselearningdemo.dao.CourseOrderDao;
 import cn.seecoder.courselearningdemo.dao.CourseWareDao;
+import cn.seecoder.courselearningdemo.dao.NotifyDao;
+import cn.seecoder.courselearningdemo.dao.UserDao;
 import cn.seecoder.courselearningdemo.utils.Constant;
 import retrofit2.Retrofit;
 import retrofit2.converter.gson.GsonConverterFactory;
@@ -15,13 +17,13 @@ public class RetrofitClient {
     public static CourseDao courseDao = retrofit.create(CourseDao.class);
     public static CourseWareDao courseWareDao = retrofit.create(CourseWareDao.class);
     public static CourseOrderDao courseOrderDao = retrofit.create(CourseOrderDao.class);
-    public static UserService userService = retrofit.create(UserService.class);
-    public static NotifyService notifyService = retrofit.create(NotifyService.class);
+    public static UserDao userDao = retrofit.create(UserDao.class);
+    public static NotifyDao notifyDao = retrofit.create(NotifyDao.class);
 
     public static CourseDao getCourseDao(){return courseDao;}
     public static CourseWareDao getCourseWareDao(){return courseWareDao;}
     public static CourseOrderDao getCourseOrderDao(){return courseOrderDao;}
-//    public static UserDao getUserDao(){return userDao;}
-//    public static NotifyDao getNotifyDao(){return notifyDao;}
+    public static UserDao getUserDao(){return userDao;}
+    public static NotifyDao getNotifyDao(){return notifyDao;}
 
 }

+ 0 - 27
app/src/main/java/cn/seecoder/courselearningdemo/network/UserService.java

@@ -1,27 +0,0 @@
-package cn.seecoder.courselearningdemo.network;
-
-import cn.seecoder.courselearningdemo.model.RechargeOrder;
-import cn.seecoder.courselearningdemo.model.ResultVO;
-import cn.seecoder.courselearningdemo.model.User;
-import retrofit2.Call;
-import retrofit2.http.Body;
-import retrofit2.http.Field;
-import retrofit2.http.FormUrlEncoded;
-import retrofit2.http.GET;
-import retrofit2.http.POST;
-import retrofit2.http.Path;
-import retrofit2.http.Query;
-
-public interface UserService {
-    @GET("/user/{uid}")
-    Call<User> getUser(@Path(value = "uid" )String uid);
-    @POST("/user/login")
-    Call<User> login(@Body User user);
-    @POST("/user/recharge")
-    Call<ResultVO<User>> recharge(@Body RechargeOrder rechargeOrder);
-    @POST("/user_token/refresh")
-    Call<ResultVO<String>> refreshUserToken(@Query(value = "uid") String uid, @Query(value = "token") String token);
-    @FormUrlEncoded
-    @POST("/user/verify_id_token")
-    Call<ResultVO<String>> verifyIdToken(@Field("token") String idToken);
-}

+ 2 - 3
app/src/main/java/cn/seecoder/courselearningdemo/repository/CourseOrderRepository.java

@@ -11,7 +11,6 @@ import cn.seecoder.courselearningdemo.utils.LogUtil;
 import retrofit2.Call;
 import retrofit2.Callback;
 import retrofit2.Response;
-import retrofit2.http.Body;
 
 public class CourseOrderRepository {
     private final MutableLiveData<Boolean> courseOrderFlag = new MutableLiveData<>();
@@ -31,7 +30,7 @@ public class CourseOrderRepository {
 
     }
 
-    public MutableLiveData<Boolean> getCourseOrderFlag(){
+    public MutableLiveData<Boolean> getCourseOrderFlagLiveData(){
         return courseOrderFlag;
     }
 
@@ -64,7 +63,7 @@ public class CourseOrderRepository {
 
     private void sendCourseOrderSuccessNotify(String uid,Integer courseId){
         System.out.println("sendCourseOrderSuccessNotify uid = "+uid);
-        Call<ResultVO<String>> sendCourseOrderSuccessNotify = RetrofitClient.notifyService.sendCourseOrderSuccessNotify(uid, courseId);
+        Call<ResultVO<String>> sendCourseOrderSuccessNotify = RetrofitClient.getNotifyDao().sendCourseOrderSuccessNotify(uid, courseId);
         sendCourseOrderSuccessNotify.enqueue(new Callback<ResultVO<String>>() {
             @Override
             public void onResponse(Call<ResultVO<String>> call, Response<ResultVO<String>> response) {

+ 33 - 9
app/src/main/java/cn/seecoder/courselearningdemo/repository/CourseRepository.java

@@ -6,9 +6,7 @@ import java.util.ArrayList;
 import java.util.List;
 
 import cn.seecoder.courselearningdemo.dao.CourseDao;
-import cn.seecoder.courselearningdemo.dao.UserDao;
 import cn.seecoder.courselearningdemo.model.Course;
-import cn.seecoder.courselearningdemo.model.CourseWare;
 import cn.seecoder.courselearningdemo.model.PageInfo;
 import cn.seecoder.courselearningdemo.model.User;
 import cn.seecoder.courselearningdemo.network.RetrofitClient;
@@ -18,14 +16,13 @@ import cn.seecoder.courselearningdemo.utils.ToastUtil;
 import retrofit2.Call;
 import retrofit2.Callback;
 import retrofit2.Response;
-import retrofit2.http.Path;
-import retrofit2.http.Query;
 
 public class CourseRepository {
-    private CourseDao courseDao = RetrofitClient.courseDao;
+    private CourseDao courseDao = RetrofitClient.getCourseDao();
     private final MutableLiveData<LoadState> stateData = new MutableLiveData<>();
     private final MutableLiveData<Course> courseData = new MutableLiveData<>();
     private final MutableLiveData<List<Course>> courseListData = new MutableLiveData<>();
+    private final MutableLiveData<List<Course>> studyCourseListData = new MutableLiveData<>();
     private Integer currentPage = 1;
     private static CourseRepository uniqueInstance = null;
 
@@ -43,16 +40,22 @@ public class CourseRepository {
     public Integer getCurrentPage(){
         return currentPage;
     }
+    public MutableLiveData<Course> getCourseLiveData(){
+        return courseData;
+    }
     public MutableLiveData<List<Course>> getCourseListLiveData(){
         return courseListData;
     }
     public MutableLiveData<LoadState> getStateDataLiveData(){
         return stateData;
     }
+    public MutableLiveData<List<Course>> getStudyCourseListLiveData() {
+        return studyCourseListData;
+    }
 
-    public MutableLiveData<Course> getCourseData(Integer courseId){
+    public void loadCourseData(Integer courseId){
         String uid = null;
-        User user = UserDao.getUser();
+        User user = UserLocalRepository.getUser();
         if(user!=null && user.getUid()!=null)
             uid = user.getUid();
         Call<Course> courseCall = courseDao.getCourse(courseId, uid);
@@ -73,10 +76,9 @@ public class CourseRepository {
                 ToastUtil.showShortToast("网络错误,请稍后重试!");
             }
         });
-        return courseData;
 
     }
-    public void getCourseListData(Integer currentPageNum, String uid,String queryKey){
+    public void loadCourseListData(Integer currentPageNum, String uid, String queryKey){
         stateData.setValue(LoadState.LOADING);
         Call<PageInfo<Course>> courseCall =  courseDao.getAllCourses(currentPageNum, uid, queryKey);
         // 异步调用
@@ -108,6 +110,28 @@ public class CourseRepository {
     }
 
 
+    public void loadStudyCourseListData(String uid){
+        if(uid == null) return;
+        LogUtil.i(this, "开始加载用户已购买课程列表");
+        Call<List<Course>> courseCall =  RetrofitClient.getCourseDao().getCourseByUid(uid);
+        // 异步调用
+        courseCall.enqueue(new Callback<List<Course>>() {
+            @Override
+            public void onResponse(Call<List<Course>> call, Response<List<Course>> response) {
+                if (response.body() == null)
+                    ToastUtil.showShortToast("后端数据异常...");
+                studyCourseListData.setValue(response.body());
+            }
+
+            @Override
+            public void onFailure(Call<List<Course>> call, Throwable t) {
+                LogUtil.e(courseCall, "getCourseByUid failure: "+ t.getMessage() + "  caused by: "+t.getCause());
+                ToastUtil.showShortToast("网络异常,请稍后重试!");
+            }
+        });
+    }
+
+
 
 
 }

+ 17 - 9
app/src/main/java/cn/seecoder/courselearningdemo/repository/CourseWareRepository.java

@@ -6,7 +6,6 @@ import java.util.List;
 
 
 import cn.seecoder.courselearningdemo.dao.CourseWareDao;
-import cn.seecoder.courselearningdemo.dao.UserDao;
 import cn.seecoder.courselearningdemo.model.Course;
 import cn.seecoder.courselearningdemo.model.CourseWare;
 import cn.seecoder.courselearningdemo.model.User;
@@ -18,22 +17,31 @@ import retrofit2.Callback;
 import retrofit2.Response;
 
 public class CourseWareRepository {
-    private CourseWareDao courseWareDao = RetrofitClient.courseWareDao;
+    private CourseWareDao courseWareDao = RetrofitClient.getCourseWareDao();
     private final MutableLiveData<List<CourseWare>> courseWareData = new MutableLiveData<>();
-    private Course course;
 
-    public CourseWareRepository(Course c, Integer courseId){
-        course = c;
-        loadCourseWareData();
+
+    private static CourseWareRepository uniqueInstance = null;
+
+    public static CourseWareRepository getCourseRepository(){
+        if (uniqueInstance == null)
+        {
+            uniqueInstance = new CourseWareRepository();
+        }
+        return uniqueInstance;
     }
 
-    public MutableLiveData<List<CourseWare>> getCourseWareData(){
+    private CourseWareRepository(){
+
+    }
+    public MutableLiveData<List<CourseWare>> getCourseWareLiveData(){
         return courseWareData;
     }
 
-    private void loadCourseWareData(){
+
+    public void loadCourseWareData(Course course){
         String uid = null;
-        User user = UserDao.getUser();
+        User user = UserLocalRepository.getUser();
         if(user!=null && user.getUid()!=null)
             uid = user.getUid();
         if(course==null || course.getId()==null)

+ 38 - 0
app/src/main/java/cn/seecoder/courselearningdemo/repository/UserLocalRepository.java

@@ -0,0 +1,38 @@
+package cn.seecoder.courselearningdemo.repository;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+
+import com.google.gson.Gson;
+
+import cn.seecoder.courselearningdemo.CourseLearningDemoApplication;
+import cn.seecoder.courselearningdemo.model.User;
+
+/**
+ * 使用SharedPreferences 实现本地数据库
+ */
+public class UserLocalRepository {
+
+    private static final SharedPreferences sharedPreferences = CourseLearningDemoApplication.getContext().getSharedPreferences("course_learning", Context.MODE_PRIVATE);
+
+    public static void saveUser(User user){
+        SharedPreferences.Editor editor = sharedPreferences.edit();
+        editor.putString("user", new Gson().toJson(user));
+        editor.apply();
+    }
+
+    public static void clearUser(){
+        SharedPreferences.Editor editor = sharedPreferences.edit();
+        editor.remove("user");
+        editor.apply();
+    }
+
+    public static User getUser(){
+        String userJson = sharedPreferences.getString("user", "");
+        return new Gson().fromJson(userJson, User.class);
+    }
+
+    public static boolean isUserSaved(){
+        return sharedPreferences.contains("user");
+    }
+}

+ 136 - 0
app/src/main/java/cn/seecoder/courselearningdemo/repository/UserRepository.java

@@ -0,0 +1,136 @@
+package cn.seecoder.courselearningdemo.repository;
+
+import androidx.lifecycle.MutableLiveData;
+
+import com.huawei.hmf.tasks.OnFailureListener;
+import com.huawei.hmf.tasks.OnSuccessListener;
+import com.huawei.hmf.tasks.Task;
+import com.huawei.hms.iap.IapApiException;
+import com.huawei.hms.iap.entity.ConsumeOwnedPurchaseReq;
+import com.huawei.hms.iap.entity.ConsumeOwnedPurchaseResult;
+
+import cn.seecoder.courselearningdemo.model.RechargeOrder;
+import cn.seecoder.courselearningdemo.model.ResultVO;
+import cn.seecoder.courselearningdemo.model.User;
+import cn.seecoder.courselearningdemo.network.RetrofitClient;
+import cn.seecoder.courselearningdemo.utils.Constant;
+import cn.seecoder.courselearningdemo.utils.LogUtil;
+import cn.seecoder.courselearningdemo.utils.RechargeState;
+import cn.seecoder.courselearningdemo.utils.ToastUtil;
+import retrofit2.Call;
+import retrofit2.Callback;
+import retrofit2.Response;
+
+public class UserRepository {
+    private final MutableLiveData<User> userData = new MutableLiveData<>();
+    private final MutableLiveData<String> uid = new MutableLiveData<>();
+
+    private static UserRepository uniqueInstance = null;
+
+    public static UserRepository getCourseRepository(){
+        if (uniqueInstance == null)
+        {
+            uniqueInstance = new UserRepository();
+        }
+        return uniqueInstance;
+    }
+
+    private UserRepository(){
+
+    }
+    public MutableLiveData<String>  getUidLiveData(){
+        return uid;
+    }
+    public MutableLiveData<User>  getUserDataLiveData(){
+        return userData;
+    }
+
+
+    public void updateUserData(User user){
+//        LogUtil.e(this, "updateUserData  user: "+user);
+        if(user==null || user.getUid()==null){
+            uid.setValue(null);
+            UserLocalRepository.clearUser();
+        }else{
+            userData.setValue(user);
+            UserLocalRepository.saveUser(user);
+            if(uid.getValue() == null || !uid.getValue().equals(user.getUid()))
+                uid.setValue(user.getUid());
+        }
+    }
+
+
+    public void userLoginToServer() {
+        Call<User> userCall = RetrofitClient.userDao.login(userData.getValue());
+        userCall.enqueue(new Callback<User>() {
+            @Override
+            public void onResponse(Call<User> call, Response<User> response) {
+//                LogUtil.i("userLoginToServer", "get response: "+response.body());
+                if(response.body() == null || response.body().getUid() == null)
+                    LogUtil.e("userLoginToServer", "response Null Error!");
+                else
+                    updateUserData(response.body());
+            }
+
+            @Override
+            public void onFailure(Call<User> call, Throwable t) {
+                LogUtil.e("userLoginToServer", "Call failure: "+ t.getMessage() + "  caused by: "+t.getCause());
+            }
+        });
+    }
+
+    // 从应用服务器重新拉取用户账号信息
+    public void reloadUserDataFromServer() {
+        Call<User> userCall = RetrofitClient.userDao.getUser(uid.getValue());
+        userCall.enqueue(new Callback<User>() {
+            @Override
+            public void onResponse(Call<User> call, Response<User> response) {
+                LogUtil.i("reloadUserDataFromServer", "get response");
+                if(response.body() == null || response.body().getUid() == null)
+                    LogUtil.e("reloadUserDataFromServer", "response Null Error!");
+                else
+                    updateUserData(response.body());
+            }
+
+            @Override
+            public void onFailure(Call<User> call, Throwable t) {
+                LogUtil.e("reloadUserDataFromServer", "Call failure: "+ t.getMessage() + "  caused by: "+t.getCause());
+            }
+        });
+    }
+
+    public void verifyIdToken(User user, String idToken){
+        //需要对IDToken有效性进行验证
+        Call<ResultVO<String>> verifyCall = RetrofitClient.getUserDao().verifyIdToken(idToken);
+        verifyCall.enqueue(new Callback<ResultVO<String>>() {
+            @Override
+            public void onResponse(Call<ResultVO<String>> call, Response<ResultVO<String>> response) {
+                if(response.body().getCode().equals(Constant.REQUEST_SUCCESS))
+                    updateUserData(user);
+                else
+                    LogUtil.e("Verify ID Token failed ",response.body().getMsg());
+            }
+
+            @Override
+            public void onFailure(Call<ResultVO<String>> call, Throwable t) {
+                LogUtil.e("Verify ID Token ", "Call failure: "+ t.getMessage() + "  caused by: "+t.getCause());;
+            }
+        });
+    }
+
+    public void sendRegTokenToServer(String token){
+        Call<ResultVO<String>> refreshUserTokenCall = RetrofitClient.getUserDao().refreshUserToken(uid.getValue(), token);
+        refreshUserTokenCall.enqueue(new Callback<ResultVO<String>>() {
+            @Override
+            public void onResponse(Call call, Response response) {
+                LogUtil.i("refreshUserToken", "success");
+            }
+
+            @Override
+            public void onFailure(Call call, Throwable t) {
+                LogUtil.i("refreshUserToken", "fail");
+            }
+        });
+    }
+
+}

+ 3 - 3
app/src/main/java/cn/seecoder/courselearningdemo/service/MyPushService.java

@@ -8,7 +8,7 @@ import com.huawei.hms.push.RemoteMessage;
 
 import java.util.Arrays;
 
-import cn.seecoder.courselearningdemo.dao.UserDao;
+import cn.seecoder.courselearningdemo.repository.UserLocalRepository;
 import cn.seecoder.courselearningdemo.model.ResultVO;
 import cn.seecoder.courselearningdemo.network.RetrofitClient;
 import cn.seecoder.courselearningdemo.utils.LogUtil;
@@ -36,8 +36,8 @@ public class MyPushService extends HmsMessageService {
     }
 
     private void refreshedTokenToServer(String token) {
-        if(UserDao.getUser() == null || !StringUtil.hasText(UserDao.getUser().getUid())) return;
-        Call<ResultVO<String>> refreshUserTokenCall = RetrofitClient.userService.refreshUserToken(UserDao.getUser().getUid(), token);
+        if(UserLocalRepository.getUser() == null || !StringUtil.hasText(UserLocalRepository.getUser().getUid())) return;
+        Call<ResultVO<String>> refreshUserTokenCall = RetrofitClient.userDao.refreshUserToken(UserLocalRepository.getUser().getUid(), token);
         refreshUserTokenCall.enqueue(new Callback<ResultVO<String>>() {
             @Override
             public void onResponse(Call call, Response response) {

+ 4 - 8
app/src/main/java/cn/seecoder/courselearningdemo/ui/activity/CourseActivity.java

@@ -74,14 +74,10 @@ public class CourseActivity extends AppCompatActivity {
 
     private void initViewModel() {
         courseViewModel = new ViewModelProvider(CourseActivity.this).get(CourseViewModel.class);
-//        if(course != null)
-//            courseViewModel.setCourse(course);
-//        else if(courseId != null && courseId != 0)
-//            courseViewModel.loadCourse(courseId);
-
-        courseViewModel.setCourse(course);
-
-
+        if(course != null)
+            courseViewModel.setCourse(course);
+        else if(courseId != null && courseId != 0)
+            courseViewModel.loadCourse(course);
     }
 
     private void initObserver() {

+ 2 - 31
app/src/main/java/cn/seecoder/courselearningdemo/ui/activity/MainActivity.java

@@ -16,11 +16,9 @@ import android.view.MenuItem;
 
 import com.google.android.material.bottomnavigation.BottomNavigationView;
 import com.huawei.agconnect.config.AGConnectServicesConfig;
-import com.huawei.hmf.tasks.OnFailureListener;
 import com.huawei.hmf.tasks.Task;
 import com.huawei.hms.aaid.HmsInstanceId;
 import com.huawei.hms.common.ApiException;
-import com.huawei.hms.common.ResolvableApiException;
 import com.huawei.hms.support.account.AccountAuthManager;
 import com.huawei.hms.support.account.result.AuthAccount;
 import com.huawei.hms.support.account.service.AccountAuthService;
@@ -151,21 +149,7 @@ public class MainActivity extends AppCompatActivity {
                 user.setUname(authAccount.getDisplayName());
                 user.setPicture(authAccount.getAvatarUriString());
                 //需要对IDToken有效性进行验证
-                Call<ResultVO<String>> verifyCall = RetrofitClient.userService.verifyIdToken(idToken);
-                verifyCall.enqueue(new Callback<ResultVO<String>>() {
-                    @Override
-                    public void onResponse(Call<ResultVO<String>> call, Response<ResultVO<String>> response) {
-                        if(response.body().getCode().equals(Constant.REQUEST_SUCCESS))
-                            sharedViewModel.updateUserData(user);
-                        else
-                            LogUtil.e("Verify ID Token failed ",response.body().getMsg());
-                    }
-
-                    @Override
-                    public void onFailure(Call<ResultVO<String>> call, Throwable t) {
-                        LogUtil.e("Verify ID Token ", "Call failure: "+ t.getMessage() + "  caused by: "+t.getCause());;
-                    }
-                });
+                sharedViewModel.verifyIdToken(user,idToken);
                 LogUtil.i(authAccountTask, "Sign in successfully, server AuthCode: " + authAccount.getAuthorizationCode());
             } else {
                 //登录失败
@@ -188,7 +172,7 @@ public class MainActivity extends AppCompatActivity {
                     LogUtil.i("MainActivity", "get token:" + token);
                     if(!TextUtils.isEmpty(token)) {
                         LogUtil.i("getToken ", token);
-                        sendRegTokenToServer(token);
+                        sharedViewModel.sendRegTokenToServer(token);
                     }
                 } catch (ApiException e) {
                     Log.e("MainActivity", "get token failed, " + e);
@@ -197,18 +181,5 @@ public class MainActivity extends AppCompatActivity {
         }.start();
     }
 
-    private void sendRegTokenToServer(String token){
-        Call<ResultVO<String>> refreshUserTokenCall = RetrofitClient.userService.refreshUserToken(sharedViewModel.getUid().getValue(), token);
-        refreshUserTokenCall.enqueue(new Callback<ResultVO<String>>() {
-            @Override
-            public void onResponse(Call call, Response response) {
-                LogUtil.i("refreshUserToken", "success");
-            }
 
-            @Override
-            public void onFailure(Call call, Throwable t) {
-                LogUtil.i("refreshUserToken", "fail");
-            }
-        });
-    }
 }

+ 2 - 5
app/src/main/java/cn/seecoder/courselearningdemo/ui/fragment/StudyFragment.java

@@ -12,14 +12,11 @@ import androidx.lifecycle.ViewModelProvider;
 import androidx.recyclerview.widget.LinearLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
 
-import com.bumptech.glide.Glide;
-
 import java.util.List;
 
 import butterknife.BindView;
 import cn.seecoder.courselearningdemo.R;
 import cn.seecoder.courselearningdemo.model.Course;
-import cn.seecoder.courselearningdemo.model.User;
 import cn.seecoder.courselearningdemo.ui.activity.CourseActivity;
 import cn.seecoder.courselearningdemo.ui.adapter.CourseAdapter;
 import cn.seecoder.courselearningdemo.utils.SizeUtil;
@@ -83,7 +80,7 @@ public class StudyFragment extends BaseFragment implements CourseAdapter.ShowCou
                }
             }
         });
-        studyViewModel.getData().observe(this, new Observer<List<Course>>() {
+        studyViewModel.getStudyCourseListLiveData().observe(this, new Observer<List<Course>>() {
             @Override
             public void onChanged(List<Course> courses) {
                 if (courses.size() == 0)
@@ -99,7 +96,7 @@ public class StudyFragment extends BaseFragment implements CourseAdapter.ShowCou
         courseFreshButton.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
-                studyViewModel.loadData();
+                studyViewModel.loadStudyCourseListData();
             }
         });
     }

+ 9 - 16
app/src/main/java/cn/seecoder/courselearningdemo/viewmodel/CourseViewModel.java

@@ -6,37 +6,30 @@ import androidx.lifecycle.ViewModel;
 
 import java.util.List;
 
-import cn.seecoder.courselearningdemo.dao.UserDao;
 import cn.seecoder.courselearningdemo.model.Course;
 import cn.seecoder.courselearningdemo.model.CourseWare;
-import cn.seecoder.courselearningdemo.model.User;
-import cn.seecoder.courselearningdemo.network.RetrofitClient;
 import cn.seecoder.courselearningdemo.repository.CourseRepository;
 import cn.seecoder.courselearningdemo.repository.CourseWareRepository;
-import cn.seecoder.courselearningdemo.utils.LogUtil;
-import cn.seecoder.courselearningdemo.utils.ToastUtil;
-import retrofit2.Call;
-import retrofit2.Callback;
-import retrofit2.Response;
 
 public class CourseViewModel extends ViewModel {
     private MutableLiveData<Course> courseData ;
     private MutableLiveData<List<CourseWare>> courseWareData ;
     private CourseRepository courseRepository=CourseRepository.getCourseRepository();
-    private CourseWareRepository courseWareRepository;
-    private Course course;
+    private CourseWareRepository courseWareRepository=CourseWareRepository.getCourseRepository();
+
 
     public CourseViewModel(){
+        courseData = courseRepository.getCourseLiveData();
+        courseWareData = courseWareRepository.getCourseWareLiveData();
+
     }
     public void setCourse(Course c){
-        course  = c;
-        loadCourse(course.getId());
+        courseData.setValue(c);
+        courseWareRepository.loadCourseWareData(c);
     }
-    public void loadCourse(Integer courseId){
-        courseData = courseRepository.getCourseData(courseId);
+    public void loadCourse(Course c){
+        courseRepository.loadCourseData(c.getId());
 
-        courseWareRepository = new CourseWareRepository(course,courseId);
-        courseWareData = courseWareRepository.getCourseWareData();
 
     }
 

+ 2 - 9
app/src/main/java/cn/seecoder/courselearningdemo/viewmodel/HomeViewModel.java

@@ -8,20 +8,13 @@ import java.util.ArrayList;
 import java.util.List;
 
 import cn.seecoder.courselearningdemo.model.CourseOrder;
-import cn.seecoder.courselearningdemo.model.PageInfo;
-import cn.seecoder.courselearningdemo.model.ResultVO;
 
 
 import cn.seecoder.courselearningdemo.repository.CourseOrderRepository;
 import cn.seecoder.courselearningdemo.repository.CourseRepository;
 import cn.seecoder.courselearningdemo.utils.Constant;
-import retrofit2.Call;
-import retrofit2.Callback;
-import retrofit2.Response;
 import cn.seecoder.courselearningdemo.model.Course;
-import cn.seecoder.courselearningdemo.network.RetrofitClient;
 import cn.seecoder.courselearningdemo.utils.LoadState;
-import cn.seecoder.courselearningdemo.utils.LogUtil;
 
 public class HomeViewModel extends ViewModel {
     private String uid = null;
@@ -36,7 +29,7 @@ public class HomeViewModel extends ViewModel {
     public HomeViewModel(){
         courseListData = courseRepository.getCourseListLiveData();
         stateData = courseRepository.getStateDataLiveData();
-        courseOrderFlag = courseOrderRepository.getCourseOrderFlag();
+        courseOrderFlag = courseOrderRepository.getCourseOrderFlagLiveData();
 
     }
 
@@ -82,7 +75,7 @@ public class HomeViewModel extends ViewModel {
 
     private void loadData(){
         stateData.setValue(LoadState.LOADING);
-        courseRepository.getCourseListData(currentPage,uid,queryKey);
+        courseRepository.loadCourseListData(currentPage,uid,queryKey);
         currentPage =courseRepository.getCurrentPage();
     }
 

+ 1 - 2
app/src/main/java/cn/seecoder/courselearningdemo/viewmodel/RechargeViewModel.java

@@ -27,7 +27,6 @@ import com.huawei.hms.iap.entity.ProductInfoResult;
 import org.json.JSONException;
 
 import java.util.ArrayList;
-import java.util.Date;
 import java.util.List;
 
 import cn.seecoder.courselearningdemo.model.RechargeOrder;
@@ -192,7 +191,7 @@ public class RechargeViewModel extends ViewModel {
         rechargeOrder.setOrderId(orderId);
         rechargeOrder.setValue(10);
         // 调用应用服务器的recharge接口,若传入的订单id在数据库内已存在,则钻石已经发货过了,否则重新发货
-        Call<ResultVO<User>> rechargeCall = RetrofitClient.userService.recharge(rechargeOrder);
+        Call<ResultVO<User>> rechargeCall = RetrofitClient.getUserDao().recharge(rechargeOrder);
         rechargeCall.enqueue(new Callback<ResultVO<User>>() {
             @Override
             public void onResponse(Call<ResultVO<User>> call, Response<ResultVO<User>> response) {

+ 23 - 51
app/src/main/java/cn/seecoder/courselearningdemo/viewmodel/SharedViewModel.java

@@ -16,9 +16,10 @@ import com.huawei.hms.support.account.result.AuthAccount;
 import com.huawei.hms.support.account.service.AccountAuthService;
 
 import cn.seecoder.courselearningdemo.CourseLearningDemoApplication;
-import cn.seecoder.courselearningdemo.dao.UserDao;
+import cn.seecoder.courselearningdemo.repository.UserLocalRepository;
 import cn.seecoder.courselearningdemo.model.User;
 import cn.seecoder.courselearningdemo.network.RetrofitClient;
+import cn.seecoder.courselearningdemo.repository.UserRepository;
 import cn.seecoder.courselearningdemo.utils.LogUtil;
 import retrofit2.Call;
 import retrofit2.Callback;
@@ -29,12 +30,17 @@ import retrofit2.Response;
  */
 public class SharedViewModel extends ViewModel {
     private MutableLiveData<String> uid;
-    private final MutableLiveData<User> userData = new MutableLiveData<>();
+    private MutableLiveData<User> userData;
+    private UserRepository userRepository = UserRepository.getCourseRepository();
     private AccountAuthService mAuthManager;
 
+    public SharedViewModel(){
+
+    }
     public LiveData<String> getUid(){
         if(uid == null){
-            uid = new MutableLiveData<>();
+            uid = userRepository.getUidLiveData();
+            userData = userRepository.getUserDataLiveData();
             // 打开APP时,默认使用silentSignIn尝试登录
             silentSignIn();
         }
@@ -46,18 +52,21 @@ public class SharedViewModel extends ViewModel {
     }
 
     public void updateUserData(User user){
-//        LogUtil.e(this, "updateUserData  user: "+user);
-        if(user==null || user.getUid()==null){
-            uid.setValue(null);
-            UserDao.clearUser();
-        }else{
-            userData.setValue(user);
-            UserDao.saveUser(user);
-            if(uid.getValue() == null || !uid.getValue().equals(user.getUid()))
-                uid.setValue(user.getUid());
-        }
+        userRepository.updateUserData(user);
+    }
+    public void userLoginToServer() {
+        userRepository.userLoginToServer();
     }
 
+    public void reloadUserDataFromServer() {
+        userRepository.reloadUserDataFromServer();
+    }
+    public void verifyIdToken(User user, String idToken){
+        userRepository.verifyIdToken(user,idToken);
+    }
+    public void sendRegTokenToServer(String token){
+        userRepository.sendRegTokenToServer(token);
+    }
     // 静默登录
     private void silentSignIn() {
         AccountAuthParams mAuthParam = new AccountAuthParamsHelper(AccountAuthParams.DEFAULT_AUTH_REQUEST_PARAM).createParams();
@@ -79,7 +88,7 @@ public class SharedViewModel extends ViewModel {
             public void onFailure(Exception e) {
                 // 如果静默登录失败
                 if (e instanceof ApiException) {
-                    UserDao.clearUser();
+                    UserLocalRepository.clearUser();
                     ApiException apiException = (ApiException) e;
                     LogUtil.w(task, "Silent sign in error, status code: " + apiException.getStatusCode());
                     LogUtil.w(task, "Silent sign in error, " + apiException.getMessage());
@@ -145,42 +154,5 @@ public class SharedViewModel extends ViewModel {
         });
     }
 
-    public void userLoginToServer() {
-        Call<User> userCall = RetrofitClient.userService.login(userData.getValue());
-        userCall.enqueue(new Callback<User>() {
-            @Override
-            public void onResponse(Call<User> call, Response<User> response) {
-//                LogUtil.i("userLoginToServer", "get response: "+response.body());
-                if(response.body() == null || response.body().getUid() == null)
-                    LogUtil.e("userLoginToServer", "response Null Error!");
-                else
-                    updateUserData(response.body());
-            }
 
-            @Override
-            public void onFailure(Call<User> call, Throwable t) {
-                LogUtil.e("userLoginToServer", "Call failure: "+ t.getMessage() + "  caused by: "+t.getCause());
-            }
-        });
-    }
-
-    // 从应用服务器重新拉取用户账号信息
-    public void reloadUserDataFromServer() {
-        Call<User> userCall = RetrofitClient.userService.getUser(uid.getValue());
-        userCall.enqueue(new Callback<User>() {
-            @Override
-            public void onResponse(Call<User> call, Response<User> response) {
-                LogUtil.i("reloadUserDataFromServer", "get response");
-                if(response.body() == null || response.body().getUid() == null)
-                    LogUtil.e("reloadUserDataFromServer", "response Null Error!");
-                else
-                    updateUserData(response.body());
-            }
-
-            @Override
-            public void onFailure(Call<User> call, Throwable t) {
-                LogUtil.e("reloadUserDataFromServer", "Call failure: "+ t.getMessage() + "  caused by: "+t.getCause());
-            }
-        });
-    }
 }

+ 22 - 28
app/src/main/java/cn/seecoder/courselearningdemo/viewmodel/StudyViewModel.java

@@ -7,7 +7,10 @@ import androidx.lifecycle.ViewModel;
 import java.util.List;
 
 import cn.seecoder.courselearningdemo.model.Course;
+import cn.seecoder.courselearningdemo.model.User;
 import cn.seecoder.courselearningdemo.network.RetrofitClient;
+import cn.seecoder.courselearningdemo.repository.CourseRepository;
+import cn.seecoder.courselearningdemo.repository.UserRepository;
 import cn.seecoder.courselearningdemo.utils.LogUtil;
 import cn.seecoder.courselearningdemo.utils.ToastUtil;
 import retrofit2.Call;
@@ -15,41 +18,32 @@ import retrofit2.Callback;
 import retrofit2.Response;
 
 public class StudyViewModel extends ViewModel {
-    private String uid = null;
-    private final MutableLiveData<List<Course>> courseData = new MutableLiveData<>();;
 
+    private MutableLiveData<List<Course>> studyCourseListData;
+    private CourseRepository courseRepository=CourseRepository.getCourseRepository();
+    private String uidData=null;
+
+
+
+    public StudyViewModel(){
+        studyCourseListData = courseRepository.getStudyCourseListLiveData();
+
+    }
     public void setUid(String uid) {
-        this.uid = uid;
-        loadData();
+        uidData=uid;
+        loadStudyCourseListData();
     }
 
-    public String getUid() {
-        return uid;
-    }
+//    public String getUid() {
+//        return uid;
+//    }
 
-    public LiveData<List<Course>> getData() {
-        return courseData;
+    public LiveData<List<Course>> getStudyCourseListLiveData() {
+        return studyCourseListData;
     }
 
-    public void loadData(){
-        if(uid == null) return;
-        LogUtil.i(this, "开始加载用户已购买课程列表");
-        Call<List<Course>> courseCall =  RetrofitClient.courseDao.getCourseByUid(uid);
-        // 异步调用
-        courseCall.enqueue(new Callback<List<Course>>() {
-            @Override
-            public void onResponse(Call<List<Course>> call, Response<List<Course>> response) {
-                if (response.body() == null)
-                    ToastUtil.showShortToast("后端数据异常...");
-                courseData.setValue(response.body());
-            }
-
-            @Override
-            public void onFailure(Call<List<Course>> call, Throwable t) {
-                LogUtil.e(courseCall, "getCourseByUid failure: "+ t.getMessage() + "  caused by: "+t.getCause());
-                ToastUtil.showShortToast("网络异常,请稍后重试!");
-            }
-        });
+    public void loadStudyCourseListData(){
+        courseRepository.loadStudyCourseListData(uidData);
     }
 
 }