diff --git a/android/app/src/main/java/io/freetubeapp/freetube/FreeTubeJavaScriptInterface.kt b/android/app/src/main/java/io/freetubeapp/freetube/FreeTubeJavaScriptInterface.kt index cc666f023a7a4..d8f4ed75a9157 100644 --- a/android/app/src/main/java/io/freetubeapp/freetube/FreeTubeJavaScriptInterface.kt +++ b/android/app/src/main/java/io/freetubeapp/freetube/FreeTubeJavaScriptInterface.kt @@ -578,6 +578,15 @@ class FreeTubeJavaScriptInterface { syncMessages.remove(promise) return value!! } + private fun addNamedCallbackToPromise(promise: String, name: String) { + context.runOnUiThread { + context.webView.loadUrl("javascript: window['${promise}'].callbacks = window['${promise}'].callbacks || {}; window['${promise}'].callbacks.notify = (key, message) => window['${promise}'].callbacks[key].forEach(callback => callback(message)); window['${promise}'].callbacks['${name}'] = window['${promise}'].callbacks['${name}'] || []") + } + } + + private fun notifyNamedCallback(promise: String, name: String, message: String) { + context.webView.loadUrl("javascript: window['${promise}'].callbacks.notify(${context.btoa(name)}, ${context.btoa(message)})") + } /** * @return the id of a promise on the window diff --git a/src/index.ejs b/src/index.ejs index 1d08cca7743e2..1aedc11af4dd7 100644 --- a/src/index.ejs +++ b/src/index.ejs @@ -41,12 +41,15 @@ window.clearAllMediaSessionEventListeners = function () { window.mediaSessionListeners = {} } - window.awaitAsyncResult = function (id) { + window.awaitAsyncResult = function (id, callbacks = {}) { return new Promise((resolve, reject) => { const interval = setInterval(async () => { if (id in window) { clearInterval(interval) try { + if ('callbacks' in window[id]) { + Object.assign(window[id].callbacks, callbacks) + } const result = await window[id].promise resolve(Android.getSyncMessage(id)) } catch (ex) {