package moe.feng.nhentai.ui; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.res.Configuration; import android.graphics.Color; import android.os.Build; import android.os.Bundle; import android.support.design.widget.Snackbar; import android.support.v4.view.ViewCompat; import android.support.v4.view.ViewPager; import android.support.v7.widget.AppCompatSeekBar; import android.support.v7.widget.AppCompatTextView; import android.view.KeyEvent; import android.view.Menu; import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.view.WindowManager; import android.widget.SeekBar; import com.google.gson.Gson; import moe.feng.nhentai.R; import moe.feng.nhentai.cache.file.FileCacheManager; import moe.feng.nhentai.model.Book; import moe.feng.nhentai.ui.adapter.GalleryPagerAdapter; import moe.feng.nhentai.ui.common.AbsActivity; import moe.feng.nhentai.util.FullScreenHelper; import moe.feng.nhentai.util.Utility; import moe.feng.nhentai.util.task.PageDownloader; public class GalleryActivity extends AbsActivity implements OnTouchListener { public static Context mContext; private Book book; private int page_num; private ViewPager mPager; private GalleryPagerAdapter mPagerAdpater; private View mAppBar, mBottomBar; private AppCompatSeekBar mSeekBar; private int orientation; private int lastOrientation; private int lastPositon; private int gPosition; private FullScreenHelper mFullScreenHelper; private PageDownloader mDownloader; private int scrolled; private boolean gRight; private boolean button; private static final String EXTRA_BOOK_DATA = "book_data", EXTRA_FISRT_PAGE = "first_page"; @Override public boolean onTouch(View view, MotionEvent me) { return true; } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { gRight=false; button=true; lastPositon =gPosition; if (keyCode == KeyEvent.KEYCODE_BACK){ this.onBackPressed(); return super.onKeyDown(keyCode,event); } else if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN){ if (gPosition< book.pageCount-1) gPosition++; } else if (keyCode == KeyEvent.KEYCODE_VOLUME_UP){ if(gPosition>0) { gRight = true; gPosition--; } } mSeekBar.setProgress(gPosition); mDownloader.setCurrentPosition(gPosition); mPager.setCurrentItem(gPosition, false); return true; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && !Utility.isChrome()) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); statusBarHeight = Utility.getStatusBarHeight(getApplicationContext()); } if (Build.VERSION.SDK_INT >= 21) { getWindow().setStatusBarColor(Color.TRANSPARENT); getWindow().setNavigationBarColor(Color.TRANSPARENT); } mFullScreenHelper = new FullScreenHelper(this); mFullScreenHelper.setFullScreen(false); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); Intent intent = getIntent(); book = new Gson().fromJson(intent.getStringExtra(EXTRA_BOOK_DATA), Book.class); page_num = intent.getIntExtra(EXTRA_FISRT_PAGE, 0); mDownloader = new PageDownloader(getApplicationContext(), book); mDownloader.setCurrentPosition(page_num); mDownloader.setOnDownloadListener(new GalleryDownloaderListener()); mDownloader.start(); scrolled =0; setContentView(R.layout.activity_gallery); mContext =getApplicationContext(); } @Override public void onResume() { super.onResume(); } @Override public void onPause() { super.onPause(); mDownloader.pause(); } @Override public void onStop() { super.onStop(); mDownloader.stop(); } @Override public boolean onPrepareOptionsMenu(Menu menu) { menu.clear(); getMenuInflater().inflate(R.menu.menu_gallery, menu); return super.onPrepareOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.action_save) { if (mDownloader.isDownloaded(mPager.getCurrentItem())) { FileCacheManager m = FileCacheManager.getInstance(getApplicationContext()); String externalTarget = m.getExternalPagePath(book, mPager.getCurrentItem() + 1); if (m.saveToExternalPath(book, mPager.getCurrentItem() + 1)){ Snackbar.make($(R.id.space_layout), String.format( getString(R.string.action_save_succeed), externalTarget ), Snackbar.LENGTH_SHORT).show(); return true; } Snackbar.make($(R.id.space_layout), R.string.action_save_unknown, Snackbar.LENGTH_SHORT).show(); } else { Snackbar.make($(R.id.space_layout), R.string.action_save_failed, Snackbar.LENGTH_SHORT).show(); } return true; } return super.onOptionsItemSelected(item); } @Override protected void setUpViews() { if (getSupportActionBar()!=null){ getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setTitle(book.getAvailableTitle()); } lastPositon =0; gPosition =0; button=false; gRight=false; orientation = Configuration.ORIENTATION_PORTRAIT; lastOrientation = Configuration.ORIENTATION_PORTRAIT; mAppBar = $(R.id.my_app_bar); mBottomBar = $(R.id.bottom_bar); mPager = $(R.id.pager); mSeekBar = $(R.id.seekbar); AppCompatTextView mTotalPagesText = $(R.id.total_pages_text); mPagerAdpater = new GalleryPagerAdapter(getFragmentManager(), book); mPager.setAdapter(mPagerAdpater); mPager.setOffscreenPageLimit(1); mPager.setCurrentItem(page_num, false); mPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { lastPositon =position; } @Override public void onPageSelected(int position) { boolean right =true; gPosition =position; if (orientation != lastOrientation){ lastOrientation = orientation; return; } else if (lastPositon==position){ lastPositon++; right=false; } else if(button && gRight){ right=false; button =false; } if (right){ if(mPagerAdpater.getItem(lastPositon-1)!=null){ mPagerAdpater.getItem(lastPositon-1).onPause(); mPagerAdpater.eraseItem(lastPositon-1); } if(mPagerAdpater.getItem(position+1)!=null) mPagerAdpater.getItem(position+1).onResume(); } else{ if(mPagerAdpater.getItem(lastPositon+1)!=null){ mPagerAdpater.getItem(lastPositon+1).onPause(); mPagerAdpater.eraseItem(lastPositon+1); } if(mPagerAdpater.getItem(position-1)!=null) mPagerAdpater.getItem(position-1).onResume(); } mSeekBar.setProgress(position); mDownloader.setCurrentPosition(position); if(scrolled++ == 5){ Runtime.getRuntime().gc(); scrolled=0; } } @Override public void onPageScrollStateChanged(int state) { } }); mTotalPagesText.setText(String.format(getString(R.string.info_total_pages), book.pageCount)); mSeekBar.setKeyProgressIncrement(1); mSeekBar.setMax(book.pageCount - 1); mSeekBar.setProgress(page_num); mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { int progress = 0; @Override public void onProgressChanged(SeekBar seekBar, int i, boolean b) { progress = i; } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { mPager.setCurrentItem(progress, false); } }); } public static void launch(Activity activity, Book book, int firstPageNum) { Intent intent = new Intent(activity, GalleryActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK); intent.putExtra(EXTRA_BOOK_DATA, book.toJSONString()); intent.putExtra(EXTRA_FISRT_PAGE, firstPageNum); activity.startActivity(intent); } public void toggleControlBar() { if (mAppBar.getAlpha() != 0f) { ViewCompat.animate(mAppBar).alpha(0f).setDuration(10).start(); ViewCompat.animate(mBottomBar).alpha(0f).setDuration(10).start(); mFullScreenHelper.setFullScreen(true); } else if (mAppBar.getAlpha() != 1f) { ViewCompat.animate(mAppBar).alpha(1f).setDuration(10).start(); ViewCompat.animate(mBottomBar).alpha(1f).setDuration(10).start(); mFullScreenHelper.setFullScreen(false); } } @Override public void onBackPressed() { if (mAppBar.getAlpha() != 1f) { toggleControlBar(); } else { book =null; mPagerAdpater.notifyDataSetChanged(); mPager.setAdapter(null); Runtime.getRuntime().gc(); super.onBackPressed(); } } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); orientation =newConfig.orientation; } public PageDownloader getPageDownloader() { return mDownloader; } private class GalleryDownloaderListener implements PageDownloader.OnDownloadListener { @Override public void onFinish(int position, int progress) { if (mPagerAdpater != null) { mPagerAdpater.notifyPageImageLoaded(position, true); mSeekBar.setSecondaryProgress(position); } } @Override public void onError(int position, int errorCode) { if (mPagerAdpater != null) { mPagerAdpater.notifyPageImageLoaded(position, false); } } @Override public void onStateChange(int state, int progress) { } } }