package com.piusvelte.sonet.fragment; import android.content.Intent; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.support.v4.app.ListFragment; import android.support.v4.app.LoaderManager; import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; import android.support.v4.widget.SimpleCursorAdapter; import android.view.ContextMenu; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ListView; import com.piusvelte.sonet.R; import com.piusvelte.sonet.SonetComments; import com.piusvelte.sonet.provider.Notifications; import com.piusvelte.sonet.service.ClearNotificationsService; import com.piusvelte.sonet.service.LoadNotificationsService; import static com.piusvelte.sonet.Sonet.RESULT_REFRESH; /** * Created by bemmanuel on 3/21/15. */ public class NotificationsList extends ListFragment implements LoaderManager.LoaderCallbacks<Cursor> { private static final int LOADER_NOTIFICATIONS = 0; private static final int CLEAR = 1; private SimpleCursorAdapter mAdapter; private View mLoadingView; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.loading_list, container, false); } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); mLoadingView = view.findViewById(R.id.loading); mAdapter = new SimpleCursorAdapter(getActivity(), R.layout.notifications_row, null, new String[] { Notifications.CLEARED, Notifications.NOTIFICATION }, new int[] { R.id.notification, R.id.notification }, 0); mAdapter.setViewBinder(new NotificationsViewBinder()); registerForContextMenu(getListView()); setListAdapter(mAdapter); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); setHasOptionsMenu(true); mLoadingView.setVisibility(View.VISIBLE); getLoaderManager().initLoader(LOADER_NOTIFICATIONS, null, this); } @Override public void onListItemClick(ListView list, final View view, int position, final long id) { super.onListItemClick(list, view, position, id); // load SonetComments.java, the notification will be clear there startActivityForResult( new Intent(getActivity(), SonetComments.class) .setData(Uri.withAppendedPath(Notifications.getContentUri(getActivity()), Long.toString(id))), RESULT_REFRESH); } @Override public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, view, menuInfo); // create clearing option menu.add(0, CLEAR, 0, R.string.clear); } @Override public boolean onContextItemSelected(final MenuItem item) { switch (item.getItemId()) { case CLEAR: getActivity().startService(ClearNotificationsService.obtainIntent(getActivity(), ((AdapterView.AdapterContextMenuInfo) item.getMenuInfo()).id)); return true; default: return super.onContextItemSelected(item); } } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); inflater.inflate(R.menu.menu_notifications, menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.menu_notifications_refresh: getActivity().startService(new Intent(getActivity(), LoadNotificationsService.class)); return true; case R.id.menu_notifications_clear_all: getActivity().startService(ClearNotificationsService.obtainIntent(getActivity())); return true; default: return super.onOptionsItemSelected(item); } } @Override public void onDestroyView() { mLoadingView.setVisibility(View.GONE); super.onDestroyView(); } @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { switch (id) { case LOADER_NOTIFICATIONS: return new CursorLoader(getActivity(), Notifications.getContentUri(getActivity()), new String[] { Notifications._ID, Notifications.CLEARED, Notifications.NOTIFICATION }, Notifications.CLEARED + "!=1", null, null); default: return null; } } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor data) { switch (loader.getId()) { case LOADER_NOTIFICATIONS: mLoadingView.setVisibility(View.GONE); mAdapter.changeCursor(data); break; } } @Override public void onLoaderReset(Loader<Cursor> loader) { switch (loader.getId()) { case LOADER_NOTIFICATIONS: mAdapter.changeCursor(null); break; } } private static class NotificationsViewBinder implements SimpleCursorAdapter.ViewBinder { @Override public boolean setViewValue(View view, Cursor cursor, int columnIndex) { if (columnIndex == cursor.getColumnIndex(Notifications.CLEARED)) { view.setEnabled(cursor.getInt(columnIndex) != 1); return true; } else { return false; } } } }