package com.electronapps.LJPro; import java.math.BigInteger; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; 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.Activity; import android.app.ListActivity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; 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.GridView; import android.widget.ListView; import android.widget.SimpleCursorAdapter; import android.widget.Spinner; import android.widget.TextView; import android.widget.Toast; import android.widget.AdapterView.AdapterContextMenuInfo; import android.widget.AdapterView.OnItemClickListener; import android.widget.AdapterView.OnItemSelectedListener; public class FriendsPage extends Activity { private Cursor mCursor; private LJDB LJDBAdapter; private SharedPreferences appPrefs; private FPGridAdapter m_adapter; private static Context mContext; boolean refreshing = false; boolean adddel=false; private static boolean TRACE=true; private SharedPreferences.Editor editor; private GridView mGrid; private HashMap<String,String[]> groupsHash; private String journalname = ""; private SimpleWebImageCache<ThumbnailBus, ThumbnailMessage> imgCache; public static final String TAG = Accounts.class.getSimpleName(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (TRACE) Debug.startMethodTracing("FriendsPage"); if (savedInstanceState != null) { refreshing = savedInstanceState.getBoolean("updating"); groupsHash=(HashMap<String, String[]>) savedInstanceState.getSerializable("groupsHash"); mPosition=savedInstanceState.getInt("position"); } Intent intent = getIntent(); journalname = intent.getStringExtra("journalname"); mContext = getApplicationContext(); setContentView(R.layout.friendspage_grid); mGrid=(GridView) findViewById(R.id.postgrid); appPrefs = PreferenceManager.getDefaultSharedPreferences(this); imgCache = ((LJPro) mContext).getImageCache(); mCurrentFilter=getString(R.string.allfriends); populateFriendsPage(); registerForContextMenu(mGrid); } private int clickIndex; private String lpName; private int jnameInd; private int jtypeInd; private String lpPName; @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; MenuInflater inflater = getMenuInflater(); String type=clicked.getString(jtypeInd); lpName=clicked.getString(jnameInd); lpPName=clicked.getString(pnameInd); if (type.equals("P")||type.equals("Y")){ inflater.inflate(R.menu.fpcontext1, menu); } else { inflater.inflate(R.menu.fpcontext2, menu); } menu.setHeaderTitle(lpName); } @Override public boolean onContextItemSelected(MenuItem item) { super.onOptionsItemSelected(item); switch (item.getItemId()) { case R.id.delete_friend: CharSequence[] del={lpName}; Toast.makeText(this, getString(R.string.deleting_)+lpName+getString(R.string.as_friend), Toast.LENGTH_SHORT).show(); Intent delfriends = new Intent(LJNet.LJ_EDITFRIENDS); adddel=true; delfriends.putExtra("journalname", journalname); delfriends.putExtra("delfriends",del); WakefulIntentService.sendWakefulWork(mContext,delfriends); break; case R.id.addposter: Intent editfriends = new Intent(LJNet.LJ_EDITFRIENDS); adddel=true; Toast.makeText(this, getString(R.string.adding_)+lpName+getString(R.string.as_friend), Toast.LENGTH_SHORT).show(); editfriends.putExtra("journalname", journalname); editfriends.putExtra("addfriend", lpPName); WakefulIntentService.sendWakefulWork(mContext, editfriends); break; case R.id.view_journal: break; case R.id.view_community: break; } return true; } public HashMap<String,String[]> getGroupsHash() { return groupsHash; } private String [] mExtraArgs=null; private String mExtraWhere=null; public void setLastQuery(String where, String[] args) { mExtraArgs=args; mExtraWhere=where; } Cursor mSpinnerCursor=null; String mCurrentFilter; int mFilterPosition=0; boolean spinnerLoaded=false; private int pnameInd; private int mPosition=0; private void populateSpinner(boolean haveSyn) { final Spinner s = (Spinner) findViewById(R.id.fpfilter); s.setOnItemSelectedListener(new OnItemSelectedListener() { public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { mSpinnerCursor.moveToPosition(position); String filter=mSpinnerCursor.getString(mSpinnerCursor.getColumnIndex(LJDB.KEY_NAME)); if (spinnerLoaded&&!filter.equals(mCurrentFilter)) { mCurrentFilter=filter; mFilterPosition=position; Cursor filtered=m_adapter.runQueryOnBackgroundThread(filter); if(!filtered.equals(mCursor)) { m_adapter.changeCursor(filtered); //FriendsPage.this.getListView().setSelection(0); mCursor.close(); mCursor=filtered; } else { //Todo:TOAST! } } if (!spinnerLoaded) { spinnerLoaded=true; s.setSelection(mFilterPosition); } } public void onNothingSelected(AdapterView<?> parent) { // TODO Auto-generated method stub }} ); String [] fgFields={LJDB.KEY_NAME,LJDB.KEY_ID,"_id"}; Cursor fg=LJDBAdapter.getFriendGroups(journalname,fgFields); mSpinnerCursor= new FilterCursor(fg,mContext,haveSyn); startManagingCursor(mSpinnerCursor); startManagingCursor(fg); populateGroupsHash(fg); runOnUiThread(new Runnable() {public void run(){ SimpleCursorAdapter adapter2 = new SimpleCursorAdapter(FriendsPage.this,R.layout.simple_spinner_item,mSpinnerCursor,new String[] {LJDB.KEY_NAME}, new int[] {android.R.id.text1}); // Give the cursor to the list adapter adapter2.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); s.setAdapter(adapter2);}} ); } private void populateGroupsHash(Cursor fg) { if (groupsHash==null) { groupsHash=new HashMap<String,String[]>(); String [] frFields={LJDB.KEY_FRIENDNAME,LJDB.KEY_GROUPMASK}; Cursor fr=LJDBAdapter.getFriends(journalname, frFields); int numFriends=fr.getCount(); int numGroups=fg.getCount(); if (numFriends!=0&&numGroups!=0) { String [] fnames=new String[numFriends]; BigInteger[] groupmasks=new BigInteger[numFriends]; fr.moveToFirst(); for (int i=0;i<numFriends;i++) { fnames[i]=fr.getString(0); groupmasks[i]=BigInteger.valueOf(fr.getInt(1)); fr.moveToNext(); } fg.moveToFirst(); for (int j=0;j<numGroups;j++) { int id=fg.getInt(1); ArrayList<String >members=new ArrayList<String>(); String name=fg.getString(0); for (int k=0;k<numFriends;k++) { if (groupmasks[k].testBit(id)) members.add(fnames[k]); } int size=members.size(); if (size>0) { groupsHash.put(name, (String []) members.toArray(new String[size])); } fg.moveToNext(); } } fr.close(); } } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putSerializable("groupsHash", groupsHash); outState.putInt("position",mGrid.getSelectedItemPosition()); } private void populateFriendsPage() { Runnable createFriendsPage = new Runnable() { public void run() { getPosts(); } }; Thread thread = new Thread(null, createFriendsPage, "FriendsPage Background"); thread.start(); mGrid.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> adapter, View view, int position, long arg3) { Intent loadFull = new Intent(mContext, FullPost.class); loadFull.putExtra("journalname",journalname); loadFull.putExtra("position", position); loadFull.putExtra("extraWhere", mExtraWhere); loadFull.putExtra("extraArgs", mExtraArgs); startActivityForResult(loadFull,1); } }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data){ mGrid.setSelection(resultCode); mPosition=resultCode; } public void toggleStarred(int which, Boolean starred){ mCursor.moveToPosition(which); try { String journal=mCursor.getString(mCursor.getColumnIndexOrThrow(LJDB.KEY_JOURNALNAME)); Integer ditemid=mCursor.getInt(mCursor.getColumnIndexOrThrow(LJDB.KEY_ITEMID)); boolean success=LJDBAdapter.updateStarred(journalname, ditemid, journal, starred); } catch(IllegalArgumentException e) { Log.e(TAG,e.getMessage(),e); } } protected void getPosts() { LJDBAdapter = LJDB.getDB(getApplicationContext()); LJDBAdapter.open(); mCursor = LJDBAdapter.getFriendsPage(journalname,mExtraWhere,mExtraArgs,null); mCursor.getCount(); jnameInd=mCursor.getColumnIndex(LJDB.KEY_JOURNALNAME); jtypeInd=mCursor.getColumnIndex(LJDB.KEY_JOURNALTYPE); pnameInd=mCursor.getColumnIndex(LJDB.KEY_POSTERNAME); Cursor syn=LJDBAdapter.getSyn(journalname); //startManagingCursor(mCursor); Integer haveSyn=syn.getCount(); syn.close(); runOnUiThread(new Runnable(){ public void run() { final int[] IMAGE_IDS = { R.id.imgpreview }; m_adapter = new FPGridAdapter(FriendsPage.this,journalname, mCursor, R.layout.griditem); mGrid.setAdapter(new ThumbnailAdapter(FriendsPage.this, m_adapter, imgCache, IMAGE_IDS)); } }); populateSpinner(haveSyn>0); Date d = new Date(); Boolean appRefresh=((LJPro)mContext).fprefreshing.get(journalname)==null?false:((LJPro)mContext).fprefreshing.get(journalname); if (refreshing||appRefresh) { showUpdating(); if(appRefresh) { ((LJPro)mContext).clearNotification(LJPro.SYNC_ID); } } } public BroadcastReceiver LJFriendsPageReceiver = 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(FriendsPage.this); refreshing = false; View updating = findViewById(R.id.updatingfriends); updating.setVisibility(View.GONE); } if (action.equals(LJNet.LJ_FRIENDSPAGEUPDATED)) { abortBroadcast(); if (m_adapter!=null) { updateFriendsPage(); } } if(action.equals(LJNet.LJ_FPDONEUPDATING)) { removeStickyBroadcast(intent); if (m_adapter!=null) { updateFriendsPage(); } hideUpdating(); } if (action.equals(LJNet.LJ_FRIENDSUPDATED)) { removeStickyBroadcast(intent); Runnable updateHash=new Runnable() { public void run() { if (mSpinnerCursor!=null) { populateGroupsHash(mSpinnerCursor); } } }; Thread t=new Thread(updateHash,"groupsHash updater"); t.start(); } if (action.equals(LJNet.LJ_FRIENDADDED)) { removeStickyBroadcast(intent); if (adddel) { Toast.makeText(FriendsPage.this, "Friend Added", Toast.LENGTH_SHORT); Intent updatefriends = new Intent(LJNet.LJ_GETFRIENDS); updatefriends.putExtra("journalname", journalname); WakefulIntentService.sendWakefulWork(mContext, updatefriends); if(appPrefs.getBoolean(journalname+"_alwaysRefetchOnAdd", false)) { ((LJPro)mContext).notifySync(journalname); Intent refetch = new Intent(LJNet.LJ_GETFRIENDSPAGE); refetch.putExtra("journalname", journalname); refetch.putExtra("refreshOld", true); WakefulIntentService.sendWakefulWork(mContext, refetch); } } } if (action.equals(LJNet.LJ_FRIENDDELETED)) { removeStickyBroadcast(intent); if (adddel) { Toast.makeText(FriendsPage.this, "Friend Added", Toast.LENGTH_SHORT); Intent updatefriends = new Intent(LJNet.LJ_GETFRIENDS); updatefriends.putExtra("journalname", journalname); WakefulIntentService.sendWakefulWork(mContext, updatefriends); if (mCursor!=null) mCursor.requery(); } } } }; private void updateFriendsPage() { Thread thread = new Thread(null, reQueryInBackground, "RefreshFriendsPage Background"); try { thread.start(); } catch (Throwable e) { Log.e(TAG, e.getMessage(),e); } } @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.fpops, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { super.onOptionsItemSelected(item); switch (item.getItemId()) { case R.id.settings: Intent prefs=new Intent(getApplicationContext(),LJProPrefs.class); prefs.putExtra("scope", journalname); startActivity(prefs); break; case R.id.refresh: refreshing = true; Intent getfriendspage = new Intent(LJNet.LJ_GETFRIENDSPAGE); getfriendspage.putExtra("journalname", journalname); showUpdating(); WakefulIntentService.sendWakefulWork(mContext, getfriendspage); break; case R.id.refetch: refreshing = true; Intent refetch = new Intent(LJNet.LJ_GETFRIENDSPAGE); refetch.putExtra("journalname", journalname); refetch.putExtra("refreshOld", true); showUpdating(); WakefulIntentService.sendWakefulWork(mContext, refetch); break; case R.id.help: break; case R.id.setfilter: break; } return true; } private Runnable reQueryInBackground = new Runnable() { public void run() { mCursor = LJDBAdapter.getFriendsPage(journalname,mExtraWhere,mExtraArgs,null); updateUI(); //startManagingCursor(mCursor); } }; Runnable refreshList=new Runnable() { public void run() { if (m_adapter!=null) m_adapter.changeCursor(mCursor); }}; private void updateUI() { runOnUiThread(refreshList); } private void showUpdating() { runOnUiThread(updating); } Runnable updating=new Runnable() { public void run() { refreshing = true; View updating = findViewById(R.id.updatingfriends); TextView updatemsg = (TextView) updating.findViewById(R.id.updatemsg); updatemsg.setText(R.string.updatingfpage); updatemsg.invalidate(); updating.setVisibility(View.VISIBLE); } }; private void hideUpdating() { refreshing = false; View updating = findViewById(R.id.updatingfriends); updating.setVisibility(View.GONE); } @Override protected void onDestroy() { super.onDestroy(); mCursor.close(); } @Override protected void onPause() { super.onPause(); unregisterReceiver(LJFriendsPageReceiver); Boolean appRefresh=((LJPro)mContext).fprefreshing.get(journalname)==null?false:((LJPro)mContext).fprefreshing.get(journalname); if (appRefresh) { ((LJPro)mContext).notifySync(journalname); } if (TRACE) Debug.stopMethodTracing(); } @Override protected void onResume() { super.onResume(); spinnerLoaded=false; if (mCursor!=null) mCursor.requery(); mGrid.setSelection(mPosition); IntentFilter friendfilter = new IntentFilter(); friendfilter.setPriority(1); friendfilter.addAction(LJNet.LJ_XMLERROR); friendfilter.addAction(LJNet.LJ_FRIENDSPAGEUPDATED); friendfilter.addAction(LJNet.LJ_FPDONEUPDATING); friendfilter.addAction(LJNet.LJ_FRIENDSUPDATED); friendfilter.addAction(LJNet.LJ_FRIENDADDED); friendfilter.addAction(LJNet.LJ_FRIENDDELETED); registerReceiver(LJFriendsPageReceiver, friendfilter); } public LJDB getDBConn() { return LJDBAdapter; } }