Add an initial menu for the reader, and some minor changes.

This commit is contained in:
inorichi
2015-11-18 21:54:33 +01:00
parent b389db9773
commit 3c1b00435c
20 changed files with 214 additions and 104 deletions

View File

@ -60,8 +60,10 @@ public class Chapter {
return url.hashCode();
}
public static Chapter newChapter() {
return new Chapter();
public static Chapter create() {
Chapter chapter = new Chapter();
chapter.chapter_number = -1;
return chapter;
}
}

View File

@ -36,8 +36,8 @@ public class PreferencesHelper {
prefs.edit().clear().apply();
}
public boolean useFullscreenSet() {
return prefs.getBoolean(getKey(R.string.pref_fullscreen_key), false);
public boolean isHideStatusBarSet() {
return prefs.getBoolean(getKey(R.string.pref_hide_status_bar_key), true);
}
public int getDefaultViewer() {

View File

@ -92,9 +92,4 @@ public abstract class BaseSource {
return builder;
}
// Number of images to download at the same time. 3 by default
protected int overrideNumberOfConcurrentPageDownloads() {
return 3;
}
}

View File

@ -97,8 +97,7 @@ public abstract class Source extends BaseSource {
public Observable<Page> getRemainingImageUrlsFromPageList(final List<Page> pages) {
return Observable.from(pages)
.filter(page -> page.getImageUrl() == null)
.window(overrideNumberOfConcurrentPageDownloads())
.concatMap(batchedPages -> batchedPages.concatMap(this::getImageUrlFromPage));
.concatMap(this::getImageUrlFromPage);
}
public Observable<Page> getImageUrlFromPage(final Page page) {

View File

@ -305,7 +305,7 @@ public class Batoto extends Source {
}
private Chapter constructChapterFromHtmlBlock(Element chapterElement) {
Chapter newChapter = Chapter.newChapter();
Chapter newChapter = Chapter.create();
Element urlElement = chapterElement.select("a[href^=http://bato.to/reader").first();
Element nameElement = urlElement;

View File

@ -288,7 +288,7 @@ public class Mangahere extends Source {
}
private Chapter constructChapterFromHtmlBlock(Element chapterElement) {
Chapter newChapter = Chapter.newChapter();
Chapter newChapter = Chapter.create();
Element urlElement = chapterElement.select("a").first();
Element nameElement = chapterElement.select("a").first();

View File

@ -3,6 +3,7 @@ package eu.kanade.mangafeed.ui.base.activity;
import android.content.Context;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.MenuItem;
public class BaseActivity extends AppCompatActivity {
@ -22,7 +23,28 @@ public class BaseActivity extends AppCompatActivity {
getSupportActionBar().setTitle(getString(titleResource));
}
public void setToolbarSubtitle(String title) {
if (getSupportActionBar() != null)
getSupportActionBar().setSubtitle(title);
}
public void setToolbarSubtitle(int titleResource) {
if (getSupportActionBar() != null)
getSupportActionBar().setSubtitle(getString(titleResource));
}
public Context getActivity() {
return this;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
onBackPressed();
return true;
}
return super.onOptionsItemSelected(item);
}
}

View File

@ -10,7 +10,6 @@ import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.widget.Toolbar;
import android.view.MenuItem;
import butterknife.Bind;
import butterknife.ButterKnife;
@ -61,16 +60,6 @@ public class MangaActivity extends BaseRxActivity<MangaPresenter> {
getPresenter().queryManga(manga_id);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
private void disableToolbarElevation() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
toolbar.setElevation(0);

View File

@ -4,6 +4,7 @@ import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
@ -18,6 +19,8 @@ import butterknife.Bind;
import butterknife.ButterKnife;
import eu.kanade.mangafeed.App;
import eu.kanade.mangafeed.R;
import eu.kanade.mangafeed.data.database.models.Chapter;
import eu.kanade.mangafeed.data.database.models.Manga;
import eu.kanade.mangafeed.data.preference.PreferencesHelper;
import eu.kanade.mangafeed.data.source.model.Page;
import eu.kanade.mangafeed.ui.base.activity.BaseRxActivity;
@ -34,11 +37,14 @@ public class ReaderActivity extends BaseRxActivity<ReaderPresenter> {
@Bind(R.id.page_number) TextView pageNumber;
@Bind(R.id.reader) FrameLayout container;
@Bind(R.id.toolbar) Toolbar toolbar;
@Inject PreferencesHelper prefs;
private BaseReader viewer;
private boolean isFullscreen;
private ReaderMenu readerMenu;
private int uiFlags;
private static final int LEFT_TO_RIGHT = 1;
private static final int RIGHT_TO_LEFT = 2;
@ -57,27 +63,19 @@ public class ReaderActivity extends BaseRxActivity<ReaderPresenter> {
setContentView(R.layout.activity_reader);
ButterKnife.bind(this);
if (prefs.useFullscreenSet())
enableFullScreen();
setupToolbar(toolbar);
readerMenu = new ReaderMenu(this, prefs);
createUiHideFlags();
enableHardwareAcceleration();
viewer = getViewer();
}
public void onPageListReady(List<Page> pages) {
viewer.onPageListReady(pages);
viewer.updatePageNumber();
}
public void onPageListError() {
finish();
ToastUtil.showShort(this, R.string.page_list_error);
}
public void onPageChanged(int currentPageIndex, int totalPages) {
String page = (currentPageIndex + 1) + "/" + totalPages;
pageNumber.setText(page);
@Override
protected void onResume() {
super.onResume();
hideSystemUI();
}
@Override
@ -87,42 +85,37 @@ public class ReaderActivity extends BaseRxActivity<ReaderPresenter> {
super.onPause();
}
private void createUiHideFlags() {
uiFlags |= View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
if (prefs.isHideStatusBarSet())
uiFlags |= View.SYSTEM_UI_FLAG_FULLSCREEN;
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT)
uiFlags |= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
}
public void onChapterReady(List<Page> pages, Manga manga, Chapter chapter) {
viewer.onPageListReady(pages);
viewer.updatePageNumber();
readerMenu.onChapterReady(pages.size(), manga, chapter);
}
public void onChapterError() {
finish();
ToastUtil.showShort(this, R.string.page_list_error);
}
public void onPageChanged(int currentPageIndex, int totalPages) {
String page = (currentPageIndex + 1) + "/" + totalPages;
pageNumber.setText(page);
readerMenu.onPageChanged(currentPageIndex);
}
public void setSelectedPage(int pageIndex) {
viewer.setSelectedPage(pageIndex);
}
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
);
}
isFullscreen = true;
}
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
);
}
isFullscreen = false;
public void hideSystemUI() {
getWindow().getDecorView().setSystemUiVisibility(uiFlags);
}
public void enableHardwareAcceleration() {
@ -136,14 +129,7 @@ public class ReaderActivity extends BaseRxActivity<ReaderPresenter> {
}
public void onCenterSingleTap() {
toggleFullscreen();
}
private void toggleFullscreen() {
if (isFullscreen)
disableFullscreen();
else
enableFullScreen();
readerMenu.toggle();
}
private BaseReader getViewer() {

View File

@ -0,0 +1,80 @@
package eu.kanade.mangafeed.ui.reader;
import android.view.View;
import android.widget.RelativeLayout;
import android.widget.SeekBar;
import android.widget.TextView;
import java.text.DecimalFormat;
import butterknife.Bind;
import butterknife.ButterKnife;
import eu.kanade.mangafeed.R;
import eu.kanade.mangafeed.data.database.models.Chapter;
import eu.kanade.mangafeed.data.database.models.Manga;
import eu.kanade.mangafeed.data.preference.PreferencesHelper;
public class ReaderMenu {
@Bind(R.id.reader_menu) RelativeLayout menu;
@Bind(R.id.current_page) TextView currentPage;
@Bind(R.id.page_seeker) SeekBar seekBar;
@Bind(R.id.total_pages) TextView totalPages;
private ReaderActivity activity;
private PreferencesHelper preferences;
private boolean showing;
private DecimalFormat decimalFormat;
public ReaderMenu(ReaderActivity activity, PreferencesHelper preferences) {
this.activity = activity;
this.preferences = preferences;
ButterKnife.bind(this, activity);
seekBar.setOnSeekBarChangeListener(new PageSeekBarChangeListener());
decimalFormat = new DecimalFormat("#.##");
}
public void toggle() {
toggle(!showing);
}
private void toggle(boolean show) {
menu.setVisibility(show ? View.VISIBLE : View.GONE);
showing = show;
}
public void onChapterReady(int numPages, Manga manga, Chapter chapter) {
totalPages.setText("" + numPages);
seekBar.setMax(numPages - 1);
activity.setToolbarTitle(manga.title);
activity.setToolbarSubtitle(chapter.chapter_number != -1 ?
activity.getString(R.string.chapter_subtitle,
decimalFormat.format(chapter.chapter_number)) :
chapter.name);
}
public void onPageChanged(int pageIndex) {
currentPage.setText("" + (pageIndex + 1));
seekBar.setProgress(pageIndex);
}
class PageSeekBarChangeListener implements SeekBar.OnSeekBarChangeListener {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (fromUser) {
activity.setSelectedPage(progress);
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {}
}
}

View File

@ -66,12 +66,12 @@ public class ReaderPresenter extends BasePresenter<ReaderActivity> {
start(RETRY_IMAGES);
}),
(view, pages) -> {
view.onPageListReady(pages);
view.onChapterReady(pages, manga, chapter);
if (currentPage != 0)
view.setSelectedPage(currentPage);
},
(view, error) -> {
view.onPageListError();
view.onChapterError();
});
restartableReplay(GET_PAGE_IMAGES,
@ -158,7 +158,7 @@ public class ReaderPresenter extends BasePresenter<ReaderActivity> {
pages = Observable.from(pageList)
.filter(page -> page.getImageUrl() != null)
.mergeWith(source.getRemainingImageUrlsFromPageList(pageList))
.flatMap(source::getCachedImage);
.flatMap(source::getCachedImage, 3);
} else {
File chapterDir = downloadManager.getAbsoluteChapterDirectory(source, manga, chapter);
@ -178,7 +178,8 @@ public class ReaderPresenter extends BasePresenter<ReaderActivity> {
return Observable.just(page);
})
.flatMap(source::getCachedImage)
.subscribeOn(Schedulers.io());
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
public void setCurrentPage(int currentPage) {

View File

@ -2,7 +2,6 @@ package eu.kanade.mangafeed.ui.setting;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.view.MenuItem;
import butterknife.Bind;
import butterknife.ButterKnife;
@ -32,14 +31,4 @@ public class SettingsActivity extends BaseActivity {
if( !getFragmentManager().popBackStackImmediate() ) super.onBackPressed();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
onBackPressed();
return true;
}
return super.onOptionsItemSelected(item);
}
}

View File

@ -14,7 +14,7 @@ public class ChapterRecognition {
private static Pattern p2 = Pattern.compile("(\\d+[\\.,]?\\d*)");
public static void parseChapterNumber(Chapter chapter, Manga manga) {
if (chapter.chapter_number != 0)
if (chapter.chapter_number != -1)
return;
// Remove spaces and convert to lower case