Java tutorial
/* * PinDroid - http://code.google.com/p/PinDroid/ * * Copyright (C) 2010 Matt Schmidt * * PinDroid is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published * by the Free Software Foundation; either version 3 of the License, * or (at your option) any later version. * * PinDroid is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PinDroid; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ package com.pindroid.fragment; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.database.Cursor; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.ListFragment; import android.support.v4.app.LoaderManager; import android.support.v4.content.Loader; import android.support.v4.content.LocalBroadcastManager; import android.support.v4.widget.SimpleCursorAdapter; import android.support.v4.widget.SwipeRefreshLayout; import android.text.TextUtils; import android.util.Log; import android.view.ContextMenu; import android.view.ContextMenu.ContextMenuInfo; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.View.OnCreateContextMenuListener; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.AdapterContextMenuInfo; import android.widget.AdapterView.OnItemClickListener; import android.widget.Button; import android.widget.ListView; import com.melnykov.fab.FloatingActionButton; import com.pindroid.Constants.BookmarkViewType; import com.pindroid.R; import com.pindroid.listadapter.BookmarkViewBinder; import com.pindroid.platform.BookmarkManager; import com.pindroid.providers.BookmarkContent.Bookmark; import com.pindroid.syncadapter.BookmarkSyncAdapter; import com.pindroid.util.SettingsHelper; import com.pindroid.util.SyncUtils; import java.lang.ref.WeakReference; public class BrowseBookmarksFragment extends ListFragment implements LoaderManager.LoaderCallbacks<Cursor>, BookmarkBrowser, PindroidFragment, SwipeRefreshLayout.OnRefreshListener { private ListView listView; private SwipeRefreshLayout swipeRefreshLayout; private FloatingActionButton actionButton; private SimpleCursorAdapter mAdapter; private String sortfield = Bookmark.Time + " DESC"; @Nullable private String username = null; @Nullable private String tagname = null; private boolean unread = false; private boolean untagged = false; private String query = null; ListView lv; private static final String STATE_USERNAME = "username"; private static final String STATE_TAGNAME = "tagname"; private OnBookmarkSelectedListener bookmarkSelectedListener; public interface OnBookmarkSelectedListener { public void onBookmarkSelected(Bookmark b, BookmarkViewType type); public void onBookmarkAdd(Bookmark b); public void onBookmarkShare(Bookmark b); public void onBookmarkMark(Bookmark b); public void onBookmarkDelete(Bookmark b); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRetainInstance(false); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); listView = (ListView) getView().findViewById(android.R.id.list); swipeRefreshLayout = (SwipeRefreshLayout) getView().findViewById(R.id.swipe_refresh); swipeRefreshLayout.setOnRefreshListener(this); actionButton = (FloatingActionButton) getView().findViewById(R.id.add_button); actionButton.attachToListView(listView); if (savedInstanceState != null) { username = savedInstanceState.getString(STATE_USERNAME); tagname = savedInstanceState.getString(STATE_TAGNAME); } setHasOptionsMenu(true); mAdapter = new SimpleCursorAdapter(getActivity(), R.layout.bookmark_view, null, new String[] { Bookmark.Description, Bookmark.Tags, Bookmark.ToRead, Bookmark.Shared, Bookmark.Synced }, new int[] { R.id.bookmark_description, R.id.bookmark_tags, R.id.bookmark_unread, R.id.bookmark_private, R.id.bookmark_synced }, 0); setListAdapter(mAdapter); mAdapter.setViewBinder(new BookmarkViewBinder()); if (username != null) { getLoaderManager().initLoader(0, null, this); lv = getListView(); lv.setTextFilterEnabled(true); lv.setFastScrollEnabled(true); lv.setItemsCanFocus(false); lv.setChoiceMode(ListView.CHOICE_MODE_SINGLE); lv.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { final Cursor c = (Cursor) lv.getItemAtPosition(position); Bookmark b = BookmarkManager.CursorToBookmark(c); String defaultAction = SettingsHelper.getDefaultAction(getActivity()); if (defaultAction.equals("view")) { viewBookmark(b); } else if (defaultAction.equals("read")) { readBookmark(b); } else if (defaultAction.equals("edit")) { editBookmark(b); } else { openBookmarkInBrowser(b); } } }); /* Add Context-Menu listener to the ListView. */ lv.setOnCreateContextMenuListener(new OnCreateContextMenuListener() { public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { menu.setHeaderTitle("Actions"); MenuInflater inflater = getActivity().getMenuInflater(); inflater.inflate(R.menu.browse_bookmark_context_menu_self, menu); } }); actionButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { bookmarkSelectedListener.onBookmarkAdd(null); } }); } } public void setQuery(String username, String tagname, @Nullable String feed) { this.username = username; this.tagname = tagname; this.unread = "unread".equals(feed); this.untagged = "untagged".equals(feed); } public void setSearchQuery(String query, String username, String tagname, boolean unread) { this.query = query; this.username = username; this.tagname = tagname; this.unread = unread; } public void setUsername(String username) { this.username = username; } public void refresh() { try { getLoaderManager().restartLoader(0, null, this); } catch (Exception e) { } } @Override public void onResume() { super.onResume(); if (query != null) { if (unread) { getActivity().setTitle(getString(R.string.unread_search_results_title, query)); } else { getActivity().setTitle(getString(R.string.bookmark_search_results_title, query)); } // TODO untagged search result } else { if (unread && !TextUtils.isEmpty(tagname)) { getActivity().setTitle(getString(R.string.browse_my_unread_bookmarks_tagged_title, tagname)); } else if (unread && TextUtils.isEmpty(tagname)) { getActivity().setTitle(getString(R.string.browse_my_unread_bookmarks_title)); } else if (untagged && TextUtils.isEmpty(tagname)) { getActivity().setTitle(getString(R.string.browse_my_untagged_bookmarks_title)); } else if (!TextUtils.isEmpty(tagname)) { getActivity().setTitle(getString(R.string.browse_my_bookmarks_tagged_title, tagname)); } else { getActivity().setTitle(getString(R.string.browse_my_bookmarks_title)); } } } @Override public void onSaveInstanceState(Bundle savedInstanceState) { savedInstanceState.putString(STATE_USERNAME, username); savedInstanceState.putString(STATE_TAGNAME, tagname); super.onSaveInstanceState(savedInstanceState); } @Override public boolean onContextItemSelected(MenuItem aItem) { AdapterContextMenuInfo menuInfo = (AdapterContextMenuInfo) aItem.getMenuInfo(); final Cursor c = (Cursor) lv.getItemAtPosition(menuInfo.position); Bookmark b = BookmarkManager.CursorToBookmark(c); switch (aItem.getItemId()) { case R.id.menu_bookmark_context_open: openBookmarkInBrowser(b); return true; case R.id.menu_bookmark_context_view: viewBookmark(b); return true; case R.id.menu_bookmark_context_edit: bookmarkSelectedListener.onBookmarkSelected(b, BookmarkViewType.EDIT); return true; case R.id.menu_bookmark_context_delete: bookmarkSelectedListener.onBookmarkDelete(b); return true; case R.id.menu_bookmark_context_share: Log.d("share", "browse"); bookmarkSelectedListener.onBookmarkShare(b); return true; case R.id.menu_bookmark_context_read: readBookmark(b); return true; case R.id.menu_bookmark_context_markread: markBookmark(b); return true; } return false; } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); inflater.inflate(R.menu.browse_bookmark_menu, menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { boolean result = false; switch (item.getItemId()) { case R.id.menu_bookmark_sort_date_asc: sortfield = Bookmark.Time + " ASC"; result = true; break; case R.id.menu_bookmark_sort_date_desc: sortfield = Bookmark.Time + " DESC"; result = true; break; case R.id.menu_bookmark_sort_description_asc: sortfield = Bookmark.Description + " ASC"; result = true; break; case R.id.menu_bookmark_sort_description_desc: sortfield = Bookmark.Description + " DESC"; result = true; break; case R.id.menu_bookmark_sort_url_asc: sortfield = Bookmark.Url + " ASC"; result = true; break; case R.id.menu_bookmark_sort_url_desc: sortfield = Bookmark.Url + " DESC"; result = true; break; } if (result) { refresh(); } else result = super.onOptionsItemSelected(item); return result; } private void openBookmarkInBrowser(Bookmark b) { bookmarkSelectedListener.onBookmarkSelected(b, BookmarkViewType.WEB); } private void readBookmark(Bookmark b) { bookmarkSelectedListener.onBookmarkSelected(b, BookmarkViewType.READ); } private void markBookmark(Bookmark b) { bookmarkSelectedListener.onBookmarkMark(b); } private void viewBookmark(Bookmark b) { bookmarkSelectedListener.onBookmarkSelected(b, BookmarkViewType.VIEW); } private void editBookmark(Bookmark b) { bookmarkSelectedListener.onBookmarkSelected(b, BookmarkViewType.EDIT); } public Loader<Cursor> onCreateLoader(int id, Bundle args) { if (query != null) { return BookmarkManager.SearchBookmarks(query, tagname, unread, username, getActivity()); } else { return BookmarkManager.GetBookmarks(username, tagname, unread, untagged, sortfield, getActivity()); } } public void onLoadFinished(Loader<Cursor> loader, Cursor data) { mAdapter.swapCursor(data); } public void onLoaderReset(Loader<Cursor> loader) { mAdapter.swapCursor(null); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.browse_bookmark_fragment, container, false); } @Override public void onAttach(Activity activity) { super.onAttach(activity); try { bookmarkSelectedListener = (OnBookmarkSelectedListener) activity; } catch (ClassCastException e) { throw new ClassCastException(activity.toString() + " must implement OnBookmarkSelectedListener"); } } @Override public void onRefresh() { swipeRefreshLayout.setRefreshing(true); SyncFinishedBroadcastReceiver.registerCallback(this); SyncUtils.requestSync(getActivity()); } /* Callback for bookmarks sync status */ private static class SyncFinishedBroadcastReceiver extends BroadcastReceiver { @NonNull private final WeakReference<BrowseBookmarksFragment> fragmentRef; private SyncFinishedBroadcastReceiver(@NonNull BrowseBookmarksFragment fragment) { fragmentRef = new WeakReference<>(fragment); } @Override public void onReceive(Context context, Intent intent) { LocalBroadcastManager.getInstance(context).unregisterReceiver(this); BrowseBookmarksFragment fragment = fragmentRef.get(); if (fragment != null) { fragment.swipeRefreshLayout.setRefreshing(false); } } static void registerCallback(@NonNull BrowseBookmarksFragment fragment) { IntentFilter filter = new IntentFilter(BookmarkSyncAdapter.SYNC_FINISHED_ACTION); LocalBroadcastManager.getInstance(fragment.getActivity()) .registerReceiver(new SyncFinishedBroadcastReceiver(fragment), filter); } } }