diff --git a/app/src/main/java/com/stardust/scriptdroid/network/NodeBB.java b/app/src/main/java/com/stardust/scriptdroid/network/NodeBB.java index df49ac47..79c882e4 100644 --- a/app/src/main/java/com/stardust/scriptdroid/network/NodeBB.java +++ b/app/src/main/java/com/stardust/scriptdroid/network/NodeBB.java @@ -1,14 +1,23 @@ package com.stardust.scriptdroid.network; +import android.content.Context; +import android.util.Log; + import com.google.gson.GsonBuilder; +import com.jakewharton.retrofit2.adapter.rxjava2.HttpException; import com.jakewharton.retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; +import com.stardust.scriptdroid.R; import com.stardust.scriptdroid.network.api.ConfigApi; import com.stardust.scriptdroid.network.entity.config.Config; import com.stardust.scriptdroid.network.util.WebkitCookieManagerProxy; +import java.io.IOException; + import io.reactivex.Observable; import io.reactivex.Scheduler; import okhttp3.OkHttpClient; +import okhttp3.ResponseBody; +import retrofit2.Response; import retrofit2.Retrofit; import retrofit2.converter.gson.GsonConverterFactory; @@ -20,6 +29,7 @@ public class NodeBB { public static final String BASE_URL = "http://www.autojs.org/"; private static final NodeBB sInstance = new NodeBB(); + private static final String LOG_TAG = "NodeBB"; private Config mConfig; @@ -56,7 +66,48 @@ public class NodeBB { } + public static String getErrorMessage(Throwable e, Context context, String defaultMsg) { + if (!(e instanceof HttpException)) { + return defaultMsg; + } + HttpException httpException = (HttpException) e; + ResponseBody body = httpException.response().errorBody(); + if (body == null) + return defaultMsg; + try { + String errorMessage = getErrorMessage(context, e, body.string()); + return errorMessage == null ? defaultMsg : errorMessage; + } catch (IOException e1) { + e1.printStackTrace(); + return defaultMsg; + } + } + + private static String getErrorMessage(Context context, Throwable error, String errorBody) { + if (errorBody == null) + return null; + if (errorBody.contains("invalid-login-credentials")) { + return context.getString(R.string.nodebb_error_invalid_login_credentials); + } + if (errorBody.contains("change_password_error_match")) { + return context.getString(R.string.nodebb_error_change_password_error_match); + + } + if (errorBody.contains("change_password_error_length")) { + return context.getString(R.string.nodebb_error_change_password_error_length); + } + if (errorBody.contains("email-taken")) { + return context.getString(R.string.nodebb_error_email_taken); + } + Log.d(LOG_TAG, "unknown error: " + errorBody, error); + return null; + } + public static String url(String relativePath) { return BASE_URL + relativePath; } + + public static CharSequence getErrorMessage(Throwable error, Context context, int defaultMsg) { + return getErrorMessage(error, context, context.getString(defaultMsg)); + } } diff --git a/app/src/main/java/com/stardust/scriptdroid/network/UserService.java b/app/src/main/java/com/stardust/scriptdroid/network/UserService.java index ccf3c262..19d9b20f 100644 --- a/app/src/main/java/com/stardust/scriptdroid/network/UserService.java +++ b/app/src/main/java/com/stardust/scriptdroid/network/UserService.java @@ -32,7 +32,6 @@ public class UserService { return NodeBB.getInstance() .getConfig() .flatMap(config -> { - Log.d("login", config.toString()); return mRetrofit.create(UserApi.class) .login(Collections.singletonMap("x-csrf-token", config.getCsrfToken()), userName, password); @@ -43,11 +42,8 @@ public class UserService { public Observable register(String email, String userName, String password) { return NodeBB.getInstance() .getConfig() - .flatMap(config -> { - Log.d("login", config.toString()); - return mRetrofit.create(UserApi.class) - .register(Collections.singletonMap("x-csrf-token", config.getCsrfToken()), - email, userName, password); - }); + .flatMap(config -> mRetrofit.create(UserApi.class) + .register(Collections.singletonMap("x-csrf-token", config.getCsrfToken()), + email, userName, password, password)); } } 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 0b956522..042e8e23 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 @@ -28,7 +28,7 @@ public interface UserApi { @FormUrlEncoded @POST("/register") Observable register(@HeaderMap Map csrfToken, @Field("email") String email, - @Field("username") String userName, @Field("password") String password); + @Field("username") String userName, @Field("password") String password, @Field("password-confirm") String repeatPassword); } diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/user/LoginActivity.java b/app/src/main/java/com/stardust/scriptdroid/ui/user/LoginActivity.java index 9be95e52..4c7a228a 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/user/LoginActivity.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/user/LoginActivity.java @@ -18,6 +18,7 @@ import org.androidannotations.annotations.AfterViews; import org.androidannotations.annotations.Click; import org.androidannotations.annotations.EActivity; import org.androidannotations.annotations.ViewById; +import org.w3c.dom.Node; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.schedulers.Schedulers; @@ -65,8 +66,7 @@ public class LoginActivity extends BaseActivity { } , error -> { dialog.dismiss(); - mPassword.setError(getString(R.string.text_login_fail)); - error.printStackTrace(); + mPassword.setError(NodeBB.getErrorMessage(error, LoginActivity.this, R.string.text_login_fail)); }); } diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/user/RegisterActivity.java b/app/src/main/java/com/stardust/scriptdroid/ui/user/RegisterActivity.java index 121e3b19..8cf78d34 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/user/RegisterActivity.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/user/RegisterActivity.java @@ -8,6 +8,7 @@ import android.widget.Toast; import com.afollestad.materialdialogs.MaterialDialog; import com.stardust.scriptdroid.R; +import com.stardust.scriptdroid.network.NodeBB; import com.stardust.scriptdroid.network.UserService; import com.stardust.scriptdroid.ui.BaseActivity; import com.stardust.theme.ThemeColorManager; @@ -67,8 +68,7 @@ public class RegisterActivity extends BaseActivity { } , error -> { dialog.dismiss(); - mPassword.setError(getString(R.string.text_register_fail)); - error.printStackTrace(); + mPassword.setError(NodeBB.getErrorMessage(error, RegisterActivity.this, R.string.text_register_fail)); }); } @@ -95,6 +95,10 @@ public class RegisterActivity extends BaseActivity { mUserName.setError(getString(R.string.text_password_cannot_be_empty)); return false; } + if (password.length() < 6) { + mPassword.setError(getString(R.string.nodebb_error_change_password_error_length)); + return false; + } return true; } } diff --git a/app/src/main/res/layout/activity_shortcut_icon_select.xml b/app/src/main/res/layout/activity_shortcut_icon_select.xml index 210f9c7f..a46c63fc 100644 --- a/app/src/main/res/layout/activity_shortcut_icon_select.xml +++ b/app/src/main/res/layout/activity_shortcut_icon_select.xml @@ -10,10 +10,9 @@ android:id="@+id/app_bar" android:layout_width="match_parent" android:layout_height="wrap_content" - android:paddingTop="16dp" android:theme="@style/AppTheme.AppBarOverlay"> - 最新 热门 话题 + 无效的登录凭证 + 密码太短 + 邮箱已被占用 + 两次输入的密码不一致