summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordaniel oeh <daniel.oeh@gmail.com>2012-07-05 21:03:15 +0200
committerdaniel oeh <daniel.oeh@gmail.com>2012-07-05 21:03:15 +0200
commit84eff944abcd45b51420a6d0d79a4ff1bc71145a (patch)
tree096c233964f94c2c49852b67b7659af908efeff3 /src
parent3768761e9031e1ccc1136d44fc1f8f0fe6dadb26 (diff)
downloadAntennaPod-84eff944abcd45b51420a6d0d79a4ff1bc71145a.zip
Implemented async FeedImage loader
Diffstat (limited to 'src')
-rw-r--r--src/de/podfetcher/activity/FeedInfoActivity.java3
-rw-r--r--src/de/podfetcher/activity/FeedItemlistActivity.java1
-rw-r--r--src/de/podfetcher/activity/ItemviewActivity.java2
-rw-r--r--src/de/podfetcher/adapter/FeedlistAdapter.java15
-rw-r--r--src/de/podfetcher/asynctask/FeedImageLoader.java101
-rw-r--r--src/de/podfetcher/feed/FeedImage.java21
-rw-r--r--src/de/podfetcher/fragment/CoverFragment.java9
7 files changed, 116 insertions, 36 deletions
diff --git a/src/de/podfetcher/activity/FeedInfoActivity.java b/src/de/podfetcher/activity/FeedInfoActivity.java
index d15c7916c..1d82ee27d 100644
--- a/src/de/podfetcher/activity/FeedInfoActivity.java
+++ b/src/de/podfetcher/activity/FeedInfoActivity.java
@@ -10,6 +10,7 @@ import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;
import de.podfetcher.R;
+import de.podfetcher.asynctask.FeedImageLoader;
import de.podfetcher.feed.Feed;
import de.podfetcher.feed.FeedManager;
@@ -41,8 +42,8 @@ public class FeedInfoActivity extends SherlockActivity {
txtvDescription = (TextView) findViewById(R.id.txtvDescription);
txtvLanguage = (TextView) findViewById(R.id.txtvLanguage);
txtvAuthor = (TextView) findViewById(R.id.txtvAuthor);
+ FeedImageLoader.getInstance().loadBitmap(feed.getImage(), imgvCover);
- imgvCover.setImageBitmap(feed.getImage().getImageBitmap());
txtvTitle.setText(feed.getTitle());
txtvDescription.setText(feed.getDescription());
if (feed.getAuthor() != null) {
diff --git a/src/de/podfetcher/activity/FeedItemlistActivity.java b/src/de/podfetcher/activity/FeedItemlistActivity.java
index cd3276673..4e3aeabd3 100644
--- a/src/de/podfetcher/activity/FeedItemlistActivity.java
+++ b/src/de/podfetcher/activity/FeedItemlistActivity.java
@@ -42,7 +42,6 @@ public class FeedItemlistActivity extends SherlockFragmentActivity {
if(feedId == -1) Log.e(TAG, "Received invalid feed selection.");
feed = manager.getFeed(feedId);
- getSupportActionBar().setLogo(new BitmapDrawable(feed.getImage().getImageBitmap()));
setTitle(feed.getTitle());
FragmentManager fragmentManager = getSupportFragmentManager();
diff --git a/src/de/podfetcher/activity/ItemviewActivity.java b/src/de/podfetcher/activity/ItemviewActivity.java
index 6dde27399..72c3fecae 100644
--- a/src/de/podfetcher/activity/ItemviewActivity.java
+++ b/src/de/podfetcher/activity/ItemviewActivity.java
@@ -69,8 +69,6 @@ public class ItemviewActivity extends SherlockFragmentActivity {
private void populateUI() {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
setContentView(R.layout.feeditemview);
- getSupportActionBar().setLogo(
- new BitmapDrawable(item.getFeed().getImage().getImageBitmap()));
txtvTitle = (TextView) findViewById(R.id.txtvItemname);
txtvPublished = (TextView) findViewById(R.id.txtvPublished);
setTitle(item.getFeed().getTitle());
diff --git a/src/de/podfetcher/adapter/FeedlistAdapter.java b/src/de/podfetcher/adapter/FeedlistAdapter.java
index 9cf37793b..a9cc7d576 100644
--- a/src/de/podfetcher/adapter/FeedlistAdapter.java
+++ b/src/de/podfetcher/adapter/FeedlistAdapter.java
@@ -5,6 +5,7 @@ import java.text.DateFormat;
import java.util.List;
import de.podfetcher.R;
+import de.podfetcher.asynctask.FeedImageLoader;
import de.podfetcher.feed.Feed;
import de.podfetcher.storage.DownloadRequester;
import android.content.Context;
@@ -25,12 +26,14 @@ public class FeedlistAdapter extends ArrayAdapter<Feed> {
private static final String TAG = "FeedlistAdapter";
private int selectedItemIndex;
+ private FeedImageLoader imageLoader;
public static final int SELECTION_NONE = -1;
public FeedlistAdapter(Context context, int textViewResourceId,
List<Feed> objects) {
super(context, textViewResourceId, objects);
selectedItemIndex = SELECTION_NONE;
+ imageLoader = FeedImageLoader.getInstance();
}
@Override
@@ -82,16 +85,8 @@ public class FeedlistAdapter extends ArrayAdapter<Feed> {
holder.newEpisodes.setVisibility(View.INVISIBLE);
}
- if (feed.getImage() != null) {
- holder.image.setImageBitmap(feed.getImage().getImageBitmap()); // TODO
- // select
- // default
- // picture
- // when
- // no
- // image
- // downloaded
- }
+ imageLoader.loadBitmap(feed.getImage(), holder.image);
+
// TODO find new Episodes txtvNewEpisodes.setText(feed)
return convertView;
}
diff --git a/src/de/podfetcher/asynctask/FeedImageLoader.java b/src/de/podfetcher/asynctask/FeedImageLoader.java
new file mode 100644
index 000000000..9ffd2b9c9
--- /dev/null
+++ b/src/de/podfetcher/asynctask/FeedImageLoader.java
@@ -0,0 +1,101 @@
+package de.podfetcher.asynctask;
+
+import de.podfetcher.R;
+import de.podfetcher.feed.FeedImage;
+import android.annotation.SuppressLint;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.os.AsyncTask;
+import android.support.v4.util.LruCache;
+import android.util.Log;
+import android.widget.ImageView;
+
+/** Caches and loads FeedImage bitmaps in the background */
+public class FeedImageLoader {
+ private static FeedImageLoader singleton;
+
+ /**
+ * Stores references to loaded bitmaps. Bitmaps can be accessed by the id of
+ * the FeedImage the bitmap belongs to.
+ */
+ private LruCache<Long, Bitmap> imageCache;
+ private static final int CACHE_SIZE = 4 * 1024 * 1024;
+
+ private FeedImageLoader() {
+ imageCache = new LruCache<Long, Bitmap>(CACHE_SIZE) {
+
+ @SuppressLint("NewApi")
+ @Override
+ protected int sizeOf(Long key, Bitmap value) {
+ if (Integer.valueOf(android.os.Build.VERSION.SDK_INT) >= 12)
+ return value.getByteCount();
+ else
+ return (value.getRowBytes() * value.getHeight());
+
+ }
+
+ };
+ }
+
+ public static FeedImageLoader getInstance() {
+ if (singleton == null) {
+ singleton = new FeedImageLoader();
+ }
+ return singleton;
+ }
+
+ public void loadBitmap(FeedImage image, ImageView target) {
+ if (image != null) {
+ Bitmap bitmap = getBitmapFromCache(image.getId());
+ if (bitmap != null) {
+ target.setImageBitmap(bitmap);
+ } else {
+ target.setImageResource(R.drawable.default_cover);
+ BitmapWorkerTask worker = new BitmapWorkerTask(target);
+ worker.execute(image);
+ }
+ } else {
+ target.setImageResource(R.drawable.default_cover);
+ }
+ }
+
+ public void addBitmapToCache(long id, Bitmap bitmap) {
+ imageCache.put(id, bitmap);
+ }
+
+ public Bitmap getBitmapFromCache(long id) {
+ return imageCache.get(id);
+ }
+
+ class BitmapWorkerTask extends AsyncTask<FeedImage, Void, Void> {
+ private static final String TAG = "BitmapWorkerTask";
+ private ImageView target;
+ private Bitmap bitmap;
+
+ public BitmapWorkerTask(ImageView target) {
+ super();
+ this.target = target;
+ }
+
+ @Override
+ protected void onPostExecute(Void result) {
+ super.onPostExecute(result);
+ target.setImageBitmap(bitmap);
+ }
+
+ @Override
+ protected Void doInBackground(FeedImage... params) {
+ if (params[0].getFile_url() != null) {
+ bitmap = BitmapFactory.decodeFile(params[0].getFile_url());
+ addBitmapToCache(params[0].getId(), bitmap);
+ Log.d(TAG, "Finished loading bitmaps");
+ } else {
+ Log.e(TAG, "FeedImage has no file url. Using default image");
+ bitmap = BitmapFactory.decodeResource(target.getResources(),
+ R.drawable.default_cover);
+ }
+ return null;
+ }
+ }
+
+}
diff --git a/src/de/podfetcher/feed/FeedImage.java b/src/de/podfetcher/feed/FeedImage.java
index c10aeebaa..918e6b78b 100644
--- a/src/de/podfetcher/feed/FeedImage.java
+++ b/src/de/podfetcher/feed/FeedImage.java
@@ -1,19 +1,17 @@
package de.podfetcher.feed;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
public class FeedImage extends FeedFile {
protected String title;
- protected Bitmap image_bitmap;
public FeedImage(String download_url, String title) {
super(null, download_url, false);
this.download_url = download_url;
this.title = title;
}
-
- public FeedImage(long id, String title, String file_url, String download_url, boolean downloaded) {
+
+ public FeedImage(long id, String title, String file_url,
+ String download_url, boolean downloaded) {
super(file_url, download_url, downloaded);
this.id = id;
this.title = title;
@@ -26,22 +24,9 @@ public class FeedImage extends FeedFile {
public String getTitle() {
return title;
}
-
public void setTitle(String title) {
this.title = title;
}
- public Bitmap getImageBitmap() {
- if(image_bitmap == null) {
- image_bitmap = BitmapFactory.decodeFile(getFile_url());
- }
- return image_bitmap;
- }
-
-
-
-
-
-
}
diff --git a/src/de/podfetcher/fragment/CoverFragment.java b/src/de/podfetcher/fragment/CoverFragment.java
index 81a42dcec..144147fe4 100644
--- a/src/de/podfetcher/fragment/CoverFragment.java
+++ b/src/de/podfetcher/fragment/CoverFragment.java
@@ -11,6 +11,7 @@ import android.widget.TextView;
import com.actionbarsherlock.app.SherlockFragment;
import de.podfetcher.R;
+import de.podfetcher.asynctask.FeedImageLoader;
import de.podfetcher.feed.Feed;
import de.podfetcher.feed.FeedItem;
import de.podfetcher.feed.FeedManager;
@@ -42,7 +43,7 @@ public class CoverFragment extends SherlockFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
-
+
FeedManager manager = FeedManager.getInstance();
FeedItem item = null;
Bundle args = getArguments();
@@ -68,7 +69,7 @@ public class CoverFragment extends SherlockFragment {
imgvCover = (ImageView) root.findViewById(R.id.imgvCover);
return root;
}
-
+
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
@@ -80,8 +81,8 @@ public class CoverFragment extends SherlockFragment {
}
private void loadMediaInfo() {
- imgvCover.setImageBitmap(media.getItem().getFeed().getImage()
- .getImageBitmap());
+ FeedImageLoader.getInstance().loadBitmap(
+ media.getItem().getFeed().getImage(), imgvCover);
txtvTitle.setText(media.getItem().getTitle());
txtvFeed.setText(media.getItem().getFeed().getTitle());
}