Skip to content

Commit 7503555

Browse files
committed
Fix a bug where andom would eventually stop working
1 parent 13f1c42 commit 7503555

File tree

3 files changed

+137
-109
lines changed

3 files changed

+137
-109
lines changed

data/src/main/res/xml/prefs_dump.xml

+3
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
<Preference
44
android:defaultValue="-1"
55
android:key="last_shown_stripe_num" />
6+
<Preference
7+
android:defaultValue="2"
8+
android:key="max_shown_stripe_num" />
69
<Preference
710
android:defaultValue="false"
811
android:key="should_restart" />

presentation/src/main/java/com/jorge/boats/xkcd/presenter/StripePresenter.java

+127-109
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import android.graphics.Typeface;
44
import android.support.annotation.NonNull;
5+
56
import com.jorge.boats.xkcd.data.P;
67
import com.jorge.boats.xkcd.di.PerActivity;
78
import com.jorge.boats.xkcd.domain.entity.DomainStripe;
@@ -12,151 +13,168 @@
1213
import com.jorge.boats.xkcd.util.RandomUtil;
1314
import com.jorge.boats.xkcd.view.stripe.StripeContentView;
1415
import com.jorge.boats.xkcd.view.widget.RetryLinearLayout;
16+
1517
import javax.inject.Inject;
1618
import javax.inject.Named;
19+
1720
import retrofit2.adapter.rxjava.HttpException;
1821
import rx.Subscriber;
1922

20-
@PerActivity public class StripePresenter implements Presenter<StripeContentView> {
21-
22-
private final UseCase<Typeface> mTypefaceUseCase;
23-
private final UseCase<DomainStripe> mStripeUseCase;
24-
25-
@Inject PresentationEntityMapper mEntityMapper;
26-
@Inject RetryLinearLayout mRetry;
27-
28-
private StripeContentView mView;
29-
30-
@Inject
31-
public StripePresenter(final @NonNull @Named("typeface") UseCase<Typeface> typefaceUseCase,
32-
final @NonNull @Named("stripe") UseCase<DomainStripe> stripeUseCase) {
33-
mTypefaceUseCase = typefaceUseCase;
34-
mStripeUseCase = stripeUseCase;
35-
}
23+
@PerActivity
24+
public class StripePresenter implements Presenter<StripeContentView> {
3625

37-
public void setView(@NonNull StripeContentView view) {
38-
mView = view;
39-
}
26+
private final UseCase<Typeface> mTypefaceUseCase;
27+
private final UseCase<DomainStripe> mStripeUseCase;
4028

41-
public void initialize() {
42-
requestTitleTypeface();
43-
}
29+
@Inject
30+
PresentationEntityMapper mEntityMapper;
31+
@Inject
32+
RetryLinearLayout mRetry;
4433

45-
private void requestTitleTypeface() {
46-
mTypefaceUseCase.execute(new TitleTypefaceSubscriber());
47-
}
34+
private StripeContentView mView;
4835

49-
private void requestStripe() {
50-
loadStripe();
51-
}
52-
53-
private void loadStripe() {
54-
mStripeUseCase.execute(new StripeSubscriber());
55-
}
56-
57-
public void switchToStripeNum(final long stripeNum) {
58-
updateUseCase(stripeNum);
59-
requestStripe();
60-
}
61-
62-
private void updateUseCase(final long stripeNum) {
63-
((GetStripeUseCase) mStripeUseCase).setRequestedStripeNum(stripeNum);
64-
}
36+
@Inject
37+
public StripePresenter(final @NonNull @Named("typeface") UseCase<Typeface> typefaceUseCase,
38+
final @NonNull @Named("stripe") UseCase<DomainStripe> stripeUseCase) {
39+
mTypefaceUseCase = typefaceUseCase;
40+
mStripeUseCase = stripeUseCase;
41+
}
6542

66-
@Override public void resume() {
67-
}
43+
public void setView(@NonNull StripeContentView view) {
44+
mView = view;
45+
}
6846

69-
@Override public void pause() {
47+
public void initialize() {
48+
requestTitleTypeface();
49+
}
7050

71-
}
51+
private void requestTitleTypeface() {
52+
mTypefaceUseCase.execute(new TitleTypefaceSubscriber());
53+
}
7254

73-
@Override public void destroy() {
74-
mTypefaceUseCase.destroy();
75-
mStripeUseCase.destroy();
76-
}
55+
private void requestStripe() {
56+
loadStripe();
57+
}
7758

78-
@Override public void requestRetry() {
79-
requestStripe();
80-
}
59+
private void loadStripe() {
60+
mStripeUseCase.execute(new StripeSubscriber());
61+
}
8162

82-
@Override public boolean isRetryViewShown() {
83-
return mRetry.isShown();
84-
}
63+
public void switchToStripeNum(final long stripeNum) {
64+
updateUseCase(stripeNum);
65+
requestStripe();
66+
}
8567

86-
public void actionNext() {
87-
if (isRetryViewShown()) return;
68+
private void updateUseCase(final long stripeNum) {
69+
((GetStripeUseCase) mStripeUseCase).setRequestedStripeNum(stripeNum);
70+
}
8871

89-
switchToStripeNum(mView.getStripeNum() + 1);
90-
}
72+
@Override
73+
public void resume() {
74+
}
9175

92-
public void actionRandom() {
93-
if (isRetryViewShown()) return;
94-
switchToStripeNum(RandomUtil.nextLong(1, (int) (mView.getStripeNum() - 1)));
95-
}
76+
@Override
77+
public void pause() {
9678

97-
public void actionShare() {
98-
mView.share();
99-
}
79+
}
10080

101-
public void actionPrevious() {
102-
if (isRetryViewShown()) return;
103-
long targetContainer = mView.getStripeNum();
81+
@Override
82+
public void destroy() {
83+
mTypefaceUseCase.destroy();
84+
mStripeUseCase.destroy();
85+
}
10486

105-
if (targetContainer == DomainStripe.STRIPE_NUM_FIRST) {
106-
return;
87+
@Override
88+
public void requestRetry() {
89+
requestStripe();
10790
}
10891

109-
switchToStripeNum(targetContainer - 1);
110-
}
92+
@Override
93+
public boolean isRetryViewShown() {
94+
return mRetry.isShown();
95+
}
11196

112-
private final class TitleTypefaceSubscriber extends Subscriber<Typeface> {
97+
public void actionNext() {
98+
if (isRetryViewShown()) return;
11399

114-
@Override public void onCompleted() {
115-
//Do nothing
100+
switchToStripeNum(mView.getStripeNum() + 1);
116101
}
117102

118-
@Override public void onError(final @NonNull Throwable e) {
119-
ApplicationLogger.e(e, e.getClass().getName());
103+
public void actionRandom() {
104+
if (isRetryViewShown()) return;
105+
switchToStripeNum(RandomUtil.nextLong(1, P.maxShownStripeNum.get()));
120106
}
121107

122-
@Override public void onNext(final @NonNull Typeface typeface) {
123-
mView.setTitleTypeface(typeface);
124-
mRetry.setTextTypeface(typeface);
108+
public void actionShare() {
109+
mView.share();
125110
}
126-
}
127111

128-
private final class StripeSubscriber extends Subscriber<DomainStripe> {
112+
public void actionPrevious() {
113+
if (isRetryViewShown()) return;
114+
long targetContainer = mView.getStripeNum();
129115

130-
@Override public void onStart() {
131-
mView.showLoading();
132-
mView.hideRetry();
133-
}
116+
if (targetContainer == DomainStripe.STRIPE_NUM_FIRST) {
117+
return;
118+
}
134119

135-
@Override public void onCompleted() {
136-
mView.showContent();
137-
mView.hideLoading();
138-
mView.hideRetry();
120+
switchToStripeNum(targetContainer - 1);
139121
}
140122

141-
@Override public void onError(final @NonNull Throwable e) {
142-
ApplicationLogger.e(e, e.getClass().getName());
143-
mView.hideLoading();
144-
//Upon attempt of loading a non-existing stripe, load the current stripe instead
145-
if ((e instanceof HttpException) && ((HttpException) e).code() == 404) {
146-
switchToStripeNum(DomainStripe.STRIPE_NUM_CURRENT);
147-
return;
148-
}
149-
mView.showRetry(e);
150-
mView.hideContent();
151-
}
123+
private final class TitleTypefaceSubscriber extends Subscriber<Typeface> {
152124

153-
@Override public void onNext(final @NonNull DomainStripe domainStripe) {
154-
final long num;
125+
@Override
126+
public void onCompleted() {
127+
//Do nothing
128+
}
129+
130+
@Override
131+
public void onError(final @NonNull Throwable e) {
132+
ApplicationLogger.e(e, e.getClass().getName());
133+
}
134+
135+
@Override
136+
public void onNext(final @NonNull Typeface typeface) {
137+
mView.setTitleTypeface(typeface);
138+
mRetry.setTextTypeface(typeface);
139+
}
140+
}
155141

156-
mView.setStripeNum(num = domainStripe.getNum());
157-
updateUseCase(num);
158-
P.lastShownStripeNum.put((int) num).apply();
159-
mView.renderStripe(mEntityMapper.transform(domainStripe));
142+
private final class StripeSubscriber extends Subscriber<DomainStripe> {
143+
144+
@Override
145+
public void onStart() {
146+
mView.showLoading();
147+
mView.hideRetry();
148+
}
149+
150+
@Override
151+
public void onCompleted() {
152+
mView.showContent();
153+
mView.hideLoading();
154+
mView.hideRetry();
155+
}
156+
157+
@Override
158+
public void onError(final @NonNull Throwable e) {
159+
ApplicationLogger.e(e, e.getClass().getName());
160+
mView.hideLoading();
161+
//Upon attempt of loading a non-existing stripe, load the current stripe instead
162+
if ((e instanceof HttpException) && ((HttpException) e).code() == 404) {
163+
switchToStripeNum(DomainStripe.STRIPE_NUM_CURRENT);
164+
return;
165+
}
166+
mView.showRetry(e);
167+
mView.hideContent();
168+
}
169+
170+
@Override
171+
public void onNext(final @NonNull DomainStripe domainStripe) {
172+
final long num;
173+
174+
mView.setStripeNum(num = domainStripe.getNum());
175+
updateUseCase(num);
176+
P.lastShownStripeNum.put((int) num).apply();
177+
mView.renderStripe(mEntityMapper.transform(domainStripe));
178+
}
160179
}
161-
}
162180
}

presentation/src/main/java/com/jorge/boats/xkcd/view/stripe/StripeActivity.java

+7
Original file line numberDiff line numberDiff line change
@@ -322,10 +322,17 @@ public void renderStripe(final @NonNull PresentationStripe model) {
322322
this.mAttacher.setMinimumScale(this.mImage.getScale());
323323

324324
updateShareableData(model);
325+
saveMaxShownStripe(model.getNum());
325326
showNavigationTutorial();
326327
processRateDialogCountUpdate();
327328
}
328329

330+
private void saveMaxShownStripe(final long newStripeId) {
331+
if (newStripeId > P.maxShownStripeNum.get()) {
332+
P.maxShownStripeNum.put((int) newStripeId).apply();
333+
}
334+
}
335+
329336
private void showNavigationTutorial() {
330337
final Resources resources;
331338
final boolean isLandscape = (resources = getResources()).getConfiguration().orientation

0 commit comments

Comments
 (0)