/* * Copyright (C) 2015 Federico Iosue (federico.iosue@gmail.com) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package it.feio.android.omninotes; import android.annotation.SuppressLint; import android.os.Bundle; import android.util.DisplayMetrics; import android.view.ViewGroup; import android.widget.EditText; import com.afollestad.materialdialogs.MaterialDialog; import de.keyboardsurfer.android.widget.crouton.Crouton; import de.keyboardsurfer.android.widget.crouton.LifecycleCallback; import it.feio.android.omninotes.async.bus.PasswordRemovedEvent; import it.feio.android.omninotes.db.DbHelper; import it.feio.android.omninotes.models.ONStyle; import it.feio.android.omninotes.utils.Constants; import it.feio.android.omninotes.utils.PasswordHelper; import it.feio.android.omninotes.utils.Security; import rx.Observable; import rx.android.schedulers.AndroidSchedulers; import rx.schedulers.Schedulers; public class PasswordActivity extends BaseActivity { private ViewGroup crouton_handle; private EditText passwordCheck; private EditText password; private EditText question; private EditText answer; private EditText answerCheck; private PasswordActivity mActivity; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); DisplayMetrics metrics = getResources().getDisplayMetrics(); int screenWidth = (int) (metrics.widthPixels * 0.80); int screenHeight = (int) (metrics.heightPixels * 0.80); setContentView(R.layout.activity_password); getWindow().setLayout(screenWidth, screenHeight); mActivity = this; setActionBarTitle(getString(R.string.title_activity_password)); initViews(); } private void initViews() { crouton_handle = (ViewGroup) findViewById(R.id.crouton_handle); password = (EditText) findViewById(R.id.password); passwordCheck = (EditText) findViewById(R.id.password_check); question = (EditText) findViewById(R.id.question); answer = (EditText) findViewById(R.id.answer); answerCheck = (EditText) findViewById(R.id.answer_check); findViewById(R.id.password_remove).setOnClickListener(v -> { if (prefs.getString(Constants.PREF_PASSWORD, null) != null) { PasswordHelper.requestPassword(mActivity, passwordConfirmed -> { if (passwordConfirmed) { updatePassword(null, null, null); } }); } else { Crouton.makeText(mActivity, R.string.password_not_set, ONStyle.WARN, crouton_handle).show(); } }); findViewById(R.id.password_confirm).setOnClickListener(v -> { if (checkData()) { final String passwordText = password.getText().toString(); final String questionText = question.getText().toString(); final String answerText = answer.getText().toString(); if (prefs.getString(Constants.PREF_PASSWORD, null) != null) { PasswordHelper.requestPassword(mActivity, passwordConfirmed -> { if (passwordConfirmed) { updatePassword(passwordText, questionText, answerText); } }); } else { updatePassword(passwordText, questionText, answerText); } } }); findViewById(R.id.password_forgotten).setOnClickListener(v -> { if (prefs.getString(Constants.PREF_PASSWORD, "").length() == 0) { Crouton.makeText(mActivity, R.string.password_not_set, ONStyle.WARN, crouton_handle).show(); return; } PasswordHelper.resetPassword(this); }); } public void onEvent(PasswordRemovedEvent passwordRemovedEvent) { passwordCheck.setText(""); password.setText(""); question.setText(""); answer.setText(""); answerCheck.setText(""); Crouton crouton = Crouton.makeText(mActivity, R.string.password_successfully_removed, ONStyle .ALERT, crouton_handle); crouton.setLifecycleCallback(new LifecycleCallback() { @Override public void onDisplayed() { // Does nothing! } @Override public void onRemoved() { onBackPressed(); } }); crouton.show(); } @SuppressLint("CommitPrefEdits") private void updatePassword(String passwordText, String questionText, String answerText) { if (passwordText == null) { if (prefs.getString(Constants.PREF_PASSWORD, "").length() == 0) { Crouton.makeText(mActivity, R.string.password_not_set, ONStyle.WARN, crouton_handle).show(); return; } new MaterialDialog.Builder(mActivity) .content(R.string.agree_unlocking_all_notes) .positiveText(R.string.ok) .callback(new MaterialDialog.ButtonCallback() { @Override public void onPositive(MaterialDialog materialDialog) { PasswordHelper.removePassword(); } }).build().show(); } else if (passwordText.length() == 0) { Crouton.makeText(mActivity, R.string.empty_password, ONStyle.WARN, crouton_handle).show(); } else { Observable .from(DbHelper.getInstance().getNotesWithLock(true)) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .doOnSubscribe(() -> prefs.edit() .putString(Constants.PREF_PASSWORD, Security.md5(passwordText)) .putString(Constants.PREF_PASSWORD_QUESTION, questionText) .putString(Constants.PREF_PASSWORD_ANSWER, Security.md5(answerText)) .commit()) .doOnNext(note -> DbHelper.getInstance().updateNote(note, false)) .doOnCompleted(() -> { Crouton crouton = Crouton.makeText(mActivity, R.string.password_successfully_changed, ONStyle .CONFIRM, crouton_handle); crouton.setLifecycleCallback(new LifecycleCallback() { @Override public void onDisplayed() { // Does nothing! } @Override public void onRemoved() { onBackPressed(); } }); crouton.show(); }) .subscribe(); } } /** * Checks correctness of form data * * @return */ private boolean checkData() { boolean res = true; if (password.getText().length() == passwordCheck.getText().length() && passwordCheck.getText().length() == 0) { return true; } boolean passwordOk = password.getText().toString().length() > 0; boolean passwordCheckOk = passwordCheck.getText().toString().length() > 0 && password.getText().toString() .equals(passwordCheck.getText().toString()); boolean questionOk = question.getText().toString().length() > 0; boolean answerOk = answer.getText().toString().length() > 0; boolean answerCheckOk = answerCheck.getText().toString().length() > 0 && answer.getText().toString().equals (answerCheck.getText().toString()); if (!passwordOk || !passwordCheckOk || !questionOk || !answerOk || !answerCheckOk) { res = false; if (!passwordOk) { password.setError(getString(R.string.settings_password_not_matching)); } if (!passwordCheckOk) { passwordCheck.setError(getString(R.string.settings_password_not_matching)); } if (!questionOk) { question.setError(getString(R.string.settings_password_question)); } if (!answerOk) { answer.setError(getString(R.string.settings_answer_not_matching)); } if (!answerCheckOk) { answerCheck.setError(getString(R.string.settings_answer_not_matching)); } } return res; } @Override public void onBackPressed() { setResult(RESULT_OK); finish(); } }