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(); } }