From a96ded57f6ff4bfb8c47943af6bca7506937b020 Mon Sep 17 00:00:00 2001 From: Ivan Date: Tue, 19 Feb 2019 14:16:43 +0100 Subject: [PATCH] Added folder view for recently modified --- app/build.gradle | 4 ++-- .../eu/zderadicka/audioserve/AudioService.kt | 16 +++++++++++++++- .../eu/zderadicka/audioserve/MainActivity.kt | 18 +++++++++++++++++- .../eu/zderadicka/audioserve/data/Utils.kt | 10 ++++++++++ .../audioserve/fragments/FolderFragment.kt | 2 +- .../eu/zderadicka/audioserve/net/ApiClient.kt | 16 ++++++++++++++++ app/src/main/res/drawable/ic_menu_modified.xml | 9 +++++++++ app/src/main/res/layout/activity_main.xml | 3 ++- app/src/main/res/menu/activity_main_drawer.xml | 5 +++++ app/src/main/res/values/strings.xml | 2 ++ app/src/main/res/values/styles.xml | 4 ++++ 11 files changed, 83 insertions(+), 6 deletions(-) create mode 100644 app/src/main/res/drawable/ic_menu_modified.xml diff --git a/app/build.gradle b/app/build.gradle index 49742e7..1d739bb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -18,8 +18,8 @@ android { applicationId "eu.zderadicka.audioserve" minSdkVersion 21 targetSdkVersion 28 - versionCode 24 - versionName "0.7.4" + versionCode 25 + versionName "0.7.5" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { diff --git a/app/src/main/java/eu/zderadicka/audioserve/AudioService.kt b/app/src/main/java/eu/zderadicka/audioserve/AudioService.kt index 2617692..4342bb0 100644 --- a/app/src/main/java/eu/zderadicka/audioserve/AudioService.kt +++ b/app/src/main/java/eu/zderadicka/audioserve/AudioService.kt @@ -567,6 +567,7 @@ class AudioService : MediaBrowserServiceCompat() { const val RECENTLY_LISTENED_TAG = "__AUDIOSERVE_RECENT" const val COLLECTION_PREFIX = "__COLLECTION_" const val SEARCH_PREFIX = "__AUDIOSERVE_SEARCH_" + const val RECENTLY_MODIFIED_PREFIX = "__AUDIOSERVE_MODIFIED_" const val ITEM_IS_COLLECTION = "is-collection" } @@ -806,8 +807,21 @@ mediaSessionConnector.setErrorMessageProvider(messageProvider); } } + } else if (parentId.startsWith(RECENTLY_MODIFIED_PREFIX)) { + result.detach() + val s = parentId.substring(RECENTLY_MODIFIED_PREFIX.length) + val collection = if (s.isNullOrBlank()) 0 else s.toInt() + apiClient.loadRecent(collection, options.getBoolean(AUDIOSERVICE_FORCE_RELOAD)) + { it, err -> + if (it != null) { + result.sendResult(it.getMediaItems(cacheManager)) + currentFolder = ArrayList()//it.getPlayableItems(cacheManager) - } else if (parentId.startsWith(SEARCH_PREFIX)) { + } else { + Log.e(LOG_TAG, "Recently modified failed with $err") + } + } + }else if (parentId.startsWith(SEARCH_PREFIX)) { val s = parentId.substring(SEARCH_PREFIX.length) val m = SEARCH_RE.matchEntire(s) if (m == null) { diff --git a/app/src/main/java/eu/zderadicka/audioserve/MainActivity.kt b/app/src/main/java/eu/zderadicka/audioserve/MainActivity.kt index a0f7fc2..595b058 100644 --- a/app/src/main/java/eu/zderadicka/audioserve/MainActivity.kt +++ b/app/src/main/java/eu/zderadicka/audioserve/MainActivity.kt @@ -62,6 +62,7 @@ class MainActivity : AppCompatActivity(), private lateinit var controllerFragment: ControllerFragment private var pendingMediaItem: MediaBrowserCompat.MediaItem? = null private var searchPrefix: String? = null + private var collection: Int? = null private var folderDetails: Bundle? = null private val mediaServiceConnectionCallback = object : MediaBrowserCompat.ConnectionCallback() { @@ -183,10 +184,17 @@ class MainActivity : AppCompatActivity(), ctl.prepareFromMediaId(item.mediaId, extras) } - val collection: Int? = collectionFromFolderId(folderId)?: collectionFromSearchId(folderId) + collection = collectionFromFolderId(folderId)?: collectionFromSearchId(folderId)?: collectionFromModifiedId(folderId) searchPrefix = if (collection == null || isOffline) null else "${AudioService.SEARCH_PREFIX}${collection}_" + Log.d(LOG_TAG, "Loaded folder ${folderId} in collection ${collection}") this.folderDetails = folderDetails invalidateOptionsMenu() + updateDrawerMenu() + } + + private fun updateDrawerMenu() { + val menu = nav_view.menu + menu.findItem(R.id.nav_modified).isVisible = collection != null } private fun stopPlayback() { @@ -518,6 +526,14 @@ class MainActivity : AppCompatActivity(), } R.id.nav_bookmarks -> { openBookmarksFolder() + } + R.id.nav_modified -> { + collection?.let { + val folderId = AudioService.RECENTLY_MODIFIED_PREFIX +it + newFolderFragment(folderId, getString(R.string.recently_modified)) + } + + } R.id.nav_sleep -> { val d = SleepDialogFragment() diff --git a/app/src/main/java/eu/zderadicka/audioserve/data/Utils.kt b/app/src/main/java/eu/zderadicka/audioserve/data/Utils.kt index edf9462..3e46c56 100644 --- a/app/src/main/java/eu/zderadicka/audioserve/data/Utils.kt +++ b/app/src/main/java/eu/zderadicka/audioserve/data/Utils.kt @@ -215,6 +215,16 @@ fun collectionFromSearchId(folderId:String): Int? { return null } +fun collectionFromModifiedId(folderId:String): Int? { + if (folderId.startsWith(AudioService.RECENTLY_MODIFIED_PREFIX)) { + val m = BEGIN_NUMBERS_RE.find(folderId.substring(AudioService.RECENTLY_MODIFIED_PREFIX.length)) + if (m!=null) { + return m.value.toInt() + } + } + return null +} + fun duplicateMediaItemWithExtrasAssured(item: MediaBrowserCompat.MediaItem):MediaBrowserCompat.MediaItem { val desc = MediaDescriptionCompat.Builder() .setMediaId(item.description.mediaId) diff --git a/app/src/main/java/eu/zderadicka/audioserve/fragments/FolderFragment.kt b/app/src/main/java/eu/zderadicka/audioserve/fragments/FolderFragment.kt index 7908bcc..eda8a52 100644 --- a/app/src/main/java/eu/zderadicka/audioserve/fragments/FolderFragment.kt +++ b/app/src/main/java/eu/zderadicka/audioserve/fragments/FolderFragment.kt @@ -422,7 +422,7 @@ class FolderFragment : MediaFragment(), BaseFolderFragment { val view = inflater.inflate(R.layout.fragment_folder, container, false) folderView = view.findViewById(R.id.folderView) folderView.layoutManager = LinearLayoutManager(context) - val isSearch = folderId.startsWith(AudioService.SEARCH_PREFIX ) + val isSearch = folderId.startsWith(AudioService.SEARCH_PREFIX) || folderId.startsWith(AudioService.RECENTLY_MODIFIED_PREFIX) adapter = FolderAdapter(context!!, isSearch) {item, action, currentlyPlaying -> mediaActivity?.onItemClicked(item, action, currentlyPlaying) } diff --git a/app/src/main/java/eu/zderadicka/audioserve/net/ApiClient.kt b/app/src/main/java/eu/zderadicka/audioserve/net/ApiClient.kt index 5f174af..0fd8f22 100644 --- a/app/src/main/java/eu/zderadicka/audioserve/net/ApiClient.kt +++ b/app/src/main/java/eu/zderadicka/audioserve/net/ApiClient.kt @@ -226,6 +226,22 @@ class ApiClient private constructor(val context: Context) { } + fun loadRecent(collection: Int, forceReload: Boolean, callback: (AudioFolder?, ApiError?) -> Unit) { + var uri = baseUrl + if (collection > 0) { + uri += "$collection/" + } + uri += "recent" + sendRequest(uri, forceReload, { + val f = parseFolderfromJson(it, "recent", "") + if (collection > 0) { + f.collectionIndex = collection + } + f + }, callback) + + } + fun loadCollections(callback: (ArrayList?, ApiError?) -> Unit) { loadCollections(false, callback) } diff --git a/app/src/main/res/drawable/ic_menu_modified.xml b/app/src/main/res/drawable/ic_menu_modified.xml new file mode 100644 index 0000000..ce9baf4 --- /dev/null +++ b/app/src/main/res/drawable/ic_menu_modified.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index a7032f4..f18762e 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -19,6 +19,7 @@ android:layout_height="match_parent" android:layout_gravity="start" android:fitsSystemWindows="true" - app:menu="@menu/activity_main_drawer" /> + app:menu="@menu/activity_main_drawer" + app:itemTextAppearance="@style/NavDrawerStyle"/> diff --git a/app/src/main/res/menu/activity_main_drawer.xml b/app/src/main/res/menu/activity_main_drawer.xml index f3e2c8b..1d08886 100644 --- a/app/src/main/res/menu/activity_main_drawer.xml +++ b/app/src/main/res/menu/activity_main_drawer.xml @@ -20,6 +20,11 @@ android:id="@+id/nav_bookmarks" android:icon="@drawable/ic_bookmark" android:title="@string/action_bookmarks" /> + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3374d71..32b1181 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -110,4 +110,6 @@ Normal volume limits If Volume boost switch is on volume will be amplified by %1$s dB (valid values are 1 - 30 dB) Pitch: + Recently Modified + Recently Modified Folders diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 20a4172..70cc2da 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -61,6 +61,10 @@ @android:color/white + +