diff options
30 files changed, 177 insertions, 56 deletions
Binary files differ diff --git a/android/.idea/deploymentTargetDropDown.xml b/android/.idea/deploymentTargetDropDown.xml index 0c0c338..462cfeb 100644 --- a/android/.idea/deploymentTargetDropDown.xml +++ b/android/.idea/deploymentTargetDropDown.xml @@ -3,7 +3,20 @@ <component name="deploymentTargetDropDown"> <value> <entry key="app"> - <State /> + <State> + <targetSelectedWithDropDown> + <Target> + <type value="QUICK_BOOT_TARGET" /> + <deviceKey> + <Key> + <type value="VIRTUAL_DEVICE_PATH" /> + <value value="$USER_HOME$/.android/avd/Pixel_4a_API_31.avd" /> + </Key> + </deviceKey> + </Target> + </targetSelectedWithDropDown> + <timeTargetWasSelectedWithDropDown value="2023-10-31T18:25:15.979904Z" /> + </State> </entry> </value> </component> diff --git a/android/app/release/app-release.apk.zip b/android/app/release/app-release.apk.zip Binary files differnew file mode 100644 index 0000000..aa5811b --- /dev/null +++ b/android/app/release/app-release.apk.zip diff --git a/android/app/src/main/java/dev/equestria/mist/JavaScriptExtensions.kt b/android/app/src/main/java/dev/equestria/mist/JavaScriptExtensions.kt index 62c3b03..294e80f 100644 --- a/android/app/src/main/java/dev/equestria/mist/JavaScriptExtensions.kt +++ b/android/app/src/main/java/dev/equestria/mist/JavaScriptExtensions.kt @@ -2,6 +2,7 @@ package dev.equestria.mist import android.Manifest import android.annotation.SuppressLint +import android.app.PendingIntent import android.content.Context import android.content.Intent import android.content.pm.PackageManager @@ -148,7 +149,11 @@ class JavaScriptExtensions(originalActivity: MainActivity, private val window: W session.setCallback(callback) session.setMetadata(builder.build()) session.setPlaybackState(playbackStateBuilder.build()) + style.setMediaSession(session.sessionToken) + + notificationBuilder.setContentTitle(title) + notificationBuilder.setContentText("$artist - $album") notificationBuilder.setStyle(style) val notification = notificationBuilder.build() diff --git a/android/app/src/main/java/dev/equestria/mist/MainActivity.kt b/android/app/src/main/java/dev/equestria/mist/MainActivity.kt index 930d309..78807c2 100644 --- a/android/app/src/main/java/dev/equestria/mist/MainActivity.kt +++ b/android/app/src/main/java/dev/equestria/mist/MainActivity.kt @@ -48,6 +48,7 @@ import dev.equestria.mist.ui.theme.MistTheme class MainActivity : ComponentActivity() { private lateinit var intent: Intent + lateinit var webview: WebView @OptIn(ExperimentalMaterial3Api::class) fun showError() { @@ -101,7 +102,7 @@ class MainActivity : ComponentActivity() { } } - val channel = NotificationChannel("main", "Playback", NotificationManager.IMPORTANCE_DEFAULT).apply {} + val channel = NotificationChannel("main", "Playback", NotificationManager.IMPORTANCE_LOW).apply {} val notificationManager: NotificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager notificationManager.createNotificationChannel(channel) @@ -155,50 +156,52 @@ class MainActivity : ComponentActivity() { Log.d("StatusBarHeight", getStatusBarHeight(this).toString()) Log.d("NavigationBarHeight", getNavigationBarHeight(this).toString()) } -} - -@SuppressLint("SetJavaScriptEnabled") -@Composable -fun WebViewContainer(activity: MainActivity, intent: Intent) { - val mUrl = "https://mist.equestria.horse/app/" - - AndroidView(factory = { - WebView(it).apply { - layoutParams = ViewGroup.LayoutParams( - ViewGroup.LayoutParams.MATCH_PARENT, - ViewGroup.LayoutParams.MATCH_PARENT - ) - - clearCache(true) - clearHistory() - webViewClient = WebViewClient() - - settings.domStorageEnabled = true - settings.javaScriptEnabled = true - settings.safeBrowsingEnabled = false - settings.mediaPlaybackRequiresUserGesture = false - settings.userAgentString += " MistAndroid/" + BuildConfig.VERSION_NAME - settings.cacheMode = WebSettings.LOAD_NO_CACHE - - settings.setSupportMultipleWindows(true) - webChromeClient = object : WebChromeClient() { - override fun onCreateWindow( - view: WebView, - dialog: Boolean, - userGesture: Boolean, - resultMsg: Message - ): Boolean { - val result = view.hitTestResult - val data = result.extra - val context = view.context - val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse(data)) - context.startActivity(browserIntent) - return false + + @SuppressLint("SetJavaScriptEnabled") + @Composable + fun WebViewContainer(activity: MainActivity, intent: Intent) { + val mUrl = "https://mist.equestria.horse/app/" + + AndroidView(factory = { + WebView(it).apply { + webview = this + + layoutParams = ViewGroup.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT + ) + + clearCache(true) + clearHistory() + webViewClient = WebViewClient() + + settings.domStorageEnabled = true + settings.javaScriptEnabled = true + settings.safeBrowsingEnabled = false + settings.mediaPlaybackRequiresUserGesture = false + settings.userAgentString += " MistAndroid/" + BuildConfig.VERSION_NAME + settings.cacheMode = WebSettings.LOAD_NO_CACHE + + settings.setSupportMultipleWindows(true) + webChromeClient = object : WebChromeClient() { + override fun onCreateWindow( + view: WebView, + dialog: Boolean, + userGesture: Boolean, + resultMsg: Message + ): Boolean { + val result = view.hitTestResult + val data = result.extra + val context = view.context + val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse(data)) + context.startActivity(browserIntent) + return false + } } - } - addJavascriptInterface(JavaScriptExtensions(activity, activity.window, this, intent), "MistAndroid") - loadUrl(mUrl) - } - }) + addJavascriptInterface(JavaScriptExtensions(activity, activity.window, this, intent), "MistAndroid") + loadUrl(mUrl) + } + }) + } }
\ No newline at end of file diff --git a/android/app/src/main/res/drawable-anydpi/ic_next.xml b/android/app/src/main/res/drawable-anydpi/ic_next.xml new file mode 100644 index 0000000..76ce9be --- /dev/null +++ b/android/app/src/main/res/drawable-anydpi/ic_next.xml @@ -0,0 +1,15 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24" + android:tint="#FFFFFF"> + <group android:scaleX="0.92" + android:scaleY="0.92" + android:translateX="0.96" + android:translateY="0.96"> + <path + android:pathData="M6,18l8.5,-6L6,6v12zM16,6v12h2V6h-2z" + android:fillColor="#000000"/> + </group> +</vector> diff --git a/android/app/src/main/res/drawable-anydpi/ic_pause.xml b/android/app/src/main/res/drawable-anydpi/ic_pause.xml new file mode 100644 index 0000000..7a6a35e --- /dev/null +++ b/android/app/src/main/res/drawable-anydpi/ic_pause.xml @@ -0,0 +1,15 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24" + android:tint="#FFFFFF"> + <group android:scaleX="0.92" + android:scaleY="0.92" + android:translateX="0.96" + android:translateY="0.96"> + <path + android:pathData="M6,19h4L10,5L6,5v14zM14,5v14h4L18,5h-4z" + android:fillColor="#000000"/> + </group> +</vector> diff --git a/android/app/src/main/res/drawable-anydpi/ic_play.xml b/android/app/src/main/res/drawable-anydpi/ic_play.xml new file mode 100644 index 0000000..5abab06 --- /dev/null +++ b/android/app/src/main/res/drawable-anydpi/ic_play.xml @@ -0,0 +1,15 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24" + android:tint="#FFFFFF"> + <group android:scaleX="0.92" + android:scaleY="0.92" + android:translateX="0.96" + android:translateY="0.96"> + <path + android:pathData="M8,5v14l11,-7z" + android:fillColor="#000000"/> + </group> +</vector> diff --git a/android/app/src/main/res/drawable-anydpi/ic_prev.xml b/android/app/src/main/res/drawable-anydpi/ic_prev.xml new file mode 100644 index 0000000..99bbfd4 --- /dev/null +++ b/android/app/src/main/res/drawable-anydpi/ic_prev.xml @@ -0,0 +1,15 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24" + android:tint="#FFFFFF"> + <group android:scaleX="0.92" + android:scaleY="0.92" + android:translateX="0.96" + android:translateY="0.96"> + <path + android:pathData="M6,6h2v12L6,18zM9.5,12l8.5,6L18,6z" + android:fillColor="#000000"/> + </group> +</vector> diff --git a/android/app/src/main/res/drawable-hdpi/ic_next.png b/android/app/src/main/res/drawable-hdpi/ic_next.png Binary files differnew file mode 100644 index 0000000..0c73200 --- /dev/null +++ b/android/app/src/main/res/drawable-hdpi/ic_next.png diff --git a/android/app/src/main/res/drawable-hdpi/ic_pause.png b/android/app/src/main/res/drawable-hdpi/ic_pause.png Binary files differnew file mode 100644 index 0000000..0b92c70 --- /dev/null +++ b/android/app/src/main/res/drawable-hdpi/ic_pause.png diff --git a/android/app/src/main/res/drawable-hdpi/ic_play.png b/android/app/src/main/res/drawable-hdpi/ic_play.png Binary files differnew file mode 100644 index 0000000..440eb34 --- /dev/null +++ b/android/app/src/main/res/drawable-hdpi/ic_play.png diff --git a/android/app/src/main/res/drawable-hdpi/ic_prev.png b/android/app/src/main/res/drawable-hdpi/ic_prev.png Binary files differnew file mode 100644 index 0000000..08de7d2 --- /dev/null +++ b/android/app/src/main/res/drawable-hdpi/ic_prev.png diff --git a/android/app/src/main/res/drawable-mdpi/ic_next.png b/android/app/src/main/res/drawable-mdpi/ic_next.png Binary files differnew file mode 100644 index 0000000..116f916 --- /dev/null +++ b/android/app/src/main/res/drawable-mdpi/ic_next.png diff --git a/android/app/src/main/res/drawable-mdpi/ic_pause.png b/android/app/src/main/res/drawable-mdpi/ic_pause.png Binary files differnew file mode 100644 index 0000000..c674ea9 --- /dev/null +++ b/android/app/src/main/res/drawable-mdpi/ic_pause.png diff --git a/android/app/src/main/res/drawable-mdpi/ic_play.png b/android/app/src/main/res/drawable-mdpi/ic_play.png Binary files differnew file mode 100644 index 0000000..9611b5f --- /dev/null +++ b/android/app/src/main/res/drawable-mdpi/ic_play.png diff --git a/android/app/src/main/res/drawable-mdpi/ic_prev.png b/android/app/src/main/res/drawable-mdpi/ic_prev.png Binary files differnew file mode 100644 index 0000000..0134f9a --- /dev/null +++ b/android/app/src/main/res/drawable-mdpi/ic_prev.png diff --git a/android/app/src/main/res/drawable-xhdpi/ic_next.png b/android/app/src/main/res/drawable-xhdpi/ic_next.png Binary files differnew file mode 100644 index 0000000..99766cd --- /dev/null +++ b/android/app/src/main/res/drawable-xhdpi/ic_next.png diff --git a/android/app/src/main/res/drawable-xhdpi/ic_pause.png b/android/app/src/main/res/drawable-xhdpi/ic_pause.png Binary files differnew file mode 100644 index 0000000..70c6e09 --- /dev/null +++ b/android/app/src/main/res/drawable-xhdpi/ic_pause.png diff --git a/android/app/src/main/res/drawable-xhdpi/ic_play.png b/android/app/src/main/res/drawable-xhdpi/ic_play.png Binary files differnew file mode 100644 index 0000000..1689d6c --- /dev/null +++ b/android/app/src/main/res/drawable-xhdpi/ic_play.png diff --git a/android/app/src/main/res/drawable-xhdpi/ic_prev.png b/android/app/src/main/res/drawable-xhdpi/ic_prev.png Binary files differnew file mode 100644 index 0000000..56d6889 --- /dev/null +++ b/android/app/src/main/res/drawable-xhdpi/ic_prev.png diff --git a/android/app/src/main/res/drawable-xxhdpi/ic_next.png b/android/app/src/main/res/drawable-xxhdpi/ic_next.png Binary files differnew file mode 100644 index 0000000..966db87 --- /dev/null +++ b/android/app/src/main/res/drawable-xxhdpi/ic_next.png diff --git a/android/app/src/main/res/drawable-xxhdpi/ic_pause.png b/android/app/src/main/res/drawable-xxhdpi/ic_pause.png Binary files differnew file mode 100644 index 0000000..dd66a4c --- /dev/null +++ b/android/app/src/main/res/drawable-xxhdpi/ic_pause.png diff --git a/android/app/src/main/res/drawable-xxhdpi/ic_play.png b/android/app/src/main/res/drawable-xxhdpi/ic_play.png Binary files differnew file mode 100644 index 0000000..3dcf46a --- /dev/null +++ b/android/app/src/main/res/drawable-xxhdpi/ic_play.png diff --git a/android/app/src/main/res/drawable-xxhdpi/ic_prev.png b/android/app/src/main/res/drawable-xxhdpi/ic_prev.png Binary files differnew file mode 100644 index 0000000..9555f28 --- /dev/null +++ b/android/app/src/main/res/drawable-xxhdpi/ic_prev.png diff --git a/app/.DS_Store b/app/.DS_Store Binary files differindex 7889376..1ab3b24 100644 --- a/app/.DS_Store +++ b/app/.DS_Store diff --git a/app/index.php b/app/index.php index 601c974..6de3cdf 100644 --- a/app/index.php +++ b/app/index.php @@ -1,6 +1,21 @@ <?php header("X-Frame-Options: DENY"); require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/session.php"; global $_PROFILE; ?> +<!-- + +🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️ + + __ _ __ __ __ + / /__________ _____ _____ _____(_)___ _/ /_ / /______/ / + / __/ ___/ __ `/ __ \/ ___/ / ___/ / __ `/ __ \/ __/ ___/ / +/ /_/ / / /_/ / / / (__ ) / / / / /_/ / / / / /_(__ )_/ +\__/_/ \__,_/_/ /_/____/ /_/ /_/\__, /_/ /_/\__/____(_) + /____/ + +🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️🏳️⚧️ + +--> + <!doctype html> <html lang="en"> <head> @@ -271,6 +286,7 @@ require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/session.php"; global $_PROFI window.seekTo = (time) => { document.getElementById("player").contentDocument.getElementById("player-audio").currentTime = time; + updateAndroidNotification(); if (playingStella) { playerDocument.getElementById("player-audio-stella-side1").currentTime = playerDocument.getElementById("player-audio").currentTime; @@ -422,10 +438,16 @@ require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/session.php"; global $_PROFI } playerDocument.getElementById("player-audio").onplay = () => { + updateAndroidNotification(); + if (window.preloadedGains[window.currentSongID]) { window.currentNormalizationSource.connect(window.preloadedGains[window.currentSongID]); - window.currentNormalizationSource2.connect(window.preloadedGainsBoosted1[window.currentSongID]); - window.currentNormalizationSource3.connect(window.preloadedGainsBoosted2[window.currentSongID]); + + if (playingStella) { + window.currentNormalizationSource2.connect(window.preloadedGainsBoosted1[window.currentSongID]); + window.currentNormalizationSource3.connect(window.preloadedGainsBoosted2[window.currentSongID]); + } + window.preloadedGains[window.currentSongID].connect(window.currentNormalizationContext.destination); } @@ -447,10 +469,25 @@ require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/session.php"; global $_PROFI updateDisplay(); } + window.needsDurationChange = true; + + playerDocument.getElementById("player-audio").ondurationchange = () => { + if (window.needsDurationChange) { + updateAndroidNotification(); + window.needsDurationChange = false; + } + } + playerDocument.getElementById("player-audio").onpause = () => { if (window.preloadedGains[window.currentSongID]) { try { window.currentNormalizationSource.disconnect(window.preloadedGains[window.currentSongID]); + + if (playingStella) { + window.currentNormalizationSource2.disconnect(window.preloadedGainsBoosted1[window.currentSongID]); + window.currentNormalizationSource3.disconnect(window.preloadedGainsBoosted2[window.currentSongID]); + } + window.preloadedGains[window.currentSongID].disconnect(window.currentNormalizationContext.destination); } catch (e) { console.error(e); @@ -486,16 +523,19 @@ require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/session.php"; global $_PROFI } updateDisplay(); + updateAndroidNotification(); } } initializePlayerDocument(); - function updateDisplay() { + function updateAndroidNotification() { if (window.MistAndroid && currentSong) { window.MistAndroid.setNotificationData(currentSong.title, currentSong.artist, currentSong.album, Math.round(playerDocument.getElementById("player-audio").currentTime * 1000), Math.round(playerDocument.getElementById("player-audio").duration * 1000), !playerDocument.getElementById("player-audio").paused, buffering); } + } + function updateDisplay() { if (playerDocument.getElementById("player-audio").paused) { document.title = "Mist"; } else if (currentSong) { @@ -853,6 +893,7 @@ require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/session.php"; global $_PROFI window.currentSong = songs[id]; window.currentSongID = id; updateDisplay(); + updateAndroidNotification(); if (document.getElementById("ui").contentWindow.refreshQueue) document.getElementById("ui").contentWindow.refreshQueue(); let stellaCompatible = false; @@ -886,6 +927,7 @@ require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/session.php"; global $_PROFI cleanupPreload(); preloadMore(); + window.needsDurationChange = true; if (!stellaCompatible) { if (!window.preloadedURLs[id]) { diff --git a/app/ui/lyrics.php b/app/ui/lyrics.php index 8f50931..274ff93 100644 --- a/app/ui/lyrics.php +++ b/app/ui/lyrics.php @@ -43,7 +43,7 @@ } </style> </head> -<body class="crossplatform" style="background-color: transparent;"> +<body style="background-color: transparent;"> <script src="/assets/js/common.js"></script> <div id="lyrics-outer"> <div id="not-playing" style="position: fixed; inset: 16px; display: flex; align-items: center; justify-content: center; opacity: .5; text-align: center;"> diff --git a/assets/dark.css b/assets/dark.css index c1cd24b..21ec308 100644 --- a/assets/dark.css +++ b/assets/dark.css @@ -8,6 +8,10 @@ background-color: black !important; } + iframe#lyrics-page.mobile-show { + background-color: transparent !important; + } + .crossplatform { background-color: black !important; } diff --git a/assets/native.css b/assets/native.css index 1d892a5..8552508 100644 --- a/assets/native.css +++ b/assets/native.css @@ -6,12 +6,6 @@ body.native { background-color: white !important; } -@media (prefers-color-scheme: dark) { - #ui, #lyrics-page, #lyrics-body { - background-color: black !important; - } -} - body.navigation-body { background-color: rgba(255, 255, 255, .1) !important; border-right: 1px solid rgba(0, 0, 0, .1) !important; |