Deprecated MVP in EditAlarm

This commit is contained in:
Phillip Hsu 2016-06-26 16:01:31 -07:00
parent a1c72f8ef9
commit 92b306afaa
4 changed files with 134 additions and 33 deletions

View File

@ -5,6 +5,7 @@ import java.util.Date;
/** /**
* Created by Phillip Hsu on 6/2/2016. * Created by Phillip Hsu on 6/2/2016.
*/ */
@Deprecated
interface AlarmContract { interface AlarmContract {
interface View { interface View {

View File

@ -11,6 +11,7 @@ import android.text.SpannableString;
import android.text.Spanned; import android.text.Spanned;
import android.text.format.DateFormat; import android.text.format.DateFormat;
import android.text.style.RelativeSizeSpan; import android.text.style.RelativeSizeSpan;
import android.util.Log;
import android.view.Menu; import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.MotionEvent; import android.view.MotionEvent;
@ -27,15 +28,11 @@ import com.philliphsu.clock2.BaseActivity;
import com.philliphsu.clock2.DaysOfWeek; import com.philliphsu.clock2.DaysOfWeek;
import com.philliphsu.clock2.R; import com.philliphsu.clock2.R;
import com.philliphsu.clock2.SharedPreferencesHelper; 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.ringtone.RingtoneActivity;
import com.philliphsu.clock2.util.AlarmUtils; import com.philliphsu.clock2.util.AlarmUtils;
import com.philliphsu.clock2.util.LocalBroadcastHelper; import com.philliphsu.clock2.util.LocalBroadcastHelper;
import java.util.Calendar;
import java.util.Date; import java.util.Date;
import java.util.GregorianCalendar;
import butterknife.Bind; import butterknife.Bind;
import butterknife.OnCheckedChanged; import butterknife.OnCheckedChanged;
@ -45,6 +42,8 @@ import butterknife.OnTouch;
import static android.text.format.DateFormat.getTimeFormat; import static android.text.format.DateFormat.getTimeFormat;
import static android.view.View.GONE; import static android.view.View.GONE;
import static android.view.View.VISIBLE; 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.KeyboardUtils.hideKeyboard;
import static com.philliphsu.clock2.util.Preconditions.checkNotNull; 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 REQUEST_PICK_RINGTONE = 0;
private static final int ID_MENU_ITEM = 0; private static final int ID_MENU_ITEM = 0;
private EditAlarmContract.Presenter mPresenter;
private Uri mSelectedRingtoneUri; private Uri mSelectedRingtoneUri;
private Alarm mAlarm;
@Bind(R.id.save) Button mSave; @Bind(R.id.save) Button mSave;
@Bind(R.id.delete) Button mDelete; @Bind(R.id.delete) Button mDelete;
@ -78,15 +77,54 @@ public class EditAlarmActivity extends BaseActivity implements AlarmNumpad.KeyLi
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setWeekDaysText(); setWeekDaysText();
mNumpad.setKeyListener(this); mNumpad.setKeyListener(this);
mPresenter = new EditAlarmPresenter(this, AlarmsRepository.getInstance(this), this, this); loadAlarm(getIntent().getLongExtra(EXTRA_ALARM_ID, -1));
mPresenter.loadAlarm(getIntent().getLongExtra(EXTRA_ALARM_ID, -1)); setTimeTextHint(); // TODO: private access
mPresenter.setTimeTextHint(); }
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 @Override
public boolean onPrepareOptionsMenu(Menu menu) { public boolean onPrepareOptionsMenu(Menu menu) {
// TODO: Snooze menu item when alarm is ringing. // 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); return super.onPrepareOptionsMenu(menu);
} }
@ -94,13 +132,15 @@ public class EditAlarmActivity extends BaseActivity implements AlarmNumpad.KeyLi
public boolean onOptionsItemSelected(MenuItem item) { public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) { switch (item.getItemId()) {
case R.id.action_dismiss_now: case R.id.action_dismiss_now:
mPresenter.dismissNow();
item.setVisible(false);
return true;
case R.id.action_done_snoozing: 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); 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 true;
} }
return super.onOptionsItemSelected(item); 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? // Since this Activity doesn't host fragments, not necessary?
//super.onActivityResult(requestCode, resultCode, data); //super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_PICK_RINGTONE && resultCode == RESULT_OK) { if (requestCode == REQUEST_PICK_RINGTONE && resultCode == RESULT_OK) {
// TODO: How can we make this MVP?
mSelectedRingtoneUri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI); mSelectedRingtoneUri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
updateRingtoneButtonText(); 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 // This if check must be here unless you want to write a presenter
// method called isNumpadOpen()... // method called isNumpadOpen()...
if (mNumpad.getVisibility() == View.VISIBLE) { if (mNumpad.getVisibility() == View.VISIBLE) {
mPresenter.hideNumpad(); showNumpad(false);
} else { } else {
super.onBackPressed(); super.onBackPressed();
} }
@ -140,39 +179,40 @@ public class EditAlarmActivity extends BaseActivity implements AlarmNumpad.KeyLi
@Override @Override
public void onAcceptChanges() { public void onAcceptChanges() {
mPresenter.acceptNumpadChanges(); showNumpad(false);
showEnabled(true);
} }
@Override @Override
public void onNumberInput(String formattedInput) { public void onNumberInput(String formattedInput) {
mPresenter.onNumberInput(formattedInput); showTimeText(formattedInput);
} }
@Override @Override
public void onCollapse() { public void onCollapse() {
mPresenter.hideNumpad(); showNumpad(false);
} }
@Override @Override
public void onBackspace(String newStr) { public void onBackspace(String newStr) {
mPresenter.onBackspace(newStr); showTimeTextPostBackspace(newStr);
} }
@Override @Override
public void onLongBackspace() { public void onLongBackspace() {
mPresenter.onBackspace(""); showTimeTextPostBackspace("");
} }
@OnTouch(R.id.input_time) @OnTouch(R.id.input_time)
boolean touch(MotionEvent event) { boolean touch(MotionEvent event) {
if (event.getActionMasked() == MotionEvent.ACTION_UP) { if (event.getActionMasked() == MotionEvent.ACTION_UP) {
hideKeyboard(this); // If not open, does nothing. hideKeyboard(this); // If not open, does nothing.
mPresenter.focusTimeText(); showTimeTextFocused(true);
if (mNumpad.getVisibility() != View.VISIBLE) { if (mNumpad.getVisibility() != View.VISIBLE) {
// TODO: If keyboard was open, consider adding delay to opening the numpad. // TODO: If keyboard was open, consider adding delay to opening the numpad.
// Otherwise, it opens immediately behind the keyboard as it is still animating // Otherwise, it opens immediately behind the keyboard as it is still animating
// out of the window. // out of the window.
mPresenter.showNumpad(); showNumpad(true);
} }
} }
return true; return true;
@ -180,22 +220,64 @@ public class EditAlarmActivity extends BaseActivity implements AlarmNumpad.KeyLi
@OnClick(R.id.ringtone) @OnClick(R.id.ringtone)
void ringtone() { void ringtone() {
mPresenter.openRingtonePickerDialog(); showRingtonePickerDialog();
} }
// TODO: Privatize accessor methods
@OnClick(R.id.save) @OnClick(R.id.save)
void save() { void save() {
//mPresenter.save(); int hour;
Calendar calendar = new GregorianCalendar(); int minutes;
int hour = calendar.get(Calendar.HOUR_OF_DAY); try {
int minutes = calendar.get(Calendar.MINUTE); hour = getHour();
Alarm alarm = Alarm.builder().hour(hour).minutes((minutes + 1) % 60).build(); minutes = getMinutes();
DatabaseManager.getInstance(this).insertAlarm(alarm); } 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) @OnClick(R.id.delete)
void 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. // 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) @OnTouch(R.id.label)
boolean touchLabel(MotionEvent event) { boolean touchLabel(MotionEvent event) {
if (event.getActionMasked() == MotionEvent.ACTION_UP && mNumpad.getVisibility() == VISIBLE) { if (event.getActionMasked() == MotionEvent.ACTION_UP && mNumpad.getVisibility() == VISIBLE) {
mPresenter.hideNumpad(); showNumpad(false);
} }
return false; // don't capture return false; // don't capture
} }

View File

@ -11,6 +11,7 @@ package com.philliphsu.clock2.editalarm;
* That way, each concrete interface impl doesn't need to implement the * That way, each concrete interface impl doesn't need to implement the
* base interface methods again and again. * base interface methods again and again.
*/ */
@Deprecated
public interface EditAlarmContract { public interface EditAlarmContract {
interface View extends AlarmContract.View { interface View extends AlarmContract.View {

View File

@ -18,6 +18,7 @@ import static com.philliphsu.clock2.util.Preconditions.checkNotNull;
/** /**
* Created by Phillip Hsu on 6/3/2016. * Created by Phillip Hsu on 6/3/2016.
*/ */
@Deprecated
public class EditAlarmPresenter implements EditAlarmContract.Presenter { public class EditAlarmPresenter implements EditAlarmContract.Presenter {
private static final String TAG = "EditAlarmPresenter"; private static final String TAG = "EditAlarmPresenter";
@ -27,6 +28,7 @@ public class EditAlarmPresenter implements EditAlarmContract.Presenter {
@NonNull private final SharedPreferencesHelper mSharedPreferencesHelper; @NonNull private final SharedPreferencesHelper mSharedPreferencesHelper;
@Nullable private Alarm mAlarm; @Nullable private Alarm mAlarm;
@Deprecated
public EditAlarmPresenter(@NonNull EditAlarmContract.View view, public EditAlarmPresenter(@NonNull EditAlarmContract.View view,
@NonNull Repository<Alarm> repository, @NonNull Repository<Alarm> repository,
@NonNull AlarmUtilsHelper helper, @NonNull AlarmUtilsHelper helper,
@ -37,6 +39,7 @@ public class EditAlarmPresenter implements EditAlarmContract.Presenter {
mSharedPreferencesHelper = sharedPreferencesHelper; mSharedPreferencesHelper = sharedPreferencesHelper;
} }
@Deprecated
@Override @Override
public void loadAlarm(long alarmId) { public void loadAlarm(long alarmId) {
// Can't load alarm in ctor because showDetails() calls // Can't load alarm in ctor because showDetails() calls
@ -48,6 +51,7 @@ public class EditAlarmPresenter implements EditAlarmContract.Presenter {
showDetails(); showDetails();
} }
@Deprecated
@Override @Override
public void save() { public void save() {
int hour; int hour;
@ -89,6 +93,7 @@ public class EditAlarmPresenter implements EditAlarmContract.Presenter {
mView.showEditorClosed(); mView.showEditorClosed();
} }
@Deprecated
@Override @Override
public void delete() { public void delete() {
if (mAlarm != null) { if (mAlarm != null) {
@ -100,6 +105,7 @@ public class EditAlarmPresenter implements EditAlarmContract.Presenter {
mView.showEditorClosed(); mView.showEditorClosed();
} }
@Deprecated
@Override @Override
public void dismissNow() { public void dismissNow() {
mAlarmUtilsHelper.cancelAlarm(checkNotNull(mAlarm), true); mAlarmUtilsHelper.cancelAlarm(checkNotNull(mAlarm), true);
@ -107,6 +113,7 @@ public class EditAlarmPresenter implements EditAlarmContract.Presenter {
mView.showEnabled(mAlarm.isEnabled()); mView.showEnabled(mAlarm.isEnabled());
} }
@Deprecated
@Override @Override
public void stopSnoozing() { public void stopSnoozing() {
dismissNow(); // MUST be first, see AlarmUtils.notifyUpcomingAlarmIntent() dismissNow(); // MUST be first, see AlarmUtils.notifyUpcomingAlarmIntent()
@ -117,27 +124,32 @@ public class EditAlarmPresenter implements EditAlarmContract.Presenter {
*/ */
} }
@Deprecated
@Override @Override
public void showNumpad() { public void showNumpad() {
mView.showNumpad(true); mView.showNumpad(true);
} }
@Deprecated
@Override @Override
public void hideNumpad() { public void hideNumpad() {
mView.showNumpad(false); mView.showNumpad(false);
} }
@Deprecated
@Override @Override
public void onBackspace(String newStr) { public void onBackspace(String newStr) {
mView.showTimeTextPostBackspace(newStr); mView.showTimeTextPostBackspace(newStr);
} }
@Deprecated
@Override @Override
public void acceptNumpadChanges() { public void acceptNumpadChanges() {
mView.showNumpad(false); mView.showNumpad(false);
mView.showEnabled(true); mView.showEnabled(true);
} }
@Deprecated
@Override @Override
public void onPrepareOptionsMenu() { public void onPrepareOptionsMenu() {
if (mAlarm != null && mAlarm.isEnabled()) { if (mAlarm != null && mAlarm.isEnabled()) {
@ -153,26 +165,31 @@ public class EditAlarmPresenter implements EditAlarmContract.Presenter {
} }
} }
@Deprecated
@Override @Override
public void openRingtonePickerDialog() { public void openRingtonePickerDialog() {
mView.showRingtonePickerDialog(); mView.showRingtonePickerDialog();
} }
@Deprecated
@Override @Override
public void setTimeTextHint() { public void setTimeTextHint() {
mView.setTimeTextHint(); mView.setTimeTextHint();
} }
@Deprecated
@Override @Override
public void onNumberInput(String formattedInput) { public void onNumberInput(String formattedInput) {
mView.showTimeText(formattedInput); mView.showTimeText(formattedInput);
} }
@Deprecated
@Override @Override
public void focusTimeText() { public void focusTimeText() {
mView.showTimeTextFocused(true); mView.showTimeTextFocused(true);
} }
@Deprecated
private void showDetails() { private void showDetails() {
if (mAlarm != null) { if (mAlarm != null) {
mView.showTime(mAlarm.hour(), mAlarm.minutes()); mView.showTime(mAlarm.hour(), mAlarm.minutes());