Skip to content
This repository was archived by the owner on Oct 27, 2024. It is now read-only.

Commit 6245d92

Browse files
committed
Moved movie details subscriptions to presenter
1 parent 31c7311 commit 6245d92

File tree

4 files changed

+124
-71
lines changed

4 files changed

+124
-71
lines changed

app/src/main/java/com/esoxjem/movieguide/details/IMovieDetailsPresenter.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,16 @@
1010
public interface IMovieDetailsPresenter
1111
{
1212
void showDetails(Movie movie);
13-
Subscription showTrailers(Movie movie);
14-
Subscription showReviews(Movie movie);
13+
14+
void showTrailers(Movie movie);
15+
16+
void showReviews(Movie movie);
17+
1518
void showFavoriteButton(Movie movie);
19+
1620
void onFavoriteClick(Movie movie);
21+
1722
void setView(IMovieDetailsView view);
23+
24+
void destroy();
1825
}

app/src/main/java/com/esoxjem/movieguide/details/MovieDetailsFragment.java

Lines changed: 42 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -22,20 +22,17 @@
2222

2323
import com.bumptech.glide.Glide;
2424
import com.esoxjem.movieguide.BaseApplication;
25-
import com.esoxjem.movieguide.R;
2625
import com.esoxjem.movieguide.Constants;
2726
import com.esoxjem.movieguide.Movie;
27+
import com.esoxjem.movieguide.R;
2828
import com.esoxjem.movieguide.Review;
2929
import com.esoxjem.movieguide.Video;
30-
import com.esoxjem.movieguide.util.RxUtils;
3130
import com.squareup.picasso.Picasso;
3231

3332
import java.util.List;
3433

3534
import javax.inject.Inject;
3635

37-
import rx.Subscription;
38-
3936
/**
4037
* A simple {@link Fragment} subclass.
4138
*/
@@ -48,15 +45,14 @@ public class MovieDetailsFragment extends Fragment implements IMovieDetailsView,
4845
private TextView title;
4946
private TextView releaseDate;
5047
private TextView rating;
51-
private TextView mMovieOverview;
52-
private TextView mTrailerLabel;
53-
private HorizontalScrollView mTrailersScrollView;
54-
private LinearLayout mTrailersView;
55-
private Subscription mTrailersSub;
56-
private TextView mReviewsLabel;
57-
private LinearLayout mReviewsView;
58-
private FloatingActionButton mFavorite;
59-
private Movie mMovie;
48+
private TextView overview;
49+
private TextView label;
50+
private HorizontalScrollView horizontalScrollView;
51+
private LinearLayout trailers;
52+
private TextView reviews;
53+
private LinearLayout reviewsContainer;
54+
private FloatingActionButton favorite;
55+
private Movie movie;
6056

6157
public MovieDetailsFragment()
6258
{
@@ -100,7 +96,7 @@ public void onViewCreated(View view, Bundle savedInstanceState)
10096
Movie movie = (Movie) getArguments().get(Constants.MOVIE);
10197
if (movie != null)
10298
{
103-
mMovie = movie;
99+
this.movie = movie;
104100
movieDetailsPresenter.showDetails((movie));
105101
movieDetailsPresenter.showFavoriteButton(movie);
106102
}
@@ -113,14 +109,14 @@ private void initLayoutReferences(View rootView)
113109
title = (TextView) rootView.findViewById(R.id.movie_name);
114110
releaseDate = (TextView) rootView.findViewById(R.id.movie_year);
115111
rating = (TextView) rootView.findViewById(R.id.movie_rating);
116-
mMovieOverview = (TextView) rootView.findViewById(R.id.movie_description);
117-
mTrailerLabel = (TextView) rootView.findViewById(R.id.trailers_label);
118-
mTrailersScrollView = (HorizontalScrollView) rootView.findViewById(R.id.trailers_container);
119-
mTrailersView = (LinearLayout) rootView.findViewById(R.id.trailers);
120-
mReviewsLabel = (TextView) rootView.findViewById(R.id.reviews_label);
121-
mReviewsView = (LinearLayout) rootView.findViewById(R.id.reviews);
122-
mFavorite = (FloatingActionButton) rootView.findViewById(R.id.favorite);
123-
mFavorite.setOnClickListener(this);
112+
overview = (TextView) rootView.findViewById(R.id.movie_description);
113+
label = (TextView) rootView.findViewById(R.id.trailers_label);
114+
horizontalScrollView = (HorizontalScrollView) rootView.findViewById(R.id.trailers_container);
115+
trailers = (LinearLayout) rootView.findViewById(R.id.trailers);
116+
reviews = (TextView) rootView.findViewById(R.id.reviews_label);
117+
reviewsContainer = (LinearLayout) rootView.findViewById(R.id.reviews);
118+
favorite = (FloatingActionButton) rootView.findViewById(R.id.favorite);
119+
favorite.setOnClickListener(this);
124120
}
125121

126122
private void setToolbar(View rootView)
@@ -156,8 +152,8 @@ public void showDetails(Movie movie)
156152
title.setText(movie.getTitle());
157153
releaseDate.setText(String.format(getString(R.string.release_date), movie.getReleaseDate()));
158154
rating.setText(String.format(getString(R.string.rating), String.valueOf(movie.getVoteAverage())));
159-
mMovieOverview.setText(movie.getOverview());
160-
mTrailersSub = movieDetailsPresenter.showTrailers(movie);
155+
overview.setText(movie.getOverview());
156+
movieDetailsPresenter.showTrailers(movie);
161157
movieDetailsPresenter.showReviews(movie);
162158
}
163159

@@ -166,22 +162,22 @@ public void showTrailers(List<Video> trailers)
166162
{
167163
if (trailers.isEmpty())
168164
{
169-
mTrailerLabel.setVisibility(View.GONE);
170-
mTrailersView.setVisibility(View.GONE);
171-
mTrailersScrollView.setVisibility(View.GONE);
165+
label.setVisibility(View.GONE);
166+
this.trailers.setVisibility(View.GONE);
167+
horizontalScrollView.setVisibility(View.GONE);
172168

173169
} else
174170
{
175-
mTrailerLabel.setVisibility(View.VISIBLE);
176-
mTrailersView.setVisibility(View.VISIBLE);
177-
mTrailersScrollView.setVisibility(View.VISIBLE);
171+
label.setVisibility(View.VISIBLE);
172+
this.trailers.setVisibility(View.VISIBLE);
173+
horizontalScrollView.setVisibility(View.VISIBLE);
178174

179-
mTrailersView.removeAllViews();
175+
this.trailers.removeAllViews();
180176
LayoutInflater inflater = getActivity().getLayoutInflater();
181177
Picasso picasso = Picasso.with(getContext());
182178
for (Video trailer : trailers)
183179
{
184-
ViewGroup thumbContainer = (ViewGroup) inflater.inflate(R.layout.video, mTrailersView, false);
180+
ViewGroup thumbContainer = (ViewGroup) inflater.inflate(R.layout.video, this.trailers, false);
185181
ImageView thumbView = (ImageView) thumbContainer.findViewById(R.id.video_thumb);
186182
thumbView.setTag(Video.getUrl(trailer));
187183
thumbView.requestLayout();
@@ -192,7 +188,7 @@ public void showTrailers(List<Video> trailers)
192188
.centerCrop()
193189
.placeholder(R.color.colorPrimary)
194190
.into(thumbView);
195-
mTrailersView.addView(thumbContainer);
191+
this.trailers.addView(thumbContainer);
196192
}
197193
}
198194
}
@@ -202,25 +198,25 @@ public void showReviews(List<Review> reviews)
202198
{
203199
if (reviews.isEmpty())
204200
{
205-
mReviewsLabel.setVisibility(View.GONE);
206-
mReviewsView.setVisibility(View.GONE);
201+
this.reviews.setVisibility(View.GONE);
202+
reviewsContainer.setVisibility(View.GONE);
207203
} else
208204
{
209-
mReviewsLabel.setVisibility(View.VISIBLE);
210-
mReviewsView.setVisibility(View.VISIBLE);
205+
this.reviews.setVisibility(View.VISIBLE);
206+
reviewsContainer.setVisibility(View.VISIBLE);
211207

212-
mReviewsView.removeAllViews();
208+
reviewsContainer.removeAllViews();
213209
LayoutInflater inflater = getActivity().getLayoutInflater();
214210
for (Review review : reviews)
215211
{
216-
ViewGroup reviewContainer = (ViewGroup) inflater.inflate(R.layout.review, mReviewsView,
212+
ViewGroup reviewContainer = (ViewGroup) inflater.inflate(R.layout.review, reviewsContainer,
217213
false);
218214
TextView reviewAuthor = (TextView) reviewContainer.findViewById(R.id.review_author);
219215
TextView reviewContent = (TextView) reviewContainer.findViewById(R.id.review_content);
220216
reviewAuthor.setText(review.getAuthor());
221217
reviewContent.setText(review.getContent());
222218
reviewContent.setOnClickListener(this);
223-
mReviewsView.addView(reviewContainer);
219+
reviewsContainer.addView(reviewContainer);
224220
}
225221
}
226222
}
@@ -230,10 +226,10 @@ public void showFavorited()
230226
{
231227
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
232228
{
233-
mFavorite.setImageDrawable(getContext().getResources().getDrawable(R.drawable.ic_favorite_white_24dp, getContext().getTheme()));
229+
favorite.setImageDrawable(getContext().getResources().getDrawable(R.drawable.ic_favorite_white_24dp, getContext().getTheme()));
234230
} else
235231
{
236-
mFavorite.setImageDrawable(getContext().getResources().getDrawable(R.drawable.ic_favorite_white_24dp));
232+
favorite.setImageDrawable(getContext().getResources().getDrawable(R.drawable.ic_favorite_white_24dp));
237233
}
238234
}
239235

@@ -242,10 +238,10 @@ public void showUnFavorited()
242238
{
243239
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
244240
{
245-
mFavorite.setImageDrawable(getContext().getResources().getDrawable(R.drawable.ic_favorite_border_white_24dp, getContext().getTheme()));
241+
favorite.setImageDrawable(getContext().getResources().getDrawable(R.drawable.ic_favorite_border_white_24dp, getContext().getTheme()));
246242
} else
247243
{
248-
mFavorite.setImageDrawable(getContext().getResources().getDrawable(R.drawable.ic_favorite_border_white_24dp));
244+
favorite.setImageDrawable(getContext().getResources().getDrawable(R.drawable.ic_favorite_border_white_24dp));
249245
}
250246
}
251247

@@ -282,13 +278,13 @@ public void onClick(View view)
282278

283279
private void onFavoriteClick()
284280
{
285-
movieDetailsPresenter.onFavoriteClick(mMovie);
281+
movieDetailsPresenter.onFavoriteClick(movie);
286282
}
287283

288284
@Override
289285
public void onDestroyView()
290286
{
291-
RxUtils.unsubscribe(mTrailersSub);
292287
super.onDestroyView();
288+
movieDetailsPresenter.destroy();
293289
}
294290
}

app/src/main/java/com/esoxjem/movieguide/details/MovieDetailsPresenter.java

Lines changed: 52 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44
import com.esoxjem.movieguide.Review;
55
import com.esoxjem.movieguide.Video;
66
import com.esoxjem.movieguide.favorites.IFavoritesInteractor;
7+
import com.esoxjem.movieguide.util.RxUtils;
78

9+
import java.lang.ref.WeakReference;
810
import java.util.List;
911

1012
import rx.Subscriber;
@@ -17,9 +19,11 @@
1719
*/
1820
public class MovieDetailsPresenter implements IMovieDetailsPresenter
1921
{
20-
private IMovieDetailsView movieDetailsView;
22+
private WeakReference<IMovieDetailsView> movieDetailsView;
2123
private IMovieDetailsInteractor movieDetailsInteractor;
2224
private IFavoritesInteractor favoritesInteractor;
25+
private Subscription trailersSubscription;
26+
private Subscription reviewSubscription;
2327

2428
public MovieDetailsPresenter(IMovieDetailsInteractor movieDetailsInteractor, IFavoritesInteractor favoritesInteractor)
2529
{
@@ -30,19 +34,33 @@ public MovieDetailsPresenter(IMovieDetailsInteractor movieDetailsInteractor, IFa
3034
@Override
3135
public void setView(IMovieDetailsView view)
3236
{
33-
movieDetailsView = view;
37+
movieDetailsView = new WeakReference<>(view);
38+
}
39+
40+
@Override
41+
public void destroy()
42+
{
43+
RxUtils.unsubscribe(trailersSubscription, reviewSubscription);
3444
}
3545

3646
@Override
3747
public void showDetails(Movie movie)
3848
{
39-
movieDetailsView.showDetails(movie);
49+
if (isViewAttached())
50+
{
51+
movieDetailsView.get().showDetails(movie);
52+
}
53+
}
54+
55+
private boolean isViewAttached()
56+
{
57+
return movieDetailsView.get() != null;
4058
}
4159

4260
@Override
43-
public Subscription showTrailers(Movie movie)
61+
public void showTrailers(Movie movie)
4462
{
45-
return movieDetailsInteractor.getTrailers(movie.getId()).subscribeOn(Schedulers.io())
63+
trailersSubscription = movieDetailsInteractor.getTrailers(movie.getId()).subscribeOn(Schedulers.io())
4664
.observeOn(AndroidSchedulers.mainThread())
4765
.subscribe(new Subscriber<List<Video>>()
4866
{
@@ -61,15 +79,18 @@ public void onError(Throwable e)
6179
@Override
6280
public void onNext(List<Video> videos)
6381
{
64-
movieDetailsView.showTrailers(videos);
82+
if (isViewAttached())
83+
{
84+
movieDetailsView.get().showTrailers(videos);
85+
}
6586
}
6687
});
6788
}
6889

6990
@Override
70-
public Subscription showReviews(Movie movie)
91+
public void showReviews(Movie movie)
7192
{
72-
return movieDetailsInteractor.getReviews(movie.getId()).subscribeOn(Schedulers.io())
93+
reviewSubscription = movieDetailsInteractor.getReviews(movie.getId()).subscribeOn(Schedulers.io())
7394
.observeOn(AndroidSchedulers.mainThread())
7495
.subscribe(new Subscriber<List<Review>>()
7596
{
@@ -88,7 +109,10 @@ public void onError(Throwable e)
88109
@Override
89110
public void onNext(List<Review> reviews)
90111
{
91-
movieDetailsView.showReviews(reviews);
112+
if (isViewAttached())
113+
{
114+
movieDetailsView.get().showReviews(reviews);
115+
}
92116
}
93117
});
94118
}
@@ -97,27 +121,33 @@ public void onNext(List<Review> reviews)
97121
public void showFavoriteButton(Movie movie)
98122
{
99123
boolean isFavorite = favoritesInteractor.isFavorite(movie.getId());
100-
if(isFavorite)
124+
if (isViewAttached())
101125
{
102-
movieDetailsView.showFavorited();
103-
} else
104-
{
105-
movieDetailsView.showUnFavorited();
126+
if (isFavorite)
127+
{
128+
movieDetailsView.get().showFavorited();
129+
} else
130+
{
131+
movieDetailsView.get().showUnFavorited();
132+
}
106133
}
107134
}
108135

109136
@Override
110137
public void onFavoriteClick(Movie movie)
111138
{
112-
boolean isFavorite = favoritesInteractor.isFavorite(movie.getId());
113-
if(isFavorite)
114-
{
115-
favoritesInteractor.unFavorite(movie.getId());
116-
movieDetailsView.showUnFavorited();
117-
} else
139+
if (isViewAttached())
118140
{
119-
favoritesInteractor.setFavorite(movie);
120-
movieDetailsView.showFavorited();
141+
boolean isFavorite = favoritesInteractor.isFavorite(movie.getId());
142+
if (isFavorite)
143+
{
144+
favoritesInteractor.unFavorite(movie.getId());
145+
movieDetailsView.get().showUnFavorited();
146+
} else
147+
{
148+
favoritesInteractor.setFavorite(movie);
149+
movieDetailsView.get().showFavorited();
150+
}
121151
}
122152
}
123153
}

app/src/main/java/com/esoxjem/movieguide/util/RxUtils.java

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,31 @@ public static void unsubscribe(Subscription subscription)
1616
subscription.unsubscribe();
1717
} else
1818
{
19-
// Aready unsubscribed
19+
// Already unsubscribed
2020
}
2121
} else
2222
{
2323
// Subscription doesn't exist
2424
}
2525
}
26+
27+
public static void unsubscribe(Subscription... subscriptions)
28+
{
29+
for (Subscription subscription : subscriptions)
30+
{
31+
if (subscription != null)
32+
{
33+
if (!subscription.isUnsubscribed())
34+
{
35+
subscription.unsubscribe();
36+
} else
37+
{
38+
// Already unsubscribed
39+
}
40+
} else
41+
{
42+
// Subscription doesn't exist
43+
}
44+
}
45+
}
2646
}

0 commit comments

Comments
 (0)