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