summaryrefslogtreecommitdiff
path: root/src/de/danoeh
diff options
context:
space:
mode:
authordaniel oeh <daniel.oeh@gmail.com>2013-08-22 15:11:37 +0200
committerdaniel oeh <daniel.oeh@gmail.com>2013-08-22 15:11:37 +0200
commit1376b5284849e198f2a2c8346d681d49d30a4234 (patch)
treef5670b1fdda7d7b1b70cf989579472689cc29367 /src/de/danoeh
parent1c8dc43a7f4db4141480423b561b0824828779f5 (diff)
downloadAntennaPod-1376b5284849e198f2a2c8346d681d49d30a4234.zip
Improved AddFeedActivity layout, added gpodder.net toplist fragment
Diffstat (limited to 'src/de/danoeh')
-rw-r--r--src/de/danoeh/antennapod/activity/AddFeedActivity.java10
-rw-r--r--src/de/danoeh/antennapod/activity/gpoddernet/GpodnetMainActivity.java25
-rw-r--r--src/de/danoeh/antennapod/adapter/gpodnet/PodcastListAdapter.java63
-rw-r--r--src/de/danoeh/antennapod/asynctask/ImageDiskCache.java54
-rw-r--r--src/de/danoeh/antennapod/fragment/gpodnet/PodcastListFragment.java109
-rw-r--r--src/de/danoeh/antennapod/fragment/gpodnet/PodcastTopListFragment.java27
6 files changed, 265 insertions, 23 deletions
diff --git a/src/de/danoeh/antennapod/activity/AddFeedActivity.java b/src/de/danoeh/antennapod/activity/AddFeedActivity.java
index 4085fc8d2..ad1adfa6b 100644
--- a/src/de/danoeh/antennapod/activity/AddFeedActivity.java
+++ b/src/de/danoeh/antennapod/activity/AddFeedActivity.java
@@ -5,6 +5,7 @@ import java.util.Date;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
+import de.danoeh.antennapod.activity.gpoddernet.GpodnetMainActivity;
import org.apache.commons.lang3.StringUtils;
import android.app.AlertDialog;
@@ -37,6 +38,7 @@ public class AddFeedActivity extends ActionBarActivity {
private EditText etxtFeedurl;
private Button butBrowseMiroGuide;
+ private Button butBrowserGpoddernet;
private Button butOpmlImport;
private Button butConfirm;
private Button butCancel;
@@ -63,6 +65,7 @@ public class AddFeedActivity extends ActionBarActivity {
}
butBrowseMiroGuide = (Button) findViewById(R.id.butBrowseMiroguide);
+ butBrowserGpoddernet = (Button) findViewById(R.id.butBrowseGpoddernet);
butOpmlImport = (Button) findViewById(R.id.butOpmlImport);
butConfirm = (Button) findViewById(R.id.butConfirm);
butCancel = (Button) findViewById(R.id.butCancel);
@@ -75,6 +78,13 @@ public class AddFeedActivity extends ActionBarActivity {
MiroGuideMainActivity.class));
}
});
+ butBrowserGpoddernet.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ startActivity(new Intent(AddFeedActivity.this,
+ GpodnetMainActivity.class));
+ }
+ });
butOpmlImport.setOnClickListener(new OnClickListener() {
diff --git a/src/de/danoeh/antennapod/activity/gpoddernet/GpodnetMainActivity.java b/src/de/danoeh/antennapod/activity/gpoddernet/GpodnetMainActivity.java
new file mode 100644
index 000000000..316ea2e88
--- /dev/null
+++ b/src/de/danoeh/antennapod/activity/gpoddernet/GpodnetMainActivity.java
@@ -0,0 +1,25 @@
+package de.danoeh.antennapod.activity.gpoddernet;
+
+import android.os.Bundle;
+import android.support.v4.app.FragmentTransaction;
+import android.support.v7.app.ActionBarActivity;
+import de.danoeh.antennapod.R;
+import de.danoeh.antennapod.fragment.gpodnet.PodcastTopListFragment;
+
+/**
+ * Created by daniel on 22.08.13.
+ */
+public class GpodnetMainActivity extends ActionBarActivity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ setContentView(R.layout.gpodnet_main);
+ FragmentTransaction transaction = getSupportFragmentManager()
+ .beginTransaction();
+ PodcastTopListFragment topListFragment = new PodcastTopListFragment();
+ transaction.replace(R.id.toplist_fragment, topListFragment);
+ transaction.commit();
+ }
+}
diff --git a/src/de/danoeh/antennapod/adapter/gpodnet/PodcastListAdapter.java b/src/de/danoeh/antennapod/adapter/gpodnet/PodcastListAdapter.java
new file mode 100644
index 000000000..795b17917
--- /dev/null
+++ b/src/de/danoeh/antennapod/adapter/gpodnet/PodcastListAdapter.java
@@ -0,0 +1,63 @@
+package de.danoeh.antennapod.adapter.gpodnet;
+
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ArrayAdapter;
+import android.widget.ImageView;
+import android.widget.TextView;
+import de.danoeh.antennapod.R;
+import de.danoeh.antennapod.asynctask.ImageDiskCache;
+import de.danoeh.antennapod.gpoddernet.model.GpodnetPodcast;
+
+import java.util.List;
+
+/**
+ * Adapter for displaying a list of GPodnetPodcast-Objects.
+ */
+public class PodcastListAdapter extends ArrayAdapter<GpodnetPodcast> {
+ private final ImageDiskCache diskCache;
+ private final int thumbnailLength;
+
+ public PodcastListAdapter(Context context, int resource, List<GpodnetPodcast> objects) {
+ super(context, resource, objects);
+ diskCache = ImageDiskCache.getDefaultInstance();
+ thumbnailLength = (int) context.getResources().getDimension(R.dimen.thumbnail_length);
+ }
+
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ Holder holder;
+
+ GpodnetPodcast podcast = getItem(position);
+
+ // Inflate Layout
+ if (convertView == null) {
+ holder = new Holder();
+ LayoutInflater inflater = (LayoutInflater) getContext()
+ .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+
+ convertView = inflater.inflate(R.layout.gpodnet_podcast_listitem, null);
+ holder.title = (TextView) convertView.findViewById(R.id.txtvTitle);
+ holder.description = (TextView) convertView.findViewById(R.id.txtvDescription);
+ holder.image = (ImageView) convertView.findViewById(R.id.imgvCover);
+
+ convertView.setTag(holder);
+ } else {
+ holder = (Holder) convertView.getTag();
+ }
+
+ holder.title.setText(podcast.getTitle());
+ holder.description.setText(podcast.getDescription());
+ diskCache.loadThumbnailBitmap(podcast.getLogoUrl(), holder.image, thumbnailLength);
+
+ return convertView;
+ }
+
+ static class Holder {
+ TextView title;
+ TextView description;
+ ImageView image;
+ }
+}
diff --git a/src/de/danoeh/antennapod/asynctask/ImageDiskCache.java b/src/de/danoeh/antennapod/asynctask/ImageDiskCache.java
index 938f5d968..e0675982f 100644
--- a/src/de/danoeh/antennapod/asynctask/ImageDiskCache.java
+++ b/src/de/danoeh/antennapod/asynctask/ImageDiskCache.java
@@ -5,6 +5,7 @@ import android.util.Pair;
import android.widget.ImageView;
import de.danoeh.antennapod.AppConfig;
import de.danoeh.antennapod.PodcastApp;
+import de.danoeh.antennapod.R;
import org.apache.commons.io.IOUtils;
import java.io.*;
@@ -59,7 +60,6 @@ public class ImageDiskCache {
/**
* Filename - cache object mapping
*/
- private static final int KEY_IMAGE_DISK_CACHE = 2;
private static final String CACHE_FILE_NAME = "cachefile";
private ExecutorService executor;
private ConcurrentHashMap<String, DiskCacheObject> diskCache;
@@ -79,7 +79,8 @@ public class ImageDiskCache {
}
private synchronized void initCacheFolder() {
- if (diskCache != null) {
+ if (diskCache == null) {
+ if (AppConfig.DEBUG) Log.d(TAG, "Initializing cache folder");
File cacheFile = new File(cacheFolder, CACHE_FILE_NAME);
if (cacheFile.exists()) {
try {
@@ -178,21 +179,21 @@ public class ImageDiskCache {
* be loaded from the disk. Otherwise, the image will be downloaded first.
* The image will be stored in the thumbnail cache.
*/
- public synchronized void loadThumbnailBitmap(final String url, final ImageView target) {
+ public void loadThumbnailBitmap(final String url, final ImageView target, final int length) {
final ImageLoader il = ImageLoader.getInstance();
if (diskCache != null) {
DiskCacheObject dco = getFromCacheIfAvailable(url);
if (dco != null) {
- il.loadThumbnailBitmap(dco.loadImage(), target);
+ il.loadThumbnailBitmap(dco.loadImage(), target, length);
return;
}
}
- target.setTag(KEY_IMAGE_DISK_CACHE, url);
+ target.setTag(R.id.image_disk_cache_key, url);
executor.submit(new ImageDownloader(url) {
@Override
protected void onImageLoaded(DiskCacheObject diskCacheObject) {
- if (target.getTag(KEY_IMAGE_DISK_CACHE) == url) {
- il.loadThumbnailBitmap(diskCacheObject.loadImage(), target);
+ if (target.getTag(R.id.image_disk_cache_key) == url) {
+ il.loadThumbnailBitmap(diskCacheObject.loadImage(), target, length);
}
}
});
@@ -204,21 +205,21 @@ public class ImageDiskCache {
* be loaded from the disk. Otherwise, the image will be downloaded first.
* The image will be stored in the cover cache.
*/
- public synchronized void loadCoverBitmap(final String url, final ImageView target) {
+ public void loadCoverBitmap(final String url, final ImageView target, final int length) {
final ImageLoader il = ImageLoader.getInstance();
if (diskCache != null) {
DiskCacheObject dco = getFromCacheIfAvailable(url);
if (dco != null) {
- il.loadThumbnailBitmap(dco.loadImage(), target);
+ il.loadThumbnailBitmap(dco.loadImage(), target, length);
return;
}
}
- target.setTag(KEY_IMAGE_DISK_CACHE, url);
+ target.setTag(R.id.image_disk_cache_key, url);
executor.submit(new ImageDownloader(url) {
@Override
protected void onImageLoaded(DiskCacheObject diskCacheObject) {
- if (target.getTag(KEY_IMAGE_DISK_CACHE) == url) {
- il.loadCoverBitmap(diskCacheObject.loadImage(), target);
+ if (target.getTag(R.id.image_disk_cache_key) == url) {
+ il.loadCoverBitmap(diskCacheObject.loadImage(), target, length);
}
}
});
@@ -234,6 +235,20 @@ public class ImageDiskCache {
if (cacheSize > maxCacheSize) {
cleanup();
}
+ saveCacheInfoFile();
+ }
+
+ private synchronized void saveCacheInfoFile() {
+ OutputStream out = null;
+ try {
+ out = new BufferedOutputStream(new FileOutputStream(new File(cacheFolder, CACHE_FILE_NAME)));
+ ObjectOutputStream objOut = new ObjectOutputStream(out);
+ objOut.writeObject(diskCache);
+ } catch (IOException e) {
+ e.printStackTrace();
+ } finally {
+ IOUtils.closeQuietly(out);
+ }
}
private synchronized DiskCacheObject getFromCacheIfAvailable(String key) {
@@ -275,6 +290,7 @@ public class ImageDiskCache {
final DiskCacheObject dco = new DiskCacheObject(newFile.getAbsolutePath(), size);
addToDiskCache(downloadUrl, dco);
+ if (AppConfig.DEBUG) Log.d(TAG, "Image was downloaded");
onImageLoaded(dco);
} catch (MalformedURLException e) {
e.printStackTrace();
@@ -287,7 +303,7 @@ public class ImageDiskCache {
}
}
- private static class DiskCacheObject {
+ private static class DiskCacheObject implements Serializable{
private final String fileUrl;
/**
@@ -311,7 +327,6 @@ public class ImageDiskCache {
public ImageLoader.ImageWorkerTaskResource loadImage() {
return new ImageLoader.ImageWorkerTaskResource() {
- FileInputStream in = null;
@Override
public InputStream openImageInputStream() {
@@ -325,15 +340,8 @@ public class ImageDiskCache {
@Override
public InputStream reopenImageInputStream(InputStream input) {
- if (in != null) {
- try {
- in.close();
- return openImageInputStream();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- return null;
+ IOUtils.closeQuietly(input);
+ return openImageInputStream();
}
@Override
diff --git a/src/de/danoeh/antennapod/fragment/gpodnet/PodcastListFragment.java b/src/de/danoeh/antennapod/fragment/gpodnet/PodcastListFragment.java
new file mode 100644
index 000000000..ba74d9d03
--- /dev/null
+++ b/src/de/danoeh/antennapod/fragment/gpodnet/PodcastListFragment.java
@@ -0,0 +1,109 @@
+package de.danoeh.antennapod.fragment.gpodnet;
+
+import android.content.Context;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.GridView;
+import android.widget.ProgressBar;
+import android.widget.TextView;
+import de.danoeh.antennapod.R;
+import de.danoeh.antennapod.adapter.gpodnet.PodcastListAdapter;
+import de.danoeh.antennapod.gpoddernet.GpodnetService;
+import de.danoeh.antennapod.gpoddernet.GpodnetServiceException;
+import de.danoeh.antennapod.gpoddernet.model.GpodnetPodcast;
+
+import java.util.List;
+
+/**
+ * Displays a list of GPodnetPodcast-Objects in a GridView
+ */
+public abstract class PodcastListFragment extends Fragment {
+ private static final String TAG = "PodcastListFragment";
+
+ private GridView gridView;
+ private ProgressBar progressBar;
+ private TextView txtvError;
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ setRetainInstance(true);
+ View root = inflater.inflate(R.layout.gpodnet_podcast_list, container, false);
+
+ gridView = (GridView) root.findViewById(R.id.gridView);
+ progressBar = (ProgressBar) root.findViewById(R.id.progressBar);
+ txtvError = (TextView) root.findViewById(R.id.txtvError);
+
+ gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+ @Override
+ public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+ onPodcastSelected((GpodnetPodcast) gridView.getAdapter().getItem(position));
+ }
+ });
+
+ loadData();
+ return root;
+ }
+
+ protected abstract void onPodcastSelected(GpodnetPodcast selection);
+
+ protected abstract List<GpodnetPodcast> loadPodcastData(GpodnetService service) throws GpodnetServiceException;
+
+ private void loadData() {
+ AsyncTask<Void, Void, List<GpodnetPodcast>> loaderTask = new AsyncTask<Void, Void, List<GpodnetPodcast>>() {
+ volatile Exception exception = null;
+
+ @Override
+ protected List<GpodnetPodcast> doInBackground(Void... params) {
+ GpodnetService service = null;
+ try {
+ service = new GpodnetService();
+ return loadPodcastData(service);
+ } catch (GpodnetServiceException e) {
+ exception = e;
+ e.printStackTrace();
+ return null;
+ } finally {
+ if (service != null) {
+ service.shutdown();
+ }
+ }
+ }
+
+ @Override
+ protected void onPostExecute(List<GpodnetPodcast> gpodnetPodcasts) {
+ super.onPostExecute(gpodnetPodcasts);
+ final Context context = getActivity();
+ if (context != null && gpodnetPodcasts != null) {
+ PodcastListAdapter listAdapter = new PodcastListAdapter(context, 0, gpodnetPodcasts);
+ gridView.setAdapter(listAdapter);
+ listAdapter.notifyDataSetChanged();
+
+ progressBar.setVisibility(View.GONE);
+ gridView.setVisibility(View.VISIBLE);
+ } else if (context != null) {
+ gridView.setVisibility(View.GONE);
+ progressBar.setVisibility(View.GONE);
+ txtvError.setText(getString(R.string.error_msg_prefix) + exception.getMessage());
+ }
+ }
+
+ @Override
+ protected void onPreExecute() {
+ super.onPreExecute();
+ // gridView.setVisibility(View.GONE);
+ progressBar.setVisibility(View.VISIBLE);
+ }
+ };
+
+ if (android.os.Build.VERSION.SDK_INT > android.os.Build.VERSION_CODES.GINGERBREAD_MR1) {
+ loaderTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
+ } else {
+ loaderTask.execute();
+ }
+ }
+}
diff --git a/src/de/danoeh/antennapod/fragment/gpodnet/PodcastTopListFragment.java b/src/de/danoeh/antennapod/fragment/gpodnet/PodcastTopListFragment.java
new file mode 100644
index 000000000..4e7e42aa3
--- /dev/null
+++ b/src/de/danoeh/antennapod/fragment/gpodnet/PodcastTopListFragment.java
@@ -0,0 +1,27 @@
+package de.danoeh.antennapod.fragment.gpodnet;
+
+import android.util.Log;
+import de.danoeh.antennapod.AppConfig;
+import de.danoeh.antennapod.gpoddernet.GpodnetService;
+import de.danoeh.antennapod.gpoddernet.GpodnetServiceException;
+import de.danoeh.antennapod.gpoddernet.model.GpodnetPodcast;
+
+import java.util.List;
+
+/**
+ *
+ */
+public class PodcastTopListFragment extends PodcastListFragment {
+ private static final String TAG = "PodcastTopListFragment";
+ private static final int PODCAST_COUNT = 50;
+
+ @Override
+ protected void onPodcastSelected(GpodnetPodcast selection) {
+ if (AppConfig.DEBUG) Log.d(TAG, "Selected: " + selection.getTitle());
+ }
+
+ @Override
+ protected List<GpodnetPodcast> loadPodcastData(GpodnetService service) throws GpodnetServiceException {
+ return service.getPodcastToplist(PODCAST_COUNT);
+ }
+}