From 11c4be68b9e2fe725e69edf869deeb0bf4e1b6af Mon Sep 17 00:00:00 2001 From: Phillip Hsu Date: Tue, 28 Jun 2016 02:44:27 -0700 Subject: [PATCH] Removed usages of AlarmRepository --- .../java/com/philliphsu/clock2/Alarm.java | 16 ++--- .../clock2/OnBootUpAlarmScheduler.java | 4 +- .../clock2/PendingAlarmScheduler.java | 4 +- .../clock2/UpcomingAlarmReceiver.java | 4 +- .../clock2/alarms/AlarmsFragment.java | 38 ++++++------ .../clock2/editalarm/EditAlarmActivity.java | 4 +- .../clock2/model/AlarmDatabaseHelper.java | 60 ++++++++++++++----- .../clock2/model/DatabaseManager.java | 8 +++ .../clock2/ringtone/RingtoneActivity.java | 4 +- .../clock2/ringtone/RingtoneService.java | 4 +- .../philliphsu/clock2/util/AlarmUtils.java | 15 +++-- 11 files changed, 96 insertions(+), 65 deletions(-) diff --git a/app/src/main/java/com/philliphsu/clock2/Alarm.java b/app/src/main/java/com/philliphsu/clock2/Alarm.java index beacf50..f036f1e 100644 --- a/app/src/main/java/com/philliphsu/clock2/Alarm.java +++ b/app/src/main/java/com/philliphsu/clock2/Alarm.java @@ -38,7 +38,7 @@ public abstract class Alarm implements JsonSerializable { @Deprecated public static Alarm create(JSONObject jsonObject) { - return null; + throw new UnsupportedOperationException(); } public static Builder builder() { @@ -184,30 +184,26 @@ public abstract class Alarm implements JsonSerializable { return ringsIn() <= hours * 3600000; } - @Deprecated public int intId() { - return -1; + return (int) id; } public void setId(long id) { this.id = id; } - public long getId() { - return id; - } - - @Deprecated + // TODO: Remove method signature from JsonSerializable interface. + // TODO: Remove final modifier. @Override public final long id() { - return -1; + return id; } @Deprecated @Override @NonNull public JSONObject toJsonObject() { - return null; + throw new UnsupportedOperationException(); } @AutoValue.Builder diff --git a/app/src/main/java/com/philliphsu/clock2/OnBootUpAlarmScheduler.java b/app/src/main/java/com/philliphsu/clock2/OnBootUpAlarmScheduler.java index 859b2d0..4fd4a8e 100644 --- a/app/src/main/java/com/philliphsu/clock2/OnBootUpAlarmScheduler.java +++ b/app/src/main/java/com/philliphsu/clock2/OnBootUpAlarmScheduler.java @@ -4,7 +4,7 @@ import android.app.IntentService; import android.content.Context; import android.content.Intent; -import com.philliphsu.clock2.model.AlarmsRepository; +import com.philliphsu.clock2.model.DatabaseManager; import com.philliphsu.clock2.util.AlarmUtils; import java.util.List; @@ -60,7 +60,7 @@ public class OnBootUpAlarmScheduler extends IntentService { @Override protected void onHandleIntent(Intent intent) { if (intent != null) { - List alarms = AlarmsRepository.getInstance(this).getItems(); + List alarms = DatabaseManager.getInstance(this).getAlarms(); for (Alarm a : alarms) { if (a.isEnabled()) { AlarmUtils.scheduleAlarm(this, a, false); diff --git a/app/src/main/java/com/philliphsu/clock2/PendingAlarmScheduler.java b/app/src/main/java/com/philliphsu/clock2/PendingAlarmScheduler.java index b441467..8789462 100644 --- a/app/src/main/java/com/philliphsu/clock2/PendingAlarmScheduler.java +++ b/app/src/main/java/com/philliphsu/clock2/PendingAlarmScheduler.java @@ -4,7 +4,7 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; -import com.philliphsu.clock2.model.AlarmsRepository; +import com.philliphsu.clock2.model.DatabaseManager; import com.philliphsu.clock2.util.AlarmUtils; import static com.philliphsu.clock2.util.Preconditions.checkNotNull; @@ -26,7 +26,7 @@ public class PendingAlarmScheduler extends BroadcastReceiver { if (id < 0) { throw new IllegalStateException("No alarm id received"); } - Alarm alarm = checkNotNull(AlarmsRepository.getInstance(context).getItem(id)); + Alarm alarm = checkNotNull(DatabaseManager.getInstance(context).getAlarm(id)); AlarmUtils.scheduleAlarm(context, alarm, false); } } diff --git a/app/src/main/java/com/philliphsu/clock2/UpcomingAlarmReceiver.java b/app/src/main/java/com/philliphsu/clock2/UpcomingAlarmReceiver.java index d1bc9e5..388d8b2 100644 --- a/app/src/main/java/com/philliphsu/clock2/UpcomingAlarmReceiver.java +++ b/app/src/main/java/com/philliphsu/clock2/UpcomingAlarmReceiver.java @@ -8,7 +8,7 @@ import android.content.Context; import android.content.Intent; import android.support.v4.app.NotificationCompat; -import com.philliphsu.clock2.model.AlarmsRepository; +import com.philliphsu.clock2.model.DatabaseManager; import com.philliphsu.clock2.util.AlarmUtils; import static android.app.PendingIntent.FLAG_ONE_SHOT; @@ -35,7 +35,7 @@ public class UpcomingAlarmReceiver extends BroadcastReceiver { if (ACTION_CANCEL_NOTIFICATION.equals(intent.getAction())) { nm.cancel(getClass().getName(), (int) id); } else { - Alarm alarm = checkNotNull(AlarmsRepository.getInstance(context).getItem(id)); + Alarm alarm = checkNotNull(DatabaseManager.getInstance(context).getAlarm(id)); if (ACTION_DISMISS_NOW.equals(intent.getAction())) { AlarmUtils.cancelAlarm(context, alarm, true); } else { diff --git a/app/src/main/java/com/philliphsu/clock2/alarms/AlarmsFragment.java b/app/src/main/java/com/philliphsu/clock2/alarms/AlarmsFragment.java index 2cff0fd..311904e 100644 --- a/app/src/main/java/com/philliphsu/clock2/alarms/AlarmsFragment.java +++ b/app/src/main/java/com/philliphsu/clock2/alarms/AlarmsFragment.java @@ -3,7 +3,6 @@ package com.philliphsu.clock2.alarms; import android.content.Context; import android.os.Bundle; import android.support.v4.app.Fragment; -import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; @@ -13,8 +12,8 @@ import android.view.ViewGroup; import com.philliphsu.clock2.Alarm; import com.philliphsu.clock2.OnListItemInteractionListener; import com.philliphsu.clock2.R; -import com.philliphsu.clock2.model.AlarmsRepository; import com.philliphsu.clock2.model.BaseRepository; +import com.philliphsu.clock2.model.DatabaseManager; import butterknife.Bind; import butterknife.ButterKnife; @@ -27,14 +26,9 @@ import butterknife.ButterKnife; */ public class AlarmsFragment extends Fragment implements BaseRepository.DataObserver { - // TODO: Customize parameter argument names - private static final String ARG_COLUMN_COUNT = "column-count"; - // TODO: Customize parameters - private int mColumnCount = 1; private OnAlarmInteractionListener mListener; - private AlarmsRepository mRepo; - private AlarmsAdapter mAdapter; + private DatabaseManager mDatabaseManager; @Bind(R.id.list) RecyclerView mList; @@ -49,7 +43,7 @@ public class AlarmsFragment extends Fragment implements BaseRepository.DataObser public static AlarmsFragment newInstance(int columnCount) { AlarmsFragment fragment = new AlarmsFragment(); Bundle args = new Bundle(); - args.putInt(ARG_COLUMN_COUNT, columnCount); + // TODO Put any arguments in bundle fragment.setArguments(args); return fragment; } @@ -59,8 +53,10 @@ public class AlarmsFragment extends Fragment implements BaseRepository.DataObser super.onCreate(savedInstanceState); if (getArguments() != null) { - mColumnCount = getArguments().getInt(ARG_COLUMN_COUNT); + // TODO Read arguments } + + mDatabaseManager = DatabaseManager.getInstance(getActivity()); } @Override @@ -70,12 +66,8 @@ public class AlarmsFragment extends Fragment implements BaseRepository.DataObser ButterKnife.bind(this, view); // Set the adapter Context context = view.getContext(); - if (mColumnCount <= 1) { - mList.setLayoutManager(new LinearLayoutManager(context)); - } else { - mList.setLayoutManager(new GridLayoutManager(context, mColumnCount)); - } - mAdapter = new AlarmsAdapter(mRepo.getItems(), mListener); + mList.setLayoutManager(new LinearLayoutManager(context)); + mAdapter = new AlarmsAdapter(mDatabaseManager.getAlarms(), mListener); mList.setAdapter(mAdapter); return view; } @@ -83,7 +75,15 @@ public class AlarmsFragment extends Fragment implements BaseRepository.DataObser @Override public void onPause() { super.onPause(); - AlarmsRepository.getInstance(getActivity()).saveItems(); + // TODO: Do we need to save anything? +// AlarmsRepository.getInstance(getActivity()).saveItems(); + } + + @Override + public void onResume() { + super.onResume(); + // TODO: Need to refresh the list's adapter for any item changes. Consider doing this in + // onNewActivity(). } @Override @@ -101,16 +101,12 @@ public class AlarmsFragment extends Fragment implements BaseRepository.DataObser throw new RuntimeException(context.toString() + " must implement OnAlarmInteractionListener"); } - mRepo = AlarmsRepository.getInstance(context); - mRepo.registerDataObserver(this); } @Override public void onDetach() { super.onDetach(); mListener = null; - mRepo.unregisterDataObserver(); - mRepo = null; } @Override 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 9483186..1c3f290 100644 --- a/app/src/main/java/com/philliphsu/clock2/editalarm/EditAlarmActivity.java +++ b/app/src/main/java/com/philliphsu/clock2/editalarm/EditAlarmActivity.java @@ -79,9 +79,9 @@ public class EditAlarmActivity extends BaseActivity implements AlarmNumpad.KeyLi super.onCreate(savedInstanceState); setWeekDaysText(); mNumpad.setKeyListener(this); + mDatabaseManager = DatabaseManager.getInstance(this); // MUST be before loading alarm loadAlarm(getIntent().getLongExtra(EXTRA_ALARM_ID, -1)); setTimeTextHint(); // TODO: private access - mDatabaseManager = DatabaseManager.getInstance(this); } @Override @@ -225,7 +225,7 @@ public class EditAlarmActivity extends BaseActivity implements AlarmNumpad.KeyLi Log.d(TAG, "Cancelling old alarm first"); cancelAlarm(mOldAlarm, false); } - mDatabaseManager.updateAlarm(mOldAlarm, alarm); + mDatabaseManager.updateAlarm(mOldAlarm.id(), alarm); } else { mDatabaseManager.insertAlarm(alarm); } diff --git a/app/src/main/java/com/philliphsu/clock2/model/AlarmDatabaseHelper.java b/app/src/main/java/com/philliphsu/clock2/model/AlarmDatabaseHelper.java index fcff5b0..ae53bb1 100644 --- a/app/src/main/java/com/philliphsu/clock2/model/AlarmDatabaseHelper.java +++ b/app/src/main/java/com/philliphsu/clock2/model/AlarmDatabaseHelper.java @@ -23,6 +23,7 @@ import static com.philliphsu.clock2.DaysOfWeek.WEDNESDAY; * TODO: We can generalize this class to all data models, not just Alarms. */ public class AlarmDatabaseHelper extends SQLiteOpenHelper { + private static final String TAG = "AlarmDatabaseHelper"; private static final String DB_NAME = "alarms.db"; private static final int VERSION_1 = 1; @@ -43,6 +44,7 @@ public class AlarmDatabaseHelper extends SQLiteOpenHelper { // TODO: Consider creating an inner class that implements BaseColumns // and defines all the columns. private static final String TABLE_ALARM_RECURRING_DAYS = "alarm_recurring_days"; + // TODO: change value to _id if changing this to a primary auto-incrementing key private static final String COLUMN_ALARM_ID = "alarm_id"; private static final String COLUMN_SUNDAY = "sunday"; private static final String COLUMN_MONDAY = "monday"; @@ -77,6 +79,8 @@ public class AlarmDatabaseHelper extends SQLiteOpenHelper { private static void createRecurringDaysTable(SQLiteDatabase db) { db.execSQL("CREATE TABLE " + TABLE_ALARM_RECURRING_DAYS + " (" + // TODO: The ID can instead be a primary auto-incrementing key, since a recurrence entry + // will always be made in conjunction with an alarm entry. + COLUMN_ALARM_ID + " INTEGER REFERENCES " + TABLE_ALARMS + "(" + COLUMN_ID + "), " + COLUMN_SUNDAY + " INTEGER NOT NULL DEFAULT 0, " + COLUMN_MONDAY + " INTEGER NOT NULL DEFAULT 0, " @@ -117,16 +121,38 @@ public class AlarmDatabaseHelper extends SQLiteOpenHelper { return id; } + /** + * @deprecated Use {@link #updateAlarm(long, Alarm)} instead + */ + @Deprecated public int updateAlarm(Alarm oldAlarm, Alarm newAlarm) { - newAlarm.setId(oldAlarm.getId()); + newAlarm.setId(oldAlarm.id()); SQLiteDatabase db = getWritableDatabase(); int rowsUpdatedInAlarmsTable = db.update(TABLE_ALARMS, toContentValues(newAlarm), - COLUMN_ID + " = " + newAlarm.getId(), + COLUMN_ID + " = " + newAlarm.id(), null); int rowsUpdatedInRecurrencesTable = db.update(TABLE_ALARM_RECURRING_DAYS, - toRecurrenceContentValues(newAlarm.getId(), newAlarm), - COLUMN_ALARM_ID + " = " + newAlarm.getId(), + toRecurrenceContentValues(newAlarm.id(), newAlarm), + COLUMN_ALARM_ID + " = " + newAlarm.id(), + null); + if (rowsUpdatedInAlarmsTable == rowsUpdatedInRecurrencesTable && rowsUpdatedInAlarmsTable == 1) { + return 1; + } + throw new IllegalStateException("rows updated in TABLE_ALARMS = " + rowsUpdatedInAlarmsTable + + ", rows updated in TABLE_ALARM_RECURRING_DAYS = " + rowsUpdatedInRecurrencesTable); + } + + public int updateAlarm(long id, Alarm newAlarm) { + newAlarm.setId(id); + SQLiteDatabase db = getWritableDatabase(); + int rowsUpdatedInAlarmsTable = db.update(TABLE_ALARMS, + toContentValues(newAlarm), + COLUMN_ID + " = " + id, + null); + int rowsUpdatedInRecurrencesTable = db.update(TABLE_ALARM_RECURRING_DAYS, + toRecurrenceContentValues(id, newAlarm), + COLUMN_ALARM_ID + " = " + id, null); if (rowsUpdatedInAlarmsTable == rowsUpdatedInRecurrencesTable && rowsUpdatedInAlarmsTable == 1) { return 1; @@ -138,10 +164,10 @@ public class AlarmDatabaseHelper extends SQLiteOpenHelper { public int deleteAlarm(Alarm alarm) { SQLiteDatabase db = getWritableDatabase(); int rowsDeletedInAlarmsTable = db.delete(TABLE_ALARMS, - COLUMN_ID + " = " + alarm.getId(), + COLUMN_ID + " = " + alarm.id(), null); int rowsDeletedInRecurrencesTable = db.delete(TABLE_ALARM_RECURRING_DAYS, - COLUMN_ALARM_ID + " = " + alarm.getId(), + COLUMN_ALARM_ID + " = " + alarm.id(), null); if (rowsDeletedInAlarmsTable == rowsDeletedInRecurrencesTable && rowsDeletedInAlarmsTable == 1) { return 1; @@ -161,7 +187,7 @@ public class AlarmDatabaseHelper extends SQLiteOpenHelper { "1"); // limit 1 row Cursor recurrenceCursor = getReadableDatabase().query(TABLE_ALARM_RECURRING_DAYS, null, // All columns - COLUMN_ID + " = " + id, // selection + COLUMN_ALARM_ID + " = " + id, // selection null, // selection args null, // group by null, // order by @@ -232,13 +258,19 @@ public class AlarmDatabaseHelper extends SQLiteOpenHelper { alarm.setId(getLong(getColumnIndex(COLUMN_ID))); alarm.setEnabled(getInt(getColumnIndex(COLUMN_ENABLED)) == 1); alarm.setSnoozing(getLong(getColumnIndex(COLUMN_SNOOZING_UNTIL_MILLIS))); - alarm.setRecurring(SUNDAY, isRecurring(INDEX_SUNDAY)); - alarm.setRecurring(MONDAY, isRecurring(INDEX_MONDAY)); - alarm.setRecurring(TUESDAY, isRecurring(INDEX_TUESDAY)); - alarm.setRecurring(WEDNESDAY, isRecurring(INDEX_WEDNESDAY)); - alarm.setRecurring(THURSDAY, isRecurring(INDEX_THURSDAY)); - alarm.setRecurring(FRIDAY, isRecurring(INDEX_FRIDAY)); - alarm.setRecurring(SATURDAY, isRecurring(INDEX_SATURDAY)); + // DatabaseManager moves the primary cursor for you. However, you are responsible + // for moving the recurrence cursor yourself, because it is private to this class. + if (mRecurrenceCursor.moveToNext()) { + alarm.setRecurring(SUNDAY, isRecurring(INDEX_SUNDAY)); + alarm.setRecurring(MONDAY, isRecurring(INDEX_MONDAY)); + alarm.setRecurring(TUESDAY, isRecurring(INDEX_TUESDAY)); + alarm.setRecurring(WEDNESDAY, isRecurring(INDEX_WEDNESDAY)); + alarm.setRecurring(THURSDAY, isRecurring(INDEX_THURSDAY)); + alarm.setRecurring(FRIDAY, isRecurring(INDEX_FRIDAY)); + alarm.setRecurring(SATURDAY, isRecurring(INDEX_SATURDAY)); + } else { + throw new IllegalStateException("No entry in recurrence table for alarm: " + alarm); + } return alarm; } diff --git a/app/src/main/java/com/philliphsu/clock2/model/DatabaseManager.java b/app/src/main/java/com/philliphsu/clock2/model/DatabaseManager.java index c7f6fc0..64be042 100644 --- a/app/src/main/java/com/philliphsu/clock2/model/DatabaseManager.java +++ b/app/src/main/java/com/philliphsu/clock2/model/DatabaseManager.java @@ -33,10 +33,18 @@ public class DatabaseManager { return alarm; } + /** + * @deprecated Use {@link #updateAlarm(long, Alarm)} instead + */ + @Deprecated public int updateAlarm(Alarm oldAlarm, Alarm newAlarm) { return mHelper.updateAlarm(oldAlarm, newAlarm); } + public int updateAlarm(long id, Alarm newAlarm) { + return mHelper.updateAlarm(id, newAlarm); + } + public int deleteAlarm(Alarm alarm) { return mHelper.deleteAlarm(alarm); } diff --git a/app/src/main/java/com/philliphsu/clock2/ringtone/RingtoneActivity.java b/app/src/main/java/com/philliphsu/clock2/ringtone/RingtoneActivity.java index 76e5b92..745b2c4 100644 --- a/app/src/main/java/com/philliphsu/clock2/ringtone/RingtoneActivity.java +++ b/app/src/main/java/com/philliphsu/clock2/ringtone/RingtoneActivity.java @@ -14,7 +14,7 @@ import android.widget.Button; import com.philliphsu.clock2.Alarm; import com.philliphsu.clock2.R; -import com.philliphsu.clock2.model.AlarmsRepository; +import com.philliphsu.clock2.model.DatabaseManager; import com.philliphsu.clock2.util.AlarmUtils; import com.philliphsu.clock2.util.LocalBroadcastHelper; @@ -52,7 +52,7 @@ public class RingtoneActivity extends AppCompatActivity { if (id < 0) { throw new IllegalStateException("Cannot start RingtoneActivity without item's id"); } - mAlarm = checkNotNull(AlarmsRepository.getInstance(this).getItem(id)); + mAlarm = checkNotNull(DatabaseManager.getInstance(this).getAlarm(id)); Log.d(TAG, "Ringing alarm " + mAlarm); // TODO: If the upcoming alarm notification isn't present, verify other notifications aren't affected. diff --git a/app/src/main/java/com/philliphsu/clock2/ringtone/RingtoneService.java b/app/src/main/java/com/philliphsu/clock2/ringtone/RingtoneService.java index c00e374..8521b6f 100644 --- a/app/src/main/java/com/philliphsu/clock2/ringtone/RingtoneService.java +++ b/app/src/main/java/com/philliphsu/clock2/ringtone/RingtoneService.java @@ -23,7 +23,7 @@ import android.util.Log; import com.philliphsu.clock2.Alarm; import com.philliphsu.clock2.R; -import com.philliphsu.clock2.model.AlarmsRepository; +import com.philliphsu.clock2.model.DatabaseManager; import com.philliphsu.clock2.util.AlarmUtils; import com.philliphsu.clock2.util.LocalBroadcastHelper; @@ -84,7 +84,7 @@ public class RingtoneService extends Service { // TODO: abstract this, make subc long id = intent.getLongExtra(EXTRA_ITEM_ID, -1); if (id < 0) throw new IllegalStateException("No item id set"); - Alarm alarm = checkNotNull(AlarmsRepository.getInstance(this).getItem(id)); + Alarm alarm = checkNotNull(DatabaseManager.getInstance(this).getAlarm(id)); if (intent.getAction() == null) { playRingtone(alarm); diff --git a/app/src/main/java/com/philliphsu/clock2/util/AlarmUtils.java b/app/src/main/java/com/philliphsu/clock2/util/AlarmUtils.java index 2a157c6..a72cd94 100644 --- a/app/src/main/java/com/philliphsu/clock2/util/AlarmUtils.java +++ b/app/src/main/java/com/philliphsu/clock2/util/AlarmUtils.java @@ -13,7 +13,7 @@ import com.philliphsu.clock2.Alarm; import com.philliphsu.clock2.PendingAlarmScheduler; import com.philliphsu.clock2.R; import com.philliphsu.clock2.UpcomingAlarmReceiver; -import com.philliphsu.clock2.model.AlarmsRepository; +import com.philliphsu.clock2.model.DatabaseManager; import com.philliphsu.clock2.ringtone.RingtoneActivity; import com.philliphsu.clock2.ringtone.RingtoneService; @@ -112,19 +112,16 @@ public final class AlarmUtils { } } - save(c); // Save any changes + save(c, a); // If service is not running, nothing happens - // TODO: Since RingtoneService is a bound service, will this destroy the service after returning? - // Note that if a stopped service still has ServiceConnection objects bound to it with the - // BIND_AUTO_CREATE set, it will not be destroyed until all of these bindings are removed. c.stopService(new Intent(c, RingtoneService.class)); } public static void snoozeAlarm(Context c, Alarm a) { a.snooze(snoozeDuration(c)); scheduleAlarm(c, a, true); - save(c); + save(c, a); } public static void removeUpcomingAlarmNotification(Context c, Alarm a) { @@ -185,7 +182,9 @@ public final class AlarmUtils { return pi; } - private static void save(Context c) { - AlarmsRepository.getInstance(c).saveItems(); + private static void save(Context c, Alarm alarm) { +// AlarmsRepository.getInstance(c).saveItems(); + // Update the same alarm + DatabaseManager.getInstance(c).updateAlarm(alarm.id(), alarm); } }