Skip to content

Commit

Permalink
Setup Recyclerview for Trending movie list
Browse files Browse the repository at this point in the history
  • Loading branch information
ShashankSinha98 committed Apr 2, 2022
1 parent 2901629 commit e20f131
Show file tree
Hide file tree
Showing 24 changed files with 469 additions and 3 deletions.
5 changes: 5 additions & 0 deletions .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 9 additions & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -35,13 +35,16 @@ android {
}

dependencies {
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'
def retrofit_version = '2.9.0'
def dagger_version = '2.22'
def rxjava_version = '2.1.1'
def rxcalladapter_version = '2.5.0'
def rxandroid_version = '2.0.1'
def material_version = "1.0.0"
def nav_version = '2.2.2'
def glideVersion = '4.8.0'
def androidxVersion = '1.0.0'

implementation 'androidx.appcompat:appcompat:1.4.1'
implementation 'com.google.android.material:material:1.5.0'
Expand All @@ -60,6 +63,8 @@ dependencies {
implementation "androidx.navigation:navigation-ui-ktx:$nav_version"
implementation "androidx.navigation:navigation-runtime:$nav_version"

implementation "androidx.recyclerview:recyclerview:$androidxVersion"

//Retrofit for Networking
implementation "com.squareup.retrofit2:retrofit:$retrofit_version"
implementation "com.squareup.retrofit2:converter-gson:$retrofit_version"
Expand All @@ -80,4 +85,8 @@ dependencies {

// Rx-Retrofit Call Adapter
implementation "com.squareup.retrofit2:adapter-rxjava2:$rxcalladapter_version" // Retrofit call adapter

// Glide
implementation "com.github.bumptech.glide:glide:$glideVersion"
annotationProcessor "com.github.bumptech.glide:compiler:$glideVersion"
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package com.shashank.moviedb.di;

import com.shashank.moviedb.di.home.HomeFragmentBuildersModule;
import com.shashank.moviedb.di.home.HomeModule;
import com.shashank.moviedb.di.home.HomeScope;
import com.shashank.moviedb.ui.HomeActivity;

import dagger.Module;
Expand All @@ -9,6 +12,9 @@
@Module
public abstract class ActivityBuildersModule {

@ContributesAndroidInjector
@HomeScope
@ContributesAndroidInjector(
modules = {HomeModule.class, HomeFragmentBuildersModule.class}
)
abstract HomeActivity contributeHomeActivity();
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import android.app.Application;

import com.shashank.moviedb.BaseApplication;
import com.shashank.moviedb.ui.home.viewholder.MovieViewHolder;

import javax.inject.Singleton;

Expand Down
21 changes: 21 additions & 0 deletions app/src/main/java/com/shashank/moviedb/di/AppModule.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
package com.shashank.moviedb.di;

import android.app.Application;

import com.bumptech.glide.Glide;
import com.bumptech.glide.RequestManager;
import com.bumptech.glide.request.RequestOptions;
import com.shashank.moviedb.R;
import com.shashank.moviedb.data.remote.MovieApi;
import com.shashank.moviedb.data.remote.MovieRepository;
import com.shashank.moviedb.data.remote.MovieRepositoryImpl;
Expand Down Expand Up @@ -50,4 +56,19 @@ public static MovieApi provideMovieApi(Retrofit retrofit) {
public static MovieRepository provideMovieRepository(MovieApi movieApi) {
return new MovieRepositoryImpl(movieApi);
}

// TODO: set placeholder later
@Singleton
@Provides
public static RequestOptions provideRequestOptions() {
return RequestOptions.placeholderOf(R.drawable.small_placeholder)
.error(R.drawable.small_placeholder);
}

@Singleton
@Provides
public static RequestManager provideGlideInstance(Application application, RequestOptions requestOptions) {
return Glide.with(application).setDefaultRequestOptions(requestOptions);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.shashank.moviedb.di.home;

import com.shashank.moviedb.ui.home.HomeFragment;
import com.shashank.moviedb.ui.home.viewholder.MovieViewHolder;

import dagger.Module;
import dagger.android.ContributesAndroidInjector;

@Module
public abstract class HomeFragmentBuildersModule {

@ContributesAndroidInjector
abstract HomeFragment contributeHomeFragment();
}
28 changes: 28 additions & 0 deletions app/src/main/java/com/shashank/moviedb/di/home/HomeModule.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.shashank.moviedb.di.home;

import android.app.Application;

import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.bumptech.glide.RequestManager;
import com.shashank.moviedb.ui.home.adapter.MovieRecyclerAdapter;

import dagger.Module;
import dagger.Provides;

@Module
public class HomeModule {

@HomeScope
@Provides
public static MovieRecyclerAdapter provideMovieRecyclerAdapter(RequestManager requestManager) {
return new MovieRecyclerAdapter(requestManager);
}

@HomeScope
@Provides
public static RecyclerView.LayoutManager provideGridLayoutManager(Application application) {
return new GridLayoutManager(application, 2);
}
}
13 changes: 13 additions & 0 deletions app/src/main/java/com/shashank/moviedb/di/home/HomeScope.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.shashank.moviedb.di.home;

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

import javax.inject.Scope;

@Scope
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface HomeScope {
}
45 changes: 43 additions & 2 deletions app/src/main/java/com/shashank/moviedb/ui/home/HomeFragment.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,30 @@

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.RecyclerView;

import com.bumptech.glide.RequestManager;
import com.shashank.moviedb.R;
import com.shashank.moviedb.data.Resource;
import com.shashank.moviedb.data.ResourceCallback;
import com.shashank.moviedb.data.Status;
import com.shashank.moviedb.data.remote.MovieRepository;
import com.shashank.moviedb.model.MovieResponse;
import com.shashank.moviedb.model.MovieResult;
import com.shashank.moviedb.ui.home.adapter.MovieRecyclerAdapter;

public class HomeFragment extends Fragment {
import java.util.List;

import javax.inject.Inject;

import dagger.android.support.DaggerFragment;

public class HomeFragment extends DaggerFragment {

@Inject public MovieRecyclerAdapter movieRecyclerAdapter;
@Inject public RecyclerView.LayoutManager gridLayoutManager;
@Inject public MovieRepository movieRepository;
private RecyclerView movieRecyclerView;

@Nullable
@Override
Expand All @@ -20,5 +39,27 @@ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup c
return inflater.inflate(R.layout.fragment_home, null);
}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
movieRecyclerView = view.findViewById(R.id.rv_movie);

initUI();
movieRepository.fetchTrendingMovies(new ResourceCallback() {
@Override
public void onResponse(Resource resource) {
if(resource.getStatus() == Status.SUCCESS) {
List<MovieResult> movies = ((MovieResponse)resource.getData()).getResults();
movieRecyclerAdapter.setMovies(movies);
}
}
});
}

private void initUI() {
movieRecyclerView.setLayoutManager(gridLayoutManager);
movieRecyclerView.setAdapter(movieRecyclerAdapter);
}


}
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
package com.shashank.moviedb.ui.home.adapter;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.annotation.NonNull;
import androidx.lifecycle.MutableLiveData;
import androidx.recyclerview.widget.RecyclerView;

import com.bumptech.glide.RequestManager;
import com.shashank.moviedb.R;
import com.shashank.moviedb.model.MovieResult;
import com.shashank.moviedb.ui.home.viewholder.MovieViewHolder;

import java.util.ArrayList;
import java.util.List;

import javax.inject.Inject;

public class MovieRecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

private static final int MOVIE_TYPE = 1;
private static final int EXHAUSTED_TYPE = 2;
private RequestManager requestManager;

@Inject
public MovieRecyclerAdapter(RequestManager requestManager) {
this.requestManager = requestManager;
}

private List<MovieResult> mMovies = new ArrayList<>();

@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

View view = null;

switch (viewType) {

case EXHAUSTED_TYPE:
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_search_exhausted, parent, false);
return new SearchExhaustedViewHolder(view);

case MOVIE_TYPE:

default:
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.movie_view_layout, parent, false);
return new MovieViewHolder(view, requestManager);
}
}

@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {

int viewType = getItemViewType(position);

if(viewType == MOVIE_TYPE) {
((MovieViewHolder)holder).onBind(mMovies.get(position));
}
}

@Override
public int getItemCount() {
return mMovies.size();
}

@Override
public int getItemViewType(int position) {
if(!mMovies.isEmpty()) {
return MOVIE_TYPE;
} else {
// movie list is empty
return EXHAUSTED_TYPE;
}
}


public void setMovies(List<MovieResult> movies) {
this.mMovies = movies;
notifyDataSetChanged();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.shashank.moviedb.ui.home.adapter;

import android.view.View;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

public class SearchExhaustedViewHolder extends RecyclerView.ViewHolder {

public SearchExhaustedViewHolder(@NonNull View itemView) {
super(itemView);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package com.shashank.moviedb.ui.home.viewholder;

import android.view.View;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.appcompat.widget.AppCompatImageView;
import androidx.recyclerview.widget.RecyclerView;

import com.bumptech.glide.RequestManager;
import com.shashank.moviedb.R;
import com.shashank.moviedb.model.MovieResult;
import com.shashank.moviedb.util.Constants;

import javax.inject.Inject;

public class MovieViewHolder extends RecyclerView.ViewHolder {


private RequestManager requestManager;

private AppCompatImageView movieImage;
private TextView movieTitle;
private TextView movieVoteAverage;

public MovieViewHolder(@NonNull View itemView, RequestManager requestManager) {
super(itemView);
this.requestManager = requestManager;
movieImage = itemView.findViewById(R.id.iv_movie);
movieTitle = itemView.findViewById(R.id.tv_movie_title);
movieVoteAverage = itemView.findViewById(R.id.tv_vote_average);
}


public void onBind(MovieResult movie) {

String url = getMoviePosterUrl(movie);
if(url!=null) {
final String finalPosterUrl = Constants.BASE_IMAGE_URL_API + url;
requestManager.load(finalPosterUrl).into(movieImage);
}

movieTitle.setText(movie.getTitle());

String voteAverage = (movie.getVoteAverage()!=null)? movie.getVoteAverage().toString() : "_._";
movieVoteAverage.setText(voteAverage);
}

private String getMoviePosterUrl(MovieResult movie) {
String url = null;
if(movie.getBackdropPath()!=null) {
url = movie.getBackdropPath();
} else if(movie.getPosterPath()!=null) {
url = movie.getPosterPath();
}

return url;
}
}
2 changes: 2 additions & 0 deletions app/src/main/java/com/shashank/moviedb/util/Constants.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ public abstract class Constants {
public static final Long READ_TIMEOUT = 2000L;

public static final String INVALID_MOVIE_ID_ERROR_MSG = "Invalid Movie ID";
public static final String BASE_IMAGE_URL_API = "https://image.tmdb.org/t/p/w185_and_h278_bestv2/";
public static final String BASE_IMAGE_URL_w500_API = "https://image.tmdb.org/t/p/w500/";



Expand Down
Loading

0 comments on commit e20f131

Please sign in to comment.