New snooze dialog

pull/281/head
Alex Baker 9 years ago
parent 4f999bf5fc
commit 739b6df9f0

@ -109,7 +109,8 @@
<activity
android:name=".activities.DateAndTimePickerActivity"
android:theme="@style/Tasks.Dialog" />
android:theme="@style/Tasks.Dialog"
android:taskAffinity="" />
<activity
android:name=".activities.LocationPickerActivity"

@ -222,6 +222,7 @@ public class DatabaseDao<TYPE extends AbstractModel> {
if (result.get()) {
onModelUpdated(item);
item.markSaved();
log.debug("{} {}", op, item);
}
}
return result.get();
@ -247,6 +248,11 @@ public class DatabaseDao<TYPE extends AbstractModel> {
}
return result;
}
@Override
public String toString() {
return "INSERT";
}
};
return insertOrUpdateAndRecordChanges(item, insert);
}
@ -269,6 +275,11 @@ public class DatabaseDao<TYPE extends AbstractModel> {
return database.update(table.name, values,
AbstractModel.ID_PROPERTY.eq(item.getId()).toString()) > 0;
}
@Override
public String toString() {
return "UPDATE";
}
};
return insertOrUpdateAndRecordChanges(item, update);
}

@ -79,6 +79,7 @@ import org.slf4j.LoggerFactory;
import org.tasks.R;
import org.tasks.activities.DateAndTimePickerActivity;
import org.tasks.activities.LocationPickerActivity;
import org.tasks.activities.TimePickerActivity;
import org.tasks.injection.InjectingFragment;
import org.tasks.location.Geofence;
import org.tasks.location.GeofenceService;
@ -904,7 +905,7 @@ ViewPager.OnPageChangeListener, EditNoteActivity.UpdatesChangedListener {
}
if (requestCode == HideUntilControlSet.REQUEST_HIDE_UNTIL && resultCode == Activity.RESULT_OK) {
long timestamp = data.getLongExtra(DateAndTimePickerActivity.EXTRA_TIMESTAMP, 0L);
long timestamp = data.getLongExtra(TimePickerActivity.EXTRA_TIMESTAMP, 0L);
if (timestamp > 0) {
hideUntilControls.setCustomDate(timestamp);
} else {
@ -912,7 +913,7 @@ ViewPager.OnPageChangeListener, EditNoteActivity.UpdatesChangedListener {
}
return;
} else if (requestCode == ReminderControlSet.REQUEST_NEW_ALARM && resultCode == Activity.RESULT_OK) {
long timestamp = data.getLongExtra(DateAndTimePickerActivity.EXTRA_TIMESTAMP, 0L);
long timestamp = data.getLongExtra(TimePickerActivity.EXTRA_TIMESTAMP, 0L);
if (timestamp > 0) {
reminderControlSet.addAlarmRow(timestamp);
} else {

@ -1,117 +0,0 @@
package com.todoroo.astrid.reminders;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment;
import android.support.v7.app.AlertDialog;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.Spinner;
import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.repeats.RepeatControlSet;
import com.todoroo.astrid.ui.NumberPicker;
import org.tasks.R;
import butterknife.ButterKnife;
import butterknife.InjectView;
public class SnoozeDialog extends DialogFragment {
@InjectView(R.id.snoozePicker) LinearLayout snoozePicker;
@InjectView(R.id.numberPicker) NumberPicker snoozeValue;
@InjectView(R.id.numberUnits) Spinner snoozeUnits;
private SnoozeCallback snoozeCallback;
private DialogInterface.OnDismissListener onDismissListener;
private String title;
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
LayoutInflater mInflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View layout = mInflater.inflate(R.layout.snooze_dialog, null);
ButterKnife.inject(this, layout);
snoozeValue.setIncrementBy(1);
snoozeValue.setRange(1, 99);
snoozeUnits.setSelection(RepeatControlSet.INTERVAL_HOURS);
snoozeUnits.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
AndroidUtilities.hideSoftInputForViews(getActivity(), snoozePicker);
return false;
}
});
return new AlertDialog.Builder(getActivity(), R.style.Tasks_Dialog)
.setTitle(title)
.setView(layout)
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
long time = DateUtilities.now();
int value = snoozeValue.getCurrent();
switch (snoozeUnits.getSelectedItemPosition()) {
case RepeatControlSet.INTERVAL_DAYS:
time += value * DateUtilities.ONE_DAY;
break;
case RepeatControlSet.INTERVAL_HOURS:
time += value * DateUtilities.ONE_HOUR;
break;
case RepeatControlSet.INTERVAL_MINUTES:
time += value * DateUtilities.ONE_MINUTE;
break;
case RepeatControlSet.INTERVAL_WEEKS:
time += value * 7 * DateUtilities.ONE_DAY;
break;
case RepeatControlSet.INTERVAL_MONTHS:
time = DateUtilities.addCalendarMonthsToUnixtime(time, 1);
break;
case RepeatControlSet.INTERVAL_YEARS:
time = DateUtilities.addCalendarMonthsToUnixtime(time, 12);
break;
}
snoozeCallback.snoozeForTime(time);
}
})
.setOnDismissListener(this)
.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
})
.show();
}
@Override
public void onDismiss(DialogInterface dialog) {
super.onDismiss(dialog);
if (onDismissListener != null) {
onDismissListener.onDismiss(dialog);
}
}
public void setSnoozeCallback(SnoozeCallback snoozeCallback) {
this.snoozeCallback = snoozeCallback;
}
public void setOnDismissListener(DialogInterface.OnDismissListener onDismissListener) {
this.onDismissListener = onDismissListener;
}
public void setTitle(String title) {
this.title = title;
}
}

@ -27,7 +27,6 @@ import com.google.ical.values.Weekday;
import com.google.ical.values.WeekdayNum;
import com.todoroo.andlib.utility.DialogUtilities;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.ui.DateAndTimeDialog;
import com.todoroo.astrid.ui.DateAndTimeDialog.DateAndTimeDialogListener;
import com.todoroo.astrid.ui.DateAndTimePicker;

@ -1,6 +1,5 @@
package org.tasks.activities;
import android.app.Activity;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
@ -14,13 +13,12 @@ import org.tasks.dialogs.MyDatePickerDialog;
import static org.tasks.date.DateTimeUtils.currentTimeMillis;
public class DateAndTimePickerActivity extends FragmentActivity implements DatePickerDialog.OnDateSetListener, DialogInterface.OnDismissListener {
public class DateAndTimePickerActivity extends FragmentActivity implements DatePickerDialog.OnDateSetListener, DialogInterface.OnCancelListener {
private static final String FRAG_TAG_DATE_PICKER = "frag_tag_date_picker";
private static final int REQUEST_PICK_TIME = 12345;
public static final String EXTRA_TIMESTAMP = "extra_timestamp";
private static final String EXTRA_DATE_SELECTED = "extra_date_selected";
public static final String EXTRA_TIMESTAMP = "extra_timestamp";
private DateTime initial;
private boolean dateSelected;
@ -45,7 +43,7 @@ public class DateAndTimePickerActivity extends FragmentActivity implements DateP
datePickerDialog.initialize(null, initial.getYear(), initial.getMonthOfYear() - 1, initial.getDayOfMonth(), false);
datePickerDialog.show(supportFragmentManager, FRAG_TAG_DATE_PICKER);
}
datePickerDialog.setOnDismissListener(this);
datePickerDialog.setOnCancelListener(this);
datePickerDialog.setOnDateSetListener(this);
}
@ -58,32 +56,17 @@ public class DateAndTimePickerActivity extends FragmentActivity implements DateP
@Override
public void onDateSet(DatePickerDialog datePickerDialog, int year, int month, int day) {
dateSelected = true;
datePickerDialog.dismiss();
final long timestamp = initial.withYear(year).withMonthOfYear(month + 1).withDayOfMonth(day).getMillis();
startActivityForResult(new Intent(this, TimePickerActivity.class) {{
datePickerDialog.dismiss();
startActivity(new Intent(this, TimePickerActivity.class) {{
addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
putExtra(TimePickerActivity.EXTRA_TIMESTAMP, timestamp);
}}, REQUEST_PICK_TIME);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, final Intent data) {
if (requestCode == REQUEST_PICK_TIME) {
if (resultCode == Activity.RESULT_OK) {
setResult(RESULT_OK, new Intent() {{
putExtra(EXTRA_TIMESTAMP, data.getLongExtra(TimePickerActivity.EXTRA_TIMESTAMP, 0L));
}});
} else {
setResult(RESULT_CANCELED);
}
finish();
} else {
super.onActivityResult(requestCode, resultCode, data);
}
}});
finish();
}
@Override
public void onDismiss(DialogInterface dialog) {
setResult(RESULT_CANCELED);
finish();
public void onCancel(DialogInterface dialog) {
finishAffinity();
}
}

@ -6,9 +6,9 @@ import com.fourmob.datetimepicker.date.DatePickerDialog;
public class MyDatePickerDialog extends DatePickerDialog {
private DialogInterface.OnDismissListener listener;
private DialogInterface.OnCancelListener listener;
public void setOnDismissListener(DialogInterface.OnDismissListener listener) {
public void setOnCancelListener(DialogInterface.OnCancelListener listener) {
this.listener = listener;
}
@ -17,7 +17,7 @@ public class MyDatePickerDialog extends DatePickerDialog {
super.onCancel(dialog);
if (listener != null) {
listener.onDismiss(dialog);
listener.onCancel(dialog);
}
}
}

@ -20,13 +20,4 @@ public class MyTimePickerDialog extends TimePickerDialog {
listener.onDismiss(dialog);
}
}
@Override
public void onCancel(DialogInterface dialog) {
super.onCancel(dialog);
if (listener != null) {
listener.onDismiss(dialog);
}
}
}

@ -5,6 +5,7 @@ import android.support.v4.app.FragmentActivity;
import org.tasks.dialogs.LocationPickerDialog;
import org.tasks.reminders.NotificationDialog;
import org.tasks.reminders.SnoozeDialog;
import dagger.Module;
import dagger.Provides;
@ -12,7 +13,8 @@ import dagger.Provides;
@Module(addsTo = TasksModule.class,
injects = {
LocationPickerDialog.class,
NotificationDialog.class
NotificationDialog.class,
SnoozeDialog.class
},
library = true)
public class DialogFragmentModule {

@ -1,23 +1,22 @@
package org.tasks.reminders;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.FragmentManager;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.reminders.SnoozeCallback;
import com.todoroo.astrid.reminders.SnoozeDialog;
import com.todoroo.astrid.service.StartupService;
import com.todoroo.astrid.service.TaskService;
import org.tasks.R;
import org.tasks.injection.InjectingAppCompatActivity;
import org.tasks.activities.TimePickerActivity;
import org.tasks.injection.InjectingFragmentActivity;
import org.tasks.notifications.NotificationManager;
import javax.inject.Inject;
public class SnoozeActivity extends InjectingFragmentActivity implements SnoozeCallback, DialogInterface.OnDismissListener {
public class SnoozeActivity extends InjectingFragmentActivity implements SnoozeCallback, DialogInterface.OnCancelListener {
private static final String FRAG_TAG_SNOOZE_DIALOG = "frag_tag_snooze_dialog";
@ -42,25 +41,37 @@ public class SnoozeActivity extends InjectingFragmentActivity implements SnoozeC
fragmentByTag.show(supportFragmentManager, FRAG_TAG_SNOOZE_DIALOG);
}
taskId = getIntent().getLongExtra(EXTRA_TASK_ID, 0L);
fragmentByTag.setOnDismissListener(this);
fragmentByTag.setTitle(getString(R.string.rmd_NoA_snooze));
fragmentByTag.setOnCancelListener(this);
fragmentByTag.setSnoozeCallback(this);
}
@Override
public void snoozeForTime(long time) {
setResult(RESULT_OK);
Task task = new Task();
task.setId(taskId);
task.setReminderSnooze(time);
taskService.save(task);
notificationManager.cancel(taskId);
setResult(RESULT_OK);
finish();
}
@Override
public void onDismiss(DialogInterface dialog) {
setResult(RESULT_CANCELED);
public void onCancel(DialogInterface dialog) {
finish();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == SnoozeDialog.REQUEST_DATE_TIME) {
if (resultCode == RESULT_OK && data != null) {
snoozeForTime(data.getLongExtra(TimePickerActivity.EXTRA_TIMESTAMP, 0L));
} else {
finish();
}
overridePendingTransition(0, 0);
} else {
super.onActivityResult(requestCode, resultCode, data);
}
}
}

@ -0,0 +1,126 @@
package org.tasks.reminders;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AlertDialog;
import android.widget.ArrayAdapter;
import com.todoroo.astrid.reminders.SnoozeCallback;
import org.joda.time.DateTime;
import org.tasks.R;
import org.tasks.activities.DateAndTimePickerActivity;
import org.tasks.injection.ForApplication;
import org.tasks.injection.InjectingDialogFragment;
import org.tasks.preferences.Preferences;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import javax.inject.Inject;
import static com.todoroo.andlib.utility.DateUtilities.getTimeString;
public class SnoozeDialog extends InjectingDialogFragment {
public static final int REQUEST_DATE_TIME = 10101;
@Inject Preferences preferences;
@Inject @ForApplication Context context;
private DateTime now = new DateTime();
private SnoozeCallback snoozeCallback;
private DialogInterface.OnCancelListener onCancelListener;
private List<Long> snoozeTimes = new ArrayList<>();
private ArrayAdapter<String> adapter;
private DateTime getDateTimeShortcut(int resId, long def) {
return now.withMillisOfDay(preferences.getInt(getString(resId), (int) def));
}
private void add(int resId, DateTime dateTime) {
adapter.add(getString(resId, getTimeString(context, dateTime.toDate())));
snoozeTimes.add(dateTime.getMillis());
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
adapter = new ArrayAdapter<>(getActivity(), android.R.layout.simple_list_item_1);
DateTime morning = getDateTimeShortcut(R.string.p_date_shortcut_morning, TimeUnit.HOURS.toMillis(9));
DateTime afternoon = getDateTimeShortcut(R.string.p_date_shortcut_afternoon, TimeUnit.HOURS.toMillis(13));
DateTime evening = getDateTimeShortcut(R.string.p_date_shortcut_evening, TimeUnit.HOURS.toMillis(17));
DateTime night = getDateTimeShortcut(R.string.p_date_shortcut_night, TimeUnit.HOURS.toMillis(20));
DateTime tomorrowMorning = morning.plusDays(1);
DateTime tomorrowAfternoon = afternoon.plusDays(1);
adapter.add(getString(R.string.date_shortcut_hour));
snoozeTimes.add(0L);
DateTime hourCutoff = new DateTime().plusMinutes(75);
if (morning.isAfter(hourCutoff)) {
add(R.string.date_shortcut_morning, morning);
add(R.string.date_shortcut_afternoon, afternoon);
} else if (afternoon.isAfter(hourCutoff)) {
add(R.string.date_shortcut_afternoon, afternoon);
add(R.string.date_shortcut_evening, evening);
} else if (evening.isAfter(hourCutoff)) {
add(R.string.date_shortcut_evening, evening);
add(R.string.date_shortcut_night, night);
} else if (night.isAfter(hourCutoff)) {
add(R.string.date_shortcut_night, night);
add(R.string.date_shortcut_tomorrow_morning, tomorrowMorning);
} else {
add(R.string.date_shortcut_tomorrow_morning, tomorrowMorning);
add(R.string.date_shortcut_tomorrow_afternoon, tomorrowAfternoon);
}
adapter.add(getString(R.string.pick_a_date_and_time));
return new AlertDialog.Builder(getActivity(), R.style.Tasks_Dialog)
.setTitle(R.string.rmd_NoA_snooze)
.setAdapter(adapter, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case 0:
snoozeCallback.snoozeForTime(new DateTime().plusHours(1).getMillis());
break;
case 1:
case 2:
snoozeCallback.snoozeForTime(snoozeTimes.get(which));
break;
case 3:
dialog.dismiss();
getActivity().startActivityForResult(new Intent(context, DateAndTimePickerActivity.class) {{
putExtra(DateAndTimePickerActivity.EXTRA_TIMESTAMP, new DateTime().plusMinutes(30).getMillis());
}}, REQUEST_DATE_TIME);
break;
}
}
})
.show();
}
@Override
public void onCancel(DialogInterface dialog) {
super.onCancel(dialog);
if (onCancelListener != null) {
onCancelListener.onCancel(dialog);
}
}
public void setSnoozeCallback(SnoozeCallback snoozeCallback) {
this.snoozeCallback = snoozeCallback;
}
public void setOnCancelListener(DialogInterface.OnCancelListener onCancelListener) {
this.onCancelListener = onCancelListener;
}
}

@ -1,49 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
**
** Copyright 2007, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
** http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/
-->
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="16dp">
<TimePicker android:id="@+id/timePicker"
android:visibility="gone"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
<LinearLayout android:id="@+id/snoozePicker"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<com.todoroo.astrid.ui.NumberPicker android:id="@+id/numberPicker"
android:layout_weight="1"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<Spinner android:id="@+id/numberUnits"
android:layout_weight="1"
android:layout_gravity="center_vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:entries="@array/repeat_interval"/>
</LinearLayout>
</FrameLayout>

@ -10,6 +10,11 @@
<string name="gapi_key">AIzaSyBXGYNWNQcfse4JS5gI9teTSKMzinWzL2M</string>
<string name="p_date_shortcut_morning">date_shortcut_morning</string>
<string name="p_date_shortcut_afternoon">date_shortcut_afternoon</string>
<string name="p_date_shortcut_evening">date_shortcut_evening</string>
<string name="p_date_shortcut_night">date_shortcut_night</string>
<!-- ======================================================== REMINDERS == -->
<string name="p_attachment_dir">custom_files_dir</string>

@ -105,6 +105,13 @@
<string name="geolocation_reminders">Geolocation Reminders</string>
<string name="tags">Tags</string>
<string name="filters">Filters</string>
<string name="date_shortcut_hour">For an hour</string>
<string name="date_shortcut_morning">Morning (%s)</string>
<string name="date_shortcut_afternoon">Afternoon (%s)</string>
<string name="date_shortcut_evening">Evening (%s)</string>
<string name="date_shortcut_night">Night (%s)</string>
<string name="date_shortcut_tomorrow_morning">Tomorrow morning (%s)</string>
<string name="date_shortcut_tomorrow_afternoon">Tomorrow afternoon (%s)</string>
<string-array name="sync_SPr_interval_entries">
<!-- sync_SPr_interval_entries: Synchronization Intervals -->

Loading…
Cancel
Save