package com.halzhang.android.apps.startupnews.ui.fragment;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.text.TextUtils;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.EditorInfo;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import com.halzhang.android.apps.startupnews.Constants;
import com.halzhang.android.apps.startupnews.R;
import com.halzhang.android.apps.startupnews.presenter.LoginContract;
import com.halzhang.android.common.CDToast;
import rx.Subscription;
/**
* A simple {@link Fragment} subclass.
* Use the {@link LoginFragment#newInstance} factory method to
* create an instance of this fragment.
*/
public class LoginFragment extends BaseFragment implements LoginContract.View {
// UI references.
private EditText mUsernameView;
private EditText mPasswordView;
private View mLoginFormView;
private View mLoginStatusView;
private TextView mLoginStatusMessageView;
private LoginContract.Presenter mPresenter;
public LoginFragment() {
}
public static LoginFragment newInstance() {
return new LoginFragment();
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public void onAttach(Context activity) {
super.onAttach(activity);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_login, null);
mUsernameView = (EditText) view.findViewById(R.id.username);
mPasswordView = (EditText) view.findViewById(R.id.password);
mPasswordView.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView textView, int id, KeyEvent keyEvent) {
if (id == R.id.login || id == EditorInfo.IME_NULL) {
attemptLogin();
return true;
}
return false;
}
});
mLoginFormView = view.findViewById(R.id.login_form);
mLoginStatusView = view.findViewById(R.id.login_status);
mLoginStatusMessageView = (TextView) view.findViewById(R.id.login_status_message);
mLoginStatusMessageView.setText(R.string.login_progress_init);
showProgress(false);
Button loginBtn = (Button) view.findViewById(R.id.btn_login);
loginBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
attemptLogin();
}
});
return view;
}
/**
* Attempts to sign in or register the account specified by the login
* form. If there are form errors (invalid email, missing fields, etc.),
* the errors are presented and no actual login attempt is made.
*/
public void attemptLogin() {
// Reset errors.
mUsernameView.setError(null);
mPasswordView.setError(null);
String username = mUsernameView.getText().toString();
String password = mPasswordView.getText().toString();
boolean cancel = false;
View focusView = null;
if (TextUtils.isEmpty(password)) {
mPasswordView.setError(getString(R.string.error_field_required));
focusView = mPasswordView;
cancel = true;
}
if (TextUtils.isEmpty(username)) {
mUsernameView.setError(getString(R.string.error_field_required));
focusView = mUsernameView;
cancel = true;
}
if (cancel) {
focusView.requestFocus();
} else {
mLoginStatusMessageView.setText(R.string.login_progress_signing_in);
showProgress(true);
mPresenter.login(username, password);
}
}
/**
* Shows the progress UI and hides the login form.
*/
@TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2)
public void showProgress(final boolean show) {
if (getActivity() == null) {
//防止 not attact to activity 出错
return;
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
int shortAnimTime = getResources().getInteger(
android.R.integer.config_shortAnimTime);
mLoginStatusView.setVisibility(View.INVISIBLE);
mLoginStatusView.animate().setDuration(shortAnimTime).alpha(show ? 1 : 0)
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
mLoginStatusView.setVisibility(show ? View.VISIBLE : View.GONE);
}
});
mLoginFormView.setVisibility(View.INVISIBLE);
mLoginFormView.animate().setDuration(shortAnimTime).alpha(show ? 0 : 1)
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE);
}
});
} else {
mLoginStatusView.setVisibility(show ? View.VISIBLE : View.GONE);
mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE);
}
}
@Override
public void onLoginError(Throwable e) {
e.printStackTrace();
}
@Override
public void onLoginResult(String user) {
Activity activity = getActivity();
if (activity == null || activity.isFinishing()) {
return;
}
showProgress(false);
if (!TextUtils.isEmpty(user)) {
CDToast.showToast(activity, R.string.tip_login_success);
Intent intent = new Intent(Constants.IntentAction.ACTION_LOGIN);
intent.putExtra(Constants.IntentAction.EXTRA_LOGIN_USER, user);
activity.sendBroadcast(intent);
activity.finish();
} else {
CDToast.showToast(activity, R.string.tip_login_failure);
}
}
@Override
public void addSubscription(Subscription subscription) {
mCompositeSubscription.add(subscription);
}
@Override
public void setPresenter(LoginContract.Presenter presenter) {
mPresenter = presenter;
}
@Override
public boolean isActive() {
return isAdded();
}
}