Minor changes: Log, import order, small refactorings
This commit is contained in:
parent
3d19b939b1
commit
fbf1d8373c
@ -2,12 +2,6 @@ package de.test.antennapod.service.playback;
|
||||
|
||||
import android.content.Context;
|
||||
import android.test.InstrumentationTestCase;
|
||||
import de.danoeh.antennapod.core.feed.EventDistributor;
|
||||
import de.danoeh.antennapod.core.feed.Feed;
|
||||
import de.danoeh.antennapod.core.feed.FeedItem;
|
||||
import de.danoeh.antennapod.core.service.playback.PlaybackServiceTaskManager;
|
||||
import de.danoeh.antennapod.core.storage.PodDBAdapter;
|
||||
import de.danoeh.antennapod.core.util.playback.Playable;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
@ -15,6 +9,15 @@ import java.util.List;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import de.danoeh.antennapod.core.feed.EventDistributor;
|
||||
import de.danoeh.antennapod.core.feed.Feed;
|
||||
import de.danoeh.antennapod.core.feed.FeedItem;
|
||||
import de.danoeh.antennapod.core.feed.QueueEvent;
|
||||
import de.danoeh.antennapod.core.service.playback.PlaybackServiceTaskManager;
|
||||
import de.danoeh.antennapod.core.storage.PodDBAdapter;
|
||||
import de.danoeh.antennapod.core.util.playback.Playable;
|
||||
import de.greenrobot.event.EventBus;
|
||||
|
||||
/**
|
||||
* Test class for PlaybackServiceTaskManager
|
||||
*/
|
||||
|
@ -14,6 +14,7 @@ import de.danoeh.antennapod.core.feed.FeedMedia;
|
||||
import de.danoeh.antennapod.core.storage.DBReader;
|
||||
import de.danoeh.antennapod.core.storage.FeedItemStatistics;
|
||||
import de.danoeh.antennapod.core.storage.PodDBAdapter;
|
||||
import de.danoeh.antennapod.core.util.LongList;
|
||||
import de.danoeh.antennapod.core.util.flattr.FlattrStatus;
|
||||
|
||||
import static de.test.antennapod.storage.DBTestUtils.saveFeedlist;
|
||||
@ -194,7 +195,7 @@ public class DBReaderTest extends InstrumentationTestCase {
|
||||
final Context context = getInstrumentation().getTargetContext();
|
||||
final int numItems = 10;
|
||||
List<FeedItem> queue = saveQueue(numItems);
|
||||
List<Long> ids = DBReader.getQueueIDList(context);
|
||||
LongList ids = DBReader.getQueueIDList(context);
|
||||
assertNotNull(ids);
|
||||
assertTrue(queue.size() == ids.size());
|
||||
for (int i = 0; i < queue.size(); i++) {
|
||||
|
@ -5,16 +5,6 @@ import android.database.Cursor;
|
||||
import android.test.InstrumentationTestCase;
|
||||
import android.util.Log;
|
||||
|
||||
import de.danoeh.antennapod.core.feed.Chapter;
|
||||
import de.danoeh.antennapod.core.feed.Feed;
|
||||
import de.danoeh.antennapod.core.feed.FeedImage;
|
||||
import de.danoeh.antennapod.core.feed.FeedItem;
|
||||
import de.danoeh.antennapod.core.feed.FeedMedia;
|
||||
import de.danoeh.antennapod.core.feed.SimpleChapter;
|
||||
import de.danoeh.antennapod.core.storage.DBReader;
|
||||
import de.danoeh.antennapod.core.storage.DBWriter;
|
||||
import de.danoeh.antennapod.core.storage.PodDBAdapter;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
@ -25,6 +15,16 @@ import java.util.concurrent.Future;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.TimeoutException;
|
||||
|
||||
import de.danoeh.antennapod.core.feed.Chapter;
|
||||
import de.danoeh.antennapod.core.feed.Feed;
|
||||
import de.danoeh.antennapod.core.feed.FeedImage;
|
||||
import de.danoeh.antennapod.core.feed.FeedItem;
|
||||
import de.danoeh.antennapod.core.feed.FeedMedia;
|
||||
import de.danoeh.antennapod.core.feed.SimpleChapter;
|
||||
import de.danoeh.antennapod.core.storage.DBReader;
|
||||
import de.danoeh.antennapod.core.storage.DBWriter;
|
||||
import de.danoeh.antennapod.core.storage.PodDBAdapter;
|
||||
|
||||
/**
|
||||
* Test class for DBWriter
|
||||
*/
|
||||
@ -674,13 +674,13 @@ public class DBWriterTest extends InstrumentationTestCase {
|
||||
assertTrue(item.getId() != 0);
|
||||
}
|
||||
for (int removeIndex = 0; removeIndex < NUM_ITEMS; removeIndex++) {
|
||||
final long id = feed.getItems().get(removeIndex).getId();
|
||||
final FeedItem item = feed.getItems().get(removeIndex);
|
||||
adapter = new PodDBAdapter(context);
|
||||
adapter.open();
|
||||
adapter.setQueue(feed.getItems());
|
||||
adapter.close();
|
||||
|
||||
DBWriter.removeQueueItem(context, id, false).get(TIMEOUT, TimeUnit.SECONDS);
|
||||
DBWriter.removeQueueItem(context, item, false).get(TIMEOUT, TimeUnit.SECONDS);
|
||||
adapter = new PodDBAdapter(context);
|
||||
adapter.open();
|
||||
Cursor queue = adapter.getQueueIDCursor();
|
||||
@ -688,10 +688,10 @@ public class DBWriterTest extends InstrumentationTestCase {
|
||||
for (int i = 0; i < queue.getCount(); i++) {
|
||||
assertTrue(queue.moveToPosition(i));
|
||||
final long queueID = queue.getLong(0);
|
||||
assertTrue(queueID != id); // removed item is no longer in queue
|
||||
assertTrue(queueID != item.getId()); // removed item is no longer in queue
|
||||
boolean idFound = false;
|
||||
for (FeedItem item : feed.getItems()) { // items that were not removed are still in the queue
|
||||
idFound = idFound | (item.getId() == queueID);
|
||||
for (FeedItem other : feed.getItems()) { // items that were not removed are still in the queue
|
||||
idFound = idFound | (other.getId() == queueID);
|
||||
}
|
||||
assertTrue(idFound);
|
||||
}
|
||||
|
@ -25,7 +25,9 @@ import de.danoeh.antennapod.core.feed.Feed;
|
||||
import de.danoeh.antennapod.core.feed.FeedImage;
|
||||
import de.danoeh.antennapod.core.feed.FeedItem;
|
||||
import de.danoeh.antennapod.core.feed.FeedMedia;
|
||||
import de.danoeh.antennapod.core.feed.QueueEvent;
|
||||
import de.danoeh.antennapod.core.storage.PodDBAdapter;
|
||||
import de.greenrobot.event.EventBus;
|
||||
import de.test.antennapod.util.service.download.HTTPBin;
|
||||
import de.test.antennapod.util.syndication.feedgenerator.RSS2Generator;
|
||||
|
||||
|
@ -25,11 +25,11 @@ import org.apache.commons.lang3.Validate;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import de.danoeh.antennapod.BuildConfig;
|
||||
import de.danoeh.antennapod.R;
|
||||
import de.danoeh.antennapod.adapter.NavListAdapter;
|
||||
import de.danoeh.antennapod.core.feed.EventDistributor;
|
||||
import de.danoeh.antennapod.core.feed.Feed;
|
||||
import de.danoeh.antennapod.core.feed.QueueEvent;
|
||||
import de.danoeh.antennapod.core.preferences.UserPreferences;
|
||||
import de.danoeh.antennapod.core.storage.DBReader;
|
||||
import de.danoeh.antennapod.core.util.StorageUtils;
|
||||
@ -42,6 +42,7 @@ import de.danoeh.antennapod.fragment.PlaybackHistoryFragment;
|
||||
import de.danoeh.antennapod.fragment.QueueFragment;
|
||||
import de.danoeh.antennapod.menuhandler.NavDrawerActivity;
|
||||
import de.danoeh.antennapod.preferences.PreferenceController;
|
||||
import de.greenrobot.event.EventBus;
|
||||
|
||||
/**
|
||||
* The activity that is shown when the user launches the app.
|
||||
@ -440,8 +441,7 @@ public class MainActivity extends ActionBarActivity implements NavDrawerActivity
|
||||
@Override
|
||||
public void update(EventDistributor eventDistributor, Integer arg) {
|
||||
if ((EVENTS & arg) != 0) {
|
||||
if (BuildConfig.DEBUG)
|
||||
Log.d(TAG, "Received contentUpdate Intent.");
|
||||
Log.d(TAG, "Received contentUpdate Intent.");
|
||||
loadData();
|
||||
}
|
||||
}
|
||||
|
@ -8,6 +8,7 @@ import android.support.v4.app.ListFragment;
|
||||
import android.view.View;
|
||||
import android.widget.ListView;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import de.danoeh.antennapod.R;
|
||||
@ -17,7 +18,6 @@ import de.danoeh.antennapod.core.feed.EventDistributor;
|
||||
import de.danoeh.antennapod.core.feed.FeedItem;
|
||||
import de.danoeh.antennapod.core.storage.DBReader;
|
||||
import de.danoeh.antennapod.core.storage.DBWriter;
|
||||
import de.danoeh.antennapod.core.util.QueueAccess;
|
||||
|
||||
/**
|
||||
* Displays all running downloads and provides a button to delete them
|
||||
@ -26,11 +26,9 @@ public class CompletedDownloadsFragment extends ListFragment {
|
||||
private static final int EVENTS =
|
||||
EventDistributor.DOWNLOAD_HANDLED |
|
||||
EventDistributor.DOWNLOADLOG_UPDATE |
|
||||
EventDistributor.QUEUE_UPDATE |
|
||||
EventDistributor.UNREAD_ITEMS_UPDATE;
|
||||
|
||||
private List<FeedItem> items;
|
||||
private QueueAccess queue;
|
||||
private DownloadedEpisodesListAdapter listAdapter;
|
||||
|
||||
private boolean viewCreated = false;
|
||||
@ -155,7 +153,7 @@ public class CompletedDownloadsFragment extends ListFragment {
|
||||
}
|
||||
}
|
||||
|
||||
private class ItemLoader extends AsyncTask<Void, Void, Object[]> {
|
||||
private class ItemLoader extends AsyncTask<Void, Void, List<FeedItem>> {
|
||||
|
||||
@Override
|
||||
protected void onPreExecute() {
|
||||
@ -166,11 +164,10 @@ public class CompletedDownloadsFragment extends ListFragment {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPostExecute(Object[] results) {
|
||||
protected void onPostExecute(List<FeedItem> results) {
|
||||
super.onPostExecute(results);
|
||||
if (results != null) {
|
||||
items = (List<FeedItem>) results[0];
|
||||
queue = (QueueAccess) results[1];
|
||||
items = results;
|
||||
itemsLoaded = true;
|
||||
if (viewCreated && getActivity() != null) {
|
||||
onFragmentLoaded();
|
||||
@ -179,13 +176,12 @@ public class CompletedDownloadsFragment extends ListFragment {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Object[] doInBackground(Void... params) {
|
||||
protected List<FeedItem> doInBackground(Void... params) {
|
||||
Context context = getActivity();
|
||||
if (context != null) {
|
||||
return new Object[]{DBReader.getDownloadedItems(context),
|
||||
QueueAccess.IDListAccess(DBReader.getQueueIDList(context))};
|
||||
return DBReader.getDownloadedItems(context);
|
||||
}
|
||||
return null;
|
||||
return Collections.emptyList();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -13,7 +13,6 @@ import android.widget.TextView;
|
||||
|
||||
import com.squareup.picasso.Picasso;
|
||||
|
||||
import de.danoeh.antennapod.BuildConfig;
|
||||
import de.danoeh.antennapod.R;
|
||||
import de.danoeh.antennapod.core.service.playback.PlaybackService;
|
||||
import de.danoeh.antennapod.core.util.Converter;
|
||||
@ -54,8 +53,7 @@ public class ExternalPlayerFragment extends Fragment {
|
||||
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
if (BuildConfig.DEBUG)
|
||||
Log.d(TAG, "layoutInfo was clicked");
|
||||
Log.d(TAG, "layoutInfo was clicked");
|
||||
|
||||
if (controller.getMedia() != null) {
|
||||
startActivity(PlaybackService.getPlayerActivityIntent(
|
||||
@ -90,14 +88,10 @@ public class ExternalPlayerFragment extends Fragment {
|
||||
|
||||
@Override
|
||||
public void onBufferStart() {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBufferEnd() {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -153,7 +147,6 @@ public class ExternalPlayerFragment extends Fragment {
|
||||
butPlay.setOnClickListener(controller
|
||||
.newOnPlayButtonClickListener());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -170,8 +163,6 @@ public class ExternalPlayerFragment extends Fragment {
|
||||
|
||||
@Override
|
||||
public void onPlaybackSpeedChange() {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
}
|
||||
};
|
||||
}
|
||||
@ -185,8 +176,7 @@ public class ExternalPlayerFragment extends Fragment {
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
super.onDestroy();
|
||||
if (BuildConfig.DEBUG)
|
||||
Log.d(TAG, "Fragment is about to be destroyed");
|
||||
Log.d(TAG, "Fragment is about to be destroyed");
|
||||
if (controller != null) {
|
||||
controller.release();
|
||||
}
|
||||
@ -201,8 +191,7 @@ public class ExternalPlayerFragment extends Fragment {
|
||||
}
|
||||
|
||||
private boolean loadMediaInfo() {
|
||||
if (BuildConfig.DEBUG)
|
||||
Log.d(TAG, "Loading media info");
|
||||
Log.d(TAG, "Loading media info");
|
||||
if (controller.serviceAvailable()) {
|
||||
Playable media = controller.getMedia();
|
||||
if (media != null) {
|
||||
@ -221,13 +210,11 @@ public class ExternalPlayerFragment extends Fragment {
|
||||
}
|
||||
return true;
|
||||
} else {
|
||||
Log.w(TAG,
|
||||
"loadMediaInfo was called while the media object of playbackService was null!");
|
||||
Log.w(TAG, "loadMediaInfo was called while the media object of playbackService was null!");
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
Log.w(TAG,
|
||||
"loadMediaInfo was called while playbackService was null!");
|
||||
Log.w(TAG, "loadMediaInfo was called while playbackService was null!");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
@ -17,6 +17,7 @@ import android.support.v7.widget.PopupMenu;
|
||||
import android.support.v7.widget.Toolbar;
|
||||
import android.text.TextUtils;
|
||||
import android.text.format.DateUtils;
|
||||
import android.util.Log;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
@ -43,6 +44,7 @@ import de.danoeh.antennapod.core.asynctask.DownloadObserver;
|
||||
import de.danoeh.antennapod.core.feed.EventDistributor;
|
||||
import de.danoeh.antennapod.core.feed.FeedItem;
|
||||
import de.danoeh.antennapod.core.feed.FeedMedia;
|
||||
import de.danoeh.antennapod.core.feed.QueueEvent;
|
||||
import de.danoeh.antennapod.core.preferences.UserPreferences;
|
||||
import de.danoeh.antennapod.core.service.download.Downloader;
|
||||
import de.danoeh.antennapod.core.storage.DBReader;
|
||||
@ -51,14 +53,17 @@ import de.danoeh.antennapod.core.storage.DBWriter;
|
||||
import de.danoeh.antennapod.core.storage.DownloadRequestException;
|
||||
import de.danoeh.antennapod.core.storage.DownloadRequester;
|
||||
import de.danoeh.antennapod.core.util.Converter;
|
||||
import de.danoeh.antennapod.core.util.QueueAccess;
|
||||
import de.danoeh.antennapod.core.util.LongList;
|
||||
import de.danoeh.antennapod.core.util.playback.Timeline;
|
||||
import de.danoeh.antennapod.menuhandler.FeedItemMenuHandler;
|
||||
import de.greenrobot.event.EventBus;
|
||||
|
||||
/**
|
||||
* Displays information about a FeedItem and actions.
|
||||
*/
|
||||
public class ItemFragment extends Fragment implements LoaderManager.LoaderCallbacks<Pair<FeedItem, QueueAccess>> {
|
||||
public class ItemFragment extends Fragment implements LoaderManager.LoaderCallbacks<Pair<FeedItem, LongList>> {
|
||||
|
||||
private static final String TAG = "ItemFragment";
|
||||
|
||||
private static final int EVENTS = EventDistributor.DOWNLOAD_HANDLED |
|
||||
EventDistributor.DOWNLOAD_QUEUED |
|
||||
@ -84,7 +89,7 @@ public class ItemFragment extends Fragment implements LoaderManager.LoaderCallba
|
||||
private boolean itemsLoaded = false;
|
||||
private long itemID;
|
||||
private FeedItem item;
|
||||
private QueueAccess queue;
|
||||
private LongList queue;
|
||||
private String webviewData;
|
||||
private DownloadObserver downloadObserver;
|
||||
private List<Downloader> downloaderList;
|
||||
@ -389,23 +394,23 @@ public class ItemFragment extends Fragment implements LoaderManager.LoaderCallba
|
||||
|
||||
|
||||
@Override
|
||||
public Loader<Pair<FeedItem, QueueAccess>> onCreateLoader(int id, Bundle args) {
|
||||
return new DBTaskLoader<Pair<FeedItem, QueueAccess>>(getActivity()) {
|
||||
public Loader<Pair<FeedItem,LongList>> onCreateLoader(int id, Bundle args) {
|
||||
return new DBTaskLoader<Pair<FeedItem,LongList>>(getActivity()) {
|
||||
@Override
|
||||
public Pair<FeedItem, QueueAccess> loadInBackground() {
|
||||
public Pair<FeedItem,LongList> loadInBackground() {
|
||||
FeedItem data1 = DBReader.getFeedItem(getContext(), itemID);
|
||||
if (data1 != null) {
|
||||
Timeline t = new Timeline(getActivity(), data1);
|
||||
webviewData = t.processShownotes(false);
|
||||
}
|
||||
QueueAccess data2 = QueueAccess.IDListAccess(DBReader.getQueueIDList(getContext()));
|
||||
LongList data2 = DBReader.getQueueIDList(getContext());
|
||||
return Pair.create(data1, data2);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLoadFinished(Loader<Pair<FeedItem, QueueAccess>> loader, Pair<FeedItem, QueueAccess> data) {
|
||||
public void onLoadFinished(Loader<Pair<FeedItem,LongList>> loader, Pair<FeedItem,LongList> data) {
|
||||
|
||||
if (data != null) {
|
||||
item = data.first;
|
||||
@ -420,8 +425,7 @@ public class ItemFragment extends Fragment implements LoaderManager.LoaderCallba
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLoaderReset(Loader<Pair<FeedItem, QueueAccess>> loader) {
|
||||
|
||||
public void onLoaderReset(Loader<Pair<FeedItem,LongList>> loader) {
|
||||
}
|
||||
|
||||
private EventDistributor.EventListener contentUpdate = new EventDistributor.EventListener() {
|
||||
|
@ -9,6 +9,7 @@ import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.support.v4.app.ListFragment;
|
||||
import android.support.v4.util.Pair;
|
||||
import android.support.v7.app.ActionBarActivity;
|
||||
import android.support.v7.widget.SearchView;
|
||||
import android.util.Log;
|
||||
@ -29,7 +30,6 @@ import org.apache.commons.lang3.Validate;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import de.danoeh.antennapod.BuildConfig;
|
||||
import de.danoeh.antennapod.R;
|
||||
import de.danoeh.antennapod.activity.FeedInfoActivity;
|
||||
import de.danoeh.antennapod.activity.MainActivity;
|
||||
@ -44,17 +44,19 @@ import de.danoeh.antennapod.core.feed.EventDistributor;
|
||||
import de.danoeh.antennapod.core.feed.Feed;
|
||||
import de.danoeh.antennapod.core.feed.FeedItem;
|
||||
import de.danoeh.antennapod.core.feed.FeedMedia;
|
||||
import de.danoeh.antennapod.core.feed.QueueEvent;
|
||||
import de.danoeh.antennapod.core.service.download.DownloadService;
|
||||
import de.danoeh.antennapod.core.service.download.Downloader;
|
||||
import de.danoeh.antennapod.core.storage.DBReader;
|
||||
import de.danoeh.antennapod.core.storage.DBTasks;
|
||||
import de.danoeh.antennapod.core.storage.DownloadRequestException;
|
||||
import de.danoeh.antennapod.core.storage.DownloadRequester;
|
||||
import de.danoeh.antennapod.core.util.QueueAccess;
|
||||
import de.danoeh.antennapod.core.util.LongList;
|
||||
import de.danoeh.antennapod.core.util.gui.MoreContentListFooterUtil;
|
||||
import de.danoeh.antennapod.menuhandler.FeedMenuHandler;
|
||||
import de.danoeh.antennapod.menuhandler.MenuItemUtils;
|
||||
import de.danoeh.antennapod.menuhandler.NavDrawerActivity;
|
||||
import de.greenrobot.event.EventBus;
|
||||
|
||||
/**
|
||||
* Displays a list of FeedItems.
|
||||
@ -76,7 +78,7 @@ public class ItemlistFragment extends ListFragment {
|
||||
|
||||
private long feedID;
|
||||
private Feed feed;
|
||||
protected QueueAccess queue;
|
||||
private LongList queue;
|
||||
|
||||
private boolean itemsLoaded = false;
|
||||
private boolean viewsCreated = false;
|
||||
@ -288,8 +290,7 @@ public class ItemlistFragment extends ListFragment {
|
||||
@Override
|
||||
public void update(EventDistributor eventDistributor, Integer arg) {
|
||||
if ((EVENTS & arg) != 0) {
|
||||
if (BuildConfig.DEBUG)
|
||||
Log.d(TAG, "Received contentUpdate Intent.");
|
||||
Log.d(TAG, "Received contentUpdate Intent.");
|
||||
if ((EventDistributor.DOWNLOAD_QUEUED & arg) != 0) {
|
||||
updateProgressBarVisibility();
|
||||
} else {
|
||||
@ -474,25 +475,26 @@ public class ItemlistFragment extends ListFragment {
|
||||
}
|
||||
}
|
||||
|
||||
private class ItemLoader extends AsyncTask<Long, Void, Object[]> {
|
||||
private class ItemLoader extends AsyncTask<Long, Void, Pair<Feed,LongList>> {
|
||||
@Override
|
||||
protected Object[] doInBackground(Long... params) {
|
||||
protected Pair<Feed,LongList> doInBackground(Long... params) {
|
||||
long feedID = params[0];
|
||||
Context context = getActivity();
|
||||
if (context != null) {
|
||||
return new Object[]{DBReader.getFeed(context, feedID),
|
||||
QueueAccess.IDListAccess(DBReader.getQueueIDList(context))};
|
||||
Feed feed = DBReader.getFeed(context, feedID);
|
||||
LongList queue = DBReader.getQueueIDList(context);
|
||||
return Pair.create(feed, queue);
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPostExecute(Object[] res) {
|
||||
protected void onPostExecute(Pair<Feed,LongList> res) {
|
||||
super.onPostExecute(res);
|
||||
if (res != null) {
|
||||
feed = (Feed) res[0];
|
||||
queue = (QueueAccess) res[1];
|
||||
feed = res.first;
|
||||
queue = res.second;
|
||||
itemsLoaded = true;
|
||||
if (viewsCreated) {
|
||||
onFragmentLoaded();
|
||||
|
@ -37,6 +37,7 @@ import de.danoeh.antennapod.core.feed.EventDistributor;
|
||||
import de.danoeh.antennapod.core.feed.Feed;
|
||||
import de.danoeh.antennapod.core.feed.FeedItem;
|
||||
import de.danoeh.antennapod.core.feed.FeedMedia;
|
||||
import de.danoeh.antennapod.core.feed.QueueEvent;
|
||||
import de.danoeh.antennapod.core.preferences.UserPreferences;
|
||||
import de.danoeh.antennapod.core.service.download.DownloadService;
|
||||
import de.danoeh.antennapod.core.service.download.Downloader;
|
||||
@ -44,11 +45,16 @@ import de.danoeh.antennapod.core.storage.DBReader;
|
||||
import de.danoeh.antennapod.core.storage.DBTasks;
|
||||
import de.danoeh.antennapod.core.storage.DBWriter;
|
||||
import de.danoeh.antennapod.core.storage.DownloadRequester;
|
||||
|
||||
import de.danoeh.antennapod.core.util.QueueAccess;
|
||||
import de.danoeh.antennapod.core.util.gui.FeedItemUndoToken;
|
||||
import de.danoeh.antennapod.core.util.gui.UndoBarController;
|
||||
|
||||
import de.danoeh.antennapod.core.util.LongList;
|
||||
|
||||
import de.danoeh.antennapod.menuhandler.MenuItemUtils;
|
||||
import de.danoeh.antennapod.menuhandler.NavDrawerActivity;
|
||||
import de.greenrobot.event.EventBus;
|
||||
|
||||
/**
|
||||
* Shows unread or recently published episodes
|
||||
@ -57,7 +63,6 @@ public class NewEpisodesFragment extends Fragment {
|
||||
private static final String TAG = "NewEpisodesFragment";
|
||||
private static final int EVENTS = EventDistributor.DOWNLOAD_HANDLED |
|
||||
EventDistributor.DOWNLOAD_QUEUED |
|
||||
EventDistributor.QUEUE_UPDATE |
|
||||
EventDistributor.UNREAD_ITEMS_UPDATE |
|
||||
EventDistributor.PLAYER_STATUS_UPDATE;
|
||||
|
||||
@ -75,7 +80,7 @@ public class NewEpisodesFragment extends Fragment {
|
||||
|
||||
private List<FeedItem> unreadItems;
|
||||
private List<FeedItem> recentItems;
|
||||
private QueueAccess queueAccess;
|
||||
private LongList queue;
|
||||
private List<Downloader> downloaderList;
|
||||
|
||||
private boolean itemsLoaded = false;
|
||||
@ -357,7 +362,7 @@ public class NewEpisodesFragment extends Fragment {
|
||||
@Override
|
||||
public boolean isInQueue(FeedItem item) {
|
||||
if (itemsLoaded) {
|
||||
return queueAccess.contains(item.getId());
|
||||
return queue.contains(item.getId());
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
@ -437,9 +442,11 @@ public class NewEpisodesFragment extends Fragment {
|
||||
protected Object[] doInBackground(Void... params) {
|
||||
Context context = activity.get();
|
||||
if (context != null) {
|
||||
return new Object[]{DBReader.getUnreadItemsList(context),
|
||||
return new Object[] {
|
||||
DBReader.getUnreadItemsList(context),
|
||||
DBReader.getRecentlyPublishedEpisodes(context, RECENT_EPISODES_LIMIT),
|
||||
QueueAccess.IDListAccess(DBReader.getQueueIDList(context))};
|
||||
DBReader.getQueueIDList(context)
|
||||
};
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
@ -454,7 +461,7 @@ public class NewEpisodesFragment extends Fragment {
|
||||
if (lists != null) {
|
||||
unreadItems = (List<FeedItem>) lists[0];
|
||||
recentItems = (List<FeedItem>) lists[1];
|
||||
queueAccess = (QueueAccess) lists[2];
|
||||
queue = (LongList) lists[2];
|
||||
itemsLoaded = true;
|
||||
if (viewsCreated && activity.get() != null) {
|
||||
onFragmentLoaded();
|
||||
|
@ -7,7 +7,9 @@ import android.os.AsyncTask;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.support.v4.app.ListFragment;
|
||||
import android.support.v4.util.Pair;
|
||||
import android.support.v4.view.MenuItemCompat;
|
||||
import android.util.Log;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuInflater;
|
||||
import android.view.MenuItem;
|
||||
@ -25,12 +27,14 @@ import de.danoeh.antennapod.core.asynctask.DownloadObserver;
|
||||
import de.danoeh.antennapod.core.feed.EventDistributor;
|
||||
import de.danoeh.antennapod.core.feed.FeedItem;
|
||||
import de.danoeh.antennapod.core.feed.FeedMedia;
|
||||
import de.danoeh.antennapod.core.feed.QueueEvent;
|
||||
import de.danoeh.antennapod.core.service.download.Downloader;
|
||||
import de.danoeh.antennapod.core.storage.DBReader;
|
||||
import de.danoeh.antennapod.core.storage.DBWriter;
|
||||
import de.danoeh.antennapod.core.util.QueueAccess;
|
||||
import de.danoeh.antennapod.core.util.LongList;
|
||||
import de.danoeh.antennapod.menuhandler.MenuItemUtils;
|
||||
import de.danoeh.antennapod.menuhandler.NavDrawerActivity;
|
||||
import de.greenrobot.event.EventBus;
|
||||
|
||||
public class PlaybackHistoryFragment extends ListFragment {
|
||||
private static final String TAG = "PlaybackHistoryFragment";
|
||||
@ -38,7 +42,7 @@ public class PlaybackHistoryFragment extends ListFragment {
|
||||
EventDistributor.PLAYER_STATUS_UPDATE;
|
||||
|
||||
private List<FeedItem> playbackHistory;
|
||||
private QueueAccess queue;
|
||||
private LongList queue;
|
||||
private FeedItemlistAdapter adapter;
|
||||
|
||||
private boolean itemsLoaded = false;
|
||||
@ -251,27 +255,27 @@ public class PlaybackHistoryFragment extends ListFragment {
|
||||
}
|
||||
}
|
||||
|
||||
private class ItemLoader extends AsyncTask<Void, Void, Object[]> {
|
||||
private class ItemLoader extends AsyncTask<Void, Void, Pair<List<FeedItem>,LongList>> {
|
||||
|
||||
@Override
|
||||
protected Object[] doInBackground(Void... params) {
|
||||
protected Pair<List<FeedItem>,LongList> doInBackground(Void... params) {
|
||||
Context context = activity.get();
|
||||
if (context != null) {
|
||||
List<FeedItem> ph = DBReader.getPlaybackHistory(context);
|
||||
DBReader.loadFeedDataOfFeedItemlist(context, ph);
|
||||
return new Object[]{ph,
|
||||
QueueAccess.IDListAccess(DBReader.getQueueIDList(context))};
|
||||
List<FeedItem> history = DBReader.getPlaybackHistory(context);
|
||||
LongList queue = DBReader.getQueueIDList(context);
|
||||
DBReader.loadFeedDataOfFeedItemlist(context, history);
|
||||
return Pair.create(history, queue);
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPostExecute(Object[] res) {
|
||||
protected void onPostExecute(Pair<List<FeedItem>,LongList> res) {
|
||||
super.onPostExecute(res);
|
||||
if (res != null) {
|
||||
playbackHistory = (List<FeedItem>) res[0];
|
||||
queue = (QueueAccess) res[1];
|
||||
playbackHistory = res.first;
|
||||
queue = res.second;
|
||||
itemsLoaded = true;
|
||||
if (viewsCreated) {
|
||||
onFragmentLoaded();
|
||||
|
@ -7,7 +7,6 @@ import android.content.SharedPreferences;
|
||||
import android.os.AsyncTask;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.os.Parcelable;
|
||||
import android.support.v4.app.Fragment;
|
||||
import android.support.v7.widget.SearchView;
|
||||
import android.util.Log;
|
||||
@ -37,6 +36,8 @@ import de.danoeh.antennapod.core.feed.EventDistributor;
|
||||
import de.danoeh.antennapod.core.feed.Feed;
|
||||
import de.danoeh.antennapod.core.feed.FeedItem;
|
||||
import de.danoeh.antennapod.core.feed.FeedMedia;
|
||||
import de.danoeh.antennapod.core.feed.QueueEvent;
|
||||
import de.danoeh.antennapod.core.preferences.UserPreferences;
|
||||
import de.danoeh.antennapod.core.service.download.DownloadService;
|
||||
import de.danoeh.antennapod.core.service.download.Downloader;
|
||||
import de.danoeh.antennapod.core.storage.DBReader;
|
||||
@ -48,6 +49,7 @@ import de.danoeh.antennapod.core.util.gui.FeedItemUndoToken;
|
||||
import de.danoeh.antennapod.core.util.gui.UndoBarController;
|
||||
import de.danoeh.antennapod.menuhandler.MenuItemUtils;
|
||||
import de.danoeh.antennapod.menuhandler.NavDrawerActivity;
|
||||
import de.greenrobot.event.EventBus;
|
||||
|
||||
/**
|
||||
* Shows all items in the queue
|
||||
@ -295,7 +297,7 @@ public class QueueFragment extends Fragment {
|
||||
DBWriter.moveQueueItemToBottom(getActivity(), selectedItem.getId(), true);
|
||||
return true;
|
||||
case R.id.remove_from_queue_item:
|
||||
DBWriter.removeQueueItem(getActivity(), selectedItem.getId(), false);
|
||||
DBWriter.removeQueueItem(getActivity(), selectedItem, false);
|
||||
return true;
|
||||
default:
|
||||
return super.onContextItemSelected(item);
|
||||
|
@ -13,6 +13,7 @@ import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.widget.ListView;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import de.danoeh.antennapod.R;
|
||||
@ -23,9 +24,7 @@ import de.danoeh.antennapod.core.feed.Feed;
|
||||
import de.danoeh.antennapod.core.feed.FeedComponent;
|
||||
import de.danoeh.antennapod.core.feed.FeedItem;
|
||||
import de.danoeh.antennapod.core.feed.SearchResult;
|
||||
import de.danoeh.antennapod.core.storage.DBReader;
|
||||
import de.danoeh.antennapod.core.storage.FeedSearcher;
|
||||
import de.danoeh.antennapod.core.util.QueueAccess;
|
||||
import de.danoeh.antennapod.menuhandler.MenuItemUtils;
|
||||
import de.danoeh.antennapod.menuhandler.NavDrawerActivity;
|
||||
|
||||
@ -44,8 +43,6 @@ public class SearchFragment extends ListFragment {
|
||||
private boolean viewCreated = false;
|
||||
private boolean itemsLoaded = false;
|
||||
|
||||
private QueueAccess queue;
|
||||
|
||||
/**
|
||||
* Create a new SearchFragment that searches all feeds.
|
||||
*/
|
||||
@ -165,8 +162,7 @@ public class SearchFragment extends ListFragment {
|
||||
@Override
|
||||
public void update(EventDistributor eventDistributor, Integer arg) {
|
||||
if ((arg & (EventDistributor.UNREAD_ITEMS_UPDATE
|
||||
| EventDistributor.DOWNLOAD_HANDLED
|
||||
| EventDistributor.QUEUE_UPDATE)) != 0) {
|
||||
| EventDistributor.DOWNLOAD_HANDLED)) != 0) {
|
||||
startSearchTask();
|
||||
}
|
||||
}
|
||||
@ -209,17 +205,16 @@ public class SearchFragment extends ListFragment {
|
||||
}
|
||||
}
|
||||
|
||||
private class SearchTask extends AsyncTask<Bundle, Void, Object[]> {
|
||||
private class SearchTask extends AsyncTask<Bundle, Void, List<SearchResult>> {
|
||||
@Override
|
||||
protected Object[] doInBackground(Bundle... params) {
|
||||
protected List<SearchResult> doInBackground(Bundle... params) {
|
||||
String query = params[0].getString(ARG_QUERY);
|
||||
long feed = params[0].getLong(ARG_FEED);
|
||||
Context context = getActivity();
|
||||
if (context != null) {
|
||||
return new Object[]{FeedSearcher.performSearch(context, query, feed),
|
||||
QueueAccess.IDListAccess(DBReader.getQueueIDList(context))};
|
||||
return FeedSearcher.performSearch(context, query, feed);
|
||||
} else {
|
||||
return null;
|
||||
return Collections.emptyList();
|
||||
}
|
||||
}
|
||||
|
||||
@ -232,12 +227,11 @@ public class SearchFragment extends ListFragment {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPostExecute(Object[] results) {
|
||||
protected void onPostExecute(List<SearchResult> results) {
|
||||
super.onPostExecute(results);
|
||||
if (results != null) {
|
||||
itemsLoaded = true;
|
||||
searchResults = (List<SearchResult>) results[0];
|
||||
queue = (QueueAccess) results[1];
|
||||
searchResults = results;
|
||||
if (viewCreated) {
|
||||
onFragmentLoaded();
|
||||
}
|
||||
|
@ -4,8 +4,8 @@ import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.net.Uri;
|
||||
|
||||
import de.danoeh.antennapod.core.BuildConfig;
|
||||
import de.danoeh.antennapod.R;
|
||||
import de.danoeh.antennapod.core.BuildConfig;
|
||||
import de.danoeh.antennapod.core.feed.FeedItem;
|
||||
import de.danoeh.antennapod.core.feed.FeedMedia;
|
||||
import de.danoeh.antennapod.core.gpoddernet.model.GpodnetEpisodeAction;
|
||||
@ -16,6 +16,7 @@ import de.danoeh.antennapod.core.storage.DBTasks;
|
||||
import de.danoeh.antennapod.core.storage.DBWriter;
|
||||
import de.danoeh.antennapod.core.storage.DownloadRequestException;
|
||||
import de.danoeh.antennapod.core.storage.DownloadRequester;
|
||||
import de.danoeh.antennapod.core.util.LongList;
|
||||
import de.danoeh.antennapod.core.util.QueueAccess;
|
||||
import de.danoeh.antennapod.core.util.ShareUtils;
|
||||
|
||||
@ -126,7 +127,7 @@ public class FeedItemMenuHandler {
|
||||
* @return true if selectedItem is not null.
|
||||
*/
|
||||
public static boolean onPrepareMenu(MenuInterface mi,
|
||||
FeedItem selectedItem, boolean showExtendedMenu, QueueAccess queueAccess, int... excludeIds) {
|
||||
FeedItem selectedItem, boolean showExtendedMenu, LongList queueAccess, int... excludeIds) {
|
||||
boolean rc = onPrepareMenu(mi, selectedItem, showExtendedMenu, queueAccess);
|
||||
if (rc && excludeIds != null) {
|
||||
for (int id : excludeIds) {
|
||||
@ -186,7 +187,7 @@ public class FeedItemMenuHandler {
|
||||
DBWriter.addQueueItem(context, selectedItem.getId());
|
||||
break;
|
||||
case R.id.remove_from_queue_item:
|
||||
DBWriter.removeQueueItem(context, selectedItem.getId(), true);
|
||||
DBWriter.removeQueueItem(context, selectedItem, true);
|
||||
break;
|
||||
case R.id.stream_item:
|
||||
DBTasks.playMedia(context, selectedItem.getMedia(), true, true,
|
||||
|
@ -5,8 +5,6 @@ import android.util.Log;
|
||||
|
||||
import org.apache.commons.lang3.Validate;
|
||||
|
||||
import de.danoeh.antennapod.core.BuildConfig;
|
||||
|
||||
import java.util.AbstractQueue;
|
||||
import java.util.Observable;
|
||||
import java.util.Observer;
|
||||
@ -71,23 +69,17 @@ public class EventDistributor extends Observable {
|
||||
|
||||
private void processEventQueue() {
|
||||
Integer result = 0;
|
||||
if (BuildConfig.DEBUG)
|
||||
Log.d(TAG,
|
||||
"Processing event queue. Number of events: "
|
||||
+ events.size());
|
||||
Log.d(TAG, "Processing event queue. Number of events: " + events.size());
|
||||
for (Integer current = events.poll(); current != null; current = events
|
||||
.poll()) {
|
||||
result |= current;
|
||||
}
|
||||
if (result != 0) {
|
||||
if (BuildConfig.DEBUG)
|
||||
Log.d(TAG, "Notifying observers. Data: " + result);
|
||||
Log.d(TAG, "Notifying observers. Data: " + result);
|
||||
setChanged();
|
||||
notifyObservers(result);
|
||||
} else {
|
||||
if (BuildConfig.DEBUG)
|
||||
Log.d(TAG,
|
||||
"Event queue didn't contain any new events. Observers will not be notified.");
|
||||
Log.d(TAG, "Event queue didn't contain any new events. Observers will not be notified.");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2,6 +2,9 @@ package de.danoeh.antennapod.core.feed;
|
||||
|
||||
import android.net.Uri;
|
||||
|
||||
import org.apache.commons.lang3.builder.ToStringBuilder;
|
||||
import org.apache.commons.lang3.builder.ToStringStyle;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.Callable;
|
||||
@ -384,4 +387,9 @@ public class FeedItem extends FeedComponent implements ShownotesProvider, Flattr
|
||||
public boolean hasChapters() {
|
||||
return hasChapters;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
|
||||
}
|
||||
}
|
||||
|
@ -36,7 +36,6 @@ import org.apache.commons.lang3.StringUtils;
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
|
||||
import de.danoeh.antennapod.core.BuildConfig;
|
||||
import de.danoeh.antennapod.core.ClientConfig;
|
||||
import de.danoeh.antennapod.core.R;
|
||||
import de.danoeh.antennapod.core.feed.Chapter;
|
||||
@ -184,8 +183,7 @@ public class PlaybackService extends Service {
|
||||
|
||||
@Override
|
||||
public boolean onUnbind(Intent intent) {
|
||||
if (BuildConfig.DEBUG)
|
||||
Log.d(TAG, "Received onUnbind event");
|
||||
Log.d(TAG, "Received onUnbind event");
|
||||
return super.onUnbind(intent);
|
||||
}
|
||||
|
||||
@ -219,8 +217,7 @@ public class PlaybackService extends Service {
|
||||
@Override
|
||||
public void onCreate() {
|
||||
super.onCreate();
|
||||
if (BuildConfig.DEBUG)
|
||||
Log.d(TAG, "Service created.");
|
||||
Log.d(TAG, "Service created.");
|
||||
isRunning = true;
|
||||
|
||||
registerReceiver(headsetDisconnected, new IntentFilter(
|
||||
@ -247,8 +244,7 @@ public class PlaybackService extends Service {
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
super.onDestroy();
|
||||
if (BuildConfig.DEBUG)
|
||||
Log.d(TAG, "Service is about to be destroyed");
|
||||
Log.d(TAG, "Service is about to be destroyed");
|
||||
isRunning = false;
|
||||
started = false;
|
||||
currentMediaType = MediaType.UNKNOWN;
|
||||
@ -264,8 +260,7 @@ public class PlaybackService extends Service {
|
||||
|
||||
@Override
|
||||
public IBinder onBind(Intent intent) {
|
||||
if (BuildConfig.DEBUG)
|
||||
Log.d(TAG, "Received onBind event");
|
||||
Log.d(TAG, "Received onBind event");
|
||||
return mBinder;
|
||||
}
|
||||
|
||||
@ -273,8 +268,7 @@ public class PlaybackService extends Service {
|
||||
public int onStartCommand(Intent intent, int flags, int startId) {
|
||||
super.onStartCommand(intent, flags, startId);
|
||||
|
||||
if (BuildConfig.DEBUG)
|
||||
Log.d(TAG, "OnStartCommand called");
|
||||
Log.d(TAG, "OnStartCommand called");
|
||||
final int keycode = intent.getIntExtra(MediaButtonReceiver.EXTRA_KEYCODE, -1);
|
||||
final Playable playable = intent.getParcelableExtra(EXTRA_PLAYABLE);
|
||||
if (keycode == -1 && playable == null) {
|
||||
@ -283,14 +277,12 @@ public class PlaybackService extends Service {
|
||||
}
|
||||
|
||||
if ((flags & Service.START_FLAG_REDELIVERY) != 0) {
|
||||
if (BuildConfig.DEBUG)
|
||||
Log.d(TAG, "onStartCommand is a redelivered intent, calling stopForeground now.");
|
||||
Log.d(TAG, "onStartCommand is a redelivered intent, calling stopForeground now.");
|
||||
stopForeground(true);
|
||||
} else {
|
||||
|
||||
if (keycode != -1) {
|
||||
if (BuildConfig.DEBUG)
|
||||
Log.d(TAG, "Received media button event");
|
||||
Log.d(TAG, "Received media button event");
|
||||
handleKeycode(keycode);
|
||||
} else {
|
||||
started = true;
|
||||
@ -310,8 +302,7 @@ public class PlaybackService extends Service {
|
||||
* Handles media button events
|
||||
*/
|
||||
private void handleKeycode(int keycode) {
|
||||
if (BuildConfig.DEBUG)
|
||||
Log.d(TAG, "Handling keycode: " + keycode);
|
||||
Log.d(TAG, "Handling keycode: " + keycode);
|
||||
final PlaybackServiceMediaPlayer.PSMPInfo info = mediaPlayer.getPSMPInfo();
|
||||
final PlayerStatus status = info.playerStatus;
|
||||
switch (keycode) {
|
||||
@ -381,8 +372,7 @@ public class PlaybackService extends Service {
|
||||
* mediaplayer.
|
||||
*/
|
||||
public void setVideoSurface(SurfaceHolder sh) {
|
||||
if (BuildConfig.DEBUG)
|
||||
Log.d(TAG, "Setting display");
|
||||
Log.d(TAG, "Setting display");
|
||||
mediaPlayer.setVideoSurface(sh);
|
||||
}
|
||||
|
||||
@ -465,22 +455,6 @@ public class PlaybackService extends Service {
|
||||
.build();
|
||||
GpodnetPreferences.enqueueEpisodeAction(action);
|
||||
}
|
||||
|
||||
// if episode is near end [outro playing]:
|
||||
// mark as read, remove from queue, add to playlist history
|
||||
// auto delete: see {@link de.danoeh.antennapod.activity.MediaPlayerActivity#onStop()}
|
||||
if (playable instanceof FeedMedia) {
|
||||
FeedMedia media = (FeedMedia) playable;
|
||||
if(media.hasAlmostEnded()) {
|
||||
FeedItem item = media.getItem();
|
||||
Log.d(TAG, "smart mark as read");
|
||||
DBWriter.markItemRead(PlaybackService.this, item, true, false);
|
||||
DBWriter.removeQueueItem(PlaybackService.this, item.getId(), false);
|
||||
DBWriter.addItemToPlaybackHistory(PlaybackService.this, media);
|
||||
// episode should already be flattered, no action required
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case STOPPED:
|
||||
@ -489,10 +463,8 @@ public class PlaybackService extends Service {
|
||||
break;
|
||||
|
||||
case PLAYING:
|
||||
if (BuildConfig.DEBUG)
|
||||
Log.d(TAG, "Audiofocus successfully requested");
|
||||
if (BuildConfig.DEBUG)
|
||||
Log.d(TAG, "Resuming/Starting playback");
|
||||
Log.d(TAG, "Audiofocus successfully requested");
|
||||
Log.d(TAG, "Resuming/Starting playback");
|
||||
|
||||
taskManager.startPositionSaver();
|
||||
taskManager.startWidgetUpdater();
|
||||
@ -574,8 +546,7 @@ public class PlaybackService extends Service {
|
||||
};
|
||||
|
||||
private void endPlayback(boolean playNextEpisode) {
|
||||
if (BuildConfig.DEBUG)
|
||||
Log.d(TAG, "Playback ended");
|
||||
Log.d(TAG, "Playback ended");
|
||||
|
||||
final Playable playable = mediaPlayer.getPSMPInfo().playable;
|
||||
if (playable == null) {
|
||||
@ -602,7 +573,7 @@ public class PlaybackService extends Service {
|
||||
// isInQueue remains false
|
||||
}
|
||||
if (isInQueue) {
|
||||
DBWriter.removeQueueItem(PlaybackService.this, item.getId(), true);
|
||||
DBWriter.removeQueueItem(PlaybackService.this, item, true);
|
||||
}
|
||||
DBWriter.addItemToPlaybackHistory(PlaybackService.this, media);
|
||||
|
||||
@ -643,8 +614,7 @@ public class PlaybackService extends Service {
|
||||
UserPreferences.isFollowQueue();
|
||||
|
||||
if (loadNextItem) {
|
||||
if (BuildConfig.DEBUG)
|
||||
Log.d(TAG, "Loading next item in queue");
|
||||
Log.d(TAG, "Loading next item in queue");
|
||||
nextMedia = nextItem.getMedia();
|
||||
}
|
||||
final boolean prepareImmediately;
|
||||
@ -770,8 +740,7 @@ public class PlaybackService extends Service {
|
||||
}
|
||||
|
||||
private void writePlayerStatusPlaybackPreferences() {
|
||||
if (BuildConfig.DEBUG)
|
||||
Log.d(TAG, "Writing player status playback preferences");
|
||||
Log.d(TAG, "Writing player status playback preferences");
|
||||
|
||||
SharedPreferences.Editor editor = PreferenceManager
|
||||
.getDefaultSharedPreferences(getApplicationContext()).edit();
|
||||
@ -820,8 +789,7 @@ public class PlaybackService extends Service {
|
||||
|
||||
@Override
|
||||
protected Void doInBackground(Void... params) {
|
||||
if (BuildConfig.DEBUG)
|
||||
Log.d(TAG, "Starting background work");
|
||||
Log.d(TAG, "Starting background work");
|
||||
if (android.os.Build.VERSION.SDK_INT >= 11) {
|
||||
if (info.playable != null) {
|
||||
try {
|
||||
@ -931,8 +899,7 @@ public class PlaybackService extends Service {
|
||||
notification = notificationBuilder.build();
|
||||
}
|
||||
startForeground(NOTIFICATION_ID, notification);
|
||||
if (BuildConfig.DEBUG)
|
||||
Log.d(TAG, "Notification set up");
|
||||
Log.d(TAG, "Notification set up");
|
||||
}
|
||||
}
|
||||
|
||||
@ -958,8 +925,7 @@ public class PlaybackService extends Service {
|
||||
float playbackSpeed = getCurrentPlaybackSpeed();
|
||||
final Playable playable = mediaPlayer.getPSMPInfo().playable;
|
||||
if (position != INVALID_TIME && duration != INVALID_TIME && playable != null) {
|
||||
if (BuildConfig.DEBUG)
|
||||
Log.d(TAG, "Saving current position to " + position);
|
||||
Log.d(TAG, "Saving current position to " + position);
|
||||
if (updatePlayedDuration && playable instanceof FeedMedia) {
|
||||
FeedMedia media = (FeedMedia) playable;
|
||||
FeedItem item = media.getItem();
|
||||
@ -968,8 +934,7 @@ public class PlaybackService extends Service {
|
||||
if (isAutoFlattrable(media) &&
|
||||
(media.getPlayedDuration() > UserPreferences.getAutoFlattrPlayedDurationThreshold() * duration)) {
|
||||
|
||||
if (BuildConfig.DEBUG)
|
||||
Log.d(TAG, "saveCurrentPosition: performing auto flattr since played duration " + Integer.toString(media.getPlayedDuration())
|
||||
Log.d(TAG, "saveCurrentPosition: performing auto flattr since played duration " + Integer.toString(media.getPlayedDuration())
|
||||
+ " is " + UserPreferences.getAutoFlattrPlayedDurationThreshold() * 100 + "% of file duration " + Integer.toString(duration));
|
||||
DBTasks.flattrItemIfLoggedIn(this, item);
|
||||
}
|
||||
@ -1062,8 +1027,7 @@ public class PlaybackService extends Service {
|
||||
|
||||
editor.apply();
|
||||
}
|
||||
if (BuildConfig.DEBUG)
|
||||
Log.d(TAG, "RemoteControlClient state was refreshed");
|
||||
Log.d(TAG, "RemoteControlClient state was refreshed");
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1106,15 +1070,12 @@ public class PlaybackService extends Service {
|
||||
if (StringUtils.equals(intent.getAction(), Intent.ACTION_HEADSET_PLUG)) {
|
||||
int state = intent.getIntExtra("state", -1);
|
||||
if (state != -1) {
|
||||
if (BuildConfig.DEBUG)
|
||||
Log.d(TAG, "Headset plug event. State is " + state);
|
||||
Log.d(TAG, "Headset plug event. State is " + state);
|
||||
if (state == UNPLUGGED) {
|
||||
if (BuildConfig.DEBUG)
|
||||
Log.d(TAG, "Headset was unplugged during playback.");
|
||||
Log.d(TAG, "Headset was unplugged during playback.");
|
||||
pauseIfPauseOnDisconnect();
|
||||
} else if (state == PLUGGED) {
|
||||
if (BuildConfig.DEBUG)
|
||||
Log.d(TAG, "Headset was plugged in during playback.");
|
||||
Log.d(TAG, "Headset was plugged in during playback.");
|
||||
unpauseIfPauseOnDisconnect();
|
||||
}
|
||||
} else {
|
||||
@ -1131,8 +1092,7 @@ public class PlaybackService extends Service {
|
||||
int state = intent.getIntExtra(AudioManager.EXTRA_SCO_AUDIO_STATE, -1);
|
||||
int prevState = intent.getIntExtra(AudioManager.EXTRA_SCO_AUDIO_PREVIOUS_STATE, -1);
|
||||
if (state == AudioManager.SCO_AUDIO_STATE_CONNECTED) {
|
||||
if (BuildConfig.DEBUG)
|
||||
Log.d(TAG, "Received bluetooth connection intent");
|
||||
Log.d(TAG, "Received bluetooth connection intent");
|
||||
unpauseIfPauseOnDisconnect();
|
||||
}
|
||||
}
|
||||
@ -1144,8 +1104,7 @@ public class PlaybackService extends Service {
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
// sound is about to change, eg. bluetooth -> speaker
|
||||
if (BuildConfig.DEBUG)
|
||||
Log.d(TAG, "Pausing playback because audio is becoming noisy");
|
||||
Log.d(TAG, "Pausing playback because audio is becoming noisy");
|
||||
pauseIfPauseOnDisconnect();
|
||||
}
|
||||
// android.media.AUDIO_BECOMING_NOISY
|
||||
@ -1191,8 +1150,7 @@ public class PlaybackService extends Service {
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
if (StringUtils.equals(intent.getAction(), ACTION_SKIP_CURRENT_EPISODE)) {
|
||||
if (BuildConfig.DEBUG)
|
||||
Log.d(TAG, "Received SKIP_CURRENT_EPISODE intent");
|
||||
Log.d(TAG, "Received SKIP_CURRENT_EPISODE intent");
|
||||
mediaPlayer.endPlayback();
|
||||
}
|
||||
}
|
||||
@ -1202,8 +1160,7 @@ public class PlaybackService extends Service {
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
if (StringUtils.equals(intent.getAction(), ACTION_RESUME_PLAY_CURRENT_EPISODE)) {
|
||||
if (BuildConfig.DEBUG)
|
||||
Log.d(TAG, "Received RESUME_PLAY_CURRENT_EPISODE intent");
|
||||
Log.d(TAG, "Received RESUME_PLAY_CURRENT_EPISODE intent");
|
||||
mediaPlayer.resume();
|
||||
}
|
||||
}
|
||||
@ -1213,8 +1170,7 @@ public class PlaybackService extends Service {
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
if (StringUtils.equals(intent.getAction(), ACTION_PAUSE_PLAY_CURRENT_EPISODE)) {
|
||||
if (BuildConfig.DEBUG)
|
||||
Log.d(TAG, "Received PAUSE_PLAY_CURRENT_EPISODE intent");
|
||||
Log.d(TAG, "Received PAUSE_PLAY_CURRENT_EPISODE intent");
|
||||
mediaPlayer.pause(false, false);
|
||||
}
|
||||
}
|
||||
|
@ -5,14 +5,21 @@ import android.util.Log;
|
||||
|
||||
import org.apache.commons.lang3.Validate;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.concurrent.Callable;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.concurrent.Future;
|
||||
import java.util.concurrent.ScheduledFuture;
|
||||
import java.util.concurrent.ScheduledThreadPoolExecutor;
|
||||
import java.util.concurrent.ThreadFactory;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import de.danoeh.antennapod.core.BuildConfig;
|
||||
import de.danoeh.antennapod.core.feed.EventDistributor;
|
||||
import de.danoeh.antennapod.core.feed.FeedItem;
|
||||
import de.danoeh.antennapod.core.feed.QueueEvent;
|
||||
import de.danoeh.antennapod.core.storage.DBReader;
|
||||
import de.danoeh.antennapod.core.util.playback.Playable;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.concurrent.*;
|
||||
import de.greenrobot.event.EventBus;
|
||||
|
||||
/**
|
||||
* Manages the background tasks of PlaybackSerivce, i.e.
|
||||
|
@ -12,7 +12,7 @@ import java.util.concurrent.ExecutionException;
|
||||
|
||||
import de.danoeh.antennapod.core.feed.FeedItem;
|
||||
import de.danoeh.antennapod.core.preferences.UserPreferences;
|
||||
import de.danoeh.antennapod.core.util.QueueAccess;
|
||||
import de.danoeh.antennapod.core.util.LongList;
|
||||
|
||||
/**
|
||||
* Implementation of the EpisodeCleanupAlgorithm interface used by AntennaPod.
|
||||
@ -24,7 +24,7 @@ public class APCleanupAlgorithm implements EpisodeCleanupAlgorithm<Integer> {
|
||||
public int performCleanup(Context context, Integer episodeNumber) {
|
||||
List<FeedItem> candidates = new ArrayList<FeedItem>();
|
||||
List<FeedItem> downloadedItems = DBReader.getDownloadedItems(context);
|
||||
QueueAccess queue = QueueAccess.IDListAccess(DBReader.getQueueIDList(context));
|
||||
LongList queue = DBReader.getQueueIDList(context);
|
||||
List<FeedItem> delete;
|
||||
for (FeedItem item : downloadedItems) {
|
||||
if (item.hasMedia() && item.getMedia().isDownloaded()
|
||||
|
@ -21,6 +21,7 @@ import de.danoeh.antennapod.core.feed.SimpleChapter;
|
||||
import de.danoeh.antennapod.core.feed.VorbisCommentChapter;
|
||||
import de.danoeh.antennapod.core.service.download.DownloadStatus;
|
||||
import de.danoeh.antennapod.core.util.DownloadError;
|
||||
import de.danoeh.antennapod.core.util.LongList;
|
||||
import de.danoeh.antennapod.core.util.comparator.DownloadStatusComparator;
|
||||
import de.danoeh.antennapod.core.util.comparator.FeedItemPubdateComparator;
|
||||
import de.danoeh.antennapod.core.util.comparator.PlaybackCompletionDateComparator;
|
||||
@ -338,8 +339,7 @@ public final class DBReader {
|
||||
}
|
||||
|
||||
static List<FeedItem> getQueue(Context context, PodDBAdapter adapter) {
|
||||
if (BuildConfig.DEBUG)
|
||||
Log.d(TAG, "Extracting queue");
|
||||
Log.d(TAG, "getQueue()");
|
||||
|
||||
Cursor itemlistCursor = adapter.getQueueCursor();
|
||||
List<FeedItem> items = extractItemlistFromCursor(adapter,
|
||||
@ -358,21 +358,21 @@ public final class DBReader {
|
||||
* @return A list of IDs sorted by the same order as the queue. The caller can wrap the returned
|
||||
* list in a {@link de.danoeh.antennapod.core.util.QueueAccess} object for easier access to the queue's properties.
|
||||
*/
|
||||
public static List<Long> getQueueIDList(Context context) {
|
||||
public static LongList getQueueIDList(Context context) {
|
||||
PodDBAdapter adapter = new PodDBAdapter(context);
|
||||
|
||||
adapter.open();
|
||||
List<Long> result = getQueueIDList(adapter);
|
||||
LongList result = getQueueIDList(adapter);
|
||||
adapter.close();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static List<Long> getQueueIDList(PodDBAdapter adapter) {
|
||||
static LongList getQueueIDList(PodDBAdapter adapter) {
|
||||
adapter.open();
|
||||
Cursor queueCursor = adapter.getQueueIDCursor();
|
||||
|
||||
List<Long> queueIds = new ArrayList<Long>(queueCursor.getCount());
|
||||
LongList queueIds = new LongList(queueCursor.getCount());
|
||||
if (queueCursor.moveToFirst()) {
|
||||
do {
|
||||
queueIds.add(queueCursor.getLong(0));
|
||||
@ -382,6 +382,22 @@ public final class DBReader {
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Return the size of the queue.
|
||||
*
|
||||
* @param context A context that is used for opening a database connection.
|
||||
* @return Size of the queue.
|
||||
*/
|
||||
public static int getQueueSize(Context context) {
|
||||
Log.d(TAG, "getQueueSize()");
|
||||
|
||||
PodDBAdapter adapter = new PodDBAdapter(context);
|
||||
adapter.open();
|
||||
int size = adapter.getQueueSize();
|
||||
adapter.close();
|
||||
return size;
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads a list of the FeedItems in the queue. If the FeedItems of the queue are not used directly, consider using
|
||||
* {@link #getQueueIDList(android.content.Context)} instead.
|
||||
@ -391,8 +407,7 @@ public final class DBReader {
|
||||
* list in a {@link de.danoeh.antennapod.core.util.QueueAccess} object for easier access to the queue's properties.
|
||||
*/
|
||||
public static List<FeedItem> getQueue(Context context) {
|
||||
if (BuildConfig.DEBUG)
|
||||
Log.d(TAG, "Extracting queue");
|
||||
Log.d(TAG, "getQueue()");
|
||||
|
||||
PodDBAdapter adapter = new PodDBAdapter(context);
|
||||
adapter.open();
|
||||
|
@ -34,7 +34,7 @@ import de.danoeh.antennapod.core.service.GpodnetSyncService;
|
||||
import de.danoeh.antennapod.core.service.download.DownloadStatus;
|
||||
import de.danoeh.antennapod.core.service.playback.PlaybackService;
|
||||
import de.danoeh.antennapod.core.util.DownloadError;
|
||||
import de.danoeh.antennapod.core.util.QueueAccess;
|
||||
import de.danoeh.antennapod.core.util.LongList;
|
||||
import de.danoeh.antennapod.core.util.comparator.FeedItemPubdateComparator;
|
||||
import de.danoeh.antennapod.core.util.exception.MediaFileNotFoundException;
|
||||
import de.danoeh.antennapod.core.util.flattr.FlattrUtils;
|
||||
@ -524,8 +524,8 @@ public final class DBTasks {
|
||||
* @param feedItemId ID of the FeedItem
|
||||
*/
|
||||
public static boolean isInQueue(Context context, final long feedItemId) {
|
||||
List<Long> queue = DBReader.getQueueIDList(context);
|
||||
return QueueAccess.IDListAccess(queue).contains(feedItemId);
|
||||
LongList queue = DBReader.getQueueIDList(context);
|
||||
return queue.contains(feedItemId);
|
||||
}
|
||||
|
||||
private static Feed searchFeedByIdentifyingValueOrID(Context context, PodDBAdapter adapter,
|
||||
|
@ -33,17 +33,19 @@ import de.danoeh.antennapod.core.feed.FeedImage;
|
||||
import de.danoeh.antennapod.core.feed.FeedItem;
|
||||
import de.danoeh.antennapod.core.feed.FeedMedia;
|
||||
import de.danoeh.antennapod.core.feed.FeedPreferences;
|
||||
import de.danoeh.antennapod.core.feed.QueueEvent;
|
||||
import de.danoeh.antennapod.core.gpoddernet.model.GpodnetEpisodeAction;
|
||||
import de.danoeh.antennapod.core.gpoddernet.model.GpodnetEpisodeAction.Action;
|
||||
import de.danoeh.antennapod.core.preferences.GpodnetPreferences;
|
||||
import de.danoeh.antennapod.core.preferences.PlaybackPreferences;
|
||||
import de.danoeh.antennapod.core.preferences.UserPreferences;
|
||||
import de.danoeh.antennapod.core.service.download.DownloadStatus;
|
||||
import de.danoeh.antennapod.core.service.playback.PlaybackService;
|
||||
import de.danoeh.antennapod.core.util.LongList;
|
||||
import de.danoeh.antennapod.core.util.QueueAccess;
|
||||
import de.danoeh.antennapod.core.util.flattr.FlattrStatus;
|
||||
import de.danoeh.antennapod.core.util.flattr.FlattrThing;
|
||||
import de.danoeh.antennapod.core.util.flattr.SimpleFlattrThing;
|
||||
import de.greenrobot.event.EventBus;
|
||||
|
||||
/**
|
||||
* Provides methods for writing data to AntennaPod's database.
|
||||
@ -126,16 +128,15 @@ public class DBWriter {
|
||||
// Gpodder: queue delete action for synchronization
|
||||
if(GpodnetPreferences.loggedIn()) {
|
||||
FeedItem item = media.getItem();
|
||||
GpodnetEpisodeAction action = new GpodnetEpisodeAction.Builder(item, Action.DELETE)
|
||||
GpodnetEpisodeAction action = new GpodnetEpisodeAction.Builder(item, GpodnetEpisodeAction.Action.DELETE)
|
||||
.currentDeviceId()
|
||||
.currentTimestamp()
|
||||
.build();
|
||||
GpodnetPreferences.enqueueEpisodeAction(action);
|
||||
}
|
||||
}
|
||||
if (BuildConfig.DEBUG)
|
||||
Log.d(TAG, "Deleting File. Result: " + result);
|
||||
EventDistributor.getInstance().sendQueueUpdateBroadcast();
|
||||
Log.d(TAG, "Deleting File. Result: " + result);
|
||||
EventBus.getDefault().post(new QueueEvent(QueueEvent.Action.DELETED_MEDIA, media.getItem()));
|
||||
EventDistributor.getInstance().sendUnreadItemsUpdateBroadcast();
|
||||
}
|
||||
}
|
||||
@ -370,8 +371,7 @@ public class DBWriter {
|
||||
}
|
||||
if (queueModified) {
|
||||
adapter.setQueue(queue);
|
||||
EventDistributor.getInstance()
|
||||
.sendQueueUpdateBroadcast();
|
||||
EventBus.getDefault().post(new QueueEvent(QueueEvent.Action.ADDED, item, index));
|
||||
}
|
||||
if (unreadItemsModified && item != null) {
|
||||
adapter.setSingleFeedItem(item);
|
||||
@ -439,8 +439,7 @@ public class DBWriter {
|
||||
}
|
||||
if (queueModified) {
|
||||
adapter.setQueue(queue);
|
||||
EventDistributor.getInstance()
|
||||
.sendQueueUpdateBroadcast();
|
||||
EventBus.getDefault().post(new QueueEvent(QueueEvent.Action.ADDED_ITEMS, queue));
|
||||
}
|
||||
if (unreadItemsModified) {
|
||||
adapter.setFeedItemlist(itemsToSave);
|
||||
@ -471,7 +470,7 @@ public class DBWriter {
|
||||
adapter.clearQueue();
|
||||
adapter.close();
|
||||
|
||||
EventDistributor.getInstance().sendQueueUpdateBroadcast();
|
||||
EventBus.getDefault().post(new QueueEvent(QueueEvent.Action.CLEARED));
|
||||
}
|
||||
});
|
||||
}
|
||||
@ -480,11 +479,11 @@ public class DBWriter {
|
||||
* Removes a FeedItem object from the queue.
|
||||
*
|
||||
* @param context A context that is used for opening a database connection.
|
||||
* @param itemId ID of the FeedItem that should be removed.
|
||||
* @param item FeedItem that should be removed.
|
||||
* @param performAutoDownload true if an auto-download process should be started after the operation.
|
||||
*/
|
||||
public static Future<?> removeQueueItem(final Context context,
|
||||
final long itemId, final boolean performAutoDownload) {
|
||||
final FeedItem item, final boolean performAutoDownload) {
|
||||
return dbExec.submit(new Runnable() {
|
||||
|
||||
@Override
|
||||
@ -498,16 +497,14 @@ public class DBWriter {
|
||||
if (queue != null) {
|
||||
boolean queueModified = false;
|
||||
QueueAccess queueAccess = QueueAccess.ItemListAccess(queue);
|
||||
if (queueAccess.contains(itemId)) {
|
||||
item = DBReader.getFeedItem(context, itemId);
|
||||
if (queueAccess.contains(item.getId())) {
|
||||
if (item != null) {
|
||||
queueModified = queueAccess.remove(itemId);
|
||||
queueModified = queueAccess.remove(item.getId());
|
||||
}
|
||||
}
|
||||
if (queueModified) {
|
||||
adapter.setQueue(queue);
|
||||
EventDistributor.getInstance()
|
||||
.sendQueueUpdateBroadcast();
|
||||
EventBus.getDefault().post(new QueueEvent(QueueEvent.Action.REMOVED, item));
|
||||
} else {
|
||||
Log.w(TAG, "Queue was not modified by call to removeQueueItem");
|
||||
}
|
||||
@ -535,16 +532,13 @@ public class DBWriter {
|
||||
return dbExec.submit(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
List<Long> queueIdList = DBReader.getQueueIDList(context);
|
||||
int currentLocation = 0;
|
||||
for (long id : queueIdList) {
|
||||
if (id == itemId) {
|
||||
moveQueueItemHelper(context, currentLocation, 0, broadcastUpdate);
|
||||
return;
|
||||
}
|
||||
currentLocation++;
|
||||
LongList queueIdList = DBReader.getQueueIDList(context);
|
||||
int index = queueIdList.indexOf(itemId);
|
||||
if (index >=0) {
|
||||
moveQueueItemHelper(context, index, 0, broadcastUpdate);
|
||||
} else {
|
||||
Log.e(TAG, "moveQueueItemToTop: item not found");
|
||||
}
|
||||
Log.e(TAG, "moveQueueItemToTop: item not found");
|
||||
}
|
||||
});
|
||||
}
|
||||
@ -562,17 +556,14 @@ public class DBWriter {
|
||||
return dbExec.submit(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
List<Long> queueIdList = DBReader.getQueueIDList(context);
|
||||
int currentLocation = 0;
|
||||
for (long id : queueIdList) {
|
||||
if (id == itemId) {
|
||||
moveQueueItemHelper(context, currentLocation, queueIdList.size() - 1,
|
||||
broadcastUpdate);
|
||||
return;
|
||||
}
|
||||
currentLocation++;
|
||||
LongList queueIdList = DBReader.getQueueIDList(context);
|
||||
int index = queueIdList.indexOf(itemId);
|
||||
if(index >= 0) {
|
||||
moveQueueItemHelper(context, index, queueIdList.size() - 1,
|
||||
broadcastUpdate);
|
||||
} else {
|
||||
Log.e(TAG, "moveQueueItemToBottom: item not found");
|
||||
}
|
||||
Log.e(TAG, "moveQueueItemToBottom: item not found");
|
||||
}
|
||||
});
|
||||
}
|
||||
@ -626,8 +617,8 @@ public class DBWriter {
|
||||
|
||||
adapter.setQueue(queue);
|
||||
if (broadcastUpdate) {
|
||||
EventDistributor.getInstance()
|
||||
.sendQueueUpdateBroadcast();
|
||||
EventBus.getDefault().post(new QueueEvent(QueueEvent.Action.REMOVED, item));
|
||||
EventBus.getDefault().post(new QueueEvent(QueueEvent.Action.ADDED, item, to));
|
||||
}
|
||||
|
||||
}
|
||||
@ -1036,8 +1027,7 @@ public class DBWriter {
|
||||
Collections.sort(queue, comparator);
|
||||
adapter.setQueue(queue);
|
||||
if (broadcastUpdate) {
|
||||
EventDistributor.getInstance()
|
||||
.sendQueueUpdateBroadcast();
|
||||
EventBus.getDefault().post(new QueueEvent(QueueEvent.Action.SORTED));
|
||||
}
|
||||
} else {
|
||||
Log.e(TAG, "sortQueue: Could not load queue");
|
||||
|
241
core/src/main/java/de/danoeh/antennapod/core/util/LongList.java
Normal file
241
core/src/main/java/de/danoeh/antennapod/core/util/LongList.java
Normal file
@ -0,0 +1,241 @@
|
||||
package de.danoeh.antennapod.core.util;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
/**
|
||||
* Fast and memory efficient long list
|
||||
*/
|
||||
public final class LongList {
|
||||
|
||||
private long[] values;
|
||||
private int size;
|
||||
|
||||
/**
|
||||
* Constructs an empty instance with a default initial capacity.
|
||||
*/
|
||||
public LongList() {
|
||||
this(4);
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs an empty instance.
|
||||
*
|
||||
* @param initialCapacity {@code >= 0;} initial capacity of the list
|
||||
*/
|
||||
public LongList(int initialCapacity) {
|
||||
if(initialCapacity < 0) {
|
||||
throw new IllegalArgumentException("initial capacity must be 0 or higher");
|
||||
}
|
||||
values = new long[initialCapacity];
|
||||
size = 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
Arrays.hashCode(values);
|
||||
int hashCode = 1;
|
||||
for (int i = 0; i < size; i++) {
|
||||
long value = values[i];
|
||||
hashCode = 31 * hashCode + (int)(value ^ (value >>> 32));
|
||||
}
|
||||
return hashCode;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object other) {
|
||||
if (other == this) {
|
||||
return true;
|
||||
}
|
||||
if (! (other instanceof LongList)) {
|
||||
return false;
|
||||
}
|
||||
LongList otherList = (LongList) other;
|
||||
if (size != otherList.size) {
|
||||
return false;
|
||||
}
|
||||
for (int i = 0; i < size; i++) {
|
||||
if (values[i] != otherList.values[i]) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
StringBuffer sb = new StringBuffer(size * 5 + 10);
|
||||
sb.append("LongList{");
|
||||
for (int i = 0; i < size; i++) {
|
||||
if (i != 0) {
|
||||
sb.append(", ");
|
||||
}
|
||||
sb.append(values[i]);
|
||||
}
|
||||
sb.append("}");
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the number of elements in this list.
|
||||
*/
|
||||
public int size() {
|
||||
return size;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the indicated value.
|
||||
*
|
||||
* @param n {@code >= 0, < size();} which element
|
||||
* @return the indicated element's value
|
||||
*/
|
||||
public long get(int n) {
|
||||
if (n >= size) {
|
||||
throw new IndexOutOfBoundsException("n >= size()");
|
||||
} else if(n < 0) {
|
||||
throw new IndexOutOfBoundsException("n < 0");
|
||||
}
|
||||
return values[n];
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the value at the given index.
|
||||
*
|
||||
* @param index the index at which to put the specified object.
|
||||
* @param value the object to add.
|
||||
* @return the previous element at the index.
|
||||
*/
|
||||
public long set(int index, long value) {
|
||||
if (index >= size) {
|
||||
throw new IndexOutOfBoundsException("n >= size()");
|
||||
} else if(index < 0) {
|
||||
throw new IndexOutOfBoundsException("n < 0");
|
||||
}
|
||||
long result = values[index];
|
||||
values[index] = value;
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds an element to the end of the list. This will increase the
|
||||
* list's capacity if necessary.
|
||||
*
|
||||
* @param value the value to add
|
||||
*/
|
||||
public void add(long value) {
|
||||
growIfNeeded();
|
||||
values[size++] = value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Inserts element into specified index, moving elements at and above
|
||||
* that index up one. May not be used to insert at an index beyond the
|
||||
* current size (that is, insertion as a last element is legal but
|
||||
* no further).
|
||||
*
|
||||
* @param n {@code >= 0, <=size();} index of where to insert
|
||||
* @param value value to insert
|
||||
*/
|
||||
public void insert(int n, int value) {
|
||||
if (n > size) {
|
||||
throw new IndexOutOfBoundsException("n > size()");
|
||||
} else if(n < 0) {
|
||||
throw new IndexOutOfBoundsException("n < 0");
|
||||
}
|
||||
|
||||
growIfNeeded();
|
||||
|
||||
System.arraycopy (values, n, values, n+1, size - n);
|
||||
values[n] = value;
|
||||
size++;
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes value from this list.
|
||||
*
|
||||
* @param value value to remove
|
||||
* return {@code true} if the value was removed, {@code false} otherwise
|
||||
*/
|
||||
public boolean remove(long value) {
|
||||
for (int i = 0; i < size; i++) {
|
||||
if (values[i] == value) {
|
||||
size--;
|
||||
System.arraycopy(values, i+1, values, i, size-i);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes an element at a given index, shifting elements at greater
|
||||
* indicies down one.
|
||||
*
|
||||
* @param index index of element to remove
|
||||
*/
|
||||
public void removeIndex(int index) {
|
||||
if (index >= size) {
|
||||
throw new IndexOutOfBoundsException("n >= size()");
|
||||
} else if(index < 0) {
|
||||
throw new IndexOutOfBoundsException("n < 0");
|
||||
}
|
||||
size--;
|
||||
System.arraycopy (values, index + 1, values, index, size - index);
|
||||
}
|
||||
|
||||
/**
|
||||
* Increases size of array if needed
|
||||
*/
|
||||
private void growIfNeeded() {
|
||||
if (size == values.length) {
|
||||
// Resize.
|
||||
long[] newArray = new long[size * 3 / 2 + 10];
|
||||
System.arraycopy(values, 0, newArray, 0, size);
|
||||
values = newArray;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the index of the given value, or -1 if the value does not
|
||||
* appear in the list.
|
||||
*
|
||||
* @param value value to find
|
||||
* @return index of value or -1
|
||||
*/
|
||||
public int indexOf(long value) {
|
||||
for (int i = 0; i < size; i++) {
|
||||
if (values[i] == value) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes all values from this list.
|
||||
*/
|
||||
public void clear() {
|
||||
values = new long[4];
|
||||
size = 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns true if the given value is contained in the list
|
||||
*
|
||||
* @param value value to look for
|
||||
* @return {@code true} if this list contains {@code value}, {@code false} otherwise
|
||||
*/
|
||||
public boolean contains(long value) {
|
||||
return indexOf(value) >= 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an array with a copy of this list's values
|
||||
*
|
||||
* @return array with a copy of this list's values
|
||||
*/
|
||||
public long[] toArray() {
|
||||
return Arrays.copyOf(values, size);
|
||||
|
||||
}
|
||||
}
|
@ -1,10 +1,10 @@
|
||||
package de.danoeh.antennapod.core.util;
|
||||
|
||||
import de.danoeh.antennapod.core.feed.FeedItem;
|
||||
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
import de.danoeh.antennapod.core.feed.FeedItem;
|
||||
|
||||
/**
|
||||
* Provides methods for accessing the queue. It is possible to load only a part of the information about the queue that
|
||||
* is stored in the database (e.g. sometimes the user just has to test if a specific item is contained in the List.
|
||||
@ -25,23 +25,6 @@ public abstract class QueueAccess {
|
||||
public abstract boolean remove(long id);
|
||||
|
||||
private QueueAccess() {
|
||||
|
||||
}
|
||||
|
||||
public static QueueAccess IDListAccess(final List<Long> ids) {
|
||||
return new QueueAccess() {
|
||||
@Override
|
||||
public boolean contains(long id) {
|
||||
return (ids != null) && ids.contains(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean remove(long id) {
|
||||
return ids.remove(id);
|
||||
}
|
||||
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
public static QueueAccess ItemListAccess(final List<FeedItem> items) {
|
||||
|
@ -1,7 +1,13 @@
|
||||
package de.danoeh.antennapod.core.util.playback;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.*;
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.content.ServiceConnection;
|
||||
import android.content.SharedPreferences;
|
||||
import android.content.res.TypedArray;
|
||||
import android.media.MediaPlayer;
|
||||
import android.os.AsyncTask;
|
||||
@ -19,6 +25,13 @@ import android.widget.TextView;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.commons.lang3.Validate;
|
||||
|
||||
import java.util.concurrent.RejectedExecutionHandler;
|
||||
import java.util.concurrent.ScheduledFuture;
|
||||
import java.util.concurrent.ScheduledThreadPoolExecutor;
|
||||
import java.util.concurrent.ThreadFactory;
|
||||
import java.util.concurrent.ThreadPoolExecutor;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import de.danoeh.antennapod.core.BuildConfig;
|
||||
import de.danoeh.antennapod.core.R;
|
||||
import de.danoeh.antennapod.core.feed.Chapter;
|
||||
@ -33,8 +46,6 @@ import de.danoeh.antennapod.core.storage.DBTasks;
|
||||
import de.danoeh.antennapod.core.util.Converter;
|
||||
import de.danoeh.antennapod.core.util.playback.Playable.PlayableUtils;
|
||||
|
||||
import java.util.concurrent.*;
|
||||
|
||||
/**
|
||||
* Communicates with the playback service. GUI classes should use this class to
|
||||
* control playback instead of communicating with the PlaybackService directly.
|
||||
@ -118,8 +129,7 @@ public abstract class PlaybackController {
|
||||
* example in the activity's onStop() method.
|
||||
*/
|
||||
public void release() {
|
||||
if (BuildConfig.DEBUG)
|
||||
Log.d(TAG, "Releasing PlaybackController");
|
||||
Log.d(TAG, "Releasing PlaybackController");
|
||||
|
||||
try {
|
||||
activity.unregisterReceiver(statusUpdate);
|
||||
@ -177,7 +187,7 @@ public abstract class PlaybackController {
|
||||
boolean bound = false;
|
||||
if (!PlaybackService.started) {
|
||||
if (serviceIntent != null) {
|
||||
if (BuildConfig.DEBUG) Log.d(TAG, "Calling start service");
|
||||
Log.d(TAG, "Calling start service");
|
||||
activity.startService(serviceIntent);
|
||||
bound = activity.bindService(serviceIntent, mConnection, 0);
|
||||
} else {
|
||||
@ -186,14 +196,11 @@ public abstract class PlaybackController {
|
||||
handleStatus();
|
||||
}
|
||||
} else {
|
||||
if (BuildConfig.DEBUG)
|
||||
Log.d(TAG,
|
||||
"PlaybackService is running, trying to connect without start command.");
|
||||
Log.d(TAG, "PlaybackService is running, trying to connect without start command.");
|
||||
bound = activity.bindService(new Intent(activity,
|
||||
PlaybackService.class), mConnection, 0);
|
||||
}
|
||||
if (BuildConfig.DEBUG)
|
||||
Log.d(TAG, "Result for service binding: " + bound);
|
||||
Log.d(TAG, "Result for service binding: " + bound);
|
||||
}
|
||||
};
|
||||
intentLoader.execute();
|
||||
@ -272,8 +279,7 @@ public abstract class PlaybackController {
|
||||
.getService();
|
||||
if (!released) {
|
||||
queryService();
|
||||
if (BuildConfig.DEBUG)
|
||||
Log.d(TAG, "Connection to Service established");
|
||||
Log.d(TAG, "Connection to Service established");
|
||||
} else {
|
||||
Log.i(TAG, "Connection to playback service has been established, but controller has already been released");
|
||||
}
|
||||
@ -282,9 +288,7 @@ public abstract class PlaybackController {
|
||||
@Override
|
||||
public void onServiceDisconnected(ComponentName name) {
|
||||
playbackService = null;
|
||||
if (BuildConfig.DEBUG)
|
||||
Log.d(TAG, "Disconnected from Service");
|
||||
|
||||
Log.d(TAG, "Disconnected from Service");
|
||||
}
|
||||
};
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user