diff --git a/FlipView/Demo/APK/Aphid-FlipView-Demo.apk b/FlipView/Demo/APK/Aphid-FlipView-Demo.apk
index 8093a31..eb3b7bf 100644
Binary files a/FlipView/Demo/APK/Aphid-FlipView-Demo.apk and b/FlipView/Demo/APK/Aphid-FlipView-Demo.apk differ
diff --git a/FlipView/Demo/res/drawable-hdpi/feed_taggeduser_image.png b/FlipView/Demo/res/drawable-hdpi/feed_taggeduser_image.png
new file mode 100644
index 0000000..069d4ee
Binary files /dev/null and b/FlipView/Demo/res/drawable-hdpi/feed_taggeduser_image.png differ
diff --git a/FlipView/Demo/res/drawable-hdpi/icon_place_checkin.png b/FlipView/Demo/res/drawable-hdpi/icon_place_checkin.png
new file mode 100644
index 0000000..0433ea1
Binary files /dev/null and b/FlipView/Demo/res/drawable-hdpi/icon_place_checkin.png differ
diff --git a/FlipView/Demo/res/layout/gallery_flip_item_layout.xml b/FlipView/Demo/res/layout/gallery_flip_item_layout.xml
new file mode 100644
index 0000000..1067f31
--- /dev/null
+++ b/FlipView/Demo/res/layout/gallery_flip_item_layout.xml
@@ -0,0 +1,142 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/FlipView/Demo/res/values/colors.xml b/FlipView/Demo/res/values/colors.xml
new file mode 100644
index 0000000..5f55c62
--- /dev/null
+++ b/FlipView/Demo/res/values/colors.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+ #6D000000
+ #FFFFFF
+ #949494
+
+
diff --git a/FlipView/Demo/src/com/aphidmobile/flip/demo/Issue5Activity.java b/FlipView/Demo/src/com/aphidmobile/flip/demo/Issue5Activity.java
index fd21efb..4d2d8ce 100644
--- a/FlipView/Demo/src/com/aphidmobile/flip/demo/Issue5Activity.java
+++ b/FlipView/Demo/src/com/aphidmobile/flip/demo/Issue5Activity.java
@@ -13,6 +13,7 @@
import com.aphidmobile.flip.FlipViewController;
import com.aphidmobile.flip.demo.data.Travels;
+import com.aphidmobile.flip.demo.issue5.GalleryFlipAdapter;
import com.aphidmobile.flipview.demo.R;
import com.aphidmobile.utils.AphidLog;
import com.aphidmobile.utils.IO;
@@ -32,7 +33,7 @@ public void onCreate(Bundle savedInstanceState) {
flipView = new FlipViewController(this);
- flipView.setAdapter(new MyBaseAdapter(this));
+ flipView.setAdapter(new GalleryFlipAdapter(this, flipView));
setContentView(flipView);
}
@@ -48,60 +49,4 @@ protected void onPause() {
super.onPause();
flipView.onPause();
}
-
- private static class MyBaseAdapter extends BaseAdapter {
-
- private LayoutInflater inflater;
-
- private MyBaseAdapter(Context context) {
- inflater = LayoutInflater.from(context);
- }
-
- @Override
- public int getCount() {
- return Travels.IMG_DESCRIPTIONS.size();
- }
-
- @Override
- public Object getItem(int position) {
- return position;
- }
-
- @Override
- public long getItemId(int position) {
- return position;
- }
-
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- View layout = convertView;
- if (convertView == null)
- layout = inflater.inflate(R.layout.issue5, null);
-
- final Travels.Data data = Travels.IMG_DESCRIPTIONS.get(position);
-
- UI
- .findViewById(layout, R.id.gallery_flip_item_place_name_textview)
- .setText(AphidLog.format("%d. %s", position, data.title));
-
- UI
- .findViewById(layout, R.id.gallery_flip_item_background_imageview)
- .setImageBitmap(IO.readBitmap(inflater.getContext().getAssets(), data.imageFilename));
-
- UI
- .findViewById(layout, R.id.gallery_flip_item_place_description_textview)
- .setText(Html.fromHtml(data.description));
-
- UI
- .findViewById(layout, R.id.gallery_flip_item_place_city_textview)
- .setText(data.city);
-
- UI
- .findViewById(layout, R.id.gallery_flip_item_place_country_textview)
- .setText(data.country);
-
- return layout;
- }
-
- }
}
\ No newline at end of file
diff --git a/FlipView/Demo/src/com/aphidmobile/flip/demo/MainActivity.java b/FlipView/Demo/src/com/aphidmobile/flip/demo/MainActivity.java
index 0830a57..e94bad9 100644
--- a/FlipView/Demo/src/com/aphidmobile/flip/demo/MainActivity.java
+++ b/FlipView/Demo/src/com/aphidmobile/flip/demo/MainActivity.java
@@ -72,9 +72,10 @@ protected void onListItemClick(ListView l, View v, int position, long id) {
addItem(data, "Flip Async Content", FlipAsyncContentActivity.class);
addItem(data, "Flip with Event Listener", FlipTextViewAltActivity.class);
addItem(data, "Flip Horizontal", FlipHorizontalLayoutActivity.class);
- addItem(data, "Flip XML", FlipTextViewXmlActivity.class);
- addItem(data, "Fragment Demo", FlipFragmentActivity.class);
addItem(data, "Issue #5", Issue5Activity.class);
+ addItem(data, "XML Configuration", FlipTextViewXmlActivity.class);
+ addItem(data, "Fragment Demo", FlipFragmentActivity.class);
+
return data;
}
diff --git a/FlipView/Demo/src/com/aphidmobile/flip/demo/issue5/GalleryFlipAdapter.java b/FlipView/Demo/src/com/aphidmobile/flip/demo/issue5/GalleryFlipAdapter.java
new file mode 100644
index 0000000..34dc653
--- /dev/null
+++ b/FlipView/Demo/src/com/aphidmobile/flip/demo/issue5/GalleryFlipAdapter.java
@@ -0,0 +1,69 @@
+package com.aphidmobile.flip.demo.issue5;
+
+import android.content.Context;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import com.aphidmobile.flip.FlipViewController;
+
+import java.util.ArrayList;
+
+public class GalleryFlipAdapter extends BaseAdapter {
+ private ArrayList galleryPageList;
+
+ private Context mContext;
+
+ private FlipViewController controller;
+
+ public GalleryFlipAdapter(Context context, FlipViewController controller) {
+ this.mContext = context;
+ this.controller = controller;
+
+ ArrayList list = new ArrayList();
+ list.add(new GalleryPage("Test 1", "http://www.hotel-chantecler.be/new-images/grand_place_building.jpg",
+ "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis a rutrum arcu. Curabitur a ante at elit dictum imperdiet. Vestibulum et eros nec diam bibendum placerat. Praesent quis lectus metus. Fusce non pulvinar mi. Nulla eu urna nibh.",
+ "http://upload.wikimedia.org/wikipedia/en/0/05/Windows_Photo_Viewer_Icon_on_Windows_7.png"));
+ list.add(new GalleryPage("Test 2", "http://www.hotel-chantecler.be/new-images/brussels-jubelpark-cinquantenaire-triumphal%20arch-1.jpg",
+ "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis a rutrum arcu. Curabitur a ante at elit dictum imperdiet. Vestibulum et eros nec diam bibendum placerat. Praesent quis lectus metus. Fusce non pulvinar mi. Nulla eu urna nibh.",
+ "http://upload.wikimedia.org/wikipedia/en/0/05/Windows_Photo_Viewer_Icon_on_Windows_7.png"));
+ list.add(new GalleryPage("Test 3", "http://www.hotel-chantecler.be/new-images/Belgium-Waterloo-Butte-du-Lion-hill.jpg",
+ "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis a rutrum arcu. Curabitur a ante at elit dictum imperdiet. Vestibulum et eros nec diam bibendum placerat. Praesent quis lectus metus. Fusce non pulvinar mi. Nulla eu urna nibh.",
+ "http://upload.wikimedia.org/wikipedia/en/0/05/Windows_Photo_Viewer_Icon_on_Windows_7.png"));
+ list.add(new GalleryPage("Test 4", "http://www.hotel-chantecler.be/new-images/ATAPR048.jpg",
+ "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis a rutrum arcu. Curabitur a ante at elit dictum imperdiet. Vestibulum et eros nec diam bibendum placerat. Praesent quis lectus metus. Fusce non pulvinar mi. Nulla eu urna nibh.",
+ "http://upload.wikimedia.org/wikipedia/en/0/05/Windows_Photo_Viewer_Icon_on_Windows_7.png"));
+ list.add(new GalleryPage("Test 5", "http://www.hotel-chantecler.be/new-images/la_bourse.jpg",
+ "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis a rutrum arcu. Curabitur a ante at elit dictum imperdiet. Vestibulum et eros nec diam bibendum placerat. Praesent quis lectus metus. Fusce non pulvinar mi. Nulla eu urna nibh.",
+ "http://upload.wikimedia.org/wikipedia/en/0/05/Windows_Photo_Viewer_Icon_on_Windows_7.png"));
+
+ galleryPageList = list;
+ }
+
+ public int getCount() {
+ return galleryPageList.size();
+ }
+
+ public Object getItem(int position) {
+ return galleryPageList.get(position);
+ }
+
+ public long getItemId(int position) {
+ return position;
+ }
+
+ public View getView(int position, View convertView, ViewGroup parent) {
+ if (convertView == null) {
+ Log.i("GalleryFlipAdapter", "convertView == null");
+ convertView = new GalleryFlipItem(mContext, galleryPageList.get(position), controller, position);
+ } else {
+ Log.i("GalleryFlipAdapter", "convertView != null");
+ ((GalleryFlipItem) convertView).refreshView(galleryPageList.get(position), controller, position);
+ }
+ return convertView;
+ }
+
+ public void clear() {
+ galleryPageList.clear();
+ }
+}
diff --git a/FlipView/Demo/src/com/aphidmobile/flip/demo/issue5/GalleryFlipItem.java b/FlipView/Demo/src/com/aphidmobile/flip/demo/issue5/GalleryFlipItem.java
new file mode 100644
index 0000000..e3411a4
--- /dev/null
+++ b/FlipView/Demo/src/com/aphidmobile/flip/demo/issue5/GalleryFlipItem.java
@@ -0,0 +1,237 @@
+package com.aphidmobile.flip.demo.issue5;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Point;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
+import android.os.AsyncTask;
+import android.view.Display;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.WindowManager;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.ProgressBar;
+import android.widget.TextView;
+import com.aphidmobile.flip.FlipViewController;
+import com.aphidmobile.flipview.demo.R;
+import com.aphidmobile.utils.AphidLog;
+import com.aphidmobile.utils.IO;
+import junit.framework.Assert;
+
+import java.io.BufferedInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.ref.WeakReference;
+import java.net.URL;
+import java.net.URLConnection;
+
+/**
+ * Modified from the issue#5 comment contributed by @cagkanciloglu
+ *
+ * Only corrected its async loading logic, although its layout hierarchy can be optimized too.
+ */
+public class GalleryFlipItem extends LinearLayout {
+ /**
+ * Borrowed from the official BitmapFun tutorial: http://developer.android.com/training/displaying-bitmaps/index.html
+ */
+ private static final class AsyncDrawable extends BitmapDrawable {
+ private final WeakReference taskRef;
+
+ public AsyncDrawable(Resources res, Bitmap bitmap, ContentPhotosDownloader task) {
+ super(res, bitmap);
+ this.taskRef = new WeakReference(task);
+ }
+
+ public static ContentPhotosDownloader getTask(ImageView imageView) {
+ Drawable drawable = imageView.getDrawable();
+ if (drawable instanceof AsyncDrawable)
+ return ((AsyncDrawable) drawable).taskRef.get();
+
+ return null;
+ }
+ }
+
+ //Change to a static inner class from a normal inner class, otherwise it may holds a strong reference to GalleryFlipItem, which is not a good practise for AsyncTask
+ private static class ContentPhotosDownloader extends AsyncTask {
+ private String url;
+
+ private WeakReference controllerRef;
+ //Use WeakReference
+ private WeakReference imgViewRef;
+ private WeakReference progressBarRef;
+ private int pageIndex;
+ private boolean hideProgress;
+
+ public ContentPhotosDownloader(String url, ImageView imgView, ProgressBar progressBar, FlipViewController controller, int pageIndex) {
+ Assert.assertNotNull(url);
+ Assert.assertNotNull(imgView);
+ Assert.assertNotNull(controller);
+ //progressBar can be null
+
+ this.url = url;
+ this.imgViewRef = new WeakReference(imgView);
+ this.controllerRef = new WeakReference(controller);
+ this.pageIndex = pageIndex;
+ if (progressBar != null)
+ progressBarRef = new WeakReference(progressBar);
+ }
+
+ public String getUrl() {
+ return url;
+ }
+
+ public int getPageIndex() {
+ return pageIndex;
+ }
+
+ private ProgressBar getProgressBar() {
+ return progressBarRef != null ? progressBarRef.get() : null;
+ }
+
+ @Override
+ protected void onPreExecute() {
+ super.onPreExecute();
+
+ ProgressBar bar = getProgressBar();
+ if (bar != null) {
+ bar.setVisibility(View.VISIBLE);
+ ImageView iv = imgViewRef.get();
+ if (iv != null)
+ iv.setVisibility(GONE);
+ }
+
+ //Commented out; pd and imgBackground should not be accessed directly
+ /*
+ pd.setVisibility(View.VISIBLE);
+ imgBackground.setVisibility(View.GONE);
+ */
+ }
+
+ @Override
+ protected Bitmap doInBackground(Void... params) {
+ InputStream is = null;
+ try {
+ URL aURL = new URL(url);
+ URLConnection conn = aURL.openConnection();
+
+ conn.connect();
+
+ is = new BufferedInputStream(conn.getInputStream());
+
+ Bitmap bim = BitmapFactory.decodeStream(is);
+
+ return bim;
+ } catch (IOException e) {
+ AphidLog.e(e, "Failed to load bitmap from url: " + url);
+ } finally {
+ IO.close(is);
+ }
+
+ return null;
+ }
+
+ @Override
+ protected void onPostExecute(Bitmap result) {
+ if (isCancelled())
+ return;
+
+ ImageView imgView = imgViewRef.get();
+
+ if (imgView != null && AsyncDrawable.getTask(imgView) == this) { //make sure the ImageView instance has not been reused for another page
+ if (result != null) {
+ imgView.setImageBitmap(result);
+ imgView.setVisibility(View.VISIBLE);
+ }
+
+ ProgressBar bar = getProgressBar();
+ if (bar != null)
+ bar.setVisibility(View.GONE);
+
+ FlipViewController controller = controllerRef.get();
+ if (controller != null)
+ controller.refreshPage(pageIndex);
+ }
+ }
+ }
+
+ public GalleryPage mGalleryPage;
+
+ private ImageView imgBackground;
+ private ProgressBar pd;
+ private LinearLayout lnlPlace;
+
+ private ImageView imgIcon;
+ private TextView txtName;
+ private TextView txtDistrict;
+ private TextView txtCity;
+
+ private Context mContext;
+
+ public void refreshView(GalleryPage mGalleryPage, FlipViewController controller, int pageIndex) {
+ this.mGalleryPage = mGalleryPage;
+
+ if (shouldStartAsyncLoad(imgIcon, mGalleryPage.getTargetURL(), pageIndex)) {
+ ContentPhotosDownloader downloader = new ContentPhotosDownloader(mGalleryPage.getTargetURL(), imgIcon, null, controller, pageIndex);
+ imgIcon.setImageDrawable(new AsyncDrawable(getResources(), null, downloader));
+ downloader.execute();
+ }
+
+ txtName.setText(this.mGalleryPage.getPageTitle());
+
+ if (shouldStartAsyncLoad(imgBackground, mGalleryPage.getImageURL(), pageIndex)) {
+ ContentPhotosDownloader downloader = new ContentPhotosDownloader(mGalleryPage.getImageURL(), imgBackground, pd, controller, pageIndex);
+ imgBackground.setImageDrawable(new AsyncDrawable(getResources(), null, downloader));
+ downloader.execute();
+ }
+ }
+
+ private boolean shouldStartAsyncLoad(ImageView imageView, String url, int pageIndex) {
+ ContentPhotosDownloader downloader = AsyncDrawable.getTask(imageView);
+ boolean shouldStart = true;
+ if (downloader != null) {
+ if (downloader.getPageIndex() == pageIndex && url.equals(downloader.getUrl()))
+ shouldStart = false;
+ else
+ downloader.cancel(true);
+ }
+ return shouldStart;
+ }
+
+ @SuppressWarnings("deprecation")
+ public GalleryFlipItem(Context context, GalleryPage mGalleryPage, FlipViewController controller, int pageIndex) {
+ super(context);
+ mContext = context;
+
+ LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ inflater.inflate(R.layout.gallery_flip_item_layout, this);
+
+ pd = (ProgressBar) findViewById(R.id.gallery_flip_item_background_progressbar);
+ imgBackground = (ImageView) findViewById(R.id.gallery_flip_item_background_imageview);
+
+ lnlPlace = (LinearLayout) findViewById(R.id.gallery_flip_item_place_linearlayout);
+
+ imgIcon = (ImageView) findViewById(R.id.gallery_flip_item_place_icon_imageview);
+ txtName = (TextView) findViewById(R.id.gallery_flip_item_place_name_textview);
+ txtDistrict = (TextView) findViewById(R.id.gallery_flip_item_place_district_textview);
+ txtCity = (TextView) findViewById(R.id.gallery_flip_item_place_city_textview);
+
+ int Measuredwidth = 0;
+ int Measuredheight = 0;
+ Point size = new Point();
+ WindowManager w = ((Activity) context).getWindowManager();
+
+ Display d = w.getDefaultDisplay();
+ Measuredwidth = d.getWidth();
+ Measuredheight = d.getHeight();
+
+ //notes: it's not the right approach to make the background fill its parent, using a RelativeLayout could be much better
+ imgBackground.setLayoutParams(new LayoutParams(Measuredwidth, Measuredheight));
+
+ refreshView(mGalleryPage, controller, pageIndex);
+ }
+}
diff --git a/FlipView/Demo/src/com/aphidmobile/flip/demo/issue5/GalleryPage.java b/FlipView/Demo/src/com/aphidmobile/flip/demo/issue5/GalleryPage.java
new file mode 100644
index 0000000..07ae783
--- /dev/null
+++ b/FlipView/Demo/src/com/aphidmobile/flip/demo/issue5/GalleryPage.java
@@ -0,0 +1,48 @@
+package com.aphidmobile.flip.demo.issue5;
+
+public class GalleryPage {
+ private String pageTitle;
+ private String imageURL;
+ private String targetLinkCaption;
+ private String targetURL;
+
+ public GalleryPage(String pageTitle, String imageURL, String targetLinkCaption, String targetURL) {
+ this.pageTitle = pageTitle;
+ this.imageURL = imageURL;
+ this.targetLinkCaption = targetLinkCaption;
+ this.targetURL = targetURL;
+ }
+
+ public String getPageTitle() {
+ return pageTitle;
+ }
+
+ public void setPageTitle(String pageTitle) {
+ this.pageTitle = pageTitle;
+ }
+
+ public String getImageURL() {
+ return imageURL;
+ }
+
+ public void setImageURL(String imageURL) {
+ this.imageURL = imageURL;
+ }
+
+ public String getTargetLinkCaption() {
+ return targetLinkCaption;
+ }
+
+ public void setTargetLinkCaption(String targetLinkCaption) {
+ this.targetLinkCaption = targetLinkCaption;
+ }
+
+ public String getTargetURL() {
+ return targetURL;
+ }
+
+ public void setTargetURL(String targetURL) {
+ this.targetURL = targetURL;
+ }
+
+}