Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

MVVM architecture based design #8

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file modified Moviez/.idea/caches/build_file_checksums.ser
Binary file not shown.
9 changes: 9 additions & 0 deletions Moviez/app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ android {
}

dependencies {
def lifecycle_version = "1.1.1"
def room_version = "1.1.1"
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:26.1.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
Expand All @@ -32,4 +34,11 @@ dependencies {
implementation 'com.android.support:design:26.1.0'
implementation 'com.android.support:recyclerview-v7:26.1.0'
implementation 'com.android.support:cardview-v7:26.1.0'
//adding dependency for the room and the live data
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
implementation "android.arch.lifecycle:extensions:$lifecycle_version"
annotationProcessor "android.arch.lifecycle:compiler:$lifecycle_version"
implementation "android.arch.persistence.room:runtime:$room_version"
annotationProcessor "android.arch.persistence.room:compiler:$room_version"

}
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
package com.example.mohamedniyaz.moviezapp.activity;

import android.app.FragmentManager;
import android.app.Fragment;
import android.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;

import com.example.mohamedniyaz.moviezapp.R;
import com.example.mohamedniyaz.moviezapp.fragments.MovieFragment;
Expand All @@ -14,15 +15,16 @@

// TODO Reasonable naming
public class MovieActivity extends AppCompatActivity implements FragmentActivityCommunication {
public static final String TAG = "MainAvtivity";
public static final String TAG = "MainActivity";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ConstantMethods.newInstance().printLogs("onCreate", "onCreate: ++ ");
Fragment fragment = new MovieFragment();
if(fragment!=null) {
FragmentManager fragmentManager = getFragmentManager();
if (fragment != null) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(R.id.fragment_one_frame, fragment);
fragmentTransaction.addToBackStack(MovieFragment.class.getSimpleName());
Expand All @@ -40,8 +42,8 @@ protected void onResume() {
@Override
public void movieId(int position) {
Fragment fragment = MovieResponseFragment.newInstance(position);
getFragmentManager().beginTransaction()
.replace(R.id.fragment_one_frame,fragment)
getSupportFragmentManager().beginTransaction()
.replace(R.id.fragment_one_frame, fragment)
.addToBackStack(null).commit();
ConstantMethods.newInstance().printLogs(TAG, "movieId: " + position);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.example.mohamedniyaz.moviezapp.dao;

import android.arch.persistence.room.Dao;

@Dao
public interface MovieDao {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package com.example.mohamedniyaz.moviezapp.entity;

import android.arch.persistence.room.Entity;
import android.arch.persistence.room.PrimaryKey;

@Entity(tableName = "favouriteMovieList")
public class MovieEntity {

@PrimaryKey
private int movieId;
private String movieName;
private boolean favouriteMovie;

public MovieEntity(int movieId, String movieName, boolean favouriteMovie) {
this.movieId = movieId;
this.movieName = movieName;
this.favouriteMovie = favouriteMovie;
}

public int getMovieId() {
return movieId;
}

public void setMovieId(int movieId) {
this.movieId = movieId;
}

public String getMovieName() {
return movieName;
}

public void setMovieName(String movieName) {
this.movieName = movieName;
}

public boolean isFavouriteMovie() {
return favouriteMovie;
}

public void setFavouriteMovie(boolean favouriteMovie) {
this.favouriteMovie = favouriteMovie;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.example.mohamedniyaz.moviezapp.executors;

import java.util.concurrent.Executor;
import java.util.concurrent.Executors;

public class AppExecutor {

private Executor appExecutor;

public AppExecutor(Executor executor) {
this.appExecutor = executor;
}

public AppExecutor() {
this(Executors.newSingleThreadExecutor());
}

public Executor getAppExecutor() {
return appExecutor;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@

//TODO unused imports and variables (Shortcuts)

import android.app.Fragment;
import android.arch.lifecycle.Observer;
import android.arch.lifecycle.ViewModelProviders;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
Expand All @@ -21,28 +23,19 @@
import com.example.mohamedniyaz.moviezapp.interfaces.FragmentActivityCommunication;
import com.example.mohamedniyaz.moviezapp.interfaces.HandlerResultListener;
import com.example.mohamedniyaz.moviezapp.modules.Movie;
import com.example.mohamedniyaz.moviezapp.modules.MovieResponse;
import com.example.mohamedniyaz.moviezapp.moviezApp.AppConstants;
import com.example.mohamedniyaz.moviezapp.moviezApp.ConstantMethods;
import com.example.mohamedniyaz.moviezapp.rest.ApiClient;
import com.example.mohamedniyaz.moviezapp.rest.ApiInterface;
import com.example.mohamedniyaz.moviezapp.viewModel.MoviesViewModel;
import com.facebook.drawee.view.SimpleDraweeView;

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

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

public class MovieFragment extends Fragment {

public static final String one = "movie_id";

private static final String TAG = MovieActivity.class.getSimpleName();
private SimpleDraweeView draweeView;
// TODO - insert your themoviedb.org API KEY here
//private final static String API_KEY = "0e12101a22c608993caa890e9dabea92";
public static int page = 1;
private String backdropPath;
private List<Movie> movies = new ArrayList<>();
Expand All @@ -55,14 +48,47 @@ public class MovieFragment extends Fragment {
private FragmentActivityCommunication fragmentActivityCommunication;
int total = 0;
int lastVisibleItemCount = 0;
private MoviesViewModel moviesViewModel;

public MovieFragment() {
}

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
loadData();
//TODO major libraries need to be initialized in application class
//TODO not required
// loadData();
}

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
/* moviesViewModel.getmMovieArrayList().observe(getActivity(), new Observer<List<Movie>>() {
@Override
public void onChanged(@Nullable List<Movie> movies) {
if (movies != null) {
isReloaded = true;
for (int i = 0; i < movies.size(); i++) {
ConstantMethods.newInstance().printLogs(MovieFragment.class.getSimpleName(), String.valueOf(movies.get(i)));
Log.d(TAG, "MoviesList: " + movies.get(i).getTitle());
}
moviesList.addAll(movies);
if (moviesAdapter != null) {
moviesAdapter.update(moviesList);
}
reachedLastPosition = false;
recyclerView.setMotionEventSplittingEnabled(false);
} else {
// do nothing
}
}
}); }*/
}

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
moviesViewModel = ViewModelProviders.of(getActivity()).get(MoviesViewModel.class);
loadMovies();
}

@Override
Expand All @@ -73,7 +99,6 @@ public void onAttach(Context context) {

@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
//TODO allignment shortcut
Log.d(TAG, "onCreateView: OnCreateView");

final View view = inflater.inflate(R.layout.fragment_moviez_list, container, false);
Expand Down Expand Up @@ -105,13 +130,12 @@ public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
total = layoutManager.getItemCount();
//TODO not required
// int firstVisibleItemCount = layoutManager.findFirstVisibleItemPosition();
lastVisibleItemCount = layoutManager.findLastVisibleItemPosition();
if ((!reachedLastPosition) && (total > 0) && ((total - 1) == lastVisibleItemCount)) {
page++;
loadData();
//TODO isLoaded could be a better name
loadMovies();
// loadData();
reachedLastPosition = true;
}
}
Expand All @@ -121,42 +145,44 @@ public void onScrolled(RecyclerView recyclerView, int dx, int dy) {

}


public void loadData() {
final ApiInterface apiService =
ApiClient.getClient().create(ApiInterface.class);
Call<MovieResponse> call = apiService.getResults(AppConstants.API_KEY, page);
call.enqueue(new Callback<MovieResponse>() {
@Override
public void onResponse(Call<MovieResponse> call, Response<MovieResponse> response) {
isReloaded = true;
//int statusCode = response.code();
movies = response.body().getResults();

Log.d(TAG, "onResponse: " + page);
//TODO Not required handle at Entity
for (int i = 0; i < movies.size(); i++) {
ConstantMethods.newInstance().printLogs(MovieFragment.class.getSimpleName(), String.valueOf(movies.get(i)));
Log.d(TAG, "MoviesList: " + movies.get(i).getTitle());
}
moviesList.addAll(movies);
if (moviesAdapter != null) {
moviesAdapter.update(moviesList);
}
reachedLastPosition = false;
recyclerView.setMotionEventSplittingEnabled(false);
}

@Override
public void onFailure(Call<MovieResponse> call, Throwable t) {
Log.d(TAG, "onFailure: ");
// Log error here since request failed
Log.e(TAG, t.toString());
}
});
//load data should call the movie repository class and then update the UI initially
public void loadMovies() {
moviesViewModel.fetchRecentMoviesApi(page);
}

//TODO Not required to run a loop a select query should do
// public void loadData() {
// final ApiInterface apiService =
// ApiClient.getClient().create(ApiInterface.class);
// Call<MovieResponse> call = apiService.getResults(AppConstants.API_KEY, page);
// call.enqueue(new Callback<MovieResponse>() {
// @Override
// public void onResponse(Call<MovieResponse> call, Response<MovieResponse> response) {
// isReloaded = true;
// //int statusCode = response.code();
// movies = response.body().getResults();
//
// Log.d(TAG, "onResponse: " + page);
// for (int i = 0; i < movies.size(); i++) {
// ConstantMethods.newInstance().printLogs(MovieFragment.class.getSimpleName(), String.valueOf(movies.get(i)));
// Log.d(TAG, "MoviesList: " + movies.get(i).getTitle());
// }
// moviesList.addAll(movies);
// if (moviesAdapter != null) {
// moviesAdapter.update(moviesList);
// }
// reachedLastPosition = false;
// recyclerView.setMotionEventSplittingEnabled(false);
// }
//
// @Override
// public void onFailure(Call<MovieResponse> call, Throwable t) {
// Log.d(TAG, "onFailure: ");
// // Log error here since request failed
// Log.e(TAG, t.toString());
// }
// });
// }

@Override
public void onResume() {
super.onResume();
Expand Down Expand Up @@ -184,13 +210,33 @@ public void onResult(Object... object) {
}
}
});
moviesViewModel.getMovieArrayList().observe(getActivity(), new Observer<List<Movie>>() {
@Override
public void onChanged(@Nullable List<Movie> movies) {
if (movies != null) {
isReloaded = true;
for (int i = 0; i < movies.size(); i++) {
ConstantMethods.newInstance().printLogs(MovieFragment.class.getSimpleName(), String.valueOf(movies.get(i)));
Log.d(TAG, "MoviesList: " + movies.get(i).getTitle());
}
moviesList.addAll(movies);
if (moviesAdapter != null) {
moviesAdapter.update(moviesList);
}
reachedLastPosition = false;
recyclerView.setMotionEventSplittingEnabled(false);
} else {
// do nothing
}
}
});
Log.d(TAG, "onResume movie fragment --");
}

@Override
public void onStop() {
Log.d(TAG, "onStop: " + moviesList.size());
super.onStop();
Log.d(TAG, "onStop: " + moviesList.size());
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import android.os.Bundle;
import android.support.design.widget.CollapsingToolbarLayout;
import android.support.design.widget.FloatingActionButton;
import android.app.Fragment;
import android.support.v4.app.Fragment;
import android.support.v4.content.ContextCompat;
import android.util.Log;
import android.view.LayoutInflater;
Expand Down
Loading