mirror of
https://github.com/mihonapp/mihon.git
synced 2024-11-07 11:17:25 +01:00
Webtoon reader "restores" position on rotation. Fixes #93
This commit is contained in:
parent
a3ec057384
commit
d799ae5d72
@ -7,6 +7,7 @@ import android.graphics.Color;
|
|||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.support.annotation.NonNull;
|
import android.support.annotation.NonNull;
|
||||||
|
import android.support.v4.app.FragmentManager;
|
||||||
import android.support.v4.content.ContextCompat;
|
import android.support.v4.content.ContextCompat;
|
||||||
import android.support.v7.widget.Toolbar;
|
import android.support.v7.widget.Toolbar;
|
||||||
import android.view.Menu;
|
import android.view.Menu;
|
||||||
@ -20,11 +21,8 @@ import com.afollestad.materialdialogs.MaterialDialog;
|
|||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import javax.inject.Inject;
|
|
||||||
|
|
||||||
import butterknife.Bind;
|
import butterknife.Bind;
|
||||||
import butterknife.ButterKnife;
|
import butterknife.ButterKnife;
|
||||||
import eu.kanade.tachiyomi.App;
|
|
||||||
import eu.kanade.tachiyomi.R;
|
import eu.kanade.tachiyomi.R;
|
||||||
import eu.kanade.tachiyomi.data.database.models.Chapter;
|
import eu.kanade.tachiyomi.data.database.models.Chapter;
|
||||||
import eu.kanade.tachiyomi.data.database.models.Manga;
|
import eu.kanade.tachiyomi.data.database.models.Manga;
|
||||||
@ -49,8 +47,6 @@ public class ReaderActivity extends BaseRxActivity<ReaderPresenter> {
|
|||||||
@Bind(R.id.page_number) TextView pageNumber;
|
@Bind(R.id.page_number) TextView pageNumber;
|
||||||
@Bind(R.id.toolbar) Toolbar toolbar;
|
@Bind(R.id.toolbar) Toolbar toolbar;
|
||||||
|
|
||||||
@Inject PreferencesHelper preferences;
|
|
||||||
|
|
||||||
private BaseReader viewer;
|
private BaseReader viewer;
|
||||||
private ReaderMenu readerMenu;
|
private ReaderMenu readerMenu;
|
||||||
|
|
||||||
@ -75,7 +71,6 @@ public class ReaderActivity extends BaseRxActivity<ReaderPresenter> {
|
|||||||
@Override
|
@Override
|
||||||
public void onCreate(Bundle savedState) {
|
public void onCreate(Bundle savedState) {
|
||||||
super.onCreate(savedState);
|
super.onCreate(savedState);
|
||||||
App.get(this).getComponent().inject(this);
|
|
||||||
setContentView(R.layout.activity_reader);
|
setContentView(R.layout.activity_reader);
|
||||||
ButterKnife.bind(this);
|
ButterKnife.bind(this);
|
||||||
|
|
||||||
@ -169,8 +164,7 @@ public class ReaderActivity extends BaseRxActivity<ReaderPresenter> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (viewer == null) {
|
if (viewer == null) {
|
||||||
viewer = createViewer(manga);
|
viewer = getOrCreateViewer(manga);
|
||||||
getSupportFragmentManager().beginTransaction().replace(R.id.reader, viewer).commit();
|
|
||||||
}
|
}
|
||||||
viewer.onPageListReady(pages, currentPage);
|
viewer.onPageListReady(pages, currentPage);
|
||||||
readerMenu.onChapterReady(pages.size(), manga, chapter, currentPage);
|
readerMenu.onChapterReady(pages.size(), manga, chapter, currentPage);
|
||||||
@ -180,19 +174,33 @@ public class ReaderActivity extends BaseRxActivity<ReaderPresenter> {
|
|||||||
readerMenu.onAdjacentChapters(previous, next);
|
readerMenu.onAdjacentChapters(previous, next);
|
||||||
}
|
}
|
||||||
|
|
||||||
private BaseReader createViewer(Manga manga) {
|
private BaseReader getOrCreateViewer(Manga manga) {
|
||||||
int mangaViewer = manga.viewer == 0 ? preferences.getDefaultViewer() : manga.viewer;
|
int mangaViewer = manga.viewer == 0 ? getPreferences().getDefaultViewer() : manga.viewer;
|
||||||
|
|
||||||
|
FragmentManager fm = getSupportFragmentManager();
|
||||||
|
|
||||||
|
// Try to reuse the viewer using its tag
|
||||||
|
BaseReader fragment = (BaseReader) fm.findFragmentByTag(manga.viewer + "");
|
||||||
|
if (fragment == null) {
|
||||||
|
// Create a new viewer
|
||||||
switch (mangaViewer) {
|
switch (mangaViewer) {
|
||||||
case LEFT_TO_RIGHT: default:
|
case LEFT_TO_RIGHT: default:
|
||||||
return new LeftToRightReader();
|
fragment = new LeftToRightReader();
|
||||||
|
break;
|
||||||
case RIGHT_TO_LEFT:
|
case RIGHT_TO_LEFT:
|
||||||
return new RightToLeftReader();
|
fragment = new RightToLeftReader();
|
||||||
|
break;
|
||||||
case VERTICAL:
|
case VERTICAL:
|
||||||
return new VerticalReader();
|
fragment = new VerticalReader();
|
||||||
|
break;
|
||||||
case WEBTOON:
|
case WEBTOON:
|
||||||
return new WebtoonReader();
|
fragment = new WebtoonReader();
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fm.beginTransaction().replace(R.id.reader, fragment, manga.viewer + "").commit();
|
||||||
|
}
|
||||||
|
return fragment;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onPageChanged(int currentPageIndex, int totalPages) {
|
public void onPageChanged(int currentPageIndex, int totalPages) {
|
||||||
@ -225,6 +233,8 @@ public class ReaderActivity extends BaseRxActivity<ReaderPresenter> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void initializeSettings() {
|
private void initializeSettings() {
|
||||||
|
PreferencesHelper preferences = getPreferences();
|
||||||
|
|
||||||
subscriptions.add(preferences.showPageNumber()
|
subscriptions.add(preferences.showPageNumber()
|
||||||
.asObservable()
|
.asObservable()
|
||||||
.subscribe(this::setPageNumberVisibility));
|
.subscribe(this::setPageNumberVisibility));
|
||||||
@ -290,7 +300,7 @@ public class ReaderActivity extends BaseRxActivity<ReaderPresenter> {
|
|||||||
|
|
||||||
private void setCustomBrightness(boolean enabled) {
|
private void setCustomBrightness(boolean enabled) {
|
||||||
if (enabled) {
|
if (enabled) {
|
||||||
subscriptions.add(customBrightnessSubscription = preferences.customBrightnessValue()
|
subscriptions.add(customBrightnessSubscription = getPreferences().customBrightnessValue()
|
||||||
.asObservable()
|
.asObservable()
|
||||||
.subscribe(this::setCustomBrightnessValue));
|
.subscribe(this::setCustomBrightnessValue));
|
||||||
} else {
|
} else {
|
||||||
@ -348,7 +358,7 @@ public class ReaderActivity extends BaseRxActivity<ReaderPresenter> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public PreferencesHelper getPreferences() {
|
public PreferencesHelper getPreferences() {
|
||||||
return preferences;
|
return getPresenter().prefs;
|
||||||
}
|
}
|
||||||
|
|
||||||
public BaseReader getViewer() {
|
public BaseReader getViewer() {
|
||||||
|
@ -19,6 +19,7 @@ public abstract class PagerReader extends BaseReader {
|
|||||||
protected PagerReaderAdapter adapter;
|
protected PagerReaderAdapter adapter;
|
||||||
protected Pager pager;
|
protected Pager pager;
|
||||||
|
|
||||||
|
private boolean isReady;
|
||||||
protected boolean transitions;
|
protected boolean transitions;
|
||||||
protected CompositeSubscription subscriptions;
|
protected CompositeSubscription subscriptions;
|
||||||
|
|
||||||
@ -80,6 +81,7 @@ public abstract class PagerReader extends BaseReader {
|
|||||||
.subscribe(value -> transitions = value));
|
.subscribe(value -> transitions = value));
|
||||||
|
|
||||||
setPages();
|
setPages();
|
||||||
|
isReady = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -93,7 +95,7 @@ public abstract class PagerReader extends BaseReader {
|
|||||||
if (this.pages != pages) {
|
if (this.pages != pages) {
|
||||||
this.pages = pages;
|
this.pages = pages;
|
||||||
this.currentPage = currentPage;
|
this.currentPage = currentPage;
|
||||||
if (isResumed()) {
|
if (isReady) {
|
||||||
setPages();
|
setPages();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -29,8 +29,11 @@ public class WebtoonReader extends BaseReader {
|
|||||||
private Subscription decoderSubscription;
|
private Subscription decoderSubscription;
|
||||||
private GestureDetector gestureDetector;
|
private GestureDetector gestureDetector;
|
||||||
|
|
||||||
|
private boolean isReady;
|
||||||
private int scrollDistance;
|
private int scrollDistance;
|
||||||
|
|
||||||
|
private static final String SCROLL_STATE = "scroll_state";
|
||||||
|
|
||||||
private static final float LEFT_REGION = 0.33f;
|
private static final float LEFT_REGION = 0.33f;
|
||||||
private static final float RIGHT_REGION = 0.66f;
|
private static final float RIGHT_REGION = 0.66f;
|
||||||
|
|
||||||
@ -43,6 +46,9 @@ public class WebtoonReader extends BaseReader {
|
|||||||
|
|
||||||
layoutManager = new PreCachingLayoutManager(getActivity());
|
layoutManager = new PreCachingLayoutManager(getActivity());
|
||||||
layoutManager.setExtraLayoutSpace(screenHeight / 2);
|
layoutManager.setExtraLayoutSpace(screenHeight / 2);
|
||||||
|
if (savedState != null) {
|
||||||
|
layoutManager.onRestoreInstanceState(savedState.getParcelable(SCROLL_STATE));
|
||||||
|
}
|
||||||
|
|
||||||
recycler = new RecyclerView(getActivity());
|
recycler = new RecyclerView(getActivity());
|
||||||
recycler.setLayoutParams(new ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT));
|
recycler.setLayoutParams(new ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT));
|
||||||
@ -74,6 +80,7 @@ public class WebtoonReader extends BaseReader {
|
|||||||
});
|
});
|
||||||
|
|
||||||
setPages();
|
setPages();
|
||||||
|
isReady = true;
|
||||||
|
|
||||||
return recycler;
|
return recycler;
|
||||||
}
|
}
|
||||||
@ -90,6 +97,12 @@ public class WebtoonReader extends BaseReader {
|
|||||||
super.onPause();
|
super.onPause();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onSaveInstanceState(Bundle outState) {
|
||||||
|
super.onSaveInstanceState(outState);
|
||||||
|
outState.putParcelable(SCROLL_STATE, layoutManager.onSaveInstanceState());
|
||||||
|
}
|
||||||
|
|
||||||
private void unsubscribeStatus() {
|
private void unsubscribeStatus() {
|
||||||
if (subscription != null && !subscription.isUnsubscribed())
|
if (subscription != null && !subscription.isUnsubscribed())
|
||||||
subscription.unsubscribe();
|
subscription.unsubscribe();
|
||||||
@ -104,7 +117,9 @@ public class WebtoonReader extends BaseReader {
|
|||||||
public void onPageListReady(List<Page> pages, int currentPage) {
|
public void onPageListReady(List<Page> pages, int currentPage) {
|
||||||
if (this.pages != pages) {
|
if (this.pages != pages) {
|
||||||
this.pages = pages;
|
this.pages = pages;
|
||||||
if (isResumed()) {
|
// Restoring current page is not supported. It's getting weird scrolling jumps
|
||||||
|
// this.currentPage = currentPage;
|
||||||
|
if (isReady) {
|
||||||
setPages();
|
setPages();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user