mirror of
https://github.com/ankidroid/Anki-Android.git
synced 2024-09-20 12:02:16 +02:00
add registering page and necessary routines
This commit is contained in:
parent
13ec6197a9
commit
9a364d957b
79
res/layout/my_account_register.xml
Normal file
79
res/layout/my_account_register.xml
Normal file
@ -0,0 +1,79 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="fill_parent"
|
||||
android:paddingLeft="10dp"
|
||||
android:paddingTop="15dp"
|
||||
android:paddingRight="10dp"
|
||||
android:paddingBottom="15dp"
|
||||
android:orientation="vertical">
|
||||
|
||||
<LinearLayout android:id="@+id/MyAccountLayout"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<TextView
|
||||
android:textColor="#000000"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/username"/>
|
||||
<EditText android:id="@+id/username1"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:inputType="textPersonName"/>
|
||||
<TextView
|
||||
android:textColor="#000000"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/username_repeat"/>
|
||||
<EditText android:id="@+id/username2"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:inputType="textPersonName"/>
|
||||
|
||||
<TextView
|
||||
android:layout_width="fill_parent"
|
||||
android:textColor="#000000"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/password"/>
|
||||
<EditText android:id="@+id/password1"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:inputType="textPassword"/>
|
||||
<TextView
|
||||
android:layout_width="fill_parent"
|
||||
android:textColor="#000000"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/password_repeat"/>
|
||||
<EditText android:id="@+id/password2"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:inputType="textPassword"/>
|
||||
|
||||
</LinearLayout>
|
||||
<LinearLayout
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<Button android:id="@+id/register_button"
|
||||
android:layout_height="fill_parent"
|
||||
android:layout_width="0dip"
|
||||
android:layout_gravity="center"
|
||||
android:gravity="center"
|
||||
android:layout_weight="1"
|
||||
android:singleLine="true"
|
||||
android:text="@string/sign_up"/>
|
||||
|
||||
<Button android:id="@+id/cancel_button"
|
||||
android:layout_height="fill_parent"
|
||||
android:layout_width="0dip"
|
||||
android:text="@string/cancel"
|
||||
android:layout_gravity="center"
|
||||
android:singleLine="true"
|
||||
android:layout_weight="1"
|
||||
android:gravity="center"/>
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
@ -73,7 +73,9 @@
|
||||
|
||||
<!-- MyAccount.java -->
|
||||
<string name="username">Username</string>
|
||||
<string name="username_repeat">Repeat username</string>
|
||||
<string name="password">Password</string>
|
||||
<string name="password_repeat">Repeat password</string>
|
||||
<string name="log_in">Log in</string>
|
||||
<string name="sign_up_description">Don\'t have an AnkiWeb account? It\'s free!</string>
|
||||
<string name="sign_up">Sign up</string>
|
||||
@ -147,4 +149,9 @@
|
||||
<string name="sync_media_no_changes">No changes to media files.</string>
|
||||
<string name="sync_media_success">Media synced successfully.</string>
|
||||
|
||||
<string name="register_error">An error occurred. Please try again later.</string>
|
||||
<string name="register_title">Register account</string>
|
||||
<string name="register_mismatch">The username/password repetition does not match or is empty. Please re-enter.</string>
|
||||
<string name="registering_message">Creating account.\nPlease wait...</string>
|
||||
|
||||
</resources>
|
||||
|
@ -46,7 +46,6 @@ public class Info extends Activity {
|
||||
public static final int TYPE_WELCOME = 1;
|
||||
public static final int TYPE_NEW_VERSION = 2;
|
||||
public static final int TYPE_SHARED_DECKS = 3;
|
||||
public static final int TYPE_CREATE_ACCOUNT = 4;
|
||||
|
||||
private int mType;
|
||||
private WebView mWebView;
|
||||
@ -160,12 +159,6 @@ public class Info extends Activity {
|
||||
builder.show();
|
||||
break;
|
||||
|
||||
case TYPE_CREATE_ACCOUNT:
|
||||
mWebView.loadUrl(res.getString(R.string.ankionline_sign_up_url));
|
||||
mWebView.setWebViewClient(new CustomWebViewClient());
|
||||
continueButton.setText(res.getString(R.string.download_button_return));
|
||||
break;
|
||||
|
||||
default:
|
||||
finish();
|
||||
break;
|
||||
|
@ -44,16 +44,24 @@ public class MyAccount extends AnkiActivity {
|
||||
|
||||
private View mLoginToMyAccountView;
|
||||
private View mLoggedIntoMyAccountView;
|
||||
private View mRegisterView;
|
||||
|
||||
private EditText mUsername;
|
||||
private EditText mPassword;
|
||||
|
||||
private EditText mUsername1;
|
||||
private EditText mPassword1;
|
||||
private EditText mUsername2;
|
||||
private EditText mPassword2;
|
||||
|
||||
private TextView mUsernameLoggedIn;
|
||||
|
||||
private StyledProgressDialog mProgressDialog;
|
||||
private StyledDialog mNoConnectionAlert;
|
||||
private StyledDialog mConnectionErrorAlert;
|
||||
private StyledDialog mInvalidUserPassAlert;
|
||||
private StyledDialog mRegisterAlert;
|
||||
private StyledDialog mErrorAlert;
|
||||
|
||||
|
||||
@Override
|
||||
@ -124,6 +132,22 @@ public class MyAccount extends AnkiActivity {
|
||||
}
|
||||
|
||||
|
||||
private void register() {
|
||||
// Hide soft keyboard
|
||||
InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
|
||||
inputMethodManager.hideSoftInputFromWindow(mUsername.getWindowToken(), 0);
|
||||
|
||||
String username = mUsername1.getText().toString();
|
||||
String password = mPassword1.getText().toString();
|
||||
|
||||
if (!"".equalsIgnoreCase(username) && !"".equalsIgnoreCase(password)) {
|
||||
Connection.register(registerListener, new Connection.Payload(new Object[] { username, password }));
|
||||
} else {
|
||||
mInvalidUserPassAlert.show();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void logout() {
|
||||
SharedPreferences preferences = PrefSettings.getSharedPrefs(getBaseContext());
|
||||
Editor editor = preferences.edit();
|
||||
@ -142,7 +166,7 @@ public class MyAccount extends AnkiActivity {
|
||||
Themes.setTextViewStyle(mLoginToMyAccountView.findViewById(R.id.no_account_text));
|
||||
mUsername = (EditText) mLoginToMyAccountView.findViewById(R.id.username);
|
||||
mPassword = (EditText) mLoginToMyAccountView.findViewById(R.id.password);
|
||||
|
||||
|
||||
Button loginButton = (Button) mLoginToMyAccountView.findViewById(R.id.login_button);
|
||||
loginButton.setOnClickListener(new OnClickListener() {
|
||||
|
||||
@ -158,12 +182,7 @@ public class MyAccount extends AnkiActivity {
|
||||
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
Intent intent = new Intent(MyAccount.this, Info.class);
|
||||
intent.putExtra(Info.TYPE_EXTRA, Info.TYPE_CREATE_ACCOUNT);
|
||||
startActivity(intent);
|
||||
if (UIUtils.getApiLevel() > 4) {
|
||||
ActivityTransitionAnimation.slide(MyAccount.this, ActivityTransitionAnimation.RIGHT);
|
||||
}
|
||||
setContentView(mRegisterView);
|
||||
}
|
||||
|
||||
});
|
||||
@ -181,6 +200,38 @@ public class MyAccount extends AnkiActivity {
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
mRegisterView = getLayoutInflater().inflate(R.layout.my_account_register, null);
|
||||
Themes.setWallpaper(mRegisterView);
|
||||
mUsername1 = (EditText) mRegisterView.findViewById(R.id.username1);
|
||||
mPassword1 = (EditText) mRegisterView.findViewById(R.id.password1);
|
||||
mUsername2 = (EditText) mRegisterView.findViewById(R.id.username2);
|
||||
mPassword2 = (EditText) mRegisterView.findViewById(R.id.password2);
|
||||
|
||||
Button registerButton = (Button) mRegisterView.findViewById(R.id.register_button);
|
||||
registerButton.setOnClickListener(new OnClickListener() {
|
||||
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
if (mUsername1.getText().toString().length() > 0 && mPassword1.getText().toString().length() > 0 && mUsername1.getText().toString().equals(mUsername2.getText().toString()) && mPassword1.getText().toString().equals(mPassword2.getText().toString())) {
|
||||
register();
|
||||
} else {
|
||||
mRegisterAlert.show();
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
Button cancelButton = (Button) mRegisterView.findViewById(R.id.cancel_button);
|
||||
cancelButton.setOnClickListener(new OnClickListener() {
|
||||
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
finishWithAnimation(ActivityTransitionAnimation.FADE);
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
|
||||
@ -198,6 +249,27 @@ public class MyAccount extends AnkiActivity {
|
||||
builder.setPositiveButton(res.getString(R.string.ok), null);
|
||||
mNoConnectionAlert = builder.create();
|
||||
|
||||
builder.setTitle(res.getString(R.string.register_title));
|
||||
builder.setIcon(android.R.drawable.ic_dialog_alert);
|
||||
builder.setMessage(res.getString(R.string.register_error));
|
||||
builder.setPositiveButton(res.getString(R.string.ok), null);
|
||||
mErrorAlert = builder.create();
|
||||
|
||||
builder.setTitle(res.getString(R.string.register_title));
|
||||
builder.setIcon(android.R.drawable.ic_dialog_alert);
|
||||
builder.setMessage(res.getString(R.string.register_mismatch));
|
||||
builder.setPositiveButton(res.getString(R.string.ok), new DialogInterface.OnClickListener() {
|
||||
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
mUsername1.setText("");
|
||||
mUsername2.setText("");
|
||||
mPassword1.setText("");
|
||||
mPassword2.setText("");
|
||||
}
|
||||
});
|
||||
mRegisterAlert = builder.create();
|
||||
|
||||
builder = new StyledDialog.Builder(this);
|
||||
builder.setTitle(res.getString(R.string.log_in));
|
||||
builder.setIcon(android.R.drawable.ic_dialog_alert);
|
||||
@ -283,6 +355,62 @@ public class MyAccount extends AnkiActivity {
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
Connection.TaskListener registerListener = new Connection.TaskListener() {
|
||||
|
||||
@Override
|
||||
public void onProgressUpdate(Object... values) {
|
||||
// Pass
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onPreExecute() {
|
||||
Log.i(AnkiDroidApp.TAG, "MyAccount - onPreExcecute");
|
||||
if (mProgressDialog == null || !mProgressDialog.isShowing()) {
|
||||
mProgressDialog = StyledProgressDialog.show(MyAccount.this, "",
|
||||
getResources().getString(R.string.registering_message), true);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onPostExecute(Payload data) {
|
||||
Log.i(AnkiDroidApp.TAG, "MyAccount - onPostExecute, succes = " + data.success);
|
||||
if (mProgressDialog != null) {
|
||||
mProgressDialog.dismiss();
|
||||
}
|
||||
|
||||
if (data.success) {
|
||||
Log.i(AnkiDroidApp.TAG, "User successfully registered!");
|
||||
saveUserInformation((String) data.data[0], (String) data.data[1]);
|
||||
|
||||
Intent i = MyAccount.this.getIntent();
|
||||
if (i.hasExtra("notLoggedIn") && i.getExtras().getBoolean("notLoggedIn", false)) {
|
||||
MyAccount.this.setResult(RESULT_OK, i);
|
||||
finishWithAnimation(ActivityTransitionAnimation.FADE);
|
||||
} else {
|
||||
// Show logged view
|
||||
mUsernameLoggedIn.setText((String) data.data[0]);
|
||||
setContentView(mLoggedIntoMyAccountView);
|
||||
}
|
||||
} else {
|
||||
mErrorAlert.show();
|
||||
if (data.data != null) {
|
||||
mErrorAlert.setMessage(((String[])data.data)[0]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onDisconnected() {
|
||||
if (mNoConnectionAlert != null) {
|
||||
mNoConnectionAlert.show();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@Override
|
||||
public boolean onKeyDown(int keyCode, KeyEvent event) {
|
||||
if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
|
||||
|
@ -65,6 +65,7 @@ public class Connection extends AsyncTask<Connection.Payload, Object, Connection
|
||||
public static final int TASK_TYPE_GET_PERSONAL_DECKS = 3;
|
||||
public static final int TASK_TYPE_SEND_CRASH_REPORT = 4;
|
||||
public static final int TASK_TYPE_DOWNLOAD_MEDIA = 5;
|
||||
public static final int TASK_TYPE_REGISTER = 6;
|
||||
|
||||
private static Context sContext;
|
||||
|
||||
@ -139,6 +140,12 @@ public class Connection extends AsyncTask<Connection.Payload, Object, Connection
|
||||
}
|
||||
|
||||
|
||||
public static Connection register(TaskListener listener, Payload data) {
|
||||
data.taskType = TASK_TYPE_REGISTER;
|
||||
return launchConnectionTask(listener, data);
|
||||
}
|
||||
|
||||
|
||||
public static Connection getSharedDecks(TaskListener listener, Payload data) {
|
||||
data.taskType = TASK_TYPE_GET_SHARED_DECKS;
|
||||
return launchConnectionTask(listener, data);
|
||||
@ -177,8 +184,11 @@ public class Connection extends AsyncTask<Connection.Payload, Object, Connection
|
||||
|
||||
private Payload doOneInBackground(Payload data) {
|
||||
switch (data.taskType) {
|
||||
case TASK_TYPE_LOGIN:
|
||||
return doInBackgroundLogin(data);
|
||||
case TASK_TYPE_LOGIN:
|
||||
return doInBackgroundLogin(data);
|
||||
|
||||
case TASK_TYPE_REGISTER:
|
||||
return doInBackgroundRegister(data);
|
||||
|
||||
// case TASK_TYPE_GET_SHARED_DECKS:
|
||||
// return doInBackgroundGetSharedDecks(data);
|
||||
@ -214,7 +224,8 @@ public class Connection extends AsyncTask<Connection.Payload, Object, Connection
|
||||
data.returnType = ret.getStatusLine().getStatusCode();
|
||||
if (data.returnType == 200) {
|
||||
try {
|
||||
hostkey = (new JSONObject(server.stream2String(ret.getEntity().getContent()))).getString("key");
|
||||
JSONObject jo = (new JSONObject(server.stream2String(ret.getEntity().getContent())));
|
||||
hostkey = jo.getString("key");
|
||||
valid = (hostkey != null) && (hostkey.length() > 0);
|
||||
} catch (JSONException e) {
|
||||
valid = false;
|
||||
@ -233,6 +244,42 @@ public class Connection extends AsyncTask<Connection.Payload, Object, Connection
|
||||
return data;
|
||||
}
|
||||
|
||||
private Payload doInBackgroundRegister(Payload data) {
|
||||
String username = (String) data.data[0];
|
||||
String password = (String) data.data[1];
|
||||
BasicHttpSyncer server = new RemoteServer(this, null);
|
||||
HttpResponse ret = server.register(username, password);
|
||||
String hostkey = null;
|
||||
boolean valid = false;
|
||||
data.returnType = ret.getStatusLine().getStatusCode();
|
||||
String status = null;
|
||||
if (data.returnType == 200) {
|
||||
try {
|
||||
JSONObject jo = (new JSONObject(server.stream2String(ret.getEntity().getContent())));
|
||||
status = jo.getString("status");
|
||||
if (status.equals("ok")) {
|
||||
hostkey = jo.getString("hkey");
|
||||
valid = (hostkey != null) && (hostkey.length() > 0);
|
||||
}
|
||||
} catch (JSONException e) {
|
||||
} catch (IllegalStateException e) {
|
||||
throw new RuntimeException(e);
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
if (valid) {
|
||||
data.success = true;
|
||||
data.data = new String[] {username, hostkey};
|
||||
} else {
|
||||
data.success = false;
|
||||
if (status != null) {
|
||||
data.data = new String[] {status};
|
||||
}
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
private Payload doInBackgroundSync(Payload data) {
|
||||
// for for doInBackgroundLoadDeckCounts if any
|
||||
DeckTask.waitToFinish();
|
||||
|
@ -50,7 +50,7 @@ public class Collection {
|
||||
|
||||
// collection schema & syncing vars
|
||||
public static final int SCHEMA_VERSION = 11;
|
||||
public static final String SYNC_URL = "https://ankiweb.net/sync/";
|
||||
public static final String SYNC_URL = "https://ankiweb.net/";
|
||||
public static final int SYNC_VER = 5;
|
||||
|
||||
private AnkiDb mDb;
|
||||
|
@ -41,6 +41,7 @@ import org.apache.http.params.BasicHttpParams;
|
||||
import org.apache.http.params.HttpParams;
|
||||
import org.apache.http.params.HttpProtocolParams;
|
||||
import org.json.JSONArray;
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import java.io.BufferedInputStream;
|
||||
@ -91,6 +92,9 @@ public class BasicHttpSyncer implements HttpSyncer {
|
||||
return req(method, fobj, 6, hkey);
|
||||
}
|
||||
public HttpResponse req(String method, InputStream fobj, int comp, boolean hkey) {
|
||||
return req(method, fobj, comp, hkey, null);
|
||||
}
|
||||
public HttpResponse req(String method, InputStream fobj, int comp, boolean hkey, JSONObject registerData) {
|
||||
try {
|
||||
String bdry = "--" + BOUNDARY;
|
||||
StringWriter buf = new StringWriter();
|
||||
@ -133,7 +137,13 @@ public class BasicHttpSyncer implements HttpSyncer {
|
||||
}
|
||||
bos.close();
|
||||
// connection headers
|
||||
HttpPost httpPost = new HttpPost(Collection.SYNC_URL + method);
|
||||
String url = Collection.SYNC_URL;
|
||||
if (method.equals("register")) {
|
||||
url = url + "account/signup" + "?username=" + registerData.getString("u") + "&password=" + registerData.getString("p");
|
||||
} else {
|
||||
url = url + "sync/" + method;
|
||||
}
|
||||
HttpPost httpPost = new HttpPost(url);
|
||||
HttpEntity entity = new ProgressByteEntity(bos.toByteArray());
|
||||
|
||||
// body
|
||||
@ -157,6 +167,8 @@ public class BasicHttpSyncer implements HttpSyncer {
|
||||
throw new RuntimeException(e);
|
||||
} catch (IOException e) {
|
||||
return null;
|
||||
} catch (JSONException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
@ -309,4 +321,9 @@ public class BasicHttpSyncer implements HttpSyncer {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public HttpResponse register(String user, String pw) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
@ -16,8 +16,9 @@
|
||||
|
||||
package com.ichi2.libanki.sync;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.net.URLEncoder;
|
||||
|
||||
import org.apache.http.HttpResponse;
|
||||
import org.json.JSONArray;
|
||||
@ -46,6 +47,20 @@ public class RemoteServer extends BasicHttpSyncer {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public HttpResponse register(String user, String pw) {
|
||||
try {
|
||||
JSONObject jo = new JSONObject();
|
||||
jo.put("u", URLEncoder.encode(user, "UTF-8" ));
|
||||
jo.put("p", URLEncoder.encode(pw, "UTF-8" ));
|
||||
return super.req("register", null, 6, false, jo);
|
||||
} catch (JSONException e) {
|
||||
return null;
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public HttpResponse meta() {
|
||||
try {
|
||||
|
Loading…
Reference in New Issue
Block a user