package org.getlantern.firetweet.fragment.support; import android.content.Context; import android.graphics.Rect; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.LoaderManager.LoaderCallbacks; import android.support.v4.content.Loader; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView.Adapter; import android.support.v7.widget.RecyclerView.OnScrollListener; import android.support.v7.widget.RecyclerView.ViewHolder; import android.support.v7.widget.StaggeredGridLayoutManager; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import org.getlantern.firetweet.R; import org.getlantern.firetweet.app.FiretweetApplication; import org.getlantern.firetweet.loader.support.MediaTimelineLoader; import org.getlantern.firetweet.model.ParcelableMedia; import org.getlantern.firetweet.model.ParcelableStatus; import org.getlantern.firetweet.util.ImageLoadingHandler; import org.getlantern.firetweet.util.MediaLoaderWrapper; import org.getlantern.firetweet.util.SimpleDrawerCallback; import org.getlantern.firetweet.view.HeaderDrawerLayout.DrawerCallback; import org.getlantern.firetweet.view.MediaSizeImageView; import java.util.List; /** * Created by mariotaku on 14/11/5. */ public class UserMediaTimelineFragment extends BaseSupportFragment implements LoaderCallbacks<List<ParcelableStatus>>, DrawerCallback { private View mProgressContainer; private RecyclerView mRecyclerView; private MediaTimelineAdapter mAdapter; @Override public void fling(float velocity) { mDrawerCallback.fling(velocity); } @Override public void scrollBy(float dy) { mDrawerCallback.scrollBy(dy); } @Override public boolean shouldLayoutHeaderBottom() { return mDrawerCallback.shouldLayoutHeaderBottom(); } @Override public boolean canScroll(float dy) { return mDrawerCallback.canScroll(dy); } @Override public boolean isScrollContent(float x, float y) { return mDrawerCallback.isScrollContent(x, y); } @Override public void cancelTouch() { mDrawerCallback.cancelTouch(); } @Override public void topChanged(int offset) { mDrawerCallback.topChanged(offset); } private SimpleDrawerCallback mDrawerCallback; private OnScrollListener mOnScrollListener = new OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { } }; @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); final View view = getView(); if (view == null) throw new AssertionError(); final Context context = view.getContext(); mAdapter = new MediaTimelineAdapter(context); final StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL); mDrawerCallback = new SimpleDrawerCallback(mRecyclerView); mRecyclerView.setLayoutManager(layoutManager); mRecyclerView.setAdapter(mAdapter); mRecyclerView.setOnScrollListener(mOnScrollListener); getLoaderManager().initLoader(0, getArguments(), this); setListShown(false); } public void setListShown(boolean shown) { mRecyclerView.setVisibility(shown ? View.VISIBLE : View.GONE); mProgressContainer.setVisibility(shown ? View.GONE : View.VISIBLE); } public int getStatuses(final long maxId, final long sinceId) { final Bundle args = new Bundle(getArguments()); args.putLong(EXTRA_MAX_ID, maxId); args.putLong(EXTRA_SINCE_ID, sinceId); getLoaderManager().restartLoader(0, args, this); return -1; } @Override public void onBaseViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onBaseViewCreated(view, savedInstanceState); mProgressContainer = view.findViewById(R.id.progress_container); mRecyclerView = (RecyclerView) view.findViewById(R.id.recycler_view); } @Override protected void fitSystemWindows(Rect insets) { super.fitSystemWindows(insets); if (mRecyclerView != null) { mRecyclerView.setClipToPadding(false); mRecyclerView.setPadding(insets.left, insets.top, insets.right, insets.bottom); } } @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_recycler_view, container, false); } @Override public Loader<List<ParcelableStatus>> onCreateLoader(int id, Bundle args) { final Context context = getActivity(); final long accountId = args.getLong(EXTRA_ACCOUNT_ID, -1); final long maxId = args.getLong(EXTRA_MAX_ID, -1); final long sinceId = args.getLong(EXTRA_SINCE_ID, -1); final long userId = args.getLong(EXTRA_USER_ID, -1); final String screenName = args.getString(EXTRA_SCREEN_NAME); final int tabPosition = args.getInt(EXTRA_TAB_POSITION, -1); return new MediaTimelineLoader(context, accountId, userId, screenName, sinceId, maxId, null, null, tabPosition, true); } @Override public void onLoadFinished(Loader<List<ParcelableStatus>> loader, List<ParcelableStatus> data) { mAdapter.setData(data); setListShown(true); } @Override public void onLoaderReset(Loader<List<ParcelableStatus>> loader) { mAdapter.setData(null); } private static class MediaTimelineAdapter extends Adapter<MediaTimelineViewHolder> { private final LayoutInflater mInflater; private final MediaLoaderWrapper mImageLoader; private final ImageLoadingHandler mLoadingHandler; private List<ParcelableStatus> mData; MediaTimelineAdapter(Context context) { mInflater = LayoutInflater.from(context); mImageLoader = FiretweetApplication.getInstance(context).getMediaLoaderWrapper(); mLoadingHandler = new ImageLoadingHandler(R.id.media_image_progress); } @Override public MediaTimelineViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { final View view = mInflater.inflate(R.layout.adapter_item_media_status, parent, false); return new MediaTimelineViewHolder(view); } @Override public void onBindViewHolder(MediaTimelineViewHolder holder, int position) { if (mData == null) return; holder.setMedia(mImageLoader, mLoadingHandler, mData.get(position)); } public void setData(List<ParcelableStatus> data) { mData = data; notifyDataSetChanged(); } @Override public int getItemCount() { if (mData == null) return 0; return mData.size(); } } private static class MediaTimelineViewHolder extends ViewHolder { private final MediaSizeImageView mediaImageView; private final ImageView mediaProfileImageView; private final TextView mediaTextView; public MediaTimelineViewHolder(View itemView) { super(itemView); mediaImageView = (MediaSizeImageView) itemView.findViewById(R.id.media_image); mediaProfileImageView = (ImageView) itemView.findViewById(R.id.media_profile_image); mediaTextView = (TextView) itemView.findViewById(R.id.media_text); } public void setMedia(MediaLoaderWrapper loader, ImageLoadingHandler loadingHandler, ParcelableStatus status) { final ParcelableMedia[] media = status.media; if (media == null || media.length < 1) return; final ParcelableMedia firstMedia = media[0]; if (status.text_plain.codePointCount(0, status.text_plain.length()) == firstMedia.end) { mediaTextView.setText(status.text_unescaped.substring(0, firstMedia.start)); } else { mediaTextView.setText(status.text_unescaped); } loader.displayProfileImage(mediaProfileImageView, status.user_profile_image_url); mediaImageView.setMediaSize(firstMedia.width, firstMedia.height); loader.displayPreviewImageWithCredentials(mediaImageView, firstMedia.media_url, status.account_id, loadingHandler); } } }