Skip to content

Commit

Permalink
Add batch operations (delete, tag) for bookmarks/tags. Fixes #235
Browse files Browse the repository at this point in the history
  • Loading branch information
afarra committed Jan 2, 2013
1 parent 8c34f48 commit 55008e3
Show file tree
Hide file tree
Showing 7 changed files with 164 additions and 85 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -301,6 +301,32 @@ public long getBookmarkTagId(long bookmarkId, long tagId) {
return -1;
}

public void tagBookmarks(long[] bookmarkIds, List<Tag> tags) {
if (mDb == null){
open();
if (mDb == null){ return; }
}

mDb.beginTransaction();
try {
for (Tag t : tags){
if (t.mId < 0 || !t.isChecked()){ continue; }
for (int i = 0; i < bookmarkIds.length; i++) {
ContentValues values = new ContentValues();
values.put(BookmarkTagTable.BOOKMARK_ID, bookmarkIds[i]);
values.put(BookmarkTagTable.TAG_ID, t.mId);
mDb.replace(BookmarkTagTable.TABLE_NAME, null, values);
}
}
}
catch (Exception e){
Log.d(TAG, "exception in tagBookmark", e);
}

mDb.setTransactionSuccessful();
mDb.endTransaction();
}

public void tagBookmark(long bookmarkId, List<Tag> tags) {
if (mDb == null){
open();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -637,7 +637,7 @@ public void onAddTagSelected(){
}

@Override
public void onBookmarkTagsUpdated(long bookmarkId) {
public void onBookmarkTagsUpdated() {
// Do nothing
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -311,14 +311,24 @@ public void editTag(long id, String name){
addTagDialog.show(fm, AddTagDialog.TAG);
}

public void tagBookmarks(long[] ids){
FragmentManager fm = getSupportFragmentManager();
TagBookmarkDialog tagBookmarkDialog = new TagBookmarkDialog(ids);
tagBookmarkDialog.show(fm, TagBookmarkDialog.TAG);
}

public void tagBookmark(long id){
FragmentManager fm = getSupportFragmentManager();
TagBookmarkDialog tagBookmarkDialog = new TagBookmarkDialog(id);
tagBookmarkDialog.show(fm, TagBookmarkDialog.TAG);
}

public void onBookmarkDeleted() {
mHandler.sendEmptyMessage(REFRESH_TAGS);
}

@Override
public void onBookmarkTagsUpdated(long bookmarkId) {
public void onBookmarkTagsUpdated() {
mHandler.sendEmptyMessage(REFRESH_BOOKMARKS);
mHandler.sendEmptyMessage(REFRESH_TAGS);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
package com.quran.labs.androidquran.ui.fragment;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.SparseBooleanArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
Expand Down Expand Up @@ -36,8 +40,8 @@ public abstract class AbsMarkersFragment extends SherlockFragment {
protected abstract int getContextualMenuId();
protected abstract int getEmptyListStringId();
protected abstract int[] getValidSortOptions();
protected abstract boolean prepareActionMode(ActionMode mode, Menu menu, QuranRow selected);
protected abstract boolean actionItemClicked(ActionMode mode, int menuItemId, QuranActivity activity, QuranRow selected);
protected abstract boolean prepareActionMode(ActionMode mode, Menu menu, QuranRow[] selected);
protected abstract boolean actionItemClicked(ActionMode mode, int menuItemId, QuranActivity activity, QuranRow[] selected);
protected abstract QuranRow[] getItems();

@Override
Expand All @@ -54,7 +58,7 @@ public View onCreateView(LayoutInflater inflater,
mListView.setAdapter(mAdapter);

mMode = null;
mListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
mListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
mListView.setItemsCanFocus(false);

mListView.setOnItemClickListener(new OnItemClickListener(){
Expand Down Expand Up @@ -155,10 +159,6 @@ public boolean onOptionsItemSelected(MenuItem item) {
return false;
}

protected void finishActionMode() {
mMode.finish();
}

private class ModeCallback implements ActionMode.Callback {

@Override
Expand All @@ -168,62 +168,85 @@ public boolean onCreateActionMode(ActionMode mode, Menu menu) {
return true;
}

private QuranRow[] getSelectedRows() {
List<QuranRow> rows = new ArrayList<QuranRow>();
SparseBooleanArray sel = mListView.getCheckedItemPositions();
for (int i = 0; i < sel.size(); i++) {
if (sel.valueAt(i)) {
int position = sel.keyAt(i);
if (position < 0 || position >= mAdapter.getCount())
continue;
QuranRow elem = (QuranRow)mAdapter.getItem(position);
rows.add(elem);
}
}
QuranRow[] rowsArr = rows.toArray(new QuranRow[rows.size()]);
return rowsArr;
}

@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
int position = mListView.getCheckedItemPosition();
boolean positionValid = position >= 0 && position < mAdapter.getCount();
QuranRow selected = positionValid ? (QuranRow)mAdapter.getItem(position) : null;
QuranRow[] selected = getSelectedRows();
return prepareActionMode(mode, menu, selected);
}

@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
QuranActivity activity = (QuranActivity)getActivity();
int position = mListView.getCheckedItemPosition();
boolean positionValid = position >= 0 && position < mAdapter.getCount();
QuranRow selected = positionValid ? (QuranRow)mAdapter.getItem(position) : null;
QuranRow[] selected = getSelectedRows();
mMode.finish();
return actionItemClicked(mode, item.getItemId(), activity, selected);
}

@Override
public void onDestroyActionMode(ActionMode mode) {
int checkedPosition = mListView.getCheckedItemPosition();
if (checkedPosition >= 0 && checkedPosition < mAdapter.getCount()){
mListView.setItemChecked(checkedPosition, false);
}
for (int i = 0; i < mAdapter.getCount(); i++)
mListView.setItemChecked(i, false);
if (mode == mMode){ mMode = null; }
}

}

class RemoveBookmarkTask extends AsyncTask<QuranRow, Void, Void> {
class RemoveBookmarkTask extends AsyncTask<QuranRow, Void, Boolean> {
boolean mUntagOnly = false;
public RemoveBookmarkTask() {}
public RemoveBookmarkTask(boolean untagOnly) {mUntagOnly=untagOnly;}
@Override
protected Void doInBackground(QuranRow... params) {
protected Boolean doInBackground(QuranRow... params) {
Activity activity = getActivity();
if (activity == null){ return null; }

QuranActivity quranActivity = (QuranActivity)activity;
BookmarksDBAdapter db = quranActivity.getBookmarksAdapter();

// TODO Confirm dialog
boolean bookmarkDeleted = false;
for (int i = 0; i < params.length; i++) {
QuranRow elem = params[i];
if (elem.isBookmarkHeader() && elem.tagId >= 0) {
db.removeTag(elem.tagId);
}
else if (elem.isBookmark() && elem.bookmarkId >= 0) {
db.removeBookmark(elem.bookmarkId);
if (mUntagOnly) {
db.untagBookmark(elem.bookmarkId, elem.tagId);
} else {
db.removeBookmark(elem.bookmarkId);
bookmarkDeleted = true;
}
}
}
return null;
return bookmarkDeleted;
}

@Override
protected void onPostExecute(Void result) {
protected void onPostExecute(Boolean result) {
if (loadingTask == null){
loadingTask = new BookmarksLoadingTask();
loadingTask.execute();
}
QuranActivity activity = (QuranActivity)getActivity();
if (activity != null)
activity.onBookmarkDeleted();
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,35 +42,41 @@ protected int[] getValidSortOptions() {
}

@Override
protected boolean prepareActionMode(ActionMode mode, Menu menu, QuranRow selected) {
protected boolean prepareActionMode(ActionMode mode, Menu menu, QuranRow[] selected) {
MenuItem removeItem = menu.findItem(R.id.cab_delete_bookmark);
MenuItem tagItem = menu.findItem(R.id.cab_tag_bookmark);
if (selected == null || !selected.isBookmark()) {
if (selected == null || selected.length == 0) {
removeItem.setVisible(false);
tagItem.setVisible(false);
} else {
removeItem.setVisible(true);
tagItem.setVisible(true);
return true;
}
for (QuranRow row : selected) {
if (row == null || !row.isBookmark()) {
removeItem.setVisible(false);
tagItem.setVisible(false);
return true;
}
}
removeItem.setVisible(true);
tagItem.setVisible(true);
return true;
}

@Override
protected boolean actionItemClicked(ActionMode mode, int menuItemId,
QuranActivity activity, QuranRow selected) {
QuranActivity activity, QuranRow[] selected) {
if (selected == null)
return false;
switch (menuItemId) {
case R.id.cab_delete_bookmark:
new RemoveBookmarkTask().execute(selected);
return true;
case R.id.cab_tag_bookmark:
if (selected.isBookmark() && selected.bookmarkId >= 0) {
activity.tagBookmark(selected.bookmarkId);
} else {
return false;
long[] ids = new long[selected.length];
for (int i = 0; i < selected.length; i++) {
ids[i] = selected[i].bookmarkId;
}
finishActionMode();
activity.tagBookmarks(ids);
return true;
default:
return false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ public class TagBookmarkDialog extends SherlockDialogFragment {
public static final String TAG = "TagBookmarkDialog";

private long mBookmarkId = -1;
private long[] mBookmarkIds = null;
private Integer mSura;
private Integer mAyah;
private int mPage = -1;
Expand All @@ -36,6 +37,7 @@ public class TagBookmarkDialog extends SherlockDialogFragment {
private ListView mListView;

private static final String BOOKMARK_ID = "bookmarkid";
private static final String BOOKMARK_IDS = "bookmarkids";
private static final String PAGE = "page";
private static final String SURA = "sura";
private static final String AYAH = "ayah";
Expand All @@ -45,6 +47,10 @@ public TagBookmarkDialog(long bookmarkId){
mBookmarkId = bookmarkId;
}

public TagBookmarkDialog(long[] bookmarkIds){
mBookmarkIds = bookmarkIds;
}

public TagBookmarkDialog(Integer sura, Integer ayah, int page){
mSura = sura;
mAyah = ayah;
Expand All @@ -58,6 +64,7 @@ public TagBookmarkDialog(){
@Override
public void onSaveInstanceState(Bundle outState) {
outState.putLong(BOOKMARK_ID, mBookmarkId);
outState.putLongArray(BOOKMARK_IDS, mBookmarkIds);
outState.putInt(PAGE, mPage);
outState.putInt(SURA, mSura == null? 0 : mSura);
outState.putInt(AYAH, mAyah == null? 0 : mAyah);
Expand All @@ -76,6 +83,7 @@ public Dialog onCreateDialog(Bundle savedInstanceState) {

if (savedInstanceState != null){
mBookmarkId = savedInstanceState.getLong(BOOKMARK_ID);
mBookmarkIds = savedInstanceState.getLongArray(BOOKMARK_IDS);
mSura = savedInstanceState.getInt(SURA);
mAyah = savedInstanceState.getInt(AYAH);
mPage = savedInstanceState.getInt(PAGE);
Expand Down Expand Up @@ -209,17 +217,18 @@ class RefreshTagsTask extends AsyncTask<Void, Void, Void> {
protected Void doInBackground(Void... params) {
BookmarksDBAdapter dba = new BookmarksDBAdapter(getActivity());
dba.open();
final List<Tag> tags = dba.getTags();
if (mBookmarkId < 0 && mPage > 0) {
mBookmarkId = dba.getBookmarkId(mSura, mAyah, mPage);
mTags = new ArrayList<Tag>();
mTags.addAll(dba.getTags());
mTags.add(new Tag(-1, getString(R.string.new_tag)));
if (mBookmarkIds == null) {
if (mBookmarkId < 0 && mPage > 0) {
mBookmarkId = dba.getBookmarkId(mSura, mAyah, mPage);
}
mBookmarkTags = mBookmarkId < 0 ? null : dba.getBookmarkTagIds(mBookmarkId);
} else {
mBookmarkTags = null;
}
final List<Long> bookmarkTags = mBookmarkId < 0 ?
null : dba.getBookmarkTagIds(mBookmarkId);
dba.close();

mTags = tags;
mTags.add(new Tag(-1, getString(R.string.new_tag)));
mBookmarkTags = bookmarkTags;
return null;
}

Expand Down Expand Up @@ -260,31 +269,34 @@ protected void onPostExecute(Tag result) {
};
}

class UpdateBookmarkTagsTask extends AsyncTask<Void, Void, Long> {
class UpdateBookmarkTagsTask extends AsyncTask<Void, Void, Void> {
private OnBookmarkTagsUpdateListener mListener;
public UpdateBookmarkTagsTask(OnBookmarkTagsUpdateListener listener) {
mListener = listener;
}
@Override
protected Long doInBackground(Void... params) {
protected Void doInBackground(Void... params) {
BookmarksDBAdapter dba = new BookmarksDBAdapter((Activity)mListener);
dba.open();
long bookmarkId = mBookmarkId;
if (bookmarkId < 0) {
bookmarkId = dba.addBookmarkIfNotExists(mSura, mAyah, mPage);
if (mBookmarkIds == null) {
if (mBookmarkId < 0) {
mBookmarkId = dba.addBookmarkIfNotExists(mSura, mAyah, mPage);
}
dba.tagBookmark(mBookmarkId, mTags);
} else {
dba.tagBookmarks(mBookmarkIds, mTags);
}
dba.tagBookmark(bookmarkId, mTags);
dba.close();
return bookmarkId;
return null;
}
@Override
protected void onPostExecute(Long result) {
mListener.onBookmarkTagsUpdated(result);
protected void onPostExecute(Void result) {
mListener.onBookmarkTagsUpdated();
}
}

public interface OnBookmarkTagsUpdateListener {
public void onBookmarkTagsUpdated(long bookmarkId);
public void onBookmarkTagsUpdated();
public void onAddTagSelected();
}

Expand Down
Loading

0 comments on commit 55008e3

Please sign in to comment.