summaryrefslogtreecommitdiff
path: root/src/de
diff options
context:
space:
mode:
authordaniel oeh <daniel.oeh@gmail.com>2013-06-01 18:29:04 +0200
committerdaniel oeh <daniel.oeh@gmail.com>2013-06-01 18:29:04 +0200
commit71a47c0a5bf99a734081d217eb3e14d75f017a7a (patch)
tree902cbb139b58e4a0f331ed2ab6e3664c6b4d76c0 /src/de
parentb83656049d0453012d29eb67f74a6352ce246689 (diff)
downloadAntennaPod-71a47c0a5bf99a734081d217eb3e14d75f017a7a.zip
Ported several classes from FeedManager to DB*-classes
Diffstat (limited to 'src/de')
-rw-r--r--src/de/danoeh/antennapod/activity/DownloadLogActivity.java53
-rw-r--r--src/de/danoeh/antennapod/activity/FeedInfoActivity.java93
-rw-r--r--src/de/danoeh/antennapod/activity/FeedItemlistActivity.java91
-rw-r--r--src/de/danoeh/antennapod/activity/ItemviewActivity.java102
-rw-r--r--src/de/danoeh/antennapod/activity/MediaplayerActivity.java4
-rw-r--r--src/de/danoeh/antennapod/activity/OrganizeQueueActivity.java94
-rw-r--r--src/de/danoeh/antennapod/activity/PlaybackHistoryActivity.java3
-rw-r--r--src/de/danoeh/antennapod/adapter/DownloadLogAdapter.java16
-rw-r--r--src/de/danoeh/antennapod/adapter/ExternalEpisodesListAdapter.java31
-rw-r--r--src/de/danoeh/antennapod/adapter/FeedlistAdapter.java22
-rw-r--r--src/de/danoeh/antennapod/adapter/InternalFeedItemlistAdapter.java24
-rw-r--r--src/de/danoeh/antennapod/asynctask/FeedRemover.java15
-rw-r--r--src/de/danoeh/antennapod/feed/FeedManager.java2
-rw-r--r--src/de/danoeh/antennapod/fragment/EpisodesFragment.java87
-rw-r--r--src/de/danoeh/antennapod/fragment/FeedlistFragment.java72
-rw-r--r--src/de/danoeh/antennapod/fragment/ItemlistFragment.java113
-rw-r--r--src/de/danoeh/antennapod/fragment/PlaybackHistoryFragment.java90
-rw-r--r--src/de/danoeh/antennapod/storage/DBReader.java41
-rw-r--r--src/de/danoeh/antennapod/storage/DBWriter.java7
-rw-r--r--src/de/danoeh/antennapod/storage/DownloadRequester.java2
-rw-r--r--src/de/danoeh/antennapod/storage/PodDBAdapter.java177
21 files changed, 810 insertions, 329 deletions
diff --git a/src/de/danoeh/antennapod/activity/DownloadLogActivity.java b/src/de/danoeh/antennapod/activity/DownloadLogActivity.java
index 232a7ba1d..af2cdb65a 100644
--- a/src/de/danoeh/antennapod/activity/DownloadLogActivity.java
+++ b/src/de/danoeh/antennapod/activity/DownloadLogActivity.java
@@ -1,15 +1,20 @@
package de.danoeh.antennapod.activity;
+import android.os.AsyncTask;
import android.os.Bundle;
+import android.util.Log;
import com.actionbarsherlock.app.SherlockListActivity;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;
import de.danoeh.antennapod.adapter.DownloadLogAdapter;
import de.danoeh.antennapod.feed.EventDistributor;
-import de.danoeh.antennapod.feed.FeedManager;
import de.danoeh.antennapod.preferences.UserPreferences;
+import de.danoeh.antennapod.service.download.DownloadStatus;
+import de.danoeh.antennapod.storage.DBReader;
+
+import java.util.List;
/**
* Displays completed and failed downloads in a list. The data comes from the
@@ -18,18 +23,18 @@ import de.danoeh.antennapod.preferences.UserPreferences;
public class DownloadLogActivity extends SherlockListActivity {
private static final String TAG = "DownloadLogActivity";
- DownloadLogAdapter dla;
- FeedManager manager;
+ private List<DownloadStatus> downloadLog;
+ private DownloadLogAdapter dla;
@Override
protected void onCreate(Bundle savedInstanceState) {
setTheme(UserPreferences.getTheme());
super.onCreate(savedInstanceState);
- manager = FeedManager.getInstance();
- dla = new DownloadLogAdapter(this);
+ dla = new DownloadLogAdapter(this, itemAccess);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
setListAdapter(dla);
+ loadData();
}
@Override
@@ -62,12 +67,48 @@ public class DownloadLogActivity extends SherlockListActivity {
return true;
}
+ private void loadData() {
+ AsyncTask<Void, Void, List<DownloadStatus>> loadTask = new AsyncTask<Void, Void, List<DownloadStatus>>() {
+ @Override
+ protected List<DownloadStatus> doInBackground(Void... voids) {
+ return DBReader.getDownloadLog(DownloadLogActivity.this);
+ }
+
+ @Override
+ protected void onPostExecute(List<DownloadStatus> downloadStatuses) {
+ super.onPostExecute(downloadStatuses);
+ if (downloadStatuses != null) {
+ downloadLog = downloadStatuses;
+ if (dla != null) {
+ dla.notifyDataSetChanged();
+ }
+ } else {
+ Log.e(TAG, "Could not load download log");
+ }
+ }
+ };
+ loadTask.execute();
+ }
+
+ private DownloadLogAdapter.ItemAccess itemAccess = new DownloadLogAdapter.ItemAccess() {
+
+ @Override
+ public int getCount() {
+ return (downloadLog != null) ? downloadLog.size() : 0;
+ }
+
+ @Override
+ public DownloadStatus getItem(int position) {
+ return (downloadLog != null) ? downloadLog.get(position) : null;
+ }
+ };
+
private EventDistributor.EventListener contentUpdate = new EventDistributor.EventListener() {
@Override
public void update(EventDistributor eventDistributor, Integer arg) {
if ((arg & EventDistributor.DOWNLOADLOG_UPDATE) != 0) {
- dla.notifyDataSetChanged();
+ loadData();
}
}
};
diff --git a/src/de/danoeh/antennapod/activity/FeedInfoActivity.java b/src/de/danoeh/antennapod/activity/FeedInfoActivity.java
index c57a5794b..58fa78546 100644
--- a/src/de/danoeh/antennapod/activity/FeedInfoActivity.java
+++ b/src/de/danoeh/antennapod/activity/FeedInfoActivity.java
@@ -1,5 +1,6 @@
package de.danoeh.antennapod.activity;
+import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.widget.ImageView;
@@ -15,8 +16,8 @@ import de.danoeh.antennapod.R;
import de.danoeh.antennapod.asynctask.ImageLoader;
import de.danoeh.antennapod.dialog.DownloadRequestErrorDialogCreator;
import de.danoeh.antennapod.feed.Feed;
-import de.danoeh.antennapod.feed.FeedManager;
import de.danoeh.antennapod.preferences.UserPreferences;
+import de.danoeh.antennapod.storage.DBReader;
import de.danoeh.antennapod.storage.DownloadRequestException;
import de.danoeh.antennapod.util.LangUtils;
import de.danoeh.antennapod.util.menuhandler.FeedMenuHandler;
@@ -42,47 +43,66 @@ public class FeedInfoActivity extends SherlockActivity {
setContentView(R.layout.feedinfo);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
long feedId = getIntent().getLongExtra(EXTRA_FEED_ID, -1);
- FeedManager manager = FeedManager.getInstance();
- feed = manager.getFeed(feedId);
- if (feed != null) {
- if (AppConfig.DEBUG)
- Log.d(TAG, "Language is " + feed.getLanguage());
- if (AppConfig.DEBUG)
- Log.d(TAG, "Author is " + feed.getAuthor());
- imgvCover = (ImageView) findViewById(R.id.imgvCover);
- txtvTitle = (TextView) findViewById(R.id.txtvTitle);
- txtvDescription = (TextView) findViewById(R.id.txtvDescription);
- txtvLanguage = (TextView) findViewById(R.id.txtvLanguage);
- txtvAuthor = (TextView) findViewById(R.id.txtvAuthor);
- imgvCover.post(new Runnable() {
-
- @Override
- public void run() {
- ImageLoader.getInstance().loadThumbnailBitmap(
- feed.getImage(), imgvCover);
- }
- });
+
+ AsyncTask<Long, Void, Feed> loadTask = new AsyncTask<Long, Void, Feed>() {
- txtvTitle.setText(feed.getTitle());
- txtvDescription.setText(feed.getDescription());
- if (feed.getAuthor() != null) {
- txtvAuthor.setText(feed.getAuthor());
- }
- if (feed.getLanguage() != null) {
- txtvLanguage.setText(LangUtils.getLanguageString(feed
- .getLanguage()));
+ @Override
+ protected Feed doInBackground(Long... params) {
+ return DBReader.getFeed(FeedInfoActivity.this, params[0]);
}
- } else {
- Log.e(TAG, "Activity was started with invalid arguments");
- }
+ @Override
+ protected void onPostExecute(Feed result) {
+ super.onPostExecute(result);
+ if (result != null) {
+ feed = result;
+ if (feed != null) {
+ if (AppConfig.DEBUG)
+ Log.d(TAG, "Language is " + feed.getLanguage());
+ if (AppConfig.DEBUG)
+ Log.d(TAG, "Author is " + feed.getAuthor());
+ imgvCover = (ImageView) findViewById(R.id.imgvCover);
+ txtvTitle = (TextView) findViewById(R.id.txtvTitle);
+ txtvDescription = (TextView) findViewById(R.id.txtvDescription);
+ txtvLanguage = (TextView) findViewById(R.id.txtvLanguage);
+ txtvAuthor = (TextView) findViewById(R.id.txtvAuthor);
+ imgvCover.post(new Runnable() {
+
+ @Override
+ public void run() {
+ ImageLoader.getInstance().loadThumbnailBitmap(
+ feed.getImage(), imgvCover);
+ }
+ });
+
+ txtvTitle.setText(feed.getTitle());
+ txtvDescription.setText(feed.getDescription());
+ if (feed.getAuthor() != null) {
+ txtvAuthor.setText(feed.getAuthor());
+ }
+ if (feed.getLanguage() != null) {
+ txtvLanguage.setText(LangUtils
+ .getLanguageString(feed.getLanguage()));
+ }
+ supportInvalidateOptionsMenu();
+ }
+ } else {
+ Log.e(TAG, "Activity was started with invalid arguments");
+ }
+ }
+ };
+ loadTask.execute(feedId);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
- MenuInflater inflater = new MenuInflater(this);
- inflater.inflate(R.menu.feedinfo, menu);
- return true;
+ if (feed != null) {
+ MenuInflater inflater = new MenuInflater(this);
+ inflater.inflate(R.menu.feedinfo, menu);
+ return true;
+ } else {
+ return false;
+ }
}
@Override
@@ -105,7 +125,8 @@ public class FeedInfoActivity extends SherlockActivity {
return FeedMenuHandler.onOptionsItemClicked(this, item, feed);
} catch (DownloadRequestException e) {
e.printStackTrace();
- DownloadRequestErrorDialogCreator.newRequestErrorDialog(this, e.getMessage());
+ DownloadRequestErrorDialogCreator.newRequestErrorDialog(this,
+ e.getMessage());
}
return super.onOptionsItemSelected(item);
}
diff --git a/src/de/danoeh/antennapod/activity/FeedItemlistActivity.java b/src/de/danoeh/antennapod/activity/FeedItemlistActivity.java
index fdca48e8a..f784628d3 100644
--- a/src/de/danoeh/antennapod/activity/FeedItemlistActivity.java
+++ b/src/de/danoeh/antennapod/activity/FeedItemlistActivity.java
@@ -4,6 +4,7 @@ import android.annotation.SuppressLint;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.TypedArray;
+import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
@@ -15,16 +16,17 @@ import com.actionbarsherlock.view.MenuInflater;
import com.actionbarsherlock.view.MenuItem;
import com.actionbarsherlock.view.Window;
+import de.danoeh.antennapod.AppConfig;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.asynctask.FeedRemover;
import de.danoeh.antennapod.dialog.ConfirmationDialog;
import de.danoeh.antennapod.dialog.DownloadRequestErrorDialogCreator;
import de.danoeh.antennapod.feed.Feed;
-import de.danoeh.antennapod.feed.FeedManager;
import de.danoeh.antennapod.fragment.ExternalPlayerFragment;
import de.danoeh.antennapod.fragment.FeedlistFragment;
import de.danoeh.antennapod.fragment.ItemlistFragment;
import de.danoeh.antennapod.preferences.UserPreferences;
+import de.danoeh.antennapod.storage.DBReader;
import de.danoeh.antennapod.storage.DownloadRequestException;
import de.danoeh.antennapod.util.StorageUtils;
import de.danoeh.antennapod.util.menuhandler.FeedMenuHandler;
@@ -33,8 +35,6 @@ import de.danoeh.antennapod.util.menuhandler.FeedMenuHandler;
public class FeedItemlistActivity extends SherlockFragmentActivity {
private static final String TAG = "FeedItemlistActivity";
- private FeedManager manager;
-
/** The feed which the activity displays */
private Feed feed;
private ItemlistFragment filf;
@@ -50,27 +50,52 @@ public class FeedItemlistActivity extends SherlockFragmentActivity {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
setContentView(R.layout.feeditemlist_activity);
- manager = FeedManager.getInstance();
long feedId = getIntent().getLongExtra(
FeedlistFragment.EXTRA_SELECTED_FEED, -1);
- if (feedId == -1)
+ if (feedId == -1) {
Log.e(TAG, "Received invalid feed selection.");
-
- feed = manager.getFeed(feedId);
- setTitle(feed.getTitle());
-
- FragmentManager fragmentManager = getSupportFragmentManager();
- FragmentTransaction fT = fragmentManager.beginTransaction();
-
- filf = ItemlistFragment.newInstance(feed.getId());
- fT.replace(R.id.feeditemlistFragment, filf);
-
- externalPlayerFragment = new ExternalPlayerFragment();
- fT.replace(R.id.playerFragment, externalPlayerFragment);
- fT.commit();
+ } else {
+ loadData(feedId);
+ }
}
+ private void loadData(long id) {
+ AsyncTask<Long, Void, Feed> loadTask = new AsyncTask<Long, Void, Feed>() {
+
+ @Override
+ protected Feed doInBackground(Long... longs) {
+ if (AppConfig.DEBUG)
+ Log.d(TAG, "Loading feed data in background");
+ return DBReader.getFeed(FeedItemlistActivity.this, longs[0]);
+ }
+
+ @Override
+ protected void onPostExecute(Feed result) {
+ super.onPostExecute(result);
+ if (result != null) {
+ if (AppConfig.DEBUG) Log.d(TAG, "Finished loading feed data");
+ feed = result;
+ setTitle(feed.getTitle());
+
+ FragmentManager fragmentManager = getSupportFragmentManager();
+ FragmentTransaction fT = fragmentManager.beginTransaction();
+
+ filf = ItemlistFragment.newInstance(feed.getId());
+ fT.replace(R.id.feeditemlistFragment, filf);
+
+ externalPlayerFragment = new ExternalPlayerFragment();
+ fT.replace(R.id.playerFragment, externalPlayerFragment);
+ fT.commit();
+ supportInvalidateOptionsMenu();
+ } else {
+ Log.e(TAG, "Error: Feed was null");
+ }
+ }
+ };
+ loadTask.execute(id);
+ }
+
@Override
protected void onResume() {
super.onResume();
@@ -79,13 +104,17 @@ public class FeedItemlistActivity extends SherlockFragmentActivity {
@Override
public boolean onCreateOptionsMenu(Menu menu) {
- TypedArray drawables = obtainStyledAttributes(new int[] { R.attr.action_search });
- menu.add(Menu.NONE, R.id.search_item, Menu.NONE, R.string.search_label)
- .setIcon(drawables.getDrawable(0))
- .setShowAsAction(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
- return FeedMenuHandler
- .onCreateOptionsMenu(new MenuInflater(this), menu);
- }
+ if (feed != null) {
+ TypedArray drawables = obtainStyledAttributes(new int[] { R.attr.action_search });
+ menu.add(Menu.NONE, R.id.search_item, Menu.NONE, R.string.search_label)
+ .setIcon(drawables.getDrawable(0))
+ .setShowAsAction(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
+ return FeedMenuHandler
+ .onCreateOptionsMenu(new MenuInflater(this), menu);
+ } else {
+ return false;
+ }
+ }
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
@@ -142,10 +171,14 @@ public class FeedItemlistActivity extends SherlockFragmentActivity {
@Override
public boolean onSearchRequested() {
- Bundle bundle = new Bundle();
- bundle.putLong(SearchActivity.EXTRA_FEED_ID, feed.getId());
- startSearch(null, false, bundle, false);
- return true;
+ if (feed != null) {
+ Bundle bundle = new Bundle();
+ bundle.putLong(SearchActivity.EXTRA_FEED_ID, feed.getId());
+ startSearch(null, false, bundle, false);
+ return true;
+ } else {
+ return false;
+ }
}
}
diff --git a/src/de/danoeh/antennapod/activity/ItemviewActivity.java b/src/de/danoeh/antennapod/activity/ItemviewActivity.java
index 5ead667dc..4568c535a 100644
--- a/src/de/danoeh/antennapod/activity/ItemviewActivity.java
+++ b/src/de/danoeh/antennapod/activity/ItemviewActivity.java
@@ -1,55 +1,56 @@
package de.danoeh.antennapod.activity;
-import java.text.DateFormat;
-
+import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.text.format.DateUtils;
import android.util.Log;
import android.widget.TextView;
-
import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuInflater;
import com.actionbarsherlock.view.MenuItem;
import com.actionbarsherlock.view.Window;
-
import de.danoeh.antennapod.AppConfig;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.dialog.DownloadRequestErrorDialogCreator;
-import de.danoeh.antennapod.feed.Feed;
+import de.danoeh.antennapod.feed.EventDistributor;
import de.danoeh.antennapod.feed.FeedItem;
-import de.danoeh.antennapod.feed.FeedManager;
-import de.danoeh.antennapod.fragment.FeedlistFragment;
import de.danoeh.antennapod.fragment.ItemDescriptionFragment;
import de.danoeh.antennapod.fragment.ItemlistFragment;
import de.danoeh.antennapod.preferences.UserPreferences;
+import de.danoeh.antennapod.storage.DBReader;
import de.danoeh.antennapod.storage.DownloadRequestException;
import de.danoeh.antennapod.util.StorageUtils;
import de.danoeh.antennapod.util.menuhandler.FeedItemMenuHandler;
+import java.text.DateFormat;
+
/** Displays a single FeedItem and provides various actions */
public class ItemviewActivity extends SherlockFragmentActivity {
private static final String TAG = "ItemviewActivity";
- private FeedManager manager;
- private FeedItem item;
+ private static final int EVENTS = EventDistributor.DOWNLOAD_HANDLED | EventDistributor.DOWNLOAD_QUEUED;
- // Widgets
- private TextView txtvTitle;
- private TextView txtvPublished;
+ private FeedItem item;
@Override
public void onCreate(Bundle savedInstanceState) {
setTheme(UserPreferences.getTheme());
super.onCreate(savedInstanceState);
StorageUtils.checkStorageAvailability(this);
- manager = FeedManager.getInstance();
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
getSupportActionBar().setDisplayShowTitleEnabled(false);
- extractFeeditem();
- populateUI();
+ EventDistributor.getInstance().register(contentUpdate);
+
+ long itemId = getIntent().getLongExtra(
+ ItemlistFragment.EXTRA_SELECTED_FEEDITEM, -1);
+ if (itemId == -1) {
+ Log.e(TAG, "Received invalid selection of either feeditem or feed.");
+ } else {
+ loadData(itemId);
+ }
}
@Override
@@ -66,28 +67,38 @@ public class ItemviewActivity extends SherlockFragmentActivity {
Log.d(TAG, "Stopping Activity");
}
- /** Extracts FeedItem object the activity is supposed to display */
- private void extractFeeditem() {
- long itemId = getIntent().getLongExtra(
- ItemlistFragment.EXTRA_SELECTED_FEEDITEM, -1);
- long feedId = getIntent().getLongExtra(
- FeedlistFragment.EXTRA_SELECTED_FEED, -1);
- if (itemId == -1 || feedId == -1) {
- Log.e(TAG, "Received invalid selection of either feeditem or feed.");
- }
- Feed feed = manager.getFeed(feedId);
- item = manager.getFeedItem(itemId, feed);
- if (AppConfig.DEBUG)
- Log.d(TAG, "Title of item is " + item.getTitle());
- if (AppConfig.DEBUG)
- Log.d(TAG, "Title of feed is " + item.getFeed().getTitle());
- }
+ private void loadData(long itemId) {
+ AsyncTask<Long, Void, FeedItem> loadTask = new AsyncTask<Long, Void, FeedItem>() {
+
+ @Override
+ protected FeedItem doInBackground(Long... longs) {
+ return DBReader.getFeedItem(ItemviewActivity.this, longs[0]);
+ }
+
+ @Override
+ protected void onPostExecute(FeedItem feedItem) {
+ super.onPostExecute(feedItem);
+ if (feedItem != null && feedItem.getFeed() != null) {
+ item = feedItem;
+ populateUI();
+ supportInvalidateOptionsMenu();
+ } else {
+ if (feedItem == null) {
+ Log.e(TAG, "Error: FeedItem was null");
+ } else if (feedItem.getFeed() == null) {
+ Log.e(TAG, "Error: Feed was null");
+ }
+ }
+ }
+ };
+ loadTask.execute(itemId);
+ }
private void populateUI() {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
setContentView(R.layout.feeditemview);
- txtvTitle = (TextView) findViewById(R.id.txtvItemname);
- txtvPublished = (TextView) findViewById(R.id.txtvPublished);
+ TextView txtvTitle = (TextView) findViewById(R.id.txtvItemname);
+ TextView txtvPublished = (TextView) findViewById(R.id.txtvPublished);
setTitle(item.getFeed().getTitle());
txtvPublished.setText(DateUtils.formatSameDayTime(item.getPubDate()
@@ -106,9 +117,13 @@ public class ItemviewActivity extends SherlockFragmentActivity {
@Override
public boolean onCreateOptionsMenu(Menu menu) {
- MenuInflater inflater = getSupportMenuInflater();
- inflater.inflate(R.menu.feeditem, menu);
- return true;
+ if (item != null) {
+ MenuInflater inflater = getSupportMenuInflater();
+ inflater.inflate(R.menu.feeditem, menu);
+ return true;
+ } else {
+ return false;
+ }
}
@Override
@@ -143,4 +158,19 @@ public class ItemviewActivity extends SherlockFragmentActivity {
}, item, true);
}
+ private EventDistributor.EventListener contentUpdate = new EventDistributor.EventListener() {
+
+ @Override
+ public void update(EventDistributor eventDistributor, Integer arg) {
+ if ((EVENTS & arg) != 0) {
+ if (AppConfig.DEBUG)
+ Log.d(TAG, "Received contentUpdate Intent.");
+ if (item != null) {
+ loadData(item.getId());
+ }
+ }
+ }
+ };
+
+
}
diff --git a/src/de/danoeh/antennapod/activity/MediaplayerActivity.java b/src/de/danoeh/antennapod/activity/MediaplayerActivity.java
index 16b03809a..59e65bd48 100644
--- a/src/de/danoeh/antennapod/activity/MediaplayerActivity.java
+++ b/src/de/danoeh/antennapod/activity/MediaplayerActivity.java
@@ -21,7 +21,6 @@ import de.danoeh.antennapod.AppConfig;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.asynctask.FlattrClickWorker;
import de.danoeh.antennapod.dialog.TimeDialog;
-import de.danoeh.antennapod.feed.FeedManager;
import de.danoeh.antennapod.preferences.UserPreferences;
import de.danoeh.antennapod.service.PlaybackService;
import de.danoeh.antennapod.util.Converter;
@@ -39,8 +38,6 @@ public abstract class MediaplayerActivity extends SherlockFragmentActivity
implements OnSeekBarChangeListener {
private static final String TAG = "MediaplayerActivity";
- protected FeedManager manager;
-
protected PlaybackController controller;
protected TextView txtvPosition;
@@ -149,7 +146,6 @@ public abstract class MediaplayerActivity extends SherlockFragmentActivity
StorageUtils.checkStorageAvailability(this);
orientation = getResources().getConfiguration().orientation;
- manager = FeedManager.getInstance();
getWindow().setFormat(PixelFormat.TRANSPARENT);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
diff --git a/src/de/danoeh/antennapod/activity/OrganizeQueueActivity.java b/src/de/danoeh/antennapod/activity/OrganizeQueueActivity.java
index 7269f7549..f7e55d06f 100644
--- a/src/de/danoeh/antennapod/activity/OrganizeQueueActivity.java
+++ b/src/de/danoeh/antennapod/activity/OrganizeQueueActivity.java
@@ -1,36 +1,41 @@
package de.danoeh.antennapod.activity;
import android.content.Context;
-import android.content.res.TypedArray;
+import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
+import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
-
import com.actionbarsherlock.app.SherlockListActivity;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;
import com.mobeta.android.dslv.DragSortListView;
-
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.asynctask.ImageLoader;
import de.danoeh.antennapod.feed.EventDistributor;
import de.danoeh.antennapod.feed.FeedItem;
-import de.danoeh.antennapod.feed.FeedManager;
import de.danoeh.antennapod.preferences.UserPreferences;
+import de.danoeh.antennapod.storage.DBReader;
+import de.danoeh.antennapod.storage.DBTasks;
+import de.danoeh.antennapod.storage.DBWriter;
import de.danoeh.antennapod.util.UndoBarController;
+import java.util.List;
+
public class OrganizeQueueActivity extends SherlockListActivity implements
UndoBarController.UndoListener {
private static final String TAG = "OrganizeQueueActivity";
private static final int MENU_ID_ACCEPT = 2;
+ private List<FeedItem> queue;
+
private OrganizeAdapter adapter;
private UndoBarController undoBarController;
@@ -45,13 +50,37 @@ public class OrganizeQueueActivity extends SherlockListActivity implements
listView.setDropListener(dropListener);
listView.setRemoveListener(removeListener);
- adapter = new OrganizeAdapter(this);
- setListAdapter(adapter);
-
+ loadData();
undoBarController = new UndoBarController(findViewById(R.id.undobar),
this);
}
+ private void loadData() {
+ AsyncTask<Void, Void, List<FeedItem>> loadTask = new AsyncTask<Void, Void, List<FeedItem>>() {
+
+ @Override
+ protected List<FeedItem> doInBackground(Void... voids) {
+ return DBReader.getQueue(OrganizeQueueActivity.this);
+ }
+
+ @Override
+ protected void onPostExecute(List<FeedItem> feedItems) {
+ super.onPostExecute(feedItems);
+ if (feedItems != null) {
+ queue = feedItems;
+ if (adapter == null) {
+ adapter = new OrganizeAdapter(OrganizeQueueActivity.this);
+ setListAdapter(adapter);
+ }
+ adapter.notifyDataSetChanged();
+ } else {
+ Log.e(TAG, "Queue was null");
+ }
+ }
+ };
+ loadTask.execute();
+ }
+
@Override
protected void onPause() {
super.onPause();
@@ -61,8 +90,7 @@ public class OrganizeQueueActivity extends SherlockListActivity implements
@Override
protected void onStop() {
super.onStop();
- FeedManager.getInstance().autodownloadUndownloadedItems(
- getApplicationContext());
+ DBTasks.autodownloadUndownloadedItems(getApplicationContext());
}
@Override
@@ -76,9 +104,7 @@ public class OrganizeQueueActivity extends SherlockListActivity implements
@Override
public void update(EventDistributor eventDistributor, Integer arg) {
if (((EventDistributor.QUEUE_UPDATE | EventDistributor.FEED_LIST_UPDATE) & arg) != 0) {
- if (adapter != null) {
- adapter.notifyDataSetChanged();
- }
+ loadData();
}
}
};
@@ -87,9 +113,9 @@ public class OrganizeQueueActivity extends SherlockListActivity implements
@Override
public void drop(int from, int to) {
- FeedManager manager = FeedManager.getInstance();
- manager.moveQueueItem(OrganizeQueueActivity.this, from, to, false);
- adapter.notifyDataSetChanged();
+
+ DBWriter.moveQueueItem(OrganizeQueueActivity.this, from, to, true);
+ //adapter.notifyDataSetChanged();
}
};
@@ -97,9 +123,8 @@ public class OrganizeQueueActivity extends SherlockListActivity implements
@Override
public void remove(int which) {
- FeedManager manager = FeedManager.getInstance();
FeedItem item = (FeedItem) getListAdapter().getItem(which);
- manager.removeQueueItem(OrganizeQueueActivity.this, item, false);
+ DBWriter.removeQueueItem(OrganizeQueueActivity.this, item.getId(), true);
undoBarController.showUndoBar(false,
getString(R.string.removed_from_queue), new UndoToken(item,
which));
@@ -127,22 +152,18 @@ public class OrganizeQueueActivity extends SherlockListActivity implements
public void onUndo(Parcelable token) {
// Perform the undo
UndoToken undoToken = (UndoToken) token;
- FeedItem feedItem = undoToken.getFeedItem();
+ long itemId = undoToken.getFeedItemId();
int position = undoToken.getPosition();
-
- FeedManager manager = FeedManager.getInstance();
- manager.addQueueItemAt(OrganizeQueueActivity.this, feedItem, position,
- false);
+ DBWriter.addQueueItemAt(OrganizeQueueActivity.this, itemId, position, false);
}
private static class OrganizeAdapter extends BaseAdapter {
- private Context context;
- private FeedManager manager = FeedManager.getInstance();
+ private OrganizeQueueActivity organizeQueueActivity;
- public OrganizeAdapter(Context context) {
+ public OrganizeAdapter(OrganizeQueueActivity organizeQueueActivity) {
super();
- this.context = context;
+ this.organizeQueueActivity = organizeQueueActivity;
}
@Override
@@ -152,7 +173,7 @@ public class OrganizeQueueActivity extends SherlockListActivity implements
if (convertView == null) {
holder = new Holder();
- LayoutInflater inflater = (LayoutInflater) context
+ LayoutInflater inflater = (LayoutInflater) organizeQueueActivity
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(
R.layout.organize_queue_listitem, null);
@@ -189,13 +210,20 @@ public class OrganizeQueueActivity extends SherlockListActivity implements
@Override
public int getCount() {
- int queueSize = manager.getQueueSize(true);
- return queueSize;
+ if (organizeQueueActivity.queue != null) {
+ return organizeQueueActivity.queue.size();
+ } else {
+ return 0;
+ }
}
@Override
public FeedItem getItem(int position) {
- return manager.getQueueItemAtIndex(position, true);
+ if (organizeQueueActivity.queue != null) {
+ return organizeQueueActivity.queue.get(position);
+ } else {
+ return null;
+ }
}
@Override
@@ -211,7 +239,6 @@ public class OrganizeQueueActivity extends SherlockListActivity implements
private int position;
public UndoToken(FeedItem item, int position) {
- FeedManager manager = FeedManager.getInstance();
this.itemId = item.getId();
this.feedId = item.getFeed().getId();
this.position = position;
@@ -243,9 +270,8 @@ public class OrganizeQueueActivity extends SherlockListActivity implements
out.writeInt(position);
}
- public FeedItem getFeedItem() {
- FeedManager manager = FeedManager.getInstance();
- return manager.getFeedItem(itemId, feedId);
+ public long getFeedItemId() {
+ return itemId;
}
public int getPosition() {
diff --git a/src/de/danoeh/antennapod/activity/PlaybackHistoryActivity.java b/src/de/danoeh/antennapod/activity/PlaybackHistoryActivity.java
index 1a5a2cac9..9730c805c 100644
--- a/src/de/danoeh/antennapod/activity/PlaybackHistoryActivity.java
+++ b/src/de/danoeh/antennapod/activity/PlaybackHistoryActivity.java
@@ -14,6 +14,7 @@ import de.danoeh.antennapod.R;
import de.danoeh.antennapod.feed.FeedManager;
import de.danoeh.antennapod.fragment.PlaybackHistoryFragment;
import de.danoeh.antennapod.preferences.UserPreferences;
+import de.danoeh.antennapod.storage.DBWriter;
public class PlaybackHistoryActivity extends SherlockFragmentActivity {
private static final String TAG = "PlaybackHistoryActivity";
@@ -36,7 +37,7 @@ public class PlaybackHistoryActivity extends SherlockFragmentActivity {
startActivity(intent);
return true;
case R.id.clear_history_item:
- FeedManager.getInstance().clearPlaybackHistory(this);
+ DBWriter.clearPlaybackHistory(this);
return true;
}
return super.onOptionsItemSelected(item);
diff --git a/src/de/danoeh/antennapod/adapter/DownloadLogAdapter.java b/src/de/danoeh/antennapod/adapter/DownloadLogAdapter.java
index 4005be8ea..5f6a0ea77 100644
--- a/src/de/danoeh/antennapod/adapter/DownloadLogAdapter.java
+++ b/src/de/danoeh/antennapod/adapter/DownloadLogAdapter.java
@@ -10,7 +10,6 @@ import android.widget.TextView;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.feed.Feed;
import de.danoeh.antennapod.feed.FeedImage;
-import de.danoeh.antennapod.feed.FeedManager;
import de.danoeh.antennapod.feed.FeedMedia;
import de.danoeh.antennapod.service.download.DownloadStatus;
import de.danoeh.antennapod.util.DownloadError;
@@ -19,10 +18,12 @@ import de.danoeh.antennapod.util.DownloadError;
public class DownloadLogAdapter extends BaseAdapter {
private Context context;
- private FeedManager manager = FeedManager.getInstance();
- public DownloadLogAdapter(Context context) {
+ private ItemAccess itemAccess;
+
+ public DownloadLogAdapter(Context context, ItemAccess itemAccess) {
super();
+ this.itemAccess = itemAccess;
this.context = context;
}
@@ -92,12 +93,12 @@ public class DownloadLogAdapter extends BaseAdapter {
@Override
public int getCount() {
- return manager.getDownloadLogSize();
+ return itemAccess.getCount();
}
@Override
public DownloadStatus getItem(int position) {
- return manager.getDownloadStatusFromLogAtIndex(position);
+ return itemAccess.getItem(position);
}
@Override
@@ -105,4 +106,9 @@ public class DownloadLogAdapter extends BaseAdapter {
return position;
}
+ public static interface ItemAccess {
+ public int getCount();
+ public DownloadStatus getItem(int position);
+ }
+
}
diff --git a/src/de/danoeh/antennapod/adapter/ExternalEpisodesListAdapter.java b/src/de/danoeh/antennapod/adapter/ExternalEpisodesListAdapter.java
index 916e13469..b3156f765 100644
--- a/src/de/danoeh/antennapod/adapter/ExternalEpisodesListAdapter.java
+++ b/src/de/danoeh/antennapod/adapter/ExternalEpisodesListAdapter.java
@@ -14,7 +14,6 @@ import android.widget.TextView;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.asynctask.ImageLoader;
import de.danoeh.antennapod.feed.FeedItem;
-import de.danoeh.antennapod.feed.FeedManager;
import de.danoeh.antennapod.feed.FeedMedia;
import de.danoeh.antennapod.storage.DownloadRequester;
import de.danoeh.antennapod.util.Converter;
@@ -30,17 +29,18 @@ public class ExternalEpisodesListAdapter extends BaseExpandableListAdapter {
public static final int GROUP_POS_UNREAD = 1;
private Context context;
- private FeedManager manager = FeedManager.getInstance();
+ private ItemAccess itemAccess;
private ActionButtonCallback feedItemActionCallback;
private OnGroupActionClicked groupActionCallback;
public ExternalEpisodesListAdapter(Context context,
ActionButtonCallback callback,
- OnGroupActionClicked groupActionCallback) {
+ OnGroupActionClicked groupActionCallback,
+ ItemAccess itemAccess) {
super();
this.context = context;
-
+ this.itemAccess = itemAccess;
this.feedItemActionCallback = callback;
this.groupActionCallback = groupActionCallback;
}
@@ -53,10 +53,10 @@ public class ExternalEpisodesListAdapter extends BaseExpandableListAdapter {
@Override
public FeedItem getChild(int groupPosition, int childPosition) {
if (groupPosition == GROUP_POS_QUEUE) {
- return manager.getQueueItemAtIndex(childPosition, true);
+ return itemAccess.getQueueItemAt(childPosition);
} else if (groupPosition == GROUP_POS_UNREAD) {
- return manager.getUnreadItemAtIndex(childPosition, true);
- }
+ return itemAccess.getUnreadItemAt(childPosition);
+ }
return null;
}
@@ -200,9 +200,9 @@ public class ExternalEpisodesListAdapter extends BaseExpandableListAdapter {
@Override
public int getChildrenCount(int groupPosition) {
if (groupPosition == GROUP_POS_QUEUE) {
- return manager.getQueueSize(true);
+ return itemAccess.getQueueSize();
} else if (groupPosition == GROUP_POS_UNREAD) {
- return manager.getUnreadItemsSize(true);
+ return itemAccess.getUnreadItemsSize();
}
return 0;
}
@@ -210,7 +210,7 @@ public class ExternalEpisodesListAdapter extends BaseExpandableListAdapter {
@Override
public int getGroupCount() {
// Hide 'unread items' group if empty
- if (manager.getUnreadItemsSize(true) > 0) {
+ if (itemAccess.getUnreadItemsSize() > 0) {
return 2;
} else {
return 1;
@@ -264,8 +264,8 @@ public class ExternalEpisodesListAdapter extends BaseExpandableListAdapter {
@Override
public boolean isEmpty() {
- return manager.getUnreadItemsSize(true) == 0
- && manager.getQueueSize(true) == 0;
+ return itemAccess.getUnreadItemsSize() == 0
+ && itemAccess.getQueueSize() == 0;
}
@Override
@@ -287,4 +287,11 @@ public class ExternalEpisodesListAdapter extends BaseExpandableListAdapter {
public void onClick(long groupId);
}
+ public static interface ItemAccess {
+ public int getQueueSize();
+ public int getUnreadItemsSize();
+ public FeedItem getQueueItemAt(int position);
+ public FeedItem getUnreadItemAt(int position);
+ }
+
}
diff --git a/src/de/danoeh/antennapod/adapter/FeedlistAdapter.java b/src/de/danoeh/antennapod/adapter/FeedlistAdapter.java
index 03b46cce5..aa10ed8e6 100644
--- a/src/de/danoeh/antennapod/adapter/FeedlistAdapter.java
+++ b/src/de/danoeh/antennapod/adapter/FeedlistAdapter.java
@@ -11,7 +11,6 @@ import android.widget.TextView;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.asynctask.ImageLoader;
import de.danoeh.antennapod.feed.Feed;
-import de.danoeh.antennapod.feed.FeedManager;
import de.danoeh.antennapod.storage.DownloadRequester;
import de.danoeh.antennapod.util.ThemeUtils;
@@ -19,15 +18,23 @@ public class FeedlistAdapter extends BaseAdapter {
private static final String TAG = "FeedlistAdapter";
private Context context;
- private FeedManager manager = FeedManager.getInstance();
+ protected ItemAccess itemAccess;
private int selectedItemIndex;
private ImageLoader imageLoader;
public static final int SELECTION_NONE = -1;
- public FeedlistAdapter(Context context) {
+ public FeedlistAdapter(Context context, ItemAccess itemAccess) {
super();
+ if (context == null) {
+ throw new IllegalArgumentException("context must not be null");
+ }
+ if (itemAccess == null) {
+ throw new IllegalArgumentException("itemAccess must not be null");
+ }
+
this.context = context;
+ this.itemAccess = itemAccess;
selectedItemIndex = SELECTION_NONE;
imageLoader = ImageLoader.getInstance();
}
@@ -145,12 +152,12 @@ public class FeedlistAdapter extends BaseAdapter {
@Override
public int getCount() {
- return manager.getFeedsSize();
+ return itemAccess.getCount();
}
@Override
public Feed getItem(int position) {
- return manager.getFeedAtIndex(position);
+ return itemAccess.getItem(position);
}
@Override
@@ -158,4 +165,9 @@ public class FeedlistAdapter extends BaseAdapter {
return position;
}
+ public interface ItemAccess {
+ int getCount();
+
+ Feed getItem(int position);
+ }
}
diff --git a/src/de/danoeh/antennapod/adapter/InternalFeedItemlistAdapter.java b/src/de/danoeh/antennapod/adapter/InternalFeedItemlistAdapter.java
index e5c12f018..e473a6b57 100644
--- a/src/de/danoeh/antennapod/adapter/InternalFeedItemlistAdapter.java
+++ b/src/de/danoeh/antennapod/adapter/InternalFeedItemlistAdapter.java
@@ -14,13 +14,14 @@ import android.widget.ProgressBar;
import android.widget.TextView;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.feed.FeedItem;
-import de.danoeh.antennapod.feed.FeedManager;
import de.danoeh.antennapod.feed.FeedMedia;
import de.danoeh.antennapod.feed.MediaType;
import de.danoeh.antennapod.storage.DownloadRequester;
import de.danoeh.antennapod.util.Converter;
import de.danoeh.antennapod.util.ThemeUtils;
+import java.util.Iterator;
+
/** List adapter for items of feeds that the user has already subscribed to. */
public class InternalFeedItemlistAdapter extends DefaultFeedItemlistAdapter {
@@ -31,7 +32,7 @@ public class InternalFeedItemlistAdapter extends DefaultFeedItemlistAdapter {
public static final int SELECTION_NONE = -1;
public InternalFeedItemlistAdapter(Context context,
- DefaultFeedItemlistAdapter.ItemAccess itemAccess,
+ ItemAccess itemAccess,
ActionButtonCallback callback, boolean showFeedtitle) {
super(context, itemAccess);
this.callback = callback;
@@ -155,7 +156,7 @@ public class InternalFeedItemlistAdapter extends DefaultFeedItemlistAdapter {
}
holder.lenSize.setVisibility(View.VISIBLE);
- if (FeedManager.getInstance().isInQueue(item)) {
+ if (isInQueue(item)) {
holder.inPlaylist.setVisibility(View.VISIBLE);
} else {
holder.inPlaylist.setVisibility(View.GONE);
@@ -204,6 +205,19 @@ public class InternalFeedItemlistAdapter extends DefaultFeedItemlistAdapter {
}
+ private boolean isInQueue(FeedItem item) {
+ Iterator<FeedItem> iter = ((ItemAccess) itemAccess).queueIterator();
+ if (iter != null) {
+ while (iter.hasNext()) {
+ FeedItem current = iter.next();
+ if (current.getId() == item.getId()) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
static class Holder extends DefaultFeedItemlistAdapter.Holder {
TextView feedtitle;
ImageView inPlaylist;
@@ -224,4 +238,8 @@ public class InternalFeedItemlistAdapter extends DefaultFeedItemlistAdapter {
notifyDataSetChanged();
}
+ public static interface ItemAccess extends DefaultFeedItemlistAdapter.ItemAccess {
+ public Iterator<FeedItem> queueIterator();
+ }
+
}
diff --git a/src/de/danoeh/antennapod/asynctask/FeedRemover.java b/src/de/danoeh/antennapod/asynctask/FeedRemover.java
index 829a14602..244312a6e 100644
--- a/src/de/danoeh/antennapod/asynctask/FeedRemover.java
+++ b/src/de/danoeh/antennapod/asynctask/FeedRemover.java
@@ -7,7 +7,9 @@ import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.os.AsyncTask;
import de.danoeh.antennapod.feed.Feed;
-import de.danoeh.antennapod.feed.FeedManager;
+import de.danoeh.antennapod.storage.DBWriter;
+
+import java.util.concurrent.ExecutionException;
/** Removes a feed in the background. */
public class FeedRemover extends AsyncTask<Void, Void, Void> {
@@ -23,9 +25,14 @@ public class FeedRemover extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
- FeedManager manager = FeedManager.getInstance();
- manager.deleteFeed(context, feed);
- return null;
+ try {
+ DBWriter.deleteFeed(context, feed.getId()).get();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ } catch (ExecutionException e) {
+ e.printStackTrace();
+ }
+ return null;
}
@Override
diff --git a/src/de/danoeh/antennapod/feed/FeedManager.java b/src/de/danoeh/antennapod/feed/FeedManager.java
index 915e9a208..f16756617 100644
--- a/src/de/danoeh/antennapod/feed/FeedManager.java
+++ b/src/de/danoeh/antennapod/feed/FeedManager.java
@@ -1448,7 +1448,7 @@ public class FeedManager {
long imageIndex = feedlistCursor
.getLong(PodDBAdapter.KEY_IMAGE_INDEX);
if (imageIndex != 0) {
- // feed.setImage(DBReader.getFeedImage(adapter, imageIndex));
+ feed.setImage(DBReader.getFeedImage(adapter, imageIndex));
feed.getImage().setFeed(feed);
}
feed.file_url = feedlistCursor
diff --git a/src/de/danoeh/antennapod/fragment/EpisodesFragment.java b/src/de/danoeh/antennapod/fragment/EpisodesFragment.java
index 4039235e0..180cb0940 100644
--- a/src/de/danoeh/antennapod/fragment/EpisodesFragment.java
+++ b/src/de/danoeh/antennapod/fragment/EpisodesFragment.java
@@ -1,6 +1,8 @@
package de.danoeh.antennapod.fragment;
+import android.content.Context;
import android.content.Intent;
+import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.ContextMenu;
@@ -25,9 +27,14 @@ import de.danoeh.antennapod.dialog.DownloadRequestErrorDialogCreator;
import de.danoeh.antennapod.feed.EventDistributor;
import de.danoeh.antennapod.feed.FeedItem;
import de.danoeh.antennapod.feed.FeedManager;
+import de.danoeh.antennapod.storage.DBReader;
+import de.danoeh.antennapod.storage.DBTasks;
+import de.danoeh.antennapod.storage.DBWriter;
import de.danoeh.antennapod.storage.DownloadRequestException;
import de.danoeh.antennapod.util.menuhandler.FeedItemMenuHandler;
+import java.util.List;
+
public class EpisodesFragment extends SherlockFragment {
private static final String TAG = "EpisodesFragment";
@@ -40,6 +47,9 @@ public class EpisodesFragment extends SherlockFragment {
private ExpandableListView listView;
private ExternalEpisodesListAdapter adapter;
+ private List<FeedItem> queue;
+ private List<FeedItem> unreadItems;
+
protected FeedItem selectedItem = null;
protected long selectedGroupId = -1;
protected boolean contextMenuClosed = true;
@@ -92,7 +102,7 @@ public class EpisodesFragment extends SherlockFragment {
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
adapter = new ExternalEpisodesListAdapter(getActivity(),
- adapterCallback, groupActionCallback);
+ adapterCallback, groupActionCallback, itemAccess);
listView.setAdapter(adapter);
listView.expandGroup(ExternalEpisodesListAdapter.GROUP_POS_QUEUE);
listView.expandGroup(ExternalEpisodesListAdapter.GROUP_POS_UNREAD);
@@ -117,9 +127,73 @@ public class EpisodesFragment extends SherlockFragment {
return true;
}
});
+ loadData();
registerForContextMenu(listView);
+
}
+ ExternalEpisodesListAdapter.ItemAccess itemAccess = new ExternalEpisodesListAdapter.ItemAccess() {
+
+ @Override
+ public int getQueueSize() {
+ return (queue != null) ? queue.size() : 0;
+ }
+
+ @Override
+ public int getUnreadItemsSize() {
+ return (unreadItems != null) ? unreadItems.size() : 0;
+ }
+
+ @Override
+ public FeedItem getQueueItemAt(int position) {
+ return (queue != null) ? queue.get(position) : null;
+ }
+
+ @Override
+ public FeedItem getUnreadItemAt(int position) {
+ return (unreadItems != null) ? unreadItems.get(position) : null;
+ }
+ };
+
+ private void loadData() {
+ AsyncTask<Void, Void, Void> loadTask = new AsyncTask<Void, Void, Void>() {
+ private volatile List<FeedItem> queueRef;
+ private volatile List<FeedItem> unreadItemsRef;
+
+ @Override
+ protected Void doInBackground(Void... voids) {
+ if (AppConfig.DEBUG) Log.d(TAG, "Starting to load list data");
+ Context context = EpisodesFragment.this.getActivity();
+ if (context != null) {
+ queueRef = DBReader.getQueue(context);
+ unreadItemsRef = DBReader.getUnreadItemsList(context);
+ }
+ return null;
+ }
+
+ @Override
+ protected void onPostExecute(Void aVoid) {
+ super.onPostExecute(aVoid);
+ if (queueRef != null && unreadItemsRef != null) {
+ if (AppConfig.DEBUG) Log.d(TAG, "Done loading list data");
+ queue = queueRef;
+ unreadItems = unreadItemsRef;
+ if (adapter != null) {
+ adapter.notifyDataSetChanged();
+ }
+ } else {
+ if (queueRef == null) {
+ Log.e(TAG, "Could not load queue");
+ }
+ if (unreadItemsRef == null) {
+ Log.e(TAG, "Could not load unread items");
+ }
+ }
+ }
+ };
+ loadTask.execute();
+ }
+
private EventDistributor.EventListener contentUpdate = new EventDistributor.EventListener() {
@Override
@@ -127,7 +201,7 @@ public class EpisodesFragment extends SherlockFragment {
if ((EVENTS & arg) != 0) {
if (AppConfig.DEBUG)
Log.d(TAG, "Received contentUpdate Intent.");
- adapter.notifyDataSetChanged();
+ loadData();
}
}
};
@@ -172,7 +246,6 @@ public class EpisodesFragment extends SherlockFragment {
@Override
public boolean onContextItemSelected(android.view.MenuItem item) {
boolean handled = false;
- FeedManager manager = FeedManager.getInstance();
if (selectedItem != null) {
try {
handled = FeedItemMenuHandler.onMenuItemClicked(
@@ -191,10 +264,10 @@ public class EpisodesFragment extends SherlockFragment {
OrganizeQueueActivity.class));
break;
case R.id.clear_queue_item:
- manager.clearQueue(getActivity());
+ DBWriter.clearQueue(getActivity());
break;
case R.id.download_all_item:
- manager.downloadAllItemsInQueue(getActivity());
+ DBTasks.downloadAllItemsInQueue(getActivity());
break;
default:
handled = false;
@@ -203,10 +276,10 @@ public class EpisodesFragment extends SherlockFragment {
handled = true;
switch (item.getItemId()) {
case R.id.mark_all_read_item:
- manager.markAllItemsRead(getActivity());
+ DBWriter.markAllItemsRead(getActivity());
break;
case R.id.enqueue_all_item:
- manager.enqueueAllNewItems(getActivity());
+ DBTasks.enqueueAllNewItems(getActivity());
break;
default:
handled = false;
diff --git a/src/de/danoeh/antennapod/fragment/FeedlistFragment.java b/src/de/danoeh/antennapod/fragment/FeedlistFragment.java
index c3034c2af..80deee47e 100644
--- a/src/de/danoeh/antennapod/fragment/FeedlistFragment.java
+++ b/src/de/danoeh/antennapod/fragment/FeedlistFragment.java
@@ -1,9 +1,11 @@
package de.danoeh.antennapod.fragment;
+import java.util.List;
+
import android.annotation.SuppressLint;
-import android.app.Activity;
import android.content.DialogInterface;
import android.content.Intent;
+import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
@@ -28,7 +30,7 @@ import de.danoeh.antennapod.dialog.ConfirmationDialog;
import de.danoeh.antennapod.dialog.DownloadRequestErrorDialogCreator;
import de.danoeh.antennapod.feed.EventDistributor;
import de.danoeh.antennapod.feed.Feed;
-import de.danoeh.antennapod.feed.FeedManager;
+import de.danoeh.antennapod.storage.DBReader;
import de.danoeh.antennapod.storage.DownloadRequestException;
import de.danoeh.antennapod.util.menuhandler.FeedMenuHandler;
@@ -41,11 +43,11 @@ public class FeedlistFragment extends SherlockFragment implements
| EventDistributor.DOWNLOAD_QUEUED
| EventDistributor.FEED_LIST_UPDATE
| EventDistributor.UNREAD_ITEMS_UPDATE;
-
+
public static final String EXTRA_SELECTED_FEED = "extra.de.danoeh.antennapod.activity.selected_feed";
- private FeedManager manager;
private FeedlistAdapter fla;
+ private List<Feed> feeds;
private Feed selectedFeed;
private ActionMode mActionMode;
@@ -54,24 +56,57 @@ public class FeedlistFragment extends SherlockFragment implements
private ListView listView;
private TextView txtvEmpty;
- @Override
- public void onAttach(Activity activity) {
- super.onAttach(activity);
- }
+ private FeedlistAdapter.ItemAccess itemAccess = new FeedlistAdapter.ItemAccess() {
- @Override
- public void onDetach() {
- super.onDetach();
- }
+ @Override
+ public Feed getItem(int position) {
+ if (feeds != null) {
+ return feeds.get(position);
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ public int getCount() {
+ if (feeds != null) {
+ return feeds.size();
+ } else {
+ return 0;
+ }
+ }
+ };
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (AppConfig.DEBUG)
Log.d(TAG, "Creating");
- manager = FeedManager.getInstance();
- fla = new FeedlistAdapter(getActivity());
+ fla = new FeedlistAdapter(getActivity(), itemAccess);
+ loadFeeds();
+ }
+ private void loadFeeds() {
+ AsyncTask<Void, Void, List<Feed>> loadTask = new AsyncTask<Void, Void, List<Feed>>() {
+ @Override
+ protected List<Feed> doInBackground(Void... params) {
+ return DBReader.getFeedList(getActivity());
+ }
+
+ @Override
+ protected void onPostExecute(List<Feed> result) {
+ super.onPostExecute(result);
+ if (result != null) {
+ feeds = result;
+ if (fla != null) {
+ fla.notifyDataSetChanged();
+ }
+ } else {
+ Log.e(TAG, "Failed to load feeds");
+ }
+ }
+ };
+ loadTask.execute();
}
@Override
@@ -112,7 +147,6 @@ public class FeedlistFragment extends SherlockFragment implements
if (AppConfig.DEBUG)
Log.d(TAG, "Resuming");
EventDistributor.getInstance().register(contentUpdate);
- fla.notifyDataSetChanged();
}
@Override
@@ -125,13 +159,13 @@ public class FeedlistFragment extends SherlockFragment implements
}
private EventDistributor.EventListener contentUpdate = new EventDistributor.EventListener() {
-
+
@Override
public void update(EventDistributor eventDistributor, Integer arg) {
if ((EVENTS & arg) != 0) {
if (AppConfig.DEBUG)
Log.d(TAG, "Received contentUpdate Intent.");
- fla.notifyDataSetChanged();
+ loadFeeds();
}
}
};
@@ -154,7 +188,7 @@ public class FeedlistFragment extends SherlockFragment implements
try {
if (FeedMenuHandler.onOptionsItemClicked(getSherlockActivity(),
item, selectedFeed)) {
- fla.notifyDataSetChanged();
+ loadFeeds();
} else {
switch (item.getItemId()) {
case R.id.remove_item:
@@ -163,7 +197,7 @@ public class FeedlistFragment extends SherlockFragment implements
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
- fla.notifyDataSetChanged();
+ loadFeeds();
}
};
ConfirmationDialog conDialog = new ConfirmationDialog(
diff --git a/src/de/danoeh/antennapod/fragment/ItemlistFragment.java b/src/de/danoeh/antennapod/fragment/ItemlistFragment.java
index 6265694f6..2f0e90cff 100644
--- a/src/de/danoeh/antennapod/fragment/ItemlistFragment.java
+++ b/src/de/danoeh/antennapod/fragment/ItemlistFragment.java
@@ -1,7 +1,9 @@
package de.danoeh.antennapod.fragment;
import android.annotation.SuppressLint;
+import android.content.Context;
import android.content.Intent;
+import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.ContextMenu;
@@ -18,18 +20,20 @@ import de.danoeh.antennapod.AppConfig;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.ItemviewActivity;
import de.danoeh.antennapod.adapter.ActionButtonCallback;
-import de.danoeh.antennapod.adapter.DefaultFeedItemlistAdapter;
import de.danoeh.antennapod.adapter.InternalFeedItemlistAdapter;
import de.danoeh.antennapod.dialog.DownloadRequestErrorDialogCreator;
import de.danoeh.antennapod.feed.EventDistributor;
import de.danoeh.antennapod.feed.Feed;
import de.danoeh.antennapod.feed.FeedItem;
-import de.danoeh.antennapod.feed.FeedManager;
import de.danoeh.antennapod.service.download.DownloadService;
+import de.danoeh.antennapod.storage.DBReader;
import de.danoeh.antennapod.storage.DownloadRequestException;
import de.danoeh.antennapod.storage.DownloadRequester;
import de.danoeh.antennapod.util.menuhandler.FeedItemMenuHandler;
+import java.util.Iterator;
+import java.util.List;
+
/** Displays a list of FeedItems. */
@SuppressLint("ValidFragment")
public class ItemlistFragment extends SherlockListFragment {
@@ -43,12 +47,10 @@ public class ItemlistFragment extends SherlockListFragment {
public static final String EXTRA_SELECTED_FEEDITEM = "extra.de.danoeh.antennapod.activity.selected_feeditem";
public static final String ARGUMENT_FEED_ID = "argument.de.danoeh.antennapod.feed_id";
protected InternalFeedItemlistAdapter fila;
- protected FeedManager manager = FeedManager.getInstance();
protected DownloadRequester requester = DownloadRequester.getInstance();
- private DefaultFeedItemlistAdapter.ItemAccess itemAccess;
-
private Feed feed;
+ protected List<FeedItem> queue;
protected FeedItem selectedItem = null;
protected boolean contextMenuClosed = true;
@@ -56,10 +58,8 @@ public class ItemlistFragment extends SherlockListFragment {
/** Argument for FeeditemlistAdapter */
protected boolean showFeedtitle;
- public ItemlistFragment(DefaultFeedItemlistAdapter.ItemAccess itemAccess,
- boolean showFeedtitle) {
+ public ItemlistFragment(boolean showFeedtitle) {
super();
- this.itemAccess = itemAccess;
this.showFeedtitle = showFeedtitle;
}
@@ -83,6 +83,30 @@ public class ItemlistFragment extends SherlockListFragment {
return i;
}
+ private InternalFeedItemlistAdapter.ItemAccess itemAccessRef;
+ protected InternalFeedItemlistAdapter.ItemAccess itemAccess() {
+ if (itemAccessRef == null) {
+ itemAccessRef = new InternalFeedItemlistAdapter.ItemAccess() {
+
+ @Override
+ public FeedItem getItem(int position) {
+ return (feed != null) ? feed.getItemAtIndex(true, position) : null;
+ }
+
+ @Override
+ public int getCount() {
+ return (feed != null) ? feed.getNumOfItems(true) : 0;
+ }
+
+ @Override
+ public Iterator<FeedItem> queueIterator() {
+ return (queue != null) ? queue.iterator() : null;
+ }
+ };
+ }
+ return itemAccessRef;
+ }
+
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
@@ -92,27 +116,60 @@ public class ItemlistFragment extends SherlockListFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- if (itemAccess == null) {
- long feedId = getArguments().getLong(ARGUMENT_FEED_ID);
- final Feed feed = FeedManager.getInstance().getFeed(feedId);
- this.feed = feed;
- itemAccess = new DefaultFeedItemlistAdapter.ItemAccess() {
-
- @Override
- public FeedItem getItem(int position) {
- return feed.getItemAtIndex(true, position);
- }
-
- @Override
- public int getCount() {
- return feed.getNumOfItems(true);
- }
- };
- }
+ loadData();
}
+ protected void loadData() {
+ final long feedId;
+ if (feed == null) {
+ feedId = getArguments().getLong(ARGUMENT_FEED_ID);
+ } else {
+ feedId = feed.getId();
+ }
+ AsyncTask<Long, Void, Feed> loadTask = new AsyncTask<Long, Void, Feed>(){
+ private volatile List<FeedItem> queueRef;
+
+ @Override
+ protected Feed doInBackground(Long... longs) {
+ Context context = ItemlistFragment.this.getActivity();
+ if (context != null) {
+ Feed result = DBReader.getFeed(context, longs[0]);
+ if (result != null) {
+ result.setItems(DBReader.getFeedItemList(context, result));
+ queueRef = DBReader.getQueue(context);
+ return result;
+ }
+ }
+ return null;
+ }
+
+ @Override
+ protected void onPostExecute(Feed result) {
+ super.onPostExecute(result);
+ if (result != null && result.getItems() != null) {
+ feed = result;
+ if (queueRef != null) {
+ queue = queueRef;
+ } else {
+ Log.e(TAG, "Could not load queue");
+ }
+ if (fila != null) {
+ fila.notifyDataSetChanged();
+ }
+ } else {
+ if (result == null) {
+ Log.e(TAG, "Could not load feed with id " + feedId);
+ } else if (result.getItems() == null) {
+ Log.e(TAG, "Could not load feed items");
+ }
+ }
+ }
+ };
+ loadTask.execute(feedId);
+ }
+
protected InternalFeedItemlistAdapter createListAdapter() {
- return new InternalFeedItemlistAdapter(getActivity(), itemAccess,
+ return new InternalFeedItemlistAdapter(getActivity(), itemAccess(),
adapterCallback, showFeedtitle);
}
@@ -162,7 +219,9 @@ public class ItemlistFragment extends SherlockListFragment {
if ((EventDistributor.DOWNLOAD_QUEUED & arg) != 0) {
updateProgressBarVisibility();
} else {
- fila.notifyDataSetChanged();
+ if (feed != null) {
+ loadData();
+ }
updateProgressBarVisibility();
}
}
diff --git a/src/de/danoeh/antennapod/fragment/PlaybackHistoryFragment.java b/src/de/danoeh/antennapod/fragment/PlaybackHistoryFragment.java
index b471d5303..2fe43767d 100644
--- a/src/de/danoeh/antennapod/fragment/PlaybackHistoryFragment.java
+++ b/src/de/danoeh/antennapod/fragment/PlaybackHistoryFragment.java
@@ -1,33 +1,53 @@
package de.danoeh.antennapod.fragment;
+import android.content.Context;
+import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import de.danoeh.antennapod.AppConfig;
-import de.danoeh.antennapod.adapter.DefaultFeedItemlistAdapter;
+import de.danoeh.antennapod.adapter.InternalFeedItemlistAdapter;
import de.danoeh.antennapod.feed.EventDistributor;
import de.danoeh.antennapod.feed.FeedItem;
-import de.danoeh.antennapod.feed.FeedManager;
+import de.danoeh.antennapod.storage.DBReader;
+
+import java.util.Iterator;
+import java.util.List;
public class PlaybackHistoryFragment extends ItemlistFragment {
private static final String TAG = "PlaybackHistoryFragment";
+ private List<FeedItem> playbackHistory;
+
public PlaybackHistoryFragment() {
- super(new DefaultFeedItemlistAdapter.ItemAccess() {
+ super(true);
+ }
- @Override
- public FeedItem getItem(int position) {
- return FeedManager.getInstance().getPlaybackHistoryItemIndex(
- position);
- }
+ InternalFeedItemlistAdapter.ItemAccess itemAccessRef;
+ @Override
+ protected InternalFeedItemlistAdapter.ItemAccess itemAccess() {
+ if (itemAccessRef == null) {
+ itemAccessRef = new InternalFeedItemlistAdapter.ItemAccess() {
- @Override
- public int getCount() {
- return FeedManager.getInstance().getPlaybackHistorySize();
- }
- }, true);
- }
+ @Override
+ public FeedItem getItem(int position) {
+ return (playbackHistory != null) ? playbackHistory.get(position) : null;
+ }
- @Override
+ @Override
+ public int getCount() {
+ return (playbackHistory != null) ? playbackHistory.size() : 0;
+ }
+
+ @Override
+ public Iterator<FeedItem> queueIterator() {
+ return (queue != null) ? queue.iterator() : null;
+ }
+ };
+ }
+ return itemAccessRef;
+ }
+
+ @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EventDistributor.getInstance().register(historyUpdate);
@@ -46,10 +66,48 @@ public class PlaybackHistoryFragment extends ItemlistFragment {
if ((EventDistributor.PLAYBACK_HISTORY_UPDATE & arg) != 0) {
if (AppConfig.DEBUG)
Log.d(TAG, "Received content update");
- fila.notifyDataSetChanged();
+ loadData();
}
}
};
+ @Override
+ protected void loadData() {
+ AsyncTask<Void, Void, Void> loadTask = new AsyncTask<Void, Void, Void>() {
+ private volatile List<FeedItem> phRef;
+ private volatile List<FeedItem> queueRef;
+
+ @Override
+ protected Void doInBackground(Void... voids) {
+ Context context = PlaybackHistoryFragment.this.getActivity();
+ if (context != null) {
+ queueRef = DBReader.getQueue(context);
+ phRef = DBReader.getPlaybackHistory(context);
+ }
+ return null;
+ }
+
+ @Override
+ protected void onPostExecute(Void aVoid) {
+ super.onPostExecute(aVoid);
+ if (queueRef != null && phRef != null) {
+ queue = queueRef;
+ playbackHistory = phRef;
+ Log.i(TAG, "Number of items in playback history: " + playbackHistory.size());
+ if (fila != null) {
+ fila.notifyDataSetChanged();
+ }
+ } else {
+ if (queueRef == null) {
+ Log.e(TAG, "Could not load queue");
+ }
+ if (phRef == null) {
+ Log.e(TAG, "Could not load playback history");
+ }
+ }
+ }
+ };
+ loadTask.execute();
+ }
}
diff --git a/src/de/danoeh/antennapod/storage/DBReader.java b/src/de/danoeh/antennapod/storage/DBReader.java
index 5ae47f32b..ab3d6342d 100644
--- a/src/de/danoeh/antennapod/storage/DBReader.java
+++ b/src/de/danoeh/antennapod/storage/DBReader.java
@@ -78,6 +78,9 @@ public final class DBReader {
break;
}
}
+ if (item.getFeed() == null) {
+ Log.w(TAG, "No match found for item with ID " + item.getId() + ". Feed ID was " + item.getFeedId());
+ }
}
}
@@ -107,7 +110,7 @@ public final class DBReader {
private static List<FeedItem> extractItemlistFromCursor(
PodDBAdapter adapter, Cursor itemlistCursor) {
- ArrayList<String> mediaIds = new ArrayList<String>();
+ ArrayList<String> itemIds = new ArrayList<String>();
List<FeedItem> items = new ArrayList<FeedItem>(
itemlistCursor.getCount());
@@ -126,12 +129,8 @@ public final class DBReader {
.getString(PodDBAdapter.IDX_FI_SMALL_PAYMENT_LINK));
item.setFeedId(itemlistCursor
.getLong(PodDBAdapter.IDX_FI_SMALL_FEED));
- long mediaId = itemlistCursor
- .getLong(PodDBAdapter.IDX_FI_SMALL_MEDIA);
- if (mediaId != 0) {
- mediaIds.add(String.valueOf(mediaId));
- item.setMedia(new FeedMedia(mediaId, item));
- }
+ itemIds.add(String.valueOf(item.getId()));
+
item.setRead((itemlistCursor
.getInt(PodDBAdapter.IDX_FI_SMALL_READ) > 0) ? true
: false);
@@ -182,23 +181,23 @@ public final class DBReader {
} while (itemlistCursor.moveToNext());
}
- extractMediafromItemlist(adapter, items, mediaIds);
+ extractMediafromItemlist(adapter, items, itemIds);
Collections.sort(items, new FeedItemPubdateComparator());
return items;
}
private static void extractMediafromItemlist(PodDBAdapter adapter,
- List<FeedItem> items, ArrayList<String> mediaIds) {
+ List<FeedItem> items, ArrayList<String> itemIds) {
List<FeedItem> itemsCopy = new ArrayList<FeedItem>(items);
- Cursor cursor = adapter.getFeedMediaCursor(mediaIds
- .toArray(new String[mediaIds.size()]));
+ Cursor cursor = adapter.getFeedMediaCursor(itemIds
+ .toArray(new String[itemIds.size()]));
if (cursor.moveToFirst()) {
do {
long mediaId = cursor.getLong(PodDBAdapter.KEY_ID_INDEX);
+ long itemId = cursor.getLong(PodDBAdapter.KEY_MEDIA_FEEDITEM_INDEX);
// find matching feed item
- FeedItem item = getMatchingItemForMedia(mediaId, itemsCopy);
- itemsCopy.remove(item);
+ FeedItem item = getMatchingItemForMedia(itemId, itemsCopy);
if (item != null) {
Date playbackCompletionDate = null;
long playbackCompletionTime = cursor
@@ -257,10 +256,10 @@ public final class DBReader {
return feed;
}
- private static FeedItem getMatchingItemForMedia(long mediaId,
+ private static FeedItem getMatchingItemForMedia(long itemId,
List<FeedItem> items) {
for (FeedItem item : items) {
- if (item.getMedia() != null && item.getMedia().getId() == mediaId) {
+ if (item.getId() == itemId) {
return item;
}
}
@@ -355,12 +354,13 @@ public final class DBReader {
Cursor mediaCursor = adapter.getCompletedMediaCursor(PLAYBACK_HISTORY_SIZE);
String[] itemIds = new String[mediaCursor.getCount()];
- for (int i = 0; i < itemIds.length; i++) {
- itemIds[i] = Long.toString(mediaCursor.getLong(PodDBAdapter.KEY_FEEDITEM_INDEX));
+ for (int i = 0; i < itemIds.length && mediaCursor.moveToPosition(i); i++) {
+ itemIds[i] = Long.toString(mediaCursor.getLong(PodDBAdapter.KEY_MEDIA_FEEDITEM_INDEX));
}
mediaCursor.close();
Cursor itemCursor = adapter.getFeedItemCursor(itemIds);
List<FeedItem> items = extractItemlistFromCursor(adapter, itemCursor);
+ loadFeedDataOfFeedItemlist(context, items);
itemCursor.close();
adapter.close();
@@ -417,7 +417,9 @@ public final class DBReader {
if (feedCursor.moveToFirst()) {
feed = extractFeedFromCursorRow(adapter, feedCursor);
feed.setItems(getFeedItemList(context, feed));
- }
+ } else {
+ Log.e(TAG, "getFeed could not find feed with id " + feedId);
+ }
adapter.close();
return feed;
}
@@ -432,6 +434,7 @@ public final class DBReader {
List<FeedItem> list = extractItemlistFromCursor(adapter, itemCursor);
if (list.size() > 0) {
item = list.get(0);
+ loadFeedDataOfFeedItemlist(context, list);
}
}
return item;
@@ -465,7 +468,7 @@ public final class DBReader {
* The id of the object
* @return The found object
* */
- private static FeedImage getFeedImage(PodDBAdapter adapter, final long id) {
+ public static FeedImage getFeedImage(PodDBAdapter adapter, final long id) {
Cursor cursor = adapter.getImageOfFeedCursor(id);
if ((cursor.getCount() == 0) || !cursor.moveToFirst()) {
throw new SQLException("No FeedImage found at index: " + id);
diff --git a/src/de/danoeh/antennapod/storage/DBWriter.java b/src/de/danoeh/antennapod/storage/DBWriter.java
index b5f9acdad..3ff2fddc1 100644
--- a/src/de/danoeh/antennapod/storage/DBWriter.java
+++ b/src/de/danoeh/antennapod/storage/DBWriter.java
@@ -5,6 +5,7 @@ import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
import java.util.concurrent.ThreadFactory;
import android.content.Context;
@@ -88,8 +89,8 @@ public class DBWriter {
});
}
- public static void deleteFeed(final Context context, final long feedId) {
- dbExec.submit(new Runnable() {
+ public static Future<?> deleteFeed(final Context context, final long feedId) {
+ return dbExec.submit(new Runnable() {
@Override
public void run() {
DownloadRequester requester = DownloadRequester.getInstance();
@@ -378,7 +379,7 @@ public class DBWriter {
}
- public void moveQueueItem(final Context context, final int from,
+ public static void moveQueueItem(final Context context, final int from,
final int to, final boolean broadcastUpdate) {
dbExec.submit(new Runnable() {
diff --git a/src/de/danoeh/antennapod/storage/DownloadRequester.java b/src/de/danoeh/antennapod/storage/DownloadRequester.java
index 30abc4491..a27fbf8e4 100644
--- a/src/de/danoeh/antennapod/storage/DownloadRequester.java
+++ b/src/de/danoeh/antennapod/storage/DownloadRequester.java
@@ -86,7 +86,7 @@ public class DownloadRequester {
"Requesting download of url " + item.getDownload_url());
item.setDownload_url(URLChecker.prepareURL(item.getDownload_url()));
- DownloadRequest request = new DownloadRequest(item.getFile_url(),
+ DownloadRequest request = new DownloadRequest(dest.toString(),
item.getDownload_url(), item.getHumanReadableIdentifier(),
item.getId(), item.getTypeAsInt());
diff --git a/src/de/danoeh/antennapod/storage/PodDBAdapter.java b/src/de/danoeh/antennapod/storage/PodDBAdapter.java
index 6ff22cb55..7c28ade14 100644
--- a/src/de/danoeh/antennapod/storage/PodDBAdapter.java
+++ b/src/de/danoeh/antennapod/storage/PodDBAdapter.java
@@ -22,12 +22,14 @@ import de.danoeh.antennapod.feed.FeedItem;
import de.danoeh.antennapod.feed.FeedMedia;
import de.danoeh.antennapod.service.download.DownloadStatus;
+// TODO Remove media column from feeditem table
+
/**
* Implements methods for accessing the database
* */
public class PodDBAdapter {
private static final String TAG = "PodDBAdapter";
- private static final int DATABASE_VERSION = 8;
+ private static final int DATABASE_VERSION = 9;
private static final String DATABASE_NAME = "Antennapod.db";
/** Maximum number of arguments for IN-operator. */
@@ -64,6 +66,7 @@ public class PodDBAdapter {
public static final int KEY_SIZE_INDEX = 6;
public static final int KEY_MIME_TYPE_INDEX = 7;
public static final int KEY_PLAYBACK_COMPLETION_DATE_INDEX = 8;
+ public static final int KEY_MEDIA_FEEDITEM_INDEX = 9;
// --------- Download log indices
public static final int KEY_FEEDFILE_INDEX = 1;
public static final int KEY_FEEDFILETYPE_INDEX = 2;
@@ -160,7 +163,8 @@ public class PodDBAdapter {
+ " INTEGER," + KEY_FILE_URL + " TEXT," + KEY_DOWNLOAD_URL
+ " TEXT," + KEY_DOWNLOADED + " INTEGER," + KEY_POSITION
+ " INTEGER," + KEY_SIZE + " INTEGER," + KEY_MIME_TYPE + " TEXT,"
- + KEY_PLAYBACK_COMPLETION_DATE + " INTEGER)";
+ + KEY_PLAYBACK_COMPLETION_DATE + " INTEGER,"
+ + KEY_FEEDITEM + " INTEGER)";
private static final String CREATE_TABLE_DOWNLOAD_LOG = "CREATE TABLE "
+ TABLE_NAME_DOWNLOAD_LOG + " (" + TABLE_PRIMARY_KEY + KEY_FEEDFILE
@@ -186,9 +190,16 @@ public class PodDBAdapter {
* Select all columns from the feeditems-table except description and
* content-encoded.
*/
- private static final String[] SEL_FI_SMALL = { KEY_ID, KEY_TITLE,
- KEY_PUBDATE, KEY_READ, KEY_LINK, KEY_PAYMENT_LINK, KEY_MEDIA,
- KEY_FEED, KEY_HAS_CHAPTERS, KEY_ITEM_IDENTIFIER };
+ private static final String[] SEL_FI_SMALL = {
+ TABLE_NAME_FEED_ITEMS + "." + KEY_ID,
+ TABLE_NAME_FEED_ITEMS + "." + KEY_TITLE,
+ TABLE_NAME_FEED_ITEMS + "." + KEY_PUBDATE,
+ TABLE_NAME_FEED_ITEMS + "." + KEY_READ,
+ TABLE_NAME_FEED_ITEMS + "." + KEY_LINK,
+ TABLE_NAME_FEED_ITEMS + "." + KEY_PAYMENT_LINK, KEY_MEDIA,
+ TABLE_NAME_FEED_ITEMS + "." + KEY_FEED,
+ TABLE_NAME_FEED_ITEMS + "." + KEY_HAS_CHAPTERS,
+ TABLE_NAME_FEED_ITEMS + "." + KEY_ITEM_IDENTIFIER };
// column indices for SEL_FI_SMALL
@@ -214,9 +225,18 @@ public class PodDBAdapter {
public static final int IDX_FI_EXTRA_CONTENT_ENCODED = 2;
public static final int IDX_FI_EXTRA_FEED = 3;
+ static PodDBHelper dbHelperSingleton;
+
+ private static synchronized PodDBHelper getDbHelperSingleton(Context appContext) {
+ if (dbHelperSingleton == null) {
+ dbHelperSingleton = new PodDBHelper(appContext, DATABASE_NAME, null, DATABASE_VERSION);
+ }
+ return dbHelperSingleton;
+ }
+
public PodDBAdapter(Context c) {
this.context = c;
- helper = new PodDBHelper(context, DATABASE_NAME, null, DATABASE_VERSION);
+ helper = getDbHelperSingleton(c.getApplicationContext());
}
public PodDBAdapter open() {
@@ -236,7 +256,7 @@ public class PodDBAdapter {
public void close() {
if (AppConfig.DEBUG)
Log.d(TAG, "Closing DB");
- db.close();
+ //db.close();
}
/**
@@ -319,6 +339,9 @@ public class PodDBAdapter {
} else {
values.put(KEY_PLAYBACK_COMPLETION_DATE, 0);
}
+ if (media.getItem() != null) {
+ values.put(KEY_FEEDITEM, media.getItem().getId());
+ }
if (media.getId() == 0) {
media.setId(db.insert(TABLE_NAME_FEED_MEDIA, null, values));
} else {
@@ -376,12 +399,6 @@ public class PodDBAdapter {
}
values.put(KEY_PUBDATE, item.getPubDate().getTime());
values.put(KEY_PAYMENT_LINK, item.getPaymentLink());
- if (item.getMedia() != null) {
- if (item.getMedia().getId() == 0) {
- setMedia(item.getMedia());
- }
- values.put(KEY_MEDIA, item.getMedia().getId());
- }
if (item.getFeed().getId() == 0) {
setFeed(item.getFeed());
}
@@ -395,6 +412,11 @@ public class PodDBAdapter {
db.update(TABLE_NAME_FEED_ITEMS, values, KEY_ID + "=?",
new String[] { String.valueOf(item.getId()) });
}
+ if (item.getMedia() != null) {
+ if (item.getMedia().getId() == 0) {
+ setMedia(item.getMedia());
+ }
+ }
if (item.getChapters() != null) {
setChapters(item);
}
@@ -662,11 +684,22 @@ public class PodDBAdapter {
*/
public final Cursor getQueueCursor() {
open();
- Cursor c = db.query(TABLE_NAME_FEED_ITEMS, SEL_FI_SMALL,
- "INNER JOIN ? ON ?=?", new String[] { TABLE_NAME_QUEUE,
- TABLE_NAME_FEED_ITEMS + "." + KEY_ID,
- TABLE_NAME_QUEUE + "." + KEY_FEEDITEM }, null, null,
- TABLE_NAME_QUEUE + "." + KEY_FEEDITEM);
+ String selFiSmall = Arrays.toString(SEL_FI_SMALL);
+ Object[] args = (Object[]) new String[] {
+ selFiSmall.substring(1, selFiSmall.length() - 1),
+ TABLE_NAME_FEED_ITEMS, TABLE_NAME_QUEUE,
+ TABLE_NAME_FEED_ITEMS + "." + KEY_ID,
+ TABLE_NAME_QUEUE + "." + KEY_FEEDITEM,
+ TABLE_NAME_QUEUE + "." + KEY_FEEDITEM };
+ String query = String.format(
+ "SELECT %s FROM %s INNER JOIN %s ON %s=%s ORDER BY %s", args);
+ Cursor c = db.rawQuery(query, null);
+ /*
+ * Cursor c = db.query(TABLE_NAME_FEED_ITEMS, SEL_FI_SMALL,
+ * "INNER JOIN ? ON ?=?", new String[] { TABLE_NAME_QUEUE,
+ * TABLE_NAME_FEED_ITEMS + "." + KEY_ID, TABLE_NAME_QUEUE + "." +
+ * KEY_FEEDITEM }, null, null, TABLE_NAME_QUEUE + "." + KEY_FEEDITEM);
+ */
return c;
}
@@ -715,7 +748,7 @@ public class PodDBAdapter {
throw new IllegalArgumentException("Limit must be >= 0");
}
open();
- Cursor c = db.query(CREATE_TABLE_FEED_MEDIA, null,
+ Cursor c = db.query(TABLE_NAME_FEED_MEDIA, null,
KEY_PLAYBACK_COMPLETION_DATE + " IS NOT NULL", null, null,
null, KEY_PLAYBACK_COMPLETION_DATE + " DESC LIMIT " + limit);
return c;
@@ -746,12 +779,12 @@ public class PodDBAdapter {
}
cursors[i] = db.rawQuery("SELECT * FROM "
- + TABLE_NAME_FEED_MEDIA + " WHERE " + KEY_ID + " IN "
+ + TABLE_NAME_FEED_MEDIA + " WHERE " + KEY_FEEDITEM + " IN "
+ buildInOperator(neededLength), parts);
}
return new MergeCursor(cursors);
} else {
- return db.query(TABLE_NAME_FEED_MEDIA, null, KEY_ID + " IN "
+ return db.query(TABLE_NAME_FEED_MEDIA, null, KEY_FEEDITEM + " IN "
+ buildInOperator(length), mediaIds, null, null, null);
}
}
@@ -781,7 +814,7 @@ public class PodDBAdapter {
}
open();
- return db.query(TABLE_NAME_FEED_ITEMS, null, KEY_ID + " IN "
+ return db.query(TABLE_NAME_FEED_ITEMS, SEL_FI_SMALL, KEY_ID + " IN "
+ buildInOperator(ids.length), ids, null, null, null);
}
@@ -883,43 +916,65 @@ public class PodDBAdapter {
db.execSQL(CREATE_TABLE_SIMPLECHAPTERS);
}
- @Override
- public void onUpgrade(final SQLiteDatabase db, final int oldVersion,
- final int newVersion) {
- Log.w("DBAdapter", "Upgrading from version " + oldVersion + " to "
- + newVersion + ".");
- if (oldVersion <= 1) {
- db.execSQL("ALTER TABLE " + TABLE_NAME_FEEDS + " ADD COLUMN "
- + KEY_TYPE + " TEXT");
- }
- if (oldVersion <= 2) {
- db.execSQL("ALTER TABLE " + TABLE_NAME_SIMPLECHAPTERS
- + " ADD COLUMN " + KEY_LINK + " TEXT");
- }
- if (oldVersion <= 3) {
- db.execSQL("ALTER TABLE " + TABLE_NAME_FEED_ITEMS
- + " ADD COLUMN " + KEY_ITEM_IDENTIFIER + " TEXT");
- }
- if (oldVersion <= 4) {
- db.execSQL("ALTER TABLE " + TABLE_NAME_FEEDS + " ADD COLUMN "
- + KEY_FEED_IDENTIFIER + " TEXT");
- }
- if (oldVersion <= 5) {
- db.execSQL("ALTER TABLE " + TABLE_NAME_DOWNLOAD_LOG
- + " ADD COLUMN " + KEY_REASON_DETAILED + " TEXT");
- db.execSQL("ALTER TABLE " + TABLE_NAME_DOWNLOAD_LOG
- + " ADD COLUMN " + KEY_DOWNLOADSTATUS_TITLE + " TEXT");
- }
- if (oldVersion <= 6) {
- db.execSQL("ALTER TABLE " + TABLE_NAME_SIMPLECHAPTERS
- + " ADD COLUMN " + KEY_CHAPTER_TYPE + " INTEGER");
- }
- if (oldVersion <= 7) {
- db.execSQL("ALTER TABLE " + TABLE_NAME_FEED_MEDIA
- + " ADD COLUMN " + KEY_PLAYBACK_COMPLETION_DATE
- + " INTEGER");
- }
- }
- }
-
+ @Override
+ public void onUpgrade(final SQLiteDatabase db, final int oldVersion,
+ final int newVersion) {
+ Log.w("DBAdapter", "Upgrading from version " + oldVersion + " to "
+ + newVersion + ".");
+ if (oldVersion <= 1) {
+ db.execSQL("ALTER TABLE " + TABLE_NAME_FEEDS + " ADD COLUMN "
+ + KEY_TYPE + " TEXT");
+ }
+ if (oldVersion <= 2) {
+ db.execSQL("ALTER TABLE " + TABLE_NAME_SIMPLECHAPTERS
+ + " ADD COLUMN " + KEY_LINK + " TEXT");
+ }
+ if (oldVersion <= 3) {
+ db.execSQL("ALTER TABLE " + TABLE_NAME_FEED_ITEMS
+ + " ADD COLUMN " + KEY_ITEM_IDENTIFIER + " TEXT");
+ }
+ if (oldVersion <= 4) {
+ db.execSQL("ALTER TABLE " + TABLE_NAME_FEEDS + " ADD COLUMN "
+ + KEY_FEED_IDENTIFIER + " TEXT");
+ }
+ if (oldVersion <= 5) {
+ db.execSQL("ALTER TABLE " + TABLE_NAME_DOWNLOAD_LOG
+ + " ADD COLUMN " + KEY_REASON_DETAILED + " TEXT");
+ db.execSQL("ALTER TABLE " + TABLE_NAME_DOWNLOAD_LOG
+ + " ADD COLUMN " + KEY_DOWNLOADSTATUS_TITLE + " TEXT");
+ }
+ if (oldVersion <= 6) {
+ db.execSQL("ALTER TABLE " + TABLE_NAME_SIMPLECHAPTERS
+ + " ADD COLUMN " + KEY_CHAPTER_TYPE + " INTEGER");
+ }
+ if (oldVersion <= 7) {
+ db.execSQL("ALTER TABLE " + TABLE_NAME_FEED_MEDIA
+ + " ADD COLUMN " + KEY_PLAYBACK_COMPLETION_DATE
+ + " INTEGER");
+ }
+ if (oldVersion <= 8) {
+ final int KEY_ID_POSITION = 0;
+ final int KEY_MEDIA_POSITION = 1;
+
+ // Add feeditem column to feedmedia table
+ db.execSQL("ALTER TABLE " + TABLE_NAME_FEED_MEDIA
+ + " ADD COLUMN " + KEY_FEEDITEM
+ + " INTEGER");
+ Cursor feeditemCursor = db.query(TABLE_NAME_FEED_ITEMS, new String[]{KEY_ID, KEY_MEDIA}, "? > 0", new String[] {KEY_MEDIA}, null, null, null);
+ if (feeditemCursor.moveToFirst()) {
+ db.beginTransaction();
+ ContentValues contentValues = new ContentValues();
+ do {
+ long mediaId = feeditemCursor.getLong(KEY_MEDIA_POSITION);
+ contentValues.put(KEY_FEEDITEM, feeditemCursor.getLong(KEY_ID_POSITION));
+ db.update(TABLE_NAME_FEED_MEDIA, contentValues, "?=?", new String[] {KEY_ID, Long.toString(mediaId)});
+ contentValues.clear();
+ } while (feeditemCursor.moveToNext());
+ db.setTransactionSuccessful();
+ db.endTransaction();
+ }
+ feeditemCursor.close();
+ }
+ }
+ }
}