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; + } + +}