From 92b306afaa8bacef9ce6dfe7d20bfe6a0b0b045f Mon Sep 17 00:00:00 2001 From: Phillip Hsu Date: Sun, 26 Jun 2016 16:01:31 -0700 Subject: [PATCH] Deprecated MVP in EditAlarm --- .../clock2/editalarm/AlarmContract.java | 1 + .../clock2/editalarm/EditAlarmActivity.java | 148 ++++++++++++++---- .../clock2/editalarm/EditAlarmContract.java | 1 + .../clock2/editalarm/EditAlarmPresenter.java | 17 ++ 4 files changed, 134 insertions(+), 33 deletions(-) diff --git a/app/src/main/java/com/philliphsu/clock2/editalarm/AlarmContract.java b/app/src/main/java/com/philliphsu/clock2/editalarm/AlarmContract.java index 9f1c722..76e3ff1 100644 --- a/app/src/main/java/com/philliphsu/clock2/editalarm/AlarmContract.java +++ b/app/src/main/java/com/philliphsu/clock2/editalarm/AlarmContract.java @@ -5,6 +5,7 @@ import java.util.Date; /** * Created by Phillip Hsu on 6/2/2016. */ +@Deprecated interface AlarmContract { interface View { diff --git a/app/src/main/java/com/philliphsu/clock2/editalarm/EditAlarmActivity.java b/app/src/main/java/com/philliphsu/clock2/editalarm/EditAlarmActivity.java index 3e9846f..5a8a2b8 100644 --- a/app/src/main/java/com/philliphsu/clock2/editalarm/EditAlarmActivity.java +++ b/app/src/main/java/com/philliphsu/clock2/editalarm/EditAlarmActivity.java @@ -11,6 +11,7 @@ import android.text.SpannableString; import android.text.Spanned; import android.text.format.DateFormat; import android.text.style.RelativeSizeSpan; +import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.MotionEvent; @@ -27,15 +28,11 @@ import com.philliphsu.clock2.BaseActivity; import com.philliphsu.clock2.DaysOfWeek; import com.philliphsu.clock2.R; import com.philliphsu.clock2.SharedPreferencesHelper; -import com.philliphsu.clock2.model.AlarmsRepository; -import com.philliphsu.clock2.model.DatabaseManager; import com.philliphsu.clock2.ringtone.RingtoneActivity; import com.philliphsu.clock2.util.AlarmUtils; import com.philliphsu.clock2.util.LocalBroadcastHelper; -import java.util.Calendar; import java.util.Date; -import java.util.GregorianCalendar; import butterknife.Bind; import butterknife.OnCheckedChanged; @@ -45,6 +42,8 @@ import butterknife.OnTouch; import static android.text.format.DateFormat.getTimeFormat; import static android.view.View.GONE; import static android.view.View.VISIBLE; +import static com.philliphsu.clock2.DaysOfWeek.SATURDAY; +import static com.philliphsu.clock2.DaysOfWeek.SUNDAY; import static com.philliphsu.clock2.util.KeyboardUtils.hideKeyboard; import static com.philliphsu.clock2.util.Preconditions.checkNotNull; @@ -58,9 +57,9 @@ public class EditAlarmActivity extends BaseActivity implements AlarmNumpad.KeyLi private static final int REQUEST_PICK_RINGTONE = 0; private static final int ID_MENU_ITEM = 0; - - private EditAlarmContract.Presenter mPresenter; + private Uri mSelectedRingtoneUri; + private Alarm mAlarm; @Bind(R.id.save) Button mSave; @Bind(R.id.delete) Button mDelete; @@ -78,15 +77,54 @@ public class EditAlarmActivity extends BaseActivity implements AlarmNumpad.KeyLi super.onCreate(savedInstanceState); setWeekDaysText(); mNumpad.setKeyListener(this); - mPresenter = new EditAlarmPresenter(this, AlarmsRepository.getInstance(this), this, this); - mPresenter.loadAlarm(getIntent().getLongExtra(EXTRA_ALARM_ID, -1)); - mPresenter.setTimeTextHint(); + loadAlarm(getIntent().getLongExtra(EXTRA_ALARM_ID, -1)); + setTimeTextHint(); // TODO: private access + } + + private void loadAlarm(long alarmId) { + mAlarm = alarmId > -1 ? + null // TODO: Retrieve from SQLite + : null; + showDetails(); + } + + // TODO: Privatize access of each method called here. + private void showDetails() { + if (mAlarm != null) { + showTime(mAlarm.hour(), mAlarm.minutes()); + showEnabled(mAlarm.isEnabled()); + for (int i = SUNDAY; i <= SATURDAY; i++) { + showRecurringDays(i, mAlarm.isRecurring(i)); + } + showLabel(mAlarm.label()); + showRingtone(mAlarm.ringtone()); + showVibrates(mAlarm.vibrates()); + // Editing so don't show + showNumpad(false); + showTimeTextFocused(false); + } else { + // TODO default values + showTimeTextFocused(true); + showRingtone(""); // gets default ringtone + showNumpad(true); + } } @Override public boolean onPrepareOptionsMenu(Menu menu) { // TODO: Snooze menu item when alarm is ringing. - mPresenter.onPrepareOptionsMenu(); + if (mAlarm != null && mAlarm.isEnabled()) { + // TODO: Read from prefs directly? + int hoursBeforeUpcoming = getInt(R.string.key_notify_me_of_upcoming_alarms, 2); + // TODO: Schedule task with handler to show the menu item when it is time. Handler is fine because + // the task only needs to be done if the activity is being viewed. (I think) if the process of this + // app is killed, then the handler is also killed. + if ((mAlarm.ringsWithinHours(hoursBeforeUpcoming))) { + showCanDismissNow(); + } else if (mAlarm.isSnoozed()) { + showSnoozed(new Date(mAlarm.snoozingUntil())); + } + } return super.onPrepareOptionsMenu(menu); } @@ -94,13 +132,15 @@ public class EditAlarmActivity extends BaseActivity implements AlarmNumpad.KeyLi public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_dismiss_now: - mPresenter.dismissNow(); - item.setVisible(false); - return true; case R.id.action_done_snoozing: - mPresenter.stopSnoozing(); + // TODO: helper method? + cancelAlarm(checkNotNull(mAlarm), true); + // cancelAlarm() should have turned off this alarm if appropriate + showEnabled(mAlarm.isEnabled()); item.setVisible(false); - getSupportActionBar().setDisplayShowTitleEnabled(false); // TODO: Move to presenter? + // This only matters for case R.id.action_done_snoozing. + // It won't hurt to call this for case R.id.action_dismiss_now. + getSupportActionBar().setDisplayShowTitleEnabled(false); return true; } return super.onOptionsItemSelected(item); @@ -111,7 +151,6 @@ public class EditAlarmActivity extends BaseActivity implements AlarmNumpad.KeyLi // Since this Activity doesn't host fragments, not necessary? //super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_PICK_RINGTONE && resultCode == RESULT_OK) { - // TODO: How can we make this MVP? mSelectedRingtoneUri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI); updateRingtoneButtonText(); } @@ -132,7 +171,7 @@ public class EditAlarmActivity extends BaseActivity implements AlarmNumpad.KeyLi // This if check must be here unless you want to write a presenter // method called isNumpadOpen()... if (mNumpad.getVisibility() == View.VISIBLE) { - mPresenter.hideNumpad(); + showNumpad(false); } else { super.onBackPressed(); } @@ -140,39 +179,40 @@ public class EditAlarmActivity extends BaseActivity implements AlarmNumpad.KeyLi @Override public void onAcceptChanges() { - mPresenter.acceptNumpadChanges(); + showNumpad(false); + showEnabled(true); } @Override public void onNumberInput(String formattedInput) { - mPresenter.onNumberInput(formattedInput); + showTimeText(formattedInput); } @Override public void onCollapse() { - mPresenter.hideNumpad(); + showNumpad(false); } @Override public void onBackspace(String newStr) { - mPresenter.onBackspace(newStr); + showTimeTextPostBackspace(newStr); } @Override public void onLongBackspace() { - mPresenter.onBackspace(""); + showTimeTextPostBackspace(""); } @OnTouch(R.id.input_time) boolean touch(MotionEvent event) { if (event.getActionMasked() == MotionEvent.ACTION_UP) { hideKeyboard(this); // If not open, does nothing. - mPresenter.focusTimeText(); + showTimeTextFocused(true); if (mNumpad.getVisibility() != View.VISIBLE) { // TODO: If keyboard was open, consider adding delay to opening the numpad. // Otherwise, it opens immediately behind the keyboard as it is still animating // out of the window. - mPresenter.showNumpad(); + showNumpad(true); } } return true; @@ -180,22 +220,64 @@ public class EditAlarmActivity extends BaseActivity implements AlarmNumpad.KeyLi @OnClick(R.id.ringtone) void ringtone() { - mPresenter.openRingtonePickerDialog(); + showRingtonePickerDialog(); } + // TODO: Privatize accessor methods @OnClick(R.id.save) void save() { - //mPresenter.save(); - Calendar calendar = new GregorianCalendar(); - int hour = calendar.get(Calendar.HOUR_OF_DAY); - int minutes = calendar.get(Calendar.MINUTE); - Alarm alarm = Alarm.builder().hour(hour).minutes((minutes + 1) % 60).build(); - DatabaseManager.getInstance(this).insertAlarm(alarm); + int hour; + int minutes; + try { + hour = getHour(); + minutes = getMinutes(); + } catch (IllegalStateException e) { + Log.e(TAG, e.getMessage()); + return; + } + + Alarm a = Alarm.builder() + .hour(hour) + .minutes(minutes) + .ringtone(getRingtone()) + .label(getLabel()) + .vibrates(vibrates()) + .build(); + a.setEnabled(isEnabled()); + for (int i = SUNDAY; i <= SATURDAY; i++) { + a.setRecurring(i, isRecurringDay(i)); + } + + if (mAlarm != null) { + if (mAlarm.isEnabled()) { + Log.d(TAG, "Cancelling old alarm first"); + cancelAlarm(mAlarm, false); + } + // TODO: Update sql + //mRepository.updateItem(mAlarm, a); + } else { + // TODO: Insert sql + //mRepository.addItem(a); + } + + if (a.isEnabled()) { + scheduleAlarm(a); + } + + showEditorClosed(); } + // TODO: Private accessor @OnClick(R.id.delete) void delete() { - mPresenter.delete(); + if (mAlarm != null) { + if (mAlarm.isEnabled()) { + cancelAlarm(mAlarm, false); + } + // TODO: Delete sql + //mRepository.deleteItem(mAlarm); + } + showEditorClosed(); } // This isn't actually concerned with setting the alarm on/off. @@ -220,7 +302,7 @@ public class EditAlarmActivity extends BaseActivity implements AlarmNumpad.KeyLi @OnTouch(R.id.label) boolean touchLabel(MotionEvent event) { if (event.getActionMasked() == MotionEvent.ACTION_UP && mNumpad.getVisibility() == VISIBLE) { - mPresenter.hideNumpad(); + showNumpad(false); } return false; // don't capture } diff --git a/app/src/main/java/com/philliphsu/clock2/editalarm/EditAlarmContract.java b/app/src/main/java/com/philliphsu/clock2/editalarm/EditAlarmContract.java index 1e4f74f..59eb7ca 100644 --- a/app/src/main/java/com/philliphsu/clock2/editalarm/EditAlarmContract.java +++ b/app/src/main/java/com/philliphsu/clock2/editalarm/EditAlarmContract.java @@ -11,6 +11,7 @@ package com.philliphsu.clock2.editalarm; * That way, each concrete interface impl doesn't need to implement the * base interface methods again and again. */ +@Deprecated public interface EditAlarmContract { interface View extends AlarmContract.View { diff --git a/app/src/main/java/com/philliphsu/clock2/editalarm/EditAlarmPresenter.java b/app/src/main/java/com/philliphsu/clock2/editalarm/EditAlarmPresenter.java index 2855b4b..1a67da5 100644 --- a/app/src/main/java/com/philliphsu/clock2/editalarm/EditAlarmPresenter.java +++ b/app/src/main/java/com/philliphsu/clock2/editalarm/EditAlarmPresenter.java @@ -18,6 +18,7 @@ import static com.philliphsu.clock2.util.Preconditions.checkNotNull; /** * Created by Phillip Hsu on 6/3/2016. */ +@Deprecated public class EditAlarmPresenter implements EditAlarmContract.Presenter { private static final String TAG = "EditAlarmPresenter"; @@ -27,6 +28,7 @@ public class EditAlarmPresenter implements EditAlarmContract.Presenter { @NonNull private final SharedPreferencesHelper mSharedPreferencesHelper; @Nullable private Alarm mAlarm; + @Deprecated public EditAlarmPresenter(@NonNull EditAlarmContract.View view, @NonNull Repository repository, @NonNull AlarmUtilsHelper helper, @@ -37,6 +39,7 @@ public class EditAlarmPresenter implements EditAlarmContract.Presenter { mSharedPreferencesHelper = sharedPreferencesHelper; } + @Deprecated @Override public void loadAlarm(long alarmId) { // Can't load alarm in ctor because showDetails() calls @@ -48,6 +51,7 @@ public class EditAlarmPresenter implements EditAlarmContract.Presenter { showDetails(); } + @Deprecated @Override public void save() { int hour; @@ -89,6 +93,7 @@ public class EditAlarmPresenter implements EditAlarmContract.Presenter { mView.showEditorClosed(); } + @Deprecated @Override public void delete() { if (mAlarm != null) { @@ -100,6 +105,7 @@ public class EditAlarmPresenter implements EditAlarmContract.Presenter { mView.showEditorClosed(); } + @Deprecated @Override public void dismissNow() { mAlarmUtilsHelper.cancelAlarm(checkNotNull(mAlarm), true); @@ -107,6 +113,7 @@ public class EditAlarmPresenter implements EditAlarmContract.Presenter { mView.showEnabled(mAlarm.isEnabled()); } + @Deprecated @Override public void stopSnoozing() { dismissNow(); // MUST be first, see AlarmUtils.notifyUpcomingAlarmIntent() @@ -117,27 +124,32 @@ public class EditAlarmPresenter implements EditAlarmContract.Presenter { */ } + @Deprecated @Override public void showNumpad() { mView.showNumpad(true); } + @Deprecated @Override public void hideNumpad() { mView.showNumpad(false); } + @Deprecated @Override public void onBackspace(String newStr) { mView.showTimeTextPostBackspace(newStr); } + @Deprecated @Override public void acceptNumpadChanges() { mView.showNumpad(false); mView.showEnabled(true); } + @Deprecated @Override public void onPrepareOptionsMenu() { if (mAlarm != null && mAlarm.isEnabled()) { @@ -153,26 +165,31 @@ public class EditAlarmPresenter implements EditAlarmContract.Presenter { } } + @Deprecated @Override public void openRingtonePickerDialog() { mView.showRingtonePickerDialog(); } + @Deprecated @Override public void setTimeTextHint() { mView.setTimeTextHint(); } + @Deprecated @Override public void onNumberInput(String formattedInput) { mView.showTimeText(formattedInput); } + @Deprecated @Override public void focusTimeText() { mView.showTimeTextFocused(true); } + @Deprecated private void showDetails() { if (mAlarm != null) { mView.showTime(mAlarm.hour(), mAlarm.minutes());