opt: error message of login and register

This commit is contained in:
hyb1996
2017-12-10 17:29:58 +08:00
parent 39932de8ce
commit 0d8a3e41fb
7 changed files with 68 additions and 14 deletions

View File

@@ -1,14 +1,23 @@
package com.stardust.scriptdroid.network; package com.stardust.scriptdroid.network;
import android.content.Context;
import android.util.Log;
import com.google.gson.GsonBuilder; import com.google.gson.GsonBuilder;
import com.jakewharton.retrofit2.adapter.rxjava2.HttpException;
import com.jakewharton.retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; import com.jakewharton.retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import com.stardust.scriptdroid.R;
import com.stardust.scriptdroid.network.api.ConfigApi; import com.stardust.scriptdroid.network.api.ConfigApi;
import com.stardust.scriptdroid.network.entity.config.Config; import com.stardust.scriptdroid.network.entity.config.Config;
import com.stardust.scriptdroid.network.util.WebkitCookieManagerProxy; import com.stardust.scriptdroid.network.util.WebkitCookieManagerProxy;
import java.io.IOException;
import io.reactivex.Observable; import io.reactivex.Observable;
import io.reactivex.Scheduler; import io.reactivex.Scheduler;
import okhttp3.OkHttpClient; import okhttp3.OkHttpClient;
import okhttp3.ResponseBody;
import retrofit2.Response;
import retrofit2.Retrofit; import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory; import retrofit2.converter.gson.GsonConverterFactory;
@@ -20,6 +29,7 @@ public class NodeBB {
public static final String BASE_URL = "http://www.autojs.org/"; public static final String BASE_URL = "http://www.autojs.org/";
private static final NodeBB sInstance = new NodeBB(); private static final NodeBB sInstance = new NodeBB();
private static final String LOG_TAG = "NodeBB";
private Config mConfig; 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) { public static String url(String relativePath) {
return BASE_URL + relativePath; return BASE_URL + relativePath;
} }
public static CharSequence getErrorMessage(Throwable error, Context context, int defaultMsg) {
return getErrorMessage(error, context, context.getString(defaultMsg));
}
} }

View File

@@ -32,7 +32,6 @@ public class UserService {
return NodeBB.getInstance() return NodeBB.getInstance()
.getConfig() .getConfig()
.flatMap(config -> { .flatMap(config -> {
Log.d("login", config.toString());
return mRetrofit.create(UserApi.class) return mRetrofit.create(UserApi.class)
.login(Collections.singletonMap("x-csrf-token", config.getCsrfToken()), .login(Collections.singletonMap("x-csrf-token", config.getCsrfToken()),
userName, password); userName, password);
@@ -43,11 +42,8 @@ public class UserService {
public Observable<ResponseBody> register(String email, String userName, String password) { public Observable<ResponseBody> register(String email, String userName, String password) {
return NodeBB.getInstance() return NodeBB.getInstance()
.getConfig() .getConfig()
.flatMap(config -> { .flatMap(config -> mRetrofit.create(UserApi.class)
Log.d("login", config.toString()); .register(Collections.singletonMap("x-csrf-token", config.getCsrfToken()),
return mRetrofit.create(UserApi.class) email, userName, password, password));
.register(Collections.singletonMap("x-csrf-token", config.getCsrfToken()),
email, userName, password);
});
} }
} }

View File

@@ -28,7 +28,7 @@ public interface UserApi {
@FormUrlEncoded @FormUrlEncoded
@POST("/register") @POST("/register")
Observable<ResponseBody> register(@HeaderMap Map<String, String> csrfToken, @Field("email") String email, Observable<ResponseBody> register(@HeaderMap Map<String, String> 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);
} }

View File

@@ -18,6 +18,7 @@ import org.androidannotations.annotations.AfterViews;
import org.androidannotations.annotations.Click; import org.androidannotations.annotations.Click;
import org.androidannotations.annotations.EActivity; import org.androidannotations.annotations.EActivity;
import org.androidannotations.annotations.ViewById; import org.androidannotations.annotations.ViewById;
import org.w3c.dom.Node;
import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers; import io.reactivex.schedulers.Schedulers;
@@ -65,8 +66,7 @@ public class LoginActivity extends BaseActivity {
} }
, error -> { , error -> {
dialog.dismiss(); dialog.dismiss();
mPassword.setError(getString(R.string.text_login_fail)); mPassword.setError(NodeBB.getErrorMessage(error, LoginActivity.this, R.string.text_login_fail));
error.printStackTrace();
}); });
} }

View File

@@ -8,6 +8,7 @@ import android.widget.Toast;
import com.afollestad.materialdialogs.MaterialDialog; import com.afollestad.materialdialogs.MaterialDialog;
import com.stardust.scriptdroid.R; import com.stardust.scriptdroid.R;
import com.stardust.scriptdroid.network.NodeBB;
import com.stardust.scriptdroid.network.UserService; import com.stardust.scriptdroid.network.UserService;
import com.stardust.scriptdroid.ui.BaseActivity; import com.stardust.scriptdroid.ui.BaseActivity;
import com.stardust.theme.ThemeColorManager; import com.stardust.theme.ThemeColorManager;
@@ -67,8 +68,7 @@ public class RegisterActivity extends BaseActivity {
} }
, error -> { , error -> {
dialog.dismiss(); dialog.dismiss();
mPassword.setError(getString(R.string.text_register_fail)); mPassword.setError(NodeBB.getErrorMessage(error, RegisterActivity.this, R.string.text_register_fail));
error.printStackTrace();
}); });
} }
@@ -95,6 +95,10 @@ public class RegisterActivity extends BaseActivity {
mUserName.setError(getString(R.string.text_password_cannot_be_empty)); mUserName.setError(getString(R.string.text_password_cannot_be_empty));
return false; return false;
} }
if (password.length() < 6) {
mPassword.setError(getString(R.string.nodebb_error_change_password_error_length));
return false;
}
return true; return true;
} }
} }

View File

@@ -10,10 +10,9 @@
android:id="@+id/app_bar" android:id="@+id/app_bar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:paddingTop="16dp"
android:theme="@style/AppTheme.AppBarOverlay"> android:theme="@style/AppTheme.AppBarOverlay">
<android.support.v7.widget.Toolbar <com.stardust.theme.widget.ThemeColorToolbar
android:id="@+id/toolbar" android:id="@+id/toolbar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize" android:layout_height="?attr/actionBarSize"

View File

@@ -332,4 +332,8 @@
<string name="text_community_recent">最新</string> <string name="text_community_recent">最新</string>
<string name="text_community_popular">热门</string> <string name="text_community_popular">热门</string>
<string name="text_community_tags">话题</string> <string name="text_community_tags">话题</string>
<string name="nodebb_error_invalid_login_credentials">无效的登录凭证</string>
<string name="nodebb_error_change_password_error_length">密码太短</string>
<string name="nodebb_error_email_taken">邮箱已被占用</string>
<string name="nodebb_error_change_password_error_match">两次输入的密码不一致</string>
</resources> </resources>