package com.jparkie.aizoban.views.activities; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.content.Context; import android.content.Intent; import android.content.pm.ActivityInfo; import android.graphics.PorterDuff; import android.os.Build; import android.os.Bundle; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.support.v7.widget.Toolbar; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.WindowManager; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; import com.jparkie.aizoban.R; import com.jparkie.aizoban.presenters.ChapterPresenter; import com.jparkie.aizoban.presenters.ChapterPresenterOfflineImpl; import com.jparkie.aizoban.presenters.ChapterPresenterOnlineImpl; import com.jparkie.aizoban.presenters.mapper.ChapterMapper; import com.jparkie.aizoban.utils.wrappers.RequestWrapper; import com.jparkie.aizoban.views.ChapterView; import com.jparkie.aizoban.views.widgets.GestureViewPager; import com.melnykov.fab.FloatingActionButton; import java.util.concurrent.TimeUnit; import rx.Observable; import rx.Subscriber; import rx.android.schedulers.AndroidSchedulers; import rx.functions.Action1; import rx.functions.Func1; public class ChapterActivity extends BaseActivity implements ChapterView, ChapterMapper { public static final String TAG = ChapterActivity.class.getSimpleName(); public static final String PRESENTER_ARGUMENT_KEY = TAG + ":" + "PresenterArgumentKey"; public static final String REQUEST_ARGUMENT_KEY = TAG + ":" + "RequestArgumentKey"; public static final String POSITION_ARGUMENT_KEY = TAG + ":" + "PositionArgumentKey"; private ChapterPresenter mChapterPresenter; private Toolbar mToolbar; private MenuItem mDirectionMenuItem; private MenuItem mOrientationMenuItem; private MenuItem mZoomMenuItem; private GestureViewPager mViewPager; private RelativeLayout mEmptyRelativeLayout; private FloatingActionButton mPreviousButton; private FloatingActionButton mNextButton; private TextView mPageNumberView; private boolean mSystemUIVisibility; public static Intent constructOnlineChapterActivityIntent(Context context, RequestWrapper chapterRequest, int position) { Intent argumentIntent = new Intent(context, ChapterActivity.class); argumentIntent.putExtra(PRESENTER_ARGUMENT_KEY, ChapterPresenterOnlineImpl.TAG); argumentIntent.putExtra(REQUEST_ARGUMENT_KEY, chapterRequest); argumentIntent.putExtra(POSITION_ARGUMENT_KEY, position); return argumentIntent; } public static Intent constructOfflineChapterActivityIntent(Context context, RequestWrapper chapterRequest, int position) { Intent argumentIntent = new Intent(context, ChapterActivity.class); argumentIntent.putExtra(PRESENTER_ARGUMENT_KEY, ChapterPresenterOfflineImpl.TAG); argumentIntent.putExtra(REQUEST_ARGUMENT_KEY, chapterRequest); argumentIntent.putExtra(POSITION_ARGUMENT_KEY, position); return argumentIntent; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Intent intent = getIntent(); if (intent != null) { if (intent.hasExtra(PRESENTER_ARGUMENT_KEY)) { String presenterType = intent.getStringExtra(PRESENTER_ARGUMENT_KEY); if (presenterType.equals(ChapterPresenterOnlineImpl.TAG)) { mChapterPresenter = new ChapterPresenterOnlineImpl(this, this); } else if (presenterType.equals(ChapterPresenterOfflineImpl.TAG)) { mChapterPresenter = new ChapterPresenterOfflineImpl(this, this); } } } setContentView(R.layout.activity_chapter); mToolbar = (Toolbar) findViewById(R.id.mainToolbar); mViewPager = (GestureViewPager) findViewById(R.id.viewPager); mEmptyRelativeLayout = (RelativeLayout) findViewById(R.id.emptyRelativeLayout); mPreviousButton = (FloatingActionButton) findViewById(R.id.previousButton); mNextButton = (FloatingActionButton) findViewById(R.id.nextButton); mPageNumberView = (TextView) findViewById(R.id.numberTextView); if (savedInstanceState != null) { mChapterPresenter.restoreState(savedInstanceState); } else { mChapterPresenter.handleInitialArguments(getIntent()); } mChapterPresenter.initializeViews(); mChapterPresenter.initializeOptions(); mChapterPresenter.initializeDataFromUrl(getSupportFragmentManager()); } @Override protected void onStart() { super.onStart(); mChapterPresenter.registerForEvents(); } @Override protected void onPause() { super.onPause(); mChapterPresenter.saveChapterToRecentChapters(); } @Override protected void onStop() { super.onStop(); mChapterPresenter.unregisterForEvents(); } @Override protected void onDestroy() { super.onDestroy(); mChapterPresenter.destroyAllSubscriptions(); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); mChapterPresenter.saveState(outState); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.chapter, menu); mDirectionMenuItem = menu.findItem(R.id.action_direction); mOrientationMenuItem = menu.findItem(R.id.action_orientation); mZoomMenuItem = menu.findItem(R.id.action_zoom); mChapterPresenter.initializeMenu(); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: mChapterPresenter.onOptionParent(); return true; case R.id.action_refresh: mChapterPresenter.onOptionRefresh(); return true; case R.id.action_select_page: mChapterPresenter.onOptionSelectPage(); return true; case R.id.action_direction: mChapterPresenter.onOptionDirection(); return true; case R.id.action_orientation: mChapterPresenter.onOptionOrientation(); return true; case R.id.action_zoom: mChapterPresenter.onOptionZoom(); return true; case R.id.action_help: mChapterPresenter.onOptionHelp(); return true; default: return super.onOptionsItemSelected(item); } } @Override public void onTrimMemory(int level) { super.onTrimMemory(level); mChapterPresenter.onTrimMemory(level); } @Override public void onLowMemory() { super.onLowMemory(); mChapterPresenter.onLowMemory(); } // ChapterView: @Override public void initializeHardwareAcceleration() { getWindow().setFlags( WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED); } @Override public void initializeSystemUIVisibility() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { getWindow().getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN ); } else { getWindow().getDecorView().setSystemUiVisibility( View.VISIBLE ); } mSystemUIVisibility = true; } @Override public void initializeToolbar() { if (mToolbar != null) { mToolbar.setTitle(R.string.fragment_chapter); mToolbar.setBackgroundColor(getResources().getColor(R.color.primaryBlue500)); mToolbar.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText(ChapterActivity.this, mToolbar.getTitle(), Toast.LENGTH_SHORT).show(); } }); setSupportActionBar(mToolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); } } @Override public void initializeViewPager() { if (mViewPager != null) { mViewPager.setOffscreenPageLimit(2); mViewPager.setPageMargin(16); mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { // Do Nothing. } @Override public void onPageSelected(int position) { mChapterPresenter.onPageSelected(position); } @Override public void onPageScrollStateChanged(int state) { // Do Nothing. } }); mViewPager.setOnChapterBoundariesOutListener(new GestureViewPager.OnChapterBoundariesOutListener() { @Override public void onFirstPageOut() { mChapterPresenter.onFirstPageOut(); } @Override public void onLastPageOut() { mChapterPresenter.onLastPageOut(); } }); mViewPager.setOnChapterSingleTapListener(new GestureViewPager.OnChapterSingleTapListener() { @Override public void onSingleTap() { if (mSystemUIVisibility) { enableFullscreen(); } else { disableFullscreen(); } } }); } } @Override public void initializeEmptyRelativeLayout() { if (mEmptyRelativeLayout != null) { ((ImageView) mEmptyRelativeLayout.findViewById(R.id.emptyImageView)).setImageResource(R.drawable.ic_image_white_48dp); ((ImageView) mEmptyRelativeLayout.findViewById(R.id.emptyImageView)).setColorFilter(getResources().getColor(R.color.accentPinkA200), PorterDuff.Mode.MULTIPLY); ((TextView) mEmptyRelativeLayout.findViewById(R.id.emptyTextView)).setText(R.string.no_chapter); ((TextView) mEmptyRelativeLayout.findViewById(R.id.instructionsTextView)).setText(R.string.chapter_instructions); } } @Override public void initializeButtons() { if (mPreviousButton != null) { mPreviousButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mChapterPresenter.onPreviousClick(); } }); } if (mNextButton != null) { mNextButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mChapterPresenter.onNextClick(); } }); } } @Override public void initializeTextView() { if (mPageNumberView != null) { mPageNumberView.setVisibility(View.GONE); mPageNumberView.getBackground().setAlpha(100); } } @Override public void initializeFullscreen() { Observable.just(null) .delay(2500, TimeUnit.MILLISECONDS) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1<Object>() { @Override public void call(Object nullObject) { enableFullscreen(); } }); } @Override public void hideEmptyRelativeLayout() { if (mEmptyRelativeLayout != null) { mEmptyRelativeLayout.setVisibility(View.GONE); } } @Override public void showEmptyRelativeLayout() { // Do Nothing. } @Override public void enableFullscreen() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { getWindow().getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_LOW_PROFILE | View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY ); } else { getWindow().getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_LOW_PROFILE ); } hideControls(); showPageView(); mSystemUIVisibility = false; } @Override public void disableFullscreen() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { getWindow().getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN ); } else { getWindow().getDecorView().setSystemUiVisibility( View.VISIBLE ); } showControls(); hidePageView(); mSystemUIVisibility = true; } @Override public void setTitleText(String title) { if (mToolbar != null) { mToolbar.setTitle(title); } } @Override public void setSubtitleProgressText(int imageUrlsCount) { if (mToolbar != null) { StringBuilder currentSubtitle = new StringBuilder(getString(R.string.chapter_subtitle_progress)); currentSubtitle.append(" "); currentSubtitle.append(imageUrlsCount); mToolbar.setSubtitle(currentSubtitle.toString()); } } @Override public void setSubtitlePositionText(int position) { if (mToolbar != null) { if (mViewPager.getAdapter() != null) { StringBuilder currentSubtitle = new StringBuilder(getString(R.string.chapter_subtitle_page)); currentSubtitle.append(" "); currentSubtitle.append(position); currentSubtitle.append("/"); currentSubtitle.append(mViewPager.getAdapter().getCount()); mToolbar.setSubtitle(currentSubtitle.toString()); } } } @Override public void setImmersivePositionText(int position) { if (mPageNumberView != null) { if (mViewPager.getAdapter() != null) { mPageNumberView.setText(position + "/" + mViewPager.getAdapter().getCount()); } } } @Override public void setOptionDirectionText(boolean isRightToLeftDirection) { if (mDirectionMenuItem != null) { if (isRightToLeftDirection) { mDirectionMenuItem.setTitle(R.string.action_left_to_right); } else { mDirectionMenuItem.setTitle(R.string.action_right_to_left); } } } @Override public void setOptionOrientationText(boolean isLockOrientation) { if (mOrientationMenuItem != null) { if (isLockOrientation) { mOrientationMenuItem.setTitle(R.string.action_unlock_orientation); } else { mOrientationMenuItem.setTitle(R.string.action_lock_orientation); } } } @Override public void setOptionZoomText(boolean isLockZoom) { if (mZoomMenuItem != null) { if (isLockZoom) { mZoomMenuItem.setTitle(R.string.action_unlock_zoom); } else { mZoomMenuItem.setTitle(R.string.action_lock_zoom); } } } @Override public void toastNotInitializedError() { Toast.makeText(this, R.string.toast_not_initialized, Toast.LENGTH_SHORT).show(); } @Override public void toastChapterError() { Toast.makeText(this, R.string.toast_chapter_error, Toast.LENGTH_SHORT).show(); } @Override public void toastNoPreviousChapter() { Toast.makeText(this, R.string.toast_no_previous_chapter, Toast.LENGTH_SHORT).show(); } @Override public void toastNoNextChapter() { Toast.makeText(this, R.string.toast_no_next_chapter, Toast.LENGTH_SHORT).show(); } @Override public void finishAndLaunchActivity(Intent launchIntent, boolean isFadeTransition) { finish(); if (isFadeTransition) { overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out); } startActivity(launchIntent); } @Override public Context getContext() { return this; } // ChapterMapper; @Override public void registerAdapter(PagerAdapter adapter) { if (mViewPager != null) { mViewPager.setAdapter(adapter); } } @Override public int getPosition() { if (mViewPager != null) { return mViewPager.getCurrentItem(); } return -1; } @Override public void setPosition(int position) { if (mViewPager != null) { mViewPager.setCurrentItem(position, false); } } @Override public void applyViewSettings() { if (mViewPager != null) { mViewPager.applyViewSettings(); } } @Override public void applyIsLockOrientation(boolean isLockOrientation) { if (isLockOrientation) { setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED); } else { setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); } } @Override public void applyIsLockZoom(boolean isLockZoom) { if (mViewPager != null) { mViewPager.setIsLockZoom(isLockZoom); } } private void hideControls() { if (mToolbar != null) { if (mToolbar.getVisibility() != View.GONE) { mToolbar.animate() .y(0) .translationY(-1 * mToolbar.getHeight()) .setDuration(getResources().getInteger(android.R.integer.config_shortAnimTime)) .setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { mToolbar.setVisibility(View.GONE); } }); } } if (mPreviousButton != null) { mPreviousButton.hide(true); } if (mNextButton != null) { mNextButton.hide(true); } } private void showControls() { if (mToolbar != null) { if (mToolbar.getVisibility() != View.VISIBLE) { mToolbar.setVisibility(View.VISIBLE); mToolbar.animate() .translationY(mToolbar.getHeight()) .y(0) .setDuration(getResources().getInteger(android.R.integer.config_shortAnimTime)) .setListener(null); } } if (mPreviousButton != null) { mPreviousButton.show(true); } if (mNextButton != null) { mNextButton.show(true); } } private void hidePageView() { if (mPageNumberView != null) { if (mPageNumberView.getVisibility() != View.GONE) { mPageNumberView.animate() .alpha(0.0f) .setDuration(getResources().getInteger(android.R.integer.config_shortAnimTime)) .setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { mPageNumberView.setVisibility(View.GONE); } }); } } } private void showPageView() { if (mPageNumberView != null) { if (mPageNumberView.getVisibility() != View.VISIBLE) { mPageNumberView.setVisibility(View.VISIBLE); mPageNumberView.animate() .alpha(1.0f) .setDuration(getResources().getInteger(android.R.integer.config_shortAnimTime)) .setListener(null); } } } }