package com.rubika.aotalk.account;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Locale;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONException;
import org.json.JSONObject;
import com.google.analytics.tracking.android.EasyTracker;
import com.rubika.aotalk.R;
import com.rubika.aotalk.item.RKNAccount;
import com.rubika.aotalk.util.Logging;
import com.rubika.aotalk.util.RKNet;
import android.accounts.Account;
import android.accounts.AccountAuthenticatorActivity;
import android.accounts.AccountManager;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class LoginActivity extends AccountAuthenticatorActivity {
private static final String APP_TAG = "--> The Leet :: LoginActivity";
private EditText mUsername;
private EditText mPassword;
private Button mLoginButton;
private static Context context;
private RKNAccount rknetaccount = null;
private AccountManager accountManager;
private Account[] accounts;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//super.setTheme(R.style.Theme_AOTalkTheme_Light);
accountManager = AccountManager.get(this);
accounts = accountManager.getAccountsByType(getString(R.string.account_type));
Logging.log(APP_TAG, "Found " + accounts.length + " accounts");
if (accounts == null || accounts.length == 0) {
setContentView(R.layout.account_login);
context = this;
mUsername = (EditText) findViewById(R.id.username);
mPassword = (EditText) findViewById(R.id.password);
mLoginButton = (Button) findViewById(R.id.login);
mLoginButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
String user = mUsername.getText().toString().trim().toLowerCase(Locale.getDefault());
String password = mPassword.getText().toString().trim().toLowerCase(Locale.getDefault());
if (user.length() > 0 && password.length() > 0) {
LoginTask t = new LoginTask(LoginActivity.this);
t.execute(user, password);
}
}
});
TextView register = (TextView) findViewById(R.id.register);
register.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
Intent intent = new Intent(context, RegisterActivity.class);
startActivity(intent);
}
});
} else {
setContentView(R.layout.account_max);
}
}
@Override
protected void onStart() {
super.onStart();
try {
EasyTracker.getInstance().activityStart(this);
} catch (IllegalStateException e) {
Logging.log(APP_TAG, e.getMessage());
}
}
@Override
protected void onStop() {
super.onStop();
try {
EasyTracker.getInstance().activityStop(this);
} catch (IllegalStateException e) {
Logging.log(APP_TAG, e.getMessage());
}
}
private class LoginTask extends AsyncTask<String, Void, Boolean> {
Context mContext;
ProgressDialog mDialog;
LoginTask(Context c) {
mContext = c;
mLoginButton.setEnabled(false);
mDialog = ProgressDialog.show(c, "", getString(R.string.authenticating), true, false);
mDialog.setCancelable(true);
}
@Override
public Boolean doInBackground(String... params) {
String user = params[0];
String pass = params[1];
HttpClient httpclient;
HttpPost httppost;
HttpResponse response;
HttpEntity entity;
InputStream is;
BufferedReader reader;
StringBuilder sb;
String line;
String resultData;
JSONObject json_data;
try {
try {
httpclient = new DefaultHttpClient();
httppost = new HttpPost(RKNet.getApiAccountPath(RKNet.RKNET_ACCOUNT_LOGIN));
JSONObject j = new JSONObject();
j.put("Username", user);
j.put("Password", pass);
httppost.setEntity(new StringEntity(j.toString()));
httppost.setHeader("Accept", "application/json");
httppost.setHeader("Content-type", "application/json");
response = httpclient.execute(httppost);
entity = response.getEntity();
is = entity.getContent();
try {
reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
sb = new StringBuilder();
line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
is.close();
resultData = sb.toString();
} catch(Exception e){
Logging.log(APP_TAG, "Error converting result " + e.toString());
resultData = null;
}
} catch(Exception e){
Logging.log(APP_TAG, "Error in http connection " + e.toString());
resultData = null;
}
try {
if(resultData != null) {
resultData = resultData.substring(0, resultData.lastIndexOf("}")).replace("{\"d\":", "");
Logging.log(APP_TAG, resultData);
if((!resultData.startsWith("null"))) {
json_data = new JSONObject(resultData);
rknetaccount = new RKNAccount(
json_data.getInt("Id"),
json_data.getString("Username"),
json_data.getString("Password")
);
}
}
} catch(JSONException e){
Logging.log(APP_TAG, "Error parsing data " + e.toString());
}
} catch (Exception e) {
e.printStackTrace();
}
if (rknetaccount != null && rknetaccount.getAccountId() > 0) {
Bundle result = null;
Account account = new Account(user, mContext.getString(R.string.account_type));
AccountManager am = AccountManager.get(mContext);
if (am.addAccountExplicitly(account, pass, null)) {
result = new Bundle();
result.putString(AccountManager.KEY_ACCOUNT_NAME, account.name);
result.putString(AccountManager.KEY_ACCOUNT_TYPE, account.type);
setAccountAuthenticatorResult(result);
return true;
} else {
return false;
}
} else {
resultHandler.post(resultRunnable);
return false;
}
}
@Override
public void onPostExecute(Boolean result) {
mLoginButton.setEnabled(true);
mDialog.dismiss();
if (result)
finish();
}
}
private static Handler resultHandler = new Handler();
private static Runnable resultRunnable = new Runnable(){
public void run()
{
Logging.toast(context, context.getString(R.string.login_error));
}
};
}