Commit 01c40829 by 段启岩

解决dagger循环依赖

parent 4c80306c
package cn.yunliyunwai.beyondclouds.data.model;
import lombok.Data;
@Data
public class AuthenticationResult {
private String userId;
private String accessToken;
}
package cn.yunliyunwai.beyondclouds.data.model;
import java.util.Date;
import lombok.Data;
@Data
public class UserInfo {
private String userId;
private String nickName;
private String userAvatar;
private Integer gender;
private String signature;
private Date birthday;
private Date createTime;
private Date updateTime;
private UserStatistics statistics;
}
package cn.yunliyunwai.beyondclouds.data.model;
import lombok.Data;
@Data
public class UserStatistics {
private String userId;
private Integer followedNum;
private Integer fansNum;
private Integer blogNum;
private Integer blogViewNum;
private Integer projectNum;
private Integer postNum;
private Integer questionNum;
private Integer questionReplyNum;
private Integer replyAcceptedNum;
private Integer visitedNum;
}
package cn.yunliyunwai.beyondclouds.data.model.form;
import lombok.Data;
@Data
public class AccountLoginForm {
private AccountLoginForm() {
}
private AccountLoginForm(String account, String password) {
this.account = account;
this.password = password;
}
private String account;
private String password;
public static AccountLoginForm create(String account, String password) {
return new AccountLoginForm(account, password);
}
}
package cn.yunliyunwai.beyondclouds.data.model.form;
import lombok.Data;
@Data
public class SmsLoginForm {
private SmsLoginForm() {
}
private SmsLoginForm(String mobile, String verifyCode) {
this.mobile = mobile;
this.verifyCode = verifyCode;
}
private String mobile;
private String verifyCode;
public static SmsLoginForm create(String mobile, String verifyCode) {
return new SmsLoginForm(mobile, verifyCode);
}
}
package cn.yunliyunwai.beyondclouds.data.source;
import androidx.lifecycle.LiveData;
import cn.yunliyunwai.beyondclouds.data.model.AuthenticationResult;
import cn.yunliyunwai.beyondclouds.data.model.Result;
import cn.yunliyunwai.beyondclouds.data.model.UserInfo;
public interface IUserRepository {
/**
* 账号密码登录
* @param account
* @param password
* @return
*/
LiveData<Result<AuthenticationResult>> accountAuth(String account, String password);
/**
* 短信验证码登录
* @param mobile
* @param verifyCode
* @return
*/
LiveData<Result<AuthenticationResult>> smsAuth(String mobile, String verifyCode);
/**
* 获取我的用户信息
* @return
*/
LiveData<Result<UserInfo>> getUserInfo();
}
package cn.yunliyunwai.beyondclouds.data.source.impl;
import androidx.lifecycle.LiveData;
import javax.inject.Inject;
import javax.inject.Singleton;
import cn.yunliyunwai.beyondclouds.data.model.AuthenticationResult;
import cn.yunliyunwai.beyondclouds.data.model.Result;
import cn.yunliyunwai.beyondclouds.data.model.UserInfo;
import cn.yunliyunwai.beyondclouds.data.model.form.AccountLoginForm;
import cn.yunliyunwai.beyondclouds.data.model.form.SmsLoginForm;
import cn.yunliyunwai.beyondclouds.data.source.IUserRepository;
import cn.yunliyunwai.beyondclouds.data.source.remote.UserApiStore;
@Singleton
public class UserRepositoryImpl implements IUserRepository {
private UserApiStore userApiStore;
@Inject
public UserRepositoryImpl(UserApiStore userApiStore) {
this.userApiStore = userApiStore;
}
@Override
public LiveData<Result<AuthenticationResult>> accountAuth(String account, String password) {
return userApiStore.accountAuth(AccountLoginForm.create(account, password));
}
@Override
public LiveData<Result<AuthenticationResult>> smsAuth(String mobile, String verifyCode) {
return userApiStore.smsAuth(SmsLoginForm.create(mobile, verifyCode));
}
@Override
public LiveData<Result<UserInfo>> getUserInfo() {
return userApiStore.getUserInfo();
}
}
package cn.yunliyunwai.beyondclouds.data.source.remote;
import androidx.lifecycle.LiveData;
import cn.yunliyunwai.beyondclouds.data.model.AuthenticationResult;
import cn.yunliyunwai.beyondclouds.data.model.Result;
import cn.yunliyunwai.beyondclouds.data.model.UserInfo;
import cn.yunliyunwai.beyondclouds.data.model.form.AccountLoginForm;
import cn.yunliyunwai.beyondclouds.data.model.form.SmsLoginForm;
import retrofit2.http.Body;
import retrofit2.http.GET;
import retrofit2.http.POST;
public interface UserApiStore {
/**
* 账号密码登录
* @param accountLoginForm
* @return
*/
@POST("auth/password")
LiveData<Result<AuthenticationResult>> accountAuth(@Body AccountLoginForm accountLoginForm);
/**
* 短信验证码登录
* @param smsLoginForm
* @return
*/
@POST("auth/sms")
LiveData<Result<AuthenticationResult>> smsAuth(@Body SmsLoginForm smsLoginForm);
/**
* 获取我的用户信息
* @return
*/
@GET("my/baseinfo")
LiveData<Result<UserInfo>> getUserInfo();
}
...@@ -26,6 +26,7 @@ import cn.yunliyunwai.beyondclouds.data.source.remote.BlogApiStore; ...@@ -26,6 +26,7 @@ import cn.yunliyunwai.beyondclouds.data.source.remote.BlogApiStore;
import cn.yunliyunwai.beyondclouds.data.source.remote.PostApiStore; import cn.yunliyunwai.beyondclouds.data.source.remote.PostApiStore;
import cn.yunliyunwai.beyondclouds.data.source.remote.ProjectApiStore; import cn.yunliyunwai.beyondclouds.data.source.remote.ProjectApiStore;
import cn.yunliyunwai.beyondclouds.data.source.remote.QuestionApiStore; import cn.yunliyunwai.beyondclouds.data.source.remote.QuestionApiStore;
import cn.yunliyunwai.beyondclouds.data.source.remote.UserApiStore;
import cn.yunliyunwai.beyondclouds.util.AppExecutors; import cn.yunliyunwai.beyondclouds.util.AppExecutors;
import dagger.Module; import dagger.Module;
import dagger.Provides; import dagger.Provides;
...@@ -62,6 +63,12 @@ public class AppModule { ...@@ -62,6 +63,12 @@ public class AppModule {
@Singleton @Singleton
@Provides @Provides
public UserApiStore provideUserApiRemoteDataSource(Retrofit retrofit) {
return retrofit.create(UserApiStore.class);
}
@Singleton
@Provides
BlogDatabase provideBlogDatabase(Context context) { BlogDatabase provideBlogDatabase(Context context) {
return Room return Room
.databaseBuilder(context.getApplicationContext(), .databaseBuilder(context.getApplicationContext(),
......
...@@ -8,10 +8,12 @@ import cn.yunliyunwai.beyondclouds.data.source.IBlogRepository; ...@@ -8,10 +8,12 @@ import cn.yunliyunwai.beyondclouds.data.source.IBlogRepository;
import cn.yunliyunwai.beyondclouds.data.source.IPostRepository; import cn.yunliyunwai.beyondclouds.data.source.IPostRepository;
import cn.yunliyunwai.beyondclouds.data.source.IProjectRepository; import cn.yunliyunwai.beyondclouds.data.source.IProjectRepository;
import cn.yunliyunwai.beyondclouds.data.source.IQuestionRepository; import cn.yunliyunwai.beyondclouds.data.source.IQuestionRepository;
import cn.yunliyunwai.beyondclouds.data.source.IUserRepository;
import cn.yunliyunwai.beyondclouds.data.source.impl.BlogRepositoryImpl; import cn.yunliyunwai.beyondclouds.data.source.impl.BlogRepositoryImpl;
import cn.yunliyunwai.beyondclouds.data.source.impl.PostRepositoryImpl; import cn.yunliyunwai.beyondclouds.data.source.impl.PostRepositoryImpl;
import cn.yunliyunwai.beyondclouds.data.source.impl.ProjectRepositoryImpl; import cn.yunliyunwai.beyondclouds.data.source.impl.ProjectRepositoryImpl;
import cn.yunliyunwai.beyondclouds.data.source.impl.QuestionRepositoryImpl; import cn.yunliyunwai.beyondclouds.data.source.impl.QuestionRepositoryImpl;
import cn.yunliyunwai.beyondclouds.data.source.impl.UserRepositoryImpl;
import cn.yunliyunwai.beyondclouds.viewmodel.MainActivityViewModel; import cn.yunliyunwai.beyondclouds.viewmodel.MainActivityViewModel;
import dagger.Binds; import dagger.Binds;
import dagger.Module; import dagger.Module;
...@@ -37,6 +39,10 @@ public interface AppModuleBinds { ...@@ -37,6 +39,10 @@ public interface AppModuleBinds {
@Binds @Binds
IQuestionRepository bindQuestionRepository(QuestionRepositoryImpl questionRepository); IQuestionRepository bindQuestionRepository(QuestionRepositoryImpl questionRepository);
@Singleton
@Binds
IUserRepository bindUserRepository(UserRepositoryImpl userRepository);
@Binds @Binds
@IntoMap @IntoMap
@ViewModelFactory.ViewModelKey(MainActivityViewModel.class) @ViewModelFactory.ViewModelKey(MainActivityViewModel.class)
......
...@@ -11,6 +11,9 @@ import androidx.lifecycle.ViewModel; ...@@ -11,6 +11,9 @@ import androidx.lifecycle.ViewModel;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Singleton; import javax.inject.Singleton;
import cn.yunliyunwai.beyondclouds.data.source.IUserRepository;
import dagger.Lazy;
@Singleton @Singleton
public class AuthenticationViewModel extends ViewModel { public class AuthenticationViewModel extends ViewModel {
...@@ -25,6 +28,11 @@ public class AuthenticationViewModel extends ViewModel { ...@@ -25,6 +28,11 @@ public class AuthenticationViewModel extends ViewModel {
UN_AUTHENTICATION, UN_AUTHENTICATION,
/** /**
* 等待获取用户信息
*/
WAIT_FOR_FETCH_USER_INFO,
/**
* 已认证 * 已认证
*/ */
AUTHENTICATED AUTHENTICATED
...@@ -42,6 +50,8 @@ public class AuthenticationViewModel extends ViewModel { ...@@ -42,6 +50,8 @@ public class AuthenticationViewModel extends ViewModel {
SMS SMS
} }
private Lazy<IUserRepository> userRepositoryLazy;
/** /**
* accessToken * accessToken
*/ */
...@@ -85,9 +95,9 @@ public class AuthenticationViewModel extends ViewModel { ...@@ -85,9 +95,9 @@ public class AuthenticationViewModel extends ViewModel {
@Inject @Inject
public AuthenticationViewModel(Context context) { public AuthenticationViewModel(Context context, Lazy<IUserRepository> userRepositoryLazy) {
this.loginWay.setValue(LoginWay.ACCOUNT); this.userRepositoryLazy = userRepositoryLazy;
this.passwordVisibility.setValue(false);
String token = context.getSharedPreferences(SHARED_PREFERENCES_NAME_AUTHENTICATION, Context.MODE_PRIVATE).getString(SHARED_PREFERENCES_AUTHENTICATION_KEY_TOKEN, null); String token = context.getSharedPreferences(SHARED_PREFERENCES_NAME_AUTHENTICATION, Context.MODE_PRIVATE).getString(SHARED_PREFERENCES_AUTHENTICATION_KEY_TOKEN, null);
if (null != token) { if (null != token) {
this.token = token; this.token = token;
...@@ -95,6 +105,9 @@ public class AuthenticationViewModel extends ViewModel { ...@@ -95,6 +105,9 @@ public class AuthenticationViewModel extends ViewModel {
} else { } else {
this.authenticationState.setValue(AuthenticationState.UN_AUTHENTICATION); this.authenticationState.setValue(AuthenticationState.UN_AUTHENTICATION);
} }
this.loginWay.setValue(LoginWay.ACCOUNT);
this.passwordVisibility.setValue(false);
} }
public LiveData<AuthenticationState> getAuthenticationState() { public LiveData<AuthenticationState> getAuthenticationState() {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment