package org.gscript; import java.text.SimpleDateFormat; import java.util.Calendar; import org.gscript.data.ContentUri; import org.gscript.data.ScheduleProvider; import org.gscript.receiver.ScheduleReceiver; import android.app.AlertDialog; import android.app.AlertDialog.Builder; import android.app.Dialog; import android.content.ContentValues; import android.content.DialogInterface; import android.content.Intent; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.support.v4.app.DialogFragment; import android.text.Editable; import android.text.TextWatcher; import android.view.View; import android.view.View.OnClickListener; import android.widget.CheckBox; import android.widget.EditText; import android.widget.TextView; import android.widget.TimePicker; import android.widget.TimePicker.OnTimeChangedListener; import com.actionbarsherlock.app.SherlockFragmentActivity; import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.MenuInflater; import com.actionbarsherlock.view.MenuItem; public class ScheduleActivity extends SherlockFragmentActivity { static final String LOG_TAG = "ScheduleActivity"; static final int INTERVAL_MAX = (23*60)+59; static final int DIALOG_TIME_START_ID = 0; static final int DIALOG_TIME_END_ID = 1; public static final String ACTION_ADD = "org.gscript.ScheduleActivity.action_add"; public static final String ACTION_EDIT = "org.gscript.ScheduleActivity.action_edit"; public static final String EXTRA_SCHEDULE_ID = "id"; static final SimpleDateFormat sTimeFormat = new SimpleDateFormat("hh:mm a"); String mIntentAction; int mScheduleId; EditText mEditTextName; CheckBox mCheckBoxMonday; CheckBox mCheckBoxTuesday; CheckBox mCheckBoxWednesday; CheckBox mCheckBoxThursday; CheckBox mCheckBoxFriday; CheckBox mCheckBoxSaturday; CheckBox mCheckBoxSunday; Calendar mTimeStart; Calendar mTimeEnd; TextView mTextViewStart; TextView mTextViewEnd; EditText mEditTextInterval; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_schedule); Intent intent = this.getIntent(); mIntentAction = intent.getAction(); mScheduleId = intent.getIntExtra(EXTRA_SCHEDULE_ID, 0); mEditTextName = (EditText) this.findViewById(R.id.editTextName); mCheckBoxMonday = (CheckBox) this.findViewById(R.id.checkBoxMonday); mCheckBoxTuesday = (CheckBox) this.findViewById(R.id.checkBoxTuesday); mCheckBoxWednesday = (CheckBox) this.findViewById(R.id.checkBoxWednesday); mCheckBoxThursday = (CheckBox) this.findViewById(R.id.checkBoxThursday); mCheckBoxFriday = (CheckBox) this.findViewById(R.id.checkBoxFriday); mCheckBoxSaturday = (CheckBox) this.findViewById(R.id.checkBoxSaturday); mCheckBoxSunday = (CheckBox) this.findViewById(R.id.checkBoxSunday); mTimeStart = Calendar.getInstance(); mTimeStart.set(Calendar.HOUR_OF_DAY, 0); mTimeStart.set(Calendar.MINUTE, 0); mTimeEnd = Calendar.getInstance(); mTimeEnd.set(Calendar.HOUR_OF_DAY, 0); mTimeEnd.set(Calendar.MINUTE, 0); mTextViewStart = (TextView) this.findViewById(R.id.textViewStart); mTextViewStart.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { TimePickerDialogFragment timePicker = new TimePickerDialogFragment(mTimeStart, mTimeStartListener); timePicker.show(getSupportFragmentManager(), "start"); } }); mTextViewEnd = (TextView) this.findViewById(R.id.textViewEnd); mTextViewEnd.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { TimePickerDialogFragment timePicker = new TimePickerDialogFragment(mTimeEnd, mTimeEndListener); timePicker.show(getSupportFragmentManager(), "end"); } }); mEditTextInterval = (EditText) this.findViewById(R.id.editTextInterval); mEditTextInterval.addTextChangedListener(new TextWatcher() { @Override public void afterTextChanged(Editable s) { try { int val = Integer.parseInt(s.toString()); if(val < 0) { mEditTextInterval.setText("0"); mEditTextInterval.setSelection(0, 1); } if(val > (INTERVAL_MAX)) { mEditTextInterval.setText(String.valueOf(INTERVAL_MAX)); } } catch(NumberFormatException e) { mEditTextInterval.setText("0"); mEditTextInterval.setSelection(0, 1); } } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } }); if (ACTION_ADD.equals(mIntentAction)) { this.setTitle(R.string.schedule_add); /* set time end to end of day */ mTimeEnd.set(Calendar.HOUR_OF_DAY, 23); mTimeEnd.set(Calendar.MINUTE, 59); } else { Cursor c = this.getContentResolver().query( Uri.withAppendedPath(ContentUri.URI_SCHEDULE, String.valueOf(mScheduleId)), null, null, null, null); if (c.moveToFirst()) { String scheduleName = c.getString(c .getColumnIndex(ScheduleProvider.COLUMN_TITLE)); mEditTextName.setText(scheduleName); setTitle(String.format("Edit '%s'", scheduleName)); int days = c.getInt(c .getColumnIndex(ScheduleProvider.COLUMN_DAYS)); /* set checked days */ mCheckBoxMonday .setChecked((days & ScheduleProvider.MONDAY) != 0); mCheckBoxTuesday .setChecked((days & ScheduleProvider.TUESDAY) != 0); mCheckBoxWednesday .setChecked((days & ScheduleProvider.WEDNESDAY) != 0); mCheckBoxThursday .setChecked((days & ScheduleProvider.THURSDAY) != 0); mCheckBoxFriday .setChecked((days & ScheduleProvider.FRIDAY) != 0); mCheckBoxSaturday .setChecked((days & ScheduleProvider.SATURDAY) != 0); mCheckBoxSunday .setChecked((days & ScheduleProvider.SUNDAY) != 0); int interval = c.getInt(c .getColumnIndex(ScheduleProvider.COLUMN_INTERVAL)); mEditTextInterval.setText(String.valueOf(interval)); int timeStart = c.getInt(c.getColumnIndex(ScheduleProvider.COLUMN_TIME_START)); int timeEnd = c.getInt(c.getColumnIndex(ScheduleProvider.COLUMN_TIME_END)); /* time is stored as minutes */ mTimeStart.add(Calendar.MINUTE, timeStart); mTimeEnd.add(Calendar.MINUTE, timeEnd); } c.close(); } updateTimeStartText(); updateTimeEndText(); } OnTimeChangedListener mTimeStartListener = new OnTimeChangedListener() { @Override public void onTimeChanged(TimePicker view, int hourOfDay, int minute) { mTimeStart.set(Calendar.HOUR_OF_DAY, hourOfDay); mTimeStart.set(Calendar.MINUTE, minute); updateTimeStartText(); } }; OnTimeChangedListener mTimeEndListener = new OnTimeChangedListener() { @Override public void onTimeChanged(TimePicker view, int hourOfDay, int minute) { mTimeEnd.set(Calendar.HOUR_OF_DAY, hourOfDay); mTimeEnd.set(Calendar.MINUTE, minute); updateTimeEndText(); } }; void updateTimeStartText() { mTextViewStart.setText(sTimeFormat.format(mTimeStart.getTime())); } void updateTimeEndText() { mTextViewEnd.setText(sTimeFormat.format(mTimeEnd.getTime())); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = this.getSupportMenuInflater(); inflater.inflate(R.menu.schedule, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { ContentValues val = new ContentValues(); String title = mEditTextName.getText().toString(); if(title.length()==0) title = "Unnamed schedule"; val.put(ScheduleProvider.COLUMN_TITLE, title); /* possible week interval for future use */ val.put(ScheduleProvider.COLUMN_WEEK, 0); /* add selected days to mask */ int days = 0; days |= (mCheckBoxMonday.isChecked()) ? ScheduleProvider.MONDAY : 0; days |= (mCheckBoxTuesday.isChecked()) ? ScheduleProvider.TUESDAY : 0; days |= (mCheckBoxWednesday.isChecked()) ? ScheduleProvider.WEDNESDAY : 0; days |= (mCheckBoxThursday.isChecked()) ? ScheduleProvider.THURSDAY : 0; days |= (mCheckBoxFriday.isChecked()) ? ScheduleProvider.FRIDAY : 0; days |= (mCheckBoxSaturday.isChecked()) ? ScheduleProvider.SATURDAY : 0; days |= (mCheckBoxSunday.isChecked()) ? ScheduleProvider.SUNDAY : 0; val.put(ScheduleProvider.COLUMN_DAYS, days); /* store time in minutes */ int timeStart = (mTimeStart.get(Calendar.HOUR_OF_DAY) * 60) + mTimeStart.get(Calendar.MINUTE); int timeEnd = (mTimeEnd.get(Calendar.HOUR_OF_DAY) * 60) + mTimeEnd.get(Calendar.MINUTE); /* check if we need to swap start/end time */ if(timeStart > timeEnd) { int tmpEnd = timeStart; timeStart = timeEnd; timeEnd = tmpEnd; } val.put(ScheduleProvider.COLUMN_TIME_START, timeStart); val.put(ScheduleProvider.COLUMN_TIME_END, timeEnd); int interval = 0; try { interval = Integer.parseInt(mEditTextInterval.getText().toString()); } catch (NumberFormatException e) { } val.put(ScheduleProvider.COLUMN_INTERVAL, interval); switch (item.getItemId()) { case R.id.menu_schedule_save: int scheduleId; if (ACTION_ADD.equals(mIntentAction)) { /* insert new schedule */ Uri scheduleUri = getContentResolver().insert(ContentUri.URI_SCHEDULE, val); scheduleId = Integer.parseInt(scheduleUri.getLastPathSegment()); } else { /* update existing schedule */ getContentResolver().update( Uri.withAppendedPath(ContentUri.URI_SCHEDULE, String.valueOf(mScheduleId)), val, null, null); scheduleId = mScheduleId; } Intent rescheduleIntent = new Intent(ScheduleReceiver.ACTION_RESCHEDULE); rescheduleIntent.putExtra(ScheduleReceiver.EXTRA_SCHEDULE_ID, scheduleId); sendBroadcast(rescheduleIntent); this.finish(); return true; default: this.finish(); } return true; } public class TimePickerDialogFragment extends DialogFragment { private TimePicker mTimePicker; private Calendar mCalendar; private OnTimeChangedListener mListener; public TimePickerDialogFragment(Calendar calendar, OnTimeChangedListener listener) { mListener = listener; mCalendar = calendar; } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { mTimePicker = new TimePicker(this.getActivity()); if(mCalendar != null) { mTimePicker.setCurrentHour(mCalendar.get(Calendar.HOUR_OF_DAY)); mTimePicker.setCurrentMinute(mCalendar.get(Calendar.MINUTE)); } Builder builder = new AlertDialog.Builder(this.getActivity()); builder.setView(mTimePicker); builder.setMessage("Set time") .setPositiveButton("Set", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { mListener.onTimeChanged(mTimePicker, mTimePicker.getCurrentHour(), mTimePicker.getCurrentMinute()); getDialog().dismiss(); } }) .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { getDialog().cancel(); } }); return builder.create(); } } }