package uk.co.imallan.tuchongdaily.ui.fragment; import android.animation.ValueAnimator; import android.content.Intent; import android.content.res.Configuration; import android.database.Cursor; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.LoaderManager; import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import com.squareup.picasso.Picasso; import uk.co.imallan.tuchongdaily.R; import uk.co.imallan.tuchongdaily.db.Table; import uk.co.imallan.tuchongdaily.provider.ImageProvider; import uk.co.imallan.tuchongdaily.provider.PostProvider; import uk.co.imallan.tuchongdaily.ui.adapter.PostImagesRecyclerViewAdapter; import uk.co.imallan.tuchongdaily.utils.ImageUtils; /** * Created by allan on 15/2/25. */ public class PostFragment extends AbstractFragment implements LoaderManager.LoaderCallbacks<Cursor>, View.OnClickListener { public static final String POST_SERVER_ID = "POST_SERVER_ID"; private static final int LOADER_POST = 1; private static final int LOADER_POST_IMAGES = 2; private String mServerId; private View mRootView; private View mPostInfoContainer; private TextView mTitleTextView; private ImageView mImage; public RecyclerView mRecyclerView; public PostImagesRecyclerViewAdapter mAdapter; private View mGalleryButton; private boolean isGalleryShown = false; private long mLastClickTimestamp = 0; private boolean isSingleImagePost = false; private String mTitleStr; private String mPostURL; private String mImageUrl; private String mCameraInfo; private String mLensInfo; private ImageView mAuthorImage; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Bundle arguments = getArguments(); mServerId = arguments.getString(POST_SERVER_ID); } @Override protected boolean prepareServiceReceiver() { return false; } @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { mRootView = inflater.inflate(R.layout.fragment_post, container, false); initElements(); initTransitions(); return mRootView; } private void initElements() { mTitleTextView = (TextView) mRootView.findViewById(R.id.text_post_title); mRecyclerView = (RecyclerView) mRootView.findViewById(R.id.recycler_post_images); mImage = (ImageView) mRootView.findViewById(R.id.image_post); mPostInfoContainer = mRootView.findViewById(R.id.container_post_info); mGalleryButton = mRootView.findViewById(R.id.button_show_gallery); mAuthorImage = (ImageView) mRootView.findViewById(R.id.image_post_author); } private void initTransitions() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { } } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); mGalleryButton.setOnClickListener(this); mImage.setOnClickListener(this); mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false)); mAdapter = new PostImagesRecyclerViewAdapter(getActivity()); mRecyclerView.setAdapter(mAdapter); getLoaderManager().initLoader(LOADER_POST_IMAGES, null, this); getLoaderManager().initLoader(LOADER_POST, null, this); } @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { switch (id) { case LOADER_POST_IMAGES: return new CursorLoader(getActivity(), ImageProvider.uriPostImages(mServerId), null, null, null, null); case LOADER_POST: return new CursorLoader(getActivity(), PostProvider.uriPost(mServerId), null, null, null, null); default: return null; } } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor data) { switch (loader.getId()) { case LOADER_POST_IMAGES: boolean isImageSet = false; for (int i = 0; i < data.getCount(); i++) { if (data.moveToPosition(i)) { final int width = data.getInt(data.getColumnIndex(Table.Image.COLUMN_WIDTH)); final int height = data.getInt(data.getColumnIndex(Table.Image.COLUMN_HEIGHT)); if (width < height) { //portrait mode setPosterImage(data, i); isImageSet = true; break; } } } if (!isImageSet) { setPosterImage(data, 0); } mGalleryButton.setVisibility(View.VISIBLE); isSingleImagePost = false; mAdapter.swapCursor(data); break; case LOADER_POST: if (data.moveToPosition(0)) { mTitleStr = data.getString(data.getColumnIndex(Table.Post.COLUMN_TITLE)); mTitleTextView.setText(mTitleStr); Picasso.with(getActivity()) .load(data.getString(data.getColumnIndex(Table.Author.COLUMN_ICON))) .fit() .centerCrop() .into(mAuthorImage); mPostURL = data.getString(data.getColumnIndex(Table.Post.COLUMN_URL)); } break; } } private void setPosterImage(Cursor data, int position) { if (data != null && data.moveToPosition(position)) { final String url = data.getString(data.getColumnIndex(Table.Image.COLUMN_URL_FULL)); this.mImageUrl = url; Picasso.with(getActivity()).load(url) .transform(new ImageUtils.LimitImageSizeTransformation(ImageUtils.LimitImageSizeTransformation.QUALITY.QUALITY_1440P)) .fit().centerCrop() .into(mImage); mCameraInfo = data.getString(data.getColumnIndex(Table.Image.COLUMN_CAMERA)); mLensInfo = data.getString(data.getColumnIndex(Table.Image.COLUMN_LENS)); } } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); if (!TextUtils.isEmpty(mImageUrl)) { Picasso.with(getActivity()).load(mImageUrl) .transform(new ImageUtils.LimitImageSizeTransformation(ImageUtils.LimitImageSizeTransformation.QUALITY.QUALITY_1440P)) .fit().centerCrop() .into(mImage); } } private void toggleGalleryRecyclerView() { if (isGalleryShown) { ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, mRecyclerView.getHeight()); valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { mPostInfoContainer.setTranslationY((Float) animation.getAnimatedValue()); } }); valueAnimator.start(); isGalleryShown = false; } else { ValueAnimator valueAnimator = ValueAnimator.ofFloat(mRecyclerView.getHeight(), 0); valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { mPostInfoContainer.setTranslationY((Float) animation.getAnimatedValue()); } }); valueAnimator.start(); isGalleryShown = true; } } @Override public void onLoaderReset(Loader<Cursor> loader) { } public void onPageScrollFrom(float positionOffset, int positionOffsetPixels) { mImage.setTranslationX(positionOffsetPixels / 1.2f); } public void onPageScrollto(float positionOffset, int positionOffsetPixels) { mImage.setTranslationX((positionOffsetPixels - mImage.getWidth()) / 1.2f); } public void onPageSelected() { mImage.setTranslationX(0); } @Override public void onClick(View v) { //prevent multiple clicks if (System.currentTimeMillis() - mLastClickTimestamp <= 500) { return; } else { mLastClickTimestamp = System.currentTimeMillis(); } switch (v.getId()) { case R.id.image_post: toggleGalleryRecyclerView(); break; case R.id.button_show_gallery: toggleGalleryRecyclerView(); break; } } public void share() { if (!TextUtils.isEmpty(mPostURL)) { Intent sendIntent = new Intent(); sendIntent.setAction(Intent.ACTION_SEND); sendIntent.putExtra(Intent.EXTRA_TEXT, mTitleStr + " " + mPostURL); sendIntent.setType("text/plain"); startActivity(Intent.createChooser(sendIntent, getResources().getString(R.string.action_share))); } } public void openInBrowser() { if (!TextUtils.isEmpty(mPostURL)) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse(mPostURL)); startActivity(intent); } } }