package uk.co.imallan.tuchongdaily.ui.activity;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.SharedElementCallback;
import android.content.Intent;
import android.database.Cursor;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v4.view.ViewPager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.transition.Fade;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewTreeObserver;
import android.widget.ProgressBar;
import android.widget.Toast;
import com.crashlytics.android.Crashlytics;
import java.util.List;
import java.util.Map;
import io.fabric.sdk.android.Fabric;
import uk.co.imallan.tuchongdaily.BuildConfig;
import uk.co.imallan.tuchongdaily.R;
import uk.co.imallan.tuchongdaily.provider.PostProvider;
import uk.co.imallan.tuchongdaily.service.PostsService;
import uk.co.imallan.tuchongdaily.service.ServiceReceiver;
import uk.co.imallan.tuchongdaily.ui.adapter.PostImagesRecyclerViewAdapter;
import uk.co.imallan.tuchongdaily.ui.adapter.PostPagerAdapter;
import uk.co.imallan.tuchongdaily.ui.fragment.PostFragment;
public class MainActivity extends AbstractActivity
implements LoaderManager.LoaderCallbacks<Cursor>, ViewPager.OnPageChangeListener {
private static final int LOADER_POSTS = 1;
private ViewPager mPager;
private PostPagerAdapter mAdapter;
private long mLastBackClicked = 0;
private int mImagePosition = 0;
private boolean isReenterTransition = false;
private ProgressBar mProgressBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (!BuildConfig.DEBUG) {
Fabric.with(this, new Crashlytics());
}
setContentView(R.layout.activity_main);
initElements();
initTransitions();
setTitle(R.string.app_name);
PostsService.requestPosts(this, serviceReceiver, 20, 0);
getSupportLoaderManager().initLoader(LOADER_POSTS, null, this);
}
private void initElements() {
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
mPager = (ViewPager) findViewById(R.id.pager_main);
mAdapter = new PostPagerAdapter(getSupportFragmentManager());
mPager.setAdapter(mAdapter);
mPager.setOnPageChangeListener(this);
mProgressBar = (ProgressBar) findViewById(R.id.progress_bar_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu_share, menu);
inflater.inflate(R.menu.menu_browser, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
PostFragment postFragment;
switch (item.getItemId()) {
case R.id.action_share:
postFragment = getRegisteredFragment(mPager.getCurrentItem());
if (postFragment != null) {
postFragment.share();
}
return true;
case R.id.action_open_in_browser:
postFragment = getRegisteredFragment(mPager.getCurrentItem());
if (postFragment != null) {
postFragment.openInBrowser();
}
return true;
}
return super.onOptionsItemSelected(item);
}
private void initTransitions() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
setExitSharedElementCallback(new SharedElementCallback() {
@SuppressLint("NewApi")
@Override
public void onMapSharedElements(List<String> names, Map<String, View> sharedElements) {
super.onMapSharedElements(names, sharedElements);
if (!isReenterTransition) {
return;
}
isReenterTransition = false;
names.clear();
sharedElements.clear();
final PostFragment postFragment = (PostFragment) mAdapter.getRegisteredFragment(mPager.getCurrentItem());
final RecyclerView recyclerView = postFragment.mRecyclerView;
View sharedView =
((PostImagesRecyclerViewAdapter.ViewHolder) recyclerView.findViewHolderForPosition(mImagePosition)).getImage();
names.add(sharedView.getTransitionName());
sharedElements.put(sharedView.getTransitionName(), sharedView);
}
});
Fade fadeExit = new Fade();
fadeExit.addTarget(R.id.text_post_title);
fadeExit.addTarget(R.id.button_show_gallery);
fadeExit.addTarget(R.id.recycler_post_images);
fadeExit.addTarget(R.id.image_post_author);
fadeExit.addTarget(R.id.bottom_shadow_post);
fadeExit.addTarget(R.id.toolbar);
getWindow().setExitTransition(fadeExit);
}
}
@Override
boolean prepareServiceReceiver() {
return true;
}
@Override
public void onReceiveResult(int resultCode, Bundle resultData, Intent originalIntent, Bundle originalBundle) {
switch (resultCode) {
case ServiceReceiver.STATUS_DATA:
break;
case ServiceReceiver.STATUS_FINISHED:
getSupportLoaderManager().restartLoader(LOADER_POSTS, null, this);
break;
}
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
switch (id) {
case LOADER_POSTS:
return new CursorLoader(this, PostProvider.uriPosts(), null, null, null, null);
default:
return null;
}
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
switch (loader.getId()) {
case LOADER_POSTS:
mAdapter.swapCursor(data);
if (data.getCount() > 0) {
mProgressBar.setVisibility(View.GONE);
}
break;
}
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
}
private PostFragment getRegisteredFragment(int position) {
return (PostFragment) mAdapter.getRegisteredFragment(position);
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
PostFragment fromFragment = getRegisteredFragment(position);
if (fromFragment != null) {
fromFragment.onPageScrollFrom(positionOffset, positionOffsetPixels);
}
PostFragment toFragment = getRegisteredFragment(position + 1);
if (toFragment != null) {
toFragment.onPageScrollto(positionOffset, positionOffsetPixels);
}
}
@Override
public void onPageSelected(int position) {
PostFragment fragment = getRegisteredFragment(position);
if (fragment != null) {
fragment.onPageSelected();
}
}
@Override
public void onBackPressed() {
if (System.currentTimeMillis() - mLastBackClicked < 1000) {
super.onBackPressed();
} else {
Toast.makeText(this, R.string.double_click_to_exit, Toast.LENGTH_SHORT).show();
mLastBackClicked = System.currentTimeMillis();
}
}
@Override
public void onPageScrollStateChanged(int state) {
}
@Override
public void onActivityReenter(int resultCode, Intent data) {
super.onActivityReenter(resultCode, data);
if (resultCode == Activity.RESULT_OK) {
isReenterTransition = true;
mImagePosition = data.getIntExtra(ImagePagerActivity.EXTRA_IMAGE_POSITION, 0);
final PostFragment postFragment = (PostFragment) mAdapter.getRegisteredFragment(mPager.getCurrentItem());
postFragment.mRecyclerView.scrollToPosition(mImagePosition);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
postponeEnterTransition();
postFragment.mRecyclerView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@SuppressLint("NewApi")
@Override
public boolean onPreDraw() {
postFragment.mRecyclerView.getViewTreeObserver().removeOnPreDrawListener(this);
postFragment.mRecyclerView.requestLayout();
startPostponedEnterTransition();
return true;
}
});
}
}
}
}