· 8 years ago · Mar 10, 2018, 02:54 AM
1public class ListContract {
2public static final int MOVIE = 0;
3public static final int TV_SHOW = 1;
4public static final int PERSON = 2;
5
6public static final int TYPE = 1;
7public static final int TOTAL_PAGES = 2;
8public static final int TOTAL_RESULTS = 3;
9
10public static class ListEntry {
11 public static final String TABLE = "list";
12
13 public static final String TYPE = "type";
14 public static final String TOTAL_PAGES = "total_pages";
15 public static final String TOTAL_RESULTS = "total_results";
16}
17
18public static final String CREATE = "CREATE TABLE IF NOT EXISTS " + ListEntry.TABLE + "(" +
19 ListEntry.TYPE + " INTEGER NOT NULL PRIMARY KEY," +
20 ListEntry.TOTAL_PAGES + " INTEGER," +
21 ListEntry.TOTAL_RESULTS + " INTEGER" +
22 ")";
23
24public static long insert(List list) {
25 SQLiteDatabase db = DatabaseManager.getInstance().openDatabase();
26 ContentValues values = new ContentValues();
27 values.put(ListEntry.TYPE, list.getType());
28 values.put(ListEntry.TOTAL_PAGES, list.getTotal_pages());
29 values.put(ListEntry.TOTAL_RESULTS, list.getTotal_results());
30 long id = db.insert(ListEntry.TABLE, null, values);
31 DatabaseManager.getInstance().closeDatabase();
32 return id;
33}
34
35public static long update(List list) {
36 SQLiteDatabase db = DatabaseManager.getInstance().openDatabase();
37 ContentValues values = new ContentValues();
38 values.put(ListEntry.TYPE, list.getType());
39 values.put(ListEntry.TOTAL_PAGES, list.getTotal_pages());
40 values.put(ListEntry.TOTAL_RESULTS, list.getTotal_results());
41 long id = db.update(ListEntry.TABLE, values, ListEntry.TYPE + "=" + list.getType(), null);
42 DatabaseManager.getInstance().closeDatabase();
43 return id;
44}
45
46public static void delete() {
47 SQLiteDatabase db = DatabaseManager.getInstance().openDatabase();
48 db.delete(ListEntry.TABLE, null, null);
49 DatabaseManager.getInstance().closeDatabase();
50
51}
52
53public static List getListByType(int type){
54 SQLiteDatabase db = DatabaseManager.getInstance().openDatabase();
55 Cursor c = db.rawQuery("SELECT * FROM "+ListEntry.TABLE + " WHERE " + ListEntry.TYPE + "=" + type, null);
56 if (c == null)
57 return null;
58 if (!c.moveToFirst())
59 return null;
60 List list = new List();
61 list.setType(c.getInt(TYPE));
62 list.setTotal_pages(c.getInt(TOTAL_PAGES));
63 list.setTotal_results(c.getInt(TOTAL_RESULTS));
64 c.close();
65 DatabaseManager.getInstance().closeDatabase();
66 return list;
67}}
68
69public class MovieContract {
70static final int LIST = 0;
71static final int ITEM = 1;
72public static final int ID = 1;
73public static final int TITLE = 2;
74public static final int ORIGINAL_TITLE = 3;
75public static final int OVERVIEW = 4;
76public static final int HOMEPAGE = 5;
77public static final int BUDGET = 6;
78public static final int BACKDROP_PATH = 7;
79public static final int POSTER_PATH = 8;
80public static final int RUNTIME = 9;
81public static final int STATUS = 10;
82public static final int ADULT = 11;
83public static final int RELEASE_DATE = 12;
84public static final int ORIGINAL_LANGUAGE = 13;
85public static final int REVENUE = 14;
86public static final int DOWNLOADED = 15;
87
88public static abstract class MovieEntry {
89 public static final String TABLE_NAME = "movie";
90
91 public static final String BUDGET = "budget";
92 public static final String BACKDROP_PATH = "backdrop_path";
93 public static final String STATUS = "status";
94 public static final String RUNTIME = "runtime";
95 public static final String ADULT = "adult";
96 public static final String HOMEPAGE = "homepage";
97 public static final String ID = "id";
98 public static final String TITLE = "title";
99 public static final String ORIGINAL_LANGUAGE = "original_language";
100 public static final String OVERVIEW = "overview";
101 public static final String RELEASE_DATE = "release_date";
102 public static final String ORIGINAL_TITLE = "original_title";
103 public static final String POSTER_PATH = "poster_path";
104 public static final String REVENUE = "revenue";
105 public static final String DOWNLOADED = "downloaded";
106}
107
108public static final String CREATE = "CREATE TABLE IF NOT EXISTS " +
109 MovieEntry.TABLE_NAME + "(" +
110 MovieEntry.ID + " INTEGER NOT NULL PRIMARY KEY," +
111 MovieEntry.TITLE + " TEXT," +
112 MovieEntry.ORIGINAL_TITLE + " TEXT," +
113 MovieEntry.OVERVIEW + " TEXT," +
114 MovieEntry.HOMEPAGE + " TEXT," +
115 MovieEntry.BUDGET + " INTEGER," +
116 MovieEntry.BACKDROP_PATH + " TEXT," +
117 MovieEntry.POSTER_PATH + " TEXT," +
118 MovieEntry.RUNTIME + " INTEGER," +
119 MovieEntry.STATUS + " TEXT," +
120 MovieEntry.ADULT + " BOOLEAN," +
121 MovieEntry.RELEASE_DATE + " TEXT," +
122 MovieEntry.ORIGINAL_LANGUAGE + " TEXT," +
123 MovieEntry.REVENUE + " INTEGER," +
124 MovieEntry.DOWNLOADED + " INTEGER " +
125 ")";
126
127public static long insert(Movie movie) {
128 long id;
129 SQLiteDatabase db = DatabaseManager.getInstance().openDatabase();
130
131 ContentValues values = new ContentValues();
132 values.put(MovieEntry.ID, movie.getId());
133 values.put(MovieEntry.TITLE, movie.getTitle());
134 values.put(MovieEntry.ORIGINAL_TITLE, movie.getOriginal_title());
135 values.put(MovieEntry.OVERVIEW, movie.getOverview());
136 values.put(MovieEntry.BACKDROP_PATH, movie.getBackdrop_path());
137 values.put(MovieEntry.POSTER_PATH, movie.getPoster_path());
138 values.put(MovieEntry.ADULT, movie.isAdult());
139 values.put(MovieEntry.RELEASE_DATE, movie.getRelease_date());
140 values.put(MovieEntry.ORIGINAL_LANGUAGE, movie.getOriginal_language());
141 values.put(MovieEntry.DOWNLOADED, LIST);
142
143 id = db.insertWithOnConflict(MovieEntry.TABLE_NAME, null, values,
144 SQLiteDatabase.CONFLICT_ABORT);
145 DatabaseManager.getInstance().closeDatabase();
146 return id;
147}
148
149public static long update(Movie movie) {
150 long id;
151 SQLiteDatabase db = DatabaseManager.getInstance().openDatabase();
152 ContentValues values = new ContentValues();
153
154 values.put(MovieEntry.ID, movie.getId());
155 values.put(MovieEntry.TITLE, movie.getTitle());
156 values.put(MovieEntry.ORIGINAL_TITLE, movie.getOriginal_title());
157 values.put(MovieEntry.OVERVIEW, movie.getOverview());
158 values.put(MovieEntry.HOMEPAGE, movie.getHomepage());
159 values.put(MovieEntry.BUDGET, movie.getBudget());
160 values.put(MovieEntry.BACKDROP_PATH, movie.getBackdrop_path());
161 values.put(MovieEntry.POSTER_PATH, movie.getPoster_path());
162 values.put(MovieEntry.RUNTIME, movie.getRuntime());
163 values.put(MovieEntry.STATUS, movie.getStatus());
164 values.put(MovieEntry.ADULT, movie.isAdult());
165 values.put(MovieEntry.RELEASE_DATE, movie.getRelease_date());
166 values.put(MovieEntry.ORIGINAL_LANGUAGE, movie.getOriginal_language());
167 values.put(MovieEntry.REVENUE, movie.getRevenue());
168 values.put(MovieEntry.DOWNLOADED, ITEM);
169
170 id = db.update(MovieEntry.TABLE_NAME, values, "id=" + movie.getId(), null);
171 DatabaseManager.getInstance().closeDatabase();
172 return id;
173}
174
175public static void delete() {
176 SQLiteDatabase db = DatabaseManager.getInstance().openDatabase();
177 db.delete(MovieEntry.TABLE_NAME, null, null);
178 DatabaseManager.getInstance().closeDatabase();
179}
180
181public static ArrayList<Movie> getAllMovies() {
182 SQLiteDatabase db = DatabaseManager.getInstance().openReadableDatabase();
183 Cursor c = db.rawQuery("SELECT * FROM " + MovieEntry.TABLE_NAME, null);
184 if (!c.moveToFirst())
185 return null;
186 ArrayList<Movie> movies = new ArrayList<>();
187 do {
188 Movie movie = new Movie();
189 movie.setId(c.getInt(ID));
190 movie.setTitle(c.getString(TITLE));
191 movie.setOriginal_title(c.getString(ORIGINAL_TITLE));
192 movie.setOverview(c.getString(OVERVIEW));
193 movie.setBackdrop_path(c.getString(BACKDROP_PATH));
194 movie.setPoster_path(c.getString(POSTER_PATH));
195 movie.setAdult(c.getInt(ADULT) > 0);
196 movie.setRelease_date(c.getString(RELEASE_DATE));
197 movie.setOriginal_language(c.getString(ORIGINAL_LANGUAGE));
198 } while (c.moveToNext());
199 c.close();
200 DatabaseManager.getInstance().closeDatabase();
201 return movies;
202}
203
204public static Movie getMovieById(int id) {
205 SQLiteDatabase db = DatabaseManager.getInstance().openReadableDatabase();
206 Cursor c = db.rawQuery("SELECT * FROM " + MovieEntry.TABLE_NAME +
207 " WHERE " + MovieEntry.ID + "=" + id + " AND " + MovieEntry.DOWNLOADED + "=" + ITEM, null);
208 if (!c.moveToFirst())
209 return null;
210 Movie movie = new Movie();
211 movie.setId(c.getInt(ID));
212 movie.setTitle(c.getString(TITLE));
213 movie.setOriginal_title(c.getString(ORIGINAL_TITLE));
214 movie.setOverview(c.getString(OVERVIEW));
215 movie.setHomepage(c.getString(HOMEPAGE));
216 movie.setBudget(c.getInt(BUDGET));
217 movie.setBackdrop_path(c.getString(BACKDROP_PATH));
218 movie.setPoster_path(c.getString(POSTER_PATH));
219 movie.setRuntime(c.getInt(RUNTIME));
220 movie.setStatus(c.getString(STATUS));
221 movie.setAdult(c.getInt(ADULT) > 0);
222 movie.setRelease_date(c.getString(RELEASE_DATE));
223 movie.setOriginal_language(c.getString(ORIGINAL_LANGUAGE));
224 movie.setRevenue(c.getInt(REVENUE));
225 c.close();
226 DatabaseManager.getInstance().closeDatabase();
227 return movie;
228}}
229
230public class DbHelper extends SQLiteOpenHelper {
231public static final String DATABASE_NAME = "Tekton.db";
232public static final int DATABASE_VERSION = 1;
233
234public DbHelper(Context context) {
235 super(context, DATABASE_NAME, null, DATABASE_VERSION);
236}
237
238@Override
239public void onCreate(SQLiteDatabase db) {
240 db.execSQL(ListContract.CREATE);
241 db.execSQL(MovieContract.CREATE);
242
243}
244
245@Override
246public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
247 ListContract.delete();
248 MovieContract.delete();
249 onCreate(db);
250}}
251
252public abstract class BaseFragment<T> extends Fragment implements Base.View<T>,Base.AdapterListener {
253static final String TAG = "Fragment";
254ProgressBar progressBar;
255RecyclerView recyclerView;
256BaseAdapter<T> adapter;
257LinearLayoutManager layoutManager;
258
259static final int PAGE_START = 1;
260int current = PAGE_START;
261int lastPage = 2;
262boolean isLoading = false, isLastPage = false;
263
264Base.Presenter presenter;
265
266@Override
267public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
268 return inflater.inflate(R.layout.fragment_base, container, false);
269}
270
271/*@Override
272public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
273 super.onViewCreated(view, savedInstanceState);
274 getActivity().setTitle("");
275 progressBar = (ProgressBar) view.findViewById(R.id.progress);
276 recyclerView = (RecyclerView) view.findViewById(R.id.recycler);
277 adapter = createAdapter();
278 presenter = createPresenter();
279 setUpRecyclerView();
280 recyclerView.setAdapter(adapter);
281 recyclerView.addOnScrollListener(getPaginationScroll(layoutManager));
282 presenter.onLoadPopularFirst();
283 setHasOptionsMenu(true);
284}*/
285
286@Override
287public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
288 super.onCreateOptionsMenu(menu, inflater);
289 inflater.inflate(R.menu.nav, menu);
290}
291
292void setUpRecyclerView() {
293 if (getLoaderManager() != null)
294 recyclerView.setLayoutManager(getLayoutManager());
295 recyclerView.setItemAnimator(new DefaultItemAnimator());
296}
297
298public LinearLayoutManager getLayoutManager() {
299 layoutManager = new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false);
300 return layoutManager;
301}
302
303public boolean isConnected() {
304 ConnectivityManager cm =
305 (ConnectivityManager) getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
306 assert cm != null;
307 NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
308 return activeNetwork != null &&
309 activeNetwork.isConnectedOrConnecting();
310}
311
312
313private PaginationScrollListener getPaginationScroll(LinearLayoutManager layoutManager) {
314 return new PaginationScrollListener(layoutManager) {
315 @Override
316 protected void loadMoreItems() {
317 isLoading = true;
318 current += 1;
319 new Handler().postDelayed(new Runnable() {
320 @Override
321 public void run() {
322 presenter.onLoadPopularNext();
323 isLoading = false;
324 }
325 }, 5000);
326 }
327
328 @Override
329 public int getTotalPageCount() {
330 return lastPage;
331 }
332
333 @Override
334 public boolean isLastPage() {
335 return isLastPage;
336 }
337
338 @Override
339 public boolean isLoading() {
340 return isLoading;
341 }
342 };
343}
344
345@Override
346public void showProgress() {
347 progressBar.setVisibility(View.VISIBLE);
348 recyclerView.setVisibility(View.INVISIBLE);
349}
350
351@Override
352public void hideProgress() {
353 progressBar.setVisibility(View.INVISIBLE);
354 recyclerView.setVisibility(View.VISIBLE);
355}
356
357@Override
358public void setError(String error) {
359 Log.e(TAG, error);
360}
361
362@Override
363public void showMessage(String message) {
364 Toast.makeText(getContext(),message,Toast.LENGTH_LONG).show();
365 progressBar.setVisibility(View.GONE);
366}
367
368@Override
369public void loadFirst(ArrayList<T> items, boolean isLastPage, int lastPage) {
370 this.isLastPage = isLastPage;
371 this.lastPage = lastPage;
372 Log.d(TAG, "loadFirstPage: " + current);
373 adapter.addAll(items);
374 if (!isLastPage) adapter.addLoadingFooter();
375}
376
377@Override
378public void loadNext(ArrayList<T> items, boolean isLastPage) {
379 this.isLastPage = isLastPage;
380 Log.d(TAG, "loadNextPage: " + current);
381 adapter.removeLoadingFooter();
382 isLoading = false;
383 adapter.addAll(items);
384 if (!isLastPage) adapter.addLoadingFooter();
385}}
386
387public class MovieFragment extends BaseFragment<Movie> {
388
389@SuppressLint("StaticFieldLeak")
390private static MovieFragment instance = null;
391
392public static MovieFragment newInstance() {
393 if (instance == null)
394 instance = new MovieFragment();
395 return instance;
396}
397
398@Override
399public View onCreateView(LayoutInflater inflater, ViewGroup container,
400 Bundle savedInstanceState) {
401 return inflater.inflate(R.layout.fragment_base, container, false);
402}
403
404@Override
405public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
406 super.onViewCreated(view, savedInstanceState);
407 getActivity().setTitle("");
408 progressBar = (ProgressBar) view.findViewById(R.id.progress);
409 recyclerView = (RecyclerView) view.findViewById(R.id.recycler);
410
411 adapter = new MovieAdapter(getContext());
412 adapter.setListener(this);
413 presenter = new MoviePresenter(this);
414 setUpRecyclerView();
415 recyclerView.setAdapter(adapter);
416 recyclerView.addOnScrollListener(new PaginationScrollListener(layoutManager) {
417 @Override
418 protected void loadMoreItems() {
419 isLoading = true;
420 current += 1;
421 new Handler().postDelayed(new Runnable() {
422 @Override
423 public void run() {
424 presenter.onLoadPopularNext();
425 isLoading = false;
426 }
427 }, 5000);
428 }
429
430 @Override
431 public int getTotalPageCount() {
432 return 20;
433 }
434
435 @Override
436 public boolean isLastPage() {
437 return isLastPage;
438 }
439
440 @Override
441 public boolean isLoading() {
442 return isLoading;
443 }
444 });
445 if (isConnected())
446 presenter.onLoadPopularFirst();
447 else
448 presenter.onLoadPopularDb();
449 setHasOptionsMenu(true);
450}
451
452@Override
453public boolean onOptionsItemSelected(MenuItem item) {
454 if (item.getItemId() == R.id.action_search){
455 Intent i = new Intent(getActivity(), SearchMovieActivity.class);
456 startActivity(i);
457 return true;
458 }
459 return super.onOptionsItemSelected(item);
460}
461
462@Override
463public void loadDb(ArrayList<Movie> items) {
464 Log.d(TAG, "Load from db");
465 adapter.addAll(items);
466}
467
468@Override
469public void loadFirst(ArrayList<Movie> movies, boolean isLastPage, int lastPage) {
470 this.isLastPage = isLastPage;
471 this.lastPage = lastPage;
472 Log.d(TAG, "loadFirstPage: " + current);
473 adapter.addAll(movies);
474 if (!isLastPage) adapter.addLoadingFooter();
475}
476
477@Override
478public void loadNext(ArrayList<Movie> movies, boolean isLastPage) {
479 this.isLastPage = isLastPage;
480 Log.d(TAG, "loadNextPage: " + current);
481 adapter.removeLoadingFooter();
482 isLoading = false;
483 adapter.addAll(movies);
484 if (!isLastPage) adapter.addLoadingFooter();
485}
486
487@Override
488public void onClick(String id) {
489 Intent i = new Intent(getActivity(), MovieDetailActivity.class);
490 i.putExtra("ID", id);
491 startActivity(i);
492}}
493
494public abstract class BaseModel<T> implements Base.Model<T> {
495String TAG = BaseModel.class.getSimpleName();
496static final int PAGE_START = 1;
497int current = PAGE_START;
498int last = 0;}
499
500public class MovieModel extends BaseModel<Movie> {
501@Override
502public void onLoadPopularDb(Base.Listener<Movie> listener) {
503 ArrayList<Movie> movies = MovieContract.getAllMovies();
504 if (movies != null) {
505 Log.d("MOVIEMODEL", movies.size() + "");
506 listener.onFinishedDb(movies);
507 }else
508 listener.onMessage("NO HAY DATOS GUARDADOS EN LA DB");
509}
510
511@Override
512public void loadPopularFirstPage(final Base.Listener<Movie> listener) {
513 Service.Movies service = Client.getClient().create(Service.Movies.class);
514 Call<List> call = service.getMovieChanges(BuildConfig.THE_MOVIE_DB_API_TOKEN);
515 call.enqueue(new Callback<List>() {
516 @Override
517 public void onResponse(Call<List> call, Response<List> response) {
518 switch (response.code()) {
519 case 200:
520 List list = ListContract.getListByType(ListContract.MOVIE);
521 if (list == null) {
522 listener.onMessage("No se ha inicializado");
523 ListContract.insert(response.body());
524 loadFirst(listener, false, true);
525 } else {
526 if (list.getTotal_pages() != response.body().getTotal_pages()) {
527 ListContract.update(response.body());
528 loadFirst(listener, true, true);
529 } else
530 loadFirst(listener, true, false);
531 }
532 break;
533 case 401:
534 listener.onError("Invalid API key: You must be granted a valid key");
535 break;
536 case 404:
537 listener.onError("The resource you requested could not be found");
538 break;
539 }
540 }
541
542 @Override
543 public void onFailure(Call<List> call, Throwable t) {
544 listener.onError(t.getLocalizedMessage());
545 }
546 });
547}
548
549@Override
550public void loadPopularNextPage(final Base.Listener<Movie> listener) {
551 current++;
552 if (current <= last) {
553 Service.Movies service = Client.getClient().create(Service.Movies.class);
554 Call<List<Movie>> call = service.getPopularMovies(BuildConfig.THE_MOVIE_DB_API_TOKEN, "es-ES", current);
555 call.enqueue(new Callback<List<Movie>>() {
556 @Override
557 public void onResponse(Call<List<Movie>> call, Response<List<Movie>> response) {
558 switch (response.code()) {
559 case 200:
560 List<Movie> movies = response.body();
561 listener.onFinishedNext(movies.getResults(), (current == last));
562 break;
563 case 401:
564 listener.onError("Invalid API key: You must be granted a valid key");
565 break;
566 case 404:
567 listener.onError("The resource you requested could not be found");
568 break;
569 }
570 }
571
572 @Override
573 public void onFailure(Call<List<Movie>> call, Throwable t) {
574 listener.onError(t.getLocalizedMessage());
575 }
576 });
577 } else
578 listener.onError("do not have more pages");
579}
580
581private void loadFirst(final Base.Listener<Movie> listener, final boolean isSavedInDb, final boolean isChanged) {
582 Service.Movies service = Client.getClient().create(Service.Movies.class);
583 Call<List<Movie>> call = service.getPopularMovies(BuildConfig.THE_MOVIE_DB_API_TOKEN, "es-ES", 1);
584 call.enqueue(new Callback<List<Movie>>() {
585 @Override
586 public void onResponse(Call<List<Movie>> call, Response<List<Movie>> response) {
587 switch (response.code()){
588 case 200:
589 List<Movie> movies = response.body();
590 last = movies.getTotal_pages();
591 if (isChanged) {
592 if (isSavedInDb)
593 MovieContract.delete();
594 for (Movie movie : movies.getResults()) {
595 MovieContract.insert(movie);
596 }
597 }
598 listener.onFinishedFirst(movies.getResults(), (current == last), last);
599 break;
600 case 401:
601 listener.onError("Invalid API key: You must be granted a valid key");
602 break;
603 case 404:
604 listener.onError("The resource you requested could not be found");
605 break;
606 }
607 }
608
609 @Override
610 public void onFailure(Call<List<Movie>> call, Throwable t) {
611 listener.onError(t.getLocalizedMessage());
612 }
613 });
614}}