完善论坛模块接口

登陆保存令牌
0515
panqihua 5 years ago
parent faa7dc331d
commit e8ac59ea84
  1. 16
      app/build.gradle
  2. 4
      app/src/androidTest/java/com/community/pocket/ExampleInstrumentedTest.java
  3. 4
      app/src/main/assets/config.properties
  4. 26
      app/src/main/java/com/community/pocket/data/dao/TokenDao.java
  5. 3
      app/src/main/java/com/community/pocket/data/login/LoginRequest.java
  6. 7
      app/src/main/java/com/community/pocket/data/main/forum/ForumHotRequest.java
  7. 10
      app/src/main/java/com/community/pocket/data/main/forum/ForumMyRequest.java
  8. 3
      app/src/main/java/com/community/pocket/data/main/forum/ForumNewRequest.java
  9. 8
      app/src/main/java/com/community/pocket/data/main/forum/ForumPostRequest.java
  10. 3
      app/src/main/java/com/community/pocket/data/main/forum/ForumRequest.java
  11. 6
      app/src/main/java/com/community/pocket/data/model/AbstractForumHot.java
  12. 6
      app/src/main/java/com/community/pocket/data/model/Forum.java
  13. 25
      app/src/main/java/com/community/pocket/data/model/ForumHot.java
  14. 14
      app/src/main/java/com/community/pocket/data/model/LocalToken.java
  15. 23
      app/src/main/java/com/community/pocket/data/model/Token.java
  16. 28
      app/src/main/java/com/community/pocket/data/model/UserHot.java
  17. 4
      app/src/main/java/com/community/pocket/data/register/RegisterRequest.java
  18. 7
      app/src/main/java/com/community/pocket/data/resetpwd/ResetPwdRequest.java
  19. 9
      app/src/main/java/com/community/pocket/ui/BaseFragment.java
  20. 99
      app/src/main/java/com/community/pocket/ui/login/LoginActivity.java
  21. 2
      app/src/main/java/com/community/pocket/ui/login/LoginResponse.java
  22. 6
      app/src/main/java/com/community/pocket/ui/login/LoginViewModel.java
  23. 71
      app/src/main/java/com/community/pocket/ui/main/ui/forum/ForumPost.java
  24. 7
      app/src/main/java/com/community/pocket/ui/main/ui/forum/hot/ForumHotFragment.java
  25. 37
      app/src/main/java/com/community/pocket/ui/main/ui/forum/hot/ForumHotResponse.java
  26. 10
      app/src/main/java/com/community/pocket/ui/main/ui/forum/main/ForumFragment.java
  27. 39
      app/src/main/java/com/community/pocket/ui/main/ui/forum/main/ForumNoticeResponse.java
  28. 10
      app/src/main/java/com/community/pocket/ui/main/ui/forum/my/ForumMyFragment.java
  29. 37
      app/src/main/java/com/community/pocket/ui/main/ui/forum/my/ForumMyResponse.java
  30. 10
      app/src/main/java/com/community/pocket/ui/main/ui/forum/news/ForumNewFragment.java
  31. 36
      app/src/main/java/com/community/pocket/ui/main/ui/forum/news/ForumNewResponse.java
  32. 8
      app/src/main/java/com/community/pocket/ui/main/ui/forum/post/ForumPostContent.java
  33. 3
      app/src/main/java/com/community/pocket/ui/main/ui/forum/post/ForumPostResponse.java
  34. 3
      app/src/main/java/com/community/pocket/ui/main/ui/forum/post/QueryUserResponse.java
  35. 4
      app/src/main/java/com/community/pocket/ui/main/ui/info/InfoFragment.java
  36. 8
      app/src/main/java/com/community/pocket/ui/main/ui/share/Response.java
  37. 3
      app/src/main/java/com/community/pocket/ui/main/ui/share/ToastResponse.java
  38. 4
      app/src/main/java/com/community/pocket/ui/resetpwd/ResetPwdStep2.java
  39. 8
      app/src/main/java/com/community/pocket/ui/resetpwd/ResetPwdViewModel.java
  40. 62
      app/src/main/java/com/community/pocket/util/AppDatabase.java
  41. 2
      app/src/main/java/com/community/pocket/util/CustomMessage.java
  42. 4
      app/src/main/java/com/community/pocket/util/HttpResponse.java
  43. 2
      app/src/main/java/com/community/pocket/util/InitApp.java
  44. 6
      app/src/main/res/layout/activity_login.xml
  45. 2
      app/src/main/res/values-en-rUS/strings.xml
  46. 2
      app/src/main/res/values-zh-rCN/strings.xml
  47. 2
      app/src/main/res/values/strings.xml
  48. 7
      app/src/test/java/com/community/pocket/ExampleUnitTest.java

@ -1,5 +1,5 @@
ext { ext {
API_HOST = 'http://localhost:3000/' API_HOST = 'http://192.168.3.132:8080/'
RAP2_API_HOST = 'http://192.168.3.132:38080/app/mock/1' RAP2_API_HOST = 'http://192.168.3.132:38080/app/mock/1'
} }
apply plugin: 'com.android.application' apply plugin: 'com.android.application'
@ -20,7 +20,7 @@ android {
buildTypes { buildTypes {
debug{ debug{
buildConfigField('String','API_HOST',"\""+RAP2_API_HOST+"\"") buildConfigField('String','API_HOST',"\""+API_HOST+"\"")
} }
release { release {
@ -63,12 +63,20 @@ dependencies {
implementation 'com.github.jokar:multi-languages:0.0.8' implementation 'com.github.jokar:multi-languages:0.0.8'
implementation 'org.xutils:xutils:3.8.5' implementation 'org.xutils:xutils:3.8.5'
implementation 'com.squareup.okhttp3:okhttp:4.4.1' implementation 'com.squareup.okhttp3:okhttp:4.5.0'
implementation 'com.wuhenzhizao:titlebar:1.2.0' implementation 'com.wuhenzhizao:titlebar:1.2.0'
implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0' implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
implementation 'androidx.gridlayout:gridlayout:1.0.0' implementation 'androidx.gridlayout:gridlayout:1.0.0'
implementation group: 'com.google.code.gson', name: 'gson', version: '2.8.6' implementation group: 'com.google.code.gson', name: 'gson', version: '2.8.6'
implementation 'org.conscrypt:conscrypt-android:2.2.1' implementation 'org.conscrypt:conscrypt-android:2.4.0'
def room_version = "2.2.3"
implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version" // For Kotlin use kapt instead of annotationProcessor
// Test helpers
testImplementation "androidx.room:room-testing:$room_version"
} }

@ -2,13 +2,13 @@ package com.community.pocket;
import android.content.Context; import android.content.Context;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.platform.app.InstrumentationRegistry;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import static org.junit.Assert.*; import static org.junit.Assert.assertEquals;
/** /**
* Instrumented test, which will execute on an Android device. * Instrumented test, which will execute on an Android device.

@ -9,4 +9,6 @@ title.length=15
#帖子信用分最大值 #帖子信用分最大值
score.max=20 score.max=20
#日期格式 #日期格式
date.pattern=yyyy/MM/dd date.pattern=yyyy/MM/dd
#热榜排行数
rank.num=3

@ -0,0 +1,26 @@
package com.community.pocket.data.dao;
import androidx.room.Dao;
import androidx.room.Delete;
import androidx.room.Insert;
import androidx.room.Query;
import com.community.pocket.data.model.Token;
import java.util.List;
@Dao
public interface TokenDao {
@Query("select * from token")
List<Token> queryAll();
@Query("select * from token where token=:token")
Token query(String token);
@Insert
void save(Token token);
@Delete
void delete(Token user);
}

@ -3,7 +3,6 @@ package com.community.pocket.data.login;
import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.MutableLiveData;
import com.community.pocket.R;
import com.community.pocket.ui.login.LoginResponse; import com.community.pocket.ui.login.LoginResponse;
import com.community.pocket.util.HttpRequest; import com.community.pocket.util.HttpRequest;
import com.community.pocket.util.HttpUtil; import com.community.pocket.util.HttpUtil;
@ -30,7 +29,7 @@ public class LoginRequest {
@HttpRequest("/login") @HttpRequest("/login")
public void login(MutableLiveData<LoginResponse> liveData, String username, String password) { public void login(MutableLiveData<LoginResponse> liveData, String username, String password) {
HttpUtil.getRequest(HttpUtil.Method.POST, new SimpleHttpParse<LoginResponse>(liveData, R.string.register_ok, null).getInterface(LoginResponse.class), HttpUtil.getRequest(HttpUtil.Method.POST, new SimpleHttpParse<LoginResponse>(liveData).getInterface(LoginResponse.class),
new FormBody.Builder() new FormBody.Builder()
.add("username", username) .add("username", username)
.add("password", password) .add("password", password)

@ -2,12 +2,14 @@ package com.community.pocket.data.main.forum;
import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.MutableLiveData;
import com.community.pocket.R;
import com.community.pocket.ui.main.ui.forum.hot.ForumHotResponse; import com.community.pocket.ui.main.ui.forum.hot.ForumHotResponse;
import com.community.pocket.util.HttpRequest; import com.community.pocket.util.HttpRequest;
import com.community.pocket.util.HttpUtil; import com.community.pocket.util.HttpUtil;
import com.community.pocket.util.PropertiesUtil;
import com.community.pocket.util.SimpleHttpParse; import com.community.pocket.util.SimpleHttpParse;
import okhttp3.FormBody;
/** /**
* 热门动态接口请求 * 热门动态接口请求
*/ */
@ -28,6 +30,7 @@ public class ForumHotRequest {
@HttpRequest("/forum/hot") @HttpRequest("/forum/hot")
public void loadHot(MutableLiveData<ForumHotResponse> liveData) { public void loadHot(MutableLiveData<ForumHotResponse> liveData) {
HttpUtil.getRequest(HttpUtil.Method.GET, HttpUtil.getRequest(HttpUtil.Method.GET,
new SimpleHttpParse<ForumHotResponse>(liveData, R.string.load_hot_ok, R.string.load_hot_fail).getInterface(ForumHotResponse.class)); new SimpleHttpParse<ForumHotResponse>(liveData).getInterface(ForumHotResponse.class),
new FormBody.Builder().add("num", PropertiesUtil.getValue("rank.num")).build());
} }
} }

@ -3,12 +3,14 @@ package com.community.pocket.data.main.forum;
import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.MutableLiveData;
import com.community.pocket.R; import com.community.pocket.data.model.LocalToken;
import com.community.pocket.ui.main.ui.forum.my.ForumMyResponse; import com.community.pocket.ui.main.ui.forum.my.ForumMyResponse;
import com.community.pocket.util.HttpRequest; import com.community.pocket.util.HttpRequest;
import com.community.pocket.util.HttpUtil; import com.community.pocket.util.HttpUtil;
import com.community.pocket.util.SimpleHttpParse; import com.community.pocket.util.SimpleHttpParse;
import okhttp3.FormBody;
/** /**
* 我的帖子请求接口 * 我的帖子请求接口
*/ */
@ -31,6 +33,10 @@ public class ForumMyRequest {
@HttpRequest("/forum/my") @HttpRequest("/forum/my")
public void loadForumMy(MutableLiveData<ForumMyResponse> liveData) { public void loadForumMy(MutableLiveData<ForumMyResponse> liveData) {
HttpUtil.getRequest(HttpUtil.Method.GET, HttpUtil.getRequest(HttpUtil.Method.GET,
new SimpleHttpParse<ForumMyResponse>(liveData, R.string.load_forum_my_ok, R.string.load_forum_my_fail).getInterface(ForumMyResponse.class)); new SimpleHttpParse<ForumMyResponse>(liveData).getInterface(ForumMyResponse.class),
new FormBody.Builder()
.add("token", LocalToken.getToken())
.add("username", LocalToken.getUsername())
.build());
} }
} }

@ -2,7 +2,6 @@ package com.community.pocket.data.main.forum;
import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.MutableLiveData;
import com.community.pocket.R;
import com.community.pocket.ui.main.ui.forum.news.ForumNewResponse; import com.community.pocket.ui.main.ui.forum.news.ForumNewResponse;
import com.community.pocket.util.HttpRequest; import com.community.pocket.util.HttpRequest;
import com.community.pocket.util.HttpUtil; import com.community.pocket.util.HttpUtil;
@ -27,6 +26,6 @@ public class ForumNewRequest {
@HttpRequest("/forum/new") @HttpRequest("/forum/new")
public void loadForumNew(MutableLiveData<ForumNewResponse> liveData) { public void loadForumNew(MutableLiveData<ForumNewResponse> liveData) {
HttpUtil.getRequest(HttpUtil.Method.GET, HttpUtil.getRequest(HttpUtil.Method.GET,
new SimpleHttpParse<ForumNewResponse>(liveData, R.string.load_forum_new_ok, R.string.load_forum_new_fail).getInterface(ForumNewResponse.class)); new SimpleHttpParse<ForumNewResponse>(liveData).getInterface(ForumNewResponse.class));
} }
} }

@ -40,6 +40,7 @@ public class ForumPostRequest {
.add("activeEndTime", activeEndTime) .add("activeEndTime", activeEndTime)
.add("activeScore", activeScore) .add("activeScore", activeScore)
.add("token", LocalToken.getToken()) .add("token", LocalToken.getToken())
.add("username", LocalToken.getUsername())
.build()); .build());
} }
@ -53,6 +54,7 @@ public class ForumPostRequest {
.add("content", content) .add("content", content)
.add("complain", complain) .add("complain", complain)
.add("token", LocalToken.getToken()) .add("token", LocalToken.getToken())
.add("username", LocalToken.getUsername())
.build()); .build());
} }
@ -65,6 +67,7 @@ public class ForumPostRequest {
.add("title", title) .add("title", title)
.add("content", content) .add("content", content)
.add("token", LocalToken.getToken()) .add("token", LocalToken.getToken())
.add("username", LocalToken.getUsername())
.build()); .build());
} }
@ -73,6 +76,9 @@ public class ForumPostRequest {
public void searchPeople(MutableLiveData<QueryUserResponse> liveData, String name) { public void searchPeople(MutableLiveData<QueryUserResponse> liveData, String name) {
HttpUtil.getRequest(HttpUtil.Method.GET, HttpUtil.getRequest(HttpUtil.Method.GET,
new SimpleHttpParse<QueryUserResponse>(liveData).getInterface(QueryUserResponse.class), new SimpleHttpParse<QueryUserResponse>(liveData).getInterface(QueryUserResponse.class),
new FormBody.Builder().add("name", name).build()); new FormBody.Builder()
.add("name", name)
.add("username", LocalToken.getUsername())
.build());
} }
} }

@ -2,7 +2,6 @@ package com.community.pocket.data.main.forum;
import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.MutableLiveData;
import com.community.pocket.R;
import com.community.pocket.ui.main.ui.forum.main.ForumNoticeResponse; import com.community.pocket.ui.main.ui.forum.main.ForumNoticeResponse;
import com.community.pocket.util.HttpRequest; import com.community.pocket.util.HttpRequest;
import com.community.pocket.util.HttpUtil; import com.community.pocket.util.HttpUtil;
@ -29,6 +28,6 @@ public class ForumRequest {
public void loadNotices(MutableLiveData<ForumNoticeResponse> liveData) { public void loadNotices(MutableLiveData<ForumNoticeResponse> liveData) {
HttpUtil.getRequest(HttpUtil.Method.GET, HttpUtil.getRequest(HttpUtil.Method.GET,
new SimpleHttpParse<ForumNoticeResponse>(liveData, R.string.load_notice_ok, R.string.load_notice_fail).getInterface(ForumNoticeResponse.class)); new SimpleHttpParse<ForumNoticeResponse>(liveData).getInterface(ForumNoticeResponse.class));
} }
} }

@ -1,5 +1,9 @@
package com.community.pocket.data.model; package com.community.pocket.data.model;
public abstract class AbstractForumHot { public abstract class AbstractForumHot {
abstract int getId(); //排序值
public abstract String orderValue();
//链接值
public abstract String linkValue();
} }

@ -3,7 +3,7 @@ package com.community.pocket.data.model;
//帖子简介内容 //帖子简介内容
public class Forum { public class Forum {
//帖子id //帖子id
private Integer forumId; private String forumId;
//发帖人头像 //发帖人头像
private String headImg; private String headImg;
//发帖人 //发帖人
@ -17,11 +17,11 @@ public class Forum {
//回复数 //回复数
private Integer reply; private Integer reply;
public Integer getForumId() { public String getForumId() {
return forumId; return forumId;
} }
public void setForumId(Integer forumId) { public void setForumId(String forumId) {
this.forumId = forumId; this.forumId = forumId;
} }

@ -7,15 +7,25 @@ import androidx.annotation.NonNull;
*/ */
public class ForumHot extends AbstractForumHot { public class ForumHot extends AbstractForumHot {
//论坛ID //论坛ID
private Integer forumId; private String forumId;
//论坛标题 //论坛标题
private String title; private String title;
//回复数
private Integer reply;
public Integer getForumId() { public Integer getReply() {
return reply;
}
public void setReply(Integer reply) {
this.reply = reply;
}
public String getForumId() {
return forumId; return forumId;
} }
public void setForumId(Integer forumId) { public void setForumId(String forumId) {
this.forumId = forumId; this.forumId = forumId;
} }
@ -34,7 +44,12 @@ public class ForumHot extends AbstractForumHot {
} }
@Override @Override
int getId() { public String orderValue() {
return forumId; return String.valueOf(reply);
}
@Override
public String linkValue() {
return String.valueOf(forumId);
} }
} }

@ -7,9 +7,12 @@ public class LocalToken {
private static volatile LocalToken instance; private static volatile LocalToken instance;
private static volatile Token tokenInstance;
public static LocalToken getInstance(Token token) { public static LocalToken getInstance(Token token) {
if (instance == null) { if (instance == null) {
instance = new LocalToken(token.getToken(), token.getTime(), token.getUsername()); tokenInstance = token;
instance = new LocalToken(tokenInstance.getToken(), tokenInstance.getTime(), tokenInstance.getUsername());
} }
return instance; return instance;
} }
@ -18,6 +21,11 @@ public class LocalToken {
return instance; return instance;
} }
public static void logout() {
instance = null;
tokenInstance = null;
}
private LocalToken(String token, Long time, String username) { private LocalToken(String token, Long time, String username) {
this.token = token; this.token = token;
this.time = time; this.time = time;
@ -35,4 +43,8 @@ public class LocalToken {
public static String getUsername() { public static String getUsername() {
return instance.username; return instance.username;
} }
public static Token getTokenInstance() {
return tokenInstance;
}
} }

@ -1,29 +1,42 @@
package com.community.pocket.data.model; package com.community.pocket.data.model;
import androidx.annotation.NonNull;
import androidx.room.ColumnInfo;
import androidx.room.Entity;
import androidx.room.PrimaryKey;
import org.jetbrains.annotations.NotNull;
/** /**
* 登陆令牌 * 登陆令牌
*/ */
@Entity
public class Token { public class Token {
@PrimaryKey
@NonNull
private String token; private String token;
private long time; @ColumnInfo
private Long time;
@ColumnInfo
private String username; private String username;
String getToken() { @NotNull
public String getToken() {
return token; return token;
} }
public void setToken(String token) { public void setToken(@NotNull String token) {
this.token = token; this.token = token;
} }
public long getTime() { public Long getTime() {
return time; return time;
} }
public void setTime(long time) { public void setTime(Long time) {
this.time = time; this.time = time;
} }

@ -6,18 +6,11 @@ import androidx.annotation.NonNull;
* 活跃用户 * 活跃用户
*/ */
public class UserHot extends AbstractForumHot { public class UserHot extends AbstractForumHot {
//用户ID
private Integer userId;
//用户名 //用户名
private String userName; private String userName;
public Integer getUserId() { //信用分
return userId; private Integer creditScore;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getUserName() { public String getUserName() {
return userName; return userName;
@ -27,6 +20,14 @@ public class UserHot extends AbstractForumHot {
this.userName = userName; this.userName = userName;
} }
public Integer getCreditScore() {
return creditScore;
}
public void setCreditScore(Integer creditScore) {
this.creditScore = creditScore;
}
@NonNull @NonNull
@Override @Override
public String toString() { public String toString() {
@ -34,7 +35,12 @@ public class UserHot extends AbstractForumHot {
} }
@Override @Override
int getId() { public String orderValue() {
return userId; return String.valueOf(creditScore);
}
@Override
public String linkValue() {
return userName;
} }
} }

@ -26,12 +26,12 @@ public class RegisterRequest {
} }
@HttpRequest("/register") @HttpRequest("/register")
public void register(MutableLiveData<RegisterResponse> liveData, String username, String password, String mobilePhone, String email) { public void register(MutableLiveData<RegisterResponse> liveData, String username, String password, String mobie, String email) {
HttpUtil.getRequest(HttpUtil.Method.POST, new SimpleHttpParse<RegisterResponse>(liveData).getInterface(RegisterResponse.class), HttpUtil.getRequest(HttpUtil.Method.POST, new SimpleHttpParse<RegisterResponse>(liveData).getInterface(RegisterResponse.class),
new FormBody.Builder() new FormBody.Builder()
.add("username", username) .add("username", username)
.add("password", password) .add("password", password)
.add("mobilePhone", mobilePhone) .add("mobie", mobie)
.add("email", email) .add("email", email)
.build()); .build());
} }

@ -42,10 +42,9 @@ public class ResetPwdRequest {
* 发送验证码 * 发送验证码
*/ */
@HttpRequest("/resetpwd/sendCode") @HttpRequest("/resetpwd/sendCode")
public void sendCode(MutableLiveData<ResetPwdResponse> liveData, String username, String email) { public void sendCode(MutableLiveData<ResetPwdResponse> liveData, String email) {
HttpUtil.getRequest(HttpUtil.Method.POST, new SimpleHttpParse<ResetPwdResponse>(liveData).getInterface(ResetPwdResponse.class), HttpUtil.getRequest(HttpUtil.Method.POST, new SimpleHttpParse<ResetPwdResponse>(liveData).getInterface(ResetPwdResponse.class),
new FormBody.Builder() new FormBody.Builder()
.add("username", username)
.add("email", email) .add("email", email)
.build()); .build());
} }
@ -54,10 +53,10 @@ public class ResetPwdRequest {
* 检查验证码 * 检查验证码
*/ */
@HttpRequest("/resetpwd/checkCode") @HttpRequest("/resetpwd/checkCode")
public void checkCode(MutableLiveData<ResetPwdResponse> liveData, String username, String code) { public void checkCode(MutableLiveData<ResetPwdResponse> liveData, String email, String code) {
HttpUtil.getRequest(HttpUtil.Method.POST, new SimpleHttpParse<ResetPwdResponse>(liveData).getInterface(ResetPwdResponse.class), HttpUtil.getRequest(HttpUtil.Method.POST, new SimpleHttpParse<ResetPwdResponse>(liveData).getInterface(ResetPwdResponse.class),
new FormBody.Builder() new FormBody.Builder()
.add("username", username) .add("email", email)
.add("code", code) .add("code", code)
.build()); .build());
} }

@ -9,6 +9,10 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import com.community.pocket.R;
import com.community.pocket.ui.main.ui.share.ToastResponse;
import com.community.pocket.util.CustomMessage;
import org.xutils.x; import org.xutils.x;
/** /**
@ -26,6 +30,11 @@ public abstract class BaseFragment extends Fragment {
return getParentFragment(level, null); return getParentFragment(level, null);
} }
//校验token失败跳转到登陆页
protected <E extends CustomMessage, T extends ToastResponse<E>> boolean invalidToken(T t) {
return t.getMessage() != null && t.getMessage().getMsg() == R.string.invalid_token;
}
//获取父级Fragment //获取父级Fragment
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
private <T extends Fragment> T getParentFragment(int level, Fragment fragment) { private <T extends Fragment> T getParentFragment(int level, Fragment fragment) {

@ -13,23 +13,36 @@ import android.widget.ProgressBar;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi; import androidx.annotation.RequiresApi;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.lifecycle.Observer; import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider; import androidx.lifecycle.ViewModelProvider;
import com.community.pocket.R; import com.community.pocket.R;
import com.community.pocket.data.model.LocalToken; import com.community.pocket.data.model.LocalToken;
import com.community.pocket.data.model.Token;
import com.community.pocket.ui.BaseActivity; import com.community.pocket.ui.BaseActivity;
import com.community.pocket.ui.listener.MyTextChange; import com.community.pocket.ui.listener.MyTextChange;
import com.community.pocket.ui.main.MainMenu; import com.community.pocket.ui.main.MainMenu;
import com.community.pocket.ui.main.ui.share.Response; import com.community.pocket.ui.main.ui.share.Response;
import com.community.pocket.ui.register.RegisterActivity; import com.community.pocket.ui.register.RegisterActivity;
import com.community.pocket.ui.resetpwd.ResetPwdActivity; import com.community.pocket.ui.resetpwd.ResetPwdActivity;
import com.community.pocket.util.AppDatabase;
import com.community.pocket.util.HttpParse;
import com.community.pocket.util.HttpRequest;
import com.community.pocket.util.HttpResponse;
import com.community.pocket.util.HttpUtil;
import com.community.pocket.util.PropertiesUtil; import com.community.pocket.util.PropertiesUtil;
import org.jetbrains.annotations.NotNull;
import org.xutils.view.annotation.ContentView; import org.xutils.view.annotation.ContentView;
import org.xutils.view.annotation.Event; import org.xutils.view.annotation.Event;
import org.xutils.view.annotation.ViewInject; import org.xutils.view.annotation.ViewInject;
import java.util.List;
import okhttp3.Call;
import okhttp3.FormBody;
/** /**
* 登陆 * 登陆
*/ */
@ -39,6 +52,8 @@ public class LoginActivity extends BaseActivity {
private LoginViewModel loginViewModel; private LoginViewModel loginViewModel;
private static AppDatabase sInstance;
//用户名 //用户名
@ViewInject(R.id.username) @ViewInject(R.id.username)
private EditText usernameEditText; private EditText usernameEditText;
@ -55,12 +70,56 @@ public class LoginActivity extends BaseActivity {
@ViewInject(R.id.loading) @ViewInject(R.id.loading)
private ProgressBar loadingProgressBar; private ProgressBar loadingProgressBar;
@ViewInject(R.id.login_layout)
private ConstraintLayout layout;
/**
* 保存令牌到数据库并跳转到主界面
*/
private void saveTokenToDB(@NotNull final LoginResponse response) {
new Thread(new Runnable() {
@Override
public void run() {
Token token = response.getToken();
sInstance.tokenDao().save(token);
saveToken(response);
}
}).start();
}
/**
* 保存令牌到缓存
*/
private void saveToken(LoginResponse response) {
Token token = response.getToken();
LocalToken.getInstance(token);
startActivity(new Intent(getBaseContext(), MainMenu.class));
response.toast(getBaseContext());
//Complete and destroy login activity once successful
finish();
}
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
loginViewModel = new ViewModelProvider(this, new ViewModelProvider.NewInstanceFactory()).get(LoginViewModel.class); loginViewModel = new ViewModelProvider(this, new ViewModelProvider.NewInstanceFactory()).get(LoginViewModel.class);
//后台检查token
hasOnlyUserToken();
//监听token校验状态
loginViewModel.getCheckToken().observe(this, new Observer<LoginResponse>() {
@Override
public void onChanged(LoginResponse loginResponse) {
if (loginResponse.getResult() == com.community.pocket.ui.main.ui.share.Response.Result.OK) {
saveToken(loginResponse);
} else {
layout.setVisibility(View.VISIBLE);
}
}
});
//监听数据校验状态 //监听数据校验状态
loginViewModel.getLoginFormState().observe(this, new Observer<LoginFormState>() { loginViewModel.getLoginFormState().observe(this, new Observer<LoginFormState>() {
@Override @Override
@ -88,14 +147,8 @@ public class LoginActivity extends BaseActivity {
loadingProgressBar.setVisibility(View.GONE); loadingProgressBar.setVisibility(View.GONE);
setResult(Activity.RESULT_OK); setResult(Activity.RESULT_OK);
loginResponse.toast(getBaseContext());
if (loginResponse.getResult() == Response.Result.OK) { if (loginResponse.getResult() == Response.Result.OK) {
saveTokenToDB(loginResponse);
LocalToken.getInstance(loginResponse.getToken());
startActivity(new Intent(getBaseContext(), MainMenu.class));
//Complete and destroy login activity once successful
finish();
} }
} }
}); });
@ -115,6 +168,38 @@ public class LoginActivity extends BaseActivity {
passwordEditText.addTextChangedListener(afterTextChangedListener); passwordEditText.addTextChangedListener(afterTextChangedListener);
} }
/**
* 查询本地是否有且只有一个用户token如果有则自动登录
*/
public void hasOnlyUserToken() {
new Thread(new Runnable() {
@Override
@HttpRequest("/login/token")
public void run() {
sInstance = AppDatabase.getInstance(getApplicationContext());
List<Token> tokenList = sInstance.tokenDao().queryAll();
if (tokenList != null && tokenList.size() == 1) {
Token currentToken = tokenList.get(0);
HttpUtil.getRequest(HttpUtil.Method.POST, new HttpResponse<>(LoginResponse.class, new HttpParse<LoginResponse>() {
@Override
public void onParseOk(@NotNull Call call, @NotNull okhttp3.Response response, LoginResponse loginResponse) {
loginViewModel.getCheckToken().postValue(loginResponse);
}
}),
new FormBody.Builder()
.add("token", currentToken.getToken())
.build()
);
} else {
loginViewModel.getCheckToken().postValue(new LoginResponse());
}
}
}).start();
}
//登录按钮触发登录请求操作 //登录按钮触发登录请求操作
@RequiresApi(api = Build.VERSION_CODES.N) @RequiresApi(api = Build.VERSION_CODES.N)
@Event(value = R.id.login) @Event(value = R.id.login)

@ -15,7 +15,7 @@ import org.jetbrains.annotations.NotNull;
public class LoginResponse extends ToastResponse<LoginResponse.Msg> { public class LoginResponse extends ToastResponse<LoginResponse.Msg> {
private Token token; private Token token;
Token getToken() { public Token getToken() {
return token; return token;
} }

@ -17,6 +17,8 @@ public class LoginViewModel extends BaseViewModel<LoginRequest> {
private MutableLiveData<LoginFormState> loginFormState = new MutableLiveData<>(); private MutableLiveData<LoginFormState> loginFormState = new MutableLiveData<>();
//登陆结果 //登陆结果
private MutableLiveData<LoginResponse> loginResult = new MutableLiveData<>(); private MutableLiveData<LoginResponse> loginResult = new MutableLiveData<>();
//检查token结果
private MutableLiveData<LoginResponse> checkToken = new MutableLiveData<>();
LiveData<LoginFormState> getLoginFormState() { LiveData<LoginFormState> getLoginFormState() {
return loginFormState; return loginFormState;
@ -26,6 +28,10 @@ public class LoginViewModel extends BaseViewModel<LoginRequest> {
return loginResult; return loginResult;
} }
public MutableLiveData<LoginResponse> getCheckToken() {
return checkToken;
}
//登陆 //登陆
public void login(String username, String password) { public void login(String username, String password) {
getRequest().login(loginResult, username, password); getRequest().login(loginResult, username, password);

@ -7,6 +7,7 @@ import android.view.ViewGroup;
import android.widget.Button; import android.widget.Button;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast;
import com.community.pocket.R; import com.community.pocket.R;
import com.community.pocket.data.model.Forum; import com.community.pocket.data.model.Forum;
@ -32,39 +33,43 @@ public abstract class ForumPost extends BaseFragment {
*/ */
protected void loadPost(List<Forum> forumList) { protected void loadPost(List<Forum> forumList) {
for (int i = 0; i < forumList.size(); i++) { if (forumList.isEmpty()) {
Forum forum = forumList.get(i); Toast.makeText(getContext(), R.string.no_more_forum, Toast.LENGTH_LONG).show();
} else {
View childView = View.inflate(getContext(), R.layout.post, null); for (int i = 0; i < forumList.size(); i++) {
TextView title = childView.findViewById(R.id.post_title); Forum forum = forumList.get(i);
title.setText(forum.getTitle());
TextView content = childView.findViewById(R.id.post_content); View childView = View.inflate(getContext(), R.layout.post, null);
content.setText(forum.getContent()); TextView title = childView.findViewById(R.id.post_title);
TextView author = childView.findViewById(R.id.poster); title.setText(forum.getTitle());
author.setVisibility(own()); TextView content = childView.findViewById(R.id.post_content);
author.setText(getString(R.string.poster, forum.getUsername())); content.setText(forum.getContent());
TextView author = childView.findViewById(R.id.poster);
TextView postReply = childView.findViewById(R.id.post_reply); author.setVisibility(own());
postReply.setText(getString(R.string.post_reply, forum.getReply())); author.setText(getString(R.string.poster, forum.getUsername()));
TextView time = childView.findViewById(R.id.post_time);
time.setText(getString(R.string.post_time, DateFormat.format(getString(R.string.dateformat), forum.getTime()))); TextView postReply = childView.findViewById(R.id.post_reply);
ViewGroup.MarginLayoutParams layoutParams = new ViewGroup.MarginLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); postReply.setText(getString(R.string.post_reply, forum.getReply()));
layoutParams.setMargins(0, 0, 0, 50); TextView time = childView.findViewById(R.id.post_time);
childView.setLayoutParams(layoutParams); time.setText(getString(R.string.post_time, DateFormat.format(getString(R.string.dateformat), forum.getTime())));
ViewGroup.MarginLayoutParams layoutParams = new ViewGroup.MarginLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
layoutParams.setMargins(0, 0, 0, 50);
//打开帖子 childView.setLayoutParams(layoutParams);
Button button = childView.findViewById(R.id.showAll);
button.setOnClickListener(new View.OnClickListener() {
@Override //打开帖子
public void onClick(View v) { Button button = childView.findViewById(R.id.showAll);
Intent intent = new Intent(getContext(), ForumDataActivity.class); button.setOnClickListener(new View.OnClickListener() {
intent.putExtra(Param.forumId.name(), 1); @Override
startActivity(intent); public void onClick(View v) {
} Intent intent = new Intent(getContext(), ForumDataActivity.class);
}); intent.putExtra(Param.forumId.name(), 1);
startActivity(intent);
layout.addView(childView); }
});
layout.addView(childView);
}
} }
} }
} }

@ -18,6 +18,7 @@ import com.community.pocket.R;
import com.community.pocket.data.model.AbstractForumHot; import com.community.pocket.data.model.AbstractForumHot;
import com.community.pocket.data.model.Hot; import com.community.pocket.data.model.Hot;
import com.community.pocket.ui.BaseFragment; import com.community.pocket.ui.BaseFragment;
import com.community.pocket.ui.main.ui.share.Response;
import org.xutils.view.annotation.ContentView; import org.xutils.view.annotation.ContentView;
@ -46,8 +47,10 @@ public class ForumHotFragment extends BaseFragment {
return; return;
} }
if (forumHotResponse.getSuccess() != null) { forumHotResponse.toast(getContext());
loadRank(forumHotResponse.getBody());
if (forumHotResponse.getResult() == Response.Result.OK) {
loadRank(forumHotResponse.getHot());
} }
} }
}); });

@ -1,7 +1,40 @@
package com.community.pocket.ui.main.ui.forum.hot; package com.community.pocket.ui.main.ui.forum.hot;
import com.community.pocket.R;
import com.community.pocket.data.model.Hot; import com.community.pocket.data.model.Hot;
import com.community.pocket.ui.main.ui.share.Response; import com.community.pocket.ui.main.ui.share.ToastResponse;
import com.community.pocket.util.CustomMessage;
public class ForumHotResponse extends Response<Hot> { import org.jetbrains.annotations.NotNull;
/**
* 热榜信息响应体
*/
public class ForumHotResponse extends ToastResponse<ForumHotResponse.Msg> {
private Hot hot;
public Hot getHot() {
return hot;
}
public void setHot(Hot hot) {
this.hot = hot;
}
enum Msg implements CustomMessage {
ok(R.string.load_hot_ok),
fail(R.string.load_hot_fail);
private Integer msg;
Msg(Integer msg) {
this.msg = msg;
}
@NotNull
@Override
public Integer getMsg() {
return msg;
}
}
} }

@ -4,7 +4,6 @@ import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.view.View; import android.view.View;
import android.widget.Button; import android.widget.Button;
import android.widget.Toast;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
@ -18,6 +17,7 @@ import com.community.pocket.R;
import com.community.pocket.data.adapter.NoticeAdpter; import com.community.pocket.data.adapter.NoticeAdpter;
import com.community.pocket.data.model.Notice; import com.community.pocket.data.model.Notice;
import com.community.pocket.ui.main.MainFragment; import com.community.pocket.ui.main.MainFragment;
import com.community.pocket.ui.main.ui.share.Response;
import org.xutils.view.annotation.ContentView; import org.xutils.view.annotation.ContentView;
import org.xutils.view.annotation.Event; import org.xutils.view.annotation.Event;
@ -64,12 +64,10 @@ public class ForumFragment extends MainFragment {
return; return;
} }
if (forumNoticeResponse.getSuccess() != null) { forumNoticeResponse.toast(getContext());
initNotice(forumNoticeResponse.getBody());
}
if (forumNoticeResponse.getError() != null) { if (forumNoticeResponse.getResult() == Response.Result.OK) {
Toast.makeText(getContext(), R.string.load_notice_fail, Toast.LENGTH_SHORT).show(); initNotice(forumNoticeResponse.getNoticeList());
} }
} }
}); });

@ -1,10 +1,45 @@
package com.community.pocket.ui.main.ui.forum.main; package com.community.pocket.ui.main.ui.forum.main;
import androidx.annotation.StringRes;
import com.community.pocket.R;
import com.community.pocket.data.model.Notice; import com.community.pocket.data.model.Notice;
import com.community.pocket.ui.main.ui.share.Response; import com.community.pocket.ui.main.ui.share.ToastResponse;
import com.community.pocket.util.CustomMessage;
import org.jetbrains.annotations.NotNull;
import java.util.List; import java.util.List;
public class ForumNoticeResponse extends Response<List<Notice>> { /**
* 公告信息响应体
*/
public class ForumNoticeResponse extends ToastResponse<ForumNoticeResponse.Msg> {
private List<Notice> noticeList;
enum Msg implements CustomMessage {
ok(R.string.load_notice_ok),
fail(R.string.load_notice_fail);
private Integer msg;
Msg(@StringRes Integer msg) {
this.msg = msg;
}
@NotNull
@Override
public Integer getMsg() {
return msg;
}
}
public List<Notice> getNoticeList() {
return noticeList;
}
public void setNoticeList(List<Notice> noticeList) {
this.noticeList = noticeList;
}
} }

@ -2,7 +2,6 @@ package com.community.pocket.ui.main.ui.forum.my;
import android.os.Bundle; import android.os.Bundle;
import android.view.View; import android.view.View;
import android.widget.Toast;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
@ -11,6 +10,7 @@ import androidx.lifecycle.ViewModelProvider;
import com.community.pocket.R; import com.community.pocket.R;
import com.community.pocket.ui.main.ui.forum.ForumPost; import com.community.pocket.ui.main.ui.forum.ForumPost;
import com.community.pocket.ui.main.ui.share.Response;
import org.xutils.view.annotation.ContentView; import org.xutils.view.annotation.ContentView;
@ -36,12 +36,10 @@ public class ForumMyFragment extends ForumPost {
return; return;
} }
if (forumMyResponse.getSuccess() != null) { forumMyResponse.toast(getContext());
loadPost(forumMyResponse.getBody());
}
if (forumMyResponse.getError() != null) { if (forumMyResponse.getResult() == Response.Result.OK) {
Toast.makeText(getContext(), forumMyResponse.getError(), Toast.LENGTH_SHORT).show(); loadPost(forumMyResponse.getForumList());
} }
} }
}); });

@ -1,9 +1,42 @@
package com.community.pocket.ui.main.ui.forum.my; package com.community.pocket.ui.main.ui.forum.my;
import androidx.annotation.StringRes;
import com.community.pocket.R;
import com.community.pocket.data.model.Forum; import com.community.pocket.data.model.Forum;
import com.community.pocket.ui.main.ui.share.Response; import com.community.pocket.ui.main.ui.share.ToastResponse;
import com.community.pocket.util.CustomMessage;
import org.jetbrains.annotations.NotNull;
import java.util.List; import java.util.List;
public class ForumMyResponse extends Response<List<Forum>> { public class ForumMyResponse extends ToastResponse<ForumMyResponse.Msg> {
private List<Forum> forumList;
public List<Forum> getForumList() {
return forumList;
}
public void setForumList(List<Forum> forumList) {
this.forumList = forumList;
}
enum Msg implements CustomMessage {
ok(R.string.load_forum_my_ok),
fail(R.string.load_forum_my_fail),
token(R.string.invalid_token);
private Integer msg;
Msg(@StringRes Integer msg) {
this.msg = msg;
}
@NotNull
@Override
public Integer getMsg() {
return msg;
}
}
} }

@ -2,7 +2,6 @@ package com.community.pocket.ui.main.ui.forum.news;
import android.os.Bundle; import android.os.Bundle;
import android.view.View; import android.view.View;
import android.widget.Toast;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
@ -11,6 +10,7 @@ import androidx.lifecycle.ViewModelProvider;
import com.community.pocket.R; import com.community.pocket.R;
import com.community.pocket.ui.main.ui.forum.ForumPost; import com.community.pocket.ui.main.ui.forum.ForumPost;
import com.community.pocket.ui.main.ui.share.Response;
import org.xutils.view.annotation.ContentView; import org.xutils.view.annotation.ContentView;
@ -36,12 +36,10 @@ public class ForumNewFragment extends ForumPost {
return; return;
} }
if (forumNewResponse.getSuccess() != null) { forumNewResponse.toast(getContext());
loadPost(forumNewResponse.getBody());
}
if (forumNewResponse.getError() != null) { if (forumNewResponse.getResult() == Response.Result.OK) {
Toast.makeText(getContext(), forumNewResponse.getError(), Toast.LENGTH_SHORT).show(); loadPost(forumNewResponse.getForumList());
} }
} }
}); });

@ -1,13 +1,45 @@
package com.community.pocket.ui.main.ui.forum.news; package com.community.pocket.ui.main.ui.forum.news;
import androidx.annotation.StringRes;
import com.community.pocket.R;
import com.community.pocket.data.model.Forum; import com.community.pocket.data.model.Forum;
import com.community.pocket.ui.main.ui.share.Response; import com.community.pocket.ui.main.ui.share.ToastResponse;
import com.community.pocket.util.CustomMessage;
import org.jetbrains.annotations.NotNull;
import java.util.List; import java.util.List;
/** /**
* 最新帖子响应实体 * 最新帖子响应实体
*/ */
public class ForumNewResponse extends Response<List<Forum>> { public class ForumNewResponse extends ToastResponse<ForumNewResponse.Msg> {
private List<Forum> forumList;
enum Msg implements CustomMessage {
ok(R.string.load_forum_new_ok),
fail(R.string.load_forum_new_fail);
private Integer msg;
Msg(@StringRes Integer msg) {
this.msg = msg;
}
@NotNull
@Override
public Integer getMsg() {
return msg;
}
}
public List<Forum> getForumList() {
return forumList;
}
public void setForumList(List<Forum> forumList) {
this.forumList = forumList;
}
} }

@ -1,5 +1,6 @@
package com.community.pocket.ui.main.ui.forum.post; package com.community.pocket.ui.main.ui.forum.post;
import android.content.Intent;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.view.View; import android.view.View;
@ -13,7 +14,9 @@ import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.lifecycle.Observer; import androidx.lifecycle.Observer;
import com.community.pocket.R; import com.community.pocket.R;
import com.community.pocket.data.model.LocalToken;
import com.community.pocket.ui.BaseFragment; import com.community.pocket.ui.BaseFragment;
import com.community.pocket.ui.login.LoginActivity;
import com.community.pocket.ui.main.ui.forum.main.ForumFragment; import com.community.pocket.ui.main.ui.forum.main.ForumFragment;
import com.community.pocket.ui.main.ui.share.Response; import com.community.pocket.ui.main.ui.share.Response;
import com.community.pocket.ui.main.ui.share.ShowWordCount; import com.community.pocket.ui.main.ui.share.ShowWordCount;
@ -75,6 +78,11 @@ abstract class ForumPostContent extends BaseFragment {
return; return;
} }
if (invalidToken(forumPostResponse)) {
LocalToken.logout();
startActivity(new Intent(getContext(), LoginActivity.class));
return;
}
forumPostResponse.toast(getContext()); forumPostResponse.toast(getContext());
if (forumPostResponse.getResult() == Response.Result.OK) { if (forumPostResponse.getResult() == Response.Result.OK) {

@ -16,7 +16,8 @@ public class ForumPostResponse extends ToastResponse<ForumPostResponse.Msg> {
enum Msg implements CustomMessage { enum Msg implements CustomMessage {
ok(R.string.forum_post_ok), ok(R.string.forum_post_ok),
fail(R.string.forum_post_fail); fail(R.string.forum_post_fail),
token(R.string.invalid_token);
private Integer msg; private Integer msg;
Msg(@StringRes Integer msg) { Msg(@StringRes Integer msg) {

@ -27,7 +27,8 @@ public class QueryUserResponse extends ToastResponse<QueryUserResponse.Msg> {
} }
enum Msg implements CustomMessage { enum Msg implements CustomMessage {
ok(R.string.search_complain_name); ok(R.string.forum_search_people_ok),
fail(R.string.forum_search_people_fail);
private Integer msg; private Integer msg;
Msg(@StringRes Integer msg) { Msg(@StringRes Integer msg) {

@ -22,11 +22,13 @@ import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider; import androidx.lifecycle.ViewModelProvider;
import com.community.pocket.R; import com.community.pocket.R;
import com.community.pocket.data.model.LocalToken;
import com.community.pocket.data.model.MyInfo; import com.community.pocket.data.model.MyInfo;
import com.community.pocket.ui.BaseFragment; import com.community.pocket.ui.BaseFragment;
import com.community.pocket.ui.listener.MyTextChange; import com.community.pocket.ui.listener.MyTextChange;
import com.community.pocket.ui.login.LoginActivity; import com.community.pocket.ui.login.LoginActivity;
import com.community.pocket.ui.main.ui.share.Response; import com.community.pocket.ui.main.ui.share.Response;
import com.community.pocket.util.AppDatabase;
import com.community.pocket.util.PropertiesUtil; import com.community.pocket.util.PropertiesUtil;
import com.github.mikephil.charting.charts.LineChart; import com.github.mikephil.charting.charts.LineChart;
import com.github.mikephil.charting.data.Entry; import com.github.mikephil.charting.data.Entry;
@ -259,6 +261,8 @@ public class InfoFragment extends BaseFragment {
@RequiresApi(api = Build.VERSION_CODES.KITKAT) @RequiresApi(api = Build.VERSION_CODES.KITKAT)
@Event(value = R.id.logout) @Event(value = R.id.logout)
private void logout(View view) { private void logout(View view) {
AppDatabase.getInstance(getContext()).tokenDao().delete(LocalToken.getTokenInstance());
LocalToken.logout();
startActivity(new Intent(view.getContext(), LoginActivity.class)); startActivity(new Intent(view.getContext(), LoginActivity.class));
} }

@ -3,12 +3,10 @@ package com.community.pocket.ui.main.ui.share;
import android.content.Context; import android.content.Context;
import android.widget.Toast; import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.annotation.StringRes; import androidx.annotation.StringRes;
import com.community.pocket.R; import com.community.pocket.R;
import com.google.gson.Gson;
/** /**
* 响应体父类 * 响应体父类
@ -118,10 +116,4 @@ public abstract class Response<T> {
OK, OK,
FAIL FAIL
} }
@NonNull
@Override
public String toString() {
return new Gson().toJson(body);
}
} }

@ -19,10 +19,9 @@ public abstract class ToastResponse<T extends CustomMessage> extends Response<T>
// TODO 废弃 // TODO 废弃
public void toast(Context context) { public void toast(Context context) {
if (getMessage() != null) { if (getMessage() != null) {
Toast.makeText(context, context.getString(getMessage().getMsg(), getArgs()), Toast.LENGTH_LONG).show(); Toast.makeText(context, context.getString(getMessage().getMsg(), getArgs()), getResult() == Result.OK ? Toast.LENGTH_SHORT : Toast.LENGTH_LONG).show();
} else { } else {
Toast.makeText(context, R.string.unknow_error, Toast.LENGTH_LONG).show(); Toast.makeText(context, R.string.unknow_error, Toast.LENGTH_LONG).show();
} }
} }
} }

@ -136,7 +136,7 @@ public class ResetPwdStep2 extends BaseFragment {
*/ */
@Event(value = R.id.next) @Event(value = R.id.next)
private void next(View view) { private void next(View view) {
resetPwdViewModel.checkCode(username.getText().toString(), code.getText().toString()); resetPwdViewModel.checkCode(email.getText().toString(), code.getText().toString());
} }
/** /**
@ -144,6 +144,6 @@ public class ResetPwdStep2 extends BaseFragment {
*/ */
@Event(value = R.id.sendcode) @Event(value = R.id.sendcode)
private void sendCode(View view) { private void sendCode(View view) {
resetPwdViewModel.sendCode(username.getText().toString(), email.getText().toString()); resetPwdViewModel.sendCode(email.getText().toString());
} }
} }

@ -62,13 +62,13 @@ public class ResetPwdViewModel extends BaseViewModel<ResetPwdRequest> {
} }
//重置密码第二步 //重置密码第二步
void sendCode(String username, String email) { void sendCode(String email) {
getRequest().sendCode(sendCodeResponse, username, email); getRequest().sendCode(sendCodeResponse, email);
} }
//重置密码第二步 //重置密码第二步
void checkCode(String username, String code) { void checkCode(String email, String code) {
getRequest().checkCode(checkCodeResponse, username, code); getRequest().checkCode(checkCodeResponse, email, code);
} }
//重置密码第三步 //重置密码第三步

@ -0,0 +1,62 @@
package com.community.pocket.util;
import android.content.Context;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.room.Database;
import androidx.room.Room;
import androidx.room.RoomDatabase;
import com.community.pocket.data.dao.TokenDao;
import com.community.pocket.data.model.Token;
@Database(entities = {Token.class}, version = 1, exportSchema = false)
public abstract class AppDatabase extends RoomDatabase {
public abstract TokenDao tokenDao();
private static AppDatabase sInstance;
public static final String DATABASE_NAME = "basic-sample-db";
private final MutableLiveData<Boolean> mIsDatabaseCreated = new MutableLiveData<>();
public static AppDatabase getInstance(Context context) {
if (sInstance == null) {
synchronized (AppDatabase.class) {
if (sInstance == null) {
sInstance = buildDatabase(context.getApplicationContext());
sInstance.updateDatabaseCreated(context.getApplicationContext());
}
}
}
return sInstance;
}
/**
* Build the database. {@link Builder#build()} only sets up the database configuration and
* creates a new instance of the database.
* The SQLite database is only created when it's accessed for the first time.
*/
private static AppDatabase buildDatabase(Context appContext) {
return Room.databaseBuilder(appContext, AppDatabase.class, DATABASE_NAME)
.build();
}
/**
* Check whether the database already exists and expose it via {@link #getDatabaseCreated()}
*/
private void updateDatabaseCreated(final Context context) {
if (context.getDatabasePath(DATABASE_NAME).exists()) {
setDatabaseCreated();
}
}
private void setDatabaseCreated() {
mIsDatabaseCreated.postValue(true);
}
public LiveData<Boolean> getDatabaseCreated() {
return mIsDatabaseCreated;
}
}

@ -11,4 +11,6 @@ public interface CustomMessage {
@StringRes @StringRes
@NotNull @NotNull
Integer getMsg(); Integer getMsg();
} }

@ -27,7 +27,7 @@ public class HttpResponse<T extends com.community.pocket.ui.main.ui.share.Respon
private static final String header = "Content-Type"; private static final String header = "Content-Type";
HttpResponse(Class<T> tClass, HttpParse<T> httpParse) { public HttpResponse(Class<T> tClass, HttpParse<T> httpParse) {
this.tClass = tClass; this.tClass = tClass;
this.httpParse = httpParse; this.httpParse = httpParse;
} }
@ -41,7 +41,7 @@ public class HttpResponse<T extends com.community.pocket.ui.main.ui.share.Respon
@Override @Override
public void onResponse(@NotNull Call call, @NotNull Response response) { public void onResponse(@NotNull Call call, @NotNull Response response) {
String contentType = response.header(header); String contentType = response.header(header);
if (contentType != null && contentType.contains("application/json")) { if (contentType != null && contentType.contains("json")) {
ResponseBody body = response.body(); ResponseBody body = response.body();
if (body != null) { if (body != null) {
Gson gson = new Gson(); Gson gson = new Gson();

@ -16,6 +16,7 @@ import java.util.Locale;
* 应用启动初始化 * 应用启动初始化
*/ */
public class InitApp extends Application { public class InitApp extends Application {
@Override @Override
public void onCreate() { public void onCreate() {
super.onCreate(); super.onCreate();
@ -46,5 +47,4 @@ public class InitApp extends Application {
LocalManageUtil.saveSystemCurrentLanguage(getApplicationContext(), newConfig); LocalManageUtil.saveSystemCurrentLanguage(getApplicationContext(), newConfig);
MultiLanguage.onConfigurationChanged(getApplicationContext()); MultiLanguage.onConfigurationChanged(getApplicationContext());
} }
} }

@ -14,9 +14,11 @@
android:layout_height="wrap_content" /> android:layout_height="wrap_content" />
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/login_layout"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
@ -28,8 +30,8 @@
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:importantForAutofill="no"
android:hint="@string/prompt_user" android:hint="@string/prompt_user"
android:importantForAutofill="no"
android:inputType="text" android:inputType="text"
android:selectAllOnFocus="true" android:selectAllOnFocus="true"
app:layout_constraintEnd_toStartOf="@id/login_to_resetPwd" app:layout_constraintEnd_toStartOf="@id/login_to_resetPwd"
@ -43,9 +45,9 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="8dp" android:layout_marginTop="8dp"
android:importantForAutofill="no"
android:hint="@string/prompt_password" android:hint="@string/prompt_password"
android:imeActionLabel="@string/action_sign_in_short" android:imeActionLabel="@string/action_sign_in_short"
android:importantForAutofill="no"
android:inputType="textPassword" android:inputType="textPassword"
android:selectAllOnFocus="true" android:selectAllOnFocus="true"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"

@ -167,4 +167,6 @@
<string name="unknow_error">unknow error</string> <string name="unknow_error">unknow error</string>
<string name="login_fail">login fail</string> <string name="login_fail">login fail</string>
<string name="invalid_date_before">start date must be before end date</string> <string name="invalid_date_before">start date must be before end date</string>
<string name="invalid_token">token error,please login</string>
<string name="no_more_forum">no more forum</string>
</resources> </resources>

@ -167,4 +167,6 @@
<string name="unknow_error">未知错误,请联系管理员</string> <string name="unknow_error">未知错误,请联系管理员</string>
<string name="login_fail">登陆失败,账号或密码错误</string> <string name="login_fail">登陆失败,账号或密码错误</string>
<string name="invalid_date_before">开始日期必须小于结束日期</string> <string name="invalid_date_before">开始日期必须小于结束日期</string>
<string name="invalid_token">身份有效期已过,请重新登录</string>
<string name="no_more_forum">没有更多帖子</string>
</resources> </resources>

@ -168,6 +168,8 @@
<string name="unknow_error">unknow error</string> <string name="unknow_error">unknow error</string>
<string name="login_fail">login fail</string> <string name="login_fail">login fail</string>
<string name="invalid_date_before">start date must be before end date</string> <string name="invalid_date_before">start date must be before end date</string>
<string name="invalid_token">token error,please login</string>
<string name="no_more_forum">no more forum</string>
<!-- Strings used for fragments for navigation --> <!-- Strings used for fragments for navigation -->
<!-- Strings used for fragments for navigation --> <!-- Strings used for fragments for navigation -->

@ -14,11 +14,4 @@ public class ExampleUnitTest {
public void addition_isCorrect() { public void addition_isCorrect() {
assertEquals(4, 2 + 2); assertEquals(4, 2 + 2);
} }
@Test
public void class_tuil() {
// ForumRequest.getInstance().loadNotices(null);
//
// TimeUnit.SECONDS.sleep(100);
}
} }
Loading…
Cancel
Save