package com.kuxhausen.huemore.alarm; import android.database.Cursor; import android.os.Bundle; import android.support.v4.app.DialogFragment; import android.support.v4.app.LoaderManager; import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; import android.support.v4.widget.SimpleCursorAdapter; import android.text.format.DateFormat; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.view.Window; import android.widget.Button; import android.widget.SeekBar; import android.widget.Spinner; import android.widget.TextView; import android.widget.TimePicker; import com.kuxhausen.huemore.R; import com.kuxhausen.huemore.persistence.Definitions.GroupColumns; import com.kuxhausen.huemore.persistence.Definitions.InternalArguments; import com.kuxhausen.huemore.persistence.Definitions.MoodColumns; import java.util.Calendar; public class NewAlarmDialogFragment extends DialogFragment implements OnClickListener, LoaderManager.LoaderCallbacks<Cursor>, RepeatDialogFragment.OnRepeatSelectedListener { // Identifies a particular Loader being used in this component private static final int GROUPS_LOADER = 0, MOODS_LOADER = 1; private static final String[] GROUP_SELECTION = {GroupColumns.COL_GROUP_NAME, GroupColumns._ID}; private static final String[] MOOD_SELECTION = {MoodColumns.COL_MOOD_NAME, MoodColumns._ID}; private SeekBar brightnessBar; private Spinner groupSpinner, moodSpinner; private SimpleCursorAdapter groupDataSource, moodDataSource; private Button repeatButton; private TextView repeatView; private DaysOfWeek repeats = new DaysOfWeek(); private TimePicker timePick; private AlarmData priorState; public void onLoadLoaderManager(AlarmData optionalState) { if (optionalState != null) { this.priorState = optionalState; } if (groupSpinner != null && moodSpinner != null) { LoaderManager lm = getActivity().getSupportLoaderManager(); lm.restartLoader(GROUPS_LOADER, null, this); lm.restartLoader(MOODS_LOADER, null, this); int layout = android.R.layout.simple_list_item_activated_1; groupDataSource = new SimpleCursorAdapter(getActivity(), layout, null, GROUP_SELECTION, new int[]{android.R.id.text1}, 0); groupDataSource.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); groupSpinner.setAdapter(groupDataSource); moodDataSource = new SimpleCursorAdapter(getActivity(), layout, null, MOOD_SELECTION, new int[]{android.R.id.text1}, 0); moodDataSource.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); moodSpinner.setAdapter(moodDataSource); if (optionalState != null) { // apply initial state int moodPos = 0; for (int i = 0; i < moodDataSource.getCount(); i++) { if (moodDataSource.getItem(i).equals(optionalState.getMoodName())) { moodPos = i; } } moodSpinner.setSelection(moodPos); int groupPos = 0; for (int i = 0; i < groupDataSource.getCount(); i++) { if (groupDataSource.getItem(i).equals(optionalState.getGroupName())) { groupPos = i; } } groupSpinner.setSelection(groupPos); brightnessBar.setProgress(optionalState.getBrightness()); onRepeatSelected(optionalState.getRepeatDays()); timePick.setCurrentHour(optionalState.getHourOfDay()); timePick.setCurrentMinute(optionalState.getMinute()); } } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment View myView = inflater.inflate(R.layout.edit_alarm_dialog, container, false); this.getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE); Button cancelButton = (Button) myView.findViewById(R.id.cancel); cancelButton.setOnClickListener(this); Button okayButton = (Button) myView.findViewById(R.id.okay); okayButton.setOnClickListener(this); timePick = (TimePicker) myView.findViewById(R.id.alarmTimePicker); timePick.setIs24HourView(DateFormat.is24HourFormat(this.getActivity())); brightnessBar = (SeekBar) myView.findViewById(R.id.brightnessBar); repeatButton = (Button) myView.findViewById(R.id.repeatButton); repeatButton.setOnClickListener(this); repeatView = (TextView) myView.findViewById(R.id.repeatVisualization); groupSpinner = (Spinner) myView.findViewById(R.id.groupSpinner); moodSpinner = (Spinner) myView.findViewById(R.id.moodSpinner); onLoadLoaderManager(priorState); return myView; } @Override public void onClick(View v) { switch (v.getId()) { case R.id.repeatButton: RepeatDialogFragment rdf = new RepeatDialogFragment(); Bundle args = new Bundle(); args.putByte(InternalArguments.DAYS_OF_WEEK_AS_BYTE, repeats.getValue()); rdf.setArguments(args); rdf.setResultListener(this); rdf.show(getFragmentManager(), InternalArguments.FRAG_MANAGER_DIALOG_TAG); break; case R.id.okay: onCreateAlarm(); this.dismiss(); break; case R.id.cancel: this.dismiss(); break; } } /** * Callback that's invoked when the system has initialized the Loader and is ready to start the * query. This usually happens when initLoader() is called. The loaderID argument contains the ID * value passed to the initLoader() call. */ @Override public Loader<Cursor> onCreateLoader(int loaderID, Bundle arg1) { /* * Takes action based on the ID of the Loader that's being created */ switch (loaderID) { case GROUPS_LOADER: return new CursorLoader(getActivity(), GroupColumns.URI, GROUP_SELECTION, null, null, null); case MOODS_LOADER: return new CursorLoader(getActivity(), MoodColumns.MOODS_URI, MOOD_SELECTION, null, null, null); default: // An invalid id was passed in return null; } } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) { /* * Moves the query results into the adapter, causing the ListView fronting this adapter to * re-display */ switch (loader.getId()) { case GROUPS_LOADER: if (groupDataSource != null) { groupDataSource.changeCursor(cursor); } break; case MOODS_LOADER: if (moodDataSource != null) { moodDataSource.changeCursor(cursor); } break; } if (priorState != null) { // apply initial state int moodPos = 0; for (int i = 0; i < moodDataSource.getCount(); i++) { if (((Cursor) moodDataSource.getItem(i)).getString(0).equals( priorState.getMoodName())) { moodPos = i; } } moodSpinner.setSelection(moodPos); int groupPos = 0; for (int i = 0; i < groupDataSource.getCount(); i++) { if (((Cursor) groupDataSource.getItem(i)).getString(0).equals( priorState.getGroupName())) { groupPos = i; } } groupSpinner.setSelection(groupPos); } } @Override public void onLoaderReset(Loader<Cursor> loader) { /* * Clears out the adapter's reference to the Cursor. This prevents memory leaks. */ switch (loader.getId()) { case GROUPS_LOADER: if (groupDataSource != null) { groupDataSource.changeCursor(null); } break; case MOODS_LOADER: if (moodDataSource != null) { moodDataSource.changeCursor(null); } break; } } @Override public void onRepeatSelected(DaysOfWeek days) { repeatView.setText(AlarmData.repeatsToString(getActivity(), days)); repeats = days; } public void onCreateAlarm() { AlarmData data = new AlarmData(); boolean priorExisted = false; if (priorState != null) { AlarmReceiver.unregisterAlarm(getActivity(), priorState); data = priorState; priorExisted = true; } data.setGroup(((Cursor) groupSpinner.getSelectedItem()).getLong(1), ((Cursor) groupSpinner.getSelectedItem()).getString(0)); data.setMood(((Cursor) moodSpinner.getSelectedItem()).getLong(1), ((Cursor) moodSpinner.getSelectedItem()).getString(0)); data.setBrightness(brightnessBar.getProgress()); data.setRepeatDays(repeats); data.setEnabled(true); data.setAlarmTime(AlarmLogic.computeNextAlarmTime(timePick.getCurrentHour(), timePick.getCurrentMinute(), repeats, Calendar.getInstance())); if (priorExisted) { AlarmLogic.saveChangesToDB(getActivity(), data); } else { AlarmLogic.insertAlarmToDB(getActivity(), data); } AlarmReceiver.registerAlarm(getActivity(), data, true); } }