/* * Copyright (c) 2015 Ushahidi Inc * * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU Affero 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 Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program in the file LICENSE-AGPL. If not, see * https://www.gnu.org/licenses/agpl-3.0.html */ package com.ushahidi.platform.mobile.app.presentation.view.ui.fragment; import com.addhen.android.raiburari.presentation.ui.fragment.BaseFragment; import com.ushahidi.platform.mobile.app.R; import com.ushahidi.platform.mobile.app.presentation.di.components.account.LoginComponent; import com.ushahidi.platform.mobile.app.presentation.model.DeploymentModel; import com.ushahidi.platform.mobile.app.presentation.model.UserAccountModel; import com.ushahidi.platform.mobile.app.presentation.presenter.account.LoginPresenter; import com.ushahidi.platform.mobile.app.presentation.view.account.LoginView; import com.ushahidi.platform.mobile.app.presentation.view.ui.activity.LoginActivity; import com.ushahidi.platform.mobile.app.presentation.view.ui.adapter.DeploymentSpinnerAdapter; import android.accounts.Account; import android.accounts.AccountManager; import android.content.Context; import android.os.Bundle; import android.util.Patterns; import android.view.View; import android.widget.ArrayAdapter; import android.widget.AutoCompleteTextView; import android.widget.Button; import android.widget.EditText; import android.widget.ProgressBar; import android.widget.RadioButton; import android.widget.RadioGroup; import android.widget.Spinner; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import javax.inject.Inject; import butterknife.Bind; import butterknife.OnClick; import rx.Subscription; /** * @author Ushahidi Team <team@ushahidi.com> */ public class LoginFragment extends BaseFragment implements RadioGroup.OnCheckedChangeListener, LoginView { private static LoginFragment mLoginFragment; @Bind(R.id.login_username) EditText mUsername; @Bind(R.id.login_password) EditText mPassword; @Bind(R.id.login_submit_btn) Button mLoginButton; @Bind(R.id.select_deployment) Spinner mSpinner; @Bind(R.id.login_type) RadioGroup mTypeRadioGroup; @Bind(R.id.radio_btn_login) RadioButton mLoginRadioButton; @Bind(R.id.radio_btn_register) RadioButton mRegisterRadioButton; @Bind(R.id.active_email) AutoCompleteTextView mEmailAutoComplete; @Bind(R.id.login_progress_bar) ProgressBar mProgressBar; @Inject LoginPresenter mLoginPresenter; private DeploymentSpinnerAdapter mDeploymentSpinnerArrayAdapter; private Subscription mSubscribe; public LoginFragment() { super(R.layout.fragment_login, 0); } public static LoginFragment newInstance() { if (mLoginFragment == null) { mLoginFragment = new LoginFragment(); } return mLoginFragment; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); intialize(); } @Override public void onPause() { super.onPause(); if (mSubscribe != null) { mSubscribe.unsubscribe(); } } private void intialize() { getLoginComponent(LoginComponent.class).inject(this); mLoginPresenter.setView(this); initView(); } private void initView() { mTypeRadioGroup.setOnCheckedChangeListener(this); mLoginRadioButton.setChecked(true); mEmailAutoComplete.setOnFocusChangeListener( (v, hasFocus) -> mEmailAutoComplete.showDropDown()); mLoginPresenter.getDeploymentList(); mRegisterRadioButton.setVisibility(View.GONE); } @OnClick(R.id.login_submit_btn) public void onSubmit() { submit(); } private void submit() { mPassword.setError(null); // TODO: Implement user logins switch (mTypeRadioGroup.getCheckedRadioButtonId()) { case R.id.radio_btn_login: UserAccountModel userAccountModel = new UserAccountModel(); userAccountModel.setAccountName(mUsername.getText().toString().trim()); userAccountModel.setPassword(mPassword.getText().toString().trim()); mLoginPresenter.performLogin(userAccountModel); break; default: // do nothing } } /*private void validate() { mSubscribe = Observable.combineLatest(mUsernameText, mPasswordText, (Func2<OnTextChangeEvent, OnTextChangeEvent, Boolean>) (onTextChangeEvent, onTextChangeEvent2) -> false); }*/ @Override public void onCheckedChanged(RadioGroup radioGroup, int checkedId) { switch (checkedId) { case R.id.radio_btn_login: mLoginButton.setText(R.string.login); mEmailAutoComplete.setText(null); mEmailAutoComplete.setVisibility(View.GONE); // Set actionbar title to login getActivity().setTitle(getResources().getString(R.string.login)); break; case R.id.radio_btn_register: mLoginButton.setText(R.string.register); mEmailAutoComplete.setVisibility(View.VISIBLE); // Set actionbar title to register getActivity().setTitle(getResources().getString(R.string.register)); if (mEmailAutoComplete.getAdapter() == null) { final Set<String> emailSet = new HashSet<>(); for (Account account : AccountManager.get(getActivity()).getAccounts()) { if (Patterns.EMAIL_ADDRESS.matcher(account.name).matches()) { emailSet.add(account.name); } } List<String> emails = new ArrayList<>(emailSet); mEmailAutoComplete.setAdapter(new ArrayAdapter<>(getActivity(), android.R.layout.simple_spinner_dropdown_item, emails)); } break; default: // do nothing } } @Override public void deploymentList(List<DeploymentModel> deploymentModels) { mDeploymentSpinnerArrayAdapter = new DeploymentSpinnerAdapter(getAppContext(), deploymentModels); mSpinner.setAdapter(mDeploymentSpinnerArrayAdapter); // By default, select the active deployment. // TODO: Get the active deployment and make it the selected value mSpinner.setSelection(0); } @Override public void loginCompleted() { getActivity().finish(); } @Override public void showLoading() { mLoginButton.setVisibility(View.GONE); mProgressBar.setIndeterminate(true); mProgressBar.setVisibility(View.VISIBLE); } @Override public void hideLoading() { mLoginButton.setVisibility(View.VISIBLE); mProgressBar.setIndeterminate(false); mProgressBar.setVisibility(View.GONE); } @Override public void showRetry() { // Do nothing } @Override public void hideRetry() { // Do nothing } @Override public void showError(String s) { showSnackbar(getView(), s); } @Override public Context getAppContext() { return getActivity(); } private <C> C getLoginComponent(Class<C> componentType) { return componentType.cast(((LoginActivity) getActivity()).getLoginComponent()); } }