From 4e294d89d85a2e65f6a3615927ca772b2cabcadc Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 7 Jul 2016 00:19:07 +0200 Subject: [PATCH] implement event reminders --- app/src/main/AndroidManifest.xml | 2 + .../calendar/CalendarImpl.java | 4 +- .../simplemobiletools/calendar/DBHelper.java | 65 ++++++++++---- .../calendar/NotificationPublisher.java | 49 ++++++++++ .../calendar/activities/DayActivity.java | 4 +- .../calendar/activities/EventActivity.java | 84 +++++++++++++++++- .../calendar/activities/MainActivity.java | 6 +- .../calendar/models/Event.java | 20 ++++- app/src/main/res/layout/activity_event.xml | 12 +++ app/src/main/res/mipmap-hdpi/calendar.png | Bin 0 -> 698 bytes app/src/main/res/mipmap-mdpi/calendar.png | Bin 0 -> 479 bytes app/src/main/res/mipmap-xhdpi/calendar.png | Bin 0 -> 782 bytes app/src/main/res/mipmap-xxhdpi/calendar.png | Bin 0 -> 1280 bytes app/src/main/res/mipmap-xxxhdpi/calendar.png | Bin 0 -> 1525 bytes app/src/main/res/values/array.xml | 3 +- app/src/main/res/values/strings.xml | 3 +- app/src/main/res/values/styles.xml | 2 + 17 files changed, 221 insertions(+), 33 deletions(-) create mode 100644 app/src/main/java/com/simplemobiletools/calendar/NotificationPublisher.java create mode 100644 app/src/main/res/mipmap-hdpi/calendar.png create mode 100644 app/src/main/res/mipmap-mdpi/calendar.png create mode 100644 app/src/main/res/mipmap-xhdpi/calendar.png create mode 100644 app/src/main/res/mipmap-xxhdpi/calendar.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/calendar.png diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4f40844bf..bdc5c011c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -60,6 +60,8 @@ android:resource="@xml/widget_info"/> + + diff --git a/app/src/main/java/com/simplemobiletools/calendar/CalendarImpl.java b/app/src/main/java/com/simplemobiletools/calendar/CalendarImpl.java index 20422dc36..889c59813 100644 --- a/app/src/main/java/com/simplemobiletools/calendar/CalendarImpl.java +++ b/app/src/main/java/com/simplemobiletools/calendar/CalendarImpl.java @@ -107,12 +107,12 @@ public class CalendarImpl implements DBHelper.DBOperationsListener { } @Override - public void eventInserted() { + public void eventInserted(Event event) { } @Override - public void eventUpdated() { + public void eventUpdated(Event event) { } diff --git a/app/src/main/java/com/simplemobiletools/calendar/DBHelper.java b/app/src/main/java/com/simplemobiletools/calendar/DBHelper.java index ff819e58d..2c6964be0 100644 --- a/app/src/main/java/com/simplemobiletools/calendar/DBHelper.java +++ b/app/src/main/java/com/simplemobiletools/calendar/DBHelper.java @@ -16,7 +16,7 @@ public class DBHelper extends SQLiteOpenHelper { private static DBOperationsListener mCallback; private static final String DB_NAME = "events.db"; - private static final int DB_VERSION = 1; + private static final int DB_VERSION = 2; private static final String TABLE_NAME = "events"; private static final String COL_ID = "id"; @@ -24,6 +24,7 @@ public class DBHelper extends SQLiteOpenHelper { private static final String COL_END_TS = "end_ts"; private static final String COL_TITLE = "title"; private static final String COL_DESCRIPTION = "description"; + private static final String COL_REMINDER_MINUTES = "reminder_minutes"; public static DBHelper newInstance(Context context, DBOperationsListener callback) { mCallback = callback; @@ -42,19 +43,25 @@ public class DBHelper extends SQLiteOpenHelper { COL_START_TS + " INTEGER," + COL_END_TS + " INTEGER," + COL_TITLE + " TEXT," + - COL_DESCRIPTION + " TEXT" + + COL_DESCRIPTION + " TEXT," + + COL_REMINDER_MINUTES + " INTEGER" + ")"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { - + if (oldVersion == 1) { + db.execSQL("ALTER TABLE " + TABLE_NAME + " ADD COLUMN " + COL_REMINDER_MINUTES + " INTEGER DEFAULT -1"); + } } public void insert(Event event) { final ContentValues values = fillContentValues(event); - mDb.insert(TABLE_NAME, null, values); - mCallback.eventInserted(); + long id = mDb.insert(TABLE_NAME, null, values); + event.setId((int) id); + + if (mCallback != null) + mCallback.eventInserted(event); } public void update(Event event) { @@ -62,7 +69,9 @@ public class DBHelper extends SQLiteOpenHelper { final String selection = COL_ID + " = ?"; final String[] selectionArgs = {String.valueOf(event.getId())}; mDb.update(TABLE_NAME, values, selection, selectionArgs); - mCallback.eventUpdated(); + + if (mCallback != null) + mCallback.eventUpdated(event); } private ContentValues fillContentValues(Event event) { @@ -71,24 +80,20 @@ public class DBHelper extends SQLiteOpenHelper { values.put(COL_END_TS, event.getEndTS()); values.put(COL_TITLE, event.getTitle()); values.put(COL_DESCRIPTION, event.getDescription()); + values.put(COL_REMINDER_MINUTES, event.getReminderMinutes()); return values; } - public void deleteEvent(int id) { - final String selection = COL_ID + " = ?"; - final String[] selectionArgs = {String.valueOf(id)}; - mDb.delete(TABLE_NAME, selection, selectionArgs); - mCallback.eventsDeleted(1); - } - public void deleteEvents(String[] ids) { final String selection = COL_ID + " IN (?)"; mDb.delete(TABLE_NAME, selection, ids); - mCallback.eventsDeleted(ids.length); + + if (mCallback != null) + mCallback.eventsDeleted(ids.length); } public void getEvents(int fromTS, int toTS) { - final String[] projection = {COL_ID, COL_START_TS, COL_END_TS, COL_TITLE, COL_DESCRIPTION}; + final String[] projection = {COL_ID, COL_START_TS, COL_END_TS, COL_TITLE, COL_DESCRIPTION, COL_REMINDER_MINUTES}; List events = new ArrayList<>(); final String selection = COL_START_TS + " <= ? AND " + COL_END_TS + " >= ?"; final String[] selectionArgs = {String.valueOf(toTS), String.valueOf(fromTS)}; @@ -101,18 +106,40 @@ public class DBHelper extends SQLiteOpenHelper { final int endTS = cursor.getInt(cursor.getColumnIndex(COL_END_TS)); final String title = cursor.getString(cursor.getColumnIndex(COL_TITLE)); final String description = cursor.getString(cursor.getColumnIndex(COL_DESCRIPTION)); - events.add(new Event(id, startTS, endTS, title, description)); + final int reminderMinutes = cursor.getInt(cursor.getColumnIndex(COL_REMINDER_MINUTES)); + events.add(new Event(id, startTS, endTS, title, description, reminderMinutes)); } while (cursor.moveToNext()); } cursor.close(); } - mCallback.gotEvents(events); + + if (mCallback != null) + mCallback.gotEvents(events); + } + + public Event getEvent(int id) { + final String[] projection = {COL_START_TS, COL_END_TS, COL_TITLE, COL_DESCRIPTION, COL_REMINDER_MINUTES}; + final String selection = COL_ID + " = ?"; + final String[] selectionArgs = {String.valueOf(id)}; + final Cursor cursor = mDb.query(TABLE_NAME, projection, selection, selectionArgs, null, null, null); + if (cursor != null) { + if (cursor.moveToFirst()) { + final int startTS = cursor.getInt(cursor.getColumnIndex(COL_START_TS)); + final int endTS = cursor.getInt(cursor.getColumnIndex(COL_END_TS)); + final String title = cursor.getString(cursor.getColumnIndex(COL_TITLE)); + final String description = cursor.getString(cursor.getColumnIndex(COL_DESCRIPTION)); + final int reminderMinutes = cursor.getInt(cursor.getColumnIndex(COL_REMINDER_MINUTES)); + cursor.close(); + return new Event(id, startTS, endTS, title, description, reminderMinutes); + } + } + return null; } public interface DBOperationsListener { - void eventInserted(); + void eventInserted(Event event); - void eventUpdated(); + void eventUpdated(Event event); void eventsDeleted(int cnt); diff --git a/app/src/main/java/com/simplemobiletools/calendar/NotificationPublisher.java b/app/src/main/java/com/simplemobiletools/calendar/NotificationPublisher.java new file mode 100644 index 000000000..5478a3f3a --- /dev/null +++ b/app/src/main/java/com/simplemobiletools/calendar/NotificationPublisher.java @@ -0,0 +1,49 @@ +package com.simplemobiletools.calendar; + +import android.app.Notification; +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; + +import com.simplemobiletools.calendar.activities.EventActivity; +import com.simplemobiletools.calendar.models.Event; + +public class NotificationPublisher extends BroadcastReceiver { + public static String EVENT_ID = "event_id"; + + public void onReceive(Context context, Intent intent) { + final NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); + int id = intent.getIntExtra(EVENT_ID, -1); + if (id == -1) + return; + + final Event event = DBHelper.newInstance(context, null).getEvent(id); + if (event == null || event.getReminderMinutes() == -1) + return; + + final PendingIntent pendingIntent = getPendingIntent(context, event); + final String startTime = Formatter.getTime(event.getStartTS()); + final String endTime = Formatter.getTime(event.getEndTS()); + final String title = event.getTitle(); + final Notification notification = getNotification(context, pendingIntent, startTime + " - " + endTime + " " + title); + notificationManager.notify(id, notification); + } + + private PendingIntent getPendingIntent(Context context, Event event) { + final Intent intent = new Intent(context, EventActivity.class); + intent.putExtra(Constants.EVENT, event); + return PendingIntent.getActivity(context, 0, intent, 0); + } + + private Notification getNotification(Context context, PendingIntent pendingIntent, String content) { + final Notification.Builder builder = new Notification.Builder(context); + builder.setContentTitle(context.getResources().getString(R.string.app_name)); + builder.setContentText(content); + builder.setSmallIcon(R.mipmap.calendar); + builder.setContentIntent(pendingIntent); + builder.setAutoCancel(true); + return builder.build(); + } +} diff --git a/app/src/main/java/com/simplemobiletools/calendar/activities/DayActivity.java b/app/src/main/java/com/simplemobiletools/calendar/activities/DayActivity.java index 114628f11..ecbdc0f5f 100644 --- a/app/src/main/java/com/simplemobiletools/calendar/activities/DayActivity.java +++ b/app/src/main/java/com/simplemobiletools/calendar/activities/DayActivity.java @@ -189,12 +189,12 @@ public class DayActivity extends AppCompatActivity } @Override - public void eventInserted() { + public void eventInserted(Event event) { } @Override - public void eventUpdated() { + public void eventUpdated(Event event) { } diff --git a/app/src/main/java/com/simplemobiletools/calendar/activities/EventActivity.java b/app/src/main/java/com/simplemobiletools/calendar/activities/EventActivity.java index c969a9a8d..21401e610 100644 --- a/app/src/main/java/com/simplemobiletools/calendar/activities/EventActivity.java +++ b/app/src/main/java/com/simplemobiletools/calendar/activities/EventActivity.java @@ -1,15 +1,20 @@ package com.simplemobiletools.calendar.activities; +import android.app.AlarmManager; import android.app.DatePickerDialog; +import android.app.PendingIntent; import android.app.TimePickerDialog; +import android.content.Context; import android.content.Intent; import android.os.Bundle; +import android.os.SystemClock; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.AppCompatSpinner; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.WindowManager; +import android.view.inputmethod.InputMethodManager; import android.widget.DatePicker; import android.widget.EditText; import android.widget.TextView; @@ -18,6 +23,7 @@ import android.widget.TimePicker; import com.simplemobiletools.calendar.Constants; import com.simplemobiletools.calendar.DBHelper; import com.simplemobiletools.calendar.Formatter; +import com.simplemobiletools.calendar.NotificationPublisher; import com.simplemobiletools.calendar.R; import com.simplemobiletools.calendar.Utils; import com.simplemobiletools.calendar.models.Event; @@ -39,11 +45,13 @@ public class EventActivity extends AppCompatActivity implements DBHelper.DBOpera @BindView(R.id.event_end_time) TextView mEndTime; @BindView(R.id.event_title) EditText mTitleET; @BindView(R.id.event_description) EditText mDescriptionET; + @BindView(R.id.event_reminder_other) EditText mReminderOtherET; @BindView(R.id.event_reminder) AppCompatSpinner mReminder; private static DateTime mEventStartDateTime; private static DateTime mEventEndDateTime; private static Event mEvent; + private static boolean mWasReminderInit; @Override protected void onCreate(Bundle savedInstanceState) { @@ -55,6 +63,7 @@ public class EventActivity extends AppCompatActivity implements DBHelper.DBOpera if (intent == null) return; + mWasReminderInit = false; final Event event = (Event) intent.getSerializableExtra(Constants.EVENT); if (event != null) { mEvent = event; @@ -72,6 +81,7 @@ public class EventActivity extends AppCompatActivity implements DBHelper.DBOpera updateStartTime(); updateEndDate(); updateEndTime(); + setupReminder(); } private void setupEditEvent() { @@ -93,9 +103,42 @@ public class EventActivity extends AppCompatActivity implements DBHelper.DBOpera getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN); } + private void showKeyboard(EditText et) { + InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); + imm.showSoftInput(et, InputMethodManager.SHOW_IMPLICIT); + } + + private void setupReminder() { + switch (mEvent.getReminderMinutes()) { + case -1: + mReminder.setSelection(0); + break; + case 0: + mReminder.setSelection(1); + break; + default: + mReminder.setSelection(2); + mReminderOtherET.setVisibility(View.VISIBLE); + mReminderOtherET.setText(String.valueOf(mEvent.getReminderMinutes())); + break; + } + } + @OnItemSelected(R.id.event_reminder) public void handleReminder() { + if (!mWasReminderInit) { + mWasReminderInit = true; + return; + } + if (mReminder.getSelectedItemPosition() == mReminder.getCount() - 1) { + mReminderOtherET.setVisibility(View.VISIBLE); + mReminderOtherET.requestFocus(); + showKeyboard(mReminderOtherET); + } else { + mReminderOtherET.setVisibility(View.GONE); + hideKeyboard(); + } } @Override @@ -147,10 +190,12 @@ public class EventActivity extends AppCompatActivity implements DBHelper.DBOpera final DBHelper dbHelper = DBHelper.newInstance(getApplicationContext(), this); final String description = mDescriptionET.getText().toString().trim(); + final int reminderMinutes = getReminderMinutes(); mEvent.setStartTS(startTS); mEvent.setEndTS(endTS); mEvent.setTitle(title); mEvent.setDescription(description); + mEvent.setReminderMinutes(reminderMinutes); if (mEvent.getId() == 0) { dbHelper.insert(mEvent); } else { @@ -158,6 +203,21 @@ public class EventActivity extends AppCompatActivity implements DBHelper.DBOpera } } + private int getReminderMinutes() { + switch (mReminder.getSelectedItemPosition()) { + case 0: + return -1; + case 1: + return 0; + default: + final String value = mReminderOtherET.getText().toString().trim(); + if (value.isEmpty()) + return 0; + + return Integer.valueOf(value); + } + } + private void updateStartDate() { mStartDate.setText(Formatter.getEventDate(mEventStartDateTime)); } @@ -245,14 +305,34 @@ public class EventActivity extends AppCompatActivity implements DBHelper.DBOpera } } + private void handleNotification(Event event) { + if (event.getReminderMinutes() == -1) { + return; + } + + final long delayFromNow = (long) event.getStartTS() * 1000 - event.getReminderMinutes() * 60000 - System.currentTimeMillis(); + if (delayFromNow < 0) { + return; + } + + final long notifInMs = SystemClock.elapsedRealtime() + delayFromNow; + final Intent intent = new Intent(this, NotificationPublisher.class); + intent.putExtra(NotificationPublisher.EVENT_ID, event.getId()); + final PendingIntent pendingIntent = PendingIntent.getBroadcast(this, event.getId(), intent, PendingIntent.FLAG_UPDATE_CURRENT); + final AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); + alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, notifInMs, pendingIntent); + } + @Override - public void eventInserted() { + public void eventInserted(Event event) { + handleNotification(event); Utils.showToast(getApplicationContext(), R.string.event_added); finish(); } @Override - public void eventUpdated() { + public void eventUpdated(Event event) { + handleNotification(event); Utils.showToast(getApplicationContext(), R.string.event_updated); finish(); } diff --git a/app/src/main/java/com/simplemobiletools/calendar/activities/MainActivity.java b/app/src/main/java/com/simplemobiletools/calendar/activities/MainActivity.java index 36db9568c..cdeeb9228 100644 --- a/app/src/main/java/com/simplemobiletools/calendar/activities/MainActivity.java +++ b/app/src/main/java/com/simplemobiletools/calendar/activities/MainActivity.java @@ -213,8 +213,10 @@ public class MainActivity extends AppCompatActivity implements Calendar { private void setupLabels() { for (int i = 0; i < 7; i++) { final TextView dayTV = (TextView) findViewById(mRes.getIdentifier("label_" + i, "id", mPackageName)); - dayTV.setTextSize(mDayTextSize); - dayTV.setTextColor(mWeakTextColor); + if (dayTV != null) { + dayTV.setTextSize(mDayTextSize); + dayTV.setTextColor(mWeakTextColor); + } } } } diff --git a/app/src/main/java/com/simplemobiletools/calendar/models/Event.java b/app/src/main/java/com/simplemobiletools/calendar/models/Event.java index e326501de..4d0dd344a 100644 --- a/app/src/main/java/com/simplemobiletools/calendar/models/Event.java +++ b/app/src/main/java/com/simplemobiletools/calendar/models/Event.java @@ -4,11 +4,12 @@ import java.io.Serializable; public class Event implements Serializable { private static final long serialVersionUID = -32456795132354616L; - private final int mId; + private int mId; private int mStartTS; private int mEndTS; private String mTitle; private String mDescription; + private int mReminderMinutes; public Event() { mId = 0; @@ -16,20 +17,26 @@ public class Event implements Serializable { mEndTS = 0; mTitle = ""; mDescription = ""; + mReminderMinutes = -1; } - public Event(int id, int startTS, int endTS, String title, String description) { + public Event(int id, int startTS, int endTS, String title, String description, int reminerMinutes) { mId = id; mStartTS = startTS; mEndTS = endTS; mTitle = title; mDescription = description; + mReminderMinutes = reminerMinutes; } public int getId() { return mId; } + public void setId(int id) { + mId = id; + } + public int getStartTS() { return mStartTS; } @@ -62,6 +69,14 @@ public class Event implements Serializable { mDescription = description; } + public int getReminderMinutes() { + return mReminderMinutes; + } + + public void setReminderMinutes(int reminderMinutes) { + mReminderMinutes = reminderMinutes; + } + @Override public String toString() { return "Event {" + @@ -70,6 +85,7 @@ public class Event implements Serializable { ", endTS=" + getEndTS() + ", title=" + getTitle() + ", description=" + getDescription() + + ", reminderMinutes=" + getReminderMinutes() + "}"; } } diff --git a/app/src/main/res/layout/activity_event.xml b/app/src/main/res/layout/activity_event.xml index ff78f1898..aee71c1b4 100644 --- a/app/src/main/res/layout/activity_event.xml +++ b/app/src/main/res/layout/activity_event.xml @@ -121,5 +121,17 @@ android:entries="@array/reminders" android:padding="@dimen/activity_margin"/> + + diff --git a/app/src/main/res/mipmap-hdpi/calendar.png b/app/src/main/res/mipmap-hdpi/calendar.png new file mode 100644 index 0000000000000000000000000000000000000000..fd7bdc0a5b87fa9c8b2e04fd9b7bbb6cd337b5b5 GIT binary patch literal 698 zcmV;r0!96aP)8_;F z0?xdo2L*PfCB2b!Us9uJ&RU74Ixr55k&b2^*bZ!Uk%(c$akdoLsU%3jSI9N96sNMC zKWZh_fqTFv&=HgF6Dm0>8T4E3PD3cLr_C@Em;geE~L2?Z?y*MQ{#h%w*<&@K|R3bdS{X2i%Z zGy4wU&bA#9PTS1BInD@w7up^=z)!MbS{R`orhp57oct0LOu^r5^N;8rdWCSxQg`cu2Mc$!)pL gctQHLJH+O|Z<<_*B5k}aRsaA107*qoM6N<$f}9{LLjV8( literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-mdpi/calendar.png b/app/src/main/res/mipmap-mdpi/calendar.png new file mode 100644 index 0000000000000000000000000000000000000000..4ddb16ee0fad044f5713e7cebf69dbcc004b9cb5 GIT binary patch literal 479 zcmV<50U-W~P)4)VqpQK@i6AU(L+!4nBj? zE{K;^6T!rH5CdPpNWsuY&{%u|Bf(h2OSY+riJ&MexWeKMbp^!*!7`XWOmpmE866b; z;85NFQ>UuCtNQRal$oQ<9Q-baCd3BL&)^pt{4OrelVAnI1|QGh%QLuu%pBrA_7#2< z@9?_vO&n`*ID!v&Rpxgh;_~#%$rJ?n@Trhh-ds2XqJ#sXpvajKPI3%7Bg zVqYWTS!RxL(4>=KHzJ;9<`VW-{@?HxCtC@awA%xveen<{uv*5Q9%CJAcvSIC9IpfR z6Lg9_SX6dkTFakm+A8v1!RJzc2QP503i!U*?ZP|l6#E93D*myVrQGCezq-m^tmVwS z+RaD3m+QD$p(hb>HZ#|7%e0H0N5tvOTrIrQ7S7Z$`$sg!A=BFI7Q2GOm0wi6_FwAn z=#SoH_+;|i?pC;2>=)dt{9YFOx#z##%+eJ(GY1QJ#;qcMFZRm3N6=81-1PrMKLGmH V`Q>9mJe&Xk002ovPDHLkV1n{D;L892 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/calendar.png b/app/src/main/res/mipmap-xhdpi/calendar.png new file mode 100644 index 0000000000000000000000000000000000000000..2e3cd13c4fa9be7695ad25886fe13e0ebdab6fb6 GIT binary patch literal 782 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 b!{6`+0`#mn(@t^}00000NkvXXu0mjfBKEK; literal 0 HcmV?d00001 diff --git a/app/src/main/res/values/array.xml b/app/src/main/res/values/array.xml index 17910c220..72a9e4262 100644 --- a/app/src/main/res/values/array.xml +++ b/app/src/main/res/values/array.xml @@ -3,7 +3,6 @@ @string/off @string/at_start - @string/ten_mins - @string/thirty_mins + @string/minutes_before diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 91798c74d..cac09c7d9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -15,8 +15,7 @@ Reminder Off At start - 10 mins before - 30 mins before + Minutes before Details diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index f39355514..99abf955b 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -50,6 +50,8 @@ 20sp +