Alarm adding moved back to onActivityResult

This commit is contained in:
Phillip Hsu 2016-07-06 03:42:45 -07:00
parent 3292da18f8
commit 4d2ef227b6
4 changed files with 72 additions and 12 deletions

View File

@ -5,6 +5,7 @@ import android.os.AsyncTask;
import android.support.design.widget.Snackbar; import android.support.design.widget.Snackbar;
import android.view.View; import android.view.View;
import com.philliphsu.clock2.alarms.ScrollHandler;
import com.philliphsu.clock2.model.DatabaseManager; import com.philliphsu.clock2.model.DatabaseManager;
import com.philliphsu.clock2.util.AlarmUtils; import com.philliphsu.clock2.util.AlarmUtils;
@ -14,16 +15,20 @@ import com.philliphsu.clock2.util.AlarmUtils;
* TODO: Generify this class for any item. * TODO: Generify this class for any item.
*/ */
public final class AsyncItemChangeHandler { public final class AsyncItemChangeHandler {
private static final String TAG = "AsyncItemChangeHandler";
private final Context mContext; private final Context mContext;
private final View mSnackbarAnchor; private final View mSnackbarAnchor;
private final ScrollHandler mScrollHandler;
/** /**
* @param snackbarAnchor an optional anchor for a Snackbar to anchor to * @param snackbarAnchor an optional anchor for a Snackbar to anchor to
* @param scrollHandler
*/ */
public AsyncItemChangeHandler(Context context, View snackbarAnchor) { public AsyncItemChangeHandler(Context context, View snackbarAnchor, ScrollHandler scrollHandler) {
mContext = context.getApplicationContext(); // to prevent memory leaks mContext = context.getApplicationContext(); // to prevent memory leaks
mSnackbarAnchor = snackbarAnchor; mSnackbarAnchor = snackbarAnchor;
mScrollHandler = scrollHandler;
} }
public void asyncAddAlarm(final Alarm alarm) { public void asyncAddAlarm(final Alarm alarm) {
@ -38,6 +43,8 @@ public final class AsyncItemChangeHandler {
// TODO: Snackbar/Toast here? If so, remove the code in AlarmUtils.scheduleAlarm() that does it. // TODO: Snackbar/Toast here? If so, remove the code in AlarmUtils.scheduleAlarm() that does it.
// Then, consider scheduling the alarm in the background. // Then, consider scheduling the alarm in the background.
AlarmUtils.scheduleAlarm(mContext, alarm, true); AlarmUtils.scheduleAlarm(mContext, alarm, true);
// Prepare to scroll to the newly added alarm
mScrollHandler.setScrollToStableId(aLong);
} }
}.execute(); }.execute();
} }

View File

@ -5,6 +5,7 @@ import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.database.Cursor; import android.database.Cursor;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler;
import android.support.design.widget.Snackbar; import android.support.design.widget.Snackbar;
import android.support.v4.app.Fragment; import android.support.v4.app.Fragment;
import android.support.v4.app.LoaderManager.LoaderCallbacks; import android.support.v4.app.LoaderManager.LoaderCallbacks;
@ -17,6 +18,7 @@ import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import com.philliphsu.clock2.Alarm; import com.philliphsu.clock2.Alarm;
import com.philliphsu.clock2.AsyncItemChangeHandler;
import com.philliphsu.clock2.OnListItemInteractionListener; import com.philliphsu.clock2.OnListItemInteractionListener;
import com.philliphsu.clock2.R; import com.philliphsu.clock2.R;
import com.philliphsu.clock2.editalarm.EditAlarmActivity; import com.philliphsu.clock2.editalarm.EditAlarmActivity;
@ -30,12 +32,14 @@ import butterknife.ButterKnife;
// TODO: Use native fragments since we're targeting API >=19? // TODO: Use native fragments since we're targeting API >=19?
// TODO: Use native LoaderCallbacks. // TODO: Use native LoaderCallbacks.
public class AlarmsFragment extends Fragment implements LoaderCallbacks<Cursor>, public class AlarmsFragment extends Fragment implements LoaderCallbacks<Cursor>,
OnListItemInteractionListener<Alarm> { OnListItemInteractionListener<Alarm>, ScrollHandler {
private static final int REQUEST_EDIT_ALARM = 0; private static final int REQUEST_EDIT_ALARM = 0;
public static final int REQUEST_CREATE_ALARM = 1; public static final int REQUEST_CREATE_ALARM = 1;
private static final String TAG = "AlarmsFragment"; private static final String TAG = "AlarmsFragment";
private AlarmsCursorAdapter mAdapter; private AlarmsCursorAdapter mAdapter;
private AsyncItemChangeHandler mAsyncItemChangeHandler;
private long mScrollToStableId = RecyclerView.NO_ID;
@Bind(R.id.list) RecyclerView mList; @Bind(R.id.list) RecyclerView mList;
@ -77,6 +81,9 @@ public class AlarmsFragment extends Fragment implements LoaderCallbacks<Cursor>,
mList.setLayoutManager(new LinearLayoutManager(context)); mList.setLayoutManager(new LinearLayoutManager(context));
mAdapter = new AlarmsCursorAdapter(this); mAdapter = new AlarmsCursorAdapter(this);
mList.setAdapter(mAdapter); mList.setAdapter(mAdapter);
mAsyncItemChangeHandler = new AsyncItemChangeHandler(getActivity(),
getActivity().findViewById(R.id.main_content), this);
return view; return view;
} }
@ -106,6 +113,8 @@ public class AlarmsFragment extends Fragment implements LoaderCallbacks<Cursor>,
@Override @Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) { public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
mAdapter.swapCursor(data); mAdapter.swapCursor(data);
// Scroll to the last modified alarm
performScrollToStableId();
} }
@Override @Override
@ -122,9 +131,17 @@ public class AlarmsFragment extends Fragment implements LoaderCallbacks<Cursor>,
switch (requestCode) { switch (requestCode) {
case REQUEST_CREATE_ALARM: case REQUEST_CREATE_ALARM:
// TODO: Should we still do the async add here? if (data != null) {
// We must if we want the async handler to post the toast/snackbar final Alarm createdAlarm = data.getParcelableExtra(EditAlarmActivity.EXTRA_MODIFIED_ALARM);
// for us. if (createdAlarm != null) {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
mAsyncItemChangeHandler.asyncAddAlarm(createdAlarm);
}
}, 300);
}
}
break; break;
case REQUEST_EDIT_ALARM: case REQUEST_EDIT_ALARM:
Alarm deletedAlarm; Alarm deletedAlarm;
@ -148,6 +165,33 @@ public class AlarmsFragment extends Fragment implements LoaderCallbacks<Cursor>,
startActivityForResult(intent, REQUEST_EDIT_ALARM); startActivityForResult(intent, REQUEST_EDIT_ALARM);
} }
@Override
public void setScrollToStableId(long id) {
mScrollToStableId = id;
}
@Override
public void scrollToPosition(int position) {
mList.smoothScrollToPosition(position);
}
private void performScrollToStableId() {
if (mScrollToStableId != RecyclerView.NO_ID) {
int position = -1;
for (int i = 0; i < mAdapter.getItemCount(); i++) {
if (mAdapter.getItemId(i) == mScrollToStableId) {
position = i;
break;
}
}
if (position >= 0) {
scrollToPosition(position);
}
}
// Reset
mScrollToStableId = RecyclerView.NO_ID;
}
// TODO: This doesn't need to be defined in the interface. // TODO: This doesn't need to be defined in the interface.
// TODO: Rename to showDeletedSnackbar() or something // TODO: Rename to showDeletedSnackbar() or something
// TODO: This needs to prompt a reload of the list. // TODO: This needs to prompt a reload of the list.

View File

@ -0,0 +1,15 @@
package com.philliphsu.clock2.alarms;
/**
* Created by Phillip Hsu on 7/6/2016.
*/
public interface ScrollHandler {
/**
* Specifies the stable id of the item we should scroll to in the list.
* This does not scroll the list. This is useful for preparing to scroll
* to the item when it does not yet exist in the list.
*/
void setScrollToStableId(long id);
void scrollToPosition(int position);
}

View File

@ -26,7 +26,6 @@ import android.widget.Toast;
import android.widget.ToggleButton; import android.widget.ToggleButton;
import com.philliphsu.clock2.Alarm; import com.philliphsu.clock2.Alarm;
import com.philliphsu.clock2.AsyncItemChangeHandler;
import com.philliphsu.clock2.BaseActivity; 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;
@ -69,7 +68,6 @@ public class EditAlarmActivity extends BaseActivity implements AlarmNumpad.KeyLi
private Uri mSelectedRingtoneUri; private Uri mSelectedRingtoneUri;
private Alarm mOldAlarm; private Alarm mOldAlarm;
private DatabaseManager mDatabaseManager; private DatabaseManager mDatabaseManager;
private AsyncItemChangeHandler mAsyncItemChangeHandler;
@Bind(R.id.save) Button mSave; @Bind(R.id.save) Button mSave;
@Bind(R.id.delete) Button mDelete; @Bind(R.id.delete) Button mDelete;
@ -100,8 +98,6 @@ public class EditAlarmActivity extends BaseActivity implements AlarmNumpad.KeyLi
showDetails(); showDetails();
} }
setTimeTextHint(); // TODO: private access setTimeTextHint(); // TODO: private access
mAsyncItemChangeHandler = new AsyncItemChangeHandler(this, null);
} }
@Override @Override
@ -250,15 +246,13 @@ public class EditAlarmActivity extends BaseActivity implements AlarmNumpad.KeyLi
mDatabaseManager.updateAlarm(mOldAlarm.id(), alarm); mDatabaseManager.updateAlarm(mOldAlarm.id(), alarm);
} else { } else {
//mDatabaseManager.insertAlarm(alarm); //mDatabaseManager.insertAlarm(alarm);
mAsyncItemChangeHandler.asyncAddAlarm(alarm); intent.putExtra(EXTRA_MODIFIED_ALARM, alarm);
//intent.putExtra(EXTRA_MODIFIED_ALARM, alarm);
} }
if (alarm.isEnabled()) { if (alarm.isEnabled()) {
//scheduleAlarm(alarm); //scheduleAlarm(alarm);
} }
// TODO: Remove intent
setResult(RESULT_OK, intent); setResult(RESULT_OK, intent);
showEditorClosed(); showEditorClosed();
} }