· 8 years ago · Apr 25, 2018, 07:46 PM
1import android.content.Context;
2import android.content.Intent;
3import android.net.Uri;
4import android.support.v7.app.AppCompatActivity;
5import android.os.Bundle;
6import android.view.View;
7import android.widget.Button;
8
9import com.example.soham.popularmoviesstage2.data.MovieContract;
10import com.example.soham.popularmoviesstage2.data.MovieProvider;
11import com.example.soham.popularmoviesstage2.data.Movies;
12import com.example.soham.popularmoviesstage2.data.SyncMovieDb;
13
14import java.util.ArrayList;
15import java.util.List;
16
17public class MainActivity extends AppCompatActivity {
18 List<Movies> mMoviesList = new ArrayList<>();
19 Button detailClick;
20 @Override
21 protected void onCreate(Bundle savedInstanceState) {
22 super.onCreate(savedInstanceState);
23 setContentView(R.layout.activity_main);
24
25 detailClick = findViewById(R.id.detail_click);
26
27 boolean insertedCorrectly = insertDummyData();
28 if(insertedCorrectly){
29 SyncMovieDb.syncMovies(mMoviesList,this);
30 }
31
32 detailClick.setOnClickListener(new View.OnClickListener() {
33 @Override
34 public void onClick(View view) {
35 Class destinationClass = DetailActivity.class;
36 Intent intentToStartDetailActivity = new Intent(MainActivity.this, destinationClass);
37 Uri movieUri = MovieContract.MovieEntry.buildMovieUriWithId(334897);
38 intentToStartDetailActivity.setData(movieUri);
39 startActivity(intentToStartDetailActivity);
40 }
41 });
42 }
43
44
45 public boolean insertDummyData(){
46 int movieId = 334897;
47 Double userRating = 8.5;
48 String originalTitle = "Dummy Movie";
49 String poster = "poster_path";
50 String plot = "This is a dummy movie entry";
51 String releaseDate = "25/04/2018";
52 Movies movies = new Movies(movieId, userRating, originalTitle, poster, plot, releaseDate);
53 mMoviesList.add(movies);
54 if(mMoviesList.size()!=0){
55 return true;
56 }else{
57 return false;
58 }
59 }
60}
61
62import android.database.Cursor;
63import android.net.Uri;
64import android.support.annotation.NonNull;
65import android.support.annotation.Nullable;
66import android.support.v4.app.LoaderManager;
67import android.support.v4.content.CursorLoader;
68import android.support.v4.content.Loader;
69import android.support.v7.app.AppCompatActivity;
70import android.os.Bundle;
71import android.util.Log;
72import android.widget.TextView;
73
74import com.example.soham.popularmoviesstage2.data.MovieContract;
75
76public class DetailActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<Cursor>{
77 Uri receivedMovieUri;
78 private String movieTitle;
79 private int movieId=0;
80 private static final int LOADER_ID = 783;
81
82 private LoaderManager.LoaderCallbacks<Cursor> mCallbacks;
83
84 TextView mTextView;
85 private static final String[] MOVIE_PROJECTION = {
86 MovieContract.MovieEntry.COLUMN_MOVIE_ID,
87 MovieContract.MovieEntry.COLUMN_MOVIE_TITLE,
88 MovieContract.MovieEntry.COLUMN_MOVIE_PLOT,
89 MovieContract.MovieEntry.COLUMN_MOVIE_RATING,
90 MovieContract.MovieEntry.COLUMN_MOVIE_RELEASE,
91 MovieContract.MovieEntry.COLUMN_MOVIE_FAVORITE,
92 MovieContract.MovieEntry.COLUMN_MOVIE_POSTER
93 };
94
95 public static final int INDEX_COLUMN_MOVIE_ID = 0;
96 public static final int INDEX_COLUMN_MOVIE_TITLE = 1;
97
98 @Override
99 protected void onCreate(Bundle savedInstanceState) {
100 super.onCreate(savedInstanceState);
101 setContentView(R.layout.activity_detail);
102 mTextView = findViewById(R.id.detail_text_view);
103 receivedMovieUri = getIntent().getData();
104 Log.v("Uri : " , receivedMovieUri.toString());
105 mCallbacks=this;
106 getSupportLoaderManager().initLoader(LOADER_ID,null,mCallbacks).forceLoad();
107 }
108
109 @NonNull
110 @Override
111 public Loader<Cursor> onCreateLoader(int id, @Nullable Bundle args) {
112
113 return new CursorLoader(this,
114 receivedMovieUri,
115 MOVIE_PROJECTION,
116 null,
117 null,
118 null);
119 }
120
121 @Override
122 public void onLoadFinished(@NonNull Loader<Cursor> loader, Cursor data) {
123 boolean cursorHasValidData = false;
124 if (data != null && data.moveToFirst()) {
125 /* We have valid data, continue on to bind the data to the UI */
126 cursorHasValidData = true;
127 }
128
129 if (!cursorHasValidData) {
130 /* No data to display, simply return and do nothing */
131 return;
132 }
133
134 movieId = data.getInt(INDEX_COLUMN_MOVIE_ID);
135 movieTitle = data.getString(INDEX_COLUMN_MOVIE_TITLE);
136
137 mTextView.setText(movieId + movieTitle);
138 }
139
140 @Override
141 public void onLoaderReset(@NonNull Loader<Cursor> loader) {
142 mTextView.setText("");
143 }
144}
145
146import android.net.Uri;
147import android.provider.BaseColumns;
148
149public class MovieContract {
150
151 public static final String CONTENT_AUTHORITY = "com.example.soham.popularmoviesstage2";
152
153 public static final Uri BASE_CONTENT_URI = Uri.parse("content://" + CONTENT_AUTHORITY);
154
155 public static final String PATH = "movies";
156
157 public static final class MovieEntry implements BaseColumns {
158
159 public static final Uri CONTENT_URI = BASE_CONTENT_URI.buildUpon()
160 .appendPath(PATH)
161 .build();
162
163 public static final String TABLE_NAME = "movies";
164 public static final String COLUMN_MOVIE_ID = "movie_id";
165 public static final String COLUMN_MOVIE_TITLE = "title";
166 public static final String COLUMN_MOVIE_RATING = "rating";
167 public static final String COLUMN_MOVIE_PLOT = "plot";
168 public static final String COLUMN_MOVIE_RELEASE = "release_date";
169 public static final String COLUMN_MOVIE_FAVORITE = "favorite";
170 public static final String COLUMN_MOVIE_POSTER = "poster_url";
171
172
173 public static Uri buildMovieUriWithId(int id) {
174 return CONTENT_URI.buildUpon()
175 .appendPath(Integer.toString(id))
176 .build();
177
178 }
179
180 }
181
182}
183
184import android.content.Context;
185import android.database.sqlite.SQLiteDatabase;
186import android.database.sqlite.SQLiteOpenHelper;
187import com.example.soham.popularmoviesstage2.data.MovieContract.MovieEntry;
188
189public class MovieDbHelper extends SQLiteOpenHelper {
190
191 public static final String DATABASE_NAME = "movies.db";
192
193 public static final int DATABASE_VERSION = 2;
194
195 public MovieDbHelper(Context context){
196 super(context,DATABASE_NAME,null,DATABASE_VERSION);
197 }
198
199 @Override
200 public void onCreate(SQLiteDatabase db) {
201
202 final String SQL_CREATE_MOVIES_TABLE = "CREATE TABLE " + MovieEntry.TABLE_NAME + "( "
203 +MovieEntry._ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
204 +MovieEntry.COLUMN_MOVIE_ID + " INTEGER NOT NULL,"
205 +MovieEntry.COLUMN_MOVIE_TITLE + " TEXT NOT NULL,"
206 +MovieEntry.COLUMN_MOVIE_PLOT + " TEXT NOT NULL,"
207 +MovieEntry.COLUMN_MOVIE_RATING + " REAL NOT NULL,"
208 +MovieEntry.COLUMN_MOVIE_RELEASE + " TEXT NOT NULL,"
209 +MovieEntry.COLUMN_MOVIE_FAVORITE + " INTEGER NOT NULL DEFAULT 0,"
210 +MovieEntry.COLUMN_MOVIE_POSTER + " TEXT NOT NULL, "
211 +"UNIQUE ( " + MovieEntry.COLUMN_MOVIE_ID + " ) ON CONFLICT IGNORE"
212 + ");";
213
214 db.execSQL(SQL_CREATE_MOVIES_TABLE);
215 }
216
217 @Override
218 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
219 final String SQL_DROP_MOVIES_TABLE = "DROP TABLE IF EXISTS " + MovieEntry.TABLE_NAME;
220 db.execSQL(SQL_DROP_MOVIES_TABLE);
221 onCreate(db);
222 }
223}
224
225import android.content.ContentProvider;
226import android.content.ContentValues;
227import android.content.UriMatcher;
228import android.database.Cursor;
229import android.database.sqlite.SQLiteDatabase;
230import android.net.Uri;
231import android.support.annotation.NonNull;
232import android.support.annotation.Nullable;
233import android.util.Log;
234
235public class MovieProvider extends ContentProvider {
236
237 private MovieDbHelper movieDbHelper;
238
239 private static final int MOVIE_DATA = 541;
240 private static final int MOVIE_DATA_WITH_ID = 542;
241
242 private static final UriMatcher sUriMatcher = buildUriMatcher();
243
244
245 public static UriMatcher buildUriMatcher(){
246
247 final UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
248 final String authority = MovieContract.CONTENT_AUTHORITY;
249
250 uriMatcher.addURI(authority,MovieContract.PATH, MOVIE_DATA);
251 uriMatcher.addURI(authority,MovieContract.PATH+"/#", MOVIE_DATA_WITH_ID);
252
253 return uriMatcher;
254 }
255
256 @Override
257 public boolean onCreate() {
258 movieDbHelper = new MovieDbHelper(getContext());
259 return true;
260 }
261
262 @Nullable
263 @Override
264 public Cursor query(@NonNull Uri uri, @Nullable String[] projection,
265 @Nullable String selection, @Nullable String[] selectionArgs,
266 @Nullable String sortOrder) {
267 Cursor cursor;
268 final SQLiteDatabase sqLiteDatabase = movieDbHelper.getReadableDatabase();
269
270 switch (sUriMatcher.match(uri)){
271
272 case MOVIE_DATA: {
273 cursor = sqLiteDatabase.query(MovieContract.MovieEntry.TABLE_NAME,
274 projection,
275 selection,
276 selectionArgs,
277 null,
278 null,
279 sortOrder);
280 break;
281 }
282 case MOVIE_DATA_WITH_ID: {
283 cursor = sqLiteDatabase.query(MovieContract.MovieEntry.TABLE_NAME,
284 projection,
285 MovieContract.MovieEntry.COLUMN_MOVIE_ID + " =?",
286 selectionArgs,
287 null,
288 null,
289 sortOrder);
290 break;
291 }
292 default:
293 throw new UnsupportedOperationException("Unknown uri : " +uri);
294 }
295
296 cursor.setNotificationUri(getContext().getContentResolver(), uri);
297
298 return cursor;
299 }
300
301 @Nullable
302 @Override
303 public String getType(@NonNull Uri uri) {
304 return null;
305 }
306
307 @Override
308 public int bulkInsert(@NonNull Uri uri, @NonNull ContentValues[] values) {
309 final SQLiteDatabase sqLiteDatabase = movieDbHelper.getWritableDatabase();
310
311 switch (sUriMatcher.match(uri)){
312 case MOVIE_DATA:
313 sqLiteDatabase.beginTransaction();
314 int rowsInserted = 0;
315 try{
316 for(ContentValues value: values){
317 long id = sqLiteDatabase.insert(MovieContract.MovieEntry.TABLE_NAME,
318 null,
319 value);
320
321 if(id!=-1){
322 rowsInserted++;
323 }
324
325 }
326 sqLiteDatabase.setTransactionSuccessful();
327 }finally {
328 sqLiteDatabase.endTransaction();
329 }
330
331 if(rowsInserted > 0){
332 Log.v("Inserted : "+rowsInserted, " Rows ");
333 getContext().getContentResolver().notifyChange(uri,null);
334 }
335 return rowsInserted;
336 default:
337
338 return super.bulkInsert(uri, values);
339 }
340
341 }
342
343 @Nullable
344 @Override
345 public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
346 return null;
347 }
348
349 @Override
350 public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
351 return 0;
352 }
353
354 @Override
355 public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
356 return 0;
357 }
358}
359
360import android.os.Parcel;
361import android.os.Parcelable;
362
363/**
364 * Movies data model class implement parcelable interface.
365 **/
366public final class Movies implements Parcelable {
367
368 private int mMovieId;
369 private final Double mRating;
370 private final String mTitle;
371 private final String mPoster;
372 private final String mPlot;
373 private final String mDate;
374 //Static movie poster URL
375 private final static String MOVIES_POSTER_URL = "http://image.tmdb.org/t/p/w185";
376
377 public Movies(int id, double rating, String title, String poster, String plot, String date) {
378 mMovieId = id;
379 mRating = rating;
380 mTitle = title;
381 mPoster = poster;
382 mPlot = plot;
383 mDate = date;
384
385 }
386
387 /**
388 * Constructor for parcelable interface
389 *
390 * @param in Parcel object
391 **/
392 protected Movies(Parcel in) {
393 this.mMovieId = in.readInt();
394 this.mRating = (Double) in.readValue(Double.class.getClassLoader());
395 this.mTitle = in.readString();
396 this.mPoster = in.readString();
397 this.mPlot = in.readString();
398 this.mDate = in.readString();
399 }
400
401 @Override
402 public int describeContents() {
403 return 0;
404 }
405
406 @Override
407 public void writeToParcel(Parcel dest, int flags) {
408 dest.writeInt(this.mMovieId);
409 dest.writeValue(this.mRating);
410 dest.writeString(this.mTitle);
411 dest.writeString(this.mPoster);
412 dest.writeString(this.mPlot);
413 dest.writeString(this.mDate);
414 }
415
416 public static final Parcelable.Creator<Movies> CREATOR = new Parcelable.Creator<Movies>() {
417 @Override
418 public Movies createFromParcel(Parcel source) {
419 return new Movies(source);
420 }
421
422 @Override
423 public Movies[] newArray(int size) {
424 return new Movies[size];
425 }
426 };
427
428 public int getMovieId() {
429 return mMovieId;
430 }
431
432 public String getMovieTitle() {
433 return mTitle;
434 }
435
436 public Double getMovieRating() {
437 return mRating;
438 }
439
440 public String getReleaseDate() {
441 return mDate;
442 }
443
444 public String getMoviePlot() {
445 return mPlot;
446 }
447
448 public String getMoviePoster() {
449 return MOVIES_POSTER_URL + mPoster;
450 }
451
452
453}
454
455import android.content.ContentResolver;
456import android.content.ContentValues;
457import android.content.Context;
458
459import java.util.List;
460
461public class SyncMovieDb {
462
463 public static void syncMovies(List<Movies> moviesList, Context context) {
464
465 ContentValues[] movieValuesArray = new ContentValues[moviesList.size()];
466 if (moviesList != null && moviesList.size() != 0) {
467 for (int i = 0; i < moviesList.size(); i++) {
468 Movies singleMovie = moviesList.get(i);
469 ContentValues movieValues = new ContentValues();
470 movieValues.put(MovieContract.MovieEntry.COLUMN_MOVIE_ID, singleMovie.getMovieId());
471 movieValues.put(MovieContract.MovieEntry.COLUMN_MOVIE_RATING, singleMovie.getMovieRating());
472 movieValues.put(MovieContract.MovieEntry.COLUMN_MOVIE_TITLE, singleMovie.getMovieTitle());
473 movieValues.put(MovieContract.MovieEntry.COLUMN_MOVIE_POSTER, singleMovie.getMoviePoster());
474 movieValues.put(MovieContract.MovieEntry.COLUMN_MOVIE_PLOT, singleMovie.getMoviePlot());
475 movieValues.put(MovieContract.MovieEntry.COLUMN_MOVIE_RELEASE, singleMovie.getReleaseDate());
476
477 movieValuesArray[i] = movieValues;
478 }
479
480 }
481
482 if(movieValuesArray!=null && movieValuesArray.length!=0){
483 ContentResolver movieContentResolver = context.getContentResolver();
484 movieContentResolver.bulkInsert(MovieContract.MovieEntry.CONTENT_URI,movieValuesArray);
485 //Log.v("Inserted Data", String.valueOf(context.getContentResolver() ));
486 }
487 }
488}
489
490<?xml version="1.0" encoding="utf-8"?>
491<manifest xmlns:android="http://schemas.android.com/apk/res/android"
492 package="com.example.soham.popularmoviesstage2">
493
494 <application
495 android:allowBackup="true"
496 android:icon="@mipmap/ic_launcher"
497 android:label="@string/app_name"
498 android:roundIcon="@mipmap/ic_launcher_round"
499 android:supportsRtl="true"
500 android:theme="@style/AppTheme">
501 <activity android:name=".MainActivity">
502 <intent-filter>
503 <action android:name="android.intent.action.MAIN" />
504
505 <category android:name="android.intent.category.LAUNCHER" />
506 </intent-filter>
507 </activity>
508 <activity android:name=".DetailActivity"
509 android:label="Movie Details"
510 android:parentActivityName=".MainActivity">
511 <meta-data
512 android:name="android.support.PARENT_ACTIVITY"
513 android:value=".MainActivity"/>
514 </activity>
515
516 <provider
517 android:authorities="com.example.soham.popularmoviesstage2"
518 android:name="com.example.soham.popularmoviesstage2.data.MovieProvider"
519 android:enabled="true"
520 android:exported="false"/>
521 </application>
522
523</manifest>