From 77ef0c119b6f6c9d60ae655a6cca0a2cdb646d8e Mon Sep 17 00:00:00 2001 From: advplyr Date: Mon, 4 Apr 2022 19:08:27 -0500 Subject: [PATCH] Refactor capacitor plugins, clean up and organize android plugin classes --- .../com/audiobookshelf/app/MainActivity.kt | 14 +- .../com/audiobookshelf/app/data/DbManager.kt | 190 +---------------- .../AbsAudioPlayer.kt} | 11 +- .../audiobookshelf/app/plugins/AbsDatabase.kt | 191 ++++++++++++++++++ .../AbsDownloader.kt} | 11 +- .../AbsFileSystem.kt} | 11 +- components/app/AudioPlayer.vue | 28 +-- components/app/AudioPlayerContainer.vue | 16 +- components/bookshelf/LazyBookshelf.vue | 111 +++------- layouts/default.vue | 15 +- nuxt.config.js | 4 +- pages/account.vue | 4 +- pages/bookshelf/index.vue | 7 +- pages/item/_id.vue | 7 +- pages/localMedia/folders/_id.vue | 6 +- pages/localMedia/folders/index.vue | 6 +- plugins/audio-downloader.js | 4 - plugins/capacitor/AbsAudioPlayer.js | 13 ++ .../{DbManager.js => AbsDatabase.js} | 24 ++- plugins/capacitor/AbsDownloader.js | 13 ++ plugins/capacitor/AbsFileSystem.js | 13 ++ plugins/capacitor/index.js | 13 ++ plugins/db.js | 24 +-- plugins/my-native-audio.js | 7 - plugins/server.js | 13 +- plugins/storage-manager.js | 5 - 26 files changed, 376 insertions(+), 385 deletions(-) rename android/app/src/main/java/com/audiobookshelf/app/{MyNativeAudio.kt => plugins/AbsAudioPlayer.kt} (96%) create mode 100644 android/app/src/main/java/com/audiobookshelf/app/plugins/AbsDatabase.kt rename android/app/src/main/java/com/audiobookshelf/app/{AudioDownloader.kt => plugins/AbsDownloader.kt} (98%) rename android/app/src/main/java/com/audiobookshelf/app/{StorageManager.kt => plugins/AbsFileSystem.kt} (96%) delete mode 100644 plugins/audio-downloader.js create mode 100644 plugins/capacitor/AbsAudioPlayer.js rename plugins/capacitor/{DbManager.js => AbsDatabase.js} (74%) create mode 100644 plugins/capacitor/AbsDownloader.js create mode 100644 plugins/capacitor/AbsFileSystem.js create mode 100644 plugins/capacitor/index.js delete mode 100644 plugins/my-native-audio.js delete mode 100644 plugins/storage-manager.js diff --git a/android/app/src/main/java/com/audiobookshelf/app/MainActivity.kt b/android/app/src/main/java/com/audiobookshelf/app/MainActivity.kt index d6eb3824..9d331833 100644 --- a/android/app/src/main/java/com/audiobookshelf/app/MainActivity.kt +++ b/android/app/src/main/java/com/audiobookshelf/app/MainActivity.kt @@ -9,8 +9,12 @@ import android.util.Log import androidx.core.app.ActivityCompat import com.anggrayudi.storage.SimpleStorage import com.anggrayudi.storage.SimpleStorageHelper +import com.audiobookshelf.app.data.AbsDatabase import com.audiobookshelf.app.data.DbManager import com.audiobookshelf.app.player.PlayerNotificationService +import com.audiobookshelf.app.plugins.AbsDownloader +import com.audiobookshelf.app.plugins.AbsAudioPlayer +import com.audiobookshelf.app.plugins.AbsFileSystem import com.getcapacitor.BridgeActivity import io.paperdb.Paper @@ -63,10 +67,10 @@ class MainActivity : BridgeActivity() { REQUEST_PERMISSIONS) } - registerPlugin(MyNativeAudio::class.java) - registerPlugin(AudioDownloader::class.java) - registerPlugin(StorageManager::class.java) - registerPlugin(DbManager::class.java) + registerPlugin(AbsAudioPlayer::class.java) + registerPlugin(AbsDownloader::class.java) + registerPlugin(AbsFileSystem::class.java) + registerPlugin(AbsDatabase::class.java) var filter = IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE).apply { addAction(DownloadManager.ACTION_NOTIFICATION_CLICKED) @@ -98,7 +102,7 @@ class MainActivity : BridgeActivity() { val mLocalBinder = service as PlayerNotificationService.LocalBinder foregroundService = mLocalBinder.getService() - // Let MyNativeAudio know foreground service is ready and setup event listener + // Let NativeAudio know foreground service is ready and setup event listener if (pluginCallback != null) { pluginCallback() } diff --git a/android/app/src/main/java/com/audiobookshelf/app/data/DbManager.kt b/android/app/src/main/java/com/audiobookshelf/app/data/DbManager.kt index 29c5503a..264aee1d 100644 --- a/android/app/src/main/java/com/audiobookshelf/app/data/DbManager.kt +++ b/android/app/src/main/java/com/audiobookshelf/app/data/DbManager.kt @@ -1,23 +1,10 @@ package com.audiobookshelf.app.data import android.util.Log -import androidx.documentfile.provider.DocumentFile -import com.audiobookshelf.app.device.DeviceManager -import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper -import com.getcapacitor.JSObject -import com.getcapacitor.Plugin -import com.getcapacitor.PluginCall -import com.getcapacitor.PluginMethod -import com.getcapacitor.annotation.CapacitorPlugin import io.paperdb.Paper -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.launch import org.json.JSONObject -import java.io.File -@CapacitorPlugin(name = "DbManager") -class DbManager : Plugin() { +class DbManager { val tag = "DbManager" fun getDeviceData(): DeviceData { @@ -107,179 +94,4 @@ class DbManager : Plugin() { Log.d(tag, "Loaded Object $key $json") return json } - - // - // Database calls from webview - // - @PluginMethod - fun getDeviceData_WV(call:PluginCall) { - GlobalScope.launch(Dispatchers.IO) { - var deviceData = getDeviceData() - call.resolve(JSObject(jacksonObjectMapper().writeValueAsString(deviceData))) - } - } - - @PluginMethod - fun getLocalFolders_WV(call:PluginCall) { - GlobalScope.launch(Dispatchers.IO) { - var folders = getAllLocalFolders() - var folderObjArray = jacksonObjectMapper().writeValueAsString(folders) - var jsobj = JSObject() - jsobj.put("folders", folderObjArray) - call.resolve(jsobj) - } - } - - @PluginMethod - fun getLocalFolder_WV(call:PluginCall) { - var folderId = call.getString("folderId", "").toString() - GlobalScope.launch(Dispatchers.IO) { - getLocalFolder(folderId)?.let { - var folderObj = jacksonObjectMapper().writeValueAsString(it) - call.resolve(JSObject(folderObj)) - } ?: call.resolve() - } - } - - @PluginMethod - fun getLocalMediaItemsInFolder_WV(call:PluginCall) { - var folderId = call.getString("folderId", "").toString() - GlobalScope.launch(Dispatchers.IO) { - var localMediaItems = getLocalMediaItemsInFolder(folderId) - var mediaItemsArray = jacksonObjectMapper().writeValueAsString(localMediaItems) - var jsobj = JSObject() - jsobj.put("localMediaItems", mediaItemsArray) - call.resolve(jsobj) - } - } - - @PluginMethod - fun getLocalLibraryItems_WV(call:PluginCall) { - GlobalScope.launch(Dispatchers.IO) { - var localLibraryItems = getLocalMediaItems().map { - it.getLocalLibraryItem() - } - var jsobj = JSObject() - jsobj.put("localLibraryItems", jacksonObjectMapper().writeValueAsString(localLibraryItems)) - call.resolve(jsobj) - } - } - - @PluginMethod - fun getLocalLibraryItem_WV(call:PluginCall) { - var id = call.getString("id", "").toString() - GlobalScope.launch(Dispatchers.IO) { - var mediaItem = getLocalMediaItem(id) - var localLibraryItem = mediaItem?.getLocalLibraryItem() - if (localLibraryItem == null) { - call.resolve() - } else { - call.resolve(JSObject(jacksonObjectMapper().writeValueAsString(localLibraryItem))) - } - } - } - - @PluginMethod - fun setCurrentServerConnectionConfig_WV(call:PluginCall) { - var serverConnectionConfigId = call.getString("id", "").toString() - var serverConnectionConfig = DeviceManager.deviceData.serverConnectionConfigs.find { it.id == serverConnectionConfigId } - - var username = call.getString("username", "").toString() - var token = call.getString("token", "").toString() - - GlobalScope.launch(Dispatchers.IO) { - if (serverConnectionConfig == null) { // New Server Connection - var serverAddress = call.getString("address", "").toString() - - // Create new server connection config - var sscId = DeviceManager.getBase64Id("$serverAddress@$username") - var sscIndex = DeviceManager.deviceData.serverConnectionConfigs.size - serverConnectionConfig = ServerConnectionConfig(sscId, sscIndex, "$serverAddress ($username)", serverAddress, username, token) - - // Add and save - DeviceManager.deviceData.serverConnectionConfigs.add(serverConnectionConfig!!) - DeviceManager.deviceData.lastServerConnectionConfigId = serverConnectionConfig?.id - saveDeviceData(DeviceManager.deviceData) - } else { - var shouldSave = false - if (serverConnectionConfig?.username != username || serverConnectionConfig?.token != token) { - serverConnectionConfig?.username = username - serverConnectionConfig?.name = "${serverConnectionConfig?.address} (${serverConnectionConfig?.username})" - serverConnectionConfig?.token = token - shouldSave = true - } - - // Set last connection config - if (DeviceManager.deviceData.lastServerConnectionConfigId != serverConnectionConfigId) { - DeviceManager.deviceData.lastServerConnectionConfigId = serverConnectionConfigId - shouldSave = true - } - - if (shouldSave) saveDeviceData(DeviceManager.deviceData) - } - - DeviceManager.serverConnectionConfig = serverConnectionConfig - call.resolve(JSObject(jacksonObjectMapper().writeValueAsString(DeviceManager.serverConnectionConfig))) - } - } - - @PluginMethod - fun removeServerConnectionConfig_WV(call:PluginCall) { - GlobalScope.launch(Dispatchers.IO) { - var serverConnectionConfigId = call.getString("serverConnectionConfigId", "").toString() - DeviceManager.deviceData.serverConnectionConfigs = DeviceManager.deviceData.serverConnectionConfigs.filter { it.id != serverConnectionConfigId } as MutableList - if (DeviceManager.deviceData.lastServerConnectionConfigId == serverConnectionConfigId) { - DeviceManager.deviceData.lastServerConnectionConfigId = null - } - saveDeviceData(DeviceManager.deviceData) - if (DeviceManager.serverConnectionConfig?.id == serverConnectionConfigId) { - DeviceManager.serverConnectionConfig = null - } - call.resolve() - } - } - - @PluginMethod - fun logout_WV(call:PluginCall) { - GlobalScope.launch(Dispatchers.IO) { - DeviceManager.serverConnectionConfig = null - DeviceManager.deviceData.lastServerConnectionConfigId = null - saveDeviceData(DeviceManager.deviceData) - call.resolve() - } - } - - // - // Generic Webview calls to db - // - @PluginMethod - fun saveFromWebview(call: PluginCall) { - var db = call.getString("db", "").toString() - var key = call.getString("key", "").toString() - var value = call.getObject("value") - - GlobalScope.launch(Dispatchers.IO) { - if (db == "" || key == "" || value == null) { - Log.d(tag, "saveFromWebview Invalid key/value") - } else { - var json = value as JSONObject - saveObject(db, key, json) - } - call.resolve() - } - } - - @PluginMethod - fun loadFromWebview(call:PluginCall) { - var db = call.getString("db", "").toString() - var key = call.getString("key", "").toString() - if (db == "" || key == "") { - Log.d(tag, "loadFromWebview Invalid Key") - call.resolve() - return - } - var json = loadObject(db, key) - var jsobj = JSObject.fromJSONObject(json) - call.resolve(jsobj) - } } diff --git a/android/app/src/main/java/com/audiobookshelf/app/MyNativeAudio.kt b/android/app/src/main/java/com/audiobookshelf/app/plugins/AbsAudioPlayer.kt similarity index 96% rename from android/app/src/main/java/com/audiobookshelf/app/MyNativeAudio.kt rename to android/app/src/main/java/com/audiobookshelf/app/plugins/AbsAudioPlayer.kt index 4b523446..639bfe98 100644 --- a/android/app/src/main/java/com/audiobookshelf/app/MyNativeAudio.kt +++ b/android/app/src/main/java/com/audiobookshelf/app/plugins/AbsAudioPlayer.kt @@ -1,8 +1,9 @@ -package com.audiobookshelf.app +package com.audiobookshelf.app.plugins import android.os.Handler import android.os.Looper import android.util.Log +import com.audiobookshelf.app.MainActivity import com.audiobookshelf.app.data.PlaybackSession import com.audiobookshelf.app.device.DeviceManager import com.audiobookshelf.app.player.CastManager @@ -13,11 +14,11 @@ import com.getcapacitor.* import com.getcapacitor.annotation.CapacitorPlugin import org.json.JSONObject -@CapacitorPlugin(name = "MyNativeAudio") -class MyNativeAudio : Plugin() { - private val tag = "MyNativeAudio" +@CapacitorPlugin(name = "AbsAudioPlayer") +class AbsAudioPlayer : Plugin() { + private val tag = "AbsAudioPlayer" - lateinit var mainActivity:MainActivity + lateinit var mainActivity: MainActivity lateinit var apiHandler:ApiHandler lateinit var playerNotificationService: PlayerNotificationService diff --git a/android/app/src/main/java/com/audiobookshelf/app/plugins/AbsDatabase.kt b/android/app/src/main/java/com/audiobookshelf/app/plugins/AbsDatabase.kt new file mode 100644 index 00000000..b41638e2 --- /dev/null +++ b/android/app/src/main/java/com/audiobookshelf/app/plugins/AbsDatabase.kt @@ -0,0 +1,191 @@ +package com.audiobookshelf.app.data + +import android.util.Log +import com.audiobookshelf.app.device.DeviceManager +import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper +import com.getcapacitor.JSObject +import com.getcapacitor.Plugin +import com.getcapacitor.PluginCall +import com.getcapacitor.PluginMethod +import com.getcapacitor.annotation.CapacitorPlugin +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.launch +import org.json.JSONObject + +@CapacitorPlugin(name = "AbsDatabase") +class AbsDatabase : Plugin() { + val tag = "AbsDatabase" + + @PluginMethod + fun getDeviceData(call:PluginCall) { + GlobalScope.launch(Dispatchers.IO) { + var deviceData = DeviceManager.dbManager.getDeviceData() + call.resolve(JSObject(jacksonObjectMapper().writeValueAsString(deviceData))) + } + } + + @PluginMethod + fun getLocalFolders(call:PluginCall) { + GlobalScope.launch(Dispatchers.IO) { + var folders = DeviceManager.dbManager.getAllLocalFolders() + var folderObjArray = jacksonObjectMapper().writeValueAsString(folders) + var jsobj = JSObject() + jsobj.put("folders", folderObjArray) + call.resolve(jsobj) + } + } + + @PluginMethod + fun getLocalFolder(call:PluginCall) { + var folderId = call.getString("folderId", "").toString() + GlobalScope.launch(Dispatchers.IO) { + DeviceManager.dbManager.getLocalFolder(folderId)?.let { + var folderObj = jacksonObjectMapper().writeValueAsString(it) + call.resolve(JSObject(folderObj)) + } ?: call.resolve() + } + } + + @PluginMethod + fun getLocalMediaItemsInFolder(call:PluginCall) { + var folderId = call.getString("folderId", "").toString() + GlobalScope.launch(Dispatchers.IO) { + var localMediaItems = DeviceManager.dbManager.getLocalMediaItemsInFolder(folderId) + var mediaItemsArray = jacksonObjectMapper().writeValueAsString(localMediaItems) + var jsobj = JSObject() + jsobj.put("localMediaItems", mediaItemsArray) + call.resolve(jsobj) + } + } + + @PluginMethod + fun getLocalLibraryItems(call:PluginCall) { + GlobalScope.launch(Dispatchers.IO) { + var localLibraryItems = DeviceManager.dbManager.getLocalMediaItems().map { + it.getLocalLibraryItem() + } + var jsobj = JSObject() + jsobj.put("localLibraryItems", jacksonObjectMapper().writeValueAsString(localLibraryItems)) + call.resolve(jsobj) + } + } + + @PluginMethod + fun getLocalLibraryItem(call:PluginCall) { + var id = call.getString("id", "").toString() + GlobalScope.launch(Dispatchers.IO) { + var mediaItem = DeviceManager.dbManager.getLocalMediaItem(id) + var localLibraryItem = mediaItem?.getLocalLibraryItem() + if (localLibraryItem == null) { + call.resolve() + } else { + call.resolve(JSObject(jacksonObjectMapper().writeValueAsString(localLibraryItem))) + } + } + } + + @PluginMethod + fun setCurrentServerConnectionConfig(call:PluginCall) { + var serverConnectionConfigId = call.getString("id", "").toString() + var serverConnectionConfig = DeviceManager.deviceData.serverConnectionConfigs.find { it.id == serverConnectionConfigId } + + var username = call.getString("username", "").toString() + var token = call.getString("token", "").toString() + + GlobalScope.launch(Dispatchers.IO) { + if (serverConnectionConfig == null) { // New Server Connection + var serverAddress = call.getString("address", "").toString() + + // Create new server connection config + var sscId = DeviceManager.getBase64Id("$serverAddress@$username") + var sscIndex = DeviceManager.deviceData.serverConnectionConfigs.size + serverConnectionConfig = ServerConnectionConfig(sscId, sscIndex, "$serverAddress ($username)", serverAddress, username, token) + + // Add and save + DeviceManager.deviceData.serverConnectionConfigs.add(serverConnectionConfig!!) + DeviceManager.deviceData.lastServerConnectionConfigId = serverConnectionConfig?.id + DeviceManager.dbManager.saveDeviceData(DeviceManager.deviceData) + } else { + var shouldSave = false + if (serverConnectionConfig?.username != username || serverConnectionConfig?.token != token) { + serverConnectionConfig?.username = username + serverConnectionConfig?.name = "${serverConnectionConfig?.address} (${serverConnectionConfig?.username})" + serverConnectionConfig?.token = token + shouldSave = true + } + + // Set last connection config + if (DeviceManager.deviceData.lastServerConnectionConfigId != serverConnectionConfigId) { + DeviceManager.deviceData.lastServerConnectionConfigId = serverConnectionConfigId + shouldSave = true + } + + if (shouldSave) DeviceManager.dbManager.saveDeviceData(DeviceManager.deviceData) + } + + DeviceManager.serverConnectionConfig = serverConnectionConfig + call.resolve(JSObject(jacksonObjectMapper().writeValueAsString(DeviceManager.serverConnectionConfig))) + } + } + + @PluginMethod + fun removeServerConnectionConfig(call:PluginCall) { + GlobalScope.launch(Dispatchers.IO) { + var serverConnectionConfigId = call.getString("serverConnectionConfigId", "").toString() + DeviceManager.deviceData.serverConnectionConfigs = DeviceManager.deviceData.serverConnectionConfigs.filter { it.id != serverConnectionConfigId } as MutableList + if (DeviceManager.deviceData.lastServerConnectionConfigId == serverConnectionConfigId) { + DeviceManager.deviceData.lastServerConnectionConfigId = null + } + DeviceManager.dbManager.saveDeviceData(DeviceManager.deviceData) + if (DeviceManager.serverConnectionConfig?.id == serverConnectionConfigId) { + DeviceManager.serverConnectionConfig = null + } + call.resolve() + } + } + + @PluginMethod + fun logout(call:PluginCall) { + GlobalScope.launch(Dispatchers.IO) { + DeviceManager.serverConnectionConfig = null + DeviceManager.deviceData.lastServerConnectionConfigId = null + DeviceManager.dbManager.saveDeviceData(DeviceManager.deviceData) + call.resolve() + } + } + + // + // Generic Webview calls to db + // + @PluginMethod + fun saveFromWebview(call: PluginCall) { + var db = call.getString("db", "").toString() + var key = call.getString("key", "").toString() + var value = call.getObject("value") + + GlobalScope.launch(Dispatchers.IO) { + if (db == "" || key == "" || value == null) { + Log.d(tag, "saveFromWebview Invalid key/value") + } else { + var json = value as JSONObject + DeviceManager.dbManager.saveObject(db, key, json) + } + call.resolve() + } + } + + @PluginMethod + fun loadFromWebview(call:PluginCall) { + var db = call.getString("db", "").toString() + var key = call.getString("key", "").toString() + if (db == "" || key == "") { + Log.d(tag, "loadFromWebview Invalid Key") + call.resolve() + return + } + var json = DeviceManager.dbManager.loadObject(db, key) + var jsobj = JSObject.fromJSONObject(json) + call.resolve(jsobj) + } +} diff --git a/android/app/src/main/java/com/audiobookshelf/app/AudioDownloader.kt b/android/app/src/main/java/com/audiobookshelf/app/plugins/AbsDownloader.kt similarity index 98% rename from android/app/src/main/java/com/audiobookshelf/app/AudioDownloader.kt rename to android/app/src/main/java/com/audiobookshelf/app/plugins/AbsDownloader.kt index 5c8ae5b3..38e322ef 100644 --- a/android/app/src/main/java/com/audiobookshelf/app/AudioDownloader.kt +++ b/android/app/src/main/java/com/audiobookshelf/app/plugins/AbsDownloader.kt @@ -1,10 +1,11 @@ -package com.audiobookshelf.app +package com.audiobookshelf.app.plugins import android.app.DownloadManager import android.content.Context import android.net.Uri import android.os.Build import android.util.Log +import com.audiobookshelf.app.MainActivity import com.audiobookshelf.app.data.LibraryItem import com.audiobookshelf.app.data.LocalFolder import com.audiobookshelf.app.device.DeviceManager @@ -25,9 +26,9 @@ import java.io.File import java.util.* -@CapacitorPlugin(name = "AudioDownloader") -class AudioDownloader : Plugin() { - private val tag = "AudioDownloader" +@CapacitorPlugin(name = "AbsDownloader") +class AbsDownloader : Plugin() { + private val tag = "AbsDownloader" lateinit var mainActivity: MainActivity lateinit var downloadManager: DownloadManager @@ -76,7 +77,7 @@ class AudioDownloader : Plugin() { if (evt == "complete") { } if (evt == "clicked") { - Log.d(tag, "Clicked $id back in the audiodownloader") + Log.d(tag, "Clicked $id back in the downloader") } } mainActivity.registerBroadcastReceiver(recieverEvent) diff --git a/android/app/src/main/java/com/audiobookshelf/app/StorageManager.kt b/android/app/src/main/java/com/audiobookshelf/app/plugins/AbsFileSystem.kt similarity index 96% rename from android/app/src/main/java/com/audiobookshelf/app/StorageManager.kt rename to android/app/src/main/java/com/audiobookshelf/app/plugins/AbsFileSystem.kt index 7fa4d2b4..74151615 100644 --- a/android/app/src/main/java/com/audiobookshelf/app/StorageManager.kt +++ b/android/app/src/main/java/com/audiobookshelf/app/plugins/AbsFileSystem.kt @@ -1,4 +1,4 @@ -package com.audiobookshelf.app +package com.audiobookshelf.app.plugins import android.database.Cursor import android.net.Uri @@ -10,6 +10,7 @@ import com.anggrayudi.storage.SimpleStorage import com.anggrayudi.storage.callback.FolderPickerCallback import com.anggrayudi.storage.callback.StorageAccessCallback import com.anggrayudi.storage.file.* +import com.audiobookshelf.app.MainActivity import com.audiobookshelf.app.data.LocalFolder import com.audiobookshelf.app.device.DeviceManager import com.audiobookshelf.app.device.FolderScanner @@ -17,11 +18,11 @@ import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper import com.getcapacitor.* import com.getcapacitor.annotation.CapacitorPlugin -@CapacitorPlugin(name = "StorageManager") -class StorageManager : Plugin() { - private val TAG = "StorageManager" +@CapacitorPlugin(name = "AbsFileSystem") +class AbsFileSystem : Plugin() { + private val TAG = "AbsFileSystem" - lateinit var mainActivity:MainActivity + lateinit var mainActivity: MainActivity override fun load() { mainActivity = (activity as MainActivity) diff --git a/components/app/AudioPlayer.vue b/components/app/AudioPlayer.vue index 2445fc01..07cc66bb 100644 --- a/components/app/AudioPlayer.vue +++ b/components/app/AudioPlayer.vue @@ -91,7 +91,7 @@