diff --git a/app/release/output.json b/app/release/output.json
index aaa06e73..07c41bed 100644
--- a/app/release/output.json
+++ b/app/release/output.json
@@ -1 +1 @@
-[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":34},"path":"inrt-release.apk","properties":{"packageId":"com.stardust.auojs.inrt","split":"","minSdkVersion":"17"}}]
\ No newline at end of file
+[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":239},"path":"release-3.0.0 Alpha39.apk","properties":{"packageId":"com.stardust.scriptdroid","split":"","minSdkVersion":"17"}}]
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 5d7514d1..aff48fd8 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -95,11 +95,6 @@
-
login(String userName, final String password) {
return NodeBB.getInstance()
.getConfig()
- .flatMap(config -> {
- return mRetrofit.create(UserApi.class)
- .login(Collections.singletonMap("x-csrf-token", config.getCsrfToken()),
- userName, password);
- });
+ .flatMap(config ->
+ mRetrofit.create(UserApi.class)
+ .login(Collections.singletonMap("x-csrf-token", config.getCsrfToken()),
+ userName, password)
+ .doOnError(error -> {
+ if (error instanceof HttpException && ((HttpException) error).code() == 403) {
+ NodeBB.getInstance().invalidateConfig();
+ }
+ }))
+ .doOnComplete(this::refreshOnlineStatus);
}
+
public Observable register(String email, String userName, String password) {
return NodeBB.getInstance()
.getConfig()
@@ -46,4 +71,55 @@ public class UserService {
.register(Collections.singletonMap("x-csrf-token", config.getCsrfToken()),
email, userName, password, password));
}
+
+ public boolean isOnline() {
+ return mUser != null;
+ }
+
+ private void setUser(User user) {
+ User old = mUser;
+ mUser = user;
+ if (!Objects.equals(old, mUser)) {
+ if (user == null) {
+ NodeBB.getInstance().invalidateConfig();
+ }
+ EventBus.getDefault().post(new LoginStateChange(user != null));
+ }
+ }
+
+ public Observable refreshOnlineStatus() {
+ PublishSubject online = PublishSubject.create();
+ mRetrofit.create(UserApi.class)
+ .me()
+ .subscribeOn(Schedulers.io())
+ .subscribe(user -> {
+ setUser(user);
+ online.onNext(true);
+ online.onComplete();
+ }, error -> {
+ setUser(null);
+ online.onNext(false);
+ online.onComplete();
+ });
+ return online;
+ }
+
+ public Observable logout() {
+ return NodeBB.getInstance()
+ .getConfig()
+ .flatMap(config ->
+ mRetrofit.create(UserApi.class)
+ .logout(Collections.singletonMap("x-csrf-token", config.getCsrfToken()))
+ )
+ .doOnError(Throwable::printStackTrace)
+ .doOnComplete(this::refreshOnlineStatus);
+ }
+
+ public Observable me() {
+ return NodeBB.getInstance().getRetrofit()
+ .create(UserApi.class)
+ .me()
+ .doOnNext(this::setUser)
+ .doOnError(error -> setUser(null));
+ }
}
diff --git a/app/src/main/java/com/stardust/scriptdroid/network/api/UserApi.java b/app/src/main/java/com/stardust/scriptdroid/network/api/UserApi.java
index 042e8e23..4c55c16e 100644
--- a/app/src/main/java/com/stardust/scriptdroid/network/api/UserApi.java
+++ b/app/src/main/java/com/stardust/scriptdroid/network/api/UserApi.java
@@ -31,4 +31,6 @@ public interface UserApi {
@Field("username") String userName, @Field("password") String password, @Field("password-confirm") String repeatPassword);
+ @POST("/logout")
+ Observable logout(@HeaderMap Map csrfToken);
}
diff --git a/app/src/main/java/com/stardust/scriptdroid/network/entity/user/User.java b/app/src/main/java/com/stardust/scriptdroid/network/entity/user/User.java
index 30d433b4..c6bb1063 100644
--- a/app/src/main/java/com/stardust/scriptdroid/network/entity/user/User.java
+++ b/app/src/main/java/com/stardust/scriptdroid/network/entity/user/User.java
@@ -1,746 +1,756 @@
package com.stardust.scriptdroid.network.entity.user;
import java.util.List;
+
import com.google.gson.annotations.SerializedName;
+import com.stardust.util.Objects;
-public class User{
+public class User {
- @SerializedName("websiteLink")
- private String websiteLink;
+ @SerializedName("websiteLink")
+ private String websiteLink;
- @SerializedName("reputation")
- private String reputation;
+ @SerializedName("reputation")
+ private String reputation;
- @SerializedName("sso")
- private List