From ff3258c34a1797e75538b83baa1e867d0ea07ceb Mon Sep 17 00:00:00 2001 From: ByteHamster Date: Sun, 27 Feb 2022 12:12:24 +0100 Subject: [PATCH] Move database to its own module --- app/build.gradle | 1 + .../core/service/download/StubDownloader.java | 1 + .../de/test/antennapod/EspressoTestUtils.java | 2 +- .../service/download/DownloadServiceTest.java | 2 +- .../service/download/HttpDownloaderTest.java | 4 +- .../PlaybackServiceMediaPlayerTest.java | 2 +- .../PlaybackServiceTaskManagerTest.java | 2 +- .../test/antennapod/ui/MainActivityTest.java | 2 +- .../de/test/antennapod/ui/UITestUtils.java | 2 +- .../activity/OnlineFeedViewActivity.java | 4 +- .../antennapod/activity/SplashActivity.java | 2 +- .../adapter/DownloadLogAdapter.java | 4 +- .../dialog/DownloadLogDetailsDialog.java | 2 +- .../fragment/DownloadLogFragment.java | 2 +- .../fragment/FeedItemlistFragment.java | 2 +- core/build.gradle | 1 + .../danoeh/antennapod/core/ClientConfig.java | 2 +- .../core/feed/LocalFeedUpdater.java | 4 +- .../core/feed/SubscriptionsFilter.java | 2 +- .../core/preferences/UserPreferences.java | 12 +-- .../service/download/DownloadService.java | 3 +- .../download/DownloadServiceNotification.java | 1 + .../core/service/download/Downloader.java | 1 + .../core/service/download/HttpDownloader.java | 3 +- .../download/NewEpisodesNotification.java | 10 +-- .../download/handler/FeedParserTask.java | 4 +- .../download/handler/FeedSyncTask.java | 2 +- .../handler/MediaDownloadedHandler.java | 4 +- .../antennapod/core/storage/DBReader.java | 19 ++-- .../antennapod/core/storage/DBTasks.java | 7 +- .../antennapod/core/storage/DBWriter.java | 3 +- .../core/storage/DatabaseExporter.java | 1 + .../core/storage/NavDrawerData.java | 2 +- .../storage/mapper/ChapterCursorMapper.java | 51 ----------- .../core/util/DownloadErrorLabel.java | 1 + .../comparator/DownloadStatusComparator.java | 2 +- .../core/feed/LocalFeedUpdaterTest.java | 2 +- .../core/storage/DbCleanupTests.java | 1 + .../storage/DbNullCleanupAlgorithmTest.java | 1 + .../antennapod/core/storage/DbReaderTest.java | 1 + .../antennapod/core/storage/DbTasksTest.java | 1 + .../antennapod/core/storage/DbTestUtils.java | 4 +- .../antennapod/core/storage/DbWriterTest.java | 1 + .../storage/mapper/FeedCursorMapperTest.java | 3 +- .../antennapod/core/util/LongLongMapTest.java | 1 + .../model/download}/DownloadError.java | 2 +- .../model}/download/DownloadStatus.java | 3 +- .../danoeh/antennapod/model/feed/Chapter.java | 32 ++++--- .../antennapod/model/feed/FeedCounter.java | 24 +++++ .../parser/feed/element/SimpleChapter.java | 16 ---- .../parser/feed/namespace/SimpleChapters.java | 4 +- .../parser/media/id3/ChapterReader.java | 5 +- .../parser/media/id3/ID3Chapter.java | 33 ------- .../media/vorbis/VorbisCommentChapter.java | 88 ------------------- .../vorbis/VorbisCommentChapterReader.java | 65 ++++++++++++-- .../parser/media/id3/ChapterReaderTest.java | 2 +- settings.gradle | 2 + storage/README.md | 3 + storage/database/README.md | 3 + storage/database/build.gradle | 17 ++++ storage/database/src/main/AndroidManifest.xml | 1 + .../storage/database}/DBUpgrader.java | 6 +- .../storage/database}/LongIntMap.java | 2 +- .../storage/database}/PodDBAdapter.java | 35 +++----- .../database/mapper/ChapterCursorMapper.java | 32 +++++++ .../mapper/DownloadStatusCursorMapper.java | 8 +- .../database}/mapper/FeedCursorMapper.java | 4 +- .../mapper/FeedItemCursorMapper.java | 4 +- .../database}/mapper/FeedItemFilterQuery.java | 4 +- .../mapper/FeedMediaCursorMapper.java | 4 +- .../mapper/FeedPreferencesCursorMapper.java | 4 +- 71 files changed, 276 insertions(+), 311 deletions(-) delete mode 100644 core/src/main/java/de/danoeh/antennapod/core/storage/mapper/ChapterCursorMapper.java rename {core/src/main/java/de/danoeh/antennapod/core/util => model/src/main/java/de/danoeh/antennapod/model/download}/DownloadError.java (96%) rename {core/src/main/java/de/danoeh/antennapod/core/service => model/src/main/java/de/danoeh/antennapod/model}/download/DownloadStatus.java (97%) create mode 100644 model/src/main/java/de/danoeh/antennapod/model/feed/FeedCounter.java delete mode 100644 parser/feed/src/main/java/de/danoeh/antennapod/parser/feed/element/SimpleChapter.java delete mode 100644 parser/media/src/main/java/de/danoeh/antennapod/parser/media/id3/ID3Chapter.java delete mode 100644 parser/media/src/main/java/de/danoeh/antennapod/parser/media/vorbis/VorbisCommentChapter.java create mode 100644 storage/README.md create mode 100644 storage/database/README.md create mode 100644 storage/database/build.gradle create mode 100644 storage/database/src/main/AndroidManifest.xml rename {core/src/main/java/de/danoeh/antennapod/core/storage => storage/database/src/main/java/de/danoeh/antennapod/storage/database}/DBUpgrader.java (99%) rename {core/src/main/java/de/danoeh/antennapod/core/util => storage/database/src/main/java/de/danoeh/antennapod/storage/database}/LongIntMap.java (99%) rename {core/src/main/java/de/danoeh/antennapod/core/storage => storage/database/src/main/java/de/danoeh/antennapod/storage/database}/PodDBAdapter.java (98%) create mode 100644 storage/database/src/main/java/de/danoeh/antennapod/storage/database/mapper/ChapterCursorMapper.java rename {core/src/main/java/de/danoeh/antennapod/core/storage => storage/database/src/main/java/de/danoeh/antennapod/storage/database}/mapper/DownloadStatusCursorMapper.java (86%) rename {core/src/main/java/de/danoeh/antennapod/core/storage => storage/database/src/main/java/de/danoeh/antennapod/storage/database}/mapper/FeedCursorMapper.java (96%) rename {core/src/main/java/de/danoeh/antennapod/core/storage => storage/database/src/main/java/de/danoeh/antennapod/storage/database}/mapper/FeedItemCursorMapper.java (95%) rename {core/src/main/java/de/danoeh/antennapod/core/storage => storage/database/src/main/java/de/danoeh/antennapod/storage/database}/mapper/FeedItemFilterQuery.java (96%) rename {core/src/main/java/de/danoeh/antennapod/core/storage => storage/database/src/main/java/de/danoeh/antennapod/storage/database}/mapper/FeedMediaCursorMapper.java (96%) rename {core/src/main/java/de/danoeh/antennapod/core/storage => storage/database/src/main/java/de/danoeh/antennapod/storage/database}/mapper/FeedPreferencesCursorMapper.java (97%) diff --git a/app/build.gradle b/app/build.gradle index 8c48f6d2a..deaa5893d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -118,6 +118,7 @@ dependencies { implementation project(':parser:feed') implementation project(':playback:base') implementation project(':playback:cast') + implementation project(':storage:database') implementation project(':ui:app-start-intent') implementation project(':ui:common') implementation project(':ui:i18n') diff --git a/app/src/androidTest/java/de/danoeh/antennapod/core/service/download/StubDownloader.java b/app/src/androidTest/java/de/danoeh/antennapod/core/service/download/StubDownloader.java index 7aac738e7..6e39967c1 100644 --- a/app/src/androidTest/java/de/danoeh/antennapod/core/service/download/StubDownloader.java +++ b/app/src/androidTest/java/de/danoeh/antennapod/core/service/download/StubDownloader.java @@ -2,6 +2,7 @@ package de.danoeh.antennapod.core.service.download; import androidx.annotation.NonNull; import androidx.core.util.Consumer; +import de.danoeh.antennapod.model.download.DownloadStatus; public class StubDownloader extends Downloader { diff --git a/app/src/androidTest/java/de/test/antennapod/EspressoTestUtils.java b/app/src/androidTest/java/de/test/antennapod/EspressoTestUtils.java index 21498effd..df3dbb7f8 100644 --- a/app/src/androidTest/java/de/test/antennapod/EspressoTestUtils.java +++ b/app/src/androidTest/java/de/test/antennapod/EspressoTestUtils.java @@ -18,6 +18,7 @@ import androidx.test.espresso.util.HumanReadables; import androidx.test.espresso.util.TreeIterables; import android.view.View; +import de.danoeh.antennapod.storage.database.PodDBAdapter; import junit.framework.AssertionFailedError; import de.danoeh.antennapod.R; @@ -25,7 +26,6 @@ import de.danoeh.antennapod.activity.MainActivity; import de.danoeh.antennapod.core.preferences.UserPreferences; import de.danoeh.antennapod.core.service.download.DownloadService; import de.danoeh.antennapod.core.service.playback.PlaybackService; -import de.danoeh.antennapod.core.storage.PodDBAdapter; import de.danoeh.antennapod.dialog.RatingDialog; import de.danoeh.antennapod.fragment.NavDrawerFragment; import org.awaitility.Awaitility; diff --git a/app/src/androidTest/java/de/test/antennapod/service/download/DownloadServiceTest.java b/app/src/androidTest/java/de/test/antennapod/service/download/DownloadServiceTest.java index edd80b0d0..8aae95e69 100644 --- a/app/src/androidTest/java/de/test/antennapod/service/download/DownloadServiceTest.java +++ b/app/src/androidTest/java/de/test/antennapod/service/download/DownloadServiceTest.java @@ -28,7 +28,7 @@ import de.danoeh.antennapod.model.feed.FeedMedia; import de.danoeh.antennapod.core.preferences.UserPreferences; import de.danoeh.antennapod.core.service.download.DownloadRequest; import de.danoeh.antennapod.core.service.download.DownloadService; -import de.danoeh.antennapod.core.service.download.DownloadStatus; +import de.danoeh.antennapod.model.download.DownloadStatus; import de.danoeh.antennapod.core.service.download.Downloader; import de.danoeh.antennapod.core.service.download.DownloaderFactory; import de.danoeh.antennapod.core.service.download.StubDownloader; diff --git a/app/src/androidTest/java/de/test/antennapod/service/download/HttpDownloaderTest.java b/app/src/androidTest/java/de/test/antennapod/service/download/HttpDownloaderTest.java index 6b8854d34..16e2ca1f4 100644 --- a/app/src/androidTest/java/de/test/antennapod/service/download/HttpDownloaderTest.java +++ b/app/src/androidTest/java/de/test/antennapod/service/download/HttpDownloaderTest.java @@ -10,10 +10,10 @@ import java.io.IOException; import de.danoeh.antennapod.model.feed.FeedFile; import de.danoeh.antennapod.core.preferences.UserPreferences; import de.danoeh.antennapod.core.service.download.DownloadRequest; -import de.danoeh.antennapod.core.service.download.DownloadStatus; +import de.danoeh.antennapod.model.download.DownloadStatus; import de.danoeh.antennapod.core.service.download.Downloader; import de.danoeh.antennapod.core.service.download.HttpDownloader; -import de.danoeh.antennapod.core.util.DownloadError; +import de.danoeh.antennapod.model.download.DownloadError; import de.test.antennapod.util.service.download.HTTPBin; import org.junit.After; import org.junit.Before; diff --git a/app/src/androidTest/java/de/test/antennapod/service/playback/PlaybackServiceMediaPlayerTest.java b/app/src/androidTest/java/de/test/antennapod/service/playback/PlaybackServiceMediaPlayerTest.java index 0d05c7624..e115bc34e 100644 --- a/app/src/androidTest/java/de/test/antennapod/service/playback/PlaybackServiceMediaPlayerTest.java +++ b/app/src/androidTest/java/de/test/antennapod/service/playback/PlaybackServiceMediaPlayerTest.java @@ -8,6 +8,7 @@ import androidx.test.filters.MediumTest; import de.danoeh.antennapod.model.feed.VolumeAdaptionSetting; import de.danoeh.antennapod.playback.base.PlaybackServiceMediaPlayer; import de.danoeh.antennapod.playback.base.PlayerStatus; +import de.danoeh.antennapod.storage.database.PodDBAdapter; import de.test.antennapod.EspressoTestUtils; import junit.framework.AssertionFailedError; @@ -27,7 +28,6 @@ import de.danoeh.antennapod.model.feed.FeedItem; import de.danoeh.antennapod.model.feed.FeedMedia; import de.danoeh.antennapod.model.feed.FeedPreferences; import de.danoeh.antennapod.core.service.playback.LocalPSMP; -import de.danoeh.antennapod.core.storage.PodDBAdapter; import de.danoeh.antennapod.model.playback.Playable; import de.test.antennapod.util.service.download.HTTPBin; import org.junit.After; diff --git a/app/src/androidTest/java/de/test/antennapod/service/playback/PlaybackServiceTaskManagerTest.java b/app/src/androidTest/java/de/test/antennapod/service/playback/PlaybackServiceTaskManagerTest.java index 17d3d2e17..9f1fc2261 100644 --- a/app/src/androidTest/java/de/test/antennapod/service/playback/PlaybackServiceTaskManagerTest.java +++ b/app/src/androidTest/java/de/test/antennapod/service/playback/PlaybackServiceTaskManagerTest.java @@ -8,6 +8,7 @@ import androidx.test.filters.LargeTest; import de.danoeh.antennapod.event.playback.SleepTimerUpdatedEvent; import de.danoeh.antennapod.core.preferences.SleepTimerPreferences; import de.danoeh.antennapod.core.widget.WidgetUpdater; +import de.danoeh.antennapod.storage.database.PodDBAdapter; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.junit.After; @@ -23,7 +24,6 @@ import java.util.concurrent.TimeUnit; import de.danoeh.antennapod.model.feed.Feed; import de.danoeh.antennapod.model.feed.FeedItem; import de.danoeh.antennapod.core.service.playback.PlaybackServiceTaskManager; -import de.danoeh.antennapod.core.storage.PodDBAdapter; import de.danoeh.antennapod.model.playback.Playable; import static org.junit.Assert.assertFalse; diff --git a/app/src/androidTest/java/de/test/antennapod/ui/MainActivityTest.java b/app/src/androidTest/java/de/test/antennapod/ui/MainActivityTest.java index f048dbf63..81d7731c5 100644 --- a/app/src/androidTest/java/de/test/antennapod/ui/MainActivityTest.java +++ b/app/src/androidTest/java/de/test/antennapod/ui/MainActivityTest.java @@ -10,6 +10,7 @@ import androidx.test.platform.app.InstrumentationRegistry; import com.robotium.solo.Solo; +import de.danoeh.antennapod.storage.database.PodDBAdapter; import org.junit.After; import org.junit.Before; import org.junit.Rule; @@ -21,7 +22,6 @@ import java.io.IOException; import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.MainActivity; import de.danoeh.antennapod.model.feed.Feed; -import de.danoeh.antennapod.core.storage.PodDBAdapter; import de.test.antennapod.EspressoTestUtils; import static androidx.test.espresso.Espresso.onView; diff --git a/app/src/androidTest/java/de/test/antennapod/ui/UITestUtils.java b/app/src/androidTest/java/de/test/antennapod/ui/UITestUtils.java index eedb2d9de..834c7d48b 100644 --- a/app/src/androidTest/java/de/test/antennapod/ui/UITestUtils.java +++ b/app/src/androidTest/java/de/test/antennapod/ui/UITestUtils.java @@ -7,7 +7,7 @@ import de.danoeh.antennapod.event.QueueEvent; import de.danoeh.antennapod.model.feed.Feed; import de.danoeh.antennapod.model.feed.FeedItem; import de.danoeh.antennapod.model.feed.FeedMedia; -import de.danoeh.antennapod.core.storage.PodDBAdapter; +import de.danoeh.antennapod.storage.database.PodDBAdapter; import de.test.antennapod.util.service.download.HTTPBin; import de.test.antennapod.util.syndication.feedgenerator.Rss2Generator; import org.apache.commons.io.FileUtils; diff --git a/app/src/main/java/de/danoeh/antennapod/activity/OnlineFeedViewActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/OnlineFeedViewActivity.java index ac22baf43..d4d338d7b 100644 --- a/app/src/main/java/de/danoeh/antennapod/activity/OnlineFeedViewActivity.java +++ b/app/src/main/java/de/danoeh/antennapod/activity/OnlineFeedViewActivity.java @@ -45,7 +45,7 @@ import de.danoeh.antennapod.core.glide.FastBlurTransformation; import de.danoeh.antennapod.core.preferences.PlaybackPreferences; import de.danoeh.antennapod.core.preferences.UserPreferences; import de.danoeh.antennapod.core.service.download.DownloadRequest; -import de.danoeh.antennapod.core.service.download.DownloadStatus; +import de.danoeh.antennapod.model.download.DownloadStatus; import de.danoeh.antennapod.core.service.download.Downloader; import de.danoeh.antennapod.core.service.download.HttpDownloader; import de.danoeh.antennapod.core.service.playback.PlaybackService; @@ -54,7 +54,7 @@ import de.danoeh.antennapod.core.storage.DBWriter; import de.danoeh.antennapod.core.util.FileNameGenerator; import de.danoeh.antennapod.parser.feed.FeedHandler; import de.danoeh.antennapod.parser.feed.FeedHandlerResult; -import de.danoeh.antennapod.core.util.DownloadError; +import de.danoeh.antennapod.model.download.DownloadError; import de.danoeh.antennapod.core.util.IntentUtils; import de.danoeh.antennapod.core.util.StorageUtils; import de.danoeh.antennapod.core.util.URLChecker; diff --git a/app/src/main/java/de/danoeh/antennapod/activity/SplashActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/SplashActivity.java index f0c76d545..ecf490f48 100644 --- a/app/src/main/java/de/danoeh/antennapod/activity/SplashActivity.java +++ b/app/src/main/java/de/danoeh/antennapod/activity/SplashActivity.java @@ -12,8 +12,8 @@ import androidx.appcompat.app.AppCompatActivity; import android.widget.ProgressBar; import de.danoeh.antennapod.R; -import de.danoeh.antennapod.core.storage.PodDBAdapter; import de.danoeh.antennapod.error.CrashReportWriter; +import de.danoeh.antennapod.storage.database.PodDBAdapter; import io.reactivex.Completable; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.schedulers.Schedulers; diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/DownloadLogAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/DownloadLogAdapter.java index d6a74b545..8f1cfb374 100644 --- a/app/src/main/java/de/danoeh/antennapod/adapter/DownloadLogAdapter.java +++ b/app/src/main/java/de/danoeh/antennapod/adapter/DownloadLogAdapter.java @@ -17,10 +17,10 @@ import de.danoeh.antennapod.core.service.download.DownloadRequest; import de.danoeh.antennapod.core.service.download.DownloadRequestCreator; import de.danoeh.antennapod.core.service.download.DownloadService; import de.danoeh.antennapod.core.service.download.Downloader; -import de.danoeh.antennapod.core.service.download.DownloadStatus; +import de.danoeh.antennapod.model.download.DownloadStatus; import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.core.storage.DBTasks; -import de.danoeh.antennapod.core.util.DownloadError; +import de.danoeh.antennapod.model.download.DownloadError; import de.danoeh.antennapod.core.util.DownloadErrorLabel; import de.danoeh.antennapod.model.feed.Feed; import de.danoeh.antennapod.model.feed.FeedMedia; diff --git a/app/src/main/java/de/danoeh/antennapod/dialog/DownloadLogDetailsDialog.java b/app/src/main/java/de/danoeh/antennapod/dialog/DownloadLogDetailsDialog.java index 66909967f..50fb0651f 100644 --- a/app/src/main/java/de/danoeh/antennapod/dialog/DownloadLogDetailsDialog.java +++ b/app/src/main/java/de/danoeh/antennapod/dialog/DownloadLogDetailsDialog.java @@ -7,7 +7,7 @@ import android.widget.TextView; import androidx.annotation.NonNull; import androidx.appcompat.app.AlertDialog; import de.danoeh.antennapod.R; -import de.danoeh.antennapod.core.service.download.DownloadStatus; +import de.danoeh.antennapod.model.download.DownloadStatus; import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.event.MessageEvent; import de.danoeh.antennapod.model.feed.Feed; diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/DownloadLogFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/DownloadLogFragment.java index b64458e64..804e8dde3 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/DownloadLogFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/DownloadLogFragment.java @@ -17,7 +17,7 @@ import de.danoeh.antennapod.core.event.DownloaderUpdate; import de.danoeh.antennapod.core.menuhandler.MenuItemUtils; import de.danoeh.antennapod.core.service.download.DownloadRequest; import de.danoeh.antennapod.core.service.download.DownloadService; -import de.danoeh.antennapod.core.service.download.DownloadStatus; +import de.danoeh.antennapod.model.download.DownloadStatus; import de.danoeh.antennapod.core.service.download.Downloader; import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.core.storage.DBWriter; diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/FeedItemlistFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/FeedItemlistFragment.java index 796b86c02..9784f521d 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/FeedItemlistFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/FeedItemlistFragment.java @@ -45,7 +45,7 @@ import de.danoeh.antennapod.core.glide.ApGlideSettings; import de.danoeh.antennapod.core.glide.FastBlurTransformation; import de.danoeh.antennapod.core.menuhandler.MenuItemUtils; import de.danoeh.antennapod.core.service.download.DownloadService; -import de.danoeh.antennapod.core.service.download.DownloadStatus; +import de.danoeh.antennapod.model.download.DownloadStatus; import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.core.storage.DBTasks; import de.danoeh.antennapod.core.storage.DBWriter; diff --git a/core/build.gradle b/core/build.gradle index 13489f996..9eb9c8c90 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -30,6 +30,7 @@ dependencies { implementation project(':parser:media') implementation project(':playback:base') implementation project(':playback:cast') + implementation project(':storage:database') implementation project(':ui:app-start-intent') implementation project(':ui:common') implementation project(':ui:i18n') diff --git a/core/src/main/java/de/danoeh/antennapod/core/ClientConfig.java b/core/src/main/java/de/danoeh/antennapod/core/ClientConfig.java index ac67fb042..e03c8118d 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/ClientConfig.java +++ b/core/src/main/java/de/danoeh/antennapod/core/ClientConfig.java @@ -9,9 +9,9 @@ import de.danoeh.antennapod.core.preferences.SleepTimerPreferences; import de.danoeh.antennapod.core.preferences.UsageStatistics; import de.danoeh.antennapod.core.preferences.UserPreferences; import de.danoeh.antennapod.core.service.download.AntennapodHttpClient; -import de.danoeh.antennapod.core.storage.PodDBAdapter; import de.danoeh.antennapod.core.util.NetworkUtils; import de.danoeh.antennapod.core.util.gui.NotificationUtils; +import de.danoeh.antennapod.storage.database.PodDBAdapter; import java.io.File; diff --git a/core/src/main/java/de/danoeh/antennapod/core/feed/LocalFeedUpdater.java b/core/src/main/java/de/danoeh/antennapod/core/feed/LocalFeedUpdater.java index e0e1bbaa5..4cf2703d6 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/feed/LocalFeedUpdater.java +++ b/core/src/main/java/de/danoeh/antennapod/core/feed/LocalFeedUpdater.java @@ -22,12 +22,12 @@ import java.util.Set; import java.util.UUID; import de.danoeh.antennapod.core.R; -import de.danoeh.antennapod.core.service.download.DownloadStatus; +import de.danoeh.antennapod.model.download.DownloadStatus; 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.parser.feed.util.DateUtils; -import de.danoeh.antennapod.core.util.DownloadError; +import de.danoeh.antennapod.model.download.DownloadError; import de.danoeh.antennapod.model.feed.Feed; import de.danoeh.antennapod.model.feed.FeedItem; import de.danoeh.antennapod.model.feed.FeedMedia; diff --git a/core/src/main/java/de/danoeh/antennapod/core/feed/SubscriptionsFilter.java b/core/src/main/java/de/danoeh/antennapod/core/feed/SubscriptionsFilter.java index a083a7220..7e80fb231 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/feed/SubscriptionsFilter.java +++ b/core/src/main/java/de/danoeh/antennapod/core/feed/SubscriptionsFilter.java @@ -5,7 +5,7 @@ import android.text.TextUtils; import java.util.ArrayList; import java.util.List; -import de.danoeh.antennapod.core.util.LongIntMap; +import de.danoeh.antennapod.storage.database.LongIntMap; import de.danoeh.antennapod.model.feed.Feed; import de.danoeh.antennapod.model.feed.FeedPreferences; diff --git a/core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java b/core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java index 82e1fb55a..f6caa9016 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java +++ b/core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java @@ -13,6 +13,7 @@ import androidx.annotation.VisibleForTesting; import androidx.core.app.NotificationCompat; import androidx.preference.PreferenceManager; +import de.danoeh.antennapod.model.feed.FeedCounter; import org.json.JSONArray; import org.json.JSONException; @@ -141,11 +142,6 @@ public class UserPreferences { public static final int FEED_ORDER_COUNTER = 0; public static final int FEED_ORDER_ALPHABETICAL = 1; public static final int FEED_ORDER_MOST_PLAYED = 3; - public static final int FEED_COUNTER_SHOW_NEW_UNPLAYED_SUM = 0; - public static final int FEED_COUNTER_SHOW_NEW = 1; - public static final int FEED_COUNTER_SHOW_UNPLAYED = 2; - public static final int FEED_COUNTER_SHOW_NONE = 3; - public static final int FEED_COUNTER_SHOW_DOWNLOADED = 4; private static Context context; private static SharedPreferences prefs; @@ -247,9 +243,9 @@ public class UserPreferences { .apply(); } - public static int getFeedCounterSetting() { - String value = prefs.getString(PREF_DRAWER_FEED_COUNTER, "" + FEED_COUNTER_SHOW_NEW); - return Integer.parseInt(value); + public static FeedCounter getFeedCounterSetting() { + String value = prefs.getString(PREF_DRAWER_FEED_COUNTER, "" + FeedCounter.SHOW_NEW.id); + return FeedCounter.fromOrdinal(Integer.parseInt(value)); } /** diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java b/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java index 1973c626b..1522f42e2 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java @@ -20,6 +20,7 @@ import androidx.core.app.ServiceCompat; import androidx.core.content.ContextCompat; import de.danoeh.antennapod.core.R; import de.danoeh.antennapod.core.feed.LocalFeedUpdater; +import de.danoeh.antennapod.model.download.DownloadStatus; import org.apache.commons.io.FileUtils; import org.greenrobot.eventbus.EventBus; @@ -50,7 +51,7 @@ import de.danoeh.antennapod.core.service.download.handler.PostDownloaderTask; 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.util.DownloadError; +import de.danoeh.antennapod.model.download.DownloadError; /** * Manages the download of feedfiles in the app. Downloads can be enqueued via the startService intent. diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadServiceNotification.java b/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadServiceNotification.java index 48a9e8017..5c5d665d8 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadServiceNotification.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadServiceNotification.java @@ -10,6 +10,7 @@ import androidx.core.app.NotificationCompat; import de.danoeh.antennapod.core.ClientConfig; import de.danoeh.antennapod.core.R; import de.danoeh.antennapod.core.util.DownloadErrorLabel; +import de.danoeh.antennapod.model.download.DownloadStatus; import de.danoeh.antennapod.model.feed.Feed; import de.danoeh.antennapod.model.feed.FeedMedia; import de.danoeh.antennapod.core.util.gui.NotificationUtils; diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/download/Downloader.java b/core/src/main/java/de/danoeh/antennapod/core/service/download/Downloader.java index 3cc16d12a..fe44faac9 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/download/Downloader.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/download/Downloader.java @@ -9,6 +9,7 @@ import java.util.concurrent.Callable; import de.danoeh.antennapod.core.ClientConfig; import de.danoeh.antennapod.core.R; +import de.danoeh.antennapod.model.download.DownloadStatus; /** * Downloads files diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/download/HttpDownloader.java b/core/src/main/java/de/danoeh/antennapod/core/service/download/HttpDownloader.java index 698278af9..894428f44 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/download/HttpDownloader.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/download/HttpDownloader.java @@ -5,6 +5,7 @@ import android.text.TextUtils; import android.util.Log; import de.danoeh.antennapod.core.util.NetworkUtils; +import de.danoeh.antennapod.model.download.DownloadStatus; import okhttp3.CacheControl; import org.apache.commons.io.IOUtils; @@ -24,7 +25,7 @@ import java.util.Date; import de.danoeh.antennapod.core.R; import de.danoeh.antennapod.model.feed.FeedMedia; import de.danoeh.antennapod.parser.feed.util.DateUtils; -import de.danoeh.antennapod.core.util.DownloadError; +import de.danoeh.antennapod.model.download.DownloadError; import de.danoeh.antennapod.core.util.StorageUtils; import de.danoeh.antennapod.core.util.URIUtil; import okhttp3.OkHttpClient; diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/download/NewEpisodesNotification.java b/core/src/main/java/de/danoeh/antennapod/core/service/download/NewEpisodesNotification.java index f7ed049cd..0e046978e 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/download/NewEpisodesNotification.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/download/NewEpisodesNotification.java @@ -17,12 +17,12 @@ import com.bumptech.glide.Glide; import com.bumptech.glide.request.RequestOptions; import de.danoeh.antennapod.core.R; import de.danoeh.antennapod.model.feed.Feed; +import de.danoeh.antennapod.model.feed.FeedCounter; import de.danoeh.antennapod.model.feed.FeedPreferences; import de.danoeh.antennapod.core.glide.ApGlideSettings; -import de.danoeh.antennapod.core.preferences.UserPreferences; -import de.danoeh.antennapod.core.storage.PodDBAdapter; -import de.danoeh.antennapod.core.util.LongIntMap; +import de.danoeh.antennapod.storage.database.LongIntMap; import de.danoeh.antennapod.core.util.gui.NotificationUtils; +import de.danoeh.antennapod.storage.database.PodDBAdapter; public class NewEpisodesNotification { private static final String TAG = "NewEpisodesNotification"; @@ -36,7 +36,7 @@ public class NewEpisodesNotification { public void loadCountersBeforeRefresh() { PodDBAdapter adapter = PodDBAdapter.getInstance(); adapter.open(); - countersBefore = adapter.getFeedCounters(UserPreferences.FEED_COUNTER_SHOW_NEW); + countersBefore = adapter.getFeedCounters(FeedCounter.SHOW_NEW); adapter.close(); } @@ -130,7 +130,7 @@ public class NewEpisodesNotification { private static int getNewEpisodeCount(long feedId) { PodDBAdapter adapter = PodDBAdapter.getInstance(); adapter.open(); - int episodeCount = adapter.getFeedCounters(UserPreferences.FEED_COUNTER_SHOW_NEW, feedId).get(feedId); + int episodeCount = adapter.getFeedCounters(FeedCounter.SHOW_NEW, feedId).get(feedId); adapter.close(); return episodeCount; } diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/download/handler/FeedParserTask.java b/core/src/main/java/de/danoeh/antennapod/core/service/download/handler/FeedParserTask.java index 7e3b07880..76c464a6d 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/download/handler/FeedParserTask.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/download/handler/FeedParserTask.java @@ -7,11 +7,11 @@ import de.danoeh.antennapod.model.feed.FeedItem; import de.danoeh.antennapod.model.feed.FeedPreferences; import de.danoeh.antennapod.model.feed.VolumeAdaptionSetting; import de.danoeh.antennapod.core.service.download.DownloadRequest; -import de.danoeh.antennapod.core.service.download.DownloadStatus; +import de.danoeh.antennapod.model.download.DownloadStatus; import de.danoeh.antennapod.parser.feed.FeedHandler; import de.danoeh.antennapod.parser.feed.FeedHandlerResult; import de.danoeh.antennapod.parser.feed.UnsupportedFeedtypeException; -import de.danoeh.antennapod.core.util.DownloadError; +import de.danoeh.antennapod.model.download.DownloadError; import de.danoeh.antennapod.core.util.InvalidFeedException; import org.xml.sax.SAXException; diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/download/handler/FeedSyncTask.java b/core/src/main/java/de/danoeh/antennapod/core/service/download/handler/FeedSyncTask.java index 8f559a889..042a903d3 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/download/handler/FeedSyncTask.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/download/handler/FeedSyncTask.java @@ -4,7 +4,7 @@ import android.content.Context; import de.danoeh.antennapod.model.feed.Feed; import de.danoeh.antennapod.core.service.download.DownloadRequest; -import de.danoeh.antennapod.core.service.download.DownloadStatus; +import de.danoeh.antennapod.model.download.DownloadStatus; import de.danoeh.antennapod.core.storage.DBTasks; import de.danoeh.antennapod.parser.feed.FeedHandlerResult; diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/download/handler/MediaDownloadedHandler.java b/core/src/main/java/de/danoeh/antennapod/core/service/download/handler/MediaDownloadedHandler.java index 541e17cf6..90254c1f3 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/download/handler/MediaDownloadedHandler.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/download/handler/MediaDownloadedHandler.java @@ -13,12 +13,12 @@ import java.util.concurrent.ExecutionException; import de.danoeh.antennapod.event.UnreadItemsUpdateEvent; import de.danoeh.antennapod.core.service.download.DownloadRequest; -import de.danoeh.antennapod.core.service.download.DownloadStatus; +import de.danoeh.antennapod.model.download.DownloadStatus; import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.core.storage.DBWriter; import de.danoeh.antennapod.core.sync.queue.SynchronizationQueueSink; import de.danoeh.antennapod.core.util.ChapterUtils; -import de.danoeh.antennapod.core.util.DownloadError; +import de.danoeh.antennapod.model.download.DownloadError; import de.danoeh.antennapod.model.feed.FeedItem; import de.danoeh.antennapod.model.feed.FeedMedia; import de.danoeh.antennapod.net.sync.model.EpisodeAction; diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java b/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java index c7b72c332..64cf446aa 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java @@ -15,7 +15,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import de.danoeh.antennapod.core.storage.mapper.DownloadStatusCursorMapper; import de.danoeh.antennapod.model.feed.Chapter; import de.danoeh.antennapod.model.feed.Feed; import de.danoeh.antennapod.model.feed.FeedItem; @@ -24,13 +23,15 @@ import de.danoeh.antennapod.model.feed.FeedMedia; import de.danoeh.antennapod.model.feed.FeedPreferences; import de.danoeh.antennapod.core.feed.SubscriptionsFilter; import de.danoeh.antennapod.core.preferences.UserPreferences; -import de.danoeh.antennapod.core.service.download.DownloadStatus; -import de.danoeh.antennapod.core.storage.mapper.ChapterCursorMapper; -import de.danoeh.antennapod.core.storage.mapper.FeedCursorMapper; -import de.danoeh.antennapod.core.storage.mapper.FeedItemCursorMapper; -import de.danoeh.antennapod.core.storage.mapper.FeedMediaCursorMapper; -import de.danoeh.antennapod.core.storage.mapper.FeedPreferencesCursorMapper; -import de.danoeh.antennapod.core.util.LongIntMap; +import de.danoeh.antennapod.model.download.DownloadStatus; +import de.danoeh.antennapod.storage.database.PodDBAdapter; +import de.danoeh.antennapod.storage.database.mapper.DownloadStatusCursorMapper; +import de.danoeh.antennapod.storage.database.mapper.ChapterCursorMapper; +import de.danoeh.antennapod.storage.database.mapper.FeedCursorMapper; +import de.danoeh.antennapod.storage.database.mapper.FeedItemCursorMapper; +import de.danoeh.antennapod.storage.database.mapper.FeedMediaCursorMapper; +import de.danoeh.antennapod.storage.database.mapper.FeedPreferencesCursorMapper; +import de.danoeh.antennapod.storage.database.LongIntMap; import de.danoeh.antennapod.core.util.LongList; import de.danoeh.antennapod.core.util.comparator.DownloadStatusComparator; import de.danoeh.antennapod.core.util.comparator.FeedItemPubdateComparator; @@ -877,7 +878,7 @@ public final class DBReader { PodDBAdapter adapter = PodDBAdapter.getInstance(); adapter.open(); - final LongIntMap feedCounters = adapter.getFeedCounters(); + final LongIntMap feedCounters = adapter.getFeedCounters(UserPreferences.getFeedCounterSetting()); SubscriptionsFilter subscriptionsFilter = UserPreferences.getSubscriptionsFilter(); List feeds = subscriptionsFilter.filter(getFeedList(adapter), feedCounters); diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/DBTasks.java b/core/src/main/java/de/danoeh/antennapod/core/storage/DBTasks.java index f447090a8..e5310c4ff 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/DBTasks.java +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/DBTasks.java @@ -13,6 +13,8 @@ import androidx.annotation.VisibleForTesting; import de.danoeh.antennapod.core.service.download.DownloadRequest; import de.danoeh.antennapod.core.service.download.DownloadRequestCreator; import de.danoeh.antennapod.core.service.download.DownloadService; +import de.danoeh.antennapod.storage.database.PodDBAdapter; +import de.danoeh.antennapod.storage.database.mapper.FeedCursorMapper; import org.greenrobot.eventbus.EventBus; import java.util.ArrayList; @@ -32,11 +34,10 @@ import de.danoeh.antennapod.event.FeedItemEvent; import de.danoeh.antennapod.event.FeedListUpdateEvent; import de.danoeh.antennapod.event.MessageEvent; import de.danoeh.antennapod.core.preferences.UserPreferences; -import de.danoeh.antennapod.core.service.download.DownloadStatus; -import de.danoeh.antennapod.core.storage.mapper.FeedCursorMapper; +import de.danoeh.antennapod.model.download.DownloadStatus; import de.danoeh.antennapod.core.sync.SyncService; import de.danoeh.antennapod.core.sync.queue.SynchronizationQueueSink; -import de.danoeh.antennapod.core.util.DownloadError; +import de.danoeh.antennapod.model.download.DownloadError; import de.danoeh.antennapod.core.util.LongList; import de.danoeh.antennapod.core.util.comparator.FeedItemPubdateComparator; import de.danoeh.antennapod.model.feed.Feed; diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/DBWriter.java b/core/src/main/java/de/danoeh/antennapod/core/storage/DBWriter.java index e572b4d8c..df4094590 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/DBWriter.java +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/DBWriter.java @@ -9,6 +9,7 @@ import androidx.annotation.Nullable; import androidx.core.app.NotificationManagerCompat; import de.danoeh.antennapod.core.service.download.DownloadService; +import de.danoeh.antennapod.storage.database.PodDBAdapter; import org.greenrobot.eventbus.EventBus; import java.io.File; @@ -34,7 +35,7 @@ import de.danoeh.antennapod.event.UnreadItemsUpdateEvent; import de.danoeh.antennapod.core.feed.FeedEvent; 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.model.download.DownloadStatus; import de.danoeh.antennapod.core.service.playback.PlaybackService; import de.danoeh.antennapod.core.sync.queue.SynchronizationQueueSink; import de.danoeh.antennapod.core.util.FeedItemPermutors; diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/DatabaseExporter.java b/core/src/main/java/de/danoeh/antennapod/core/storage/DatabaseExporter.java index a0fac0c74..812080368 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/DatabaseExporter.java +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/DatabaseExporter.java @@ -8,6 +8,7 @@ import android.os.ParcelFileDescriptor; import android.text.format.Formatter; import android.util.Log; import de.danoeh.antennapod.core.R; +import de.danoeh.antennapod.storage.database.PodDBAdapter; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/NavDrawerData.java b/core/src/main/java/de/danoeh/antennapod/core/storage/NavDrawerData.java index 1ec58216a..24b55f9f4 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/NavDrawerData.java +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/NavDrawerData.java @@ -1,7 +1,7 @@ package de.danoeh.antennapod.core.storage; import de.danoeh.antennapod.model.feed.Feed; -import de.danoeh.antennapod.core.util.LongIntMap; +import de.danoeh.antennapod.storage.database.LongIntMap; import java.util.ArrayList; import java.util.List; diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/mapper/ChapterCursorMapper.java b/core/src/main/java/de/danoeh/antennapod/core/storage/mapper/ChapterCursorMapper.java deleted file mode 100644 index 5fa376129..000000000 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/mapper/ChapterCursorMapper.java +++ /dev/null @@ -1,51 +0,0 @@ -package de.danoeh.antennapod.core.storage.mapper; - -import android.database.Cursor; -import androidx.annotation.NonNull; -import de.danoeh.antennapod.model.feed.Chapter; -import de.danoeh.antennapod.parser.feed.element.SimpleChapter; -import de.danoeh.antennapod.core.storage.PodDBAdapter; -import de.danoeh.antennapod.parser.media.id3.ID3Chapter; -import de.danoeh.antennapod.parser.media.vorbis.VorbisCommentChapter; - -/** - * Converts a {@link Cursor} to a {@link Chapter} object. - */ -public abstract class ChapterCursorMapper { - /** - * Create a {@link Chapter} instance from a database row (cursor). - */ - @NonNull - public static Chapter convert(@NonNull Cursor cursor) { - int indexId = cursor.getColumnIndex(PodDBAdapter.KEY_ID); - int indexTitle = cursor.getColumnIndex(PodDBAdapter.KEY_TITLE); - int indexStart = cursor.getColumnIndex(PodDBAdapter.KEY_START); - int indexLink = cursor.getColumnIndex(PodDBAdapter.KEY_LINK); - int indexImage = cursor.getColumnIndex(PodDBAdapter.KEY_IMAGE_URL); - int indexChapterType = cursor.getColumnIndex(PodDBAdapter.KEY_CHAPTER_TYPE); - - long id = cursor.getLong(indexId); - String title = cursor.getString(indexTitle); - long start = cursor.getLong(indexStart); - String link = cursor.getString(indexLink); - String imageUrl = cursor.getString(indexImage); - int chapterType = cursor.getInt(indexChapterType); - - Chapter chapter; - switch (chapterType) { - case SimpleChapter.CHAPTERTYPE_SIMPLECHAPTER: - chapter = new SimpleChapter(start, title, link, imageUrl); - break; - case ID3Chapter.CHAPTERTYPE_ID3CHAPTER: - chapter = new ID3Chapter(start, title, link, imageUrl); - break; - case VorbisCommentChapter.CHAPTERTYPE_VORBISCOMMENT_CHAPTER: - chapter = new VorbisCommentChapter(start, title, link, imageUrl); - break; - default: - throw new IllegalArgumentException("Unknown chapter type"); - } - chapter.setId(id); - return chapter; - } -} diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/DownloadErrorLabel.java b/core/src/main/java/de/danoeh/antennapod/core/util/DownloadErrorLabel.java index 8834350d1..3d2558a9f 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/util/DownloadErrorLabel.java +++ b/core/src/main/java/de/danoeh/antennapod/core/util/DownloadErrorLabel.java @@ -3,6 +3,7 @@ package de.danoeh.antennapod.core.util; import androidx.annotation.StringRes; import de.danoeh.antennapod.core.BuildConfig; import de.danoeh.antennapod.core.R; +import de.danoeh.antennapod.model.download.DownloadError; /** * Provides user-visible labels for download errors. diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/comparator/DownloadStatusComparator.java b/core/src/main/java/de/danoeh/antennapod/core/util/comparator/DownloadStatusComparator.java index 868f3b835..68b38ec7f 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/util/comparator/DownloadStatusComparator.java +++ b/core/src/main/java/de/danoeh/antennapod/core/util/comparator/DownloadStatusComparator.java @@ -2,7 +2,7 @@ package de.danoeh.antennapod.core.util.comparator; import java.util.Comparator; -import de.danoeh.antennapod.core.service.download.DownloadStatus; +import de.danoeh.antennapod.model.download.DownloadStatus; /** Compares the completion date of two Downloadstatus objects. */ public class DownloadStatusComparator implements Comparator { diff --git a/core/src/test/java/de/danoeh/antennapod/core/feed/LocalFeedUpdaterTest.java b/core/src/test/java/de/danoeh/antennapod/core/feed/LocalFeedUpdaterTest.java index 37d525670..bafee7293 100644 --- a/core/src/test/java/de/danoeh/antennapod/core/feed/LocalFeedUpdaterTest.java +++ b/core/src/test/java/de/danoeh/antennapod/core/feed/LocalFeedUpdaterTest.java @@ -14,6 +14,7 @@ import androidx.test.platform.app.InstrumentationRegistry; import de.danoeh.antennapod.core.preferences.PlaybackPreferences; import de.danoeh.antennapod.model.feed.Feed; import de.danoeh.antennapod.model.feed.FeedItem; +import de.danoeh.antennapod.storage.database.PodDBAdapter; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -34,7 +35,6 @@ import de.danoeh.antennapod.core.ClientConfig; import de.danoeh.antennapod.core.preferences.UserPreferences; import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.core.storage.DBWriter; -import de.danoeh.antennapod.core.storage.PodDBAdapter; import static org.hamcrest.CoreMatchers.endsWith; import static org.hamcrest.CoreMatchers.is; diff --git a/core/src/test/java/de/danoeh/antennapod/core/storage/DbCleanupTests.java b/core/src/test/java/de/danoeh/antennapod/core/storage/DbCleanupTests.java index b5c2e5c73..5aa670736 100644 --- a/core/src/test/java/de/danoeh/antennapod/core/storage/DbCleanupTests.java +++ b/core/src/test/java/de/danoeh/antennapod/core/storage/DbCleanupTests.java @@ -21,6 +21,7 @@ import de.danoeh.antennapod.model.feed.FeedMedia; import de.danoeh.antennapod.core.preferences.PlaybackPreferences; import de.danoeh.antennapod.core.preferences.UserPreferences; +import de.danoeh.antennapod.storage.database.PodDBAdapter; import org.junit.After; import org.junit.Before; import org.junit.Test; diff --git a/core/src/test/java/de/danoeh/antennapod/core/storage/DbNullCleanupAlgorithmTest.java b/core/src/test/java/de/danoeh/antennapod/core/storage/DbNullCleanupAlgorithmTest.java index 6485c9515..09a2580b1 100644 --- a/core/src/test/java/de/danoeh/antennapod/core/storage/DbNullCleanupAlgorithmTest.java +++ b/core/src/test/java/de/danoeh/antennapod/core/storage/DbNullCleanupAlgorithmTest.java @@ -15,6 +15,7 @@ import de.danoeh.antennapod.model.feed.Feed; import de.danoeh.antennapod.model.feed.FeedItem; import de.danoeh.antennapod.model.feed.FeedMedia; import de.danoeh.antennapod.core.preferences.UserPreferences; +import de.danoeh.antennapod.storage.database.PodDBAdapter; import org.junit.After; import org.junit.Before; import org.junit.Test; diff --git a/core/src/test/java/de/danoeh/antennapod/core/storage/DbReaderTest.java b/core/src/test/java/de/danoeh/antennapod/core/storage/DbReaderTest.java index c9be06afd..834442fdd 100644 --- a/core/src/test/java/de/danoeh/antennapod/core/storage/DbReaderTest.java +++ b/core/src/test/java/de/danoeh/antennapod/core/storage/DbReaderTest.java @@ -13,6 +13,7 @@ import de.danoeh.antennapod.model.feed.FeedItem; import de.danoeh.antennapod.model.feed.FeedMedia; import de.danoeh.antennapod.core.preferences.UserPreferences; import de.danoeh.antennapod.core.util.LongList; +import de.danoeh.antennapod.storage.database.PodDBAdapter; import org.junit.After; import org.junit.Before; import org.junit.Test; diff --git a/core/src/test/java/de/danoeh/antennapod/core/storage/DbTasksTest.java b/core/src/test/java/de/danoeh/antennapod/core/storage/DbTasksTest.java index 0d98ba294..0779c6ae3 100644 --- a/core/src/test/java/de/danoeh/antennapod/core/storage/DbTasksTest.java +++ b/core/src/test/java/de/danoeh/antennapod/core/storage/DbTasksTest.java @@ -5,6 +5,7 @@ import android.content.Context; import androidx.test.platform.app.InstrumentationRegistry; +import de.danoeh.antennapod.storage.database.PodDBAdapter; import org.junit.After; import org.junit.Before; import org.junit.Test; diff --git a/core/src/test/java/de/danoeh/antennapod/core/storage/DbTestUtils.java b/core/src/test/java/de/danoeh/antennapod/core/storage/DbTestUtils.java index 413243d1d..3a3213a37 100644 --- a/core/src/test/java/de/danoeh/antennapod/core/storage/DbTestUtils.java +++ b/core/src/test/java/de/danoeh/antennapod/core/storage/DbTestUtils.java @@ -9,8 +9,8 @@ import de.danoeh.antennapod.model.feed.Chapter; import de.danoeh.antennapod.model.feed.Feed; import de.danoeh.antennapod.model.feed.FeedItem; import de.danoeh.antennapod.model.feed.FeedMedia; -import de.danoeh.antennapod.parser.feed.element.SimpleChapter; import de.danoeh.antennapod.core.util.comparator.FeedItemPubdateComparator; +import de.danoeh.antennapod.storage.database.PodDBAdapter; import static org.junit.Assert.assertTrue; @@ -56,7 +56,7 @@ abstract class DbTestUtils { List chapters = new ArrayList<>(); item.setChapters(chapters); for (int k = 0; k < numChapters; k++) { - chapters.add(new SimpleChapter(k, "item " + j + " chapter " + k, + chapters.add(new Chapter(k, "item " + j + " chapter " + k, "http://example.com", "http://example.com/image.png")); } } diff --git a/core/src/test/java/de/danoeh/antennapod/core/storage/DbWriterTest.java b/core/src/test/java/de/danoeh/antennapod/core/storage/DbWriterTest.java index 5e73773db..de1e78408 100644 --- a/core/src/test/java/de/danoeh/antennapod/core/storage/DbWriterTest.java +++ b/core/src/test/java/de/danoeh/antennapod/core/storage/DbWriterTest.java @@ -10,6 +10,7 @@ import androidx.core.util.Consumer; import androidx.preference.PreferenceManager; import androidx.test.platform.app.InstrumentationRegistry; +import de.danoeh.antennapod.storage.database.PodDBAdapter; import org.awaitility.Awaitility; import org.junit.After; import org.junit.Before; diff --git a/core/src/test/java/de/danoeh/antennapod/core/storage/mapper/FeedCursorMapperTest.java b/core/src/test/java/de/danoeh/antennapod/core/storage/mapper/FeedCursorMapperTest.java index 8695f98b1..486aa82a8 100644 --- a/core/src/test/java/de/danoeh/antennapod/core/storage/mapper/FeedCursorMapperTest.java +++ b/core/src/test/java/de/danoeh/antennapod/core/storage/mapper/FeedCursorMapperTest.java @@ -6,6 +6,8 @@ import android.database.Cursor; import androidx.test.platform.app.InstrumentationRegistry; +import de.danoeh.antennapod.storage.database.PodDBAdapter; +import de.danoeh.antennapod.storage.database.mapper.FeedCursorMapper; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -13,7 +15,6 @@ import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; import de.danoeh.antennapod.model.feed.Feed; -import de.danoeh.antennapod.core.storage.PodDBAdapter; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; diff --git a/core/src/test/java/de/danoeh/antennapod/core/util/LongLongMapTest.java b/core/src/test/java/de/danoeh/antennapod/core/util/LongLongMapTest.java index 21df71bec..03326d3b1 100644 --- a/core/src/test/java/de/danoeh/antennapod/core/util/LongLongMapTest.java +++ b/core/src/test/java/de/danoeh/antennapod/core/util/LongLongMapTest.java @@ -1,5 +1,6 @@ package de.danoeh.antennapod.core.util; +import de.danoeh.antennapod.storage.database.LongIntMap; import org.junit.Test; import static org.junit.Assert.assertEquals; diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/DownloadError.java b/model/src/main/java/de/danoeh/antennapod/model/download/DownloadError.java similarity index 96% rename from core/src/main/java/de/danoeh/antennapod/core/util/DownloadError.java rename to model/src/main/java/de/danoeh/antennapod/model/download/DownloadError.java index 06ec8396f..a2f987a86 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/util/DownloadError.java +++ b/model/src/main/java/de/danoeh/antennapod/model/download/DownloadError.java @@ -1,4 +1,4 @@ -package de.danoeh.antennapod.core.util; +package de.danoeh.antennapod.model.download; /** Utility class for Download Errors. */ public enum DownloadError { diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadStatus.java b/model/src/main/java/de/danoeh/antennapod/model/download/DownloadStatus.java similarity index 97% rename from core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadStatus.java rename to model/src/main/java/de/danoeh/antennapod/model/download/DownloadStatus.java index 9d4f1ab43..0a18973df 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadStatus.java +++ b/model/src/main/java/de/danoeh/antennapod/model/download/DownloadStatus.java @@ -1,11 +1,10 @@ -package de.danoeh.antennapod.core.service.download; +package de.danoeh.antennapod.model.download; import androidx.annotation.NonNull; import java.util.Date; import de.danoeh.antennapod.model.feed.FeedFile; -import de.danoeh.antennapod.core.util.DownloadError; /** * Contains status attributes for one download diff --git a/model/src/main/java/de/danoeh/antennapod/model/feed/Chapter.java b/model/src/main/java/de/danoeh/antennapod/model/feed/Chapter.java index 0508df901..e55364dd9 100644 --- a/model/src/main/java/de/danoeh/antennapod/model/feed/Chapter.java +++ b/model/src/main/java/de/danoeh/antennapod/model/feed/Chapter.java @@ -1,31 +1,23 @@ package de.danoeh.antennapod.model.feed; -public abstract class Chapter extends FeedComponent { - +public class Chapter extends FeedComponent { /** Defines starting point in milliseconds. */ private long start; private String title; private String link; private String imageUrl; + private String chapterId; - protected Chapter() { + public Chapter() { } - protected Chapter(long start) { - super(); - this.start = start; - } - - protected Chapter(long start, String title, String link, String imageUrl) { - super(); + public Chapter(long start, String title, String link, String imageUrl) { this.start = start; this.title = title; this.link = link; this.imageUrl = imageUrl; } - public abstract int getChapterType(); - public long getStart() { return start; } @@ -58,8 +50,24 @@ public abstract class Chapter extends FeedComponent { this.imageUrl = imageUrl; } + /** + * ID from the chapter source, not the database ID. + */ + public String getChapterId() { + return chapterId; + } + + public void setChapterId(String chapterId) { + this.chapterId = chapterId; + } + @Override public String getHumanReadableIdentifier() { return title; } + + @Override + public String toString() { + return "ID3Chapter [title=" + getTitle() + ", start=" + getStart() + ", url=" + getLink() + "]"; + } } diff --git a/model/src/main/java/de/danoeh/antennapod/model/feed/FeedCounter.java b/model/src/main/java/de/danoeh/antennapod/model/feed/FeedCounter.java new file mode 100644 index 000000000..eef1cc1ef --- /dev/null +++ b/model/src/main/java/de/danoeh/antennapod/model/feed/FeedCounter.java @@ -0,0 +1,24 @@ +package de.danoeh.antennapod.model.feed; + +public enum FeedCounter { + SHOW_NEW_UNPLAYED_SUM(0), + SHOW_NEW(1), + SHOW_UNPLAYED(2), + SHOW_NONE(3), + SHOW_DOWNLOADED(4); + + public final int id; + + FeedCounter(int id) { + this.id = id; + } + + public static FeedCounter fromOrdinal(int id) { + for (FeedCounter counter : values()) { + if (counter.id == id) { + return counter; + } + } + return SHOW_NONE; + } +} diff --git a/parser/feed/src/main/java/de/danoeh/antennapod/parser/feed/element/SimpleChapter.java b/parser/feed/src/main/java/de/danoeh/antennapod/parser/feed/element/SimpleChapter.java deleted file mode 100644 index 069e49f09..000000000 --- a/parser/feed/src/main/java/de/danoeh/antennapod/parser/feed/element/SimpleChapter.java +++ /dev/null @@ -1,16 +0,0 @@ -package de.danoeh.antennapod.parser.feed.element; - -import de.danoeh.antennapod.model.feed.Chapter; - -public class SimpleChapter extends Chapter { - public static final int CHAPTERTYPE_SIMPLECHAPTER = 0; - - public SimpleChapter(long start, String title, String link, String imageUrl) { - super(start, title, link, imageUrl); - } - - @Override - public int getChapterType() { - return CHAPTERTYPE_SIMPLECHAPTER; - } -} diff --git a/parser/feed/src/main/java/de/danoeh/antennapod/parser/feed/namespace/SimpleChapters.java b/parser/feed/src/main/java/de/danoeh/antennapod/parser/feed/namespace/SimpleChapters.java index e1912ed45..dd116e189 100644 --- a/parser/feed/src/main/java/de/danoeh/antennapod/parser/feed/namespace/SimpleChapters.java +++ b/parser/feed/src/main/java/de/danoeh/antennapod/parser/feed/namespace/SimpleChapters.java @@ -2,8 +2,8 @@ package de.danoeh.antennapod.parser.feed.namespace; import android.util.Log; +import de.danoeh.antennapod.model.feed.Chapter; import de.danoeh.antennapod.parser.feed.HandlerState; -import de.danoeh.antennapod.parser.feed.element.SimpleChapter; import de.danoeh.antennapod.parser.feed.element.SyndElement; import de.danoeh.antennapod.parser.feed.util.DateUtils; import org.xml.sax.Attributes; @@ -37,7 +37,7 @@ public class SimpleChapters extends Namespace { String title = attributes.getValue(TITLE); String link = attributes.getValue(HREF); String imageUrl = attributes.getValue(IMAGE); - SimpleChapter chapter = new SimpleChapter(start, title, link, imageUrl); + Chapter chapter = new Chapter(start, title, link, imageUrl); currentItem.getChapters().add(chapter); } catch (NumberFormatException e) { Log.e(TAG, "Unable to read chapter", e); diff --git a/parser/media/src/main/java/de/danoeh/antennapod/parser/media/id3/ChapterReader.java b/parser/media/src/main/java/de/danoeh/antennapod/parser/media/id3/ChapterReader.java index ac79432b5..62322e7b2 100644 --- a/parser/media/src/main/java/de/danoeh/antennapod/parser/media/id3/ChapterReader.java +++ b/parser/media/src/main/java/de/danoeh/antennapod/parser/media/id3/ChapterReader.java @@ -50,7 +50,10 @@ public class ChapterReader extends ID3Reader { String elementId = readIsoStringNullTerminated(100); long startTime = readInt(); skipBytes(12); // Ignore end time, start offset, end offset - ID3Chapter chapter = new ID3Chapter(elementId, startTime); + + Chapter chapter = new Chapter(); + chapter.setStart(startTime); + chapter.setChapterId(elementId); // Read sub-frames while (getPosition() < chapterStartedPosition + frameHeader.getSize()) { diff --git a/parser/media/src/main/java/de/danoeh/antennapod/parser/media/id3/ID3Chapter.java b/parser/media/src/main/java/de/danoeh/antennapod/parser/media/id3/ID3Chapter.java deleted file mode 100644 index 5396025e9..000000000 --- a/parser/media/src/main/java/de/danoeh/antennapod/parser/media/id3/ID3Chapter.java +++ /dev/null @@ -1,33 +0,0 @@ -package de.danoeh.antennapod.parser.media.id3; - -import de.danoeh.antennapod.model.feed.Chapter; - -public class ID3Chapter extends Chapter { - public static final int CHAPTERTYPE_ID3CHAPTER = 2; - - /** - * Identifies the chapter in its ID3 tag. This attribute does not have to be - * store in the DB and is only used for parsing. - */ - private String id3ID; - - public ID3Chapter(String id3ID, long start) { - super(start); - this.id3ID = id3ID; - } - - public ID3Chapter(long start, String title, String link, String imageUrl) { - super(start, title, link, imageUrl); - } - - @Override - public String toString() { - return "ID3Chapter [id3ID=" + id3ID + ", title=" + getTitle() + ", start=" - + getStart() + ", url=" + getLink() + "]"; - } - - @Override - public int getChapterType() { - return CHAPTERTYPE_ID3CHAPTER; - } -} diff --git a/parser/media/src/main/java/de/danoeh/antennapod/parser/media/vorbis/VorbisCommentChapter.java b/parser/media/src/main/java/de/danoeh/antennapod/parser/media/vorbis/VorbisCommentChapter.java deleted file mode 100644 index 88ee7fef9..000000000 --- a/parser/media/src/main/java/de/danoeh/antennapod/parser/media/vorbis/VorbisCommentChapter.java +++ /dev/null @@ -1,88 +0,0 @@ -package de.danoeh.antennapod.parser.media.vorbis; - -import java.util.concurrent.TimeUnit; - -import de.danoeh.antennapod.model.feed.Chapter; - -public class VorbisCommentChapter extends Chapter { - public static final int CHAPTERTYPE_VORBISCOMMENT_CHAPTER = 3; - - private static final int CHAPTERXXX_LENGTH = "chapterxxx".length(); - - private int vorbisCommentId; - - public VorbisCommentChapter(int vorbisCommentId) { - this.vorbisCommentId = vorbisCommentId; - } - - public VorbisCommentChapter(long start, String title, String link, String imageUrl) { - super(start, title, link, imageUrl); - } - - @Override - public String toString() { - return "VorbisCommentChapter [id=" + getId() + ", title=" + getTitle() - + ", link=" + getLink() + ", start=" + getStart() + "]"; - } - - public static long getStartTimeFromValue(String value) - throws VorbisCommentReaderException { - String[] parts = value.split(":"); - if (parts.length >= 3) { - try { - long hours = TimeUnit.MILLISECONDS.convert( - Long.parseLong(parts[0]), TimeUnit.HOURS); - long minutes = TimeUnit.MILLISECONDS.convert( - Long.parseLong(parts[1]), TimeUnit.MINUTES); - if (parts[2].contains("-->")) { - parts[2] = parts[2].substring(0, parts[2].indexOf("-->")); - } - long seconds = TimeUnit.MILLISECONDS.convert( - ((long) Float.parseFloat(parts[2])), TimeUnit.SECONDS); - return hours + minutes + seconds; - } catch (NumberFormatException e) { - throw new VorbisCommentReaderException(e); - } - } else { - throw new VorbisCommentReaderException("Invalid time string"); - } - } - - /** - * Return the id of a vorbiscomment chapter from a string like CHAPTERxxx* - * - * @return the id of the chapter key or -1 if the id couldn't be read. - * @throws VorbisCommentReaderException - * */ - public static int getIDFromKey(String key) throws VorbisCommentReaderException { - if (key.length() >= CHAPTERXXX_LENGTH) { // >= CHAPTERxxx - try { - String strId = key.substring(8, 10); - return Integer.parseInt(strId); - } catch (NumberFormatException e) { - throw new VorbisCommentReaderException(e); - } - } - throw new VorbisCommentReaderException("key is too short (" + key + ")"); - } - - /** - * Get the string that comes after 'CHAPTERxxx', for example 'name' or - * 'url'. - */ - public static String getAttributeTypeFromKey(String key) { - if (key.length() > CHAPTERXXX_LENGTH) { - return key.substring(CHAPTERXXX_LENGTH); - } - return null; - } - - @Override - public int getChapterType() { - return CHAPTERTYPE_VORBISCOMMENT_CHAPTER; - } - - public int getVorbisCommentId() { - return vorbisCommentId; - } -} diff --git a/parser/media/src/main/java/de/danoeh/antennapod/parser/media/vorbis/VorbisCommentChapterReader.java b/parser/media/src/main/java/de/danoeh/antennapod/parser/media/vorbis/VorbisCommentChapterReader.java index 82455d180..e3b91a0e7 100644 --- a/parser/media/src/main/java/de/danoeh/antennapod/parser/media/vorbis/VorbisCommentChapterReader.java +++ b/parser/media/src/main/java/de/danoeh/antennapod/parser/media/vorbis/VorbisCommentChapterReader.java @@ -4,6 +4,7 @@ import android.util.Log; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.TimeUnit; import de.danoeh.antennapod.model.feed.Chapter; import de.danoeh.antennapod.parser.media.BuildConfig; @@ -14,6 +15,7 @@ public class VorbisCommentChapterReader extends VorbisCommentReader { private static final String CHAPTER_KEY = "chapter\\d\\d\\d.*"; private static final String CHAPTER_ATTRIBUTE_TITLE = "name"; private static final String CHAPTER_ATTRIBUTE_LINK = "url"; + private static final int CHAPTERXXX_LENGTH = "chapterxxx".length(); private List chapters; @@ -41,14 +43,15 @@ public class VorbisCommentChapterReader extends VorbisCommentReader { if (BuildConfig.DEBUG) { Log.d(TAG, "Key: " + key + ", value: " + value); } - String attribute = VorbisCommentChapter.getAttributeTypeFromKey(key); - int id = VorbisCommentChapter.getIDFromKey(key); + String attribute = getAttributeTypeFromKey(key); + int id = getIdFromKey(key); Chapter chapter = getChapterById(id); if (attribute == null) { if (getChapterById(id) == null) { // new chapter - long start = VorbisCommentChapter.getStartTimeFromValue(value); - chapter = new VorbisCommentChapter(id); + long start = getStartTimeFromValue(value); + chapter = new Chapter(); + chapter.setChapterId("" + id); chapter.setStart(start); chapters.add(chapter); } else { @@ -80,13 +83,65 @@ public class VorbisCommentChapterReader extends VorbisCommentReader { private Chapter getChapterById(long id) { for (Chapter c : chapters) { - if (((VorbisCommentChapter) c).getVorbisCommentId() == id) { + if (("" + id).equals(c.getChapterId())) { return c; } } return null; } + public static long getStartTimeFromValue(String value) + throws VorbisCommentReaderException { + String[] parts = value.split(":"); + if (parts.length >= 3) { + try { + long hours = TimeUnit.MILLISECONDS.convert( + Long.parseLong(parts[0]), TimeUnit.HOURS); + long minutes = TimeUnit.MILLISECONDS.convert( + Long.parseLong(parts[1]), TimeUnit.MINUTES); + if (parts[2].contains("-->")) { + parts[2] = parts[2].substring(0, parts[2].indexOf("-->")); + } + long seconds = TimeUnit.MILLISECONDS.convert( + ((long) Float.parseFloat(parts[2])), TimeUnit.SECONDS); + return hours + minutes + seconds; + } catch (NumberFormatException e) { + throw new VorbisCommentReaderException(e); + } + } else { + throw new VorbisCommentReaderException("Invalid time string"); + } + } + + /** + * Return the id of a vorbiscomment chapter from a string like CHAPTERxxx* + * + * @return the id of the chapter key or -1 if the id couldn't be read. + * @throws VorbisCommentReaderException + * */ + private static int getIdFromKey(String key) throws VorbisCommentReaderException { + if (key.length() >= CHAPTERXXX_LENGTH) { // >= CHAPTERxxx + try { + String strId = key.substring(8, 10); + return Integer.parseInt(strId); + } catch (NumberFormatException e) { + throw new VorbisCommentReaderException(e); + } + } + throw new VorbisCommentReaderException("key is too short (" + key + ")"); + } + + /** + * Get the string that comes after 'CHAPTERxxx', for example 'name' or + * 'url'. + */ + private static String getAttributeTypeFromKey(String key) { + if (key.length() > CHAPTERXXX_LENGTH) { + return key.substring(CHAPTERXXX_LENGTH); + } + return null; + } + public List getChapters() { return chapters; } diff --git a/parser/media/src/test/java/de/danoeh/antennapod/parser/media/id3/ChapterReaderTest.java b/parser/media/src/test/java/de/danoeh/antennapod/parser/media/id3/ChapterReaderTest.java index f87764c7f..d7321f766 100644 --- a/parser/media/src/test/java/de/danoeh/antennapod/parser/media/id3/ChapterReaderTest.java +++ b/parser/media/src/test/java/de/danoeh/antennapod/parser/media/id3/ChapterReaderTest.java @@ -96,7 +96,7 @@ public class ChapterReaderTest { FrameHeader header = new FrameHeader(ChapterReader.FRAME_ID_TITLE, titleSubframeContent.length, (short) 0); CountingInputStream inputStream = new CountingInputStream(new ByteArrayInputStream(titleSubframeContent)); ChapterReader reader = new ChapterReader(inputStream); - Chapter chapter = new ID3Chapter("", 0); + Chapter chapter = new Chapter(); reader.readChapterSubFrame(header, chapter); assertEquals("A", chapter.getTitle()); diff --git a/settings.gradle b/settings.gradle index d4e10e5ec..5abffe27c 100644 --- a/settings.gradle +++ b/settings.gradle @@ -13,6 +13,8 @@ include ':parser:media' include ':playback:base' include ':playback:cast' +include ':storage:database' + include ':ui:app-start-intent' include ':ui:common' include ':ui:i18n' diff --git a/storage/README.md b/storage/README.md new file mode 100644 index 000000000..adabdc7a6 --- /dev/null +++ b/storage/README.md @@ -0,0 +1,3 @@ +# :storage + +Data storage for podcast data (subscriptions, playback state) and settings (but not settings UI). diff --git a/storage/database/README.md b/storage/database/README.md new file mode 100644 index 000000000..45af475f2 --- /dev/null +++ b/storage/database/README.md @@ -0,0 +1,3 @@ +# :storage:database + +AntennaPod's main database, containing subscriptions and playback state (but not user settings). diff --git a/storage/database/build.gradle b/storage/database/build.gradle new file mode 100644 index 000000000..141cdb086 --- /dev/null +++ b/storage/database/build.gradle @@ -0,0 +1,17 @@ +plugins { + id("com.android.library") +} +apply from: "../../common.gradle" + +android { + lintOptions { + disable "StaticFieldLeak" + } +} + +dependencies { + implementation project(':model') + + annotationProcessor "androidx.annotation:annotation:$annotationVersion" + implementation "commons-io:commons-io:$commonsioVersion" +} diff --git a/storage/database/src/main/AndroidManifest.xml b/storage/database/src/main/AndroidManifest.xml new file mode 100644 index 000000000..df0171d12 --- /dev/null +++ b/storage/database/src/main/AndroidManifest.xml @@ -0,0 +1 @@ + diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/DBUpgrader.java b/storage/database/src/main/java/de/danoeh/antennapod/storage/database/DBUpgrader.java similarity index 99% rename from core/src/main/java/de/danoeh/antennapod/core/storage/DBUpgrader.java rename to storage/database/src/main/java/de/danoeh/antennapod/storage/database/DBUpgrader.java index 4e0a6aeda..1954a5652 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/DBUpgrader.java +++ b/storage/database/src/main/java/de/danoeh/antennapod/storage/database/DBUpgrader.java @@ -1,4 +1,4 @@ -package de.danoeh.antennapod.core.storage; +package de.danoeh.antennapod.storage.database; import android.content.ContentValues; import android.database.Cursor; @@ -39,7 +39,7 @@ class DBUpgrader { } if (oldVersion <= 6) { db.execSQL("ALTER TABLE " + PodDBAdapter.TABLE_NAME_SIMPLECHAPTERS - + " ADD COLUMN " + PodDBAdapter.KEY_CHAPTER_TYPE + " INTEGER"); + + " ADD COLUMN type INTEGER"); } if (oldVersion <= 7) { db.execSQL("ALTER TABLE " + PodDBAdapter.TABLE_NAME_FEED_MEDIA @@ -117,7 +117,7 @@ class DBUpgrader { PodDBAdapter.KEY_START, PodDBAdapter.KEY_FEEDITEM, PodDBAdapter.KEY_LINK, - PodDBAdapter.KEY_CHAPTER_TYPE)); + "type")); } if (oldVersion <= 14) { db.execSQL("ALTER TABLE " + PodDBAdapter.TABLE_NAME_FEED_ITEMS diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/LongIntMap.java b/storage/database/src/main/java/de/danoeh/antennapod/storage/database/LongIntMap.java similarity index 99% rename from core/src/main/java/de/danoeh/antennapod/core/util/LongIntMap.java rename to storage/database/src/main/java/de/danoeh/antennapod/storage/database/LongIntMap.java index 78ed002ac..049b24627 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/util/LongIntMap.java +++ b/storage/database/src/main/java/de/danoeh/antennapod/storage/database/LongIntMap.java @@ -1,4 +1,4 @@ -package de.danoeh.antennapod.core.util; +package de.danoeh.antennapod.storage.database; import java.util.Arrays; diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java b/storage/database/src/main/java/de/danoeh/antennapod/storage/database/PodDBAdapter.java similarity index 98% rename from core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java rename to storage/database/src/main/java/de/danoeh/antennapod/storage/database/PodDBAdapter.java index ea4617f16..7994861e8 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java +++ b/storage/database/src/main/java/de/danoeh/antennapod/storage/database/PodDBAdapter.java @@ -1,4 +1,4 @@ -package de.danoeh.antennapod.core.storage; +package de.danoeh.antennapod.storage.database; import android.content.ContentValues; import android.content.Context; @@ -17,9 +17,8 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; +import de.danoeh.antennapod.model.feed.FeedCounter; import de.danoeh.antennapod.model.feed.FeedFunding; -import de.danoeh.antennapod.core.storage.mapper.FeedItemFilterQuery; -import org.apache.commons.io.FileUtils; import java.io.File; import java.io.IOException; @@ -36,10 +35,10 @@ import de.danoeh.antennapod.model.feed.FeedItem; import de.danoeh.antennapod.model.feed.FeedItemFilter; import de.danoeh.antennapod.model.feed.FeedMedia; import de.danoeh.antennapod.model.feed.FeedPreferences; -import de.danoeh.antennapod.core.preferences.UserPreferences; -import de.danoeh.antennapod.core.service.download.DownloadStatus; -import de.danoeh.antennapod.core.util.LongIntMap; +import de.danoeh.antennapod.model.download.DownloadStatus; import de.danoeh.antennapod.model.feed.SortOrder; +import de.danoeh.antennapod.storage.database.mapper.FeedItemFilterQuery; +import org.apache.commons.io.FileUtils; import static de.danoeh.antennapod.model.feed.FeedPreferences.SPEED_USE_GLOBAL; import static de.danoeh.antennapod.model.feed.SortOrder.toCodeString; @@ -93,7 +92,6 @@ public class PodDBAdapter { public static final String KEY_FEED_IDENTIFIER = "feed_identifier"; public static final String KEY_REASON_DETAILED = "reason_detailed"; public static final String KEY_DOWNLOADSTATUS_TITLE = "title"; - public static final String KEY_CHAPTER_TYPE = "type"; public static final String KEY_PLAYBACK_COMPLETION_DATE = "playback_completion_date"; public static final String KEY_AUTO_DOWNLOAD_ATTEMPTS = "auto_download"; public static final String KEY_AUTO_DOWNLOAD_ENABLED = "auto_download"; // Both tables use the same key @@ -195,7 +193,7 @@ public class PodDBAdapter { private static final String CREATE_TABLE_SIMPLECHAPTERS = "CREATE TABLE " + TABLE_NAME_SIMPLECHAPTERS + " (" + TABLE_PRIMARY_KEY + KEY_TITLE + " TEXT," + KEY_START + " INTEGER," + KEY_FEEDITEM + " INTEGER," - + KEY_LINK + " TEXT," + KEY_IMAGE_URL + " TEXT," + KEY_CHAPTER_TYPE + " INTEGER)"; + + KEY_LINK + " TEXT," + KEY_IMAGE_URL + " TEXT)"; // SQL Statements for creating indexes static final String CREATE_INDEX_FEEDITEMS_FEED = "CREATE INDEX " @@ -720,7 +718,6 @@ public class PodDBAdapter { values.put(KEY_FEEDITEM, item.getId()); values.put(KEY_LINK, chapter.getLink()); values.put(KEY_IMAGE_URL, chapter.getImageUrl()); - values.put(KEY_CHAPTER_TYPE, chapter.getChapterType()); if (chapter.getId() == 0) { chapter.setId(db.insert(TABLE_NAME_SIMPLECHAPTERS, null, values)); } else { @@ -737,7 +734,7 @@ public class PodDBAdapter { db.execSQL(sql); } - void setFeedCustomTitle(long feedId, String customTitle) { + public void setFeedCustomTitle(long feedId, String customTitle) { ContentValues values = new ContentValues(); values.put(KEY_CUSTOM_TITLE, customTitle); db.update(TABLE_NAME_FEEDS, values, KEY_ID + "=?", new String[]{String.valueOf(feedId)}); @@ -1174,29 +1171,23 @@ public class PodDBAdapter { return result; } - public final LongIntMap getFeedCounters(long... feedIds) { - int setting = UserPreferences.getFeedCounterSetting(); - - return getFeedCounters(setting, feedIds); - } - - public final LongIntMap getFeedCounters(int setting, long... feedIds) { + public final LongIntMap getFeedCounters(FeedCounter setting, long... feedIds) { String whereRead; switch (setting) { - case UserPreferences.FEED_COUNTER_SHOW_NEW_UNPLAYED_SUM: + case SHOW_NEW_UNPLAYED_SUM: whereRead = "(" + KEY_READ + "=" + FeedItem.NEW + " OR " + KEY_READ + "=" + FeedItem.UNPLAYED + ")"; break; - case UserPreferences.FEED_COUNTER_SHOW_NEW: + case SHOW_NEW: whereRead = KEY_READ + "=" + FeedItem.NEW; break; - case UserPreferences.FEED_COUNTER_SHOW_UNPLAYED: + case SHOW_UNPLAYED: whereRead = KEY_READ + "=" + FeedItem.UNPLAYED; break; - case UserPreferences.FEED_COUNTER_SHOW_DOWNLOADED: + case SHOW_DOWNLOADED: whereRead = KEY_DOWNLOADED + "=1"; break; - case UserPreferences.FEED_COUNTER_SHOW_NONE: + case SHOW_NONE: // deliberate fall-through default: // NONE return new LongIntMap(0); diff --git a/storage/database/src/main/java/de/danoeh/antennapod/storage/database/mapper/ChapterCursorMapper.java b/storage/database/src/main/java/de/danoeh/antennapod/storage/database/mapper/ChapterCursorMapper.java new file mode 100644 index 000000000..71e67812d --- /dev/null +++ b/storage/database/src/main/java/de/danoeh/antennapod/storage/database/mapper/ChapterCursorMapper.java @@ -0,0 +1,32 @@ +package de.danoeh.antennapod.storage.database.mapper; + +import android.database.Cursor; +import androidx.annotation.NonNull; +import de.danoeh.antennapod.model.feed.Chapter; +import de.danoeh.antennapod.storage.database.PodDBAdapter; + +/** + * Converts a {@link Cursor} to a {@link Chapter} object. + */ +public abstract class ChapterCursorMapper { + /** + * Create a {@link Chapter} instance from a database row (cursor). + */ + @NonNull + public static Chapter convert(@NonNull Cursor cursor) { + int indexId = cursor.getColumnIndex(PodDBAdapter.KEY_ID); + int indexTitle = cursor.getColumnIndex(PodDBAdapter.KEY_TITLE); + int indexStart = cursor.getColumnIndex(PodDBAdapter.KEY_START); + int indexLink = cursor.getColumnIndex(PodDBAdapter.KEY_LINK); + int indexImage = cursor.getColumnIndex(PodDBAdapter.KEY_IMAGE_URL); + + long id = cursor.getLong(indexId); + String title = cursor.getString(indexTitle); + long start = cursor.getLong(indexStart); + String link = cursor.getString(indexLink); + String imageUrl = cursor.getString(indexImage); + Chapter chapter = new Chapter(start, title, link, imageUrl); + chapter.setId(id); + return chapter; + } +} diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/mapper/DownloadStatusCursorMapper.java b/storage/database/src/main/java/de/danoeh/antennapod/storage/database/mapper/DownloadStatusCursorMapper.java similarity index 86% rename from core/src/main/java/de/danoeh/antennapod/core/storage/mapper/DownloadStatusCursorMapper.java rename to storage/database/src/main/java/de/danoeh/antennapod/storage/database/mapper/DownloadStatusCursorMapper.java index f8b57b819..4a5a792af 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/mapper/DownloadStatusCursorMapper.java +++ b/storage/database/src/main/java/de/danoeh/antennapod/storage/database/mapper/DownloadStatusCursorMapper.java @@ -1,10 +1,10 @@ -package de.danoeh.antennapod.core.storage.mapper; +package de.danoeh.antennapod.storage.database.mapper; import android.database.Cursor; import androidx.annotation.NonNull; -import de.danoeh.antennapod.core.service.download.DownloadStatus; -import de.danoeh.antennapod.core.storage.PodDBAdapter; -import de.danoeh.antennapod.core.util.DownloadError; +import de.danoeh.antennapod.model.download.DownloadStatus; +import de.danoeh.antennapod.model.download.DownloadError; +import de.danoeh.antennapod.storage.database.PodDBAdapter; import java.util.Date; diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/mapper/FeedCursorMapper.java b/storage/database/src/main/java/de/danoeh/antennapod/storage/database/mapper/FeedCursorMapper.java similarity index 96% rename from core/src/main/java/de/danoeh/antennapod/core/storage/mapper/FeedCursorMapper.java rename to storage/database/src/main/java/de/danoeh/antennapod/storage/database/mapper/FeedCursorMapper.java index a2a180735..25df7313f 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/mapper/FeedCursorMapper.java +++ b/storage/database/src/main/java/de/danoeh/antennapod/storage/database/mapper/FeedCursorMapper.java @@ -1,4 +1,4 @@ -package de.danoeh.antennapod.core.storage.mapper; +package de.danoeh.antennapod.storage.database.mapper; import android.database.Cursor; @@ -6,8 +6,8 @@ import androidx.annotation.NonNull; import de.danoeh.antennapod.model.feed.Feed; import de.danoeh.antennapod.model.feed.FeedPreferences; -import de.danoeh.antennapod.core.storage.PodDBAdapter; import de.danoeh.antennapod.model.feed.SortOrder; +import de.danoeh.antennapod.storage.database.PodDBAdapter; /** * Converts a {@link Cursor} to a {@link Feed} object. diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/mapper/FeedItemCursorMapper.java b/storage/database/src/main/java/de/danoeh/antennapod/storage/database/mapper/FeedItemCursorMapper.java similarity index 95% rename from core/src/main/java/de/danoeh/antennapod/core/storage/mapper/FeedItemCursorMapper.java rename to storage/database/src/main/java/de/danoeh/antennapod/storage/database/mapper/FeedItemCursorMapper.java index ca0834339..799ca5dde 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/mapper/FeedItemCursorMapper.java +++ b/storage/database/src/main/java/de/danoeh/antennapod/storage/database/mapper/FeedItemCursorMapper.java @@ -1,9 +1,9 @@ -package de.danoeh.antennapod.core.storage.mapper; +package de.danoeh.antennapod.storage.database.mapper; import android.database.Cursor; import androidx.annotation.NonNull; import de.danoeh.antennapod.model.feed.FeedItem; -import de.danoeh.antennapod.core.storage.PodDBAdapter; +import de.danoeh.antennapod.storage.database.PodDBAdapter; import java.util.Date; diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/mapper/FeedItemFilterQuery.java b/storage/database/src/main/java/de/danoeh/antennapod/storage/database/mapper/FeedItemFilterQuery.java similarity index 96% rename from core/src/main/java/de/danoeh/antennapod/core/storage/mapper/FeedItemFilterQuery.java rename to storage/database/src/main/java/de/danoeh/antennapod/storage/database/mapper/FeedItemFilterQuery.java index 1d9c8a9e6..1728a905f 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/mapper/FeedItemFilterQuery.java +++ b/storage/database/src/main/java/de/danoeh/antennapod/storage/database/mapper/FeedItemFilterQuery.java @@ -1,7 +1,7 @@ -package de.danoeh.antennapod.core.storage.mapper; +package de.danoeh.antennapod.storage.database.mapper; import de.danoeh.antennapod.model.feed.FeedItemFilter; -import de.danoeh.antennapod.core.storage.PodDBAdapter; +import de.danoeh.antennapod.storage.database.PodDBAdapter; import java.util.ArrayList; import java.util.List; diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/mapper/FeedMediaCursorMapper.java b/storage/database/src/main/java/de/danoeh/antennapod/storage/database/mapper/FeedMediaCursorMapper.java similarity index 96% rename from core/src/main/java/de/danoeh/antennapod/core/storage/mapper/FeedMediaCursorMapper.java rename to storage/database/src/main/java/de/danoeh/antennapod/storage/database/mapper/FeedMediaCursorMapper.java index 0dc3dc231..f57e91b83 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/mapper/FeedMediaCursorMapper.java +++ b/storage/database/src/main/java/de/danoeh/antennapod/storage/database/mapper/FeedMediaCursorMapper.java @@ -1,9 +1,9 @@ -package de.danoeh.antennapod.core.storage.mapper; +package de.danoeh.antennapod.storage.database.mapper; import android.database.Cursor; import androidx.annotation.NonNull; import de.danoeh.antennapod.model.feed.FeedMedia; -import de.danoeh.antennapod.core.storage.PodDBAdapter; +import de.danoeh.antennapod.storage.database.PodDBAdapter; import java.util.Date; diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/mapper/FeedPreferencesCursorMapper.java b/storage/database/src/main/java/de/danoeh/antennapod/storage/database/mapper/FeedPreferencesCursorMapper.java similarity index 97% rename from core/src/main/java/de/danoeh/antennapod/core/storage/mapper/FeedPreferencesCursorMapper.java rename to storage/database/src/main/java/de/danoeh/antennapod/storage/database/mapper/FeedPreferencesCursorMapper.java index f062609b6..9fc70a2d7 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/mapper/FeedPreferencesCursorMapper.java +++ b/storage/database/src/main/java/de/danoeh/antennapod/storage/database/mapper/FeedPreferencesCursorMapper.java @@ -1,4 +1,4 @@ -package de.danoeh.antennapod.core.storage.mapper; +package de.danoeh.antennapod.storage.database.mapper; import android.database.Cursor; import android.text.TextUtils; @@ -6,7 +6,7 @@ import androidx.annotation.NonNull; import de.danoeh.antennapod.model.feed.FeedFilter; import de.danoeh.antennapod.model.feed.FeedPreferences; import de.danoeh.antennapod.model.feed.VolumeAdaptionSetting; -import de.danoeh.antennapod.core.storage.PodDBAdapter; +import de.danoeh.antennapod.storage.database.PodDBAdapter; import java.util.Arrays; import java.util.HashSet;