package de.vanmar.android.yarrn.favorites; import android.app.Activity; import android.support.v4.app.FragmentActivity; import android.view.ContextMenu; import android.view.KeyEvent; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputMethodManager; import android.widget.AdapterView; import android.widget.EditText; import android.widget.ListView; import android.widget.Spinner; import android.widget.TextView; import android.widget.Toast; import com.androidquery.util.AQUtility; import com.google.gson.JsonObject; import com.octo.android.robospice.persistence.exception.SpiceException; import com.octo.android.robospice.request.listener.RequestListener; import org.androidannotations.annotations.AfterViews; import org.androidannotations.annotations.Click; import org.androidannotations.annotations.EFragment; import org.androidannotations.annotations.OptionsItem; import org.androidannotations.annotations.OptionsMenu; import org.androidannotations.annotations.SystemService; import org.androidannotations.annotations.ViewById; import org.androidannotations.annotations.sharedpreferences.Pref; import org.apache.commons.lang3.StringUtils; import java.util.Arrays; import de.vanmar.android.yarrn.R; import de.vanmar.android.yarrn.YarrnAdapter; import de.vanmar.android.yarrn.YarrnPrefs_; import de.vanmar.android.yarrn.components.AddEditFavoriteDialog; import de.vanmar.android.yarrn.components.PagingListFragment; import de.vanmar.android.yarrn.ravelry.IRavelryActivity; import de.vanmar.android.yarrn.ravelry.dts.BookmarkShort; import de.vanmar.android.yarrn.ravelry.dts.FavoritesResult; import de.vanmar.android.yarrn.requests.AbstractRavelryGetRequest; import de.vanmar.android.yarrn.requests.DeleteFavoriteRequest; import de.vanmar.android.yarrn.requests.EditFavoriteRequest; import de.vanmar.android.yarrn.requests.ListFavoritesRequest; import static de.vanmar.android.yarrn.requests.ListFavoritesRequest.SearchOption; @EFragment(R.layout.fragment_favorites) @OptionsMenu(R.menu.favorites_menu) public class FavoritesFragment extends PagingListFragment<FavoritesResult, BookmarkShort> { public static final int MENU_EDIT = 1; public static final int MENU_DELETE = 2; @SystemService InputMethodManager inputMethodManager; @ViewById(R.id.favoritelist) ListView favoritelist; @ViewById(R.id.query) EditText query; @ViewById(R.id.search_options) Spinner searchOptions; @Pref YarrnPrefs_ prefs; public interface FavoritesFragmentListener extends IRavelryActivity { /** * Project with projectId was selected, 0 if no project selected */ void onProjectSelected(int projectId, String username); /** * Pattern with patternId was selected, 0 if no pattern selected */ void onPatternSelected(int patternId); } private FavoritesAdapter adapter; private FavoritesFragmentListener listener; private String searchQuery = ""; private SearchOption searchOption; @AfterViews @Override public void afterViews() { super.afterViews(); adapter = new FavoritesAdapter(getActivity()) { @Override protected void onProjectClicked(final int id, final String username) { listener.onProjectSelected(id, username); } @Override protected void onPatternClicked(int patternId) { listener.onPatternSelected(patternId); } }; favoritelist.setAdapter(adapter); registerForContextMenu(favoritelist); query.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if (event != null && event.getAction() != KeyEvent.ACTION_DOWN) { return false; } if (actionId == EditorInfo.IME_ACTION_SEARCH || event == null || event.getKeyCode() == KeyEvent.KEYCODE_ENTER) { setSearchQuery(query.getText().toString()); inputMethodManager.hideSoftInputFromWindow(query.getWindowToken(), 0); query.clearFocus(); } return true; } }); searchOptions.setOnItemSelectedListener(null); searchOptions.setSelection(prefs.favoriteSearchOption().get()); searchOptions.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { setSearchOption(position); } @Override public void onNothingSelected(AdapterView<?> parent) { } }); } @Override public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo) { if (view.getId() == R.id.favoritelist) { menu.add(Menu.NONE, MENU_EDIT, MENU_EDIT, R.string.edit_favorite); menu.add(Menu.NONE, MENU_DELETE, MENU_DELETE, R.string.delete_favorite); } } @Override public boolean onContextItemSelected(MenuItem item) { AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo(); final BookmarkShort favorite = adapter.getItem(info.position); if (item.getItemId() == MENU_EDIT) { new AddEditFavoriteDialog(getActivity(), new AddEditFavoriteDialog.AddEditFavoriteDialogListener() { @Override public void onSave(String comment, String tags) { JsonObject updateData = new JsonObject(); updateData.addProperty("comment", comment); updateData.addProperty("tag_names", tags); favorite.comment = comment; favorite.tags = Arrays.asList(StringUtils.split(tags, ' ')); adapter.notifyDataSetChanged(); spiceManager.execute(new EditFavoriteRequest(prefs, getActivity().getApplication(), favorite.id, updateData), new RequestListener<BookmarkShort>() { @Override public void onRequestFailure(SpiceException spiceException) { AQUtility.report(spiceException); } @Override public void onRequestSuccess(BookmarkShort bookmarkShort) { Toast.makeText(getActivity(), R.string.edit_favorite_success, Toast.LENGTH_LONG).show(); } }); } }, prefs, favorite).show(); } else if (item.getItemId() == MENU_DELETE) { String favoriteId = favorite.id; spiceManager.execute(new DeleteFavoriteRequest(prefs, getActivity().getApplication(), favoriteId), new RequestListener<BookmarkShort>() { @Override public void onRequestFailure(SpiceException spiceException) { AQUtility.report(spiceException); } @Override public void onRequestSuccess(BookmarkShort bookmarkShort) { Toast.makeText(getActivity(), R.string.favorite_deleted, Toast.LENGTH_LONG).show(); adapter.remove(favorite); } }); return true; } return super.onContextItemSelected(item); } private void setSearchQuery(String newQuery) { if (!searchQuery.equals(newQuery)) { searchQuery = newQuery; loadData(1); } } private void setSearchOption(int position) { SearchOption newOption = SearchOption.values()[position]; if (searchOption != newOption) { searchOption = newOption; prefs.favoriteSearchOption().put(position); loadData(1); } } @Override public void onAttach(final Activity activity) { super.onAttach(activity); if (activity instanceof FavoritesFragmentListener) { listener = (FavoritesFragmentListener) activity; } else { throw new ClassCastException(activity.toString() + " must implement FavoritesFragmentListener"); } } @Override public void onDetach() { super.onDetach(); listener = null; } @OptionsItem(R.id.menu_refresh) public void menuRefresh() { super.menuRefresh(); } @Click(R.id.delete) public void onDeleteClicked() { query.setText(null); } protected void displayResult(final FavoritesResult result) { FragmentActivity activity = getActivity(); if (activity != null) { super.displayResult(result); activity.setTitle(R.string.my_favorites_title); } } @Override protected ListView getListView() { return favoritelist; } @Override protected YarrnAdapter<BookmarkShort> getAdapter() { return adapter; } @Override protected AbstractRavelryGetRequest<FavoritesResult> getRequest(int page) { return new ListFavoritesRequest(this.getActivity().getApplication(), prefs, page, PAGE_SIZE, searchQuery, searchOption); } @Override protected IRavelryActivity getRavelryActivity() { return listener; } }