/*
* Copyright 2013 JNRain
*
* 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 org.jnrain.mobile.accounts.kbs;
import name.xen0n.cytosol.data.SimpleReturnCode;
import name.xen0n.cytosol.ui.util.DialogHelper;
import name.xen0n.cytosol.ui.util.ToastHelper;
import org.jnrain.mobile.R;
import org.jnrain.mobile.accounts.AccountConstants;
import org.jnrain.mobile.ui.base.JNRainAccountAuthenticatorActivity;
import org.jnrain.mobile.ui.base.LoginPoint;
import org.jnrain.mobile.util.GlobalState;
import roboguice.inject.InjectView;
import android.accounts.Account;
import android.accounts.AccountManager;
import android.annotation.SuppressLint;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
@SuppressLint("DefaultLocale")
public class KBSLoginActivity
extends JNRainAccountAuthenticatorActivity<SimpleReturnCode>
implements LoginPoint {
public static final String PARAM_AUTHTOKEN_TYPE = "org.jnrain.mobile.authtoken";
public static final String PARAM_USERNAME = "org.jnrain.mobile.username";
public static final String PARAM_CONFIRM_CREDENTIALS = "org.jnrain.mobile.confirm_creds";
// register action for startActivityForResult()
public static final int REGISTER_REQUEST = 1;
@InjectView(R.id.editUID)
EditText editUID;
@InjectView(R.id.editPassword)
EditText editPassword;
@InjectView(R.id.btnLogin)
Button btnLogin;
@InjectView(R.id.btnRegister)
Button btnRegister;
private static final String TAG = "LoginActivity";
public KBSLoginActivity loginActivity;
private ProgressDialog loadingDlg;
private Handler mHandler;
// Authentication framework things
private AccountManager accountManager;
private String authTokenType;
private String userName;
private boolean requestNewAccount;
private boolean confirmCredentials;
@Override
protected void onCreate(Bundle savedInstanceState) {
loginActivity = this;
super.onCreate(savedInstanceState);
setContentView(R.layout.frag_kbs_login);
// account manager
accountManager = AccountManager.get(this);
Intent intent = getIntent();
userName = intent.getStringExtra(PARAM_USERNAME);
authTokenType = intent.getStringExtra(PARAM_AUTHTOKEN_TYPE);
requestNewAccount = userName == null;
confirmCredentials = intent.getBooleanExtra(
PARAM_CONFIRM_CREDENTIALS,
false);
if (!TextUtils.isEmpty(userName)) {
// set username to fixed
editUID.setText(userName);
editUID.setEnabled(false);
editUID.setFocusable(false);
}
btnLogin.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Log.i(TAG, "Login button clicked");
doLogin(
editUID.getText().toString().toLowerCase(),
editPassword.getText().toString());
}
});
btnRegister.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
showRegisterActivity();
}
});
setUpLoginConfig();
}
private void setUpLoginConfig() {
mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
loadingDlg = DialogHelper.showProgressDialog(
KBSLoginActivity.this,
R.string.login_dlg_title,
R.string.please_wait,
false,
false);
}
};
}
public void doLogin(final String uid, final String psw) {
mHandler.sendMessage(new Message());
spiceManager.execute(
new KBSLoginRequest(uid, psw),
new KBSLoginRequestListener(loginActivity, null, uid, psw));
}
public ProgressDialog getLoadingDialog() {
return loadingDlg;
}
/* Authentication things */
protected void finishConfirmCredentials(
String uid,
String psw,
boolean result) {
final Account account = new Account(
uid,
AccountConstants.ACCOUNT_TYPE_KBS);
accountManager.setPassword(account, psw);
final Intent intent = new Intent();
intent.putExtra(AccountManager.KEY_BOOLEAN_RESULT, result);
setAccountAuthenticatorResult(intent.getExtras());
setResult(RESULT_OK, intent);
finish();
}
protected void finishLogin(final String uid, final String psw) {
final Intent intent = new Intent();
intent.putExtra(AccountManager.KEY_ACCOUNT_NAME, uid);
intent.putExtra(
AccountManager.KEY_ACCOUNT_TYPE,
AccountConstants.ACCOUNT_TYPE_KBS);
if (AccountConstants.ACCOUNT_TYPE_KBS.equals(authTokenType))
intent.putExtra(AccountManager.KEY_AUTHTOKEN, psw);
setAccountAuthenticatorResult(intent.getExtras());
setResult(RESULT_OK, intent);
finish();
}
public void onAuthenticationSuccess(
Account account,
String uid,
String psw) {
assert uid.length() > 0;
assert account == null;
// successful
ToastHelper.makeTextToast(this, R.string.msg_login_success);
if (confirmCredentials) {
finishConfirmCredentials(uid, psw, true);
return;
}
Account acct = new Account(uid, AccountConstants.ACCOUNT_TYPE_KBS);
if (requestNewAccount) {
accountManager.addAccountExplicitly(acct, psw, null);
} else {
accountManager.setPassword(acct, psw);
}
// avoid repeated login on subsequent main activity launch
GlobalState.setAccount(acct);
finishLogin(uid, psw);
}
public void showRegisterActivity() {
final Intent intent = new Intent(this, KBSRegisterActivity.class);
startActivityForResult(intent, REGISTER_REQUEST);
}
@Override
protected void onActivityResult(
int requestCode,
int resultCode,
Intent data) {
if (requestCode == REGISTER_REQUEST) {
if (resultCode == RESULT_OK) {
String uid = data
.getStringExtra(KBSRegisterActivity.PARAM_NEW_UID);
String psw = data
.getStringExtra(KBSRegisterActivity.PARAM_NEW_PSW);
editUID.setText(uid);
editPassword.setText(psw);
}
return;
}
super.onActivityResult(requestCode, resultCode, data);
}
}