package net.bible.android.view.activity.bookmark;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import net.bible.android.activity.R;
import net.bible.android.control.bookmark.BookmarkControl;
import net.bible.android.view.activity.base.Callback;
import net.bible.android.view.activity.base.IntentHelper;
import net.bible.android.view.activity.base.ListActivityBase;
import net.bible.service.db.bookmark.BookmarkDto;
import net.bible.service.db.bookmark.LabelDto;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.inject.Inject;
/**
* Choose which labels to associate with a bookmark
*
* @author Martin Denham [mjdenham at gmail dot com]
* @see gnu.lgpl.License for license details.<br>
* The copyright to this program is held by it's author.
*/
public class BookmarkLabels extends ListActivityBase {
private List<BookmarkDto> bookmarks;
private BookmarkControl bookmarkControl;
private static final String TAG = "BookmarkLabels";
private List<LabelDto> labels = new ArrayList<>();
private LabelDialogs labelDialogs;
// this resource returns a CheckedTextView which has setChecked(..), isChecked(), and toggle() methods
private static final int LIST_ITEM_TYPE = android.R.layout.simple_list_item_multiple_choice;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState, false);
setContentView(R.layout.bookmark_labels);
buildActivityComponent().inject(this);
long[] bookmarkIds = getIntent().getLongArrayExtra(BookmarkControl.BOOKMARK_IDS_EXTRA);
bookmarks = bookmarkControl.getBookmarksById(bookmarkIds);
initialiseView();
}
private void initialiseView() {
getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
loadLabelList();
ArrayAdapter<LabelDto> listArrayAdapter = new BookmarkLabelItemAdapter(this, LIST_ITEM_TYPE, labels);
setListAdapter(listArrayAdapter);
initialiseCheckedLabels(bookmarks);
}
/** Finished selecting labels
*/
public void onOkay(View v) {
Log.i(TAG, "Okay clicked");
// get the labels that are currently checked
List<LabelDto> selectedLabels = getCheckedLabels();
//associate labels with bookmarks that were passed in
for (BookmarkDto bookmark : bookmarks) {
bookmarkControl.setBookmarkLabels(bookmark, selectedLabels);
}
finish();
}
/**
* New Label requested
*/
public void onNewLabel(View v) {
Log.i(TAG, "New label clicked");
LabelDto newLabel = new LabelDto();
labelDialogs.createLabel(this, newLabel, new Callback() {
@Override
public void okay() {
List<LabelDto> selectedLabels = getCheckedLabels();
Log.d(TAG, "Num labels checked pre reload:"+selectedLabels.size());
loadLabelList();
setCheckedLabels(selectedLabels);
Log.d(TAG, "Num labels checked finally:"+selectedLabels.size()); }
});
}
/** load list of docs to display
*
*/
private void loadLabelList() {
// get long book names to show in the select list
// must clear rather than create because the adapter is linked to this specific list
labels.clear();
labels.addAll(bookmarkControl.getAssignableLabels());
// ensure ui is updated
notifyDataSetChanged();
}
/** check labels associated with the bookmark
*/
private void initialiseCheckedLabels(List<BookmarkDto> bookmarks) {
Set<LabelDto> allCheckedLabels = new HashSet<>();
for (BookmarkDto bookmark : bookmarks) {
// pre-tick any labels currently associated with the bookmark
allCheckedLabels.addAll(bookmarkControl.getBookmarkLabels(bookmark));
}
setCheckedLabels(allCheckedLabels);
}
/**
* get checked status of all labels
*/
private List<LabelDto> getCheckedLabels() {
// get selected labels
ListView listView = getListView();
List<LabelDto> checkedLabels = new ArrayList<>();
for (int i=0; i<labels.size(); i++) {
if (listView.isItemChecked(i)) {
LabelDto label = labels.get(i);
checkedLabels.add(label);
Log.d(TAG, "Selected "+label.getName());
}
}
return checkedLabels;
}
/**
* set checked status of all labels
*/
private void setCheckedLabels(Collection<LabelDto> labelsToCheck) {
for (int i=0; i<labels.size(); i++) {
if (labelsToCheck.contains(labels.get(i))) {
getListView().setItemChecked(i, true);
} else {
getListView().setItemChecked(i, false);
}
}
// ensure ui is updated
notifyDataSetChanged();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.bookmark_labels_actionbar_menu, menu);
return true;
}
/**
* on Click handlers
*/
@Override
public boolean onOptionsItemSelected(MenuItem item) {
boolean isHandled = false;
switch (item.getItemId()) {
case (R.id.manageLabels):
isHandled = true;
Intent intent = new Intent(this, ManageLabels.class);
startActivityForResult(intent, IntentHelper.REFRESH_DISPLAY_ON_FINISH);
break;
}
if (!isHandled) {
isHandled = super.onOptionsItemSelected(item);
}
return isHandled;
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.d(TAG, "Restoring state after return from label editing");
if (requestCode == IntentHelper.REFRESH_DISPLAY_ON_FINISH) {
// find checked labels prior to refresh
List<LabelDto> selectedLabels = getCheckedLabels();
// reload labels with new and/or amended labels
loadLabelList();
// re-check labels as they were before leaving this screen
setCheckedLabels(selectedLabels);
}
}
@Inject
void setBookmarkControl(BookmarkControl bookmarkControl) {
this.bookmarkControl = bookmarkControl;
}
@Inject
public void setLabelDialogs(LabelDialogs labelDialogs) {
this.labelDialogs = labelDialogs;
}
}