package edu.stanford.cs.sujogger.viewer; import java.util.Arrays; import java.util.Calendar; import android.app.Activity; import android.app.DatePickerDialog; import android.app.Dialog; import android.app.ProgressDialog; import android.app.TimePickerDialog; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.os.Bundle; import android.os.RemoteException; import android.util.Log; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.DatePicker; import android.widget.EditText; import android.widget.Spinner; import android.widget.TextView; import android.widget.TimePicker; 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.GameMessages; import edu.stanford.cs.sujogger.db.GPStracking.Groups; import edu.stanford.cs.sujogger.db.GPStracking.Messages; 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.MessageObject; public class MessageSender extends Activity { private static final String TAG = "OGT.MessageSender"; public static final int MSG_SEND_RID = 1; private long mGroupId; private long[] mUserIds; private User[] mUsers; private int mMessageType; private String mSubjectString; private MessageObject mMsgObject; private DatabaseHelper mDbHelper; private GamingServiceConnection mGameCon; private MessageSenderReceiver mReceiver; private ProgressDialog mSendDialog; static final int DATE_DIALOG_ID = 0; static final int TIME_DIALOG_ID = 1; //Request codes private static final int ACTIVITY_GROUPPICKER = 0; private static final int ACTIVITY_FRIENDPICKER = 1; // Date and Time private int mYear; private int mMonth; private int mDay; private int mHour; private int mMinute; // Views private View datetimeLayout; private Button allButton, groupButton, friendsButton, dateButton, timeButton, sendButton; private Spinner msgSpinner; private EditText subjectText, bodyText; private TextView msgRecipientText; private DatePickerDialog.OnDateSetListener mDateSetListener = new DatePickerDialog.OnDateSetListener() { public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { mYear = year; mMonth = monthOfYear; mDay = dayOfMonth; updateDateTimeSubject(true); } }; private TimePickerDialog.OnTimeSetListener mTimeSetListener = new TimePickerDialog.OnTimeSetListener() { public void onTimeSet(TimePicker view, int hourOfDay, int minute) { mHour = hourOfDay; mMinute = minute; updateDateTimeSubject(true); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.messagesender); mGroupId = savedInstanceState != null ? savedInstanceState.getLong(Groups.TABLE) : 0; if (mGroupId == 0) { Bundle extras = getIntent().getExtras(); mGroupId = extras != null ? extras.getLong(Groups.TABLE) : 0; } mUserIds = savedInstanceState != null ? savedInstanceState.getLongArray(Users.TABLE) : null; if (mUserIds == null) { Bundle extras = getIntent().getExtras(); mUserIds = extras != null ? extras.getLongArray(Users.TABLE) : null; } mSubjectString = savedInstanceState != null ? savedInstanceState.getString(GameMessages.SUBJECT) : null; if (mSubjectString == null) { Bundle extras = getIntent().getExtras(); mSubjectString = extras != null ? extras.getString(GameMessages.SUBJECT) : null; } Common.log(TAG, "onCreate(): groupId = " + mGroupId); mDbHelper = new DatabaseHelper(this); mDbHelper.openAndGetDb(); mReceiver = new MessageSenderReceiver(); mGameCon = new GamingServiceConnection(this, mReceiver, Constants.APP_ID, Constants.APP_API_KEY, MessageSender.class.toString()); mGameCon.bind(); User user = Common.getRegisteredUser(this); mGameCon.setUserId(user.id, user.fb_id, user.fb_token); setTitle("New Message"); if (mUserIds == null) { mUsers = null; } else { mUsers = mDbHelper.getUserArrayForUserIds(mUserIds); } msgSpinner = (Spinner) findViewById(R.id.msg_type_spinner); ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, GameMessages.types); spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); msgSpinner.setAdapter(spinnerAdapter); msgSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { Common.log(TAG, "spinner position = " + pos); switch(pos) { case GameMessages.TYPE_GENERIC: mMessageType = GameMessages.TYPE_GENERIC; datetimeLayout.setVisibility(View.GONE); //allButton.setVisibility(View.VISIBLE); subjectText.setEnabled(true); subjectText.setHint("Subject"); subjectText.requestFocus(); break; case GameMessages.TYPE_INVITE: mMessageType = GameMessages.TYPE_INVITE; datetimeLayout.setVisibility(View.VISIBLE); //allButton.setVisibility(View.GONE); subjectText.setEnabled(false); bodyText.requestFocus(); break; case GameMessages.TYPE_CHALLENGE: mMessageType = GameMessages.TYPE_CHALLENGE; datetimeLayout.setVisibility(View.VISIBLE); //allButton.setVisibility(View.GONE); subjectText.setEnabled(false); bodyText.requestFocus(); break; default: break; } updateDateTimeSubject(true); updateRecipients(); } public void onNothingSelected(AdapterView<?> parent) {} }); subjectText = (EditText) findViewById(R.id.msg_subject); if (mSubjectString != null) { Common.log(TAG, "subjectString = " + mSubjectString); subjectText.setText(mSubjectString); msgSpinner.setSelection(GameMessages.TYPE_GENERIC); mMessageType = GameMessages.TYPE_GENERIC; } bodyText = (EditText) findViewById(R.id.msg_body); final Calendar c = Calendar.getInstance(); mYear = c.get(Calendar.YEAR); mMonth = c.get(Calendar.MONTH); mDay = c.get(Calendar.DAY_OF_MONTH); mHour = c.get(Calendar.HOUR_OF_DAY); mMinute = c.get(Calendar.MINUTE); datetimeLayout = findViewById(R.id.msg_datetime_layout); allButton = (Button) findViewById(R.id.msg_to_all); allButton.setVisibility(View.GONE); allButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { mGroupId = 0; mUserIds = null; mUsers = null; updateRecipients(); } }); groupButton = (Button) findViewById(R.id.msg_to_group); groupButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { MessageSender.this.startActivityForResult( new Intent(MessageSender.this, GroupPicker.class), ACTIVITY_GROUPPICKER); } }); friendsButton = (Button) findViewById(R.id.msg_to_friends); friendsButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { Intent i = new Intent(MessageSender.this, FriendPicker.class); i.putExtra(FriendPicker.MODE_KEY, FriendPicker.MODE_RECIPIENT); i.putExtra(Users.TABLE, mUserIds); startActivityForResult(i, ACTIVITY_FRIENDPICKER); } }); dateButton = (Button) findViewById(R.id.msg_date); dateButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { showDialog(DATE_DIALOG_ID); } }); timeButton = (Button) findViewById(R.id.msg_time); timeButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { showDialog(TIME_DIALOG_ID); } }); sendButton = (Button) findViewById(R.id.msg_send); sendButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { //if (mMessageType != GameMessages.TYPE_GENERIC && mGroupId == 0 && mUsers == null) { if (mGroupId == 0 && mUsers == null) { Toast toast = Toast.makeText(MessageSender.this, "Select a group or some friends to send to", Toast.LENGTH_SHORT); toast.show(); } else if (subjectText.getText().toString().equals("")) { Toast toast = Toast.makeText(MessageSender.this, "Cannot send without a subject", Toast.LENGTH_SHORT); toast.show(); } else sendMessage(); } }); msgRecipientText = (TextView)findViewById(R.id.msg_to); updateRecipients(); updateDateTimeSubject(false); } @Override protected void onRestart() { Common.log(TAG, "onRestart()"); mDbHelper.openAndGetDb(); super.onRestart(); } @Override protected void onResume() { Common.log(TAG, "onResume()"); super.onResume(); } @Override protected void onDestroy() { mDbHelper.close(); mGameCon.unbind(); super.onDestroy(); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putLong(Groups.TABLE, mGroupId); outState.putLongArray(Users.TABLE, mUserIds); outState.putString(GameMessages.SUBJECT, mSubjectString); } @Override protected Dialog onCreateDialog(int id) { switch (id) { case TIME_DIALOG_ID: return new TimePickerDialog(this, mTimeSetListener, mHour, mMinute, false); case DATE_DIALOG_ID: return new DatePickerDialog(this, mDateSetListener, mYear, mMonth, mDay); } return null; } @Override protected void onPrepareDialog(int id, Dialog dialog) { switch (id) { case TIME_DIALOG_ID: ((TimePickerDialog) dialog).updateTime(mHour, mMinute); break; case DATE_DIALOG_ID: ((DatePickerDialog) dialog).updateDate(mYear, mMonth, mDay); break; } } private void updateRecipients() { Common.log(TAG, "updateRecipients()"); if (mGroupId == 0 && mUsers == null) { //if (mMessageType == GameMessages.TYPE_GENERIC) // msgRecipientText.setText("To: All"); //else msgRecipientText.setText("To: "); } else if (mGroupId > 0) { Cursor groupInfo = mDbHelper.getGroupWithId(mGroupId); String groupName = null; if (groupInfo.moveToFirst()) groupName = groupInfo.getString(2); groupInfo.close(); msgRecipientText.setText("To: " + groupName); } else if (mUsers != null) { msgRecipientText.setText("To: " + Common.nameListForUsers(mUsers)); } } private void updateDateTimeSubject(boolean updateSubject) { dateButton.setText(new StringBuilder() .append(mMonth+1).append("/") .append(mDay).append("/") .append(mYear)); String timeString = Common.timeString(mHour, mMinute); timeButton.setText(timeString); switch(mMessageType) { case GameMessages.TYPE_INVITE: subjectText.setText("Run Invite: " + new StringBuilder() .append(mMonth+1).append("/") .append(mDay).toString() + " at " + timeString); break; case GameMessages.TYPE_CHALLENGE: subjectText.setText("Run Challenge: " + new StringBuilder() .append(mMonth+1).append("/") .append(mDay).toString() + " at " + timeString); break; case GameMessages.TYPE_GENERIC: if (mSubjectString != null) subjectText.setText(mSubjectString); else subjectText.setText(""); default: break; } } private User[] getArrayOfRecipients() { if (mUsers == null && mGroupId == 0) return null; else if (mUsers == null) { User[] recipients = mDbHelper.getUserArrayForUserCursor( mDbHelper.getUsersForGroup(mGroupId)); return recipients; } else return mUsers; } private void sendMessage() { Common.log(TAG, "sendMessage(): sending message..."); Calendar c = Calendar.getInstance(); c.set(mYear, mMonth, mDay, mHour, mMinute); long now = System.currentTimeMillis(); mMsgObject= new MessageObject(msgSpinner.getSelectedItemPosition(), now, c.getTimeInMillis(), subjectText.getText().toString(), bodyText.getText().toString()); User[] recipients = getArrayOfRecipients(); mSendDialog = ProgressDialog.show(MessageSender.this, "", "Sending...", true); try { mGameCon.sendMessage(MSG_SEND_RID, mMsgObject, Messages.TYPE_GM, Common.getRegisteredUser(this), null, recipients, now, Feed.class.toString()); } catch (RemoteException e) {} } @Override protected void onActivityResult(int requestCode, int resultCode, Intent intent) { super.onActivityResult(requestCode, resultCode, intent); if (intent == null) return; Bundle extras = intent.getExtras(); switch(requestCode) { case ACTIVITY_GROUPPICKER: mGroupId = extras.getLong(Groups.TABLE); Common.log(TAG, "onActivityResult(): groupId = " + mGroupId); mUsers = null; updateRecipients(); break; case ACTIVITY_FRIENDPICKER: mUserIds = extras.getLongArray(Users.TABLE); Common.log(TAG, "onActivityResult(): groupIds = " + Arrays.toString(mUserIds)); mUsers = mDbHelper.getUserArrayForUserIds(mUserIds); mGroupId = 0; updateRecipients(); break; default: break; } } // Empty receiver class MessageSenderReceiver extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { try { AppResponse appResponse = null; while ((appResponse = mGameCon.getNextPendingNotification()) != null) { Common.log(TAG, appResponse.toString()); if (appResponse.result_code.equals(GamingServiceConnection.RESULT_CODE_ERROR)) { MessageSender.this.runOnUiThread(new Runnable() { public void run() { if (mSendDialog != null) mSendDialog.dismiss(); Toast toast = Toast.makeText(MessageSender.this, R.string.connection_error_toast, Toast.LENGTH_SHORT); toast.show(); } }); continue; } else if (appResponse.result_code.equals(GamingServiceConnection.RESULT_CODE_VERSION_ERROR)) { MessageSender.this.runOnUiThread(new Runnable() { public void run() { if (mSendDialog != null) mSendDialog.dismiss(); Common.displayUpgradeDialog(MessageSender.this); } }); continue; } switch (appResponse.request_id) { case MSG_SEND_RID: MessageSender.this.runOnUiThread(new Runnable() { public void run() { mDbHelper.insertGameMessage(Common.getRegisteredUser(MessageSender.this), getArrayOfRecipients(), mMsgObject.mOrigSendTime, mMsgObject); mSendDialog.dismiss(); Toast toast = Toast.makeText(MessageSender.this, "Message sent", Toast.LENGTH_SHORT); toast.show(); finish(); } }); break; default: break; } } } catch (Exception e) { e.printStackTrace(); } } } }