package com.tuit.ar.activities;
import java.util.ArrayList;
import java.util.HashMap;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ListActivity;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.DialogInterface.OnClickListener;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemLongClickListener;
import com.tuit.ar.R;
import com.tuit.ar.api.Twitter;
import com.tuit.ar.api.TwitterAccount;
import com.tuit.ar.api.TwitterAccountObserver;
import com.tuit.ar.api.TwitterObserver;
import com.tuit.ar.databases.Cache;
public class SelectAccount extends ListActivity implements TwitterObserver, OnItemLongClickListener {
protected static final int ACCOUNT_MENU_DELETE = 0;
static private AccountsAdapter accountsAdapter;
private ArrayList<TwitterAccount> accounts;
private Twitter twitter;
private TextView text = null;
@SuppressWarnings("unchecked")
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.select_account);
Cache.getInstance(this);
twitter = Twitter.getInstance();
accounts = (ArrayList<TwitterAccount>) twitter.getAccounts().clone();
setLegend();
this.setListAdapter(accountsAdapter = new AccountsAdapter(this));
getListView().setOnItemLongClickListener(this);
twitter.addObserver(this);
}
private void setLegend() {
if (accounts.size() == 0) {
text = new TextView(this);
LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
text.setText(getString(R.string.accountSummary));
addContentView(text, params);
} else if (text != null) {
text.setVisibility(View.INVISIBLE);
}
}
public void accountListHasChanged(Twitter twitter) {
accounts.clear();
accounts.addAll(Twitter.getInstance().getAccounts());
accountsAdapter.notifyDataSetChanged();
}
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(0, 0, 0, R.string.newAccount);
return true;
}
public boolean onOptionsItemSelected(MenuItem item) {
addAccount();
return true;
}
protected void onListItemClick (ListView l, View v, int position, long id) {
Twitter twitter = Twitter.getInstance();
TwitterAccount account = accounts.get(position);
twitter.setDefaultAccount(account);
Intent intent = new Intent(this, com.tuit.ar.activities.timeline.Friends.class);
this.startActivity(intent);
}
public boolean onItemLongClick(AdapterView<?> l, View v, int position, long id) {
new AlertDialog.Builder(this).
setTitle(getString(R.string.executeAction)).
setItems(R.array.selectAccountOptions, new OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case ACCOUNT_MENU_DELETE:
try {
Twitter.getInstance().removeAccount(accounts.get(which));
} catch (Exception e) {
Toast.makeText(SelectAccount.this, getString(R.string.unableToDeleteAccount), Toast.LENGTH_SHORT).show();
}
break;
}
}
}).show();
return true;
}
private void addAccount() {
try {
final ProgressDialog dialog = new ProgressDialog(this);
dialog.setTitle(R.string.loading);
dialog.show();
final Handler handler = new Handler();
final AddAccountRunnable runnable = new AddAccountRunnable();
new Thread() {
public void run() {
try {
runnable.dialog = dialog;
runnable.authUrl = twitter.getProvider().retrieveRequestToken(twitter.getConsumer(), Twitter.CALLBACK_URL);
} catch (Exception e) {
}
handler.post(runnable);
}
}.start();
} catch (Exception e) {
}
}
private class AddAccountRunnable implements Runnable {
protected ProgressDialog dialog;
protected String authUrl;
public void run() {
dialog.hide();
if (authUrl != null) {
SelectAccount.this.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(authUrl)));
} else {
Toast.makeText(SelectAccount.this, getString(R.string.unableToAddAccount), Toast.LENGTH_SHORT).show();
}
}
}
public void onDestroy() {
super.onDestroy();
Twitter.getInstance().removeObserver(this);
getListView().setOnItemLongClickListener(null);
}
protected class AccountsAdapter extends ArrayAdapter<TwitterAccount>
{
Activity context;
HashMap<View, AccountElement> elements = new HashMap<View, AccountElement>();
public AccountsAdapter(Activity context)
{
super(context, R.layout.select_account_element, accounts);
this.context = context;
}
public View getView(int position, View convertView, ViewGroup parent)
{
AccountElement element = getAccountElement(convertView);
TwitterAccount account = accounts.get(position);
if (element.currentAccount == account) return element.getView();
String username = account.getUsername();
element.getUsername().setText(username != null ? username : "Loading...");
element.setCurrentAccount(account);
return element.getView();
}
private AccountElement getAccountElement(View convertView) {
if (convertView == null)
{
convertView = View.inflate(this.context, R.layout.select_account_element, null);
}
if (!elements.containsKey(convertView)) {
elements.put(convertView, new AccountElement(convertView));
}
return elements.get(convertView);
}
}
protected class AccountElement implements TwitterAccountObserver {
private View view;
private TextView username;
public TwitterAccount currentAccount;
public AccountElement(View view) {
super();
this.view = view;
}
public void setCurrentAccount(TwitterAccount account) {
if (account == currentAccount) return;
if (currentAccount != null) currentAccount.removeObserver(this);
currentAccount = account;
if (currentAccount != null) currentAccount.addObserver(this);
}
public TextView getUsername() {
if (username != null) return username;
else return username = (TextView)view.findViewById(R.id.username);
}
public View getView() { return view; }
public void accountHasChanged(TwitterAccount account) {
String username = account.getUsername();
this.getUsername().setText(username != null ? username : "Loading...");
}
}
}