package adonai.diary_browser; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.AutoCompleteTextView; import android.widget.Button; import android.widget.CheckBox; import android.widget.EditText; import android.widget.Toast; import android.widget.ViewSwitcher; import com.j256.ormlite.dao.RuntimeExceptionDao; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.Callable; import adonai.diary_browser.database.DbProvider; import adonai.diary_browser.database.PersistManager; import adonai.diary_browser.entities.CredentialsItem; import adonai.diary_browser.preferences.PreferencePage; public class AuthorizationForm extends AppCompatActivity implements OnClickListener { // общее private static final String AUTH_PAIR_DELIMITER = "=logPassSplitter="; private static final String AUTHS_DELIMITER = "=pairSplitter="; private static int LOGIN_FORM = 0; private static int REGISTER_FORM = 1; private ViewSwitcher mSwitcher; private SharedPreferences mPreferences; // авторизация private Button mLogin, mRequestRegistration; private AutoCompleteTextView mUsername; private EditText mPassword; private CheckBox mKeepAuth; @Override public void onCreate(Bundle savedInstanceState) { Utils.setupTheme(this); super.onCreate(savedInstanceState); setContentView(R.layout.authorization_form_a); getSupportActionBar().setHomeButtonEnabled(true); mPreferences = getApplicationContext().getSharedPreferences(Utils.mPrefsFile, MODE_PRIVATE); mSwitcher = (ViewSwitcher) findViewById(R.id.login_register_switcher); mLogin = (Button) findViewById(R.id.login_button); mLogin.setOnClickListener(this); mRequestRegistration = (Button) findViewById(R.id.request_reg_button); mRequestRegistration.setOnClickListener(this); mUsername = (AutoCompleteTextView) findViewById(R.id.login_text); mPassword = (EditText) findViewById(R.id.password_text); mKeepAuth = (CheckBox) findViewById(R.id.keep_auth_check); } @Override protected void onDestroy() { super.onDestroy(); } @Override protected void onStart() { super.onStart(); if(mPreferences.contains(Utils.KEY_USERPASS_CACHE)) { migrateAuthToDb(); } loadAuthFromDb(); } private void loadAuthFromDb() { RuntimeExceptionDao<CredentialsItem, String> credDao = DbProvider.getHelper().getCredentialsDao(); List<CredentialsItem> saved = credDao.queryForAll(); ArrayAdapter<CredentialsItem> credAdapter = new ArrayAdapter<>(this, android.R.layout.simple_dropdown_item_1line, saved); mUsername.setAdapter(credAdapter); mUsername.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { CredentialsItem creds = (CredentialsItem) parent.getItemAtPosition(position); mUsername.setText(creds.getUsername()); mPassword.setText(creds.getPassword()); } }); List<CredentialsItem> autoloadSingle = credDao.queryForEq("autologin", true); if(autoloadSingle.isEmpty()) { // ещё нет аккаунта, в который производился вход return; } CredentialsItem autoload = autoloadSingle.get(0); mUsername.setText(autoload.getUsername()); mPassword.setText(autoload.getPassword()); } private void migrateAuthToDb() { // последний раз загрузим по-старому String[] logKeyPair = mPreferences.getString(Utils.KEY_USERPASS_CACHE, "").split(AUTHS_DELIMITER); if (logKeyPair.length == 1 && logKeyPair[0].isEmpty()) // not found return; final Map<String, CredentialsItem> oldCreds = new HashMap<>(); for (String logKey : logKeyPair) { String[] curr = logKey.split(AUTH_PAIR_DELIMITER); CredentialsItem credItem = new CredentialsItem(); credItem.setUsername(curr[0]); credItem.setPassword(curr[1]); oldCreds.put(curr[0], credItem); } // запомним активный по умолчанию логин (если имеется) mKeepAuth.setChecked(mPreferences.getBoolean(Utils.KEY_KEEP_AUTH, true)); if (mKeepAuth.isChecked()) { String activeLogin = mPreferences.getString(Utils.KEY_USERNAME, ""); mUsername.setText(activeLogin); String activePassword = mPreferences.getString(Utils.KEY_PASSWORD, ""); mPassword.setText(activePassword); CredentialsItem activeCredentials = new CredentialsItem(); activeCredentials.setUsername(activeLogin); activeCredentials.setPassword(activePassword); oldCreds.put(activeLogin, activeCredentials); } // загружаем данные в БД final RuntimeExceptionDao<CredentialsItem, String> credDao = DbProvider.getHelper().getCredentialsDao(); credDao.callBatchTasks(new Callable<Void>() { public Void call() throws Exception { for (CredentialsItem account : oldCreds.values()) { credDao.create(account); } return null; } }); mPreferences.edit() .remove(Utils.KEY_USERPASS_CACHE) .remove(Utils.KEY_KEEP_AUTH) .remove(Utils.KEY_USERNAME) .remove(Utils.KEY_PASSWORD) .apply(); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.authorization_form_a, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.menu_settings: startActivity(new Intent(this, PreferencePage.class)); return true; case android.R.id.home: onBackPressed(); return true; default: return super.onOptionsItemSelected(item); } } @Override public void onBackPressed() { if(mSwitcher.getDisplayedChild() == REGISTER_FORM) { mSwitcher.showPrevious(); getSupportActionBar().setDisplayHomeAsUpEnabled(false); } else { super.onBackPressed(); } } public void onClick(View v) { switch (v.getId()) { case R.id.login_button: if (mUsername.getText().toString().isEmpty() || mPassword.getText().toString().isEmpty()) { Toast.makeText(this, R.string.details_missing, Toast.LENGTH_LONG).show(); return; } // убираем автологин у всех аккаунтов // по идее, будет всего один RuntimeExceptionDao<CredentialsItem, String> credDao = DbProvider.getHelper().getCredentialsDao(); for (CredentialsItem item : credDao.queryForEq("autologin", true)) { item.setAutologin(false); credDao.update(item); } CredentialsItem entered = new CredentialsItem(); entered.setUsername(mUsername.getText().toString()); entered.setPassword(mPassword.getText().toString()); if (mKeepAuth.isChecked()) { // сохраняем автологин у выбранного entered.setAutologin(true); } credDao.createOrUpdate(entered); // сохраняем последний логин в настройки, чтобы понять позже в NetworkService, под кем заходить mPreferences.edit().putString(Utils.KEY_USERNAME, entered.getUsername()).apply(); // переходим в основную активность startActivity(new Intent(this, DiaryListActivity.class)); finish(); break; case R.id.request_reg_button: mSwitcher.showNext(); getSupportActionBar().setDisplayHomeAsUpEnabled(true); break; default: Toast.makeText(this, R.string.not_impl_sc, Toast.LENGTH_LONG).show(); } } }