diff options
Diffstat (limited to 'src')
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(); + } + } + } } |