From 8a65b8beab6603a2eea0584712ef77ca1b229c02 Mon Sep 17 00:00:00 2001 From: AnthonyFermin Date: Fri, 17 Jul 2015 20:00:26 -0400 Subject: [PATCH] Added Meme Templates from imgflip.com & store link info into an SQLite DB --- MemeProject/.idea/misc.xml | 15 +- MemeProject/MemeProject.iml | 2 +- MemeProject/app/app.iml | 7 +- MemeProject/app/build.gradle | 2 + MemeProject/app/src/main/AndroidManifest.xml | 1 + .../nyc/memeproject/CustomArrayAdapter.java | 30 +++- .../c4q/nyc/memeproject/MemeList.java | 134 +++++++++++++----- .../c4q/nyc/memeproject/Meme_API/Data.java | 30 ++++ .../c4q/nyc/memeproject/Meme_API/Meme.java | 114 +++++++++++++++ .../memeproject/Meme_API/MemeTemplate.java | 48 +++++++ .../memeproject/Meme_API/MemeTemplateAPI.java | 14 ++ .../Meme_DB/MySQLiteOpenHelper.java | 113 +++++++++++++++ 12 files changed, 456 insertions(+), 54 deletions(-) create mode 100644 MemeProject/app/src/main/java/madelyntav/c4q/nyc/memeproject/Meme_API/Data.java create mode 100644 MemeProject/app/src/main/java/madelyntav/c4q/nyc/memeproject/Meme_API/Meme.java create mode 100644 MemeProject/app/src/main/java/madelyntav/c4q/nyc/memeproject/Meme_API/MemeTemplate.java create mode 100644 MemeProject/app/src/main/java/madelyntav/c4q/nyc/memeproject/Meme_API/MemeTemplateAPI.java create mode 100644 MemeProject/app/src/main/java/madelyntav/c4q/nyc/memeproject/Meme_DB/MySQLiteOpenHelper.java diff --git a/MemeProject/.idea/misc.xml b/MemeProject/.idea/misc.xml index d415385..58ff01f 100644 --- a/MemeProject/.idea/misc.xml +++ b/MemeProject/.idea/misc.xml @@ -3,22 +3,9 @@ - - - - - - - - - - - + - - diff --git a/MemeProject/MemeProject.iml b/MemeProject/MemeProject.iml index 29deca7..0bb6048 100644 --- a/MemeProject/MemeProject.iml +++ b/MemeProject/MemeProject.iml @@ -1,5 +1,5 @@ - + diff --git a/MemeProject/app/app.iml b/MemeProject/app/app.iml index eb0313a..444cb2a 100644 --- a/MemeProject/app/app.iml +++ b/MemeProject/app/app.iml @@ -1,5 +1,5 @@ - + @@ -83,9 +83,12 @@ - + + + + diff --git a/MemeProject/app/build.gradle b/MemeProject/app/build.gradle index 77da775..7c52543 100644 --- a/MemeProject/app/build.gradle +++ b/MemeProject/app/build.gradle @@ -22,4 +22,6 @@ android { dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:22.1.1' + compile 'com.squareup.picasso:picasso:2.5.2' + compile 'com.squareup.retrofit:retrofit:1.9.0' } diff --git a/MemeProject/app/src/main/AndroidManifest.xml b/MemeProject/app/src/main/AndroidManifest.xml index 1f734f0..cffe8a5 100644 --- a/MemeProject/app/src/main/AndroidManifest.xml +++ b/MemeProject/app/src/main/AndroidManifest.xml @@ -3,6 +3,7 @@ package="madelyntav.c4q.nyc.memeproject" > + { List memeNames= null; List memeImages = null; + List memeUrls = null; private static LayoutInflater inflater = null; + private Context context; CustomArrayAdapter(Context context, List names, List images) { super(context, R.layout.list_item, names); memeNames = names; memeImages = images; + this.context = context.getApplicationContext(); + + inflater = (LayoutInflater) context. + getSystemService(Context.LAYOUT_INFLATER_SERVICE); + + } + + CustomArrayAdapter(Context context, List names, List imageUrls, boolean api) { + super(context, R.layout.list_item, names); + memeNames = names; + memeUrls = imageUrls; + this.context = context.getApplicationContext(); inflater = (LayoutInflater) context. getSystemService(Context.LAYOUT_INFLATER_SERVICE); } + @Override public View getView(int position, View convertView, ViewGroup parent) { @@ -47,12 +67,14 @@ private View newView(ViewGroup parent) { private void bindView(int position, View row) { TextView label=(TextView)row.findViewById(R.id.memeName); - - label.setText(memeNames.get(position)); - ImageView icon=(ImageView)row.findViewById(R.id.memeImage); + label.setText(memeNames.get(position)); - icon.setImageResource(memeImages.get(position)); + if(memeUrls == null) { + Picasso.with(context).load(memeImages.get(position)).resize(250, 250).centerCrop().into(icon); + }else{ + Picasso.with(context).load(memeUrls.get(position)).resize(250, 250).centerCrop().into(icon); + } } diff --git a/MemeProject/app/src/main/java/madelyntav/c4q/nyc/memeproject/MemeList.java b/MemeProject/app/src/main/java/madelyntav/c4q/nyc/memeproject/MemeList.java index 4cff6ef..44dd6db 100644 --- a/MemeProject/app/src/main/java/madelyntav/c4q/nyc/memeproject/MemeList.java +++ b/MemeProject/app/src/main/java/madelyntav/c4q/nyc/memeproject/MemeList.java @@ -1,27 +1,40 @@ package madelyntav.c4q.nyc.memeproject; import android.app.Activity; -import android.content.ContentResolver; import android.content.Intent; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteException; import android.net.Uri; +import android.os.AsyncTask; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.ListView; import android.widget.Toast; -import java.io.InputStream; import java.util.ArrayList; -import java.util.HashMap; +import java.util.List; + +import madelyntav.c4q.nyc.memeproject.Meme_API.Meme; +import madelyntav.c4q.nyc.memeproject.Meme_API.MemeTemplate; +import madelyntav.c4q.nyc.memeproject.Meme_API.MemeTemplateAPI; +import madelyntav.c4q.nyc.memeproject.Meme_DB.MySQLiteOpenHelper; +import retrofit.Callback; +import retrofit.RestAdapter; +import retrofit.RetrofitError; +import retrofit.client.Response; /** * Created by kadeemmaragh on 6/5/15. */ public class MemeList extends Activity { + private static final String DB_FULL_PATH = "//data/data/madelyntav.c4q.nyc.memeproject/databases/myDb"; ListView listView; - HashMap memePairs; private Uri uri; + List memeList; + List imageUrls; + List imageTitles; @Override public void onCreate(Bundle savedInstanceState) { @@ -30,60 +43,115 @@ public void onCreate(Bundle savedInstanceState) { listView = (ListView) findViewById(R.id.listView); - memePairs = new HashMap<>(); - memePairs.put(R.drawable.actual_advice_mallard, "Actual Advice Mallard"); - memePairs.put(R.drawable.but_thats_none_of_my_business, "But That's None Of My Business"); - memePairs.put(R.drawable.creepy_condescending_wonka, "Creepy Condescending Wonka"); - memePairs.put(R.drawable.futurama_fry, "Skeptical Fry"); - memePairs.put(R.drawable.good_guy_greg, "Good Guy Greg"); - memePairs.put(R.drawable.liam_neeson_taken, "Liam Neeson Taken"); - memePairs.put(R.drawable.one_does_not_simply, "One Does Not Simply"); - memePairs.put(R.drawable.scumbag_steve, "Scumbag Steve"); - memePairs.put(R.drawable.shut_up_and_take_my_money_fry, "Shut Up And Take My Money"); - memePairs.put(R.drawable.ten_guy, "Ten Guy"); - memePairs.put(R.drawable.the_most_interesting_man_in_the_world, "The Most Interesting Man In The World"); - memePairs.put(R.drawable.third_world_skeptical_kid, "Third World Skeptical Kid"); - memePairs.put(R.drawable.unhelpful_high_school_teacher, "Unhelpful High School Teacher"); - memePairs.put(R.drawable.yao_ming, "Yao Ming"); - memePairs.put(R.drawable.you_the_real_mvp, "You The Real MVP"); + if(dataBaseExists()){ + memeList = loadData(); - final ArrayList memeImages = new ArrayList(); - ArrayList memeNames = new ArrayList(); - addItemsToArrays(memeImages, memeNames); + imageUrls = new ArrayList(); + imageTitles = new ArrayList(); + for(Meme meme : memeList){ + imageUrls.add(meme.getUrl()); + imageTitles.add(meme.getName()); + } - CustomArrayAdapter memeAdapter = new CustomArrayAdapter(getApplicationContext(), memeNames, memeImages); + listView.setAdapter(new CustomArrayAdapter(getApplicationContext(), imageTitles, imageUrls, true)); + }else{ - listView.setAdapter(memeAdapter); + retrofitGetMemeTemplates(); + } listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { Intent intent = new Intent(MemeList.this, EditPhoto.class); - uri = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://" + getResources().getResourcePackageName(memeImages.get(position)) + '/' + getResources().getResourceTypeName(memeImages.get(position)) + '/' + getResources().getResourceEntryName(memeImages.get(position))); + //uri = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://" + getResources().getResourcePackageName(memeImages.get(position)) + '/' + getResources().getResourceTypeName(memeImages.get(position)) + '/' + getResources().getResourceEntryName(memeImages.get(position))); intent.putExtra("image", uri); startActivity(intent); Toast.makeText(getApplicationContext(), "Please select VANILLA or DEMO layout to begin", Toast.LENGTH_SHORT).show(); - } }); + } + + private List loadData() { + + MySQLiteOpenHelper db = MySQLiteOpenHelper.getInstance(this); + return db.loadData(); + } + private void insertData(Meme meme) { + MySQLiteOpenHelper db = MySQLiteOpenHelper.getInstance(this); + db.insertRow(meme); + } + + private void retrofitGetMemeTemplates(){ + + RestAdapter restAdapter = new RestAdapter.Builder() + .setEndpoint("https://api.imgflip.com") + .setLogLevel(RestAdapter.LogLevel.FULL) + .build(); + + MemeTemplateAPI memeTemplateAPI = restAdapter.create(MemeTemplateAPI.class); + + memeTemplateAPI.getTemplates(new Callback() { + @Override + public void success(MemeTemplate memeTemplate, Response response) { + memeList = memeTemplate.getData().getMemes(); + imageUrls = new ArrayList(); + imageTitles = new ArrayList(); + for(Meme meme : memeList){ + imageUrls.add(meme.getUrl()); + imageTitles.add(meme.getName()); + } + + loadDBSetAdapter(); + } + @Override + public void failure(RetrofitError error) { + (Toast.makeText(MemeList.this,"Couldn't load popular Memes",Toast.LENGTH_LONG)).show(); + } + }); } - public void addItemsToArrays(ArrayList images, ArrayList titles) { - int position = 0; - for (Integer image : memePairs.keySet()) { + private void loadDBSetAdapter(){ + + (new AsyncTask>() { + @Override + protected List doInBackground(Void... voids) { + + for(Meme meme : memeList) { + insertData(meme); + } + + return loadData(); + } - images.add(position, image); - titles.add(position, memePairs.get(image)); - position++; + @Override + protected void onPostExecute(List memes) { + super.onPostExecute(memes); + + listView.setAdapter(new CustomArrayAdapter(getApplicationContext(), imageTitles, imageUrls, true)); + } + }).execute(); + + } + + private boolean dataBaseExists() { + SQLiteDatabase checkDB = null; + try { + checkDB = SQLiteDatabase.openDatabase(DB_FULL_PATH, null, + SQLiteDatabase.OPEN_READONLY); + checkDB.close(); + } catch (SQLiteException e) { + // database doesn't exist yet. } + return checkDB != null; } + } diff --git a/MemeProject/app/src/main/java/madelyntav/c4q/nyc/memeproject/Meme_API/Data.java b/MemeProject/app/src/main/java/madelyntav/c4q/nyc/memeproject/Meme_API/Data.java new file mode 100644 index 0000000..2d2216c --- /dev/null +++ b/MemeProject/app/src/main/java/madelyntav/c4q/nyc/memeproject/Meme_API/Data.java @@ -0,0 +1,30 @@ +package madelyntav.c4q.nyc.memeproject.Meme_API; + +import java.util.ArrayList; +import java.util.List; +import com.google.gson.annotations.Expose; + +public class Data { + + @Expose + private List memes = new ArrayList(); + + /** + * + * @return + * The memes + */ + public List getMemes() { + return memes; + } + + /** + * + * @param memes + * The memes + */ + public void setMemes(List memes) { + this.memes = memes; + } + +} \ No newline at end of file diff --git a/MemeProject/app/src/main/java/madelyntav/c4q/nyc/memeproject/Meme_API/Meme.java b/MemeProject/app/src/main/java/madelyntav/c4q/nyc/memeproject/Meme_API/Meme.java new file mode 100644 index 0000000..61d9f40 --- /dev/null +++ b/MemeProject/app/src/main/java/madelyntav/c4q/nyc/memeproject/Meme_API/Meme.java @@ -0,0 +1,114 @@ +package madelyntav.c4q.nyc.memeproject.Meme_API; + +import com.google.gson.annotations.Expose; + +public class Meme { + + @Expose + private String id; + @Expose + private String name; + @Expose + private String url; + @Expose + private Integer width; + @Expose + private Integer height; + + //used for the database + public Meme(String name, String url) { + this.name = name; + this.url = url; + } + + /** + * + * @return + * The id + */ + public String getId() { + return id; + } + + /** + * + * @param id + * The id + */ + public void setId(String id) { + this.id = id; + } + + /** + * + * @return + * The name + */ + public String getName() { + return name; + } + + /** + * + * @param name + * The name + */ + public void setName(String name) { + this.name = name; + } + + /** + * + * @return + * The url + */ + public String getUrl() { + return url; + } + + /** + * + * @param url + * The url + */ + public void setUrl(String url) { + this.url = url; + } + + /** + * + * @return + * The width + */ + public Integer getWidth() { + return width; + } + + /** + * + * @param width + * The width + */ + public void setWidth(Integer width) { + this.width = width; + } + + /** + * + * @return + * The height + */ + public Integer getHeight() { + return height; + } + + /** + * + * @param height + * The height + */ + public void setHeight(Integer height) { + this.height = height; + } + +} \ No newline at end of file diff --git a/MemeProject/app/src/main/java/madelyntav/c4q/nyc/memeproject/Meme_API/MemeTemplate.java b/MemeProject/app/src/main/java/madelyntav/c4q/nyc/memeproject/Meme_API/MemeTemplate.java new file mode 100644 index 0000000..983b429 --- /dev/null +++ b/MemeProject/app/src/main/java/madelyntav/c4q/nyc/memeproject/Meme_API/MemeTemplate.java @@ -0,0 +1,48 @@ +package madelyntav.c4q.nyc.memeproject.Meme_API; + +import com.google.gson.annotations.Expose; + +public class MemeTemplate { + + @Expose + private Boolean success; + @Expose + private Data data; + + /** + * + * @return + * The success + */ + public Boolean getSuccess() { + return success; + } + + /** + * + * @param success + * The success + */ + public void setSuccess(Boolean success) { + this.success = success; + } + + /** + * + * @return + * The data + */ + public Data getData() { + return data; + } + + /** + * + * @param data + * The data + */ + public void setData(Data data) { + this.data = data; + } + +} \ No newline at end of file diff --git a/MemeProject/app/src/main/java/madelyntav/c4q/nyc/memeproject/Meme_API/MemeTemplateAPI.java b/MemeProject/app/src/main/java/madelyntav/c4q/nyc/memeproject/Meme_API/MemeTemplateAPI.java new file mode 100644 index 0000000..700dcab --- /dev/null +++ b/MemeProject/app/src/main/java/madelyntav/c4q/nyc/memeproject/Meme_API/MemeTemplateAPI.java @@ -0,0 +1,14 @@ +package madelyntav.c4q.nyc.memeproject.Meme_API; + +import retrofit.Callback; +import retrofit.http.GET; + +/** + * Created by c4q-anthonyf on 7/17/15. + */ +public interface MemeTemplateAPI { + + @GET("/get_memes") + public void getTemplates(Callback response); + +} diff --git a/MemeProject/app/src/main/java/madelyntav/c4q/nyc/memeproject/Meme_DB/MySQLiteOpenHelper.java b/MemeProject/app/src/main/java/madelyntav/c4q/nyc/memeproject/Meme_DB/MySQLiteOpenHelper.java new file mode 100644 index 0000000..7031add --- /dev/null +++ b/MemeProject/app/src/main/java/madelyntav/c4q/nyc/memeproject/Meme_DB/MySQLiteOpenHelper.java @@ -0,0 +1,113 @@ +package madelyntav.c4q.nyc.memeproject.Meme_DB; + +import android.content.ContentValues; +import android.content.Context; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.provider.BaseColumns; + +import java.util.ArrayList; +import java.util.List; + +import madelyntav.c4q.nyc.memeproject.Meme_API.Meme; + +/** + * Created by c4q-anthonyf on 7/17/15. + */ +public class MySQLiteOpenHelper extends android.database.sqlite.SQLiteOpenHelper { + + final static String MYDB = "myDb"; + final static int VERSION = 1; + + public static MySQLiteOpenHelper INSTANCE; + + public static synchronized MySQLiteOpenHelper getInstance(Context context) + { + if(INSTANCE == null) + { + INSTANCE = new MySQLiteOpenHelper(context.getApplicationContext()); + } + + return INSTANCE; + } + + public MySQLiteOpenHelper(Context context) { + super(context, MYDB, null, VERSION); + } + + @Override + public void onCreate(SQLiteDatabase sqLiteDatabase) { + sqLiteDatabase.execSQL(SQL_CREATE_ENTRIES); + } + + @Override + public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i2) { + sqLiteDatabase.execSQL(SQL_DELETE_ENTRIES); + onCreate(sqLiteDatabase); + } + + public void insertRow(Meme meme){ + + SQLiteDatabase db = getWritableDatabase(); + + ContentValues values = new ContentValues(); + values.put(MemeTemplateDB.COLUMN_NAME_MEME_ID, meme.getId()); + values.put(MemeTemplateDB.COLUMN_NAME_NAMES, meme.getName()); + values.put(MemeTemplateDB.COLUMN_NAME_URLS, meme.getUrl()); + + db.insertOrThrow( + MemeTemplateDB.TABLE_NAME, + null, + values); + } + + public List loadData() + { + String[] projection = { + MemeTemplateDB._ID, + MemeTemplateDB.COLUMN_NAME_NAMES, + MemeTemplateDB.COLUMN_NAME_URLS + }; + + SQLiteDatabase db = getWritableDatabase(); + + List memes = new ArrayList<>(); + + Cursor cursor = db.query( + MemeTemplateDB.TABLE_NAME, + projection, + null, //where + null, //where args + null, //group by (ignore) + null, //having (ignore) + MemeTemplateDB._ID + " desc");//order by + while(cursor.moveToNext()) + { + memes.add(new Meme(cursor.getString( + cursor.getColumnIndex(MemeTemplateDB.COLUMN_NAME_NAMES)), + cursor.getString( + cursor.getColumnIndex(MemeTemplateDB.COLUMN_NAME_URLS)))); + } + + cursor.close(); + + return memes; + } + + public static abstract class MemeTemplateDB implements BaseColumns { + public static final String TABLE_NAME = "popular_memes"; + public static final String COLUMN_NAME_MEME_ID = "meme_id"; + public static final String COLUMN_NAME_NAMES = "names"; + public static final String COLUMN_NAME_URLS = "urls"; + } + + private static final String SQL_CREATE_ENTRIES = "CREATE TABLE " + MemeTemplateDB.TABLE_NAME + " (" + + MemeTemplateDB._ID + " INTEGER PRIMARY KEY," + + MemeTemplateDB.COLUMN_NAME_MEME_ID + " TEXT NOT NULL UNIQUE, " + + MemeTemplateDB.COLUMN_NAME_NAMES + " TEXT," + + MemeTemplateDB.COLUMN_NAME_URLS + " TEXT" + + " )"; + + private static final String SQL_DELETE_ENTRIES = "DROP TABLE IF EXISTS " + MemeTemplateDB.TABLE_NAME; + +}