From cec6e36e634b3c68bfd491c5e128616549688feb Mon Sep 17 00:00:00 2001 From: Andrey Pavlenko Date: Tue, 8 Dec 2020 00:54:05 +0300 Subject: [PATCH] Fixes --- build.gradle | 12 ++-- depends/utils | 2 +- .../media/engine/MetadataRetriever.java | 69 ++++++++++++++++--- .../me/aap/fermata/media/lib/MediaLib.java | 3 +- .../ui/activity/MainActivityDelegate.java | 12 ++-- .../fermata/ui/fragment/MediaLibFragment.java | 2 + modules/exoplayer/build.gradle | 4 -- modules/vlc/build.gradle | 4 -- .../fermata/addon/web/yt/YoutubeFragment.java | 14 ++++ 9 files changed, 91 insertions(+), 31 deletions(-) diff --git a/build.gradle b/build.gradle index 20cfb17f..0fb356da 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ ext { def abi = project.properties['ABI'] - VERSION_CODE = 76 - VERSION_NAME = "1.7.2" + VERSION_CODE = 77 + VERSION_NAME = "1.7.3" SDK_MIN_VERSION = 23 SDK_TARGET_VERSION = 29 SDK_COMPILE_VERSION = 29 @@ -14,7 +14,7 @@ ext { ANDROIDX_CORE_VERSION = '1.3.2' ANDROIDX_MEDIA_VERSION = '1.2.0' ANDROIDX_APPCOMPAT_VERSION = '1.2.0' - ANDROIDX_CONSTRAINTLAYOUT_VERSION = '2.0.4' + ANDROIDX_CONSTRAINTLAYOUT_VERSION = '2.0.1' } buildscript { @@ -25,7 +25,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:4.1.1' + classpath 'com.android.tools.build:gradle:4.0.0' classpath 'com.google.gms:google-services:4.3.4' } } @@ -65,6 +65,10 @@ subprojects { vectorDrawables.useSupportLibrary = true testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" resConfigs "en", "ru" + + ndk { + abiFilters = ABI_FILTERS + } } if (isDynFeature) { diff --git a/depends/utils b/depends/utils index f3f1911a..a7b7f50d 160000 --- a/depends/utils +++ b/depends/utils @@ -1 +1 @@ -Subproject commit f3f1911a6c83a153fe7b63dd1d3cbb194c7adf9b +Subproject commit a7b7f50db82390e0d947953152401c4639461db1 diff --git a/fermata/src/main/java/me/aap/fermata/media/engine/MetadataRetriever.java b/fermata/src/main/java/me/aap/fermata/media/engine/MetadataRetriever.java index 10e4af1b..cf8741d9 100644 --- a/fermata/src/main/java/me/aap/fermata/media/engine/MetadataRetriever.java +++ b/fermata/src/main/java/me/aap/fermata/media/engine/MetadataRetriever.java @@ -7,7 +7,7 @@ import android.graphics.Bitmap; import android.media.MediaMetadata; import android.net.Uri; -import android.os.ParcelFileDescriptor; +import android.provider.MediaStore; import android.support.v4.media.MediaMetadataCompat; import androidx.annotation.Nullable; @@ -31,6 +31,7 @@ import me.aap.utils.text.SharedTextBuilder; import me.aap.utils.text.TextBuilder; import me.aap.utils.vfs.VirtualResource; +import me.aap.utils.vfs.content.ContentFileSystem; import static me.aap.utils.async.Completed.completedEmptyMap; import static me.aap.utils.async.Completed.completedVoid; @@ -53,6 +54,14 @@ public class MetadataRetriever implements Closeable { private static final String COL_ID_PATTERN = COL_ID + " LIKE ? AND NOT " + COL_ID + " LIKE ?"; private static final String[] QUERY_COLUMNS = {COL_ID, COL_TITLE, COL_ALBUM, COL_ARTIST, COL_DURATION, COL_ART}; + private static final String[] CONTENT_COLUMNS = { + MediaStore.MediaColumns.TITLE, + MediaStore.Audio.AudioColumns.DURATION, + MediaStore.Audio.AudioColumns.ARTIST, + "album_artist", + MediaStore.Audio.AudioColumns.ALBUM, + MediaStore.Audio.AudioColumns.COMPOSER, + "genre"}; private final MediaEngineManager mgr; private final BitmapCache bitmapCache; @@ -102,9 +111,22 @@ private MetadataBuilder load(PlayableItem item) { if (meta != null) return meta; MetaBuilder mb = new MetaBuilder(); + VirtualResource file = item.getResource(); + + if (file.getVirtualFileSystem() instanceof ContentFileSystem) { + if (queryContentProvider(file.getRid().toAndroidUri(), mb)) { + try { + insertMetadata(mb, item); + } catch (Throwable ex) { + Log.e(ex, "Failed to update MediaStore"); + } + + return mb; + } + } + MediaEngineProvider mp = mgr.mediaPlayer; MediaEngineProvider vlc = mgr.vlcPlayer; - VirtualResource file = item.getResource(); if (file.isLocalFile() && file.getName().endsWith(".flac")) { // VLC does not extract images from flac, thus prefer Android extractor for local files @@ -127,6 +149,40 @@ private MetadataBuilder load(PlayableItem item) { return mb; } + private boolean queryContentProvider(Uri uri, MetaBuilder mb) { + try (Cursor c = App.get().getContentResolver().query(uri, CONTENT_COLUMNS, null, null, null)) { + if ((c == null) || !c.moveToFirst()) return false; + + String m = c.getString(1); + + if ((m != null) && !m.isEmpty()) { + try { + mb.putLong(MediaMetadata.METADATA_KEY_DURATION, Long.parseLong(m)); + } catch (NumberFormatException ex) { + Log.d(ex); + return false; + } + } else { + return false; + } + + m = c.getString(0); + if (m != null) mb.putString(MediaMetadataCompat.METADATA_KEY_TITLE, m); + m = c.getString(2); + if (m != null) mb.putString(MediaMetadataCompat.METADATA_KEY_ARTIST, m); + m = c.getString(3); + if (m != null) mb.putString(MediaMetadataCompat.METADATA_KEY_ALBUM_ARTIST, m); + m = c.getString(4); + if (m != null) mb.putString(MediaMetadataCompat.METADATA_KEY_ALBUM, m); + m = c.getString(5); + if (m != null) mb.putString(MediaMetadataCompat.METADATA_KEY_COMPOSER, m); + m = c.getString(6); + if (m != null) mb.putString(MediaMetadataCompat.METADATA_KEY_GENRE, m); + + return true; + } + } + public FutureSupplier> queryMetadata(String idPattern) { return (db != null) ? queue.enqueue(() -> query(idPattern)) : completedEmptyMap(); } @@ -239,15 +295,6 @@ private void insertMetadata(MetaBuilder meta, PlayableItem item) { db.insert(TABLE, null, values); } - @SuppressWarnings("unused") - private static boolean isBitmapUri(Context ctx, String u, Uri uri) { - try (ParcelFileDescriptor fd = ctx.getContentResolver().openFileDescriptor(uri, "r")) { - return true; - } catch (Exception ex) { - return false; - } - } - private void createTable() { if (db == null) return; diff --git a/fermata/src/main/java/me/aap/fermata/media/lib/MediaLib.java b/fermata/src/main/java/me/aap/fermata/media/lib/MediaLib.java index 81548402..aa031b36 100644 --- a/fermata/src/main/java/me/aap/fermata/media/lib/MediaLib.java +++ b/fermata/src/main/java/me/aap/fermata/media/lib/MediaLib.java @@ -37,7 +37,6 @@ import me.aap.utils.holder.IntHolder; import me.aap.utils.vfs.VirtualFileSystem; import me.aap.utils.vfs.VirtualResource; -import me.aap.utils.vfs.content.ContentFileSystem; import me.aap.utils.vfs.generic.GenericFileSystem; import static android.support.v4.media.MediaMetadataCompat.METADATA_KEY_ALBUM_ART_URI; @@ -267,7 +266,7 @@ interface PlayableItem extends Item { default boolean isStream() { VirtualFileSystem.Provider p = getResource().getVirtualFileSystem().getProvider(); - return (p instanceof GenericFileSystem.Provider) || (p instanceof ContentFileSystem.Provider); + return (p instanceof GenericFileSystem.Provider); } @NonNull diff --git a/fermata/src/main/java/me/aap/fermata/ui/activity/MainActivityDelegate.java b/fermata/src/main/java/me/aap/fermata/ui/activity/MainActivityDelegate.java index 363269dc..eefbd29c 100644 --- a/fermata/src/main/java/me/aap/fermata/ui/activity/MainActivityDelegate.java +++ b/fermata/src/main/java/me/aap/fermata/ui/activity/MainActivityDelegate.java @@ -236,11 +236,13 @@ public boolean isBarsHidden() { } public void setBarsHidden(boolean barsHidden) { - this.barsHidden = barsHidden; - int visibility = barsHidden ? GONE : VISIBLE; - ToolBarView tb = getToolBar(); - if (tb.getMediator() != ToolBarView.Mediator.Invisible.instance) tb.setVisibility(visibility); - getNavBar().setVisibility(visibility); + App.get().getHandler().post(() -> { + this.barsHidden = barsHidden; + int visibility = barsHidden ? GONE : VISIBLE; + ToolBarView tb = getToolBar(); + if (tb.getMediator() != ToolBarView.Mediator.Invisible.instance) tb.setVisibility(visibility); + getNavBar().setVisibility(visibility); + }); } public void setVideoMode(boolean videoMode, @Nullable VideoView v) { diff --git a/fermata/src/main/java/me/aap/fermata/ui/fragment/MediaLibFragment.java b/fermata/src/main/java/me/aap/fermata/ui/fragment/MediaLibFragment.java index bb2148e9..8f274bba 100644 --- a/fermata/src/main/java/me/aap/fermata/ui/fragment/MediaLibFragment.java +++ b/fermata/src/main/java/me/aap/fermata/ui/fragment/MediaLibFragment.java @@ -182,11 +182,13 @@ public void reload() { } public void refresh() { + getLib().getVfsManager().clearCache(); getAdapter().getParent().refresh(); reload(); } public void rescan() { + getLib().getVfsManager().clearCache(); getAdapter().getParent().rescan(); reload(); } diff --git a/modules/exoplayer/build.gradle b/modules/exoplayer/build.gradle index 549ad6ef..07096919 100644 --- a/modules/exoplayer/build.gradle +++ b/modules/exoplayer/build.gradle @@ -2,10 +2,6 @@ android { defaultConfig { versionCode 1 versionName "1.0" - - ndk { - abiFilters = ABI_FILTERS - } } } diff --git a/modules/vlc/build.gradle b/modules/vlc/build.gradle index f044db25..5774837e 100644 --- a/modules/vlc/build.gradle +++ b/modules/vlc/build.gradle @@ -2,10 +2,6 @@ android { defaultConfig { versionCode 1 versionName "1.0" - - ndk { - abiFilters = ABI_FILTERS - } } } diff --git a/modules/web/src/main/java/me/aap/fermata/addon/web/yt/YoutubeFragment.java b/modules/web/src/main/java/me/aap/fermata/addon/web/yt/YoutubeFragment.java index e3a7c446..961a0181 100644 --- a/modules/web/src/main/java/me/aap/fermata/addon/web/yt/YoutubeFragment.java +++ b/modules/web/src/main/java/me/aap/fermata/addon/web/yt/YoutubeFragment.java @@ -62,6 +62,20 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat webView.loadUrl(url); } + @Override + public void onPause() { + MainActivityDelegate a = MainActivityDelegate.get(getContext()); + + if ((a != null) && !a.isCarActivity()) { + FermataServiceUiBinder b = a.getMediaServiceBinder(); + if ((b != null) && (YoutubeMediaEngine.isYoutubeItem(b.getCurrentItem()))) { + b.getMediaSessionCallback().onStop(); + } + } + + super.onPause(); + } + public void loadUrl(String url) { FermataWebView v = getWebView(); if (v != null) v.loadUrl(url);