package org.azavea.otm.ui;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.view.View;
import android.webkit.WebView;
import android.widget.Toast;
import com.loopj.android.http.JsonHttpResponseHandler;
import org.azavea.helpers.Logger;
import org.azavea.otm.App;
import org.azavea.otm.LoginManager;
import org.azavea.otm.R;
import org.azavea.otm.data.User;
import org.azavea.otm.rest.RequestGenerator;
import org.azavea.otm.rest.handlers.LoggingJsonHttpResponseHandler;
import org.json.JSONException;
import org.json.JSONObject;
import cz.msebera.android.httpclient.Header;
public class TermsOfService extends Activity {
private final LoginManager loginManager = App.getLoginManager();
private ProgressDialog dialog;
private static final String USERNAME = "username";
private static final String EMAIL = "email";
private static final String PASSWORD = "password";
private static final String FIRST_NAME = "first_name";
private static final String LAST_NAME = "last_name";
@Override
public void onCreate(Bundle savedState) {
super.onCreate(savedState);
setContentView(R.layout.terms_of_service);
WebView wv = (WebView) findViewById(R.id.terms_of_service_webview);
wv.loadUrl("file:///android_asset/terms_of_service.html");
}
public static Intent getIntent(
Context context,
@NonNull String username, @NonNull String email, @NonNull String password,
@NonNull String firstName, @NonNull String lastName) {
Intent intent = new Intent(context, TermsOfService.class);
intent.putExtra(USERNAME, username);
intent.putExtra(EMAIL, email);
intent.putExtra(PASSWORD, password);
intent.putExtra(FIRST_NAME, firstName);
intent.putExtra(LAST_NAME, lastName);
return intent;
}
public void handleRegisterClick(View view) {
RequestGenerator rc = new RequestGenerator();
User model = null;
dialog = ProgressDialog.show(TermsOfService.this, "", "Creating User Account...", true, true);
Intent intent = getIntent();
String username = intent.getStringExtra(USERNAME);
String firstName = intent.getStringExtra(FIRST_NAME);
String lastName = intent.getStringExtra(LAST_NAME);
String email = intent.getStringExtra(EMAIL);
String password = intent.getStringExtra(PASSWORD);
try {
model = new User(username, firstName, lastName, email, password);
} catch (JSONException e) {
Logger.error("error in User JSON.", e);
showErrorAndGoBack();
dialog.dismiss();
}
try {
rc.register(App.getAppInstance(), model, registrationResponseHandler);
} catch (Exception e) {
Logger.error(e);
showErrorAndGoBack();
dialog.dismiss();
}
}
/*
* Response handlers
*/
private final JsonHttpResponseHandler registrationResponseHandler = new LoggingJsonHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
dialog.dismiss();
Intent intent = getIntent();
String username = intent.getStringExtra(USERNAME);
String password = intent.getStringExtra(PASSWORD);
if (responseIsSuccess(response)) {
loginManager.logIn(App.getAppInstance(), username, password, msg -> {
Bundle data = msg.getData();
if (data.getBoolean("success")) {
notifyUserThatAcctCreatedAndReturnToProfile();
return true;
} else {
showErrorAndGoBack();
return false;
}
});
} else {
Logger.warning("Problem creating user account");
showErrorAndGoBack();
}
}
@Override
public void failure(Throwable e, String response) {
dialog.dismiss();
if (responseIsConflict(e, response)) {
Toast.makeText(TermsOfService.this, R.string.username_is_taken, Toast.LENGTH_SHORT).show();
finish();
} else {
Logger.warning("Problem creating user account", e);
showErrorAndGoBack();
}
}
};
private static boolean responseIsSuccess(JSONObject response) {
String status = "";
try {
status = response.getString("status");
} catch (JSONException e) {
Logger.error(e);
}
return status.equals("success");
}
private static boolean responseIsConflict(Throwable t, String response) {
return response.equals("CONFLICT");
}
private void showErrorAndGoBack() {
Toast.makeText(TermsOfService.this, R.string.problem_creating_account, Toast.LENGTH_SHORT).show();
finish();
}
/*
* Helper functions to display info to the user
*/
private void notifyUserThatAcctCreatedAndReturnToProfile() {
new AlertDialog.Builder(this)
.setTitle(R.string.done_registering)
.setMessage(R.string.done_registering_msg)
.setPositiveButton(
R.string.OK,
(dialog1, which) -> startActivity(new Intent(App.getAppInstance(),
App.hasInstanceCode() ?
TabLayout.class :
InstanceSwitcherActivity.class
))
)
.show();
}
}