From 0f98ad4df3ad85c2ca94d6e47f4e00e76d35cd44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marta=20Woldan=CC=81ska?= Date: Wed, 6 Aug 2014 14:53:51 +0200 Subject: [PATCH 01/13] add defaultConfig section with min/target sdk versions --- build.gradle | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/build.gradle b/build.gradle index 1df1c50..ad542a3 100644 --- a/build.gradle +++ b/build.gradle @@ -29,6 +29,11 @@ android { compileSdkVersion 19 buildToolsVersion "19.1.0" + defaultConfig { + minSdkVersion 5 + targetSdkVersion 18 + } + sourceSets { main { manifest.srcFile 'AndroidManifest.xml' From 6ab973b8c0c29d719ba3ee44fa6e5bda8e12dfda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marta=20Woldan=CC=81ska?= Date: Wed, 6 Aug 2014 14:54:26 +0200 Subject: [PATCH 02/13] introduce json file with list of avatars to be used soon instead of chuck norris --- assets/faces.txt | 168 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 168 insertions(+) create mode 100644 assets/faces.txt diff --git a/assets/faces.txt b/assets/faces.txt new file mode 100644 index 0000000..53f19bf --- /dev/null +++ b/assets/faces.txt @@ -0,0 +1,168 @@ +{ + "people":[ + { + "gravatar":"http://www.gravatar.com/avatar/feb86e26302b2efd0f937afa72a16fc6?d=monsterid&s=240", + "id":"0" + }, + { + "gravatar":"http://www.gravatar.com/avatar/487bb9d69c8795b5dd1e67332cfb8221?d=monsterid&s=240", + "id":"1" + }, + { + "gravatar":"http://www.gravatar.com/avatar/f31e2458313b36730a066ec703e51b11?d=monsterid&s=240", + "id":"2" + }, + { + "gravatar":"http://www.gravatar.com/avatar/7f8727786f6bb1a0c352acc4e4419a83?d=monsterid&s=240", + "id":"3" + }, + { + "gravatar":"http://www.gravatar.com/avatar/2dc3eab78ab131cc3a8acbc972c92b73?d=monsterid&s=240", + "id":"4" + }, + { + "gravatar":"http://www.gravatar.com/avatar/705da853dcc90e5aca80b4d085c1d214?d=monsterid&s=240", + "id":"5" + }, + { + "gravatar":"http://www.gravatar.com/avatar/28be0f28848e9b280845436bf3fad6ca?d=monsterid&s=240", + "id":"6" + }, + { + "gravatar":"http://www.gravatar.com/avatar/1c364f4cad4f61aa08dc8f112931e39f?d=monsterid&s=240", + "id":"7" + }, + { + "gravatar":"http://www.gravatar.com/avatar/bb03b2dafcda985bbeb52a4f446cc754?d=monsterid&s=240", + "id":"8" + }, + { + "gravatar":"http://www.gravatar.com/avatar/ec43363ba46bdb76aae3999edf692871?d=monsterid&s=240", + "id":"9" + }, + { + "gravatar":"http://www.gravatar.com/avatar/e32aee082c585f111fe3405d470112b0?d=monsterid&s=240", + "id":"10" + }, + { + "gravatar":"http://www.gravatar.com/avatar/c770015076fd08e56be5cfd4ca387298?d=monsterid&s=240", + "id":"11" + }, + { + "gravatar":"http://www.gravatar.com/avatar/53abc38c639a22f80174261df7f35f0d?d=monsterid&s=240", + "id":"12" + }, + { + "gravatar":"http://www.gravatar.com/avatar/cd68c5cafec543474541a2211dc7444f?d=monsterid&s=240", + "id":"13" + }, + { + "gravatar":"http://www.gravatar.com/avatar/2b7031546b140aa0612e4d2ce8f922c0?d=monsterid&s=240", + "id":"14" + }, + { + "gravatar":"http://www.gravatar.com/avatar/bcb735972933b10b1eb269886c7c799a?d=monsterid&s=240", + "id":"15" + }, + { + "gravatar":"http://www.gravatar.com/avatar/ab7fa42a14263894835ba1e5be031111?d=monsterid&s=240", + "id":"16" + }, + { + "gravatar":"http://www.gravatar.com/avatar/35287768ccb0b3c68067a511c4c3503f?d=monsterid&s=240", + "id":"17" + }, + { + "gravatar":"http://www.gravatar.com/avatar/45bba01ac921f96e49059da127800d6d?d=monsterid&s=240", + "id":"18" + }, + { + "gravatar":"http://www.gravatar.com/avatar/289040ff9f5916ba6d88c660334660ec?d=monsterid&s=240", + "id":"19" + }, + { + "gravatar":"http://www.gravatar.com/avatar/0808d58e098c64a5e9a1a411bce8d0d8?d=monsterid&s=240", + "id":"20" + }, + { + "gravatar":"http://www.gravatar.com/avatar/81801d4f62de321a0bd6903fe9459a5a?d=monsterid&s=240", + "id":"21" + }, + { + "gravatar":"http://www.gravatar.com/avatar/0cbc8aace3690ac2288754bfb12ef43c?d=monsterid&s=240", + "id":"22" + }, + { + "gravatar":"http://www.gravatar.com/avatar/dae071222608e84f665fdfd4678e8f2e?d=monsterid&s=240", + "id":"23" + }, + { + "gravatar":"http://www.gravatar.com/avatar/9b14143dfed8f4fa57428ad3e547bc0e?d=monsterid&s=240", + "id":"24" + }, + { + "gravatar":"http://www.gravatar.com/avatar/e0a27844ea90b44bcebfa3bec7a583bd?d=monsterid&s=240", + "id":"25" + }, + { + "gravatar":"http://www.gravatar.com/avatar/e60ecae6d42227896b877fe5ae80dcbf?d=monsterid&s=240", + "id":"26" + }, + { + "gravatar":"http://www.gravatar.com/avatar/cb8004fd244c846ef07902d30be3d584?d=monsterid&s=240", + "id":"27" + }, + { + "gravatar":"http://www.gravatar.com/avatar/5f68d5e3481bbd4e143454820f33d9b6?d=monsterid&s=240", + "id":"28" + }, + { + "gravatar":"http://www.gravatar.com/avatar/eae907f53220bbcaabfe0cda31be29d8?d=monsterid&s=240", + "id":"29" + }, + { + "gravatar":"http://www.gravatar.com/avatar/cd26f838cf344a14b8a1add418f8f2b8?d=monsterid&s=240", + "id":"30" + }, + { + "gravatar":"http://www.gravatar.com/avatar/35bbb9b6fbad099dcbb2901d281a8d8e?d=monsterid&s=240", + "id":"31" + }, + { + "gravatar":"http://www.gravatar.com/avatar/335ee931be900e9d28e769e5c9537084?d=monsterid&s=240", + "id":"32" + }, + { + "gravatar":"http://www.gravatar.com/avatar/547db7c434e8a83737d99f0f4eab2290?d=monsterid&s=240", + "id":"33" + }, + { + "gravatar":"http://www.gravatar.com/avatar/96dbb97764ca7f5d56073ccf401a9753?d=monsterid&s=240", + "id":"34" + }, + { + "gravatar":"http://www.gravatar.com/avatar/fedd24fdaae013b925eff616ad55fee8?d=monsterid&s=240", + "id":"35" + }, + { + "gravatar":"http://www.gravatar.com/avatar/fa0a22c3463a9ee3cb1acd6bc05b9a3e?d=monsterid&s=240", + "id":"36" + }, + { + "gravatar":"http://www.gravatar.com/avatar/674f1d9793c903baeb7607655cd0f787?d=monsterid&s=240", + "id":"37" + }, + { + "gravatar":"http://www.gravatar.com/avatar/ee5179d5ce0b3172b6b34c5ec94a61c0?d=monsterid&s=240", + "id":"38" + }, + { + "gravatar":"http://www.gravatar.com/avatar/fde11b1d20465b0dcb7c9879aca299a3?d=monsterid&s=240", + "id":"39" + }, + { + "gravatar":"http://www.gravatar.com/avatar/e6f6d95ae0cad8073ccac961c3c9e9d7?d=monsterid&s=240", + "id":"40" + } + ] +} \ No newline at end of file From e4e40e1299c5813e6c627351e0c6c62ee26f9683 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marta=20Woldan=CC=81ska?= Date: Wed, 6 Aug 2014 14:55:39 +0200 Subject: [PATCH 03/13] Helper method checking internet access --- .../testingactivity/NetworkUtilities.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 src/pl/polidea/coverflow/testingactivity/NetworkUtilities.java diff --git a/src/pl/polidea/coverflow/testingactivity/NetworkUtilities.java b/src/pl/polidea/coverflow/testingactivity/NetworkUtilities.java new file mode 100644 index 0000000..3e4fd9f --- /dev/null +++ b/src/pl/polidea/coverflow/testingactivity/NetworkUtilities.java @@ -0,0 +1,22 @@ +package pl.polidea.coverflow.testingactivity; + +import android.content.Context; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; + +/** + * Created by martawoldanska on 8/5/14. + */ +public class NetworkUtilities +{ + public static boolean isOnline(Context context) + { + ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); + NetworkInfo networkInfo = cm.getActiveNetworkInfo(); + + if (networkInfo != null && networkInfo.isConnected()) + return true; + + return false; + } +} From a061835dc776170a76ed9515f6e299e048328f40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marta=20Woldan=CC=81ska?= Date: Wed, 6 Aug 2014 14:56:49 +0200 Subject: [PATCH 04/13] Switching Chuck Norris with Polidea's employees' faces in CoverFlowTestingActivity --- AndroidManifest.xml | 4 + .../coverflow/ResourceImageAdapter.java | 62 +++++++- .../CoverFlowTestingActivity.java | 149 ++++++++++++++++-- .../testingactivity/EmployeeAvatarTask.java | 125 +++++++++++++++ .../coverflow/testingactivity/Result.java | 60 +++++++ 5 files changed, 380 insertions(+), 20 deletions(-) create mode 100644 src/pl/polidea/coverflow/testingactivity/EmployeeAvatarTask.java create mode 100644 src/pl/polidea/coverflow/testingactivity/Result.java diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 58a553a..e270537 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -1,5 +1,9 @@ + + + + diff --git a/src/pl/polidea/coverflow/ResourceImageAdapter.java b/src/pl/polidea/coverflow/ResourceImageAdapter.java index eaa79c9..b52ade9 100644 --- a/src/pl/polidea/coverflow/ResourceImageAdapter.java +++ b/src/pl/polidea/coverflow/ResourceImageAdapter.java @@ -1,15 +1,20 @@ package pl.polidea.coverflow; +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.net.Uri; +import android.util.Log; + +import java.io.FileNotFoundException; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.HashMap; +import java.util.LinkedList; import java.util.List; import java.util.Map; -import android.content.Context; -import android.graphics.Bitmap; -import android.graphics.drawable.BitmapDrawable; -import android.util.Log; +import pl.polidea.coverflow.testingactivity.Result; /** * This class is an adapter that provides images from a fixed set of resource @@ -37,6 +42,10 @@ public class ResourceImageAdapter extends AbstractCoverFlowImageAdapter { private final Context context; + + private LinkedList results; + private static final List IMAGE_RESOURCE_URIS = new ArrayList(); + /** * Creates the adapter with default set of resource images. * @@ -49,6 +58,26 @@ public ResourceImageAdapter(final Context context) { setResources(DEFAULT_RESOURCE_LIST); } + public ResourceImageAdapter(final Context context, LinkedList results) + { + super(); + this.context = context; + this.results = results; + setResources(); + } + + private final synchronized void setResources() + { + IMAGE_RESOURCE_URIS.clear(); + + for (Result r : results) + { + IMAGE_RESOURCE_URIS.add(r.getAvatarUri()); + } + + notifyDataSetChanged(); + } + /** * Replaces resources with those specified. * @@ -69,8 +98,11 @@ public final synchronized void setResources(final int[] resourceIds) { * @see android.widget.Adapter#getCount() */ @Override - public synchronized int getCount() { - return IMAGE_RESOURCE_IDS.size(); + public synchronized int getCount() + { + // return this size if you use standard images + //return IMAGE_RESOURCE_IDS.size(); + return IMAGE_RESOURCE_URIS.size(); } /* @@ -81,8 +113,22 @@ public synchronized int getCount() { @Override protected Bitmap createBitmap(final int position) { Log.v(TAG, "creating item " + position); - final Bitmap bitmap = ((BitmapDrawable) context.getResources().getDrawable(IMAGE_RESOURCE_IDS.get(position))) - .getBitmap(); + + // use this code to use standard images +// final Bitmap bitmap = ((BitmapDrawable) context.getResources().getDrawable(IMAGE_RESOURCE_IDS.get(position))) +// .getBitmap(); + + final Bitmap bitmap; + try + { + bitmap = BitmapFactory.decodeStream(context.getContentResolver().openInputStream(results.get(position).getAvatarUri())); + } + catch (FileNotFoundException e) + { + Log.e("ResourceImageAdapter", "FileNotFoundException at createBitmap"); + return null; + } + bitmapMap.put(position, new WeakReference(bitmap)); return bitmap; } diff --git a/src/pl/polidea/coverflow/testingactivity/CoverFlowTestingActivity.java b/src/pl/polidea/coverflow/testingactivity/CoverFlowTestingActivity.java index 40cd096..c4984c9 100644 --- a/src/pl/polidea/coverflow/testingactivity/CoverFlowTestingActivity.java +++ b/src/pl/polidea/coverflow/testingactivity/CoverFlowTestingActivity.java @@ -1,17 +1,35 @@ package pl.polidea.coverflow.testingactivity; -import pl.polidea.coverflow.CoverFlow; -import pl.polidea.coverflow.R; -import pl.polidea.coverflow.ReflectingImageAdapter; -import pl.polidea.coverflow.ResourceImageAdapter; import android.app.Activity; +import android.app.ProgressDialog; import android.os.Bundle; +import android.util.Log; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.AdapterView.OnItemSelectedListener; import android.widget.BaseAdapter; import android.widget.TextView; +import android.widget.Toast; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileReader; +import java.io.IOException; +import java.io.InputStream; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.LinkedList; + +import pl.polidea.coverflow.CoverFlow; +import pl.polidea.coverflow.R; +import pl.polidea.coverflow.ReflectingImageAdapter; +import pl.polidea.coverflow.ResourceImageAdapter; /**** * The Class CoverFlowTestingActivity. @@ -20,6 +38,8 @@ public class CoverFlowTestingActivity extends Activity { private TextView textView; + private LinkedList results; + private ProgressDialog progressDialog; /* * (non-Javadoc) * @@ -32,14 +52,44 @@ protected void onCreate(final Bundle savedInstanceState) { setContentView(R.layout.main); textView = (TextView) findViewById(this.getResources() .getIdentifier("statusText", "id", "pl.polidea.coverflow")); - // note resources below are taken using getIdentifier to allow importing - // this library as library. - final CoverFlow coverFlow1 = (CoverFlow) findViewById(this.getResources().getIdentifier("coverflow", "id", - "pl.polidea.coverflow")); - setupCoverFlow(coverFlow1, false); - final CoverFlow reflectingCoverFlow = (CoverFlow) findViewById(this.getResources().getIdentifier( - "coverflowReflect", "id", "pl.polidea.coverflow")); - setupCoverFlow(reflectingCoverFlow, true); + + if (!NetworkUtilities.isOnline(this)) + { + Toast.makeText(this, "You must go online to use application", Toast.LENGTH_SHORT).show(); + return; + } + + progressDialog = new ProgressDialog(this) + { + @Override + public void onBackPressed() + { + super.onBackPressed(); + CoverFlowTestingActivity.this.finish(); + } + }; + progressDialog.setMessage("This might take a few seconds..."); + + try + { + results = parseJSONResult(readStringFromInputStream(getAssets().open("faces.txt"))); + + EmployeeAvatarTask avatarTask = new EmployeeAvatarTask(this, results); + avatarTask.execute(); + } + catch (IOException e) + { + e.printStackTrace(); + } + +// // note resources below are taken using getIdentifier to allow importing +// // this library as library. +// final CoverFlow coverFlow1 = (CoverFlow) findViewById(this.getResources().getIdentifier("coverflow", "id", +// "pl.polidea.coverflow")); +// setupCoverFlow(coverFlow1, false, results); +// final CoverFlow reflectingCoverFlow = (CoverFlow) findViewById(this.getResources().getIdentifier( +// "coverflowReflect", "id", "pl.polidea.coverflow")); +// setupCoverFlow(reflectingCoverFlow, true, results); } /** @@ -62,6 +112,19 @@ private void setupCoverFlow(final CoverFlow mCoverFlow, final boolean reflect) { setupListeners(mCoverFlow); } + public void setupCoverFlow(final CoverFlow mCoverFlow, final boolean reflect, LinkedList results) { + BaseAdapter coverImageAdapter; + if (reflect) { + coverImageAdapter = new ReflectingImageAdapter(new ResourceImageAdapter(this, results)); + } else { + coverImageAdapter = new ResourceImageAdapter(this, results); + } + + mCoverFlow.setAdapter(coverImageAdapter); + mCoverFlow.setSelection(2, true); + setupListeners(mCoverFlow); + } + /** * Sets the up listeners. * @@ -89,4 +152,66 @@ public void onNothingSelected(final AdapterView< ? > parent) { }); } + private String readStringFromInputStream(InputStream inputStream) throws IOException + { + StringBuilder builder = new StringBuilder(); + + int c; + + while((c = inputStream.read()) != -1) + { + builder.append((char)c); + } + + return builder.toString(); + } + + private LinkedList parseJSONResult(String result) + { + LinkedList results = new LinkedList(); + + try + { + JSONObject outerItem = new JSONObject(result); + JSONArray jArray = outerItem.getJSONArray("people"); + + for (int i = 0; i < jArray.length(); i++) + { + JSONObject employee = jArray.getJSONObject(i); + String id = employee.getString("id"); + + URL url = new URL(employee.getString("gravatar")); + + Result employeeResult = new Result(url, id, null); + results.add(employeeResult); + } + } + catch (MalformedURLException e) + { + Log.e("CoverFlowTestingActivity", "MalformedUrlException in parseJSONResult"); + e.printStackTrace(); + } + catch (JSONException e) + { + Log.e("CoverFlowTestingActivity", "JSONException in parseJSONResult"); + e.printStackTrace(); + } + + return results; + } + + public LinkedList getResults() + { + return results; + } + + public void setResults(LinkedList results) + { + this.results = results; + } + + public ProgressDialog getProgressDialog() + { + return progressDialog; + } } diff --git a/src/pl/polidea/coverflow/testingactivity/EmployeeAvatarTask.java b/src/pl/polidea/coverflow/testingactivity/EmployeeAvatarTask.java new file mode 100644 index 0000000..5ac03f0 --- /dev/null +++ b/src/pl/polidea/coverflow/testingactivity/EmployeeAvatarTask.java @@ -0,0 +1,125 @@ +package pl.polidea.coverflow.testingactivity; + +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.net.Uri; +import android.os.AsyncTask; +import android.os.Environment; +import android.util.Log; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.LinkedList; + +import pl.polidea.coverflow.CoverFlow; + +/** + * Created by martawoldanska on 8/4/14. + */ +public class EmployeeAvatarTask extends AsyncTask +{ + + LinkedList results; + private CoverFlowTestingActivity activity; + + public EmployeeAvatarTask(final CoverFlowTestingActivity activity, LinkedList results) + { + this.activity = activity; + this.results = results; + } + + @Override + protected void onPreExecute() + { + activity.getProgressDialog().show(); + } + + @Override + protected Void doInBackground(Void... params) + { + String root = Environment.getExternalStorageDirectory() + .getAbsolutePath(); + File filePath = new File(root + "/CoverFlow"); + + for (int i = 0; i < results.size(); i++) + { + try + { + String fileID = convertUrlToFileID(results.get(i) + .getAvatarURL().toString()); + File file = new File(filePath, fileID); + + if (!file.exists()) + { + Bitmap img = BitmapFactory.decodeStream(results.get(i) + .getAvatarURL().openConnection().getInputStream()); + file = saveBitmap(img, convertUrlToFileID(results.get(i) + .getAvatarURL().toString())); + } + + results.get(i).setAvatarUri(Uri.fromFile(file)); + } + catch (IOException e) + { + Log.e("EmployeeAvatarTask", "IOException in doInBackground"); + } + } + + return null; + } + + @Override + protected void onPostExecute(Void aVoid) + { + activity.setResults(results); + + if (activity.getProgressDialog() != null) + activity.getProgressDialog().dismiss(); + + // note resources below are taken using getIdentifier to allow importing + // this library as library. + + // not the prettiest way to do this, but this way the existence of employees' list is ensured + final CoverFlow coverFlow1 = (CoverFlow) activity.findViewById(activity.getResources().getIdentifier("coverflow", "id", + "pl.polidea.coverflow")); + activity.setupCoverFlow(coverFlow1, false, results); + final CoverFlow reflectingCoverFlow = (CoverFlow) activity.findViewById(activity.getResources().getIdentifier( + "coverflowReflect", "id", "pl.polidea.coverflow")); + activity.setupCoverFlow(reflectingCoverFlow, true, results); + } + + private String convertUrlToFileID(String url) + { + String fileID = url.replaceAll("[\\/:?&=.]", ""); + return fileID; + } + + private File saveBitmap(Bitmap bitmap, String fileID) + { + String root = Environment.getExternalStorageDirectory() + .getAbsolutePath(); + File filePath = new File(root + "/CoverFlow"); + filePath.mkdirs(); + + File file = new File(filePath, fileID); + + if (!file.exists()) + { + try + { + FileOutputStream stream = new FileOutputStream(file); + bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream); + stream.flush(); + stream.close(); + + } + catch (Exception e) + { + e.printStackTrace(); + } + } + + return file; + } +} diff --git a/src/pl/polidea/coverflow/testingactivity/Result.java b/src/pl/polidea/coverflow/testingactivity/Result.java new file mode 100644 index 0000000..49a74e7 --- /dev/null +++ b/src/pl/polidea/coverflow/testingactivity/Result.java @@ -0,0 +1,60 @@ +package pl.polidea.coverflow.testingactivity; + +import android.net.Uri; + +import java.net.URL; + +/** + * Created by martawoldanska on 8/4/14. + */ +public class Result +{ + + private URL avatarURL; + private String userId; + private Uri avatarUri; + + public Result() + { + this.avatarURL = null; + this.userId = ""; + this.avatarUri = null; + } + + public Result(URL avatarURL, String userId, Uri avatarUri) + { + this.avatarURL = avatarURL; + this.userId = userId; + this.avatarUri = avatarUri; + } + + public URL getAvatarURL() + { + return this.avatarURL; + } + + public void setAvatarURL(URL avatarURL) + { + this.avatarURL = avatarURL; + } + + public String getUserId() + { + return this.userId; + } + + public void setUserId(String userId) + { + this.userId = userId; + } + + public Uri getAvatarUri() + { + return avatarUri; + } + + public void setAvatarUri(Uri avatarUri) + { + this.avatarUri = avatarUri; + } +} From 1c2f72c47b1a218544f43b6facfcbb31010ce0a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marta=20Woldan=CC=81ska?= Date: Wed, 6 Aug 2014 15:19:09 +0200 Subject: [PATCH 05/13] ResourceImageAdapter reverted to the old version. NetworkImageAdapter added instead. --- .../coverflow/NetworkImageAdapter.java | 135 ++++++++++++++++++ .../coverflow/ResourceImageAdapter.java | 62 ++------ .../CoverFlowTestingActivity.java | 6 +- 3 files changed, 147 insertions(+), 56 deletions(-) create mode 100644 src/pl/polidea/coverflow/NetworkImageAdapter.java diff --git a/src/pl/polidea/coverflow/NetworkImageAdapter.java b/src/pl/polidea/coverflow/NetworkImageAdapter.java new file mode 100644 index 0000000..cdac668 --- /dev/null +++ b/src/pl/polidea/coverflow/NetworkImageAdapter.java @@ -0,0 +1,135 @@ +package pl.polidea.coverflow; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.net.Uri; +import android.util.Log; + +import java.io.FileNotFoundException; +import java.lang.ref.WeakReference; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +import pl.polidea.coverflow.testingactivity.Result; + +/** + * This class is an adapter that provides images from a fixed set of resource + * ids. Bitmaps and ImageViews are kept as weak references so that they can be + * cleared by garbage collection when not needed. + * + */ +public class NetworkImageAdapter extends AbstractCoverFlowImageAdapter { + + /** The Constant TAG. */ + private static final String TAG = NetworkImageAdapter.class.getSimpleName(); + + /** The Constant DEFAULT_LIST_SIZE. */ + private static final int DEFAULT_LIST_SIZE = 20; + + /** The Constant IMAGE_RESOURCE_IDS. */ + private static final List IMAGE_RESOURCE_IDS = new ArrayList(DEFAULT_LIST_SIZE); + + /** The Constant DEFAULT_RESOURCE_LIST. */ + private static final int[] DEFAULT_RESOURCE_LIST = { R.drawable.image01, R.drawable.image02, R.drawable.image03, + R.drawable.image04, R.drawable.image05 }; + + /** The bitmap map. */ + private final Map> bitmapMap = new HashMap>(); + + private final Context context; + + + private LinkedList results; + private static final List IMAGE_RESOURCE_URIS = new ArrayList(); + + /** + * Creates the adapter with default set of resource images. + * + * @param context + * context + */ + public NetworkImageAdapter(final Context context) { + super(); + this.context = context; + setResources(DEFAULT_RESOURCE_LIST); + } + + public NetworkImageAdapter(final Context context, LinkedList results) + { + super(); + this.context = context; + this.results = results; + setResources(); + } + + private final synchronized void setResources() + { + IMAGE_RESOURCE_URIS.clear(); + + for (Result r : results) + { + IMAGE_RESOURCE_URIS.add(r.getAvatarUri()); + } + + notifyDataSetChanged(); + } + + /** + * Replaces resources with those specified. + * + * @param resourceIds + * array of ids of resources. + */ + public final synchronized void setResources(final int[] resourceIds) { + IMAGE_RESOURCE_IDS.clear(); + for (final int resourceId : resourceIds) { + IMAGE_RESOURCE_IDS.add(resourceId); + } + notifyDataSetChanged(); + } + + /* + * (non-Javadoc) + * + * @see android.widget.Adapter#getCount() + */ + @Override + public synchronized int getCount() + { + // return this size if you use standard images + //return IMAGE_RESOURCE_IDS.size(); + return IMAGE_RESOURCE_URIS.size(); + } + + /* + * (non-Javadoc) + * + * @see pl.polidea.coverflow.AbstractCoverFlowImageAdapter#createBitmap(int) + */ + @Override + protected Bitmap createBitmap(final int position) { + Log.v(TAG, "creating item " + position); + + // use this code to use standard images +// final Bitmap bitmap = ((BitmapDrawable) context.getResources().getDrawable(IMAGE_RESOURCE_IDS.get(position))) +// .getBitmap(); + + final Bitmap bitmap; + try + { + bitmap = BitmapFactory.decodeStream(context.getContentResolver().openInputStream(results.get(position).getAvatarUri())); + } + catch (FileNotFoundException e) + { + Log.e("ResourceImageAdapter", "FileNotFoundException at createBitmap"); + return null; + } + + bitmapMap.put(position, new WeakReference(bitmap)); + return bitmap; + } +} \ No newline at end of file diff --git a/src/pl/polidea/coverflow/ResourceImageAdapter.java b/src/pl/polidea/coverflow/ResourceImageAdapter.java index b52ade9..eaa79c9 100644 --- a/src/pl/polidea/coverflow/ResourceImageAdapter.java +++ b/src/pl/polidea/coverflow/ResourceImageAdapter.java @@ -1,20 +1,15 @@ package pl.polidea.coverflow; -import android.content.Context; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.net.Uri; -import android.util.Log; - -import java.io.FileNotFoundException; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.HashMap; -import java.util.LinkedList; import java.util.List; import java.util.Map; -import pl.polidea.coverflow.testingactivity.Result; +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.drawable.BitmapDrawable; +import android.util.Log; /** * This class is an adapter that provides images from a fixed set of resource @@ -42,10 +37,6 @@ public class ResourceImageAdapter extends AbstractCoverFlowImageAdapter { private final Context context; - - private LinkedList results; - private static final List IMAGE_RESOURCE_URIS = new ArrayList(); - /** * Creates the adapter with default set of resource images. * @@ -58,26 +49,6 @@ public ResourceImageAdapter(final Context context) { setResources(DEFAULT_RESOURCE_LIST); } - public ResourceImageAdapter(final Context context, LinkedList results) - { - super(); - this.context = context; - this.results = results; - setResources(); - } - - private final synchronized void setResources() - { - IMAGE_RESOURCE_URIS.clear(); - - for (Result r : results) - { - IMAGE_RESOURCE_URIS.add(r.getAvatarUri()); - } - - notifyDataSetChanged(); - } - /** * Replaces resources with those specified. * @@ -98,11 +69,8 @@ public final synchronized void setResources(final int[] resourceIds) { * @see android.widget.Adapter#getCount() */ @Override - public synchronized int getCount() - { - // return this size if you use standard images - //return IMAGE_RESOURCE_IDS.size(); - return IMAGE_RESOURCE_URIS.size(); + public synchronized int getCount() { + return IMAGE_RESOURCE_IDS.size(); } /* @@ -113,22 +81,8 @@ public synchronized int getCount() @Override protected Bitmap createBitmap(final int position) { Log.v(TAG, "creating item " + position); - - // use this code to use standard images -// final Bitmap bitmap = ((BitmapDrawable) context.getResources().getDrawable(IMAGE_RESOURCE_IDS.get(position))) -// .getBitmap(); - - final Bitmap bitmap; - try - { - bitmap = BitmapFactory.decodeStream(context.getContentResolver().openInputStream(results.get(position).getAvatarUri())); - } - catch (FileNotFoundException e) - { - Log.e("ResourceImageAdapter", "FileNotFoundException at createBitmap"); - return null; - } - + final Bitmap bitmap = ((BitmapDrawable) context.getResources().getDrawable(IMAGE_RESOURCE_IDS.get(position))) + .getBitmap(); bitmapMap.put(position, new WeakReference(bitmap)); return bitmap; } diff --git a/src/pl/polidea/coverflow/testingactivity/CoverFlowTestingActivity.java b/src/pl/polidea/coverflow/testingactivity/CoverFlowTestingActivity.java index c4984c9..0309ad6 100644 --- a/src/pl/polidea/coverflow/testingactivity/CoverFlowTestingActivity.java +++ b/src/pl/polidea/coverflow/testingactivity/CoverFlowTestingActivity.java @@ -27,6 +27,7 @@ import java.util.LinkedList; import pl.polidea.coverflow.CoverFlow; +import pl.polidea.coverflow.NetworkImageAdapter; import pl.polidea.coverflow.R; import pl.polidea.coverflow.ReflectingImageAdapter; import pl.polidea.coverflow.ResourceImageAdapter; @@ -112,12 +113,13 @@ private void setupCoverFlow(final CoverFlow mCoverFlow, final boolean reflect) { setupListeners(mCoverFlow); } + // this setup is used for Polidea avatars public void setupCoverFlow(final CoverFlow mCoverFlow, final boolean reflect, LinkedList results) { BaseAdapter coverImageAdapter; if (reflect) { - coverImageAdapter = new ReflectingImageAdapter(new ResourceImageAdapter(this, results)); + coverImageAdapter = new ReflectingImageAdapter(new NetworkImageAdapter(this, results)); } else { - coverImageAdapter = new ResourceImageAdapter(this, results); + coverImageAdapter = new NetworkImageAdapter(this, results); } mCoverFlow.setAdapter(coverImageAdapter); From 5fc2bca1637a97ef0c3c1ef05211cfd0fc649b8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marta=20Woldan=CC=81ska?= Date: Wed, 6 Aug 2014 15:56:34 +0200 Subject: [PATCH 06/13] NetworkImageAdapter parses JSON file and shows Chuck Norris on every ImageView - work in progress --- .../coverflow/NetworkImageAdapter.java | 117 +++++++++--------- 1 file changed, 61 insertions(+), 56 deletions(-) diff --git a/src/pl/polidea/coverflow/NetworkImageAdapter.java b/src/pl/polidea/coverflow/NetworkImageAdapter.java index cdac668..d2c99b9 100644 --- a/src/pl/polidea/coverflow/NetworkImageAdapter.java +++ b/src/pl/polidea/coverflow/NetworkImageAdapter.java @@ -3,17 +3,27 @@ import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; +import android.graphics.drawable.BitmapDrawable; import android.net.Uri; import android.util.Log; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; import java.lang.ref.WeakReference; +import java.net.MalformedURLException; +import java.net.URL; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; +import pl.polidea.coverflow.testingactivity.EmployeeAvatarTask; import pl.polidea.coverflow.testingactivity.Result; /** @@ -23,50 +33,31 @@ * */ public class NetworkImageAdapter extends AbstractCoverFlowImageAdapter { - /** The Constant TAG. */ private static final String TAG = NetworkImageAdapter.class.getSimpleName(); - /** The Constant DEFAULT_LIST_SIZE. */ - private static final int DEFAULT_LIST_SIZE = 20; - - /** The Constant IMAGE_RESOURCE_IDS. */ - private static final List IMAGE_RESOURCE_IDS = new ArrayList(DEFAULT_LIST_SIZE); - - /** The Constant DEFAULT_RESOURCE_LIST. */ - private static final int[] DEFAULT_RESOURCE_LIST = { R.drawable.image01, R.drawable.image02, R.drawable.image03, - R.drawable.image04, R.drawable.image05 }; - /** The bitmap map. */ private final Map> bitmapMap = new HashMap>(); private final Context context; - - private LinkedList results; private static final List IMAGE_RESOURCE_URIS = new ArrayList(); - /** - * Creates the adapter with default set of resource images. - * - * @param context - * context - */ - public NetworkImageAdapter(final Context context) { - super(); - this.context = context; - setResources(DEFAULT_RESOURCE_LIST); - } - - public NetworkImageAdapter(final Context context, LinkedList results) + public NetworkImageAdapter(final Context context) { super(); + this.context = context; - this.results = results; - setResources(); + try { + setResources(parseJSONResult(readStringFromInputStream(context.getAssets().open("faces.txt")))); + } + catch (IOException e) + { + e.printStackTrace(); + } } - private final synchronized void setResources() + public final synchronized void setResources(List results) { IMAGE_RESOURCE_URIS.clear(); @@ -78,20 +69,6 @@ private final synchronized void setResources() notifyDataSetChanged(); } - /** - * Replaces resources with those specified. - * - * @param resourceIds - * array of ids of resources. - */ - public final synchronized void setResources(final int[] resourceIds) { - IMAGE_RESOURCE_IDS.clear(); - for (final int resourceId : resourceIds) { - IMAGE_RESOURCE_IDS.add(resourceId); - } - notifyDataSetChanged(); - } - /* * (non-Javadoc) * @@ -100,8 +77,6 @@ public final synchronized void setResources(final int[] resourceIds) { @Override public synchronized int getCount() { - // return this size if you use standard images - //return IMAGE_RESOURCE_IDS.size(); return IMAGE_RESOURCE_URIS.size(); } @@ -112,24 +87,54 @@ public synchronized int getCount() */ @Override protected Bitmap createBitmap(final int position) { - Log.v(TAG, "creating item " + position); + return ((BitmapDrawable) context.getResources().getDrawable(R.drawable.image01)).getBitmap(); + } + + private String readStringFromInputStream(InputStream inputStream) throws IOException + { + StringBuilder builder = new StringBuilder(); + + int c; + + while((c = inputStream.read()) != -1) + { + builder.append((char)c); + } - // use this code to use standard images -// final Bitmap bitmap = ((BitmapDrawable) context.getResources().getDrawable(IMAGE_RESOURCE_IDS.get(position))) -// .getBitmap(); + return builder.toString(); + } + + private LinkedList parseJSONResult(String result) + { + LinkedList results = new LinkedList(); - final Bitmap bitmap; try { - bitmap = BitmapFactory.decodeStream(context.getContentResolver().openInputStream(results.get(position).getAvatarUri())); + JSONObject outerItem = new JSONObject(result); + JSONArray jArray = outerItem.getJSONArray("people"); + + for (int i = 0; i < jArray.length(); i++) + { + JSONObject employee = jArray.getJSONObject(i); + String id = employee.getString("id"); + + URL url = new URL(employee.getString("gravatar")); + + Result employeeResult = new Result(url, id, null); + results.add(employeeResult); + } + } + catch (MalformedURLException e) + { + Log.e("CoverFlowTestingActivity", "MalformedUrlException in parseJSONResult"); + e.printStackTrace(); } - catch (FileNotFoundException e) + catch (JSONException e) { - Log.e("ResourceImageAdapter", "FileNotFoundException at createBitmap"); - return null; + Log.e("CoverFlowTestingActivity", "JSONException in parseJSONResult"); + e.printStackTrace(); } - bitmapMap.put(position, new WeakReference(bitmap)); - return bitmap; + return results; } } \ No newline at end of file From 2a7414844afa0ce1d7fd4c31929f395d81b3c096 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marta=20Woldan=CC=81ska?= Date: Wed, 6 Aug 2014 15:57:43 +0200 Subject: [PATCH 07/13] Cleaning up the mess in activity --- .../CoverFlowTestingActivity.java | 135 +++--------------- 1 file changed, 17 insertions(+), 118 deletions(-) diff --git a/src/pl/polidea/coverflow/testingactivity/CoverFlowTestingActivity.java b/src/pl/polidea/coverflow/testingactivity/CoverFlowTestingActivity.java index 0309ad6..1c7ef79 100644 --- a/src/pl/polidea/coverflow/testingactivity/CoverFlowTestingActivity.java +++ b/src/pl/polidea/coverflow/testingactivity/CoverFlowTestingActivity.java @@ -26,6 +26,7 @@ import java.net.URL; import java.util.LinkedList; +import pl.polidea.coverflow.AbstractCoverFlowImageAdapter; import pl.polidea.coverflow.CoverFlow; import pl.polidea.coverflow.NetworkImageAdapter; import pl.polidea.coverflow.R; @@ -38,9 +39,6 @@ public class CoverFlowTestingActivity extends Activity { private TextView textView; - - private LinkedList results; - private ProgressDialog progressDialog; /* * (non-Javadoc) * @@ -54,43 +52,14 @@ protected void onCreate(final Bundle savedInstanceState) { textView = (TextView) findViewById(this.getResources() .getIdentifier("statusText", "id", "pl.polidea.coverflow")); - if (!NetworkUtilities.isOnline(this)) - { - Toast.makeText(this, "You must go online to use application", Toast.LENGTH_SHORT).show(); - return; - } - - progressDialog = new ProgressDialog(this) - { - @Override - public void onBackPressed() - { - super.onBackPressed(); - CoverFlowTestingActivity.this.finish(); - } - }; - progressDialog.setMessage("This might take a few seconds..."); - - try - { - results = parseJSONResult(readStringFromInputStream(getAssets().open("faces.txt"))); - - EmployeeAvatarTask avatarTask = new EmployeeAvatarTask(this, results); - avatarTask.execute(); - } - catch (IOException e) - { - e.printStackTrace(); - } - -// // note resources below are taken using getIdentifier to allow importing -// // this library as library. -// final CoverFlow coverFlow1 = (CoverFlow) findViewById(this.getResources().getIdentifier("coverflow", "id", -// "pl.polidea.coverflow")); -// setupCoverFlow(coverFlow1, false, results); -// final CoverFlow reflectingCoverFlow = (CoverFlow) findViewById(this.getResources().getIdentifier( -// "coverflowReflect", "id", "pl.polidea.coverflow")); -// setupCoverFlow(reflectingCoverFlow, true, results); + // note resources below are taken using getIdentifier to allow importing + // this library as library. + final CoverFlow coverFlow1 = (CoverFlow) findViewById(this.getResources().getIdentifier("coverflow", "id", + "pl.polidea.coverflow")); + setupCoverFlow(coverFlow1, false); + final CoverFlow reflectingCoverFlow = (CoverFlow) findViewById(this.getResources().getIdentifier( + "coverflowReflect", "id", "pl.polidea.coverflow")); + setupCoverFlow(reflectingCoverFlow, true); } /** @@ -103,25 +72,18 @@ public void onBackPressed() */ private void setupCoverFlow(final CoverFlow mCoverFlow, final boolean reflect) { BaseAdapter coverImageAdapter; - if (reflect) { - coverImageAdapter = new ReflectingImageAdapter(new ResourceImageAdapter(this)); - } else { - coverImageAdapter = new ResourceImageAdapter(this); - } - mCoverFlow.setAdapter(coverImageAdapter); - mCoverFlow.setSelection(2, true); - setupListeners(mCoverFlow); - } - // this setup is used for Polidea avatars - public void setupCoverFlow(final CoverFlow mCoverFlow, final boolean reflect, LinkedList results) { - BaseAdapter coverImageAdapter; + AbstractCoverFlowImageAdapter linkedAdapter; + + // select here which adapter to use + linkedAdapter = new ResourceImageAdapter(this); +// linkedAdapter = new NetworkImageAdapter(this); + if (reflect) { - coverImageAdapter = new ReflectingImageAdapter(new NetworkImageAdapter(this, results)); + coverImageAdapter = new ReflectingImageAdapter(linkedAdapter); } else { - coverImageAdapter = new NetworkImageAdapter(this, results); + coverImageAdapter = linkedAdapter; } - mCoverFlow.setAdapter(coverImageAdapter); mCoverFlow.setSelection(2, true); setupListeners(mCoverFlow); @@ -153,67 +115,4 @@ public void onNothingSelected(final AdapterView< ? > parent) { } }); } - - private String readStringFromInputStream(InputStream inputStream) throws IOException - { - StringBuilder builder = new StringBuilder(); - - int c; - - while((c = inputStream.read()) != -1) - { - builder.append((char)c); - } - - return builder.toString(); - } - - private LinkedList parseJSONResult(String result) - { - LinkedList results = new LinkedList(); - - try - { - JSONObject outerItem = new JSONObject(result); - JSONArray jArray = outerItem.getJSONArray("people"); - - for (int i = 0; i < jArray.length(); i++) - { - JSONObject employee = jArray.getJSONObject(i); - String id = employee.getString("id"); - - URL url = new URL(employee.getString("gravatar")); - - Result employeeResult = new Result(url, id, null); - results.add(employeeResult); - } - } - catch (MalformedURLException e) - { - Log.e("CoverFlowTestingActivity", "MalformedUrlException in parseJSONResult"); - e.printStackTrace(); - } - catch (JSONException e) - { - Log.e("CoverFlowTestingActivity", "JSONException in parseJSONResult"); - e.printStackTrace(); - } - - return results; - } - - public LinkedList getResults() - { - return results; - } - - public void setResults(LinkedList results) - { - this.results = results; - } - - public ProgressDialog getProgressDialog() - { - return progressDialog; - } } From 9cb10bdaf510bc816d8e69003fc737b7fbb2aaf5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marta=20Woldan=CC=81ska?= Date: Wed, 6 Aug 2014 16:20:15 +0200 Subject: [PATCH 08/13] Picasso added --- build.gradle | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/build.gradle b/build.gradle index ad542a3..61cdc89 100644 --- a/build.gradle +++ b/build.gradle @@ -25,6 +25,10 @@ repositories { } } +dependencies { + compile 'com.squareup.picasso:picasso:2.3.3' +} + android { compileSdkVersion 19 buildToolsVersion "19.1.0" From 618e3cfda7c0c72997c5da64c49a120273e05430 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marta=20Woldan=CC=81ska?= Date: Wed, 6 Aug 2014 16:22:46 +0200 Subject: [PATCH 09/13] I need getView to be not final in order to overload it in NetworkImageAdapter --- src/pl/polidea/coverflow/AbstractCoverFlowImageAdapter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pl/polidea/coverflow/AbstractCoverFlowImageAdapter.java b/src/pl/polidea/coverflow/AbstractCoverFlowImageAdapter.java index 8922e75..5a335a9 100644 --- a/src/pl/polidea/coverflow/AbstractCoverFlowImageAdapter.java +++ b/src/pl/polidea/coverflow/AbstractCoverFlowImageAdapter.java @@ -100,7 +100,7 @@ public final synchronized long getItemId(final int position) { * android.view.ViewGroup) */ @Override - public final synchronized ImageView getView(final int position, final View convertView, final ViewGroup parent) { + public synchronized ImageView getView(final int position, final View convertView, final ViewGroup parent) { ImageView imageView; if (convertView == null) { final Context context = parent.getContext(); From 4e45e66f67a6c7d8f9b71c4d84b93fc9e432d8c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marta=20Woldan=CC=81ska?= Date: Wed, 6 Aug 2014 16:24:15 +0200 Subject: [PATCH 10/13] NetworkImageAdapter now uses Picasso to fetch Polidea's employees' avatars --- .../coverflow/NetworkImageAdapter.java | 36 +++++++++++++------ .../coverflow/testingactivity/Result.java | 34 +++--------------- 2 files changed, 29 insertions(+), 41 deletions(-) diff --git a/src/pl/polidea/coverflow/NetworkImageAdapter.java b/src/pl/polidea/coverflow/NetworkImageAdapter.java index d2c99b9..aaa6678 100644 --- a/src/pl/polidea/coverflow/NetworkImageAdapter.java +++ b/src/pl/polidea/coverflow/NetworkImageAdapter.java @@ -4,8 +4,14 @@ import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.BitmapDrawable; +import android.media.Image; import android.net.Uri; import android.util.Log; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; + +import com.squareup.picasso.Picasso; import org.json.JSONArray; import org.json.JSONException; @@ -16,6 +22,7 @@ import java.io.InputStream; import java.lang.ref.WeakReference; import java.net.MalformedURLException; +import java.net.URI; import java.net.URL; import java.util.ArrayList; import java.util.HashMap; @@ -41,7 +48,7 @@ public class NetworkImageAdapter extends AbstractCoverFlowImageAdapter { private final Context context; - private static final List IMAGE_RESOURCE_URIS = new ArrayList(); + private static final LinkedList RESULTS = new LinkedList(); public NetworkImageAdapter(final Context context) { @@ -59,11 +66,11 @@ public NetworkImageAdapter(final Context context) public final synchronized void setResources(List results) { - IMAGE_RESOURCE_URIS.clear(); + RESULTS.clear(); for (Result r : results) { - IMAGE_RESOURCE_URIS.add(r.getAvatarUri()); + RESULTS.add(r); } notifyDataSetChanged(); @@ -77,7 +84,7 @@ public final synchronized void setResources(List results) @Override public synchronized int getCount() { - return IMAGE_RESOURCE_URIS.size(); + return RESULTS.size(); } /* @@ -118,17 +125,12 @@ private LinkedList parseJSONResult(String result) JSONObject employee = jArray.getJSONObject(i); String id = employee.getString("id"); - URL url = new URL(employee.getString("gravatar")); + String url = employee.getString("gravatar"); - Result employeeResult = new Result(url, id, null); + Result employeeResult = new Result(url, id); results.add(employeeResult); } } - catch (MalformedURLException e) - { - Log.e("CoverFlowTestingActivity", "MalformedUrlException in parseJSONResult"); - e.printStackTrace(); - } catch (JSONException e) { Log.e("CoverFlowTestingActivity", "JSONException in parseJSONResult"); @@ -137,4 +139,16 @@ private LinkedList parseJSONResult(String result) return results; } + + @Override + public synchronized ImageView getView(int position, View convertView, ViewGroup parent) + { + ImageView view = super.getView(position, convertView, parent); + + Log.d(TAG, "getView: " + RESULTS.get(position)); + + Picasso.with(context).load(RESULTS.get(position).getAvatarURL()).into(view); + + return view; + } } \ No newline at end of file diff --git a/src/pl/polidea/coverflow/testingactivity/Result.java b/src/pl/polidea/coverflow/testingactivity/Result.java index 49a74e7..7e005d9 100644 --- a/src/pl/polidea/coverflow/testingactivity/Result.java +++ b/src/pl/polidea/coverflow/testingactivity/Result.java @@ -2,6 +2,7 @@ import android.net.Uri; +import java.net.URI; import java.net.URL; /** @@ -10,51 +11,24 @@ public class Result { - private URL avatarURL; + private String avatarURL; private String userId; - private Uri avatarUri; public Result() { this.avatarURL = null; this.userId = ""; - this.avatarUri = null; } - public Result(URL avatarURL, String userId, Uri avatarUri) + public Result(String avatarURL, String userId) { this.avatarURL = avatarURL; this.userId = userId; - this.avatarUri = avatarUri; } - public URL getAvatarURL() + public String getAvatarURL() { return this.avatarURL; } - public void setAvatarURL(URL avatarURL) - { - this.avatarURL = avatarURL; - } - - public String getUserId() - { - return this.userId; - } - - public void setUserId(String userId) - { - this.userId = userId; - } - - public Uri getAvatarUri() - { - return avatarUri; - } - - public void setAvatarUri(Uri avatarUri) - { - this.avatarUri = avatarUri; - } } From 6228484b4869525b94f3c68f7dec453b9e569226 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marta=20Woldan=CC=81ska?= Date: Wed, 6 Aug 2014 16:27:22 +0200 Subject: [PATCH 11/13] EmployeeAvatarTask removed --- .../testingactivity/EmployeeAvatarTask.java | 125 ------------------ 1 file changed, 125 deletions(-) delete mode 100644 src/pl/polidea/coverflow/testingactivity/EmployeeAvatarTask.java diff --git a/src/pl/polidea/coverflow/testingactivity/EmployeeAvatarTask.java b/src/pl/polidea/coverflow/testingactivity/EmployeeAvatarTask.java deleted file mode 100644 index 5ac03f0..0000000 --- a/src/pl/polidea/coverflow/testingactivity/EmployeeAvatarTask.java +++ /dev/null @@ -1,125 +0,0 @@ -package pl.polidea.coverflow.testingactivity; - -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.net.Uri; -import android.os.AsyncTask; -import android.os.Environment; -import android.util.Log; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.util.LinkedList; - -import pl.polidea.coverflow.CoverFlow; - -/** - * Created by martawoldanska on 8/4/14. - */ -public class EmployeeAvatarTask extends AsyncTask -{ - - LinkedList results; - private CoverFlowTestingActivity activity; - - public EmployeeAvatarTask(final CoverFlowTestingActivity activity, LinkedList results) - { - this.activity = activity; - this.results = results; - } - - @Override - protected void onPreExecute() - { - activity.getProgressDialog().show(); - } - - @Override - protected Void doInBackground(Void... params) - { - String root = Environment.getExternalStorageDirectory() - .getAbsolutePath(); - File filePath = new File(root + "/CoverFlow"); - - for (int i = 0; i < results.size(); i++) - { - try - { - String fileID = convertUrlToFileID(results.get(i) - .getAvatarURL().toString()); - File file = new File(filePath, fileID); - - if (!file.exists()) - { - Bitmap img = BitmapFactory.decodeStream(results.get(i) - .getAvatarURL().openConnection().getInputStream()); - file = saveBitmap(img, convertUrlToFileID(results.get(i) - .getAvatarURL().toString())); - } - - results.get(i).setAvatarUri(Uri.fromFile(file)); - } - catch (IOException e) - { - Log.e("EmployeeAvatarTask", "IOException in doInBackground"); - } - } - - return null; - } - - @Override - protected void onPostExecute(Void aVoid) - { - activity.setResults(results); - - if (activity.getProgressDialog() != null) - activity.getProgressDialog().dismiss(); - - // note resources below are taken using getIdentifier to allow importing - // this library as library. - - // not the prettiest way to do this, but this way the existence of employees' list is ensured - final CoverFlow coverFlow1 = (CoverFlow) activity.findViewById(activity.getResources().getIdentifier("coverflow", "id", - "pl.polidea.coverflow")); - activity.setupCoverFlow(coverFlow1, false, results); - final CoverFlow reflectingCoverFlow = (CoverFlow) activity.findViewById(activity.getResources().getIdentifier( - "coverflowReflect", "id", "pl.polidea.coverflow")); - activity.setupCoverFlow(reflectingCoverFlow, true, results); - } - - private String convertUrlToFileID(String url) - { - String fileID = url.replaceAll("[\\/:?&=.]", ""); - return fileID; - } - - private File saveBitmap(Bitmap bitmap, String fileID) - { - String root = Environment.getExternalStorageDirectory() - .getAbsolutePath(); - File filePath = new File(root + "/CoverFlow"); - filePath.mkdirs(); - - File file = new File(filePath, fileID); - - if (!file.exists()) - { - try - { - FileOutputStream stream = new FileOutputStream(file); - bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream); - stream.flush(); - stream.close(); - - } - catch (Exception e) - { - e.printStackTrace(); - } - } - - return file; - } -} From fbe5e846d4ece1257c157b1ff65a35a92192dbdf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marta=20Woldan=CC=81ska?= Date: Wed, 6 Aug 2014 16:28:01 +0200 Subject: [PATCH 12/13] Optimize imports --- .../AbstractCoverFlowImageAdapter.java | 8 ++++---- .../polidea/coverflow/NetworkImageAdapter.java | 9 --------- .../coverflow/ResourceImageAdapter.java | 10 +++++----- .../CoverFlowTestingActivity.java | 18 ------------------ .../coverflow/testingactivity/Result.java | 5 ----- 5 files changed, 9 insertions(+), 41 deletions(-) diff --git a/src/pl/polidea/coverflow/AbstractCoverFlowImageAdapter.java b/src/pl/polidea/coverflow/AbstractCoverFlowImageAdapter.java index 5a335a9..a185fed 100644 --- a/src/pl/polidea/coverflow/AbstractCoverFlowImageAdapter.java +++ b/src/pl/polidea/coverflow/AbstractCoverFlowImageAdapter.java @@ -1,9 +1,5 @@ package pl.polidea.coverflow; -import java.lang.ref.WeakReference; -import java.util.HashMap; -import java.util.Map; - import android.content.Context; import android.graphics.Bitmap; import android.util.Log; @@ -12,6 +8,10 @@ import android.widget.BaseAdapter; import android.widget.ImageView; +import java.lang.ref.WeakReference; +import java.util.HashMap; +import java.util.Map; + /** * This class is an adapter that provides base, abstract class for images * adapter. diff --git a/src/pl/polidea/coverflow/NetworkImageAdapter.java b/src/pl/polidea/coverflow/NetworkImageAdapter.java index aaa6678..32af6ff 100644 --- a/src/pl/polidea/coverflow/NetworkImageAdapter.java +++ b/src/pl/polidea/coverflow/NetworkImageAdapter.java @@ -2,10 +2,7 @@ import android.content.Context; import android.graphics.Bitmap; -import android.graphics.BitmapFactory; import android.graphics.drawable.BitmapDrawable; -import android.media.Image; -import android.net.Uri; import android.util.Log; import android.view.View; import android.view.ViewGroup; @@ -17,20 +14,14 @@ import org.json.JSONException; import org.json.JSONObject; -import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.lang.ref.WeakReference; -import java.net.MalformedURLException; -import java.net.URI; -import java.net.URL; -import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; -import pl.polidea.coverflow.testingactivity.EmployeeAvatarTask; import pl.polidea.coverflow.testingactivity.Result; /** diff --git a/src/pl/polidea/coverflow/ResourceImageAdapter.java b/src/pl/polidea/coverflow/ResourceImageAdapter.java index eaa79c9..60d8cf6 100644 --- a/src/pl/polidea/coverflow/ResourceImageAdapter.java +++ b/src/pl/polidea/coverflow/ResourceImageAdapter.java @@ -1,16 +1,16 @@ package pl.polidea.coverflow; +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.drawable.BitmapDrawable; +import android.util.Log; + import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import android.content.Context; -import android.graphics.Bitmap; -import android.graphics.drawable.BitmapDrawable; -import android.util.Log; - /** * This class is an adapter that provides images from a fixed set of resource * ids. Bitmaps and ImageViews are kept as weak references so that they can be diff --git a/src/pl/polidea/coverflow/testingactivity/CoverFlowTestingActivity.java b/src/pl/polidea/coverflow/testingactivity/CoverFlowTestingActivity.java index 1c7ef79..4caec06 100644 --- a/src/pl/polidea/coverflow/testingactivity/CoverFlowTestingActivity.java +++ b/src/pl/polidea/coverflow/testingactivity/CoverFlowTestingActivity.java @@ -1,37 +1,19 @@ package pl.polidea.coverflow.testingactivity; import android.app.Activity; -import android.app.ProgressDialog; import android.os.Bundle; -import android.util.Log; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.AdapterView.OnItemSelectedListener; import android.widget.BaseAdapter; import android.widget.TextView; -import android.widget.Toast; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileReader; -import java.io.IOException; -import java.io.InputStream; -import java.net.MalformedURLException; -import java.net.URL; -import java.util.LinkedList; import pl.polidea.coverflow.AbstractCoverFlowImageAdapter; import pl.polidea.coverflow.CoverFlow; import pl.polidea.coverflow.NetworkImageAdapter; import pl.polidea.coverflow.R; import pl.polidea.coverflow.ReflectingImageAdapter; -import pl.polidea.coverflow.ResourceImageAdapter; /**** * The Class CoverFlowTestingActivity. diff --git a/src/pl/polidea/coverflow/testingactivity/Result.java b/src/pl/polidea/coverflow/testingactivity/Result.java index 7e005d9..eb43e68 100644 --- a/src/pl/polidea/coverflow/testingactivity/Result.java +++ b/src/pl/polidea/coverflow/testingactivity/Result.java @@ -1,10 +1,5 @@ package pl.polidea.coverflow.testingactivity; -import android.net.Uri; - -import java.net.URI; -import java.net.URL; - /** * Created by martawoldanska on 8/4/14. */ From 330684c5934074cd976a32b54252671b5a3c618d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marta=20Woldan=CC=81ska?= Date: Wed, 6 Aug 2014 16:33:45 +0200 Subject: [PATCH 13/13] Comment about using ReflectingImageAdapter added --- .../coverflow/testingactivity/CoverFlowTestingActivity.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pl/polidea/coverflow/testingactivity/CoverFlowTestingActivity.java b/src/pl/polidea/coverflow/testingactivity/CoverFlowTestingActivity.java index 4caec06..f07c8ec 100644 --- a/src/pl/polidea/coverflow/testingactivity/CoverFlowTestingActivity.java +++ b/src/pl/polidea/coverflow/testingactivity/CoverFlowTestingActivity.java @@ -61,6 +61,7 @@ private void setupCoverFlow(final CoverFlow mCoverFlow, final boolean reflect) { linkedAdapter = new ResourceImageAdapter(this); // linkedAdapter = new NetworkImageAdapter(this); + // ReflectingImageAdapter doesn't work with NetworkImageAdapter - you need to use Picasso there if (reflect) { coverImageAdapter = new ReflectingImageAdapter(linkedAdapter); } else {