package org.cnodejs.android.md.ui.activity;
import android.app.Activity;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.widget.Toolbar;
import android.text.TextUtils;
import com.rengwuxian.materialedittext.MaterialEditText;
import org.cnodejs.android.md.R;
import org.cnodejs.android.md.model.entity.Result;
import org.cnodejs.android.md.model.storage.LoginShared;
import org.cnodejs.android.md.presenter.contract.ILoginPresenter;
import org.cnodejs.android.md.presenter.implement.LoginPresenter;
import org.cnodejs.android.md.ui.base.FullLayoutActivity;
import org.cnodejs.android.md.ui.dialog.AlertDialogUtils;
import org.cnodejs.android.md.ui.dialog.ProgressDialog;
import org.cnodejs.android.md.ui.listener.DialogCancelCallListener;
import org.cnodejs.android.md.ui.listener.NavigationFinishClickListener;
import org.cnodejs.android.md.ui.util.ThemeUtils;
import org.cnodejs.android.md.ui.util.ToastUtils;
import org.cnodejs.android.md.ui.view.ILoginView;
import org.cnodejs.android.md.util.FormatUtils;
import org.cnodejs.android.oauthlogin.CNodeOAuthLoginActivity;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import retrofit2.Call;
public class LoginActivity extends FullLayoutActivity implements ILoginView {
public static final int REQUEST_LOGIN = FormatUtils.generateRequestCode();
private static final int REQUEST_QR_CODE_LOGIN = FormatUtils.generateRequestCode();
private static final int REQUEST_GITHUB_LOGIN = FormatUtils.generateRequestCode();
public static void startForResult(@NonNull Activity activity, int requestCode) {
activity.startActivityForResult(new Intent(activity, LoginActivity.class), requestCode);
}
public static void startForResult(@NonNull Activity activity) {
startForResult(activity, REQUEST_LOGIN);
}
public static boolean checkLogin(@NonNull final Activity activity, final int requestCode) {
if (TextUtils.isEmpty(LoginShared.getAccessToken(activity))) {
AlertDialogUtils.createBuilderWithAutoTheme(activity)
.setMessage(R.string.need_login_tip)
.setPositiveButton(R.string.login, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
startForResult(activity, requestCode);
}
})
.setNegativeButton(R.string.cancel, null)
.show();
return false;
} else {
return true;
}
}
public static boolean checkLogin(@NonNull Activity activity) {
return checkLogin(activity, REQUEST_LOGIN);
}
@BindView(R.id.toolbar)
protected Toolbar toolbar;
@BindView(R.id.edt_access_token)
protected MaterialEditText edtAccessToken;
private ProgressDialog progressDialog;
private ILoginPresenter loginPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
ThemeUtils.configThemeBeforeOnCreate(this, R.style.AppThemeLight_FitsStatusBar, R.style.AppThemeDark_FitsStatusBar);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
ButterKnife.bind(this);
toolbar.setNavigationOnClickListener(new NavigationFinishClickListener(this));
progressDialog = ProgressDialog.createWithAutoTheme(this);
loginPresenter = new LoginPresenter(this, this);
}
@OnClick(R.id.btn_login)
protected void onBtnLoginClick() {
loginPresenter.loginAsyncTask(edtAccessToken.getText().toString().trim());
}
@OnClick(R.id.btn_qr_code_login)
protected void onBtnQrCodeLoginClick() {
ScanQRCodeActivity.startForResultWithPermissionCheck(this, REQUEST_QR_CODE_LOGIN);
}
@OnClick(R.id.btn_github_login)
protected void onBtnGithubLoginClick() {
startActivityForResult(new Intent(this, CNodeOAuthLoginActivity.class), REQUEST_GITHUB_LOGIN);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == ScanQRCodeActivity.PERMISSIONS_REQUEST_QR_CODE) {
ScanQRCodeActivity.startForResultWithPermissionHandle(this, REQUEST_QR_CODE_LOGIN);
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK && data != null) {
if (requestCode == REQUEST_QR_CODE_LOGIN) {
edtAccessToken.setText(data.getStringExtra(ScanQRCodeActivity.EXTRA_QR_CODE));
edtAccessToken.setSelection(edtAccessToken.length());
onBtnLoginClick();
} else if (requestCode == REQUEST_GITHUB_LOGIN) {
edtAccessToken.setText(data.getStringExtra(CNodeOAuthLoginActivity.EXTRA_ACCESS_TOKEN));
edtAccessToken.setSelection(edtAccessToken.length());
onBtnLoginClick();
}
}
}
@OnClick(R.id.btn_login_tip)
protected void onBtnLoginTipClick() {
AlertDialogUtils.createBuilderWithAutoTheme(this)
.setMessage(R.string.how_to_get_access_token_tip_content)
.setPositiveButton(R.string.confirm, null)
.show();
}
@Override
public void onAccessTokenError(@NonNull String message) {
edtAccessToken.setError(message);
edtAccessToken.requestFocus();
}
@Override
public void onLoginOk(@NonNull String accessToken, @NonNull Result.Login loginInfo) {
LoginShared.login(this, accessToken, loginInfo);
ToastUtils.with(this).show(R.string.login_success);
setResult(RESULT_OK);
finish();
}
@Override
public void onLoginStart(@NonNull Call<Result.Login> call) {
progressDialog.setOnCancelListener(new DialogCancelCallListener(call));
progressDialog.show();
}
@Override
public void onLoginFinish() {
progressDialog.setOnCancelListener(null);
progressDialog.dismiss();
}
}