package ar.rulosoft.mimanganu;
import android.animation.Animator;
import android.animation.ObjectAnimator;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.content.pm.ActivityInfo;
import android.graphics.Color;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;
import java.io.File;
import java.util.ArrayList;
import ar.rulosoft.mimanganu.componentes.Chapter;
import ar.rulosoft.mimanganu.componentes.Database;
import ar.rulosoft.mimanganu.componentes.Manga;
import ar.rulosoft.mimanganu.componentes.readers.Reader;
import ar.rulosoft.mimanganu.componentes.readers.Reader.Direction;
import ar.rulosoft.mimanganu.servers.FromFolder;
import ar.rulosoft.mimanganu.servers.ServerBase;
import ar.rulosoft.mimanganu.services.ChapterDownload;
import ar.rulosoft.mimanganu.services.DownloadListener;
import ar.rulosoft.mimanganu.services.DownloadPoolService;
import ar.rulosoft.mimanganu.services.SingleDownload;
import ar.rulosoft.mimanganu.services.StateChangeListener;
import ar.rulosoft.mimanganu.utils.Paths;
import ar.rulosoft.mimanganu.utils.ThemeColors;
import ar.rulosoft.mimanganu.utils.Util;
import it.sephiroth.android.library.imagezoom.ImageViewTouchBase;
import it.sephiroth.android.library.imagezoom.ImageViewTouchBase.DisplayType;
public class ReaderFragment extends Fragment implements StateChangeListener, DownloadListener, SeekBar.OnSeekBarChangeListener, ChapterDownload.OnErrorListener, Reader.ReaderListener, MainActivity.OnKeyUpListener, MainActivity.OnBackListener {
private static final String KEEP_SCREEN_ON = "keep_screen_on";
private static final String ORIENTATION = "orientation";
private static final String MAX_TEXTURE = "max_texture";
private static final String ADJUST_KEY = "ajustar_a";
private static int mTextureMax;
private static DisplayType mScreenFit;
public Reader mReader;
boolean updatedValue = false;//just a flag to no seek when the reader seek
private Direction direction;
// These are values, which should be fetched from preference
private SharedPreferences pm;
private boolean mKeepOn; // false = normal | true = screen on
private int mOrientation; // 0 = free | 1 = landscape | 2 = portrait
private float mScrollFactor = 1f;
// These are layout components
private RelativeLayout mControlsLayout, mScrollSelect;
private LinearLayout mSeekerLayout;
private SeekBar mSeekBar;
private Toolbar mActionBar;
private Chapter mChapter, nextChapter, previousChapter;
private Manga mManga;
private ServerBase mServerBase;
private TextView mSeekerPage, mScrollSensitiveText;
private MenuItem keepOnMenuItem, screenRotationMenuItem;
private Button mButtonMinus, mButtonPlus;
private Reader.Type readerType = Reader.Type.CONTINUOUS;
private boolean controlVisible = false;
private MenuItem displayMenu;
private AlertDialog mDialog = null;
private boolean reDownloadingImage, freshStart = true;
private int reader_bg;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
int chapterId = getArguments().getInt(MangaFragment.CHAPTER_ID);
if (savedInstanceState != null) {
chapterId = savedInstanceState.getInt(MangaFragment.CHAPTER_ID);
}
mChapter = Database.getChapter(getActivity(), chapterId);
if (mChapter == null) {
//can't get chapter
return;
}
mManga = Database.getFullManga(getActivity(), mChapter.getMangaID());
mServerBase = ServerBase.getServer(mManga.getServerId(), getContext());
pm = PreferenceManager.getDefaultSharedPreferences(getActivity());
mScreenFit = DisplayType.valueOf(pm.getString(ADJUST_KEY, ImageViewTouchBase.DisplayType.FIT_TO_WIDTH.toString()));
mTextureMax = Integer.parseInt(pm.getString(MAX_TEXTURE, "2048"));
mOrientation = pm.getInt(ORIENTATION, 0);
mKeepOn = pm.getBoolean(KEEP_SCREEN_ON, false);
mScrollFactor = Float.parseFloat(pm.getString("scroll_speed", "1"));
int intReaderType = pm.getBoolean("reader_type", true) ? 1 : 2;
if (mManga.getReaderType() != 0) {
intReaderType = mManga.getReaderType();
}
if (intReaderType != 2)
readerType = Reader.Type.PAGED;
if (mManga.getReadingDirection() != -1) {
direction = Direction.values()[mManga.getReadingDirection()];
} else {
direction = Direction.values()[Integer.parseInt(pm.getString(MangaFragment.DIRECTION, "" + Direction.R2L.ordinal()))];
}
if (mManga.getScrollSensitive() > 0) {
mScrollFactor = mManga.getScrollSensitive();
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
View view = inflater.inflate(R.layout.fragment_reader, container, false);
mActionBar = (Toolbar) view.findViewById(R.id.action_bar);
mControlsLayout = (RelativeLayout) view.findViewById(R.id.controls);
mSeekerPage = (TextView) view.findViewById(R.id.page);
mSeekBar = (SeekBar) view.findViewById(R.id.seeker);
mSeekerLayout = (LinearLayout) view.findViewById(R.id.seeker_layout);
mScrollSelect = (RelativeLayout) view.findViewById(R.id.scroll_selector);
mButtonMinus = (Button) view.findViewById(R.id.minus);
mButtonPlus = (Button) view.findViewById(R.id.plus);
mScrollSensitiveText = (TextView) view.findViewById(R.id.scroll_level);
reader_bg = ThemeColors.getReaderColor(pm);
mActionBar.setTitleTextColor(Color.WHITE);
mControlsLayout.setAlpha(0f);
mControlsLayout.setVisibility(View.GONE);
mSeekerPage.setAlpha(.9f);
mSeekerPage.setTextColor(Color.WHITE);
mScrollSensitiveText.setText(mScrollFactor + "x");
mActionBar.setBackgroundColor(reader_bg);
mSeekerLayout.setBackgroundColor(reader_bg);
mSeekerPage.setBackgroundColor(reader_bg);
mSeekBar.setBackgroundColor(reader_bg);
mScrollSelect.setBackgroundColor(reader_bg);
if (pm.getBoolean("hide_sensitivity_scrollbar", false))
mScrollSelect.setVisibility(View.INVISIBLE);
if (pm.getBoolean("hide_actionbar", false))
mActionBar.setVisibility(View.INVISIBLE);
mButtonMinus.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
modScrollSensitive(-.25f);
}
});
mButtonPlus.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
modScrollSensitive(.25f);
}
});
mScrollSensitiveText.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
Toast.makeText(getActivity(), getString(R.string.scroll_speed), Toast.LENGTH_SHORT).show();
return false;
}
});
mSeekBar.setOnSeekBarChangeListener(this);
freshStart = true;
return view;
}
@Override
public void onStart() {
super.onStart();
((MainActivity) getActivity()).getSupportActionBar().hide();
if (!pm.getBoolean("show_status_bar", true)) {
getActivity().getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window = getActivity().getWindow();
window.setNavigationBarColor(reader_bg);
window.setStatusBarColor(reader_bg);
}
hideSystemUI();
if (freshStart) {
setReader();
freshStart = false;
}
if (controlVisible) {
controlVisible = false;
onMenuRequired();//before rotate retry menu state (if showed)
}
// don't know why is needed to set again in every start ()
initMenu();
}
@Override
public void onAttach(Context context) {
MainActivity mainActivity = (MainActivity) getActivity();
mainActivity.backListener = this;
mainActivity.keyUpListener = this;
super.onAttach(context);
}
private void setReader() {
if (mReader != null) {
mReader.freeMemory();
}
mReader = Reader.getNewReader(getActivity(), direction, readerType);
if (direction == Direction.L2R) {
mSeekBar.setRotation(180);
} else {
mSeekBar.setRotation(0);
}
mReader.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
if (getView() != null) {
((FrameLayout) getView().findViewById(R.id.reader_placeholder)).removeAllViews();
((FrameLayout) getView().findViewById(R.id.reader_placeholder)).addView(mReader);
mReader.setMaxTexture(mTextureMax);
mReader.setScreenFit(mScreenFit);
mReader.setReaderListener(this);
mReader.setScrollSensitive(mScrollFactor);
if (displayMenu != null)
if (mReader.hasFitFeature()) {
displayMenu.setVisible(true);
} else {
displayMenu.setVisible(false);
}
loadChapter(mChapter, LoadMode.SAVED);
}
}
private void loadChapter(Chapter nChapter, LoadMode mode) {
if (mChapter != null) {
DownloadPoolService.detachListener(mChapter.getId());
Database.updateChapter(getActivity(), mChapter);
}
mChapter = nChapter;
if (mChapter == null) {
return;
}
if (!mChapter.isDownloaded()) {
try {
DownloadPoolService.addChapterDownloadPool(getActivity(), mChapter, true);
} catch (Exception e) {
if (e.getMessage() != null) {
Toast.makeText(getActivity(), e.getMessage(), Toast.LENGTH_SHORT).show();
}
}
}
getActivity().setTitle(mChapter.getTitle());
if (mChapter.getPages() == 0) {
new GetPageTask().execute(mChapter);
} else {
DownloadPoolService.setDownloadListener(this);
mChapter.setReadStatus(Chapter.READING);
Database.updateChapter(getActivity(), mChapter);
mReader.reset();
ArrayList<String> pages = new ArrayList<>();
if (!(mServerBase instanceof FromFolder)) {
for (int i = 0; i < mChapter.getPages(); i++) {
pages.add(Paths.generateBasePath(mServerBase, mManga, mChapter, getActivity()) + "/" + (i + 1) + ".jpg");
}
} else {
for (int i = 0; i < mChapter.getPages(); i++) {
try {
pages.add(mServerBase.getImageFrom(mChapter, i));
} catch (Exception ignore) {
}
}
}
mReader.setPaths(pages);
mActionBar.setTitle(mChapter.getTitle());
mSeekBar.setMax(mChapter.getPages() - 1);
DownloadPoolService.attachListener(this, mChapter.getId());
boolean next = false;
for (int i = 0; i < mManga.getChapters().size(); i++) {
if (mManga.getChapters().get(i).getId() == mChapter.getId()) {
if (i > 0) {
next = true;
nextChapter = mManga.getChapters().get(i - 1);
}
if (i + 1 < mManga.getChapters().size()) {
previousChapter = mManga.getChapters().get(i + 1);
}
break;
}
}
if (!next)
nextChapter = null;
if (nextChapter != null) {
if (!nextChapter.isDownloaded()) {
if (pm.getBoolean("download_next_chapter_automatically", false)) {
if (DownloadPoolService.isNewDownload(nextChapter.getId())) {
try {
DownloadPoolService.addChapterDownloadPool(getActivity(), nextChapter, false);
Util.getInstance().toast(getActivity(), getResources().getString(R.string.downloading) + " " + nextChapter.getTitle());
} catch (Exception e) {
Log.e("ServB", "Download add pool error", e);
}
}
}
}
}
switch (mode) {
case START:
mReader.seekPage(1);
break;
case END:
mReader.seekPage(mChapter.getPages());
break;
case SAVED:
mReader.seekPage(mChapter.getPagesRead());
}
}
mReader.postInvalidateDelayed(200);
}
private void modScrollSensitive(float diff) {
if ((mScrollFactor + diff) >= .5 && (mScrollFactor + diff) <= 5) {
mScrollFactor += diff;
Database.updateMangaScrollSensitive(getActivity(), mManga.getId(), mScrollFactor);
mScrollSensitiveText.setText(mScrollFactor + "x");
mReader.setScrollSensitive(mScrollFactor);
}
}
private void hideSystemUI() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
getActivity().getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar
| View.SYSTEM_UI_FLAG_IMMERSIVE);
}
}
private void showSystemUI() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
getActivity().getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
}
public void initMenu() {
mActionBar.getMenu().clear();
mActionBar.inflateMenu(R.menu.menu_reader);
Menu menu = mActionBar.getMenu();
displayMenu = menu.findItem(R.id.action_ajustar);
keepOnMenuItem = menu.findItem(R.id.action_keep_screen_on);
screenRotationMenuItem = menu.findItem(R.id.action_orientation);
if (mKeepOn) {
keepOnMenuItem.setIcon(R.drawable.ic_action_mantain_screen_on);
getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
if (mOrientation == 1) {
getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
screenRotationMenuItem.setIcon(R.drawable.ic_action_screen_landscape);
} else if (mOrientation == 2) {
getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
screenRotationMenuItem.setIcon(R.drawable.ic_action_screen_portrait);
}
MenuItem mMenuItem = menu.findItem(R.id.action_sentido);
if (direction == Direction.R2L) {
this.direction = Direction.R2L;
mMenuItem.setIcon(R.drawable.ic_action_clasico);
} else if (direction == Direction.L2R) {
this.direction = Direction.L2R;
mMenuItem.setIcon(R.drawable.ic_action_inverso);
} else {
this.direction = Direction.VERTICAL;
mMenuItem.setIcon(R.drawable.ic_action_verical);
}
if (mReader != null) {
if (mReader.hasFitFeature()) {
displayMenu.setVisible(true);
updateIcon(mScreenFit, false);
} else {
displayMenu.setVisible(false);
}
}
mActionBar.setNavigationIcon(R.drawable.ic_back);
mActionBar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
getActivity().onBackPressed();
}
});
mActionBar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
return ReaderFragment.this.onMenuItemClick(item);
}
});
}
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_ajustar: {
mScreenFit = mScreenFit.getNext();
SharedPreferences.Editor editor = pm.edit();
editor.putString(ADJUST_KEY, mScreenFit.toString());
editor.apply();
mReader.setScreenFit(mScreenFit);
updateIcon(mScreenFit, true);
return true;
}
case R.id.action_keep_screen_on: {
if (!mKeepOn) {
keepOnMenuItem.setIcon(R.drawable.ic_action_mantain_screen_on);
getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
Toast.makeText(getActivity(), getString(R.string.stay_awake_on),
Toast.LENGTH_SHORT).show();
} else {
keepOnMenuItem.setIcon(R.drawable.ic_action_mantain_screen_off);
getActivity().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
Toast.makeText(getActivity(), getString(R.string.stay_awake_off),
Toast.LENGTH_SHORT).show();
}
mKeepOn = !mKeepOn;
SharedPreferences.Editor editor = pm.edit();
editor.putBoolean(KEEP_SCREEN_ON, mKeepOn);
editor.apply();
break;
}
case R.id.action_orientation: {
if (mOrientation == 0) {
getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
screenRotationMenuItem.setIcon(R.drawable.ic_action_screen_landscape);
Toast.makeText(getActivity(), getString(R.string.lock_on_landscape),
Toast.LENGTH_SHORT).show();
} else if (mOrientation == 1) {
getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
screenRotationMenuItem.setIcon(R.drawable.ic_action_screen_portrait);
Toast.makeText(getActivity(), getString(R.string.lock_on_portrait),
Toast.LENGTH_SHORT).show();
} else if (mOrientation == 2) {
getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
screenRotationMenuItem.setIcon(R.drawable.ic_action_screen_free);
Toast.makeText(getActivity(), getString(R.string.rotation_no_locked),
Toast.LENGTH_SHORT).show();
}
mOrientation = (mOrientation + 1) % 3;
SharedPreferences.Editor editor = pm.edit();
editor.putInt(ORIENTATION, mOrientation);
editor.apply();
mActionBar.setTitleTextColor(Color.WHITE);
break;
}
case R.id.action_sentido: {
if (direction == Direction.R2L) {
item.setIcon(R.drawable.ic_action_inverso);
this.direction = Direction.L2R;
} else if (direction == Direction.L2R) {
item.setIcon(R.drawable.ic_action_verical);
this.direction = Direction.VERTICAL;
} else {
item.setIcon(R.drawable.ic_action_clasico);
this.direction = Direction.R2L;
}
mManga.setReadingDirection(this.direction.ordinal());
Database.updateReadOrder(getActivity(), this.direction.ordinal(), mManga.getId());
setReader();
break;
}
case R.id.re_download_image:
if (!reDownloadingImage)
reDownloadCurrentImage();
else
Util.getInstance().toast(getActivity(), getString(R.string.dont_spam_redownload_button));
break;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onImageDownloaded(int cid, int page) {
if (cid == mChapter.getId())
mReader.reloadImage(page + 1);
}
@Override
public void onPause() {
try {
if (mDialog != null)
mDialog.dismiss();
DownloadPoolService.setDownloadListener(null);
DownloadPoolService.detachListener(mChapter.getId());
Database.updateChapter(getActivity(), mChapter);
if (mReader.isLastPageVisible()) {
mChapter.setPagesRead(mChapter.getPages());
mChapter.setReadStatus(Chapter.READ);
Database.updateChapter(getActivity(), mChapter);
} else {
mChapter.setPagesRead(mReader.getCurrentPage());
Database.updateChapterPage(getActivity(), mChapter.getId(), mChapter.getPagesRead());
}
} catch (Exception ignored) {
ignored.printStackTrace();
}
super.onPause();
}
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
savedInstanceState.putInt(MangaFragment.CHAPTER_ID, mChapter.getId());
super.onSaveInstanceState(savedInstanceState);
}
@Override
public void onDestroy() {
mReader.freeMemory();
super.onDestroy();
}
@Override
public void onResume() {
super.onResume();
DownloadPoolService.attachListener(this, mChapter.getId());
DownloadPoolService.setDownloadListener(this);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window = getActivity().getWindow();
window.setNavigationBarColor(reader_bg);
window.setStatusBarColor(reader_bg);
}
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (mSeekerPage != null) mSeekerPage.setText("" + (progress + 1));
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
mSeekerPage.setText("" + (seekBar.getProgress() + 1));
mSeekerPage.setVisibility(SeekBar.VISIBLE);
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
mSeekerPage.setVisibility(SeekBar.INVISIBLE);
int pm = seekBar.getProgress();
mReader.goToPage(pm + 1);//start on 0
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_MENU) {
onMenuRequired();
return true;
}
return false;
}
@Override
public boolean onBackPressed() {
getActivity().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
((MainActivity) getActivity()).getSupportActionBar().show();
((MainActivity) getActivity()).setColorToBars();
if (getActivity().getRequestedOrientation() != ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED)
getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
return false;
}
@Override
public void onMenuRequired() {
if (controlVisible) {
hideSystemUI();
controlVisible = false;
ObjectAnimator anim2 = ObjectAnimator.ofFloat(mControlsLayout, "alpha", .90f, 0f);
anim2.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
mControlsLayout.setVisibility(View.GONE);
}
@Override
public void onAnimationCancel(Animator animation) {
}
});
anim2.start();
} else {
showSystemUI();
controlVisible = true;
ObjectAnimator anim2 =
ObjectAnimator.ofFloat(mControlsLayout, "alpha", 0f, .90f);
anim2.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
mControlsLayout.setVisibility(View.VISIBLE);
}
@Override
public void onAnimationRepeat(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
}
@Override
public void onAnimationCancel(Animator animation) {
}
});
anim2.start();
}
}
@Override
public void onError(final Chapter chapter) {
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
try {
mDialog = new AlertDialog.Builder(getActivity())
.setTitle(chapter.getTitle() + " " + getString(R.string.error))
.setMessage(getString(R.string.demaciados_errores))
.setIcon(R.drawable.ic_launcher)
.setNeutralButton(getString(android.R.string.ok), null)
.setPositiveButton(getString(R.string.retry), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
DownloadPoolService.retryError(getActivity(), mChapter, ReaderFragment.this);
dialog.dismiss();
mDialog = null;
DownloadPoolService.setDownloadListener(ReaderFragment.this);
}
})
.show();
} catch (Exception e) {
e.printStackTrace();
// lost references fixed con detachListener
}
}
});
}
public void onPageChanged(int page) {
updatedValue = true;
mChapter.setPagesRead(page);
mSeekBar.setProgress(page - 1);
if (mReader.isLastPageVisible()) {
mChapter.setPagesRead(mChapter.getPages());
mChapter.setReadStatus(Chapter.READ);
} else if (mChapter.getReadStatus() == Chapter.READ) {
mChapter.setReadStatus(Chapter.READING);
}
}
@Override
public void onStartOver() {
if (previousChapter != null) {
boolean seamlessChapterTransition = pm.getBoolean("seamless_chapter_transitions", false);
if (seamlessChapterTransition) {
mChapter.setReadStatus(Chapter.UNREAD);
mChapter.setPagesRead(1);
loadChapter(previousChapter, LoadMode.END);
//Util.getInstance().toast(getApplicationContext(), mChapter.getTitle(), 0);
Util.getInstance().showSlowSnackBar(mChapter.getTitle(), mControlsLayout, getActivity());
}
}
}
@Override
public void onEndOver() {
LayoutInflater inflater = getActivity().getLayoutInflater();
boolean imagesDelete = pm.getBoolean("delete_images", false);
boolean seamlessChapterTransition = pm.getBoolean("seamless_chapter_transitions", false);
boolean seamlessChapterTransitionDeleteRead = pm.getBoolean("seamless_chapter_transitions_delete_read", false);
if (nextChapter != null) {
if (!seamlessChapterTransition) {
View v = inflater.inflate(R.layout.dialog_next_chapter, null);
final CheckBox checkBox = (CheckBox) v.findViewById(R.id.delete_images_oc);
checkBox.setChecked(imagesDelete);
mDialog = new AlertDialog.Builder(getActivity())
.setTitle(mChapter.getTitle() + " " + getString(R.string.finalizado))
.setView(v)
.setIcon(R.drawable.ic_launcher)
.setNegativeButton(getString(android.R.string.no), null)
.setPositiveButton(getString(android.R.string.ok), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
boolean del_images = checkBox.isChecked();
if (pm != null)
pm.edit().putBoolean("delete_images", del_images).apply();
mChapter.setReadStatus(Chapter.READ);
mChapter.setPagesRead(mChapter.getPages());
Database.updateChapter(getActivity(), mChapter);
Chapter pChapter = mChapter;
loadChapter(nextChapter, LoadMode.START);
if (del_images) {
pChapter.freeSpace(getActivity());
}
if (mDialog != null && mDialog.isShowing())
mDialog.dismiss();
mDialog = null;
}
})
.show();
} else {
mChapter.setReadStatus(Chapter.READ);
mChapter.setPagesRead(mChapter.getPages());
Chapter tmpChapter = mChapter;
loadChapter(nextChapter, LoadMode.START);
//Util.getInstance().toast(getApplicationContext(), mChapter.getTitle(), 0);
Util.getInstance().showSlowSnackBar(mChapter.getTitle(), mControlsLayout, getActivity());
if (seamlessChapterTransitionDeleteRead) {
tmpChapter.freeSpace(getActivity());
Util.getInstance().toast(getActivity(), getResources().getString(R.string.deleted, tmpChapter.getTitle()), 0);
}
}
} else {
final Chapter tmpChapter = mChapter;
View v = inflater.inflate(R.layout.dialog_no_more_chapters, null);
final CheckBox checkBox = (CheckBox) v.findViewById(R.id.delete_images_oc);
checkBox.setChecked(imagesDelete);
mDialog = new AlertDialog.Builder(getActivity())
.setTitle(mChapter.getTitle() + " " + getString(R.string.finalizado))
.setView(v)
.setIcon(R.drawable.ic_launcher)
.setNegativeButton(getString(android.R.string.cancel), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
})
.setPositiveButton(getString(R.string.close), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
boolean del_images = checkBox.isChecked();
if (pm != null)
pm.edit().putBoolean("delete_images", del_images).apply();
if (del_images) {
tmpChapter.freeSpace(getActivity());
}
if (mDialog != null)
mDialog.dismiss();
controlVisible = true; //just to close
mDialog = null;
getActivity().onBackPressed();
}
})
.show();
}
}
@Override
public void onChange(final SingleDownload singleDownload) {
Activity activity = getActivity();
if (activity != null)
if (singleDownload.status == SingleDownload.Status.DOWNLOAD_OK) {
mReader.reloadImage(singleDownload.getIndex());
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
mReader.invalidate();
}
});
} else {
if (singleDownload.status.ordinal() > SingleDownload.Status.DOWNLOAD_OK.ordinal()) {
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getActivity(), R.string.error_downloading_image, Toast.LENGTH_LONG).show();
}
});
}
}
}
@Override
public void onStatusChanged(ChapterDownload chapterDownload) {
//can be used to inform download complete but i think is no needed
}
public void reDownloadCurrentImage() {
ReDownloadImage r = new ReDownloadImage();
r.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
private void updateIcon(DisplayType displayType, boolean showMsg) {
if (displayMenu != null) {
String msg = "";
switch (displayType) {
case NONE:
displayMenu.setIcon(R.drawable.ic_action_original);
msg = getString(R.string.no_scale);
break;
case FIT_TO_HEIGHT:
displayMenu.setIcon(R.drawable.ic_action_ajustar_alto);
msg = getString(R.string.ajuste_alto);
break;
case FIT_TO_WIDTH:
displayMenu.setIcon(R.drawable.ic_action_ajustar_ancho);
msg = getString(R.string.ajuste_ancho);
break;
case FIT_TO_SCREEN:
displayMenu.setIcon(R.drawable.ic_action_ajustar_diagonal);
msg = getString(R.string.mejor_ajuste);
break;
default:
break;
}
if (showMsg)
Toast.makeText(getActivity(), msg, Toast.LENGTH_SHORT).show();
}
}
enum LoadMode {START, END, SAVED}
public class GetPageTask extends AsyncTask<Chapter, Void, Chapter> {
ProgressDialog asyncDialog = new ProgressDialog(getActivity());
String error;
@Override
protected void onPreExecute() {
asyncDialog.setMessage(getResources().getString(R.string.iniciando));
asyncDialog.show();
super.onPreExecute();
}
@Override
protected Chapter doInBackground(Chapter... arg0) {
Chapter c = arg0[0];
ServerBase s = ServerBase.getServer(ReaderFragment.this.mManga.getServerId(), getContext());
try {
if (c.getPages() < 1) s.chapterInit(c);
} catch (Exception e) {
if (e.getMessage() != null)
error = e.getMessage();
else
error = e.getLocalizedMessage();
}
if (c.getPages() < 1) {
error = "Error"; // using a localized string can cause errors
}
return c;
}
@Override
protected void onPostExecute(Chapter result) {
try {
asyncDialog.dismiss();
} catch (Exception e) {
// ignore error
}
if (error != null && error.length() > 1) {
Util.getInstance().toast(getActivity(), error);
} else {
try {
Database.updateChapter(getActivity(), result);
DownloadPoolService.addChapterDownloadPool(getActivity(), result, true);
loadChapter(result, LoadMode.SAVED);
} catch (Exception e) {
Log.e("ReaderFragment", "Exception", e);
//Toast.makeText(getContext(), Log.getStackTraceString(e), Toast.LENGTH_LONG).show();
}
}
super.onPostExecute(result);
}
}
public class ReDownloadImage extends AsyncTask<Void, Void, Void> {
int idx;
String path;
String error = "";
@Override
protected void onPreExecute() {
super.onPreExecute();
reDownloadingImage = true;
idx = mReader.getCurrentPage();
mReader.freePage(idx);
path = mReader.getPath(idx);
File f = new File(path);
if (f.exists()) {
f.delete();
}
mReader.reloadImage(idx);
}
@Override
protected Void doInBackground(Void... params) {
try {
SingleDownload s = new SingleDownload(mServerBase.getImageFrom(mChapter, idx), path, idx, mChapter.getId(), new ChapterDownload(mChapter), mServerBase.needRefererForImages());
s.setChangeListener(ReaderFragment.this);
new Thread(s).start();
} catch (Exception e) {
error = Log.getStackTraceString(e);
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
if (!error.isEmpty()) {
Toast.makeText(getActivity(), error, Toast.LENGTH_LONG).show();
}
reDownloadingImage = false;
}
}
}