/* * Copyright (c) 2015 Ha Duy Trung * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package io.github.hidroh.materialistic; import android.accounts.Account; import android.accounts.AccountManager; import android.os.Bundle; import android.support.design.widget.TextInputLayout; import android.text.TextUtils; import android.view.View; import android.widget.EditText; import android.widget.Toast; import java.lang.ref.WeakReference; import javax.inject.Inject; import io.github.hidroh.materialistic.accounts.UserServices; public class LoginActivity extends AccountAuthenticatorActivity { public static final String EXTRA_ADD_ACCOUNT = LoginActivity.class.getName() + ".EXTRA_ADD_ACCOUNT"; @Inject UserServices mUserServices; @Inject AccountManager mAccountManager; private View mLoginButton; private View mRegisterButton; private TextInputLayout mUsernameLayout; private TextInputLayout mPasswordLayout; private EditText mUsernameEditText; private EditText mPasswordEditText; private String mUsername; private String mPassword; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); String username = Preferences.getUsername(this); boolean addAccount = getIntent().getBooleanExtra(EXTRA_ADD_ACCOUNT, false); setContentView(R.layout.activity_login); mUsernameLayout = (TextInputLayout) findViewById(R.id.textinput_username); mPasswordLayout = (TextInputLayout) findViewById(R.id.textinput_password); mUsernameEditText = (EditText) findViewById(R.id.edittext_username); mLoginButton = findViewById(R.id.login_button); mRegisterButton = findViewById(R.id.register_button); if (!addAccount && !TextUtils.isEmpty(username)) { setTitle(R.string.re_enter_password); mUsernameEditText.setText(username); mRegisterButton.setVisibility(View.GONE); } mPasswordEditText = (EditText) findViewById(R.id.edittext_password); mLoginButton.setOnClickListener(v -> { if (!validate()) { return; } mLoginButton.setEnabled(false); mRegisterButton.setEnabled(false); login(mUsernameEditText.getText().toString(), mPasswordEditText.getText().toString(), false); }); mRegisterButton.setOnClickListener(v -> { if (!validate()) { return; } mLoginButton.setEnabled(false); mRegisterButton.setEnabled(false); login(mUsernameEditText.getText().toString().trim(), mPasswordEditText.getText().toString().trim(), true); }); } @Override protected boolean isDialogTheme() { return true; } private boolean validate() { mUsernameLayout.setErrorEnabled(false); mPasswordLayout.setErrorEnabled(false); if (mUsernameEditText.length() == 0) { mUsernameLayout.setError(getString(R.string.username_required)); } if (mPasswordEditText.length() == 0) { mPasswordLayout.setError(getString(R.string.password_required)); } return mUsernameEditText.length() > 0 && mPasswordEditText.length() > 0; } private void login(String username, String password, boolean createAccount) { mUsername = username; mPassword = password; mUserServices.login(username, password, createAccount, new LoginCallback(this)); } void onLoggedIn(boolean successful, String errorMessage) { mLoginButton.setEnabled(true); mRegisterButton.setEnabled(true); if (successful) { addAccount(mUsername, mPassword); Toast.makeText(this, getString(R.string.welcome, mUsername), Toast.LENGTH_SHORT).show(); } else { Toast.makeText(this, TextUtils.isEmpty(errorMessage) ? getString(R.string.login_failed) : errorMessage, Toast.LENGTH_SHORT).show(); } } private void addAccount(String username, String password) { Account account = new Account(username, BuildConfig.APPLICATION_ID); mAccountManager.addAccountExplicitly(account, password, null); mAccountManager.setPassword(account, password); // for re-login with updated password Bundle bundle = new Bundle(); bundle.putString(AccountManager.KEY_ACCOUNT_NAME, username); bundle.putString(AccountManager.KEY_ACCOUNT_TYPE, BuildConfig.APPLICATION_ID); setAccountAuthenticatorResult(bundle); Preferences.setUsername(this, username); finish(); } static class LoginCallback extends UserServices.Callback { private final WeakReference<LoginActivity> mLoginActivity; LoginCallback(LoginActivity loginActivity) { mLoginActivity = new WeakReference<>(loginActivity); } @Override public void onDone(boolean successful) { if (mLoginActivity.get() != null && !mLoginActivity.get().isActivityDestroyed()) { mLoginActivity.get().onLoggedIn(successful, null); } } @Override public void onError(Throwable throwable) { if (mLoginActivity.get() != null && !mLoginActivity.get().isActivityDestroyed()) { mLoginActivity.get().onLoggedIn(false, throwable != null ? throwable.getMessage() : null); } } } }