package io.evercam.androidapp; import android.content.Context; import android.content.Intent; import android.content.res.Configuration; import android.os.AsyncTask; import android.os.Bundle; import android.text.TextUtils; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewTreeObserver.OnGlobalLayoutListener; import android.view.Window; import android.view.inputmethod.InputMethodManager; import android.widget.Button; import android.widget.EditText; import android.widget.ImageView; import android.widget.TextView; import io.evercam.API; import io.evercam.ApiKeyPair; import io.evercam.EvercamException; import io.evercam.User; import io.evercam.androidapp.authentication.EvercamAccount; import io.evercam.androidapp.custom.CustomProgressDialog; import io.evercam.androidapp.custom.CustomToast; import io.evercam.androidapp.custom.CustomedDialog; import io.evercam.androidapp.dto.AppData; import io.evercam.androidapp.dto.AppUser; import io.evercam.androidapp.tasks.CheckInternetTask; import io.evercam.androidapp.utils.Constants; public class LoginActivity extends ParentActivity { private EditText usernameEdit; private EditText passwordEdit; private String username; private String password; private LoginTask loginTask; private String TAG = "evercamplay-LoginActivity"; private CustomProgressDialog customProgressDialog; private enum InternetCheckType { LOGIN, SIGNUP } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); customProgressDialog = new CustomProgressDialog(this); getWindow().requestFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.login); Button btnLogin = (Button) findViewById(R.id.btnLogin); TextView signUpLink = (TextView) findViewById(R.id.signupLink); usernameEdit = (EditText) findViewById(R.id.editUsername); passwordEdit = (EditText) findViewById(R.id.editPassword); btnLogin.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new LoginCheckInternetTask(LoginActivity.this, InternetCheckType.LOGIN).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } }); signUpLink.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { new LoginCheckInternetTask(LoginActivity.this, InternetCheckType.SIGNUP).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } }); hideLogoIfNecessary(); } /** * (Currently only for portrait mode) * Hide Evercam logo when soft keyboard shows up, and show the logo when keyboard is hidden */ public void adjustLoginFormForKeyboardChange() { final View activityRootView = findViewById(R.id.login_form); activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { int heightDiff = activityRootView.getRootView().getHeight() - activityRootView .getHeight(); ImageView logoImageView = (ImageView) findViewById(R.id.icon_imgview); //Log.d(TAG, activityRootView.getRootView().getHeight() + " - " + // activityRootView.getHeight() + " = " + heightDiff); if(heightDiff > activityRootView.getRootView().getHeight() / 3) { logoImageView.setVisibility(View.GONE); } else { logoImageView.setVisibility(View.VISIBLE); } } }); } /** * Hide logo when landscape, or when soft keyboard showing up in portrait */ public void hideLogoIfNecessary() { if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { ImageView logoImageView = (ImageView) findViewById(R.id.icon_imgview); logoImageView.setVisibility(View.GONE); } else { adjustLoginFormForKeyboardChange(); } } public void attemptLogin() { if(loginTask != null) { return; } usernameEdit.setError(null); passwordEdit.setError(null); username = usernameEdit.getText().toString(); password = passwordEdit.getText().toString(); boolean cancel = false; View focusView = null; if(TextUtils.isEmpty(username)) { CustomToast.showInCenter(getApplicationContext(), R.string.error_username_required); focusView = usernameEdit; cancel = true; } else if(!username.matches(Constants.REGULAR_EXPRESSION_USERNAME)) { CustomToast.showInCenter(getApplicationContext(), R.string.error_invalid_username); focusView = usernameEdit; cancel = true; } else if(TextUtils.isEmpty(password)) { CustomToast.showInCenter(getApplicationContext(), R.string.error_password_required); focusView = passwordEdit; cancel = true; } else if(password.contains(" ")) { CustomToast.showInCenter(getApplicationContext(), R.string.error_invalid_password); focusView = passwordEdit; cancel = true; } if(cancel) { focusView.requestFocus(); } else { customProgressDialog.show(getString(R.string.login_progress_signing_in)); //Hide soft keyboard InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context .INPUT_METHOD_SERVICE); if(getCurrentFocus() != null) { inputMethodManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0); } loginTask = new LoginTask(); loginTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } } public class LoginTask extends AsyncTask<Void, Void, Boolean> { private String errorMessage = null; private AppUser newUser = null; @Override protected Boolean doInBackground(Void... params) { try { ApiKeyPair userKeyPair = API.requestUserKeyPairFromEvercam(username, password); String userApiKey = userKeyPair.getApiKey(); String userApiId = userKeyPair.getApiId(); API.setUserKeyPair(userApiKey, userApiId); User evercamUser = new User(username); newUser = new AppUser(evercamUser); newUser.setApiKeyPair(userApiKey, userApiId); return true; } catch(EvercamException e) { Log.e(TAG, e.toString()); if(e.getMessage().contains(getString(R.string.prefix_invalid)) || e.getMessage() .contains(getString(R.string.prefix_no_user))) { errorMessage = e.getMessage(); } else { } } return false; } @Override protected void onPostExecute(final Boolean success) { loginTask = null; customProgressDialog.dismiss(); if(success) { AppData.defaultUser = newUser; new EvercamAccount(LoginActivity.this).add(newUser); setResult(Constants.RESULT_TRUE); startCamerasActivity(); getMixpanel().identifyUser(newUser.getUsername()); getMixpanel().sendEvent(R.string.mixpanel_event_sign_in, null); } else { if(errorMessage != null) { CustomToast.showInCenter(getApplicationContext(), errorMessage); } else { EvercamPlayApplication.sendCaughtException(LoginActivity.this, getString(R.string.exception_error_login)); CustomedDialog.showUnexpectedErrorDialog(LoginActivity.this); } passwordEdit.setText(null); } } @Override protected void onCancelled() { loginTask = null; customProgressDialog.dismiss(); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if(requestCode == Constants.REQUEST_CODE_SIGN_UP) { if(resultCode == Constants.RESULT_TRUE) { setResult(Constants.RESULT_TRUE); finish(); } } } private void startCamerasActivity() { if(CamerasActivity.activity != null) { try { CamerasActivity.activity.finish(); } catch(Exception e) { Log.e(TAG, e.toString(), e); } } Intent intent = new Intent(this, CamerasActivity.class); this.startActivity(intent); this.finish(); } class LoginCheckInternetTask extends CheckInternetTask { InternetCheckType type; public LoginCheckInternetTask(Context context, InternetCheckType type) { super(context); this.type = type; } @Override protected void onPostExecute(Boolean hasNetwork) { if(hasNetwork) { if(type == InternetCheckType.LOGIN) { attemptLogin(); } else if(type == InternetCheckType.SIGNUP) { Intent signupIntent = new Intent(LoginActivity.this, SignUpActivity.class); startActivityForResult(signupIntent, Constants.REQUEST_CODE_SIGN_UP); } } else { CustomedDialog.showInternetNotConnectDialog(LoginActivity.this); } } } }