mirror of
https://github.com/mihonapp/mihon.git
synced 2025-06-25 10:37:51 +02:00
Add an initial menu for the reader, and some minor changes.
This commit is contained in:
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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() {
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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) {
|
||||
|
@ -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;
|
||||
|
@ -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();
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
@ -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);
|
||||
|
@ -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() {
|
||||
|
@ -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) {}
|
||||
}
|
||||
}
|
@ -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) {
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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
|
||||
|
Reference in New Issue
Block a user