You are on page 1of 13

M hnh Class

Code: 1. MyApp.java
public class MyApp extends Application implements IMOVLConnectDelegate { public static final String LOG_TAG = "MOVL_Trivia"; public static final String APP_KEY = "9f16a349-1c4e-4cef-9dcb-cc90f92fd4d1"; private ConnectivityManager cMgr; private SharedPreferences prefs; private MOVLConnect client; private List<IMOVLConnectDelegate> listeners; // prevent error on Android 2.2: http://code.google.com/p/android/issues/detail?id=9431 static { System.setProperty("java.net.preferIPv4Stack", "true"); System.setProperty("java.net.preferIPv6Addresses", "false"); } @Override public void onCreate() { super.onCreate(); // this can only used with Android 2.3 or later /* StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectAll().penaltyLog().build()); */ cMgr = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE); prefs = PreferenceManager.getDefaultSharedPreferences(this); listeners = new ArrayList<IMOVLConnectDelegate>(); client = new MOVLConnect(this, APP_KEY); } // not guaranteed to be called @Override public void onTerminate() { super.onTerminate(); } public MOVLConnect getClient() { return client; } public SharedPreferences getPrefs() { return this.prefs; } // // MOVL Event Listener/Delegate/Callback // public void addListener(IMOVLConnectDelegate l) { this.listeners.add(l); } public void removeListener(IMOVLConnectDelegate l) { this.listeners.remove(l); }

@Override public void onError(IMCResult result) { Log.i(MyApp.LOG_TAG, "onError result:" + result); for (IMOVLConnectDelegate listener : listeners) { listener.onError(result); } } @Override public void onConnectionLost(IMCResult result) { Log.i(MyApp.LOG_TAG, "onConnectionLost result:" + result); for (IMOVLConnectDelegate listener : listeners) { listener.onConnectionLost(result); } } @Override public void onCreateRoom(IMCResult result, IMCRoom room) { Log.i(MyApp.LOG_TAG, "onCreateRoom result:" + result + "room:" + room); for (IMOVLConnectDelegate listener : listeners) { listener.onCreateRoom(result, room); } } @Override public void onJoinRoom(IMCResult result, IMCRoom room) { Log.i(MyApp.LOG_TAG, "onJoinRoom result:" + result + " room:" + room); for (IMOVLConnectDelegate listener : listeners) { listener.onJoinRoom(result, room); } } @Override public void onLeaveRoom(IMCResult result) { Log.i(MyApp.LOG_TAG, "onLeaveRoom result:" + result); for (IMOVLConnectDelegate listener : listeners) { listener.onLeaveRoom(result); } } @Override public void onUserJoined(IMCUser user) { Log.i(MyApp.LOG_TAG, "onUserJoined user:" + user); for (IMOVLConnectDelegate listener : listeners) { listener.onUserJoined(user); } } @Override public void onUserLeft(IMCUser user) { Log.i(MyApp.LOG_TAG, "onUserLeft user:" + user); for (IMOVLConnectDelegate listener : listeners) { listener.onUserLeft(user); } } @Override public void onMessage(IMCUser sender, String messageId, MCData messageData, String target) { Log.i(MyApp.LOG_TAG, "onMessage sender:" + sender + " messageId:" + messageId + " messageData:" + messageData + " target:" + target); for (IMOVLConnectDelegate listener : listeners) { listener.onMessage(sender, messageId, messageData, target); } } @Override public void onEjected(IMCUser sender, String reason) { Log.i(MyApp.LOG_TAG, "onEjected sender:" + sender + " reason:" + reason);

for (IMOVLConnectDelegate listener : listeners) { listener.onEjected(sender, reason); } } @Override public void onActiveHostChanged(IMCUser activeHost) { Log.i(MyApp.LOG_TAG, "onActiveHostChanged activeHost:" + activeHost); for (IMOVLConnectDelegate listener : listeners) { listener.onActiveHostChanged(activeHost); } } @Override public void onRoomAttributesChanged(List<String> keys) { Log.i(MyApp.LOG_TAG, "onRoomAttributesChange keys:" + keys); for (IMOVLConnectDelegate listener : listeners) { listener.onRoomAttributesChanged(keys); } } @Override public void onUserAttributesChanged(IMCUser user, List<String> keys) { Log.i(MyApp.LOG_TAG, "onUserAttributesChange user:" + user + "keys:" + keys); for (IMOVLConnectDelegate listener : listeners) { listener.onUserAttributesChanged(user, keys); } } @Override public void onShutdownRoom() { Log.i(MyApp.LOG_TAG, "onShutdownRoom"); for (IMOVLConnectDelegate listener : listeners) { listener.onShutdownRoom(); } } @Override public void onPing(long start, long end, long length) { Log.i(MyApp.LOG_TAG, "onPing start:" + start + " end:" + end + " length:" + length); for (IMOVLConnectDelegate listener : listeners) { listener.onPing(start, end, length); } } @Override public void onSystemBroadcast(String id, String message) { Log.i(MyApp.LOG_TAG, "onSystemBroadcast id:" + id + " message:" + message); for (IMOVLConnectDelegate listener : listeners) { listener.onSystemBroadcast(id, message); } } // // util/helpers for app // public boolean connectionPresent() { NetworkInfo netInfo = cMgr.getActiveNetworkInfo(); if ((netInfo != null) && (netInfo.getState() != null)) { return netInfo.getState().equals(State.CONNECTED); } return false; } }

2. MyBaseActivity.java
public abstract class MyBaseActivity extends Activity implements IMOVLConnectDelegate { private static final int OPTIONS_MENU_LOGOUT = 0; protected MyApp app; protected InputMethodManager imm; protected ProgressDialog dialog; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); app = (MyApp) this.getApplication(); dialog = new ProgressDialog(this); dialog.setCancelable(false); dialog.setMessage(""); imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); } @Override protected void onResume() { super.onResume(); // NOTE, could do client login check here getWindow().setSoftInputMode(WindowManager.LayoutParams. SOFT_INPUT_STATE_ALWAYS_HIDDEN); app.addListener(this); } @Override protected void onPause() { super.onPause(); if (dialog != null) { dialog.dismiss(); } app.removeListener(this); } @Override public boolean onCreateOptionsMenu(Menu menu) { menu.add(0, MyBaseActivity.OPTIONS_MENU_LOGOUT, 0, "Leave/Logout").setIcon(android.R.drawable.ic_menu_close_clear_cancel); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case OPTIONS_MENU_LOGOUT: app.getClient().leaveRoom(); startActivity(new Intent(this, Login.class)); break; } return false; } // // MOVLConnect empty callback events (so subclasses can override what they need) // @Override public void onConnectionLost(final IMCResult res) { this.runOnUiThread(new Runnable() { @Override public void run() { if (dialog.isShowing()) {

dialog.dismiss(); } Toast.makeText(MyBaseActivity.this, "CONNECTION LOST", Toast.LENGTH_SHORT).show(); startActivity(new Intent(MyBaseActivity.this, Login.class)); } }); } @Override public void onError(final IMCResult res) { this.runOnUiThread(new Runnable() { @Override public void run() { if (dialog.isShowing()) { dialog.dismiss(); } Toast.makeText(MyBaseActivity.this, "ERROR:" + res.getMessage(), Toast.LENGTH_SHORT).show(); } }); } @Override public void onCreateRoom(IMCResult result, IMCRoom room) { } @Override public void onJoinRoom(IMCResult result, IMCRoom room) { } @Override public void onLeaveRoom(IMCResult result) { } @Override public void onUserJoined(IMCUser user) { } @Override public void onUserLeft(IMCUser user) { } @Override public void onMessage(IMCUser sender, String messageId, MCData messageData, String target) { } @Override public void onEjected(IMCUser sender, String reason) { } @Override public void onActiveHostChanged(IMCUser activeHost) { } @Override public void onRoomAttributesChanged(List<String> keys) { } @Override public void onUserAttributesChanged(IMCUser user, List<String> keys) { } @Override public void onShutdownRoom() { } @Override public void onPing(long start, long end, long length) { }

@Override public void onSystemBroadcast(String id, String message) { }

}
3. Login.java import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.Toast;

import com.movl.connect.model.IMCResult; import com.movl.connect.model.IMCRoom;

public class Login extends MyBaseActivity {

private EditText name; private EditText code; private Button join;

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.login);

code = (EditText) findViewById(R.id.login_code); name = (EditText) findViewById(R.id.login_name); join = (Button) findViewById(R.id.login_join);

join.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (code.getText().toString().trim() != null && name.getText().toString().trim() != null) { dialog.setMessage("joining room..."); dialog.show();

app.getClient().joinRoomAsController(code.getText().toString().trim(), name.getText().toString().trim()); } else { Toast.makeText(Login.this, "name and code are required", Toast.LENGTH_SHORT).show(); } } });

// // Override ONLY IMOVLConnect delegate methods you're interested in (MyBaseActivity base class will handle rest) //

// NOTE onLogin and onError are handled by base Activity

@Override public void onJoinRoom(final IMCResult res, final IMCRoom room) { // must run back on UI thread, since MOVLConnect client makes network calls off of main thread this.runOnUiThread(new Runnable() { @Override public void run() { if (res.getCode() == 0) { dialog.dismiss(); startActivity(new Intent(Login.this, Trivia.class)); } else { dialog.dismiss(); Toast.makeText(Login.this, "Error, cannot join room, check room code", Toast.LENGTH_SHORT).show(); } } }); }

4. Trivia.java
public class Trivia extends MyBaseActivity { // game private private private states static static static (which are sent in room attribute "state") final String NEW_ROUND = "NEW_ROUND"; final String QUESTION = "QUESTION"; final String WINNER = "WINNER";

private TextView info; private private private private private private private private private RelativeLayout answerLayout; Button a; TextView aAnswer; Button b; TextView bAnswer; Button c; TextView cAnswer; Button d; TextView dAnswer;

private TextView userScore; private EditText chat; private Button chatSubmit; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.trivia); info = (TextView) findViewById(R.id. trivia_info); info.setText("Waiting for next round..."); // answer layout answerLayout = (RelativeLayout) findViewById(R.id. trivia_layout_answers); answerLayout.setVisibility(View.GONE); a = (Button) findViewById(R.id. trivia_button_a); aAnswer = (TextView) findViewById(R.id. trivia_a); a.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { MCData data = new MCData(); data.put("id", "a"); Log.i(MyApp.LOG_TAG, "sent answer a"); app.getClient().sendToHosts("answer", data); a.setPressed(true); b.setPressed(false); c.setPressed(false); d.setPressed(false); return true; } });

b = (Button) findViewById(R.id. trivia_button_b); bAnswer = (TextView) findViewById(R.id. trivia_b); b.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { MCData data = new MCData(); data.put("id", "b"); Log.i(MyApp.LOG_TAG, "sent answer c"); app.getClient().sendToHosts("answer", data); a.setPressed(false); b.setPressed(true); c.setPressed(false); d.setPressed(false); return true; } }); c = (Button) findViewById(R.id. trivia_button_c); cAnswer = (TextView) findViewById(R.id. trivia_c); c.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { MCData data = new MCData(); data.put("id", "c"); Log.i(MyApp.LOG_TAG, "sent answer c"); app.getClient().sendToHosts("answer", data); a.setPressed(false); b.setPressed(false); c.setPressed(true); d.setPressed(false); return true; } }); d = (Button) findViewById(R.id. trivia_button_d); dAnswer = (TextView) findViewById(R.id. trivia_d); d.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { MCData data = new MCData(); data.put("id", "d"); Log.i(MyApp.LOG_TAG, "sent answer d"); app.getClient().sendToHosts("answer", data); a.setPressed(false); b.setPressed(false); c.setPressed(false); d.setPressed(true); return true; } }); userScore = (TextView) findViewById(R.id. trivia_user_score); userScore.setText(app.getClient().getMyUser().getName()); chat = (EditText) findViewById(R.id. trivia_chat);

chatSubmit = (Button) findViewById(R.id. trivia_chat_submit); chatSubmit.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (chat.getText().toString().trim() != null) { // A message is sent using MCData, which is a map (basically). // Each message is sent with an ID, and a payload of the data itself. MCData data = new MCData(); data.put("text", chat.getText().toString().trim()); app.getClient().sendToAll("chat", data); chat.setText(""); } else { Toast.makeText(Trivia.this, "name and code are required", Toast.LENGTH_SHORT).show(); } } }); } // // Override ONLY IMOVLConnect delegate methods you're interested in (base class will handle rest) // // NOTE onLogin and onError are handled by base Activity @Override public void onMessage(final IMCUser sender, final String messageId, final MCData messageData, final String target) { this.runOnUiThread(new Runnable() { @Override public void run() { Log.i(MyApp.LOG_TAG, "MSG received id:" + messageId + " data:" + messageData); } }); } @Override public void onRoomAttributesChanged( final List<String> keys) { this.runOnUiThread(new Runnable() { @Override public void run() { if (keys != null && !keys.isEmpty() && keys.contains("state")) { // room attribute are MCData also MCData data = (MCData) app.getClient().getRoom().getAttributes().get("state"); String id = data.getString("id"); if (id != null) { if (id.equals(NEW_ROUND)) { newRound(); } else if (id.equals(QUESTION)) { question(); } else if (id.equals(WINNER)) {

winner(); } } } } }); } @Override public void onUserAttributesChanged( final IMCUser user, final List<String> keys) { this.runOnUiThread(new Runnable() { @Override public void run() { IMCUser myUser = app.getClient().getMyUser(); if (user != null && user.getId().equals(myUser.getId())) { MCData data = (MCData) myUser.getAttributes(); if (data.containsKey("score")) { int score = data.getInt("score"); // TODO not working userScore.setText(myUser.getName() + " " + score); } } } }); } private void newRound() { info.setVisibility(View.VISIBLE); info.setText("Get ready for a new question!"); answerLayout.setVisibility(View.GONE); } private void question() { info.setVisibility(View.GONE); MCData questionData = (MCData) app.getClient().getRoom().getAttributes().get("question"); String aString = questionData.getString("a"); String bString = questionData.getString("b"); String cString = questionData.getString("c"); String dString = questionData.getString("d"); aAnswer.setText(aString); bAnswer.setText(bString); cAnswer.setText(cString); dAnswer.setText(dString); a.setPressed(false); b.setPressed(false); c.setPressed(false); d.setPressed(false); answerLayout.setVisibility(View.VISIBLE); } private void winner() { info.setVisibility(View.VISIBLE);

// NOTE can't use primitive MCData methods unless you check for contains first (else NPEs) MCData userAttrs = app.getClient().getMyUser().getAttributes(); System.out.println("userAttrs:" + userAttrs); MCData roomAttrs = app.getClient().getRoom().getAttributes(); int userQuestionId = -1; if (userAttrs.containsKey("questionId")) { userQuestionId = userAttrs.getInt("questionId"); } String userAnswer = userAttrs.getString("answerId"); // called "answerId" on user attrs, and just "answer" on room attrs/question if (userAnswer == null) { userAnswer = ""; } int roundScore = 0; if (userAttrs.containsKey("roundScore")) { roundScore = userAttrs.getInt("roundScore"); // called score in some places, points in others } MCData questionData = roomAttrs.getData("question"); int questionId = -2; if (questionData.containsKey("id")) { questionId = questionData.getInt("id"); } String answer = questionData.getString("answer"); String answerText = questionData.getString(answer); boolean correct = (userQuestionId == questionId && userAnswer.equals(answer)); MCData winnerData = roomAttrs.getData("winner"); String winnerName = "None"; int winnerPoints = 0; if (winnerData != null) { winnerName = winnerData.getString("name"); if (winnerData.containsKey("points")) { winnerPoints = winnerData.getInt("points"); } } // display whether user got question right/wrong // also display the round winner (who may have answered sooner than user, even if user got it right) // and points StringBuilder sb = new StringBuilder(); if (correct) { sb.append("You got it right! Round Points: " + roundScore); } else { sb.append("You got it wrong!"); } sb.append("\nAnswer: " + answer.toUpperCase() + " " + answerText);

sb.append("\nRound Winner: " + winnerName); sb.append("\nPoints: " + winnerPoints); info.setText(sb.toString()); answerLayout.setVisibility(View.GONE); } }

You might also like