sort in podcast screen - db persistence
This commit is contained in:
parent
be7db6cef1
commit
562ddee7d7
|
@ -44,8 +44,8 @@ class DBTestUtils {
|
||||||
PodDBAdapter adapter = PodDBAdapter.getInstance();
|
PodDBAdapter adapter = PodDBAdapter.getInstance();
|
||||||
adapter.open();
|
adapter.open();
|
||||||
for (int i = 0; i < numFeeds; i++) {
|
for (int i = 0; i < numFeeds; i++) {
|
||||||
Feed f = new Feed(0, null, "feed " + i, null, "link" + i, "descr", null, null,
|
Feed f = new Feed(0, null, "feed " + i, "link" + i, "descr", null, null,
|
||||||
null, null, "id" + i, null, null, "url" + i, false, false, null, null, false);
|
null, null, "id" + i, null, null, "url" + i, false);
|
||||||
f.setItems(new ArrayList<>());
|
f.setItems(new ArrayList<>());
|
||||||
for (int j = 0; j < numItems; j++) {
|
for (int j = 0; j < numItems; j++) {
|
||||||
FeedItem item = new FeedItem(0, "item " + j, "id" + j, "link" + j, new Date(),
|
FeedItem item = new FeedItem(0, "item " + j, "id" + j, "link" + j, new Date(),
|
||||||
|
|
|
@ -12,6 +12,7 @@ import java.util.List;
|
||||||
import de.danoeh.antennapod.core.asynctask.ImageResource;
|
import de.danoeh.antennapod.core.asynctask.ImageResource;
|
||||||
import de.danoeh.antennapod.core.storage.DBWriter;
|
import de.danoeh.antennapod.core.storage.DBWriter;
|
||||||
import de.danoeh.antennapod.core.storage.PodDBAdapter;
|
import de.danoeh.antennapod.core.storage.PodDBAdapter;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Data Object for a whole feed
|
* Data Object for a whole feed
|
||||||
*
|
*
|
||||||
|
@ -97,7 +98,7 @@ public class Feed extends FeedFile implements ImageResource {
|
||||||
public Feed(long id, String lastUpdate, String title, String customTitle, String link, String description, String paymentLink,
|
public Feed(long id, String lastUpdate, String title, String customTitle, String link, String description, String paymentLink,
|
||||||
String author, String language, String type, String feedIdentifier, String imageUrl, String fileUrl,
|
String author, String language, String type, String feedIdentifier, String imageUrl, String fileUrl,
|
||||||
String downloadUrl, boolean downloaded, boolean paged, String nextPageLink,
|
String downloadUrl, boolean downloaded, boolean paged, String nextPageLink,
|
||||||
String filter, boolean lastUpdateFailed) {
|
String filter, @Nullable IntraFeedSortOrder sortOrder, boolean lastUpdateFailed) {
|
||||||
super(fileUrl, downloadUrl, downloaded);
|
super(fileUrl, downloadUrl, downloaded);
|
||||||
this.id = id;
|
this.id = id;
|
||||||
this.feedTitle = title;
|
this.feedTitle = title;
|
||||||
|
@ -119,6 +120,7 @@ public class Feed extends FeedFile implements ImageResource {
|
||||||
} else {
|
} else {
|
||||||
this.itemfilter = new FeedItemFilter(new String[0]);
|
this.itemfilter = new FeedItemFilter(new String[0]);
|
||||||
}
|
}
|
||||||
|
this.sortOrder = sortOrder;
|
||||||
this.lastUpdateFailed = lastUpdateFailed;
|
this.lastUpdateFailed = lastUpdateFailed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -129,7 +131,7 @@ public class Feed extends FeedFile implements ImageResource {
|
||||||
String author, String language, String type, String feedIdentifier, String imageUrl, String fileUrl,
|
String author, String language, String type, String feedIdentifier, String imageUrl, String fileUrl,
|
||||||
String downloadUrl, boolean downloaded) {
|
String downloadUrl, boolean downloaded) {
|
||||||
this(id, lastUpdate, title, null, link, description, paymentLink, author, language, type, feedIdentifier, imageUrl,
|
this(id, lastUpdate, title, null, link, description, paymentLink, author, language, type, feedIdentifier, imageUrl,
|
||||||
fileUrl, downloadUrl, downloaded, false, null, null, false);
|
fileUrl, downloadUrl, downloaded, false, null, null, null, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -184,6 +186,7 @@ public class Feed extends FeedFile implements ImageResource {
|
||||||
int indexIsPaged = cursor.getColumnIndex(PodDBAdapter.KEY_IS_PAGED);
|
int indexIsPaged = cursor.getColumnIndex(PodDBAdapter.KEY_IS_PAGED);
|
||||||
int indexNextPageLink = cursor.getColumnIndex(PodDBAdapter.KEY_NEXT_PAGE_LINK);
|
int indexNextPageLink = cursor.getColumnIndex(PodDBAdapter.KEY_NEXT_PAGE_LINK);
|
||||||
int indexHide = cursor.getColumnIndex(PodDBAdapter.KEY_HIDE);
|
int indexHide = cursor.getColumnIndex(PodDBAdapter.KEY_HIDE);
|
||||||
|
int indexSortOrder = cursor.getColumnIndex(PodDBAdapter.KEY_SORT_ORDER);
|
||||||
int indexLastUpdateFailed = cursor.getColumnIndex(PodDBAdapter.KEY_LAST_UPDATE_FAILED);
|
int indexLastUpdateFailed = cursor.getColumnIndex(PodDBAdapter.KEY_LAST_UPDATE_FAILED);
|
||||||
int indexImageUrl = cursor.getColumnIndex(PodDBAdapter.KEY_IMAGE_URL);
|
int indexImageUrl = cursor.getColumnIndex(PodDBAdapter.KEY_IMAGE_URL);
|
||||||
|
|
||||||
|
@ -206,6 +209,7 @@ public class Feed extends FeedFile implements ImageResource {
|
||||||
cursor.getInt(indexIsPaged) > 0,
|
cursor.getInt(indexIsPaged) > 0,
|
||||||
cursor.getString(indexNextPageLink),
|
cursor.getString(indexNextPageLink),
|
||||||
cursor.getString(indexHide),
|
cursor.getString(indexHide),
|
||||||
|
IntraFeedSortOrder.fromCode(cursor.getInt(indexSortOrder)),
|
||||||
cursor.getInt(indexLastUpdateFailed) > 0
|
cursor.getInt(indexLastUpdateFailed) > 0
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
package de.danoeh.antennapod.core.feed;
|
package de.danoeh.antennapod.core.feed;
|
||||||
|
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Provides sort orders to sort a list of episodes within a feed.
|
* Provides sort orders to sort a list of episodes within a feed.
|
||||||
*/
|
*/
|
||||||
|
@ -11,6 +13,9 @@ public enum IntraFeedSortOrder {
|
||||||
DURATION_SHORT_LONG(5),
|
DURATION_SHORT_LONG(5),
|
||||||
DURATION_LONG_SHORT(6);
|
DURATION_LONG_SHORT(6);
|
||||||
|
|
||||||
|
// The constant SHOULD NEVER be changed, as it is used in db DDLs
|
||||||
|
public static final int CODE_UNSPECIFIED = 0;
|
||||||
|
|
||||||
public final int code;
|
public final int code;
|
||||||
|
|
||||||
IntraFeedSortOrder(int code) {
|
IntraFeedSortOrder(int code) {
|
||||||
|
@ -28,4 +33,22 @@ public enum IntraFeedSortOrder {
|
||||||
return defaultValue;
|
return defaultValue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
public static IntraFeedSortOrder fromCode(int code) {
|
||||||
|
if (code == CODE_UNSPECIFIED) { // sort order not specified
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
for (IntraFeedSortOrder sortOrder : values()) {
|
||||||
|
if (sortOrder.code == code) {
|
||||||
|
return sortOrder;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw new IllegalArgumentException("Unsupported code: " + code);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int toCode(@Nullable IntraFeedSortOrder sortOrder) {
|
||||||
|
return sortOrder != null ? sortOrder.code : CODE_UNSPECIFIED;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,6 +9,7 @@ import android.util.Log;
|
||||||
import de.danoeh.antennapod.core.feed.FeedItem;
|
import de.danoeh.antennapod.core.feed.FeedItem;
|
||||||
|
|
||||||
import static de.danoeh.antennapod.core.feed.FeedPreferences.SPEED_USE_GLOBAL;
|
import static de.danoeh.antennapod.core.feed.FeedPreferences.SPEED_USE_GLOBAL;
|
||||||
|
import static de.danoeh.antennapod.core.feed.IntraFeedSortOrder.CODE_UNSPECIFIED;
|
||||||
|
|
||||||
class DBUpgrader {
|
class DBUpgrader {
|
||||||
/**
|
/**
|
||||||
|
@ -294,6 +295,11 @@ class DBUpgrader {
|
||||||
db.execSQL("ALTER TABLE " + PodDBAdapter.TABLE_NAME_FEEDS
|
db.execSQL("ALTER TABLE " + PodDBAdapter.TABLE_NAME_FEEDS
|
||||||
+ " ADD COLUMN " + PodDBAdapter.KEY_FEED_PLAYBACK_SPEED + " REAL DEFAULT " + SPEED_USE_GLOBAL);
|
+ " ADD COLUMN " + PodDBAdapter.KEY_FEED_PLAYBACK_SPEED + " REAL DEFAULT " + SPEED_USE_GLOBAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (oldVersion < 1070401) {
|
||||||
|
db.execSQL("ALTER TABLE " + PodDBAdapter.TABLE_NAME_FEEDS
|
||||||
|
+ " ADD COLUMN " + PodDBAdapter.KEY_SORT_ORDER + " INTEGER DEFAULT " + CODE_UNSPECIFIED);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -954,7 +954,7 @@ public class DBWriter {
|
||||||
return dbExec.submit(() -> {
|
return dbExec.submit(() -> {
|
||||||
PodDBAdapter adapter = PodDBAdapter.getInstance();
|
PodDBAdapter adapter = PodDBAdapter.getInstance();
|
||||||
adapter.open();
|
adapter.open();
|
||||||
// adapter.setFeedItemSortOrder(feedId, sortOrder);
|
adapter.setFeedItemSortOrder(feedId, sortOrder);
|
||||||
adapter.close();
|
adapter.close();
|
||||||
EventBus.getDefault().post(new FeedEvent(FeedEvent.Action.SORT_ORDER_CHANGED, feedId));
|
EventBus.getDefault().post(new FeedEvent(FeedEvent.Action.SORT_ORDER_CHANGED, feedId));
|
||||||
});
|
});
|
||||||
|
|
|
@ -13,11 +13,11 @@ import android.database.sqlite.SQLiteDatabase;
|
||||||
import android.database.sqlite.SQLiteDatabase.CursorFactory;
|
import android.database.sqlite.SQLiteDatabase.CursorFactory;
|
||||||
import android.database.sqlite.SQLiteOpenHelper;
|
import android.database.sqlite.SQLiteOpenHelper;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import androidx.annotation.Nullable;
|
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
import org.apache.commons.io.FileUtils;
|
import org.apache.commons.io.FileUtils;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
@ -32,11 +32,14 @@ import de.danoeh.antennapod.core.feed.Feed;
|
||||||
import de.danoeh.antennapod.core.feed.FeedItem;
|
import de.danoeh.antennapod.core.feed.FeedItem;
|
||||||
import de.danoeh.antennapod.core.feed.FeedMedia;
|
import de.danoeh.antennapod.core.feed.FeedMedia;
|
||||||
import de.danoeh.antennapod.core.feed.FeedPreferences;
|
import de.danoeh.antennapod.core.feed.FeedPreferences;
|
||||||
|
import de.danoeh.antennapod.core.feed.IntraFeedSortOrder;
|
||||||
import de.danoeh.antennapod.core.preferences.UserPreferences;
|
import de.danoeh.antennapod.core.preferences.UserPreferences;
|
||||||
import de.danoeh.antennapod.core.service.download.DownloadStatus;
|
import de.danoeh.antennapod.core.service.download.DownloadStatus;
|
||||||
import de.danoeh.antennapod.core.util.LongIntMap;
|
import de.danoeh.antennapod.core.util.LongIntMap;
|
||||||
|
|
||||||
import static de.danoeh.antennapod.core.feed.FeedPreferences.SPEED_USE_GLOBAL;
|
import static de.danoeh.antennapod.core.feed.FeedPreferences.SPEED_USE_GLOBAL;
|
||||||
|
import static de.danoeh.antennapod.core.feed.IntraFeedSortOrder.CODE_UNSPECIFIED;
|
||||||
|
import static de.danoeh.antennapod.core.feed.IntraFeedSortOrder.toCode;
|
||||||
|
|
||||||
// TODO Remove media column from feeditem table
|
// TODO Remove media column from feeditem table
|
||||||
|
|
||||||
|
@ -101,6 +104,7 @@ public class PodDBAdapter {
|
||||||
public static final String KEY_IS_PAGED = "is_paged";
|
public static final String KEY_IS_PAGED = "is_paged";
|
||||||
public static final String KEY_NEXT_PAGE_LINK = "next_page_link";
|
public static final String KEY_NEXT_PAGE_LINK = "next_page_link";
|
||||||
public static final String KEY_HIDE = "hide";
|
public static final String KEY_HIDE = "hide";
|
||||||
|
public static final String KEY_SORT_ORDER = "sort_order";
|
||||||
public static final String KEY_LAST_UPDATE_FAILED = "last_update_failed";
|
public static final String KEY_LAST_UPDATE_FAILED = "last_update_failed";
|
||||||
public static final String KEY_HAS_EMBEDDED_PICTURE = "has_embedded_picture";
|
public static final String KEY_HAS_EMBEDDED_PICTURE = "has_embedded_picture";
|
||||||
public static final String KEY_LAST_PLAYED_TIME = "last_played_time";
|
public static final String KEY_LAST_PLAYED_TIME = "last_played_time";
|
||||||
|
@ -138,6 +142,7 @@ public class PodDBAdapter {
|
||||||
+ KEY_IS_PAGED + " INTEGER DEFAULT 0,"
|
+ KEY_IS_PAGED + " INTEGER DEFAULT 0,"
|
||||||
+ KEY_NEXT_PAGE_LINK + " TEXT,"
|
+ KEY_NEXT_PAGE_LINK + " TEXT,"
|
||||||
+ KEY_HIDE + " TEXT,"
|
+ KEY_HIDE + " TEXT,"
|
||||||
|
+ KEY_SORT_ORDER + " INTEGER DEFAULT " + CODE_UNSPECIFIED + ","
|
||||||
+ KEY_LAST_UPDATE_FAILED + " INTEGER DEFAULT 0,"
|
+ KEY_LAST_UPDATE_FAILED + " INTEGER DEFAULT 0,"
|
||||||
+ KEY_AUTO_DELETE_ACTION + " INTEGER DEFAULT 0,"
|
+ KEY_AUTO_DELETE_ACTION + " INTEGER DEFAULT 0,"
|
||||||
+ KEY_FEED_PLAYBACK_SPEED + " REAL DEFAULT " + SPEED_USE_GLOBAL + ")";
|
+ KEY_FEED_PLAYBACK_SPEED + " REAL DEFAULT " + SPEED_USE_GLOBAL + ")";
|
||||||
|
@ -234,6 +239,7 @@ public class PodDBAdapter {
|
||||||
TABLE_NAME_FEEDS + "." + KEY_USERNAME,
|
TABLE_NAME_FEEDS + "." + KEY_USERNAME,
|
||||||
TABLE_NAME_FEEDS + "." + KEY_PASSWORD,
|
TABLE_NAME_FEEDS + "." + KEY_PASSWORD,
|
||||||
TABLE_NAME_FEEDS + "." + KEY_HIDE,
|
TABLE_NAME_FEEDS + "." + KEY_HIDE,
|
||||||
|
TABLE_NAME_FEEDS + "." + KEY_SORT_ORDER,
|
||||||
TABLE_NAME_FEEDS + "." + KEY_LAST_UPDATE_FAILED,
|
TABLE_NAME_FEEDS + "." + KEY_LAST_UPDATE_FAILED,
|
||||||
TABLE_NAME_FEEDS + "." + KEY_AUTO_DELETE_ACTION,
|
TABLE_NAME_FEEDS + "." + KEY_AUTO_DELETE_ACTION,
|
||||||
TABLE_NAME_FEEDS + "." + KEY_INCLUDE_FILTER,
|
TABLE_NAME_FEEDS + "." + KEY_INCLUDE_FILTER,
|
||||||
|
@ -378,6 +384,7 @@ public class PodDBAdapter {
|
||||||
} else {
|
} else {
|
||||||
values.put(KEY_HIDE, "");
|
values.put(KEY_HIDE, "");
|
||||||
}
|
}
|
||||||
|
values.put(KEY_SORT_ORDER, toCode(feed.getSortOrder()));
|
||||||
values.put(KEY_LAST_UPDATE_FAILED, feed.hasLastUpdateFailed());
|
values.put(KEY_LAST_UPDATE_FAILED, feed.hasLastUpdateFailed());
|
||||||
if (feed.getId() == 0) {
|
if (feed.getId() == 0) {
|
||||||
// Create new entry
|
// Create new entry
|
||||||
|
@ -416,6 +423,12 @@ public class PodDBAdapter {
|
||||||
db.update(TABLE_NAME_FEEDS, values, KEY_ID + "=?", new String[]{String.valueOf(feedId)});
|
db.update(TABLE_NAME_FEEDS, values, KEY_ID + "=?", new String[]{String.valueOf(feedId)});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setFeedItemSortOrder(long feedId, @Nullable IntraFeedSortOrder sortOrder) {
|
||||||
|
ContentValues values = new ContentValues();
|
||||||
|
values.put(KEY_SORT_ORDER, toCode(sortOrder));
|
||||||
|
db.update(TABLE_NAME_FEEDS, values, KEY_ID + "=?", new String[]{String.valueOf(feedId)});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Inserts or updates a media entry
|
* Inserts or updates a media entry
|
||||||
*
|
*
|
||||||
|
@ -1455,7 +1468,7 @@ public class PodDBAdapter {
|
||||||
*/
|
*/
|
||||||
private static class PodDBHelper extends SQLiteOpenHelper {
|
private static class PodDBHelper extends SQLiteOpenHelper {
|
||||||
|
|
||||||
private static final int VERSION = 1070400;
|
private static final int VERSION = 1070401;
|
||||||
|
|
||||||
private final Context context;
|
private final Context context;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue