package com.magnet.demo.mmx.rpsls; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.util.Log; import android.util.SparseBooleanArray; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.CheckedTextView; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import android.widget.ViewAnimator; import com.magnet.mmx.client.api.MMX; import com.magnet.mmx.client.api.MMXChannel; import com.magnet.mmx.client.api.MMXMessage; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Map; public class MainActivity extends Activity { private static final String TAG = MainActivity.class.getSimpleName(); static final int REQUEST_LOGIN = 1; private MyProfile mProfile = null; private Handler mMainHandler = null; private Button mFindOpponentButton = null; private ViewAnimator mViewAnimator = null; private TextView mUsernameView = null; private TextView mWinsView = null; private TextView mLossesView = null; private TextView mDrawsView = null; private ListView mAvailablePlayersListView = null; private UserProfileAdapter mAvailablePlayersAdapter = null; private Button mInviteButton = null; private MMX.EventListener mListener = new MMX.EventListener() { public boolean onMessageReceived(MMXMessage mmxMessage) { MMXChannel channel = mmxMessage.getChannel(); if (channel != null) { if (RPSLS.MessageConstants.AVAILABILITY_TOPIC_NAME.equals(channel.getName())) { //handle the availability/unavailability of users RPSLS.Util.handleIncomingMessage(MainActivity.this, mmxMessage); updateAvailablePlayersView(); return true; } } else { RPSLS.Util.handleIncomingMessage(MainActivity.this, mmxMessage); return true; } return false; } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mMainHandler = new Handler(); mViewAnimator = (ViewAnimator) findViewById(R.id.viewAnimator); mFindOpponentButton = (Button) findViewById(R.id.btn_find_opponent); mUsernameView = (TextView) findViewById(R.id.username); mWinsView = (TextView) findViewById(R.id.wins); mLossesView = (TextView) findViewById(R.id.losses); mDrawsView = (TextView) findViewById(R.id.draws); mAvailablePlayersListView = (ListView) findViewById(R.id.available_player_listview); mInviteButton = (Button) findViewById(R.id.btn_invite); //start connection MMX.registerListener(mListener); mProfile = MyProfile.getInstance(this); mAvailablePlayersAdapter = new UserProfileAdapter(this, RPSLS.Util.getAvailablePlayers()); mAvailablePlayersListView.setAdapter(mAvailablePlayersAdapter); mAvailablePlayersListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { mInviteButton.setEnabled(mAvailablePlayersListView.getCheckedItemCount() > 0); } }); updateViewConnectionState(); } protected void onDestroy() { MMX.unregisterListener(mListener); RPSLS.Util.publishAvailability(this, false); super.onDestroy(); } private void startLoginActivity() { Intent loginIntent = new Intent(this, LoginActivity.class); startActivityForResult(loginIntent, REQUEST_LOGIN); } protected void onResume() { if (MMX.getCurrentUser() == null) { startLoginActivity(); } else { //populate or update the view RPSLS.Util.fetchAvailablePlayers(this); RPSLS.Util.publishAvailability(this, true); updateViewConnectionState(); updateAvailablePlayersView(); } //update stats updateStatsView(); super.onResume(); } protected void onActivityResult(int requestCode, int resultCode, Intent data) { Log.d(TAG, "onActivityResult() request=" + requestCode + ", result=" + resultCode); if (requestCode == REQUEST_LOGIN) { if (resultCode == RESULT_OK) { //populate or update the view RPSLS.Util.publishAvailability(this, true); updateViewConnectionState(); updateAvailablePlayersView(); } else { finish(); } } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } private void updateViewConnectionState() { mMainHandler.post(new Runnable() { public void run() { boolean connected = MMX.getCurrentUser() != null; mFindOpponentButton.setEnabled(connected); } }); } private void updateAvailablePlayersView() { mMainHandler.post(new Runnable() { public void run() { //save check state SparseBooleanArray checkedStates = mAvailablePlayersListView.getCheckedItemPositions(); HashSet<UserProfile> checkedProfiles = new HashSet<UserProfile>(); for (int i=0; i<checkedStates.size(); i++) { if (checkedStates.valueAt(i)) { checkedProfiles.add(mAvailablePlayersAdapter.getItem(checkedStates.keyAt(i))); } } //update the adapter mAvailablePlayersAdapter = new UserProfileAdapter(MainActivity.this, RPSLS.Util.getAvailablePlayers()); mAvailablePlayersListView.setAdapter(mAvailablePlayersAdapter); //re-apply check state for (int i=0; i<mAvailablePlayersListView.getCount(); i++) { mAvailablePlayersListView.setItemChecked(i, checkedProfiles.contains(mAvailablePlayersAdapter.getItem(i))); } } }); } private void updateStatsView() { mMainHandler.post(new Runnable() { public void run() { Map<RPSLS.Outcome, Integer> outcomes = mProfile.getStats().getOutcomeCounts(); mUsernameView.setText(mProfile.getUsername() != null ? mProfile.getUsername() : ""); mWinsView.setText(String.valueOf(outcomes.get(RPSLS.Outcome.WIN))); mLossesView.setText(String.valueOf(outcomes.get(RPSLS.Outcome.LOSS))); mDrawsView.setText(String.valueOf(outcomes.get(RPSLS.Outcome.DRAW))); } }); } public void doFindOpponent(View view) { //launch a view to show the latest people who have published their availability mViewAnimator.showNext(); mViewAnimator.setInAnimation(this, android.R.anim.slide_in_left); mViewAnimator.setOutAnimation(this, android.R.anim.slide_out_right); } public void doBack(View view) { mViewAnimator.showPrevious(); mViewAnimator.setInAnimation(this, R.anim.slide_in_right); mViewAnimator.setOutAnimation(this, R.anim.slide_out_left); } public void doInvite(View view) { //send out the invitations, then doBack synchronized (mAvailablePlayersAdapter) { SparseBooleanArray checkedItems = mAvailablePlayersListView.getCheckedItemPositions(); ArrayList<UserProfile> checkedProfiles = new ArrayList<UserProfile>(); for (int i = 0; i < checkedItems.size(); i++) { int position = checkedItems.keyAt(i); if (checkedItems.valueAt(i)) { checkedProfiles.add(mAvailablePlayersAdapter.getItem(position)); } } if (RPSLS.Util.sendInvitations(this, checkedProfiles)) { Toast.makeText(this, "Invitations sent.", Toast.LENGTH_SHORT).show(); doBack(view); } else { Toast.makeText(this, "No invitees were selected.", Toast.LENGTH_LONG).show(); } } } private class UserProfileAdapter extends ArrayAdapter<UserProfile> { public UserProfileAdapter(Context context, List<UserProfile> userProfiles) { super(context, 0, userProfiles); } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { // convertView = getLayoutInflater().inflate(R.layout.availability_list_item, null); convertView = getLayoutInflater().inflate(R.layout.simple_list_item_checked, null); } UserProfile profile = getItem(position); // TextView usernameField = (TextView) convertView.findViewById(R.id.username); // TextView statsField = (TextView) convertView.findViewById(R.id.stats); // usernameField.setText(profile.getUsername()); // statsField.setText(buildStatsString(profile)); CheckedTextView text1 = (CheckedTextView) convertView; text1.setText(profile.getUsername()); return convertView; } } private String buildStatsString(UserProfile profile) { UserProfile.Stats stats = profile.getStats(); Map<RPSLS.Outcome, Integer> outcomes = stats.getOutcomeCounts(); return getResources().getString(R.string.user_record) + outcomes.get(RPSLS.Outcome.WIN) + '-' + outcomes.get(RPSLS.Outcome.LOSS) + '-' + outcomes.get(RPSLS.Outcome.DRAW); } }