Implemented several DBTasks and DBWriter methods
This commit is contained in:
parent
e89f1a9b1f
commit
11fb858909
|
@ -4,5 +4,6 @@
|
||||||
<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
|
<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
|
||||||
<classpathentry kind="src" path="src"/>
|
<classpathentry kind="src" path="src"/>
|
||||||
<classpathentry kind="src" path="gen"/>
|
<classpathentry kind="src" path="gen"/>
|
||||||
|
<classpathentry kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/>
|
||||||
<classpathentry kind="output" path="bin/classes"/>
|
<classpathentry kind="output" path="bin/classes"/>
|
||||||
</classpath>
|
</classpath>
|
||||||
|
|
|
@ -291,6 +291,21 @@ public final class DBReader {
|
||||||
return items;
|
return items;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static long[] getUnreadItemIds(Context context) {
|
||||||
|
PodDBAdapter adapter = new PodDBAdapter(context);
|
||||||
|
adapter.open();
|
||||||
|
Cursor cursor = adapter.getUnreadItemIdsCursor();
|
||||||
|
long[] itemIds = new long[cursor.getCount()];
|
||||||
|
int i = 0;
|
||||||
|
if (cursor.moveToFirst()) {
|
||||||
|
do {
|
||||||
|
itemIds[i] = cursor.getLong(PodDBAdapter.KEY_ID_INDEX);
|
||||||
|
i++;
|
||||||
|
} while (cursor.moveToNext());
|
||||||
|
}
|
||||||
|
return itemIds;
|
||||||
|
}
|
||||||
|
|
||||||
public static List<FeedItem> getPlaybackHistory(final Context context) {
|
public static List<FeedItem> getPlaybackHistory(final Context context) {
|
||||||
if (AppConfig.DEBUG)
|
if (AppConfig.DEBUG)
|
||||||
Log.d(TAG, "Loading playback history");
|
Log.d(TAG, "Loading playback history");
|
||||||
|
|
|
@ -1,8 +1,17 @@
|
||||||
package de.danoeh.antennapod.storage;
|
package de.danoeh.antennapod.storage;
|
||||||
|
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.util.Log;
|
||||||
|
import de.danoeh.antennapod.AppConfig;
|
||||||
import de.danoeh.antennapod.feed.Feed;
|
import de.danoeh.antennapod.feed.Feed;
|
||||||
import de.danoeh.antennapod.feed.FeedItem;
|
import de.danoeh.antennapod.feed.FeedItem;
|
||||||
|
import de.danoeh.antennapod.feed.FeedMedia;
|
||||||
|
import de.danoeh.antennapod.service.PlaybackService;
|
||||||
|
import de.danoeh.antennapod.util.exception.MediaFileNotFoundException;
|
||||||
|
|
||||||
public final class DBTasks {
|
public final class DBTasks {
|
||||||
private static final String TAG = "DBTasks";
|
private static final String TAG = "DBTasks";
|
||||||
|
@ -10,20 +19,40 @@ public final class DBTasks {
|
||||||
private DBTasks() {
|
private DBTasks() {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void playMedia(final Context context, final long mediaId,
|
public static void playMedia(final Context context, final FeedMedia media,
|
||||||
boolean showPlayer, boolean startWhenPrepared, boolean shouldStream) {
|
boolean showPlayer, boolean startWhenPrepared, boolean shouldStream) {
|
||||||
|
try {
|
||||||
|
if (!shouldStream) {
|
||||||
|
if (media.fileExists() == false) {
|
||||||
|
throw new MediaFileNotFoundException(
|
||||||
|
"No episode was found at " + media.getFile_url(),
|
||||||
|
media);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void markItemRead(final Context context, final long itemId,
|
|
||||||
final boolean read, boolean resetMediaPosition) {
|
|
||||||
}
|
}
|
||||||
|
// Start playback Service
|
||||||
public static void markFeedRead(final Context context, final long feedId) {
|
Intent launchIntent = new Intent(context, PlaybackService.class);
|
||||||
|
launchIntent.putExtra(PlaybackService.EXTRA_PLAYABLE, media);
|
||||||
|
launchIntent.putExtra(PlaybackService.EXTRA_START_WHEN_PREPARED,
|
||||||
|
startWhenPrepared);
|
||||||
|
launchIntent.putExtra(PlaybackService.EXTRA_SHOULD_STREAM,
|
||||||
|
shouldStream);
|
||||||
|
launchIntent.putExtra(PlaybackService.EXTRA_PREPARE_IMMEDIATELY,
|
||||||
|
true);
|
||||||
|
context.startService(launchIntent);
|
||||||
|
if (showPlayer) {
|
||||||
|
// Launch Mediaplayer
|
||||||
|
context.startActivity(PlaybackService.getPlayerActivityIntent(
|
||||||
|
context, media));
|
||||||
|
}
|
||||||
|
DBWriter.addQueueItemAt(context, media.getItem().getId(), 0, false);
|
||||||
|
} catch (MediaFileNotFoundException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
if (media.isPlaying()) {
|
||||||
|
context.sendBroadcast(new Intent(
|
||||||
|
PlaybackService.ACTION_SHUTDOWN_PLAYBACK_SERVICE));
|
||||||
|
}
|
||||||
|
notifyMissingFeedMediaFile(context, media);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void markAllItemsRead(final Context context) {
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void refreshAllFeeds(final Context context) {
|
public static void refreshAllFeeds(final Context context) {
|
||||||
|
@ -37,19 +66,22 @@ public final class DBTasks {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void notifyMissingFeedMediaFile(final Context context,
|
public static void notifyMissingFeedMediaFile(final Context context,
|
||||||
final long mediaId) {
|
final FeedMedia media) {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void downloadAllItemsInQueue(final Context context) {}
|
public static void downloadAllItemsInQueue(final Context context) {
|
||||||
|
}
|
||||||
|
|
||||||
public static void refreshFeed(final Context context, final long feedId) {
|
public static void refreshFeed(final Context context, final long feedId) {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void downloadFeedItem(final Context context, long... itemIds) {}
|
public static void downloadFeedItem(final Context context, long... itemIds) {
|
||||||
|
}
|
||||||
|
|
||||||
static void downloadFeedItem(boolean performAutoCleanup,
|
static void downloadFeedItem(boolean performAutoCleanup,
|
||||||
final Context context, final long... itemIds)
|
final Context context, final long... itemIds)
|
||||||
throws DownloadRequestException {}
|
throws DownloadRequestException {
|
||||||
|
}
|
||||||
|
|
||||||
public static void autodownloadUndownloadedItems(Context context) {
|
public static void autodownloadUndownloadedItems(Context context) {
|
||||||
}
|
}
|
||||||
|
@ -58,20 +90,113 @@ public final class DBTasks {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void performAutoCleanup(final Context context) {}
|
public static void performAutoCleanup(final Context context) {
|
||||||
|
}
|
||||||
|
|
||||||
private static int performAutoCleanup(final Context context, final int episodeNumber) {
|
private static int performAutoCleanup(final Context context,
|
||||||
|
final int episodeNumber) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void enqueueAllNewItems(final Context context) {}
|
public static void enqueueAllNewItems(final Context context) {
|
||||||
|
long[] unreadItems = DBReader.getUnreadItemIds(context);
|
||||||
|
DBWriter.addQueueItem(context, unreadItems);
|
||||||
|
}
|
||||||
|
|
||||||
public static FeedItem getQueueSuccessorOfItem(final long itemId) {
|
public static FeedItem getQueueSuccessorOfItem(Context context,
|
||||||
|
final long itemId) {
|
||||||
|
FeedItem result = null;
|
||||||
|
List<FeedItem> queue = DBReader.getQueue(context);
|
||||||
|
if (queue != null) {
|
||||||
|
Iterator<FeedItem> iterator = queue.iterator();
|
||||||
|
while (iterator.hasNext()) {
|
||||||
|
FeedItem item = iterator.next();
|
||||||
|
if (item.getId() == itemId) {
|
||||||
|
if (iterator.hasNext()) {
|
||||||
|
result = iterator.next();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Feed searchFeedByIdentifyingValue(Context context,
|
||||||
|
String identifier) {
|
||||||
|
List<Feed> feeds = DBReader.getFeedList(context);
|
||||||
|
for (Feed feed : feeds) {
|
||||||
|
if (feed.getIdentifyingValue().equals(identifier)) {
|
||||||
|
return feed;
|
||||||
|
}
|
||||||
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Feed updateFeed(final Context context, final long feedId) {
|
/** Get a FeedItem by its identifying value. */
|
||||||
|
private static FeedItem searchFeedItemByIdentifyingValue(Feed feed,
|
||||||
|
String identifier) {
|
||||||
|
for (FeedItem item : feed.getItems()) {
|
||||||
|
if (item.getIdentifyingValue().equals(identifier)) {
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static synchronized Feed updateFeed(final Context context, final Feed newFeed) {
|
||||||
|
// Look up feed in the feedslist
|
||||||
|
final Feed savedFeed = searchFeedByIdentifyingValue(context,
|
||||||
|
newFeed.getIdentifyingValue());
|
||||||
|
if (savedFeed == null) {
|
||||||
|
if (AppConfig.DEBUG)
|
||||||
|
Log.d(TAG,
|
||||||
|
"Found no existing Feed with title "
|
||||||
|
+ newFeed.getTitle() + ". Adding as new one.");
|
||||||
|
// Add a new Feed
|
||||||
|
DBWriter.addNewFeed(context, newFeed);
|
||||||
|
return newFeed;
|
||||||
|
} else {
|
||||||
|
if (AppConfig.DEBUG)
|
||||||
|
Log.d(TAG, "Feed with title " + newFeed.getTitle()
|
||||||
|
+ " already exists. Syncing new with existing one.");
|
||||||
|
|
||||||
|
savedFeed.setItems(DBReader.getFeedItemList(context, savedFeed));
|
||||||
|
if (savedFeed.compareWithOther(newFeed)) {
|
||||||
|
if (AppConfig.DEBUG)
|
||||||
|
Log.d(TAG,
|
||||||
|
"Feed has updated attribute values. Updating old feed's attributes");
|
||||||
|
savedFeed.updateFromOther(newFeed);
|
||||||
|
}
|
||||||
|
// Look for new or updated Items
|
||||||
|
for (int idx = 0; idx < newFeed.getItems().size(); idx++) {
|
||||||
|
final FeedItem item = newFeed.getItems().get(idx);
|
||||||
|
FeedItem oldItem = searchFeedItemByIdentifyingValue(savedFeed,
|
||||||
|
item.getIdentifyingValue());
|
||||||
|
if (oldItem == null) {
|
||||||
|
// item is new
|
||||||
|
final int i = idx;
|
||||||
|
item.setFeed(savedFeed);
|
||||||
|
savedFeed.getItems().add(i, item);
|
||||||
|
DBWriter.markItemRead(context, item.getId(), false);
|
||||||
|
} else {
|
||||||
|
oldItem.updateFromOther(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// update attributes
|
||||||
|
savedFeed.setLastUpdate(newFeed.getLastUpdate());
|
||||||
|
savedFeed.setType(newFeed.getType());
|
||||||
|
DBWriter.setCompleteFeed(context, savedFeed);
|
||||||
|
new Thread() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
autodownloadUndownloadedItems(context);
|
||||||
|
}
|
||||||
|
}.start();
|
||||||
|
return savedFeed;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,6 +10,7 @@ import java.util.concurrent.ThreadFactory;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
|
import android.database.Cursor;
|
||||||
import android.preference.PreferenceManager;
|
import android.preference.PreferenceManager;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import de.danoeh.antennapod.AppConfig;
|
import de.danoeh.antennapod.AppConfig;
|
||||||
|
@ -406,7 +407,76 @@ public class DBWriter {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void addNewFeed(final Context context, final Feed feed) {
|
public static void markItemRead(final Context context, final long itemId,
|
||||||
|
final boolean read) {
|
||||||
|
markItemRead(context, itemId, read, 0, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void markItemRead(final Context context, final long itemId,
|
||||||
|
final boolean read, final long mediaId,
|
||||||
|
final boolean resetMediaPosition) {
|
||||||
|
dbExec.submit(new Runnable() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
final PodDBAdapter adapter = new PodDBAdapter(context);
|
||||||
|
adapter.open();
|
||||||
|
adapter.setFeedItemRead(read, itemId, mediaId,
|
||||||
|
resetMediaPosition);
|
||||||
|
adapter.close();
|
||||||
|
|
||||||
|
EventDistributor.getInstance().sendUnreadItemsUpdateBroadcast();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void markFeedRead(final Context context, final long feedId) {
|
||||||
|
dbExec.submit(new Runnable() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
final PodDBAdapter adapter = new PodDBAdapter(context);
|
||||||
|
adapter.open();
|
||||||
|
Cursor itemCursor = adapter.getAllItemsOfFeedCursor(feedId);
|
||||||
|
long[] itemIds = new long[itemCursor.getCount()];
|
||||||
|
itemCursor.moveToFirst();
|
||||||
|
for (int i = 0; i < itemIds.length; i++) {
|
||||||
|
itemIds[i] = itemCursor.getLong(PodDBAdapter.KEY_ID_INDEX);
|
||||||
|
}
|
||||||
|
itemCursor.close();
|
||||||
|
adapter.setFeedItemRead(true, itemIds);
|
||||||
|
adapter.close();
|
||||||
|
|
||||||
|
EventDistributor.getInstance().sendUnreadItemsUpdateBroadcast();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void markAllItemsRead(final Context context) {
|
||||||
|
dbExec.submit(new Runnable() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
final PodDBAdapter adapter = new PodDBAdapter(context);
|
||||||
|
adapter.open();
|
||||||
|
Cursor itemCursor = adapter.getUnreadItemsCursor();
|
||||||
|
long[] itemIds = new long[itemCursor.getCount()];
|
||||||
|
itemCursor.moveToFirst();
|
||||||
|
for (int i = 0; i < itemIds.length; i++) {
|
||||||
|
itemIds[i] = itemCursor.getLong(PodDBAdapter.KEY_ID_INDEX);
|
||||||
|
}
|
||||||
|
itemCursor.close();
|
||||||
|
adapter.setFeedItemRead(true, itemIds);
|
||||||
|
adapter.close();
|
||||||
|
|
||||||
|
EventDistributor.getInstance().sendUnreadItemsUpdateBroadcast();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static void addNewFeed(final Context context, final Feed feed) {
|
||||||
dbExec.submit(new Runnable() {
|
dbExec.submit(new Runnable() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -421,12 +491,33 @@ public class DBWriter {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void setCompleteFeed(final Context context, final Feed feed) {
|
||||||
|
dbExec.submit(new Runnable() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
PodDBAdapter adapter = new PodDBAdapter(context);
|
||||||
|
adapter.open();
|
||||||
|
adapter.setCompleteFeed(feed);
|
||||||
|
adapter.close();
|
||||||
|
|
||||||
|
EventDistributor.getInstance().sendFeedUpdateBroadcast();
|
||||||
|
}});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
private static void setFeedMedia(final Context context,
|
private static void setFeedMedia(final Context context,
|
||||||
final FeedMedia media) {
|
final FeedMedia media) {
|
||||||
|
dbExec.submit(new Runnable() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
PodDBAdapter adapter = new PodDBAdapter(context);
|
PodDBAdapter adapter = new PodDBAdapter(context);
|
||||||
adapter.open();
|
adapter.open();
|
||||||
adapter.setMedia(media);
|
adapter.setMedia(media);
|
||||||
adapter.close();
|
adapter.close();
|
||||||
|
}});
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -400,6 +400,39 @@ public class PodDBAdapter {
|
||||||
return item.getId();
|
return item.getId();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setFeedItemRead(boolean read, long itemId, long mediaId,
|
||||||
|
boolean resetMediaPosition) {
|
||||||
|
db.beginTransaction();
|
||||||
|
ContentValues values = new ContentValues();
|
||||||
|
|
||||||
|
values.put(KEY_READ, read);
|
||||||
|
db.update(TABLE_NAME_FEED_ITEMS, values, "?=?", new String[] { KEY_ID,
|
||||||
|
Long.toString(itemId) });
|
||||||
|
|
||||||
|
if (resetMediaPosition) {
|
||||||
|
values.clear();
|
||||||
|
values.put(KEY_POSITION, 0);
|
||||||
|
db.update(TABLE_NAME_FEED_MEDIA, values, "?=?", new String[] {
|
||||||
|
KEY_ID, Long.toString(mediaId) });
|
||||||
|
}
|
||||||
|
|
||||||
|
db.setTransactionSuccessful();
|
||||||
|
db.endTransaction();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFeedItemRead(boolean read, long... itemIds) {
|
||||||
|
db.beginTransaction();
|
||||||
|
ContentValues values = new ContentValues();
|
||||||
|
for (long id : itemIds) {
|
||||||
|
values.clear();
|
||||||
|
values.put(KEY_READ, read);
|
||||||
|
db.update(TABLE_NAME_FEED_ITEMS, values, "?=?", new String[] {
|
||||||
|
KEY_ID, Long.toString(id) });
|
||||||
|
}
|
||||||
|
db.setTransactionSuccessful();
|
||||||
|
db.endTransaction();
|
||||||
|
}
|
||||||
|
|
||||||
public void setChapters(FeedItem item) {
|
public void setChapters(FeedItem item) {
|
||||||
ContentValues values = new ContentValues();
|
ContentValues values = new ContentValues();
|
||||||
for (Chapter chapter : item.getChapters()) {
|
for (Chapter chapter : item.getChapters()) {
|
||||||
|
@ -557,10 +590,14 @@ public class PodDBAdapter {
|
||||||
* @return The cursor of the query
|
* @return The cursor of the query
|
||||||
* */
|
* */
|
||||||
public final Cursor getAllItemsOfFeedCursor(final Feed feed) {
|
public final Cursor getAllItemsOfFeedCursor(final Feed feed) {
|
||||||
|
return getAllItemsOfFeedCursor(feed.getId());
|
||||||
|
}
|
||||||
|
|
||||||
|
public final Cursor getAllItemsOfFeedCursor(final long feedId) {
|
||||||
open();
|
open();
|
||||||
Cursor c = db.query(TABLE_NAME_FEED_ITEMS, SEL_FI_SMALL, KEY_FEED
|
Cursor c = db.query(TABLE_NAME_FEED_ITEMS, SEL_FI_SMALL, KEY_FEED
|
||||||
+ "=?", new String[] { String.valueOf(feed.getId()) }, null,
|
+ "=?", new String[] { String.valueOf(feedId) }, null, null,
|
||||||
null, null);
|
null);
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -643,6 +680,14 @@ public class PodDBAdapter {
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public final Cursor getUnreadItemIdsCursor() {
|
||||||
|
open();
|
||||||
|
Cursor c = db.query(TABLE_NAME_FEED_ITEMS, new String[]{KEY_ID}, KEY_READ
|
||||||
|
+ "=0", null, null, null, KEY_PUBDATE + " DESC");
|
||||||
|
return c;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a cursor which contains feed media objects with a playback
|
* Returns a cursor which contains feed media objects with a playback
|
||||||
* completion date in descending order.
|
* completion date in descending order.
|
||||||
|
|
Loading…
Reference in New Issue