package com.piusvelte.sonet.fragment; import android.appwidget.AppWidgetManager; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.design.widget.FloatingActionButton; 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.text.TextUtils; 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.ImageView; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import com.piusvelte.sonet.R; import com.piusvelte.sonet.SonetComments; import com.piusvelte.sonet.SonetCreatePost; import com.piusvelte.sonet.SonetService; import com.piusvelte.sonet.provider.StatusLinks; import com.piusvelte.sonet.provider.StatusesStyles; import com.piusvelte.sonet.social.Client; import com.piusvelte.sonet.util.CircleTransformation; import com.squareup.picasso.Picasso; import static com.piusvelte.sonet.Sonet.ACTION_REFRESH; /** * Created by bemmanuel on 3/21/15. */ public class Feed extends ListFragment implements LoaderManager.LoaderCallbacks<Cursor>, View.OnClickListener { private static final int LOADER_FEED = 0; private SimpleCursorAdapter mAdapter; private FloatingActionButton mFloatingActionButton; 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); mFloatingActionButton = (FloatingActionButton) view.findViewById(R.id.fab); mFloatingActionButton.setOnClickListener(this); mLoadingView = view.findViewById(R.id.loading); mAdapter = new SimpleCursorAdapter(getActivity(), R.layout.widget_item, null, new String[] { StatusesStyles.FRIEND, StatusesStyles.MESSAGE, StatusesStyles.CREATEDTEXT, StatusesStyles.PROFILE_URL, StatusesStyles.SERVICE, StatusesStyles.IMAGE_URL }, new int[] { R.id.friend, R.id.message, R.id.created, R.id.profile, R.id.icon, R.id.image }, 0); mAdapter.setViewBinder(new WidgetsViewBinder(getActivity())); setListAdapter(mAdapter); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); setHasOptionsMenu(true); mLoadingView.setVisibility(View.VISIBLE); getLoaderManager().initLoader(LOADER_FEED, null, this); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); inflater.inflate(R.menu.menu_feed, menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.menu_refresh: Toast.makeText(getActivity(), R.string.refreshing, Toast.LENGTH_LONG).show(); getActivity().startService(new Intent(getActivity(), SonetService.class) .putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID) .setAction(ACTION_REFRESH)); return true; default: return super.onOptionsItemSelected(item); } } @Override public void onResume() { super.onResume(); setFABVisibility(); } @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (isResumed() && !isRemoving()) { setFABVisibility(); } } private void setFABVisibility() { if (getUserVisibleHint()) { if (mFloatingActionButton.getVisibility() != View.VISIBLE) { mFloatingActionButton.setTranslationY(getResources().getDimension(R.dimen.fab_animation_height)); mFloatingActionButton.setVisibility(View.VISIBLE); mFloatingActionButton.animate() .translationY(0) .setDuration(getResources().getInteger(android.R.integer.config_shortAnimTime)) .start(); } } else if (mFloatingActionButton.getVisibility() == View.VISIBLE) { mFloatingActionButton.setVisibility(View.GONE); } } @Override public void onDestroyView() { mLoadingView.setVisibility(View.GONE); super.onDestroyView(); } @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { switch (id) { case LOADER_FEED: return new CursorLoader(getActivity(), StatusesStyles.getContentUri(getActivity()), new String[] { StatusesStyles._ID, StatusesStyles.FRIEND, StatusesStyles.PROFILE_URL, StatusesStyles.MESSAGE, StatusesStyles.CREATEDTEXT, StatusesStyles.SERVICE, StatusesStyles.IMAGE_URL }, StatusesStyles.WIDGET + "=?", new String[] { Integer.toString(AppWidgetManager.INVALID_APPWIDGET_ID) }, StatusesStyles.CREATED + " desc"); default: return null; } } @Override public void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); startActivity(new Intent(getActivity(), SonetComments.class) .putExtra(StatusLinks.STATUS_ID, Long.toString(id))); } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) { switch (loader.getId()) { case LOADER_FEED: mLoadingView.setVisibility(View.GONE); mAdapter.changeCursor(cursor); break; } } @Override public void onLoaderReset(Loader<Cursor> loader) { switch (loader.getId()) { case LOADER_FEED: mAdapter.changeCursor(null); break; } } @Override public void onClick(View v) { if (v == mFloatingActionButton) { startActivity(new Intent(getActivity(), SonetCreatePost.class)); } } private static class WidgetsViewBinder implements SimpleCursorAdapter.ViewBinder { private Picasso mPicasso; private CircleTransformation mCircleTransformation; WidgetsViewBinder(@NonNull Context context) { mPicasso = Picasso.with(context); mCircleTransformation = new CircleTransformation(); } @Override public boolean setViewValue(View view, Cursor cursor, int columnIndex) { if (columnIndex == cursor.getColumnIndex(StatusesStyles.PROFILE_URL)) { String profileUrl = cursor.getString(columnIndex); if (TextUtils.isEmpty(profileUrl)) { mPicasso.load(R.drawable.ic_account_box_grey600_48dp) .transform(mCircleTransformation) .into((ImageView) view); } else { mPicasso.load(cursor.getString(columnIndex)) .transform(mCircleTransformation) .into((ImageView) view); } return true; } else if (columnIndex == cursor.getColumnIndex(StatusesStyles.FRIEND)) { ((TextView) view).setText(cursor.getString(columnIndex)); return true; } else if (columnIndex == cursor.getColumnIndex(StatusesStyles.CREATEDTEXT)) { ((TextView) view).setText(cursor.getString(columnIndex)); return true; } else if (columnIndex == cursor.getColumnIndex(StatusesStyles.MESSAGE)) { ((TextView) view).setText(cursor.getString(columnIndex)); return true; } else if (columnIndex == cursor.getColumnIndex(StatusesStyles.SERVICE)) { ((ImageView) view).setImageResource(Client.Network.get(cursor.getInt(columnIndex)).getIcon()); return true; } else if (columnIndex == cursor.getColumnIndex(StatusesStyles.IMAGE_URL)) { String imageUrl = cursor.getString(columnIndex); if (!TextUtils.isEmpty(imageUrl)) { view.setVisibility(View.VISIBLE); mPicasso.load(imageUrl).into((ImageView) view); } else { view.setVisibility(View.GONE); } return true; } else { return false; } } } }