/** * Copyright (C) 2013 by Raphael Michel under the MIT license: * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software * is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ package de.geeksfactory.opacclient.frontend; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.database.Cursor; import android.os.Bundle; import android.preference.PreferenceManager; import android.support.design.widget.Snackbar; import android.support.v4.app.Fragment; import android.support.v4.app.LoaderManager.LoaderCallbacks; import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; import android.support.v4.widget.SimpleCursorAdapter; import android.text.Html; import android.view.LayoutInflater; import android.view.MenuInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import java.util.ArrayList; import java.util.List; import de.geeksfactory.opacclient.OpacClient; import de.geeksfactory.opacclient.R; import de.geeksfactory.opacclient.frontend.OpacActivity.AccountSelectedListener; import de.geeksfactory.opacclient.objects.Account; import de.geeksfactory.opacclient.objects.Starred; import de.geeksfactory.opacclient.searchfields.SearchField; import de.geeksfactory.opacclient.searchfields.SearchField.Meaning; import de.geeksfactory.opacclient.searchfields.SearchQuery; import de.geeksfactory.opacclient.storage.JsonSearchFieldDataSource; import de.geeksfactory.opacclient.storage.StarDataSource; import de.geeksfactory.opacclient.storage.StarDatabase; import de.geeksfactory.opacclient.utils.CompatibilityUtils; public class StarredFragment extends Fragment implements LoaderCallbacks<Cursor>, AccountSelectedListener { private static final String STATE_ACTIVATED_POSITION = "activated_position"; protected View view; protected OpacClient app; private ItemListAdapter adapter; private Callback callback; private ListView listView; private int activatedPosition = ListView.INVALID_POSITION; private TextView tvWelcome; private Starred sItem; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { setHasOptionsMenu(true); view = inflater.inflate(R.layout.fragment_starred, container, false); app = (OpacClient) getActivity().getApplication(); adapter = new ItemListAdapter(); listView = (ListView) view.findViewById(R.id.lvStarred); tvWelcome = (TextView) view.findViewById(R.id.tvWelcome); listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Starred item = (Starred) view.findViewById(R.id.ivDelete) .getTag(); if (item.getMNr() == null || item.getMNr().equals("null") || item.getMNr().equals("")) { SharedPreferences sp = PreferenceManager .getDefaultSharedPreferences(getActivity()); List<SearchQuery> query = new ArrayList<>(); List<SearchField> fields = new JsonSearchFieldDataSource( app).getSearchFields(app.getLibrary().getIdent()); if (fields != null) { SearchField title_field = null, free_field = null; for (SearchField field : fields) { if (field.getMeaning() == Meaning.TITLE) { title_field = field; } else if (field.getMeaning() == Meaning.FREE) { free_field = field; } else if (field.getMeaning() == Meaning.HOME_BRANCH) { query.add(new SearchQuery(field, sp.getString( OpacClient.PREF_HOME_BRANCH_PREFIX + app.getAccount().getId(), null))); } } if (title_field != null) { query.add(new SearchQuery(title_field, item .getTitle())); } else if (free_field != null) { query.add(new SearchQuery(free_field, item .getTitle())); } app.startSearch(getActivity(), query); } else { Toast.makeText(getActivity(), R.string.no_search_cache, Toast.LENGTH_LONG).show(); } } else { callback.showDetail(item.getMNr()); } } }); listView.setClickable(true); listView.setTextFilterEnabled(true); getActivity().getSupportLoaderManager() .initLoader(0, null, this); listView.setAdapter(adapter); // Restore the previously serialized activated item position. if (savedInstanceState != null && savedInstanceState.containsKey(STATE_ACTIVATED_POSITION)) { setActivatedPosition(savedInstanceState .getInt(STATE_ACTIVATED_POSITION)); } setActivateOnItemClick(((OpacActivity) getActivity()).isTablet()); return view; } @Override public void onCreateOptionsMenu(android.view.Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.activity_starred, menu); super.onCreateOptionsMenu(menu, inflater); } @Override public boolean onOptionsItemSelected(android.view.MenuItem item) { if (item.getItemId() == R.id.action_export) { export(); return true; } return super.onOptionsItemSelected(item); } @Override public void accountSelected(Account account) { getActivity().getSupportLoaderManager().restartLoader(0, null, this); } public void remove(Starred item) { StarDataSource data = new StarDataSource(getActivity()); sItem = item; showSnackBar(); data.remove(item); } //Added code to show SnackBar when clicked on Remove button in Favorites screen private void showSnackBar() { Snackbar snackbar = Snackbar.make(view, getString(R.string.starred_removed), Snackbar.LENGTH_LONG); snackbar.setAction(R.string.starred_removed_undo, new View.OnClickListener() { @Override public void onClick(View view) { StarDataSource data = new StarDataSource(getActivity()); String bib = app.getLibrary().getIdent(); data.star(sItem.getMNr(), sItem.getTitle(), bib, sItem.getMediaType()); } }); snackbar.show(); } @Override public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) { if (app.getLibrary() != null) { return new CursorLoader(getActivity(), app.getStarProviderStarUri(), StarDatabase.COLUMNS, StarDatabase.STAR_WHERE_LIB, new String[]{app .getLibrary().getIdent()}, null); } else { return null; } } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) { adapter.swapCursor(cursor); if (cursor.getCount() == 0) { tvWelcome.setVisibility(View.VISIBLE); } else { tvWelcome.setVisibility(View.GONE); } } @Override public void onLoaderReset(Loader<Cursor> arg0) { adapter.swapCursor(null); } protected void export() { Intent intent = new Intent(android.content.Intent.ACTION_SEND); intent.setType("text/plain"); intent.addFlags(CompatibilityUtils.getNewDocumentIntentFlag()); StringBuilder text = new StringBuilder(); StarDataSource data = new StarDataSource(getActivity()); List<Starred> items = data.getAllItems(app.getLibrary().getIdent()); for (Starred item : items) { text.append(item.getTitle()); text.append("\n"); String shareUrl; try { shareUrl = app.getApi().getShareUrl(item.getMNr(), item.getTitle()); } catch (OpacClient.LibraryRemovedException e) { return; } if (shareUrl != null) { text.append(shareUrl); text.append("\n"); } text.append("\n"); } intent.putExtra(Intent.EXTRA_TEXT, text.toString().trim()); startActivity(Intent.createChooser(intent, getResources().getString(R.string.share))); } @Override public void onAttach(Activity activity) { super.onAttach(activity); try { callback = (Callback) activity; } catch (ClassCastException e) { throw new ClassCastException(activity.toString() + " must implement SearchFragment.Callback"); } } @Override public void onResume() { getActivity().getSupportLoaderManager().restartLoader(0, null, this); super.onResume(); } /** * Turns on activate-on-click mode. When this mode is on, list items will be given the * 'activated' state when touched. */ private void setActivateOnItemClick(boolean activateOnItemClick) { // When setting CHOICE_MODE_SINGLE, ListView will automatically // give items the 'activated' state when touched. listView.setChoiceMode(activateOnItemClick ? AbsListView.CHOICE_MODE_SINGLE : AbsListView.CHOICE_MODE_NONE); } private void setActivatedPosition(int position) { if (position == AdapterView.INVALID_POSITION) { listView.setItemChecked(activatedPosition, false); } else { listView.setItemChecked(position, true); } activatedPosition = position; } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); if (activatedPosition != AdapterView.INVALID_POSITION) { // Serialize and persist the activated item position. outState.putInt(STATE_ACTIVATED_POSITION, activatedPosition); } } public interface Callback { public void showDetail(String mNr); public void removeFragment(); } private class ItemListAdapter extends SimpleCursorAdapter { public ItemListAdapter() { super(getActivity(), R.layout.listitem_starred, null, new String[]{"bib"}, null, 0); } @Override public void bindView(View view, Context context, Cursor cursor) { Starred item = StarDataSource.cursorToItem(cursor); TextView tv = (TextView) view.findViewById(R.id.tvTitle); if (item.getTitle() != null) { tv.setText(Html.fromHtml(item.getTitle())); } else { tv.setText(""); } ImageView ivType = (ImageView) view.findViewById(R.id.ivMediaType); if (item.getMediaType() != null) { ivType.setImageResource(ResultsAdapter.getResourceByMediaType(item.getMediaType())); } else { ivType.setImageBitmap(null); } ImageView ivDelete = (ImageView) view.findViewById(R.id.ivDelete); ivDelete.setFocusableInTouchMode(false); ivDelete.setFocusable(false); ivDelete.setTag(item); ivDelete.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { Starred item = (Starred) arg0.getTag(); remove(item); callback.removeFragment(); } }); } } }