package edu.stanford.cs.sujogger.viewer; import java.util.Arrays; import android.app.ListActivity; import android.app.ProgressDialog; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.database.Cursor; import android.database.DatabaseUtils; import android.os.Bundle; import android.os.Handler; import android.os.RemoteException; import android.preference.PreferenceManager; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.ListView; import android.widget.Toast; import edu.stanford.cs.gaming.sdk.model.AppResponse; import edu.stanford.cs.gaming.sdk.model.User; import edu.stanford.cs.gaming.sdk.service.GamingServiceConnection; import edu.stanford.cs.sujogger.R; import edu.stanford.cs.sujogger.db.DatabaseHelper; import edu.stanford.cs.sujogger.db.GPStracking.Groups; import edu.stanford.cs.sujogger.db.GPStracking.Users; import edu.stanford.cs.sujogger.util.Common; import edu.stanford.cs.sujogger.util.Constants; import edu.stanford.cs.sujogger.util.UserListAdapter; public class FriendPicker extends ListActivity { private static final String TAG = "OGT.FriendPicker"; public static final String MODE_KEY = "mode"; public static final int MODE_ADD = 0; public static final int MODE_RECIPIENT = 1; private int mMode; private long mGroupId; private long[] mInitialUserIds; private int mGroupIdServer; private DatabaseHelper mDbHelper; private Cursor mUsers; private UserListAdapter mUserAdapter; //Views private Button clearButton; private Button addButton; private GamingServiceConnection mGameCon; private FriendPickerReceiver mReceiver; private Handler mHandler = new Handler(); private SharedPreferences mSharedPreferences; //private int mGetUsersFriendsProgress = 0; private ProgressDialog mUserWaitDialog; //Request IDs private static final int GRP_ADDUSER_RID = 1; //private static final int GET_USERS_RID = 2; private static final int GET_FRIENDS_RID = 3; private Runnable mRefreshTask = new Runnable() { public void run() { mUserWaitDialog = ProgressDialog.show(FriendPicker.this, "", "Retrieving friends...", true); try { mGameCon.getInvitableFriends(GET_FRIENDS_RID); } catch (RemoteException e) {} } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.friendpicker); mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); Bundle extras = getIntent().getExtras(); mGroupId = extras != null ? extras.getLong(Groups.TABLE) : 0; mInitialUserIds = extras != null ? extras.getLongArray(Users.TABLE) : null; mMode = extras != null ? extras.getInt(MODE_KEY) : MODE_ADD; mDbHelper = new DatabaseHelper(this); mDbHelper.openAndGetDb(); Cursor groupCursor = mDbHelper.getGroupWithId(mGroupId); if (groupCursor.moveToFirst()) mGroupIdServer = groupCursor.getInt(1); else mGroupIdServer = 0; groupCursor.close(); Log.d(TAG, "onCreate(): groupId = " + mGroupId + "; groupIdServer = " + mGroupIdServer); mReceiver = new FriendPickerReceiver(); mGameCon = new GamingServiceConnection(this, mReceiver, Constants.APP_ID, Constants.APP_API_KEY, FriendPicker.class.toString()); mGameCon.bind(); User user = Common.getRegisteredUser(this); mGameCon.setUserId(user.id, user.fb_id, user.fb_token); mUsers = mDbHelper.getAllUsersExcludingGroup(mGroupId, Common.getRegisteredUser(this).id, true); startManagingCursor(mUsers); setTitle("Friends"); clearButton = (Button)findViewById(R.id.fp_clearbutton); clearButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { mUserAdapter.clearAllChecked(); clearButton.setEnabled(false); clearButton.setText(R.string.fp_clearbutton); addButton.setEnabled(false); addButton.setText(R.string.fp_addbutton); getListView().invalidateViews(); } }); addButton = (Button)findViewById(R.id.fp_addbutton); addButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { if (mMode == MODE_ADD) { User[] checkedUsers = mUserAdapter.getCheckedUsers(); try { mGameCon.addGroupUsers(GRP_ADDUSER_RID, mGroupIdServer, checkedUsers); } catch (RemoteException e) {} } else { long[] checkedUserIds = mUserAdapter.getCheckedUserIds(); Bundle bundle = new Bundle(); bundle.putLongArray(Users.TABLE, checkedUserIds); Intent i = new Intent(); i.putExtras(bundle); setResult(1, i); finish(); } } }); fillData(); updateButtons(mUserAdapter.getNumChecked()); if (System.currentTimeMillis() - mSharedPreferences.getLong(Constants.ALL_USERS_UPDATE_KEY, 0) > Constants.UPDATE_INTERVAL) //Wait 100ms before sending request, because sometimes, the activity doesn't //bind to the service quickly enough mHandler.postDelayed(mRefreshTask, 100); } @Override protected void onRestart() { Log.d(TAG, "onRestart()"); mDbHelper.openAndGetDb(); super.onRestart(); } @Override protected void onResume() { Log.d(TAG, "onResume()"); super.onResume(); Log.d(TAG, "onResume(): dumping users cursor"); DatabaseUtils.dumpCursor(mUsers); } @Override protected void onDestroy() { mDbHelper.close(); mGameCon.unbind(); super.onDestroy(); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putLong(Groups.TABLE, mGroupId); } @Override protected void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); Log.v(TAG, "position = " + position + "; id = " + id); int numChecked = mUserAdapter.toggleItemAtPosition(position); Log.d(TAG, "onListItemClicked(): numChecked = " + numChecked); updateButtons(numChecked); } private void updateButtons(int numChecked) { if (numChecked > 0) { clearButton.setEnabled(true); if (numChecked == 1) clearButton.setText("Clear"); else clearButton.setText("Clear all"); addButton.setEnabled(true); addButton.setText("Add (" + numChecked + ")"); } else { clearButton.setEnabled(false); clearButton.setText(R.string.fp_clearbutton); addButton.setEnabled(false); addButton.setText(R.string.fp_addbutton); } } private void fillData() { mUserAdapter = new UserListAdapter(this, mUsers, true, mInitialUserIds); setListAdapter(mUserAdapter); } class FriendPickerReceiver extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { try { AppResponse appResponse = null; //User[] users; while ((appResponse = mGameCon.getNextPendingNotification()) != null) { Log.d(TAG, appResponse.toString()); if (appResponse.result_code.equals(GamingServiceConnection.RESULT_CODE_ERROR)) { FriendPicker.this.runOnUiThread(new Runnable() { public void run() { if (mUserWaitDialog != null) mUserWaitDialog.dismiss(); Toast toast = Toast.makeText(FriendPicker.this, R.string.connection_error_toast, Toast.LENGTH_SHORT); toast.show(); } }); continue; } else if (appResponse.result_code.equals(GamingServiceConnection.RESULT_CODE_VERSION_ERROR)) { FriendPicker.this.runOnUiThread(new Runnable() { public void run() { if (mUserWaitDialog != null) mUserWaitDialog.dismiss(); Common.displayUpgradeDialog(FriendPicker.this); } }); continue; } switch(appResponse.request_id) { case GRP_ADDUSER_RID: FriendPicker.this.runOnUiThread(new Runnable() { public void run() { long[] checkedUserIds = mUserAdapter.getCheckedUserIds(); Log.d(TAG, "adding users to db: " + Arrays.toString(checkedUserIds)); mDbHelper.addUsersToGroup(mGroupId, checkedUserIds); String toastString = "User successfully added"; if (checkedUserIds.length > 1) toastString = "Users successfully added"; Toast toast = Toast.makeText(FriendPicker.this, toastString, Toast.LENGTH_SHORT); toast.show(); FriendPicker.this.finish(); } }); break; case GET_FRIENDS_RID: final User[] users = (User[])appResponse.object; FriendPicker.this.runOnUiThread(new Runnable() { public void run() { if (users != null) { mDbHelper.addFriends(users); //mGetUsersFriendsProgress++; //if (mGetUsersFriendsProgress >= 2) { Editor editor = mSharedPreferences.edit(); editor.putLong(Constants.ALL_USERS_UPDATE_KEY, System.currentTimeMillis()); editor.commit(); mUserWaitDialog.dismiss(); mUsers.requery(); mUserAdapter.notifyDataSetChanged(); FriendPicker.this.getListView().invalidateViews(); //} } } }); break; default: break; } } } catch (Exception e) { e.printStackTrace(); } } } }