package com.electronapps.LJPro;
import java.lang.ref.WeakReference;
import java.util.Date;
import java.util.ArrayList;
import com.commonsware.cwac.cache.SimpleWebImageCache;
import com.commonsware.cwac.thumbnail.ThumbnailAdapter;
import com.commonsware.cwac.thumbnail.ThumbnailBus;
import com.commonsware.cwac.thumbnail.ThumbnailMessage;
import com.commonsware.cwac.wakeful.WakefulIntentService;
import android.app.ListActivity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.ProgressDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.database.Cursor;
import android.os.Bundle;
import android.os.Debug;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.AdapterView.OnItemClickListener;
public class Accounts extends ListActivity {
private LJDB LJDBAdapter;
private static final int ACCOUNT_ADDED=1;
private SharedPreferences appPrefs;
private Boolean refreshing=false;
private Boolean deleted=false;
private boolean added;
private int refreshCount=0;
public static final String TAG = Accounts.class.getSimpleName();
public static final boolean DEBUG = false;
public static final boolean DROPTABLE=false;
private int accInd=-1;
private int clickIndex=-1;
private String lpName=null;
private Cursor mCursor = null;
private AccountsAdapter m_adapter;
protected SimpleWebImageCache<ThumbnailBus, ThumbnailMessage> imgCache;
private static Context mContext;
public BroadcastReceiver LJAccountReceiver=new BroadcastReceiver()
{
@Override
public void onReceive(Context context, Intent intent)
{
String action=intent.getAction();
if (action.equals(LJNet.LJ_XMLERROR)) {
removeStickyBroadcast(intent);
LJPro app=(LJPro) getApplication();
app.alertNetworkError(Accounts.this);
}
else if (action.equals(LJNet.LJ_ACCOUNTADDED)) {
Log.d(TAG,"Account added");
}
else if (action.equals(LJNet.LJ_LOGINUPDATED)) {
if(!refreshing) {
String journalname=intent.getStringExtra("journalname");
removeStickyBroadcast(intent);
updateAccounts();
}
else {
LJPro app=(LJPro) getApplication();
ProgressDialog refresher=(ProgressDialog) app.Dialog.get();
int numAccounts=mCursor.getCount();
if (Accounts.this.refreshCount<numAccounts) {
removeStickyBroadcast(intent);
refreshCount++;
double frac=(double)refreshCount/(double)numAccounts;
int p=(int) (frac*100);
if (refresher!=null) {
refresher.setProgress(p);
if (p >= 100){
updateAccounts();
refreshing=false;
refresher.dismiss();
String alldone=getString(R.string.alldone);
Toast.makeText(Accounts.this, alldone, Toast.LENGTH_LONG).show();
}
}
}
}
}
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState!=null) {
restoreProgress(savedInstanceState);
}
Log.v(TAG,"setting Content View");
setContentView(R.layout.accounts);
//Debug.startMethodTracing("accounts");
Log.v(TAG, "creating Database");
mContext=getApplicationContext();
if(DROPTABLE) {
try {
LJDBAdapter.dropTables();
LJDBAdapter.createTables();
LJDBAdapter.createTriggers();
}
catch(Throwable r) {
Log.e(TAG,r.getMessage(),r);
}
}
imgCache = ((LJPro)getApplication()).getImageCache();
appPrefs=PreferenceManager.getDefaultSharedPreferences(this);
registerForContextMenu(getListView());
populateAccountList();
if(appPrefs.getString("defaultlogin",null)!=null){
String journalname=appPrefs.getString("defaultlogin","");
/*Intent getfriendspage = new Intent(LJNet.LJ_GETFRIENDSPAGE);
((LJPro)getApplicationContext()).fprefreshing.put(journalname,true);
getfriendspage.putExtra("journalname", journalname);
WakefulIntentService.sendWakefulWork(getApplicationContext(), getfriendspage);*/
login(journalname);
}
}
private void restoreProgress(Bundle savedInstanceState) {
refreshing=savedInstanceState.getBoolean("refreshing");
refreshCount=savedInstanceState.getInt("refreshCount");
if (refreshing) {
LJPro app=(LJPro) getApplication();
ProgressDialog refresher=(ProgressDialog) app.Dialog.get();
refresher.dismiss();
app.Dialog = new WeakReference<ProgressDialog>(new ProgressDialog(Accounts.this));
refresher=(ProgressDialog) app.Dialog.get();
refresher.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
refresher.setMessage(getString(R.string.refreshing));
refresher.setCancelable(false);
refresher.setProgress(savedInstanceState.getInt("progress"));
refresher.show();
}
}
@Override
public void onDestroy() {
super.onDestroy();
}
@Override
public void onPause() {
super.onPause();
unregisterReceiver(LJAccountReceiver);
}
@Override
protected void onSaveInstanceState(Bundle saveState) {
super.onSaveInstanceState(saveState);
saveState.putBoolean("refreshing",refreshing);
if(refreshing) {
LJPro app=(LJPro) getApplication();
ProgressDialog refresher=(ProgressDialog) app.Dialog.get();
saveState.putInt("progress", refresher.getProgress());
saveState.putInt("refreshCount",refreshCount);
}
}
@Override
public void onResume() {
super.onResume();
IntentFilter loginfilter=new IntentFilter();
loginfilter.addAction(LJNet.LJ_XMLERROR);
loginfilter.addAction(LJNet.LJ_LOGINUPDATED);
registerReceiver(LJAccountReceiver,loginfilter);
}
@Override
protected void onStart(){
super.onStart();
TextView header=(TextView) findViewById(R.id.acheader);
header.setText(R.string.accounts);
header.invalidate();
}
private void populateAccountList() {
Runnable createAccountList=new Runnable() {
public void run() {
getAccounts();
}
};
Thread thread = new Thread(null, createAccountList, "AccountList Background");
thread.start();
ListView listView=getListView();
listView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> adapter, View view, int position, long arg3) {
Cursor clicked=(Cursor) m_adapter.getItem(position);
String journalname=clicked.getString(accInd);
/*Intent getfriendspage = new Intent(LJNet.LJ_GETFRIENDSPAGE);
((LJPro)getApplicationContext()).fprefreshing.put(journalname,true);
getfriendspage.putExtra("journalname", journalname);
WakefulIntentService.sendWakefulWork(getApplicationContext(), getfriendspage);*/
login(journalname);
//Invoke LJNet to update selected account if more than sync time has passed
}
});
}
private void login(String journalname) {
Intent launchnav=new Intent(Accounts.this,Navigation.class);
launchnav.putExtra("journalname", journalname);
startActivity(launchnav);
}
private void getAccounts() {
try {
LJDBAdapter=LJDB.getDB(this);
LJDBAdapter.open();
mCursor=LJDBAdapter.getAllAccounts(null);
accInd = mCursor.getColumnIndexOrThrow(LJDB.KEY_ACCOUNTNAME);
if (mCursor!=null) {
startManagingCursor(mCursor);
mCursor.moveToFirst();
runOnUiThread(new Runnable() {
public void run() {
m_adapter = new AccountsAdapter(Accounts.this,mCursor,R.layout.accountrow);
final int[] IMAGE_IDS = {R.id.duserpic};
setListAdapter(new ThumbnailAdapter(Accounts.this, m_adapter, imgCache, IMAGE_IDS));
//Debug.stopMethodTracing();
}
});
}
}
catch (Throwable r) {
Log.e(TAG,r.getMessage(),r);
}
//Check to see that we have at least 1 user, otherwise force creation
int numAccts=mCursor.getCount();
if (numAccts==0) {
Intent newAccount = new Intent(Accounts.this, AddAccount.class);
newAccount.putExtra("allowBack","false");
Accounts.this.startActivityForResult(newAccount,ACCOUNT_ADDED);
}
}
void updateAccounts() {
Thread thread = new Thread(null, reQueryInBackground,
"RefreshFriendList Background");
try {
thread.start();
} catch (Throwable e) {
Log.e(TAG, e.getMessage(),e);
}
}
private Runnable reQueryInBackground=new Runnable() {
public void run() {
if (mCursor!=null) {
mCursor=LJDBAdapter.getAllAccounts(null);
startManagingCursor(mCursor);
if (mCursor.getCount()==0) {
Intent newAccount = new Intent(Accounts.this, AddAccount.class);
newAccount.putExtra("allowBack","false");
Accounts.this.startActivityForResult(newAccount,ACCOUNT_ADDED);
}
else {
updateUI();
}
}
}
};
Runnable refreshList=new Runnable() { public void run() { m_adapter.changeCursor(mCursor);}};
private void updateUI() {
runOnUiThread(refreshList);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode==AddAccount.ACCOUNT_ADDED) {
String journalname=data.getStringExtra("journalname");
fetchUserData(journalname);
SharedPreferences.Editor editor = appPrefs.edit();
Date d=new Date();
editor.putLong(journalname+"login_lastupdate",d.getTime());
editor.commit(); // Very important
updateAccounts();
login(journalname);
}
}
private void fetchUserData(String journalname) {
Intent updatefriends = new Intent(LJNet.LJ_GETFRIENDS);
updatefriends.putExtra("journalname", journalname);
WakefulIntentService.sendWakefulWork(mContext, updatefriends);
((LJPro)mContext).notifySync(journalname);
Intent refetch = new Intent(LJNet.LJ_GETFRIENDSPAGE);
refetch.putExtra("journalname", journalname);
WakefulIntentService.sendWakefulWork(mContext, refetch);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.accountops, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
super.onOptionsItemSelected(item);
switch (item.getItemId()) {
case R.id.addaccount: Intent newAccount = new Intent(Accounts.this, AddAccount.class);
//newAccount.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
newAccount.putExtra("allowBack","true");
Accounts.this.startActivityForResult(newAccount,ACCOUNT_ADDED);
break;
case R.id.settings:
Intent prefs=new Intent(getApplicationContext(),LJProPrefs.class);
prefs.putExtra("scope", "All");
startActivity(prefs);
break;
case R.id.refresh: refreshAllAccounts();
break;
case R.id.help: Toast.makeText(this, "You pressed the Help!", Toast.LENGTH_LONG).show();
break;
}
return true;
}
private void refreshAllAccounts() {
refreshing=true;
refreshCount=0;
LJPro app=(LJPro) getApplication();
app.Dialog = new WeakReference<ProgressDialog>(new ProgressDialog(Accounts.this));
ProgressDialog refresher=(ProgressDialog) app.Dialog.get();
refresher.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
refresher.setMessage(getString(R.string.refreshing));
refresher.setCancelable(false);
refresher.show();
boolean haveMore=mCursor.moveToFirst();
while(!mCursor.isAfterLast()) {
String journalname=mCursor.getString(accInd);
Intent updatelogin=new Intent(LJNet.LJ_LOGIN);
updatelogin.putExtra("journalname", journalname);
WakefulIntentService.sendWakefulWork(mContext, updatelogin);
mCursor.moveToNext();
}
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo;
Cursor clicked=(Cursor) m_adapter.getItem(info.position);
clickIndex=info.position;
lpName=clicked.getString(accInd);
MenuInflater inflater = getMenuInflater();
if (appPrefs.getString("defaultlogin", "").equals(lpName))
{inflater.inflate(R.menu.accountcontext2, menu);}
else inflater.inflate(R.menu.accountcontext, menu);
menu.setHeaderTitle(lpName);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
super.onOptionsItemSelected(item);
switch (item.getItemId()) {
case R.id.deluser:
(new Thread(new Runnable() { public void run(){ Boolean success=Accounts.this.LJDBAdapter.deleteAcct(lpName);
if (success) {
SharedPreferences.Editor editor = appPrefs.edit();
Date d = new Date();
editor.putLong(lpName + "friends_lastupdate", 0);
editor.putLong(lpName + "friendspage_lastupdate", 0);
editor.commit();
updateAccounts();
}
}
})).start();
break;
case R.id.editfriends:
//Debug.startMethodTracing("EditFriends");
Intent editfriends=new Intent(this,FriendsTab.class);
editfriends.putExtra("journalname", lpName);
editfriends.putExtra("tab", 0);
startActivity(editfriends);
break;
case R.id.editgroups:
Intent editgroups=new Intent(this,FriendsTab.class);
editgroups.putExtra("journalname", lpName);
editgroups.putExtra("tab", 1);
startActivity(editgroups);
break;
case R.id.manuallogin:
edit=appPrefs.edit();
edit.putString("defaultlogin", null);
edit.commit();
break;
case R.id.makedefault: edit=appPrefs.edit();
edit.putString("defaultlogin", lpName);
edit.commit();
break;
}
return true;
}
private Editor edit;
}