diff --git a/android/app/build.gradle b/android/app/build.gradle
index 7c7a58a9..1a35b416 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -7,8 +7,8 @@ android {
applicationId "olcxja.miarven"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
- versionCode 2
- versionName "0.1.1"
+ versionCode 3
+ versionName "0.1.2"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
aaptOptions {
// Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps.
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index 12021352..f4b7f4a3 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -6,6 +6,7 @@
+
ICONS._feather(``, props),
file: (props) => ICONS._feather(``, props),
mic: (props) => ICONS._feather(``, props),
+ speaker: (props) => ICONS._create(``, { viewBox: "0 0 24 24", width: "1.4rem", height: "1.4rem", fill: "var(--text-color)", stroke: "none" }, props),
home: (props) => ICONS._create(``, { viewBox: "-1 -1 18 18", width: "1.5rem", height: "1.5rem", fill: "none", stroke: "none" }, props),
inbox: (props) => ICONS._material(``, props),
diff --git a/android/app/src/main/assets/public/style.css b/android/app/src/main/assets/public/style.css
index 5e495bcb..d7bc91be 100644
--- a/android/app/src/main/assets/public/style.css
+++ b/android/app/src/main/assets/public/style.css
@@ -1729,4 +1729,17 @@ input:checked + .toggle-slider:before {
.voice-call-btn {
padding: 0 0.75rem;
}
+
+ #voice-users {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(min(5.5rem, 100%), 1fr));
+ grid-auto-rows: minmax(6.25rem, 1fr);
+ align-content: stretch;
+ justify-items: stretch;
+ }
+ .voice-tile {
+ width: auto !important;
+ height: auto !important;
+ min-width: 0;
+ }
}
diff --git a/android/app/src/main/assets/public/version.js b/android/app/src/main/assets/public/version.js
index 62bf5330..e9331a1b 100644
--- a/android/app/src/main/assets/public/version.js
+++ b/android/app/src/main/assets/public/version.js
@@ -1 +1 @@
-const CLIENT_VERSION = "0.1.1";
+const CLIENT_VERSION = "0.1.2";
diff --git a/android/app/src/main/assets/public/voice.js b/android/app/src/main/assets/public/voice.js
index b3a68a16..3e68b022 100644
--- a/android/app/src/main/assets/public/voice.js
+++ b/android/app/src/main/assets/public/voice.js
@@ -14,6 +14,20 @@ let knownVoiceUsers = new Set();
let isMicMuted = false;
let remoteVideos = {}, videoDecryptChains = {};
let camControl = null, screenControl = null;
+let screenReceiverNode = null;
+let voiceOutputAudio = null;
+let voiceLoopSendPc = null, voiceLoopRecvPc = null;
+let voicePlayoutDest = null;
+let voiceLoopWatchdog = null;
+let voiceRemoteStream = null;
+let voiceLoopRestarts = 0;
+let voiceDeviceChangeHandler = null;
+let voiceDeviceChangeTimer = null;
+let isVoiceSpeakerMode = false;
+let voiceTapNode = null;
+let pcmBatch = null;
+let pcmBatchLen = 0;
+let voicePcmFlushTimer = null;
const SPEAKING_HANGOVER_MS = 400;
@@ -62,6 +76,269 @@ function updateVoicePing() {
if (pingEl) pingEl.innerText = voicePingMs !== null ? `${voicePingMs} ms` : "";
}
+function isMobileVoiceDevice() {
+ return /Android|iPhone|iPad|iPod|Mobile/i.test(navigator.userAgent) && !!window.RTCPeerConnection;
+}
+
+function getNativeVoiceRouting() {
+ try {
+ return window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.VoiceRouting ? window.Capacitor.Plugins.VoiceRouting : null;
+ } catch (e) {
+ return null;
+ }
+}
+
+function teardownVoiceLoopback() {
+ if (voiceLoopWatchdog) { clearTimeout(voiceLoopWatchdog); voiceLoopWatchdog = null; }
+ document.removeEventListener("click", voicePlayRetry, true);
+ window.removeEventListener("voicemodechanged", voiceModeChangedHandler);
+ if (voiceDeviceChangeHandler && navigator.mediaDevices && navigator.mediaDevices.removeEventListener) {
+ navigator.mediaDevices.removeEventListener("devicechange", voiceDeviceChangeHandler);
+ }
+ voiceDeviceChangeHandler = null;
+ clearTimeout(voiceDeviceChangeTimer);
+ if (voiceLoopSendPc) { try { voiceLoopSendPc.close(); } catch (e) {} voiceLoopSendPc = null; }
+ if (voiceLoopRecvPc) { try { voiceLoopRecvPc.close(); } catch (e) {} voiceLoopRecvPc = null; }
+ if (voicePlayoutDest) { try { voicePlayoutDest.disconnect(); } catch (e) {} voicePlayoutDest = null; }
+ if (voiceOutputAudio) {
+ try { voiceOutputAudio.pause(); } catch (e) {}
+ voiceOutputAudio.srcObject = null;
+ voiceOutputAudio.remove();
+ voiceOutputAudio = null;
+ }
+ voiceRemoteStream = null;
+}
+
+function voicePlayRetry() {
+ if (voiceOutputAudio) voiceOutputAudio.play().catch(() => {});
+}
+
+function int16ToBase64(view) {
+ let bin = '';
+ const u8 = new Uint8Array(view.buffer, view.byteOffset, view.byteLength);
+ const STEP = 8192;
+ for (let i = 0; i < u8.length; i += STEP) {
+ bin += String.fromCharCode.apply(null, u8.subarray(i, Math.min(i + STEP, u8.length)));
+ }
+ return btoa(bin);
+}
+
+function flushPcmBatch() {
+ if (!pcmBatchLen || !pcmBatch) return;
+ const native = getNativeVoiceRouting();
+ if (native && native.nativeAudioFeed && native.nativeAudioStart) {
+ const slice = new Int16Array(pcmBatch.subarray(0, pcmBatchLen));
+ try {
+ native.nativeAudioFeed({ data: int16ToBase64(slice) }).catch(() => {});
+ } catch (e) {}
+ }
+ pcmBatchLen = 0;
+}
+
+function handlePcmChunk(ev) {
+ try {
+ if (!getNativeVoiceRouting() || !pcmBatch) return;
+ const chunk = new Int16Array(ev.data);
+ for (let i = 0; i < chunk.length; i++) {
+ if (pcmBatchLen >= pcmBatch.length) flushPcmBatch();
+ pcmBatch[pcmBatchLen++] = chunk[i];
+ }
+ } catch (e) {}
+}
+
+function stopNativePlayback() {
+ if (voicePcmFlushTimer) { clearInterval(voicePcmFlushTimer); voicePcmFlushTimer = null; }
+ flushPcmBatch();
+ if (voiceTapNode) {
+ try { voiceTapNode.disconnect(); } catch (e) {}
+ try { voiceTapNode.port.onmessage = null; } catch (e) {}
+ voiceTapNode = null;
+ }
+ const native = getNativeVoiceRouting();
+ if (native && native.nativeAudioStop) native.nativeAudioStop().catch(() => {});
+}
+
+// Fired natively when Android reverted MODE_IN_COMMUNICATION and the plugin
+// restored it - Chromium's playout track must be re-initialized afterwards.
+function voiceModeChangedHandler() {
+ console.debug("Voice: native mode restore detected, replugging playout");
+ setTimeout(() => replugVoiceOutputElement(), 150);
+ setTimeout(() => replugVoiceOutputElement(), 700);
+}
+
+function voicePlayoutOk() {
+ let connected = voiceLoopRecvPc && voiceLoopRecvPc.connectionState === "connected";
+ let playing = voiceOutputAudio && !voiceOutputAudio.paused;
+ return !!connected && !!playing;
+}
+
+// Re-attaching the stream forces the browser audio stack to re-initialize its
+// output track - needed after communication device changes on Android.
+async function replugVoiceOutputElement() {
+ if (!voiceOutputAudio || !voiceRemoteStream) return;
+ console.debug("Voice: replugging WebRTC playout element");
+ try { voiceOutputAudio.pause(); } catch (e) {}
+ voiceOutputAudio.srcObject = null;
+ voiceOutputAudio.srcObject = voiceRemoteStream;
+ try { await voiceOutputAudio.play(); } catch (e) {}
+}
+
+function fallbackVoiceToMediaOutput() {
+ if (!receiverNode || !audioContext || !voicePlayoutDest) return;
+ console.warn("Voice: WebRTC playout unavailable, falling back to media output");
+ teardownVoiceLoopback();
+ try { receiverNode.disconnect(); } catch (e) {}
+ try { receiverNode.connect(audioContext.destination); } catch (e) {}
+}
+
+function recoverVoiceLoopback() {
+ if (!receiverNode || !audioContext || !voicePlayoutDest) return;
+ const native = getNativeVoiceRouting();
+
+ // First aid: re-plug the playout element (fixes stuck routes after device switches)
+ replugVoiceOutputElement().then(() => {
+ setTimeout(() => {
+ if (!voicePlayoutDest || voicePlayoutOk()) return;
+ if (native && voiceLoopRestarts < 2) {
+ voiceLoopRestarts++;
+ console.warn("Voice: restarting WebRTC loopback (attempt " + voiceLoopRestarts + ")");
+ const wasSpeaker = isVoiceSpeakerMode;
+ teardownVoiceLoopback();
+ isVoiceSpeakerMode = wasSpeaker;
+ setupVoiceOutput();
+ } else {
+ fallbackVoiceToMediaOutput();
+ }
+ }, 800);
+ });
+}
+
+function setupVoiceOutput() {
+ if (!audioContext || !receiverNode) return;
+ try { receiverNode.disconnect(); } catch (e) {}
+ if (screenReceiverNode) {
+ try { screenReceiverNode.disconnect(); } catch (e) {}
+ screenReceiverNode.connect(audioContext.destination);
+ }
+
+ const native = getNativeVoiceRouting();
+
+ // App + native plugin: the mixed call audio is played by a native AudioTrack
+ // (USAGE_VOICE_COMMUNICATION), so it follows the call volume slider and the
+ // earpiece/speaker switch. Nothing is output through the WebAudio graph.
+ if (native && isMobileVoiceDevice()) {
+ stopNativePlayback();
+ pcmBatch = new Int16Array(1536); // 32 ms @ 48 kHz
+ pcmBatchLen = 0;
+ voiceTapNode = new AudioWorkletNode(audioContext, 'audio-tap');
+ voiceTapNode.port.onmessage = handlePcmChunk;
+ receiverNode.connect(voiceTapNode);
+ if (voicePcmFlushTimer) clearInterval(voicePcmFlushTimer);
+ voicePcmFlushTimer = setInterval(flushPcmBatch, 25);
+ if (native.nativeAudioStart) native.nativeAudioStart({ sampleRate: audioContext.sampleRate }).catch(() => {});
+ return;
+ }
+
+ if (!isMobileVoiceDevice()) {
+ receiverNode.connect(audioContext.destination);
+ return;
+ }
+
+ // Browser-only speaker mode plays through plain media output.
+ // With the native plugin present, routing stays on the call path
+ // and the speaker switch is handled natively.
+ if (isVoiceSpeakerMode) {
+ receiverNode.connect(audioContext.destination);
+ return;
+ }
+
+ voiceLoopRestarts = 0;
+ teardownVoiceLoopback();
+ voicePlayoutDest = audioContext.createMediaStreamDestination();
+ receiverNode.connect(voicePlayoutDest);
+
+ voiceLoopSendPc = new RTCPeerConnection();
+ voiceLoopRecvPc = new RTCPeerConnection();
+ voiceLoopSendPc.onicecandidate = e => { if (e.candidate) try { voiceLoopRecvPc.addIceCandidate(e.candidate); } catch (err) {} };
+ voiceLoopRecvPc.onicecandidate = e => { if (e.candidate) try { voiceLoopSendPc.addIceCandidate(e.candidate); } catch (err) {} };
+ voiceLoopRecvPc.onconnectionstatechange = () => {
+ const st = voiceLoopRecvPc && voiceLoopRecvPc.connectionState;
+ if (st === "failed") recoverVoiceLoopback();
+ };
+ voiceLoopRecvPc.ontrack = e => {
+ voiceRemoteStream = e.streams[0];
+ if (!voiceOutputAudio) {
+ voiceOutputAudio = document.createElement("audio");
+ voiceOutputAudio.autoplay = true;
+ voiceOutputAudio.setAttribute("playsinline", "");
+ document.body.appendChild(voiceOutputAudio);
+ }
+ voiceOutputAudio.srcObject = voiceRemoteStream;
+ voiceOutputAudio.play().catch(() => {});
+ };
+ document.addEventListener("click", voicePlayRetry, true);
+ window.addEventListener("voicemodechanged", voiceModeChangedHandler);
+ if (navigator.mediaDevices && navigator.mediaDevices.addEventListener) {
+ voiceDeviceChangeHandler = () => {
+ clearTimeout(voiceDeviceChangeTimer);
+ // Audio route changed (BT/headset/speaker) - re-init the playout track
+ voiceDeviceChangeTimer = setTimeout(() => replugVoiceOutputElement(), 400);
+ };
+ navigator.mediaDevices.addEventListener("devicechange", voiceDeviceChangeHandler);
+ }
+ voiceLoopSendPc.addTrack(voicePlayoutDest.stream.getAudioTracks()[0], voicePlayoutDest.stream);
+ voiceLoopSendPc.createOffer()
+ .then(offer => voiceLoopSendPc.setLocalDescription(offer))
+ .then(() => voiceLoopRecvPc.setRemoteDescription(voiceLoopSendPc.localDescription))
+ .then(() => voiceLoopRecvPc.createAnswer())
+ .then(answer => voiceLoopRecvPc.setLocalDescription(answer))
+ .then(() => voiceLoopSendPc.setRemoteDescription(voiceLoopRecvPc.localDescription))
+ .catch(() => {
+ recoverVoiceLoopback();
+ });
+
+ // Safety net: verify the WebRTC playout actually produces sound and repair it if not
+ if (voiceLoopWatchdog) clearTimeout(voiceLoopWatchdog);
+ voiceLoopWatchdog = setTimeout(() => {
+ voiceLoopWatchdog = null;
+ if (!voicePlayoutDest) return;
+ voicePlayRetry();
+ setTimeout(() => {
+ if (!voicePlayoutDest || voicePlayoutOk()) return;
+ recoverVoiceLoopback();
+ }, 600);
+ }, 4000);
+}
+
+window.toggleVoiceSpeakerMode = async function() {
+ isVoiceSpeakerMode = !isVoiceSpeakerMode;
+ let btn = document.getElementById("voice-btn-speaker");
+ if (btn) btn.classList.toggle("voice-btn-active", isVoiceSpeakerMode);
+
+ const native = getNativeVoiceRouting();
+ if (native && native.setSpeaker) {
+ // Native routing keeps playback on the call volume stream - only the
+ // physical output (earpiece <-> loudspeaker) changes, like a phone call.
+ // The native AudioTrack follows the communication device automatically.
+ try { await native.setSpeaker({ enabled: isVoiceSpeakerMode }); } catch (e) {}
+ setTimeout(() => replugVoiceOutputElement(), 250);
+ setTimeout(() => replugVoiceOutputElement(), 900);
+ setTimeout(() => { if (voicePlayoutDest && !voicePlayoutOk()) recoverVoiceLoopback(); }, 1700);
+ return;
+ }
+
+ if (!receiverNode) return;
+ try { receiverNode.disconnect(); } catch (e) {}
+
+ if (!isVoiceSpeakerMode && voicePlayoutDest) {
+ receiverNode.connect(voicePlayoutDest);
+ if (voiceOutputAudio) voiceOutputAudio.play().catch(() => {});
+ } else {
+ receiverNode.connect(audioContext.destination);
+ if (voiceOutputAudio) { try { voiceOutputAudio.pause(); } catch (e) {} }
+ }
+};
+
function setVoiceStatus(state) {
let el = document.getElementById("voice-status");
if (!el) return;
@@ -88,8 +365,12 @@ function setVoiceStatus(state) {
}
}
-function setTileSpeaking(clientId, speaking) {
+function setTileSpeaking(clientId, speaking, streamDecoderId = null) {
let tile = document.getElementById(`voice-tile-${clientId}`);
+ if (streamDecoderId) {
+ let streamTile = document.getElementById(`voice-tile-stream-${streamDecoderId}`);
+ if (streamTile) tile = streamTile;
+ }
if (!tile) return;
if (tile._speakingTimer) {
@@ -197,6 +478,25 @@ class AudioReceiver extends AudioWorkletProcessor {
} return true;
}
}
+class AudioTap extends AudioWorkletProcessor {
+ constructor() { super(); this.acc = new Int16Array(512); this.accLen = 0; }
+ process(inputs) {
+ const ch = inputs[0] && inputs[0][0];
+ if (ch && this.port) {
+ for (let i = 0; i < ch.length; i++) {
+ const s = Math.max(-1, Math.min(1, ch[i]));
+ this.acc[this.accLen++] = s < 0 ? s * 0x8000 : s * 0x7FFF;
+ }
+ if (this.accLen >= this.acc.length) {
+ this.port.postMessage(this.acc.buffer, [this.acc.buffer]);
+ this.acc = new Int16Array(512);
+ this.accLen = 0;
+ }
+ }
+ return true;
+ }
+}
+registerProcessor('audio-tap', AudioTap);
registerProcessor('audio-sender', AudioProcessor);
registerProcessor('audio-receiver', AudioReceiver);`;
@@ -289,16 +589,22 @@ async function startVoiceSession(serverUrl) {
const micConstraints = {audio: {echoCancellation: false, noiseSuppression: false, autoGainControl: false}};
micStream = await navigator.mediaDevices.getUserMedia(micConstraints);
-
+
+ const nativeRouting = getNativeVoiceRouting();
+ if (nativeRouting && nativeRouting.startCall) {
+ try { await nativeRouting.startCall(); } catch (e) {}
+ }
+
if (!audioContext) audioContext = new (window.AudioContext || window.webkitAudioContext)({sampleRate: 48000});
if (!isAudioWorkletLoaded) {
await audioContext.audioWorklet.addModule(URL.createObjectURL(new Blob([voiceWorkletCode], {type: 'application/javascript'})));
senderNode = new AudioWorkletNode(audioContext, 'audio-sender');
receiverNode = new AudioWorkletNode(audioContext, 'audio-receiver');
- receiverNode.connect(audioContext.destination);
+ screenReceiverNode = new AudioWorkletNode(audioContext, 'audio-receiver');
isAudioWorkletLoaded = true;
}
if (audioContext.state === 'suspended') await audioContext.resume();
+ setupVoiceOutput();
micSourceNode = audioContext.createMediaStreamSource(micStream);
micSourceNode.connect(senderNode);
@@ -361,13 +667,14 @@ async function startVoiceSession(serverUrl) {
remoteAudio[audioId].lastUpdate = Date.now();
if (!audioDecryptChains[audioId]) audioDecryptChains[audioId] = new TaskQueue();
-
+
+ const targetReceiver = isScreenAudio ? screenReceiverNode : receiverNode;
audioDecryptChains[audioId].enqueue(async () => {
try {
const decryptedBuffer = await crypto.subtle.decrypt({name: "AES-GCM", iv}, voiceAesCryptoKey, ciphertext);
- if(receiverNode) receiverNode.port.postMessage({ clientId: audioId, audioData: decryptedBuffer }, [decryptedBuffer]);
-
- setTileSpeaking(clientId, true);
+ if(targetReceiver) targetReceiver.port.postMessage({ clientId: audioId, audioData: decryptedBuffer }, [decryptedBuffer]);
+
+ setTileSpeaking(clientId, true, isScreenAudio ? `${clientId}-2` : null);
} catch (err) {}
});
} else if (type === 1 || type === 2) {
@@ -443,7 +750,7 @@ async function startVoiceSession(serverUrl) {
if (remoteAudio[audioId]) {
if(audioDecryptChains[audioId]) audioDecryptChains[audioId].clear();
delete audioDecryptChains[audioId]; delete remoteAudio[audioId];
- if(receiverNode) receiverNode.port.postMessage({ action: 'remove', clientId: audioId });
+ if(screenReceiverNode) screenReceiverNode.port.postMessage({ action: 'remove', clientId: audioId });
}
} else {
const decoderId = `${clientId}-${stoppedTypeId}`;
@@ -499,7 +806,8 @@ function handleCallUpdate(data) {
if (audioDecoders[u]) try { audioDecoders[u].close(); } catch(e){}
delete audioDecoders[u];
delete remoteAudio[u];
- if(receiverNode) receiverNode.port.postMessage({ action: 'remove', clientId: u });
+ const rn = u.endsWith("_screen") ? screenReceiverNode : receiverNode;
+ if(rn) rn.port.postMessage({ action: 'remove', clientId: u });
}
}
@@ -727,6 +1035,9 @@ function showVoiceUI() {
+ ${(isMobileVoiceDevice() && getNativeVoiceRouting()) ? `` : ""}
@@ -770,11 +1081,34 @@ function showVoiceUI() {
header.addEventListener('pointerup', stopDrag);
header.addEventListener('pointercancel', stopDrag);
+ ensureVoiceFooterFits(voiceUiContainer);
+
ensureVoiceGridObserver();
setupVoiceWindowResize();
}
+// Raises the popup's min-width so the footer buttons always fit with the same
+// side padding the footer uses, regardless of how many buttons are rendered.
+function ensureVoiceFooterFits(popupEl) {
+ let footer = popupEl.querySelector("#voice-footer");
+ if (!footer) return;
+ const cs = getComputedStyle(footer);
+ let need = (parseFloat(cs.paddingLeft) || 0) + (parseFloat(cs.paddingRight) || 0);
+ const kids = Array.from(footer.children);
+ const gap = parseFloat(cs.columnGap) || parseFloat(cs.gap) || 0;
+ kids.forEach((kid, i) => {
+ if (i > 0) need += gap;
+ need += kid.offsetWidth;
+ });
+ const bcs = getComputedStyle(popupEl);
+ need += ((parseFloat(bcs.borderLeftWidth) || 0) + (parseFloat(bcs.borderRightWidth) || 0));
+ if (need > 0) {
+ popupEl.style.minWidth = Math.ceil(need) + "px";
+ clampVoiceWindowToViewport(popupEl);
+ }
+}
+
function setupVoiceWindowResize() {
const popup = voiceUiContainer;
if (!popup || popup.dataset.resizeInit) return;
@@ -1046,6 +1380,14 @@ function relayoutVoiceTiles() {
const cs = getComputedStyle(container);
const innerW = container.clientWidth - parseFloat(cs.paddingLeft) - parseFloat(cs.paddingRight);
const innerH = container.clientHeight - parseFloat(cs.paddingTop) - parseFloat(cs.paddingBottom);
+
+ if (!isFinite(innerW) || !isFinite(innerH) || !isFinite(rootFs) || innerW <= 0 || innerH <= 0 || rootFs <= 0) {
+ container.style.removeProperty("--voice-tile-w");
+ container.style.removeProperty("--voice-tile-h");
+ delete container.dataset.layoutSig;
+ return;
+ }
+
const minCol = 6.25 * rootFs;
const minRow = 7 * rootFs;
const gap = 0.75 * rootFs;
@@ -1128,8 +1470,9 @@ window.updateVoiceVol = function(clientId, val, type) {
if (el) el.innerText = val + '%';
const audioId = type === 'screen' ? `${clientId}_screen` : clientId;
const volumeMultiplier = parseInt(val) / 100.0;
- if (receiverNode) {
- receiverNode.port.postMessage({ action: 'setVolume', clientId: audioId, volume: volumeMultiplier });
+ const rn = type === 'screen' ? screenReceiverNode : receiverNode;
+ if (rn) {
+ rn.port.postMessage({ action: 'setVolume', clientId: audioId, volume: volumeMultiplier });
}
};
@@ -1149,6 +1492,16 @@ function toggleVoiceMic() {
function endVoiceSession() {
setVoiceStatus("disconnected");
+ const nativeRouting = getNativeVoiceRouting();
+ if (nativeRouting && nativeRouting.stopCall) {
+ try { nativeRouting.stopCall(); } catch (e) {}
+ }
+ isVoiceSpeakerMode = false;
+ voiceLoopRestarts = 0;
+ stopNativePlayback();
+ pcmBatch = null;
+ pcmBatchLen = 0;
+
if (currentVoiceCallId) {
let payload = JSON.stringify({ string1: currentVoiceCallType, string2: currentVoiceCallId });
if (window.fetchEncrypted) window.fetchEncrypted("room/voice/leave", payload).catch(()=>{});
@@ -1182,7 +1535,13 @@ function endVoiceSession() {
if (receiverNode) {
receiverNode.port.postMessage({ action: 'clear' });
+ try { receiverNode.disconnect(); } catch (e) {}
}
+ if (screenReceiverNode) {
+ screenReceiverNode.port.postMessage({ action: 'clear' });
+ try { screenReceiverNode.disconnect(); } catch (e) {}
+ }
+ teardownVoiceLoopback();
if (camControl) { camControl.stop(); camControl = null; }
if (screenControl) { screenControl.stop(); screenControl = null; }
diff --git a/android/app/src/main/java/olcxja/miarven/MainActivity.java b/android/app/src/main/java/olcxja/miarven/MainActivity.java
index 7178e5ad..1fa40111 100644
--- a/android/app/src/main/java/olcxja/miarven/MainActivity.java
+++ b/android/app/src/main/java/olcxja/miarven/MainActivity.java
@@ -9,6 +9,13 @@ public class MainActivity extends BridgeActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+ }
+ @Override
+ protected void load() {
+ // Must be added to the builder BEFORE super.load() creates the bridge,
+ // otherwise the plugin is silently dropped (bridge already built).
+ registerPlugin(VoiceRoutingPlugin.class);
+ super.load();
}
}
diff --git a/android/app/src/main/java/olcxja/miarven/VoiceRoutingPlugin.java b/android/app/src/main/java/olcxja/miarven/VoiceRoutingPlugin.java
new file mode 100644
index 00000000..199ae8a8
--- /dev/null
+++ b/android/app/src/main/java/olcxja/miarven/VoiceRoutingPlugin.java
@@ -0,0 +1,471 @@
+package olcxja.miarven;
+
+import android.Manifest;
+import android.app.Activity;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.media.AudioAttributes;
+import android.media.AudioDeviceInfo;
+import android.media.AudioFocusRequest;
+import android.media.AudioFormat;
+import android.media.AudioManager;
+import android.media.AudioTrack;
+import android.os.Build;
+import android.os.Handler;
+import android.os.Looper;
+import android.util.Log;
+
+import androidx.core.content.ContextCompat;
+
+import com.getcapacitor.JSObject;
+import com.getcapacitor.Plugin;
+import com.getcapacitor.PluginCall;
+import com.getcapacitor.PluginMethod;
+import com.getcapacitor.annotation.CapacitorPlugin;
+import com.getcapacitor.annotation.Permission;
+import com.getcapacitor.annotation.PermissionCallback;
+
+import java.util.List;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.TimeUnit;
+
+@CapacitorPlugin(name = "VoiceRouting", permissions = {
+ @Permission(alias = "bluetooth", strings = { Manifest.permission.BLUETOOTH_CONNECT })
+})
+public class VoiceRoutingPlugin extends Plugin {
+
+ private static final String TAG = "VoiceRouting";
+ private static final long MODE_GUARD_INTERVAL_MS = 2500;
+
+ private AudioManager audioManager;
+ private boolean inCall = false;
+ private boolean speakerOn = false;
+ private AudioFocusRequest focusRequest26 = null;
+ private PluginCall pendingStartCall = null;
+ private Handler mainHandler;
+ private boolean modeListenerAdded = false;
+
+ private AudioTrack nativeTrack = null;
+ private Thread nativeFeedThread = null;
+ private final LinkedBlockingQueue pcmQueue = new LinkedBlockingQueue<>();
+ private volatile boolean nativePlaying = false;
+
+ private final AudioManager.OnAudioFocusChangeListener focusChangeListener = fi -> {};
+
+ private void log(String msg) {
+ // android.util.Log is always visible in logcat, even for release builds
+ Log.i(TAG, msg);
+ }
+
+ private AudioManager am() {
+ if (audioManager == null) {
+ audioManager = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE);
+ }
+ return audioManager;
+ }
+
+ /**
+ * Holding call audio focus is what makes Android treat the app as being in
+ * a real call: without it the system reverts MODE_IN_COMMUNICATION back to
+ * MODE_NORMAL every few seconds (AudioManager.MSG_CHECK_MODE_FOR_UID).
+ */
+ private void requestCallFocus() {
+ AudioManager am = am();
+ if (am == null) return;
+ if (Build.VERSION.SDK_INT >= 26) {
+ focusRequest26 = new AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN)
+ .setAudioAttributes(new AudioAttributes.Builder()
+ .setUsage(AudioAttributes.USAGE_VOICE_COMMUNICATION)
+ .setContentType(AudioAttributes.CONTENT_TYPE_SPEECH)
+ .build())
+ .setOnAudioFocusChangeListener(focusChangeListener)
+ .build();
+ int res = am.requestAudioFocus(focusRequest26);
+ log("audio focus request (26+): " + res);
+ } else {
+ @SuppressWarnings("deprecation")
+ int res = am.requestAudioFocus(focusChangeListener, AudioManager.STREAM_VOICE_CALL, AudioManager.AUDIOFOCUS_GAIN);
+ log("audio focus request (legacy): " + res);
+ }
+ }
+
+ private void abandonCallFocus() {
+ AudioManager am = am();
+ if (am == null) return;
+ if (Build.VERSION.SDK_INT >= 26 && focusRequest26 != null) {
+ am.abandonAudioFocusRequest(focusRequest26);
+ focusRequest26 = null;
+ } else {
+ @SuppressWarnings("deprecation")
+ int res = am.abandonAudioFocus(focusChangeListener);
+ log("audio focus abandoned: " + res);
+ }
+ }
+
+ private Handler handler() {
+ if (mainHandler == null) {
+ mainHandler = new Handler(Looper.getMainLooper());
+ }
+ return mainHandler;
+ }
+
+ private boolean needsBluetoothPermission() {
+ return Build.VERSION.SDK_INT >= 31
+ && ContextCompat.checkSelfPermission(getContext(), Manifest.permission.BLUETOOTH_CONNECT)
+ != PackageManager.PERMISSION_GRANTED;
+ }
+
+ /**
+ * Android 12+ silently reverts MODE_IN_COMMUNICATION back to MODE_NORMAL.
+ * When that happens, Chromium rebuilds its playout track with media usage
+ * and the call stops following the call volume stream. This guard restores
+ * the mode (and the route with it).
+ */
+ private void assertModeAndRoute() {
+ AudioManager am = am();
+ if (am == null || !inCall) return;
+ if (am.getMode() != AudioManager.MODE_IN_COMMUNICATION) {
+ log("MODE_IN_COMMUNICATION was reverted, restoring");
+ am.setMode(AudioManager.MODE_IN_COMMUNICATION);
+ applyRoute();
+ // Tell the web layer so it re-initializes its WebRTC playout track,
+ // which Chromium otherwise leaves tagged as media after the revert.
+ try {
+ getBridge().triggerWindowJSEvent("voicemodechanged");
+ } catch (Exception e) {
+ Log.w(TAG, "failed to notify web layer", e);
+ }
+ }
+ }
+
+ private void startModeGuard() {
+ AudioManager am = am();
+ // Instant restore on API 30+ (fires the moment the system touches the mode)
+ if (Build.VERSION.SDK_INT >= 30 && am != null && !modeListenerAdded) {
+ try {
+ am.addOnModeChangedListener(getContext().getMainExecutor(), modeChangedListener);
+ modeListenerAdded = true;
+ } catch (Exception e) {
+ Log.w(TAG, "addOnModeChangedListener failed", e);
+ }
+ }
+ handler().postDelayed(guardRunnable, MODE_GUARD_INTERVAL_MS);
+ }
+
+ private void stopModeGuard() {
+ AudioManager am = am();
+ if (modeListenerAdded && am != null) {
+ try {
+ am.removeOnModeChangedListener(modeChangedListener);
+ } catch (Exception e) {}
+ modeListenerAdded = false;
+ }
+ handler().removeCallbacks(guardRunnable);
+ }
+
+ private final Runnable guardRunnable = new Runnable() {
+ @Override
+ public void run() {
+ if (!inCall) return;
+ assertModeAndRoute();
+ handler().postDelayed(this, MODE_GUARD_INTERVAL_MS);
+ }
+ };
+
+ private final AudioManager.OnModeChangedListener modeChangedListener = new AudioManager.OnModeChangedListener() {
+ @Override
+ public void onModeChanged(int mode) {
+ if (!inCall) return;
+ log("onModeChanged -> " + mode);
+ assertModeAndRoute();
+ }
+ };
+
+ @PluginMethod
+ public void startCall(PluginCall call) {
+ if (needsBluetoothPermission()) {
+ pendingStartCall = call;
+ requestAllPermissions(call, "onBtPermissionResult");
+ return;
+ }
+ beginCall(call);
+ }
+
+ @PermissionCallback
+ private void onBtPermissionResult(PluginCall call) {
+ // Bluetooth permission is optional - continue regardless of the outcome.
+ if (pendingStartCall == call) {
+ pendingStartCall = null;
+ beginCall(call);
+ }
+ }
+
+ private void beginCall(PluginCall call) {
+ AudioManager am = am();
+ if (am == null) {
+ call.reject("AudioManager unavailable");
+ return;
+ }
+ inCall = true;
+ speakerOn = false;
+ requestCallFocus();
+ am.setMode(AudioManager.MODE_IN_COMMUNICATION);
+ applyRoute();
+ startModeGuard();
+ setVolumeControlStreamCompat(AudioManager.STREAM_VOICE_CALL);
+ call.resolve();
+ }
+
+ private void setVolumeControlStreamCompat(int stream) {
+ try {
+ Context ctx = getContext();
+ if (ctx instanceof Activity) {
+ ((Activity) ctx).setVolumeControlStream(stream);
+ }
+ } catch (Exception e) {
+ Log.w(TAG, "setVolumeControlStream failed", e);
+ }
+ }
+
+ @PluginMethod
+ public void nativeAudioStart(PluginCall call) {
+ Integer sr = call.getInt("sampleRate");
+ int sampleRate = (sr == null || sr < 8000) ? 48000 : sr;
+
+ stopNativeAudioInternal();
+
+ int minBuf = AudioTrack.getMinBufferSize(sampleRate, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT);
+ if (minBuf <= 0) {
+ call.reject("getMinBufferSize failed: " + minBuf);
+ return;
+ }
+
+ AudioAttributes attrs = new AudioAttributes.Builder()
+ .setUsage(AudioAttributes.USAGE_VOICE_COMMUNICATION)
+ .setContentType(AudioAttributes.CONTENT_TYPE_SPEECH)
+ .build();
+ AudioFormat format = new AudioFormat.Builder()
+ .setEncoding(AudioFormat.ENCODING_PCM_16BIT)
+ .setSampleRate(sampleRate)
+ .setChannelMask(AudioFormat.CHANNEL_OUT_MONO)
+ .build();
+
+ // Keep the buffer tight - its capacity directly adds to playback latency,
+ // because blocking writes keep it filled close to 100% in steady state.
+ int bufBytes = Math.max(minBuf, 1920); // >= 20 ms @ 48 kHz mono 16-bit
+
+ AudioTrack.Builder builder = new AudioTrack.Builder()
+ .setAudioAttributes(attrs)
+ .setAudioFormat(format)
+ .setTransferMode(AudioTrack.MODE_STREAM)
+ .setBufferSizeInBytes(bufBytes);
+
+ if (Build.VERSION.SDK_INT >= 26) {
+ builder.setPerformanceMode(AudioTrack.PERFORMANCE_MODE_LOW_LATENCY);
+ }
+
+ nativeTrack = builder.build();
+ pcmQueue.clear();
+ nativePlaying = true;
+ try {
+ nativeTrack.play();
+ } catch (IllegalStateException e) {
+ stopNativeAudioInternal();
+ call.reject("AudioTrack.play failed", e);
+ return;
+ }
+
+ nativeFeedThread = new Thread(() -> {
+ android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
+ while (nativePlaying) {
+ byte[] chunk;
+ try {
+ chunk = pcmQueue.poll(100, TimeUnit.MILLISECONDS);
+ } catch (InterruptedException ie) {
+ break;
+ }
+ if (chunk == null) continue;
+ AudioTrack track = nativeTrack;
+ if (track == null || !nativePlaying) break;
+ int written = track.write(chunk, 0, chunk.length, AudioTrack.WRITE_BLOCKING);
+ if (written < 0) {
+ Log.w(TAG, "AudioTrack.write error: " + written);
+ break;
+ }
+ }
+ }, "VoiceRoutingFeed");
+ nativeFeedThread.start();
+
+ log("native audio started, rate=" + sampleRate
+ + " minBuf=" + minBuf
+ + " bufBytes=" + bufBytes
+ + " (~" + (bufBytes * 500 / sampleRate) + " ms)");
+ call.resolve();
+ }
+
+ @PluginMethod
+ public void nativeAudioFeed(PluginCall call) {
+ String b64 = call.getString("data");
+ if (!nativePlaying || b64 == null || nativeTrack == null) {
+ call.resolve();
+ return;
+ }
+ byte[] pcm;
+ try {
+ pcm = android.util.Base64.decode(b64, android.util.Base64.NO_WRAP);
+ } catch (IllegalArgumentException e) {
+ call.resolve();
+ return;
+ }
+ while (pcmQueue.size() > 10) {
+ pcmQueue.poll(); // drop oldest to avoid unbounded growth
+ }
+ pcmQueue.offer(pcm);
+ call.resolve();
+ }
+
+ @PluginMethod
+ public void nativeAudioStop(PluginCall call) {
+ stopNativeAudioInternal();
+ call.resolve();
+ }
+
+ private void stopNativeAudioInternal() {
+ nativePlaying = false;
+ if (nativeFeedThread != null) {
+ nativeFeedThread.interrupt();
+ nativeFeedThread = null;
+ }
+ if (nativeTrack != null) {
+ try {
+ nativeTrack.pause();
+ nativeTrack.flush();
+ nativeTrack.release();
+ } catch (Exception e) {
+ Log.w(TAG, "AudioTrack release failed", e);
+ }
+ nativeTrack = null;
+ }
+ pcmQueue.clear();
+ }
+
+ @PluginMethod
+ public void stopCall(PluginCall call) {
+ inCall = false;
+ stopModeGuard();
+ abandonCallFocus();
+ stopNativeAudioInternal();
+ setVolumeControlStreamCompat(AudioManager.STREAM_MUSIC);
+
+ AudioManager am = am();
+ if (am != null) {
+ if (Build.VERSION.SDK_INT >= 31) {
+ am.clearCommunicationDevice();
+ }
+ am.setSpeakerphoneOn(false);
+ am.setMode(AudioManager.MODE_NORMAL);
+ }
+ speakerOn = false;
+ call.resolve();
+ }
+
+ @PluginMethod
+ public void setSpeaker(PluginCall call) {
+ speakerOn = Boolean.TRUE.equals(call.getBoolean("enabled", false));
+ applyRoute();
+ JSObject ret = new JSObject();
+ ret.put("enabled", speakerOn);
+ call.resolve(ret);
+ }
+
+ @PluginMethod
+ public void debugInfo(PluginCall call) {
+ AudioManager am = am();
+ JSObject ret = new JSObject();
+ if (am == null) {
+ ret.put("error", "no audio manager");
+ call.resolve(ret);
+ return;
+ }
+ ret.put("sdkInt", Build.VERSION.SDK_INT);
+ ret.put("mode", am.getMode());
+ ret.put("inCall", inCall);
+ ret.put("speakerOn", speakerOn);
+
+ java.util.List comm = new java.util.ArrayList<>();
+ for (AudioDeviceInfo d : am.getAvailableCommunicationDevices()) {
+ comm.add(String.valueOf(d.getType()));
+ }
+ ret.put("commDevices", String.join(",", comm));
+
+ if (Build.VERSION.SDK_INT >= 31) {
+ AudioDeviceInfo cur = am.getCommunicationDevice();
+ ret.put("commDeviceType", cur == null ? -1 : cur.getType());
+ }
+ call.resolve(ret);
+ }
+
+ private boolean applyRoute() {
+ AudioManager am = am();
+ if (am == null) return false;
+
+ // Communication mode must be active for the whole duration of the call,
+ // otherwise Chromium tags its playout track as media.
+ if (am.getMode() != AudioManager.MODE_IN_COMMUNICATION) {
+ am.setMode(AudioManager.MODE_IN_COMMUNICATION);
+ }
+
+ boolean routed = false;
+ if (Build.VERSION.SDK_INT >= 31) {
+ AudioDeviceInfo target;
+ if (speakerOn) {
+ target = findDevice(am, AudioDeviceInfo.TYPE_BUILTIN_SPEAKER);
+ } else {
+ target = findPreferredNonSpeaker(am);
+ }
+ if (target != null) {
+ routed = am.setCommunicationDevice(target);
+ }
+ log("route -> speaker=" + speakerOn
+ + " device=" + (target == null ? "default" : String.valueOf(target.getType()))
+ + " applied=" + routed
+ + " mode=" + am.getMode());
+ if (target == null && !speakerOn) {
+ // No earpiece/headset available (e.g. tablet): keep default comm routing
+ routed = true;
+ }
+ }
+
+ if (!routed) {
+ // Legacy path (Android < 12, or communication device rejected)
+ am.setMode(AudioManager.MODE_IN_COMMUNICATION);
+ am.setSpeakerphoneOn(speakerOn);
+ routed = true;
+ }
+ return routed;
+ }
+
+ private static AudioDeviceInfo findPreferredNonSpeaker(AudioManager am) {
+ int[] preference = {
+ AudioDeviceInfo.TYPE_WIRED_HEADSET,
+ AudioDeviceInfo.TYPE_WIRED_HEADPHONES,
+ AudioDeviceInfo.TYPE_USB_HEADSET,
+ AudioDeviceInfo.TYPE_BLUETOOTH_SCO,
+ AudioDeviceInfo.TYPE_BLE_HEADSET,
+ AudioDeviceInfo.TYPE_BUILTIN_EARPIECE
+ };
+ for (int type : preference) {
+ AudioDeviceInfo d = findDevice(am, type);
+ if (d != null) return d;
+ }
+ return null;
+ }
+
+ private static AudioDeviceInfo findDevice(AudioManager am, int type) {
+ List devices = am.getAvailableCommunicationDevices();
+ for (AudioDeviceInfo d : devices) {
+ if (d.getType() == type) return d;
+ }
+ return null;
+ }
+}
diff --git a/electron/package.json b/electron/package.json
index d07682a5..0c4b8636 100644
--- a/electron/package.json
+++ b/electron/package.json
@@ -1,6 +1,6 @@
{
"name": "Miarven",
- "version": "0.1.1",
+ "version": "0.1.2",
"description": "An Amazing Capacitor App",
"author": {
"name": "",
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/6ca7c74ad1793698ecc8b9bc2ba4daef/results.bin b/node_modules/@capacitor/android/capacitor/build/.transforms/6ca7c74ad1793698ecc8b9bc2ba4daef/results.bin
new file mode 100644
index 00000000..0d259ddc
--- /dev/null
+++ b/node_modules/@capacitor/android/capacitor/build/.transforms/6ca7c74ad1793698ecc8b9bc2ba4daef/results.bin
@@ -0,0 +1 @@
+o/classes
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/6ca7c74ad1793698ecc8b9bc2ba4daef/transformed/classes/classes_dex/classes.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/6ca7c74ad1793698ecc8b9bc2ba4daef/transformed/classes/classes_dex/classes.dex
new file mode 100644
index 00000000..ae005038
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/6ca7c74ad1793698ecc8b9bc2ba4daef/transformed/classes/classes_dex/classes.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/results.bin b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/results.bin
new file mode 100644
index 00000000..7ed749eb
--- /dev/null
+++ b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/results.bin
@@ -0,0 +1 @@
+o/bundleLibRuntimeToDirDebug
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/AndroidProtocolHandler.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/AndroidProtocolHandler.dex
new file mode 100644
index 00000000..3022bb6b
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/AndroidProtocolHandler.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/App$AppRestoredListener.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/App$AppRestoredListener.dex
new file mode 100644
index 00000000..b38cae36
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/App$AppRestoredListener.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/App$AppStatusChangeListener.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/App$AppStatusChangeListener.dex
new file mode 100644
index 00000000..8bb01497
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/App$AppStatusChangeListener.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/App.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/App.dex
new file mode 100644
index 00000000..23838ca5
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/App.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/AppUUID.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/AppUUID.dex
new file mode 100644
index 00000000..7a19532e
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/AppUUID.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/Bridge$1.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/Bridge$1.dex
new file mode 100644
index 00000000..73f57c1b
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/Bridge$1.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/Bridge$Builder.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/Bridge$Builder.dex
new file mode 100644
index 00000000..fdac3427
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/Bridge$Builder.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/Bridge.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/Bridge.dex
new file mode 100644
index 00000000..28a281bc
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/Bridge.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/BridgeActivity.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/BridgeActivity.dex
new file mode 100644
index 00000000..b8d3b0c9
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/BridgeActivity.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/BridgeWebChromeClient$ActivityResultListener.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/BridgeWebChromeClient$ActivityResultListener.dex
new file mode 100644
index 00000000..51229364
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/BridgeWebChromeClient$ActivityResultListener.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/BridgeWebChromeClient$PermissionListener.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/BridgeWebChromeClient$PermissionListener.dex
new file mode 100644
index 00000000..1c74b011
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/BridgeWebChromeClient$PermissionListener.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/BridgeWebChromeClient.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/BridgeWebChromeClient.dex
new file mode 100644
index 00000000..94b5e7dd
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/BridgeWebChromeClient.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/BridgeWebViewClient.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/BridgeWebViewClient.dex
new file mode 100644
index 00000000..dada39bc
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/BridgeWebViewClient.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/CapConfig$Builder.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/CapConfig$Builder.dex
new file mode 100644
index 00000000..d67cd64a
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/CapConfig$Builder.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/CapConfig.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/CapConfig.dex
new file mode 100644
index 00000000..2adbf903
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/CapConfig.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/CapacitorWebView.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/CapacitorWebView.dex
new file mode 100644
index 00000000..ff4bc3f4
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/CapacitorWebView.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/FileUtils$Type.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/FileUtils$Type.dex
new file mode 100644
index 00000000..7c85edb7
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/FileUtils$Type.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/FileUtils.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/FileUtils.dex
new file mode 100644
index 00000000..2b998de3
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/FileUtils.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/InvalidPluginException.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/InvalidPluginException.dex
new file mode 100644
index 00000000..d3cd1ecb
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/InvalidPluginException.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/InvalidPluginMethodException.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/InvalidPluginMethodException.dex
new file mode 100644
index 00000000..f6ab6d52
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/InvalidPluginMethodException.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/JSArray.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/JSArray.dex
new file mode 100644
index 00000000..0f2c0faa
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/JSArray.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/JSExport.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/JSExport.dex
new file mode 100644
index 00000000..27745a2d
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/JSExport.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/JSExportException.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/JSExportException.dex
new file mode 100644
index 00000000..9d9ea3e5
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/JSExportException.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/JSInjector.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/JSInjector.dex
new file mode 100644
index 00000000..1b85fd8d
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/JSInjector.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/JSObject.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/JSObject.dex
new file mode 100644
index 00000000..655cd2bc
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/JSObject.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/JSValue.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/JSValue.dex
new file mode 100644
index 00000000..0b8064b5
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/JSValue.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/Logger.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/Logger.dex
new file mode 100644
index 00000000..9e33f6eb
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/Logger.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/MessageHandler.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/MessageHandler.dex
new file mode 100644
index 00000000..4855fe78
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/MessageHandler.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/NativePlugin.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/NativePlugin.dex
new file mode 100644
index 00000000..85839814
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/NativePlugin.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/PermissionState.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/PermissionState.dex
new file mode 100644
index 00000000..3a57b7dc
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/PermissionState.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/Plugin.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/Plugin.dex
new file mode 100644
index 00000000..f4f738db
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/Plugin.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/PluginCall$PluginCallDataTypeException.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/PluginCall$PluginCallDataTypeException.dex
new file mode 100644
index 00000000..04e3f83d
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/PluginCall$PluginCallDataTypeException.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/PluginCall.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/PluginCall.dex
new file mode 100644
index 00000000..734fa633
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/PluginCall.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/PluginConfig.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/PluginConfig.dex
new file mode 100644
index 00000000..ae1ddace
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/PluginConfig.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/PluginHandle.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/PluginHandle.dex
new file mode 100644
index 00000000..4aa63e9b
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/PluginHandle.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/PluginInvocationException.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/PluginInvocationException.dex
new file mode 100644
index 00000000..156cf426
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/PluginInvocationException.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/PluginLoadException.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/PluginLoadException.dex
new file mode 100644
index 00000000..95c8cfc4
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/PluginLoadException.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/PluginManager.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/PluginManager.dex
new file mode 100644
index 00000000..4c5c7c1c
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/PluginManager.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/PluginMethod.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/PluginMethod.dex
new file mode 100644
index 00000000..9351e1a8
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/PluginMethod.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/PluginMethodHandle.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/PluginMethodHandle.dex
new file mode 100644
index 00000000..80598d10
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/PluginMethodHandle.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/PluginResult.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/PluginResult.dex
new file mode 100644
index 00000000..61ace884
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/PluginResult.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/ProcessedRoute.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/ProcessedRoute.dex
new file mode 100644
index 00000000..51cd24ef
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/ProcessedRoute.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/RouteProcessor.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/RouteProcessor.dex
new file mode 100644
index 00000000..d9e20f87
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/RouteProcessor.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/ServerPath$PathType.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/ServerPath$PathType.dex
new file mode 100644
index 00000000..e2e4395e
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/ServerPath$PathType.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/ServerPath.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/ServerPath.dex
new file mode 100644
index 00000000..be7e2a17
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/ServerPath.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/UriMatcher.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/UriMatcher.dex
new file mode 100644
index 00000000..ac27f35f
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/UriMatcher.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/WebViewListener.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/WebViewListener.dex
new file mode 100644
index 00000000..6b012bef
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/WebViewListener.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/WebViewLocalServer$1.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/WebViewLocalServer$1.dex
new file mode 100644
index 00000000..c9f1a772
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/WebViewLocalServer$1.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/WebViewLocalServer$LazyInputStream.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/WebViewLocalServer$LazyInputStream.dex
new file mode 100644
index 00000000..780fe20c
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/WebViewLocalServer$LazyInputStream.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/WebViewLocalServer$LollipopLazyInputStream.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/WebViewLocalServer$LollipopLazyInputStream.dex
new file mode 100644
index 00000000..5ad77e62
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/WebViewLocalServer$LollipopLazyInputStream.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/WebViewLocalServer$PathHandler.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/WebViewLocalServer$PathHandler.dex
new file mode 100644
index 00000000..f162eb06
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/WebViewLocalServer$PathHandler.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/WebViewLocalServer.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/WebViewLocalServer.dex
new file mode 100644
index 00000000..507b494d
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/WebViewLocalServer.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/annotation/ActivityCallback.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/annotation/ActivityCallback.dex
new file mode 100644
index 00000000..00f62d6b
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/annotation/ActivityCallback.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/annotation/CapacitorPlugin.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/annotation/CapacitorPlugin.dex
new file mode 100644
index 00000000..42885934
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/annotation/CapacitorPlugin.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/annotation/Permission.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/annotation/Permission.dex
new file mode 100644
index 00000000..97d94592
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/annotation/Permission.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/annotation/PermissionCallback.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/annotation/PermissionCallback.dex
new file mode 100644
index 00000000..5790bab2
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/annotation/PermissionCallback.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/cordova/CapacitorCordovaCookieManager.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/cordova/CapacitorCordovaCookieManager.dex
new file mode 100644
index 00000000..757ffc96
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/cordova/CapacitorCordovaCookieManager.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/cordova/MockCordovaInterfaceImpl.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/cordova/MockCordovaInterfaceImpl.dex
new file mode 100644
index 00000000..e649b3a1
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/cordova/MockCordovaInterfaceImpl.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/cordova/MockCordovaWebViewImpl$CapacitorEvalBridgeMode.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/cordova/MockCordovaWebViewImpl$CapacitorEvalBridgeMode.dex
new file mode 100644
index 00000000..b601b381
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/cordova/MockCordovaWebViewImpl$CapacitorEvalBridgeMode.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/cordova/MockCordovaWebViewImpl.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/cordova/MockCordovaWebViewImpl.dex
new file mode 100644
index 00000000..3072349b
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/cordova/MockCordovaWebViewImpl.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/plugin/CapacitorCookieManager.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/plugin/CapacitorCookieManager.dex
new file mode 100644
index 00000000..b3073284
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/plugin/CapacitorCookieManager.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/plugin/CapacitorCookies.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/plugin/CapacitorCookies.dex
new file mode 100644
index 00000000..e8073612
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/plugin/CapacitorCookies.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/plugin/CapacitorHttp$1.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/plugin/CapacitorHttp$1.dex
new file mode 100644
index 00000000..443fbb40
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/plugin/CapacitorHttp$1.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/plugin/CapacitorHttp.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/plugin/CapacitorHttp.dex
new file mode 100644
index 00000000..8146a76d
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/plugin/CapacitorHttp.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/plugin/SystemBars$1.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/plugin/SystemBars$1.dex
new file mode 100644
index 00000000..d3a2865f
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/plugin/SystemBars$1.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/plugin/SystemBars.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/plugin/SystemBars.dex
new file mode 100644
index 00000000..87f10639
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/plugin/SystemBars.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/plugin/WebView.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/plugin/WebView.dex
new file mode 100644
index 00000000..2032e39c
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/plugin/WebView.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/plugin/util/AssetUtil.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/plugin/util/AssetUtil.dex
new file mode 100644
index 00000000..f42b78f7
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/plugin/util/AssetUtil.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/plugin/util/CapacitorHttpUrlConnection.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/plugin/util/CapacitorHttpUrlConnection.dex
new file mode 100644
index 00000000..282b80c6
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/plugin/util/CapacitorHttpUrlConnection.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/plugin/util/HttpRequestHandler$HttpURLConnectionBuilder.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/plugin/util/HttpRequestHandler$HttpURLConnectionBuilder.dex
new file mode 100644
index 00000000..865a18a2
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/plugin/util/HttpRequestHandler$HttpURLConnectionBuilder.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/plugin/util/HttpRequestHandler$ProgressEmitter.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/plugin/util/HttpRequestHandler$ProgressEmitter.dex
new file mode 100644
index 00000000..c0464eb3
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/plugin/util/HttpRequestHandler$ProgressEmitter.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/plugin/util/HttpRequestHandler$ResponseType.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/plugin/util/HttpRequestHandler$ResponseType.dex
new file mode 100644
index 00000000..268e90f4
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/plugin/util/HttpRequestHandler$ResponseType.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/plugin/util/HttpRequestHandler.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/plugin/util/HttpRequestHandler.dex
new file mode 100644
index 00000000..69aea00b
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/plugin/util/HttpRequestHandler.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/plugin/util/ICapacitorHttpUrlConnection.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/plugin/util/ICapacitorHttpUrlConnection.dex
new file mode 100644
index 00000000..b02d8ab7
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/plugin/util/ICapacitorHttpUrlConnection.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/plugin/util/MimeType.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/plugin/util/MimeType.dex
new file mode 100644
index 00000000..5c8c14cd
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/plugin/util/MimeType.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/util/HostMask$Any.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/util/HostMask$Any.dex
new file mode 100644
index 00000000..8d18c9b7
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/util/HostMask$Any.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/util/HostMask$Nothing.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/util/HostMask$Nothing.dex
new file mode 100644
index 00000000..3f8b60b0
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/util/HostMask$Nothing.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/util/HostMask$Parser.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/util/HostMask$Parser.dex
new file mode 100644
index 00000000..cff65ced
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/util/HostMask$Parser.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/util/HostMask$Simple.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/util/HostMask$Simple.dex
new file mode 100644
index 00000000..cfbb65a3
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/util/HostMask$Simple.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/util/HostMask$Util.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/util/HostMask$Util.dex
new file mode 100644
index 00000000..6a34d4d8
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/util/HostMask$Util.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/util/HostMask.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/util/HostMask.dex
new file mode 100644
index 00000000..ec9dfa77
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/util/HostMask.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/util/InternalUtils.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/util/InternalUtils.dex
new file mode 100644
index 00000000..2905f0d9
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/util/InternalUtils.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/util/JSONUtils.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/util/JSONUtils.dex
new file mode 100644
index 00000000..908eca17
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/util/JSONUtils.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/util/PermissionHelper.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/util/PermissionHelper.dex
new file mode 100644
index 00000000..7b75a941
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/util/PermissionHelper.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/util/WebColor.dex b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/util/WebColor.dex
new file mode 100644
index 00000000..8659e6f2
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/getcapacitor/util/WebColor.dex differ
diff --git a/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/desugar_graph.bin b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/desugar_graph.bin
new file mode 100644
index 00000000..520d33b9
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/.transforms/d21ea84fc3e73a043c621d9e8954475a/transformed/bundleLibRuntimeToDirDebug/desugar_graph.bin differ
diff --git a/node_modules/@capacitor/android/capacitor/build/intermediates/aar_main_jar/debug/syncDebugLibJars/classes.jar b/node_modules/@capacitor/android/capacitor/build/intermediates/aar_main_jar/debug/syncDebugLibJars/classes.jar
new file mode 100644
index 00000000..11e85a3f
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/intermediates/aar_main_jar/debug/syncDebugLibJars/classes.jar differ
diff --git a/node_modules/@capacitor/android/capacitor/build/intermediates/annotations_typedef_file/debug/extractDebugAnnotations/typedefs.txt b/node_modules/@capacitor/android/capacitor/build/intermediates/annotations_typedef_file/debug/extractDebugAnnotations/typedefs.txt
new file mode 100644
index 00000000..e69de29b
diff --git a/node_modules/@capacitor/android/capacitor/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/layout_capacitor_bridge_layout_main.xml.flat b/node_modules/@capacitor/android/capacitor/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/layout_capacitor_bridge_layout_main.xml.flat
index edc8e16a..8a0a9515 100644
Binary files a/node_modules/@capacitor/android/capacitor/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/layout_capacitor_bridge_layout_main.xml.flat and b/node_modules/@capacitor/android/capacitor/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/layout_capacitor_bridge_layout_main.xml.flat differ
diff --git a/node_modules/@capacitor/android/capacitor/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/layout_no_webview.xml.flat b/node_modules/@capacitor/android/capacitor/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/layout_no_webview.xml.flat
index f0b521c9..e46f9e7e 100644
Binary files a/node_modules/@capacitor/android/capacitor/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/layout_no_webview.xml.flat and b/node_modules/@capacitor/android/capacitor/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/layout_no_webview.xml.flat differ
diff --git a/node_modules/@capacitor/android/capacitor/build/intermediates/incremental/debug-mergeJavaRes/merge-state b/node_modules/@capacitor/android/capacitor/build/intermediates/incremental/debug-mergeJavaRes/merge-state
new file mode 100644
index 00000000..1c983fc9
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/intermediates/incremental/debug-mergeJavaRes/merge-state differ
diff --git a/node_modules/@capacitor/android/capacitor/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties b/node_modules/@capacitor/android/capacitor/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties
index 5ce2b77d..2178e256 100644
--- a/node_modules/@capacitor/android/capacitor/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties
+++ b/node_modules/@capacitor/android/capacitor/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties
@@ -1,3 +1,3 @@
-#Fri May 08 14:50:17 CEST 2026
-com.getcapacitor.android.capacitor-android-main-6\:/layout/capacitor_bridge_layout_main.xml=/mnt/53f2216a-7b07-4701-84a7-17840ebdf186/backup/project/html/LarpixClient/node_modules/@capacitor/android/capacitor/build/intermediates/packaged_res/debug/packageDebugResources/layout/capacitor_bridge_layout_main.xml
-com.getcapacitor.android.capacitor-android-main-6\:/layout/no_webview.xml=/mnt/53f2216a-7b07-4701-84a7-17840ebdf186/backup/project/html/LarpixClient/node_modules/@capacitor/android/capacitor/build/intermediates/packaged_res/debug/packageDebugResources/layout/no_webview.xml
+#Sun Aug 23 17:36:45 CEST 2026
+com.getcapacitor.android.capacitor-android-main-6\:/layout/capacitor_bridge_layout_main.xml=/mnt/512_2020/backup/project/html/LarpixClient/node_modules/@capacitor/android/capacitor/build/intermediates/packaged_res/debug/packageDebugResources/layout/capacitor_bridge_layout_main.xml
+com.getcapacitor.android.capacitor-android-main-6\:/layout/no_webview.xml=/mnt/512_2020/backup/project/html/LarpixClient/node_modules/@capacitor/android/capacitor/build/intermediates/packaged_res/debug/packageDebugResources/layout/no_webview.xml
diff --git a/node_modules/@capacitor/android/capacitor/build/intermediates/incremental/debug/packageDebugResources/merger.xml b/node_modules/@capacitor/android/capacitor/build/intermediates/incremental/debug/packageDebugResources/merger.xml
index ac0b2138..0793e9b8 100644
--- a/node_modules/@capacitor/android/capacitor/build/intermediates/incremental/debug/packageDebugResources/merger.xml
+++ b/node_modules/@capacitor/android/capacitor/build/intermediates/incremental/debug/packageDebugResources/merger.xml
@@ -1,5 +1,5 @@
-This app requires a WebView to work#3F51B5#303F9F#FF4081
\ No newline at end of file
+ #3F51B5#303F9F#FF4081This app requires a WebView to work
\ No newline at end of file
diff --git a/node_modules/@capacitor/android/capacitor/build/intermediates/incremental/mergeDebugAssets/merger.xml b/node_modules/@capacitor/android/capacitor/build/intermediates/incremental/mergeDebugAssets/merger.xml
index 43a2e06c..695ce6ee 100644
--- a/node_modules/@capacitor/android/capacitor/build/intermediates/incremental/mergeDebugAssets/merger.xml
+++ b/node_modules/@capacitor/android/capacitor/build/intermediates/incremental/mergeDebugAssets/merger.xml
@@ -1,2 +1,2 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/node_modules/@capacitor/android/capacitor/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml b/node_modules/@capacitor/android/capacitor/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml
index da5836c6..abafc952 100644
--- a/node_modules/@capacitor/android/capacitor/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml
+++ b/node_modules/@capacitor/android/capacitor/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml
@@ -1,2 +1,2 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/node_modules/@capacitor/android/capacitor/build/intermediates/incremental/mergeDebugShaders/merger.xml b/node_modules/@capacitor/android/capacitor/build/intermediates/incremental/mergeDebugShaders/merger.xml
index 59424e0b..f54943d5 100644
--- a/node_modules/@capacitor/android/capacitor/build/intermediates/incremental/mergeDebugShaders/merger.xml
+++ b/node_modules/@capacitor/android/capacitor/build/intermediates/incremental/mergeDebugShaders/merger.xml
@@ -1,2 +1,2 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/node_modules/@capacitor/android/capacitor/build/intermediates/merged_consumer_proguard_file/debug/mergeDebugConsumerProguardFiles/proguard.txt b/node_modules/@capacitor/android/capacitor/build/intermediates/merged_consumer_proguard_file/debug/mergeDebugConsumerProguardFiles/proguard.txt
new file mode 100644
index 00000000..96db065b
--- /dev/null
+++ b/node_modules/@capacitor/android/capacitor/build/intermediates/merged_consumer_proguard_file/debug/mergeDebugConsumerProguardFiles/proguard.txt
@@ -0,0 +1,28 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# Rules for Capacitor v3 plugins and annotations
+ -keep @com.getcapacitor.annotation.CapacitorPlugin public class * {
+ @com.getcapacitor.annotation.PermissionCallback ;
+ @com.getcapacitor.annotation.ActivityCallback ;
+ @com.getcapacitor.annotation.Permission ;
+ @com.getcapacitor.PluginMethod public ;
+ }
+
+ -keep public class * extends com.getcapacitor.Plugin { *; }
+
+# Rules for Capacitor v2 plugins and annotations
+# These are deprecated but can still be used with Capacitor for now
+-keep @com.getcapacitor.NativePlugin public class * {
+ @com.getcapacitor.PluginMethod public ;
+}
+
+# Rules for Cordova plugins
+-keep public class * extends org.apache.cordova.* {
+ public ;
+ public ;
+}
\ No newline at end of file
diff --git a/node_modules/@capacitor/android/capacitor/build/intermediates/merged_java_res/debug/mergeDebugJavaResource/feature-capacitor-android.jar b/node_modules/@capacitor/android/capacitor/build/intermediates/merged_java_res/debug/mergeDebugJavaResource/feature-capacitor-android.jar
new file mode 100644
index 00000000..15cb0ecb
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/intermediates/merged_java_res/debug/mergeDebugJavaResource/feature-capacitor-android.jar differ
diff --git a/node_modules/@capacitor/android/capacitor/build/outputs/aar/capacitor-android-debug.aar b/node_modules/@capacitor/android/capacitor/build/outputs/aar/capacitor-android-debug.aar
new file mode 100644
index 00000000..cd735009
Binary files /dev/null and b/node_modules/@capacitor/android/capacitor/build/outputs/aar/capacitor-android-debug.aar differ
diff --git a/node_modules/@capacitor/android/capacitor/build/outputs/logs/manifest-merger-debug-report.txt b/node_modules/@capacitor/android/capacitor/build/outputs/logs/manifest-merger-debug-report.txt
index 55b66680..c522e38e 100644
--- a/node_modules/@capacitor/android/capacitor/build/outputs/logs/manifest-merger-debug-report.txt
+++ b/node_modules/@capacitor/android/capacitor/build/outputs/logs/manifest-merger-debug-report.txt
@@ -1,16 +1,16 @@
-- Merging decision tree log ---
manifest
-ADDED from /mnt/53f2216a-7b07-4701-84a7-17840ebdf186/backup/project/html/LarpixClient/node_modules/@capacitor/android/capacitor/src/main/AndroidManifest.xml:2:1-3:12
-INJECTED from /mnt/53f2216a-7b07-4701-84a7-17840ebdf186/backup/project/html/LarpixClient/node_modules/@capacitor/android/capacitor/src/main/AndroidManifest.xml:2:1-3:12
+ADDED from /mnt/512_2020/backup/project/html/LarpixClient/node_modules/@capacitor/android/capacitor/src/main/AndroidManifest.xml:2:1-3:12
+INJECTED from /mnt/512_2020/backup/project/html/LarpixClient/node_modules/@capacitor/android/capacitor/src/main/AndroidManifest.xml:2:1-3:12
package
- INJECTED from /mnt/53f2216a-7b07-4701-84a7-17840ebdf186/backup/project/html/LarpixClient/node_modules/@capacitor/android/capacitor/src/main/AndroidManifest.xml
+ INJECTED from /mnt/512_2020/backup/project/html/LarpixClient/node_modules/@capacitor/android/capacitor/src/main/AndroidManifest.xml
xmlns:android
- ADDED from /mnt/53f2216a-7b07-4701-84a7-17840ebdf186/backup/project/html/LarpixClient/node_modules/@capacitor/android/capacitor/src/main/AndroidManifest.xml:2:11-69
+ ADDED from /mnt/512_2020/backup/project/html/LarpixClient/node_modules/@capacitor/android/capacitor/src/main/AndroidManifest.xml:2:11-69
uses-sdk
-INJECTED from /mnt/53f2216a-7b07-4701-84a7-17840ebdf186/backup/project/html/LarpixClient/node_modules/@capacitor/android/capacitor/src/main/AndroidManifest.xml reason: use-sdk injection requested
-INJECTED from /mnt/53f2216a-7b07-4701-84a7-17840ebdf186/backup/project/html/LarpixClient/node_modules/@capacitor/android/capacitor/src/main/AndroidManifest.xml
-INJECTED from /mnt/53f2216a-7b07-4701-84a7-17840ebdf186/backup/project/html/LarpixClient/node_modules/@capacitor/android/capacitor/src/main/AndroidManifest.xml
+INJECTED from /mnt/512_2020/backup/project/html/LarpixClient/node_modules/@capacitor/android/capacitor/src/main/AndroidManifest.xml reason: use-sdk injection requested
+INJECTED from /mnt/512_2020/backup/project/html/LarpixClient/node_modules/@capacitor/android/capacitor/src/main/AndroidManifest.xml
+INJECTED from /mnt/512_2020/backup/project/html/LarpixClient/node_modules/@capacitor/android/capacitor/src/main/AndroidManifest.xml
android:targetSdkVersion
- INJECTED from /mnt/53f2216a-7b07-4701-84a7-17840ebdf186/backup/project/html/LarpixClient/node_modules/@capacitor/android/capacitor/src/main/AndroidManifest.xml
+ INJECTED from /mnt/512_2020/backup/project/html/LarpixClient/node_modules/@capacitor/android/capacitor/src/main/AndroidManifest.xml
android:minSdkVersion
- INJECTED from /mnt/53f2216a-7b07-4701-84a7-17840ebdf186/backup/project/html/LarpixClient/node_modules/@capacitor/android/capacitor/src/main/AndroidManifest.xml
+ INJECTED from /mnt/512_2020/backup/project/html/LarpixClient/node_modules/@capacitor/android/capacitor/src/main/AndroidManifest.xml
diff --git a/node_modules/@capacitor/android/capacitor/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin b/node_modules/@capacitor/android/capacitor/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin
index f92e6e7b..c11fe808 100644
Binary files a/node_modules/@capacitor/android/capacitor/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin and b/node_modules/@capacitor/android/capacitor/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin differ
diff --git a/node_modules/@capacitor/app/android/build/.transforms/0018a545408534d6f6907bb2d08709a8/results.bin b/node_modules/@capacitor/app/android/build/.transforms/0018a545408534d6f6907bb2d08709a8/results.bin
new file mode 100644
index 00000000..0d259ddc
--- /dev/null
+++ b/node_modules/@capacitor/app/android/build/.transforms/0018a545408534d6f6907bb2d08709a8/results.bin
@@ -0,0 +1 @@
+o/classes
diff --git a/node_modules/@capacitor/app/android/build/.transforms/0018a545408534d6f6907bb2d08709a8/transformed/classes/classes_dex/classes.dex b/node_modules/@capacitor/app/android/build/.transforms/0018a545408534d6f6907bb2d08709a8/transformed/classes/classes_dex/classes.dex
new file mode 100644
index 00000000..02d4b2a1
Binary files /dev/null and b/node_modules/@capacitor/app/android/build/.transforms/0018a545408534d6f6907bb2d08709a8/transformed/classes/classes_dex/classes.dex differ
diff --git a/node_modules/@capacitor/app/android/build/.transforms/cd4f30cf136e8a2085979a7448ba39ea/results.bin b/node_modules/@capacitor/app/android/build/.transforms/cd4f30cf136e8a2085979a7448ba39ea/results.bin
new file mode 100644
index 00000000..7ed749eb
--- /dev/null
+++ b/node_modules/@capacitor/app/android/build/.transforms/cd4f30cf136e8a2085979a7448ba39ea/results.bin
@@ -0,0 +1 @@
+o/bundleLibRuntimeToDirDebug
diff --git a/node_modules/@capacitor/app/android/build/.transforms/cd4f30cf136e8a2085979a7448ba39ea/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/capacitorjs/plugins/app/AppPlugin$1.dex b/node_modules/@capacitor/app/android/build/.transforms/cd4f30cf136e8a2085979a7448ba39ea/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/capacitorjs/plugins/app/AppPlugin$1.dex
new file mode 100644
index 00000000..adcad9cd
Binary files /dev/null and b/node_modules/@capacitor/app/android/build/.transforms/cd4f30cf136e8a2085979a7448ba39ea/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/capacitorjs/plugins/app/AppPlugin$1.dex differ
diff --git a/node_modules/@capacitor/app/android/build/.transforms/cd4f30cf136e8a2085979a7448ba39ea/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/capacitorjs/plugins/app/AppPlugin.dex b/node_modules/@capacitor/app/android/build/.transforms/cd4f30cf136e8a2085979a7448ba39ea/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/capacitorjs/plugins/app/AppPlugin.dex
new file mode 100644
index 00000000..97ead3d2
Binary files /dev/null and b/node_modules/@capacitor/app/android/build/.transforms/cd4f30cf136e8a2085979a7448ba39ea/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/capacitorjs/plugins/app/AppPlugin.dex differ
diff --git a/node_modules/@capacitor/app/android/build/.transforms/cd4f30cf136e8a2085979a7448ba39ea/transformed/bundleLibRuntimeToDirDebug/desugar_graph.bin b/node_modules/@capacitor/app/android/build/.transforms/cd4f30cf136e8a2085979a7448ba39ea/transformed/bundleLibRuntimeToDirDebug/desugar_graph.bin
new file mode 100644
index 00000000..63c59ed4
Binary files /dev/null and b/node_modules/@capacitor/app/android/build/.transforms/cd4f30cf136e8a2085979a7448ba39ea/transformed/bundleLibRuntimeToDirDebug/desugar_graph.bin differ
diff --git a/node_modules/@capacitor/app/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml b/node_modules/@capacitor/app/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml
new file mode 100644
index 00000000..207765f5
--- /dev/null
+++ b/node_modules/@capacitor/app/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/node_modules/@capacitor/app/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/output-metadata.json b/node_modules/@capacitor/app/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/output-metadata.json
new file mode 100644
index 00000000..ef1726d4
--- /dev/null
+++ b/node_modules/@capacitor/app/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/output-metadata.json
@@ -0,0 +1,18 @@
+{
+ "version": 3,
+ "artifactType": {
+ "type": "AAPT_FRIENDLY_MERGED_MANIFESTS",
+ "kind": "Directory"
+ },
+ "applicationId": "com.capacitorjs.plugins.app",
+ "variantName": "debug",
+ "elements": [
+ {
+ "type": "SINGLE",
+ "filters": [],
+ "attributes": [],
+ "outputFile": "AndroidManifest.xml"
+ }
+ ],
+ "elementType": "File"
+}
\ No newline at end of file
diff --git a/node_modules/@capacitor/app/android/build/intermediates/aar_main_jar/debug/syncDebugLibJars/classes.jar b/node_modules/@capacitor/app/android/build/intermediates/aar_main_jar/debug/syncDebugLibJars/classes.jar
new file mode 100644
index 00000000..b890eeab
Binary files /dev/null and b/node_modules/@capacitor/app/android/build/intermediates/aar_main_jar/debug/syncDebugLibJars/classes.jar differ
diff --git a/node_modules/@capacitor/app/android/build/intermediates/aar_metadata/debug/writeDebugAarMetadata/aar-metadata.properties b/node_modules/@capacitor/app/android/build/intermediates/aar_metadata/debug/writeDebugAarMetadata/aar-metadata.properties
new file mode 100644
index 00000000..1211b1ef
--- /dev/null
+++ b/node_modules/@capacitor/app/android/build/intermediates/aar_metadata/debug/writeDebugAarMetadata/aar-metadata.properties
@@ -0,0 +1,6 @@
+aarFormatVersion=1.0
+aarMetadataVersion=1.0
+minCompileSdk=1
+minCompileSdkExtension=0
+minAndroidGradlePluginVersion=1.0.0
+coreLibraryDesugaringEnabled=false
diff --git a/node_modules/@capacitor/app/android/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json b/node_modules/@capacitor/app/android/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json
new file mode 100644
index 00000000..9e26dfee
--- /dev/null
+++ b/node_modules/@capacitor/app/android/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/node_modules/@capacitor/app/android/build/intermediates/annotations_typedef_file/debug/extractDebugAnnotations/typedefs.txt b/node_modules/@capacitor/app/android/build/intermediates/annotations_typedef_file/debug/extractDebugAnnotations/typedefs.txt
new file mode 100644
index 00000000..e69de29b
diff --git a/node_modules/@capacitor/app/android/build/intermediates/compile_library_classes_jar/debug/bundleLibCompileToJarDebug/classes.jar b/node_modules/@capacitor/app/android/build/intermediates/compile_library_classes_jar/debug/bundleLibCompileToJarDebug/classes.jar
new file mode 100644
index 00000000..3af13e3a
Binary files /dev/null and b/node_modules/@capacitor/app/android/build/intermediates/compile_library_classes_jar/debug/bundleLibCompileToJarDebug/classes.jar differ
diff --git a/node_modules/@capacitor/app/android/build/intermediates/compile_r_class_jar/debug/generateDebugRFile/R.jar b/node_modules/@capacitor/app/android/build/intermediates/compile_r_class_jar/debug/generateDebugRFile/R.jar
new file mode 100644
index 00000000..e05c9b4e
Binary files /dev/null and b/node_modules/@capacitor/app/android/build/intermediates/compile_r_class_jar/debug/generateDebugRFile/R.jar differ
diff --git a/node_modules/@capacitor/app/android/build/intermediates/compile_symbol_list/debug/generateDebugRFile/R.txt b/node_modules/@capacitor/app/android/build/intermediates/compile_symbol_list/debug/generateDebugRFile/R.txt
new file mode 100644
index 00000000..e69de29b
diff --git a/node_modules/@capacitor/app/android/build/intermediates/incremental/debug-mergeJavaRes/merge-state b/node_modules/@capacitor/app/android/build/intermediates/incremental/debug-mergeJavaRes/merge-state
new file mode 100644
index 00000000..1c983fc9
Binary files /dev/null and b/node_modules/@capacitor/app/android/build/intermediates/incremental/debug-mergeJavaRes/merge-state differ
diff --git a/node_modules/@capacitor/app/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties b/node_modules/@capacitor/app/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties
new file mode 100644
index 00000000..c63d4e48
--- /dev/null
+++ b/node_modules/@capacitor/app/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties
@@ -0,0 +1 @@
+#Sun Aug 23 17:36:45 CEST 2026
diff --git a/node_modules/@capacitor/app/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml b/node_modules/@capacitor/app/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml
new file mode 100644
index 00000000..896fe612
--- /dev/null
+++ b/node_modules/@capacitor/app/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/node_modules/@capacitor/app/android/build/intermediates/incremental/mergeDebugAssets/merger.xml b/node_modules/@capacitor/app/android/build/intermediates/incremental/mergeDebugAssets/merger.xml
new file mode 100644
index 00000000..85ea6606
--- /dev/null
+++ b/node_modules/@capacitor/app/android/build/intermediates/incremental/mergeDebugAssets/merger.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/node_modules/@capacitor/app/android/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml b/node_modules/@capacitor/app/android/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml
new file mode 100644
index 00000000..b605bf2f
--- /dev/null
+++ b/node_modules/@capacitor/app/android/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/node_modules/@capacitor/app/android/build/intermediates/incremental/mergeDebugShaders/merger.xml b/node_modules/@capacitor/app/android/build/intermediates/incremental/mergeDebugShaders/merger.xml
new file mode 100644
index 00000000..d7c74260
--- /dev/null
+++ b/node_modules/@capacitor/app/android/build/intermediates/incremental/mergeDebugShaders/merger.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/node_modules/@capacitor/app/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/capacitorjs/plugins/app/AppPlugin$1.class b/node_modules/@capacitor/app/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/capacitorjs/plugins/app/AppPlugin$1.class
new file mode 100644
index 00000000..5e911788
Binary files /dev/null and b/node_modules/@capacitor/app/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/capacitorjs/plugins/app/AppPlugin$1.class differ
diff --git a/node_modules/@capacitor/app/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/capacitorjs/plugins/app/AppPlugin.class b/node_modules/@capacitor/app/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/capacitorjs/plugins/app/AppPlugin.class
new file mode 100644
index 00000000..3f7f30dd
Binary files /dev/null and b/node_modules/@capacitor/app/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/capacitorjs/plugins/app/AppPlugin.class differ
diff --git a/node_modules/@capacitor/app/android/build/intermediates/local_only_symbol_list/debug/parseDebugLocalResources/R-def.txt b/node_modules/@capacitor/app/android/build/intermediates/local_only_symbol_list/debug/parseDebugLocalResources/R-def.txt
new file mode 100644
index 00000000..78ac5b8b
--- /dev/null
+++ b/node_modules/@capacitor/app/android/build/intermediates/local_only_symbol_list/debug/parseDebugLocalResources/R-def.txt
@@ -0,0 +1,2 @@
+R_DEF: Internal format may change without notice
+local
diff --git a/node_modules/@capacitor/app/android/build/intermediates/manifest_merge_blame_file/debug/processDebugManifest/manifest-merger-blame-debug-report.txt b/node_modules/@capacitor/app/android/build/intermediates/manifest_merge_blame_file/debug/processDebugManifest/manifest-merger-blame-debug-report.txt
new file mode 100644
index 00000000..cc594c32
--- /dev/null
+++ b/node_modules/@capacitor/app/android/build/intermediates/manifest_merge_blame_file/debug/processDebugManifest/manifest-merger-blame-debug-report.txt
@@ -0,0 +1,7 @@
+1
+2
+4
+5
+6
+7
diff --git a/node_modules/@capacitor/app/android/build/intermediates/merged_java_res/debug/mergeDebugJavaResource/feature-capacitor-app.jar b/node_modules/@capacitor/app/android/build/intermediates/merged_java_res/debug/mergeDebugJavaResource/feature-capacitor-app.jar
new file mode 100644
index 00000000..15cb0ecb
Binary files /dev/null and b/node_modules/@capacitor/app/android/build/intermediates/merged_java_res/debug/mergeDebugJavaResource/feature-capacitor-app.jar differ
diff --git a/node_modules/@capacitor/app/android/build/intermediates/merged_manifest/debug/processDebugManifest/AndroidManifest.xml b/node_modules/@capacitor/app/android/build/intermediates/merged_manifest/debug/processDebugManifest/AndroidManifest.xml
new file mode 100644
index 00000000..207765f5
--- /dev/null
+++ b/node_modules/@capacitor/app/android/build/intermediates/merged_manifest/debug/processDebugManifest/AndroidManifest.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/node_modules/@capacitor/app/android/build/intermediates/navigation_json/debug/extractDeepLinksDebug/navigation.json b/node_modules/@capacitor/app/android/build/intermediates/navigation_json/debug/extractDeepLinksDebug/navigation.json
new file mode 100644
index 00000000..0637a088
--- /dev/null
+++ b/node_modules/@capacitor/app/android/build/intermediates/navigation_json/debug/extractDeepLinksDebug/navigation.json
@@ -0,0 +1 @@
+[]
\ No newline at end of file
diff --git a/node_modules/@capacitor/app/android/build/intermediates/nested_resources_validation_report/debug/generateDebugResources/nestedResourcesValidationReport.txt b/node_modules/@capacitor/app/android/build/intermediates/nested_resources_validation_report/debug/generateDebugResources/nestedResourcesValidationReport.txt
new file mode 100644
index 00000000..08f4ebea
--- /dev/null
+++ b/node_modules/@capacitor/app/android/build/intermediates/nested_resources_validation_report/debug/generateDebugResources/nestedResourcesValidationReport.txt
@@ -0,0 +1 @@
+0 Warning/Error
\ No newline at end of file
diff --git a/node_modules/@capacitor/app/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/capacitorjs/plugins/app/AppPlugin$1.class b/node_modules/@capacitor/app/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/capacitorjs/plugins/app/AppPlugin$1.class
new file mode 100644
index 00000000..5e911788
Binary files /dev/null and b/node_modules/@capacitor/app/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/capacitorjs/plugins/app/AppPlugin$1.class differ
diff --git a/node_modules/@capacitor/app/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/capacitorjs/plugins/app/AppPlugin.class b/node_modules/@capacitor/app/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/capacitorjs/plugins/app/AppPlugin.class
new file mode 100644
index 00000000..3f7f30dd
Binary files /dev/null and b/node_modules/@capacitor/app/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/capacitorjs/plugins/app/AppPlugin.class differ
diff --git a/node_modules/@capacitor/app/android/build/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar b/node_modules/@capacitor/app/android/build/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar
new file mode 100644
index 00000000..19fbbaec
Binary files /dev/null and b/node_modules/@capacitor/app/android/build/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar differ
diff --git a/node_modules/@capacitor/app/android/build/intermediates/symbol_list_with_package_name/debug/generateDebugRFile/package-aware-r.txt b/node_modules/@capacitor/app/android/build/intermediates/symbol_list_with_package_name/debug/generateDebugRFile/package-aware-r.txt
new file mode 100644
index 00000000..df0c8ada
--- /dev/null
+++ b/node_modules/@capacitor/app/android/build/intermediates/symbol_list_with_package_name/debug/generateDebugRFile/package-aware-r.txt
@@ -0,0 +1 @@
+com.capacitorjs.plugins.app
diff --git a/node_modules/@capacitor/app/android/build/outputs/aar/capacitor-app-debug.aar b/node_modules/@capacitor/app/android/build/outputs/aar/capacitor-app-debug.aar
new file mode 100644
index 00000000..b0478003
Binary files /dev/null and b/node_modules/@capacitor/app/android/build/outputs/aar/capacitor-app-debug.aar differ
diff --git a/node_modules/@capacitor/app/android/build/outputs/logs/manifest-merger-debug-report.txt b/node_modules/@capacitor/app/android/build/outputs/logs/manifest-merger-debug-report.txt
new file mode 100644
index 00000000..818292a5
--- /dev/null
+++ b/node_modules/@capacitor/app/android/build/outputs/logs/manifest-merger-debug-report.txt
@@ -0,0 +1,16 @@
+-- Merging decision tree log ---
+manifest
+ADDED from /mnt/512_2020/backup/project/html/LarpixClient/node_modules/@capacitor/app/android/src/main/AndroidManifest.xml:1:1-2:12
+INJECTED from /mnt/512_2020/backup/project/html/LarpixClient/node_modules/@capacitor/app/android/src/main/AndroidManifest.xml:1:1-2:12
+ package
+ INJECTED from /mnt/512_2020/backup/project/html/LarpixClient/node_modules/@capacitor/app/android/src/main/AndroidManifest.xml
+ xmlns:android
+ ADDED from /mnt/512_2020/backup/project/html/LarpixClient/node_modules/@capacitor/app/android/src/main/AndroidManifest.xml:1:11-69
+uses-sdk
+INJECTED from /mnt/512_2020/backup/project/html/LarpixClient/node_modules/@capacitor/app/android/src/main/AndroidManifest.xml reason: use-sdk injection requested
+INJECTED from /mnt/512_2020/backup/project/html/LarpixClient/node_modules/@capacitor/app/android/src/main/AndroidManifest.xml
+INJECTED from /mnt/512_2020/backup/project/html/LarpixClient/node_modules/@capacitor/app/android/src/main/AndroidManifest.xml
+ android:targetSdkVersion
+ INJECTED from /mnt/512_2020/backup/project/html/LarpixClient/node_modules/@capacitor/app/android/src/main/AndroidManifest.xml
+ android:minSdkVersion
+ INJECTED from /mnt/512_2020/backup/project/html/LarpixClient/node_modules/@capacitor/app/android/src/main/AndroidManifest.xml
diff --git a/node_modules/@capacitor/app/android/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin b/node_modules/@capacitor/app/android/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin
new file mode 100644
index 00000000..353737be
Binary files /dev/null and b/node_modules/@capacitor/app/android/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin differ
diff --git a/node_modules/@capacitor/status-bar/android/build/.transforms/9d510e6b84042a2254090309c337c1cf/results.bin b/node_modules/@capacitor/status-bar/android/build/.transforms/9d510e6b84042a2254090309c337c1cf/results.bin
new file mode 100644
index 00000000..7ed749eb
--- /dev/null
+++ b/node_modules/@capacitor/status-bar/android/build/.transforms/9d510e6b84042a2254090309c337c1cf/results.bin
@@ -0,0 +1 @@
+o/bundleLibRuntimeToDirDebug
diff --git a/node_modules/@capacitor/status-bar/android/build/.transforms/9d510e6b84042a2254090309c337c1cf/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/capacitorjs/plugins/statusbar/StatusBar$ChangeListener.dex b/node_modules/@capacitor/status-bar/android/build/.transforms/9d510e6b84042a2254090309c337c1cf/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/capacitorjs/plugins/statusbar/StatusBar$ChangeListener.dex
new file mode 100644
index 00000000..e750f62c
Binary files /dev/null and b/node_modules/@capacitor/status-bar/android/build/.transforms/9d510e6b84042a2254090309c337c1cf/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/capacitorjs/plugins/statusbar/StatusBar$ChangeListener.dex differ
diff --git a/node_modules/@capacitor/status-bar/android/build/.transforms/9d510e6b84042a2254090309c337c1cf/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/capacitorjs/plugins/statusbar/StatusBar.dex b/node_modules/@capacitor/status-bar/android/build/.transforms/9d510e6b84042a2254090309c337c1cf/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/capacitorjs/plugins/statusbar/StatusBar.dex
new file mode 100644
index 00000000..fd2763ac
Binary files /dev/null and b/node_modules/@capacitor/status-bar/android/build/.transforms/9d510e6b84042a2254090309c337c1cf/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/capacitorjs/plugins/statusbar/StatusBar.dex differ
diff --git a/node_modules/@capacitor/status-bar/android/build/.transforms/9d510e6b84042a2254090309c337c1cf/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/capacitorjs/plugins/statusbar/StatusBarConfig.dex b/node_modules/@capacitor/status-bar/android/build/.transforms/9d510e6b84042a2254090309c337c1cf/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/capacitorjs/plugins/statusbar/StatusBarConfig.dex
new file mode 100644
index 00000000..c06aa00e
Binary files /dev/null and b/node_modules/@capacitor/status-bar/android/build/.transforms/9d510e6b84042a2254090309c337c1cf/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/capacitorjs/plugins/statusbar/StatusBarConfig.dex differ
diff --git a/node_modules/@capacitor/status-bar/android/build/.transforms/9d510e6b84042a2254090309c337c1cf/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/capacitorjs/plugins/statusbar/StatusBarInfo.dex b/node_modules/@capacitor/status-bar/android/build/.transforms/9d510e6b84042a2254090309c337c1cf/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/capacitorjs/plugins/statusbar/StatusBarInfo.dex
new file mode 100644
index 00000000..0eac488b
Binary files /dev/null and b/node_modules/@capacitor/status-bar/android/build/.transforms/9d510e6b84042a2254090309c337c1cf/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/capacitorjs/plugins/statusbar/StatusBarInfo.dex differ
diff --git a/node_modules/@capacitor/status-bar/android/build/.transforms/9d510e6b84042a2254090309c337c1cf/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/capacitorjs/plugins/statusbar/StatusBarPlugin.dex b/node_modules/@capacitor/status-bar/android/build/.transforms/9d510e6b84042a2254090309c337c1cf/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/capacitorjs/plugins/statusbar/StatusBarPlugin.dex
new file mode 100644
index 00000000..60459c5c
Binary files /dev/null and b/node_modules/@capacitor/status-bar/android/build/.transforms/9d510e6b84042a2254090309c337c1cf/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/capacitorjs/plugins/statusbar/StatusBarPlugin.dex differ
diff --git a/node_modules/@capacitor/status-bar/android/build/.transforms/9d510e6b84042a2254090309c337c1cf/transformed/bundleLibRuntimeToDirDebug/desugar_graph.bin b/node_modules/@capacitor/status-bar/android/build/.transforms/9d510e6b84042a2254090309c337c1cf/transformed/bundleLibRuntimeToDirDebug/desugar_graph.bin
new file mode 100644
index 00000000..e2941e2b
Binary files /dev/null and b/node_modules/@capacitor/status-bar/android/build/.transforms/9d510e6b84042a2254090309c337c1cf/transformed/bundleLibRuntimeToDirDebug/desugar_graph.bin differ
diff --git a/node_modules/@capacitor/status-bar/android/build/.transforms/d16dda434a1716f35c7bb062d8b88f77/results.bin b/node_modules/@capacitor/status-bar/android/build/.transforms/d16dda434a1716f35c7bb062d8b88f77/results.bin
new file mode 100644
index 00000000..0d259ddc
--- /dev/null
+++ b/node_modules/@capacitor/status-bar/android/build/.transforms/d16dda434a1716f35c7bb062d8b88f77/results.bin
@@ -0,0 +1 @@
+o/classes
diff --git a/node_modules/@capacitor/status-bar/android/build/.transforms/d16dda434a1716f35c7bb062d8b88f77/transformed/classes/classes_dex/classes.dex b/node_modules/@capacitor/status-bar/android/build/.transforms/d16dda434a1716f35c7bb062d8b88f77/transformed/classes/classes_dex/classes.dex
new file mode 100644
index 00000000..c5aec5cd
Binary files /dev/null and b/node_modules/@capacitor/status-bar/android/build/.transforms/d16dda434a1716f35c7bb062d8b88f77/transformed/classes/classes_dex/classes.dex differ
diff --git a/node_modules/@capacitor/status-bar/android/build/intermediates/aar_main_jar/debug/syncDebugLibJars/classes.jar b/node_modules/@capacitor/status-bar/android/build/intermediates/aar_main_jar/debug/syncDebugLibJars/classes.jar
new file mode 100644
index 00000000..131ded08
Binary files /dev/null and b/node_modules/@capacitor/status-bar/android/build/intermediates/aar_main_jar/debug/syncDebugLibJars/classes.jar differ
diff --git a/node_modules/@capacitor/status-bar/android/build/intermediates/annotations_typedef_file/debug/extractDebugAnnotations/typedefs.txt b/node_modules/@capacitor/status-bar/android/build/intermediates/annotations_typedef_file/debug/extractDebugAnnotations/typedefs.txt
new file mode 100644
index 00000000..e69de29b
diff --git a/node_modules/@capacitor/status-bar/android/build/intermediates/incremental/debug-mergeJavaRes/merge-state b/node_modules/@capacitor/status-bar/android/build/intermediates/incremental/debug-mergeJavaRes/merge-state
new file mode 100644
index 00000000..1c983fc9
Binary files /dev/null and b/node_modules/@capacitor/status-bar/android/build/intermediates/incremental/debug-mergeJavaRes/merge-state differ
diff --git a/node_modules/@capacitor/status-bar/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties b/node_modules/@capacitor/status-bar/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties
index e9a9345f..c63d4e48 100644
--- a/node_modules/@capacitor/status-bar/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties
+++ b/node_modules/@capacitor/status-bar/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties
@@ -1 +1 @@
-#Fri May 08 15:46:08 CEST 2026
+#Sun Aug 23 17:36:45 CEST 2026
diff --git a/node_modules/@capacitor/status-bar/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml b/node_modules/@capacitor/status-bar/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml
index 4728e8b9..ed4d73e3 100644
--- a/node_modules/@capacitor/status-bar/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml
+++ b/node_modules/@capacitor/status-bar/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml
@@ -1,2 +1,2 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/node_modules/@capacitor/status-bar/android/build/intermediates/incremental/mergeDebugAssets/merger.xml b/node_modules/@capacitor/status-bar/android/build/intermediates/incremental/mergeDebugAssets/merger.xml
index 73e89e9a..4b51de20 100644
--- a/node_modules/@capacitor/status-bar/android/build/intermediates/incremental/mergeDebugAssets/merger.xml
+++ b/node_modules/@capacitor/status-bar/android/build/intermediates/incremental/mergeDebugAssets/merger.xml
@@ -1,2 +1,2 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/node_modules/@capacitor/status-bar/android/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml b/node_modules/@capacitor/status-bar/android/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml
index a88eef6a..ce9f1efe 100644
--- a/node_modules/@capacitor/status-bar/android/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml
+++ b/node_modules/@capacitor/status-bar/android/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml
@@ -1,2 +1,2 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/node_modules/@capacitor/status-bar/android/build/intermediates/incremental/mergeDebugShaders/merger.xml b/node_modules/@capacitor/status-bar/android/build/intermediates/incremental/mergeDebugShaders/merger.xml
index a11ba17e..107b2ed9 100644
--- a/node_modules/@capacitor/status-bar/android/build/intermediates/incremental/mergeDebugShaders/merger.xml
+++ b/node_modules/@capacitor/status-bar/android/build/intermediates/incremental/mergeDebugShaders/merger.xml
@@ -1,2 +1,2 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/node_modules/@capacitor/status-bar/android/build/intermediates/merged_java_res/debug/mergeDebugJavaResource/feature-capacitor-status-bar.jar b/node_modules/@capacitor/status-bar/android/build/intermediates/merged_java_res/debug/mergeDebugJavaResource/feature-capacitor-status-bar.jar
new file mode 100644
index 00000000..15cb0ecb
Binary files /dev/null and b/node_modules/@capacitor/status-bar/android/build/intermediates/merged_java_res/debug/mergeDebugJavaResource/feature-capacitor-status-bar.jar differ
diff --git a/node_modules/@capacitor/status-bar/android/build/outputs/aar/capacitor-status-bar-debug.aar b/node_modules/@capacitor/status-bar/android/build/outputs/aar/capacitor-status-bar-debug.aar
new file mode 100644
index 00000000..de883152
Binary files /dev/null and b/node_modules/@capacitor/status-bar/android/build/outputs/aar/capacitor-status-bar-debug.aar differ
diff --git a/node_modules/@capacitor/status-bar/android/build/outputs/logs/manifest-merger-debug-report.txt b/node_modules/@capacitor/status-bar/android/build/outputs/logs/manifest-merger-debug-report.txt
index 049c7bf6..370cd46e 100644
--- a/node_modules/@capacitor/status-bar/android/build/outputs/logs/manifest-merger-debug-report.txt
+++ b/node_modules/@capacitor/status-bar/android/build/outputs/logs/manifest-merger-debug-report.txt
@@ -1,16 +1,16 @@
-- Merging decision tree log ---
manifest
-ADDED from /mnt/53f2216a-7b07-4701-84a7-17840ebdf186/backup/project/html/LarpixClient/node_modules/@capacitor/status-bar/android/src/main/AndroidManifest.xml:1:1-2:12
-INJECTED from /mnt/53f2216a-7b07-4701-84a7-17840ebdf186/backup/project/html/LarpixClient/node_modules/@capacitor/status-bar/android/src/main/AndroidManifest.xml:1:1-2:12
+ADDED from /mnt/512_2020/backup/project/html/LarpixClient/node_modules/@capacitor/status-bar/android/src/main/AndroidManifest.xml:1:1-2:12
+INJECTED from /mnt/512_2020/backup/project/html/LarpixClient/node_modules/@capacitor/status-bar/android/src/main/AndroidManifest.xml:1:1-2:12
package
- INJECTED from /mnt/53f2216a-7b07-4701-84a7-17840ebdf186/backup/project/html/LarpixClient/node_modules/@capacitor/status-bar/android/src/main/AndroidManifest.xml
+ INJECTED from /mnt/512_2020/backup/project/html/LarpixClient/node_modules/@capacitor/status-bar/android/src/main/AndroidManifest.xml
xmlns:android
- ADDED from /mnt/53f2216a-7b07-4701-84a7-17840ebdf186/backup/project/html/LarpixClient/node_modules/@capacitor/status-bar/android/src/main/AndroidManifest.xml:1:11-69
+ ADDED from /mnt/512_2020/backup/project/html/LarpixClient/node_modules/@capacitor/status-bar/android/src/main/AndroidManifest.xml:1:11-69
uses-sdk
-INJECTED from /mnt/53f2216a-7b07-4701-84a7-17840ebdf186/backup/project/html/LarpixClient/node_modules/@capacitor/status-bar/android/src/main/AndroidManifest.xml reason: use-sdk injection requested
-INJECTED from /mnt/53f2216a-7b07-4701-84a7-17840ebdf186/backup/project/html/LarpixClient/node_modules/@capacitor/status-bar/android/src/main/AndroidManifest.xml
-INJECTED from /mnt/53f2216a-7b07-4701-84a7-17840ebdf186/backup/project/html/LarpixClient/node_modules/@capacitor/status-bar/android/src/main/AndroidManifest.xml
+INJECTED from /mnt/512_2020/backup/project/html/LarpixClient/node_modules/@capacitor/status-bar/android/src/main/AndroidManifest.xml reason: use-sdk injection requested
+INJECTED from /mnt/512_2020/backup/project/html/LarpixClient/node_modules/@capacitor/status-bar/android/src/main/AndroidManifest.xml
+INJECTED from /mnt/512_2020/backup/project/html/LarpixClient/node_modules/@capacitor/status-bar/android/src/main/AndroidManifest.xml
android:targetSdkVersion
- INJECTED from /mnt/53f2216a-7b07-4701-84a7-17840ebdf186/backup/project/html/LarpixClient/node_modules/@capacitor/status-bar/android/src/main/AndroidManifest.xml
+ INJECTED from /mnt/512_2020/backup/project/html/LarpixClient/node_modules/@capacitor/status-bar/android/src/main/AndroidManifest.xml
android:minSdkVersion
- INJECTED from /mnt/53f2216a-7b07-4701-84a7-17840ebdf186/backup/project/html/LarpixClient/node_modules/@capacitor/status-bar/android/src/main/AndroidManifest.xml
+ INJECTED from /mnt/512_2020/backup/project/html/LarpixClient/node_modules/@capacitor/status-bar/android/src/main/AndroidManifest.xml
diff --git a/node_modules/@capacitor/status-bar/android/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin b/node_modules/@capacitor/status-bar/android/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin
index 98471e1b..9250326a 100644
Binary files a/node_modules/@capacitor/status-bar/android/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin and b/node_modules/@capacitor/status-bar/android/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin differ
diff --git a/package.json b/package.json
index 02b0c6a4..726ddb74 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "olcxja.miarven",
- "version": "0.1.1",
+ "version": "0.1.2",
"description": "Larpix client",
"license": "AGPL-3.0",
"author": "olcxja's softworks",
diff --git a/version.json b/version.json
index 863e6940..f2c4cdcb 100644
--- a/version.json
+++ b/version.json
@@ -1,5 +1,5 @@
{
- "versionCode": 2,
- "versionName": "0.1.1",
- "npmVersion": "0.1.1"
+ "versionCode": 3,
+ "versionName": "0.1.2",
+ "npmVersion": "0.1.2"
}
diff --git a/webroot/blah/en-cat.json b/webroot/blah/en-cat.json
index db64989f..3fba6c40 100644
--- a/webroot/blah/en-cat.json
+++ b/webroot/blah/en-cat.json
@@ -298,6 +298,7 @@
"action.call.camera": "camera",
"action.call.screen": "share screen",
"action.call.disconnect": "disconnect :3",
+ "action.call.speaker": "speaker :3",
"action.call.join": "join :3",
"action.call.decline": "decline :c",
"title.incoming.call": "incoming voice chat :3",
diff --git a/webroot/blah/en-us.json b/webroot/blah/en-us.json
index ee67f52d..20cfaee5 100644
--- a/webroot/blah/en-us.json
+++ b/webroot/blah/en-us.json
@@ -306,6 +306,7 @@
"action.call.mute": "Mute Microphone",
"action.call.camera": "Camera",
"action.call.screen": "Share Screen",
+ "action.call.speaker": "Speaker",
"action.call.disconnect": "Disconnect",
"action.call.join": "Join",
"action.call.decline": "Decline",
diff --git a/webroot/blah/pl-pl.json b/webroot/blah/pl-pl.json
index 7d6f14ab..0df5e471 100644
--- a/webroot/blah/pl-pl.json
+++ b/webroot/blah/pl-pl.json
@@ -306,6 +306,7 @@
"action.call.mute": "Wycisz mikrofon",
"action.call.camera": "Kamera",
"action.call.screen": "Udostępnij ekran",
+ "action.call.speaker": "Głośnik",
"action.call.disconnect": "Rozłącz",
"action.call.join": "Dołącz",
"action.call.decline": "Odrzuć",
diff --git a/webroot/icons.js b/webroot/icons.js
index b734da1f..e43b10bf 100644
--- a/webroot/icons.js
+++ b/webroot/icons.js
@@ -49,6 +49,7 @@ const ICONS = {
video: (props) => ICONS._feather(``, props),
file: (props) => ICONS._feather(``, props),
mic: (props) => ICONS._feather(``, props),
+ speaker: (props) => ICONS._create(``, { viewBox: "0 0 24 24", width: "1.4rem", height: "1.4rem", fill: "var(--text-color)", stroke: "none" }, props),
home: (props) => ICONS._create(``, { viewBox: "-1 -1 18 18", width: "1.5rem", height: "1.5rem", fill: "none", stroke: "none" }, props),
inbox: (props) => ICONS._material(``, props),
diff --git a/webroot/style.css b/webroot/style.css
index 5e495bcb..d7bc91be 100644
--- a/webroot/style.css
+++ b/webroot/style.css
@@ -1729,4 +1729,17 @@ input:checked + .toggle-slider:before {
.voice-call-btn {
padding: 0 0.75rem;
}
+
+ #voice-users {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(min(5.5rem, 100%), 1fr));
+ grid-auto-rows: minmax(6.25rem, 1fr);
+ align-content: stretch;
+ justify-items: stretch;
+ }
+ .voice-tile {
+ width: auto !important;
+ height: auto !important;
+ min-width: 0;
+ }
}
diff --git a/webroot/version.js b/webroot/version.js
index 62bf5330..e9331a1b 100644
--- a/webroot/version.js
+++ b/webroot/version.js
@@ -1 +1 @@
-const CLIENT_VERSION = "0.1.1";
+const CLIENT_VERSION = "0.1.2";
diff --git a/webroot/voice.js b/webroot/voice.js
index b3a68a16..3e68b022 100644
--- a/webroot/voice.js
+++ b/webroot/voice.js
@@ -14,6 +14,20 @@ let knownVoiceUsers = new Set();
let isMicMuted = false;
let remoteVideos = {}, videoDecryptChains = {};
let camControl = null, screenControl = null;
+let screenReceiverNode = null;
+let voiceOutputAudio = null;
+let voiceLoopSendPc = null, voiceLoopRecvPc = null;
+let voicePlayoutDest = null;
+let voiceLoopWatchdog = null;
+let voiceRemoteStream = null;
+let voiceLoopRestarts = 0;
+let voiceDeviceChangeHandler = null;
+let voiceDeviceChangeTimer = null;
+let isVoiceSpeakerMode = false;
+let voiceTapNode = null;
+let pcmBatch = null;
+let pcmBatchLen = 0;
+let voicePcmFlushTimer = null;
const SPEAKING_HANGOVER_MS = 400;
@@ -62,6 +76,269 @@ function updateVoicePing() {
if (pingEl) pingEl.innerText = voicePingMs !== null ? `${voicePingMs} ms` : "";
}
+function isMobileVoiceDevice() {
+ return /Android|iPhone|iPad|iPod|Mobile/i.test(navigator.userAgent) && !!window.RTCPeerConnection;
+}
+
+function getNativeVoiceRouting() {
+ try {
+ return window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.VoiceRouting ? window.Capacitor.Plugins.VoiceRouting : null;
+ } catch (e) {
+ return null;
+ }
+}
+
+function teardownVoiceLoopback() {
+ if (voiceLoopWatchdog) { clearTimeout(voiceLoopWatchdog); voiceLoopWatchdog = null; }
+ document.removeEventListener("click", voicePlayRetry, true);
+ window.removeEventListener("voicemodechanged", voiceModeChangedHandler);
+ if (voiceDeviceChangeHandler && navigator.mediaDevices && navigator.mediaDevices.removeEventListener) {
+ navigator.mediaDevices.removeEventListener("devicechange", voiceDeviceChangeHandler);
+ }
+ voiceDeviceChangeHandler = null;
+ clearTimeout(voiceDeviceChangeTimer);
+ if (voiceLoopSendPc) { try { voiceLoopSendPc.close(); } catch (e) {} voiceLoopSendPc = null; }
+ if (voiceLoopRecvPc) { try { voiceLoopRecvPc.close(); } catch (e) {} voiceLoopRecvPc = null; }
+ if (voicePlayoutDest) { try { voicePlayoutDest.disconnect(); } catch (e) {} voicePlayoutDest = null; }
+ if (voiceOutputAudio) {
+ try { voiceOutputAudio.pause(); } catch (e) {}
+ voiceOutputAudio.srcObject = null;
+ voiceOutputAudio.remove();
+ voiceOutputAudio = null;
+ }
+ voiceRemoteStream = null;
+}
+
+function voicePlayRetry() {
+ if (voiceOutputAudio) voiceOutputAudio.play().catch(() => {});
+}
+
+function int16ToBase64(view) {
+ let bin = '';
+ const u8 = new Uint8Array(view.buffer, view.byteOffset, view.byteLength);
+ const STEP = 8192;
+ for (let i = 0; i < u8.length; i += STEP) {
+ bin += String.fromCharCode.apply(null, u8.subarray(i, Math.min(i + STEP, u8.length)));
+ }
+ return btoa(bin);
+}
+
+function flushPcmBatch() {
+ if (!pcmBatchLen || !pcmBatch) return;
+ const native = getNativeVoiceRouting();
+ if (native && native.nativeAudioFeed && native.nativeAudioStart) {
+ const slice = new Int16Array(pcmBatch.subarray(0, pcmBatchLen));
+ try {
+ native.nativeAudioFeed({ data: int16ToBase64(slice) }).catch(() => {});
+ } catch (e) {}
+ }
+ pcmBatchLen = 0;
+}
+
+function handlePcmChunk(ev) {
+ try {
+ if (!getNativeVoiceRouting() || !pcmBatch) return;
+ const chunk = new Int16Array(ev.data);
+ for (let i = 0; i < chunk.length; i++) {
+ if (pcmBatchLen >= pcmBatch.length) flushPcmBatch();
+ pcmBatch[pcmBatchLen++] = chunk[i];
+ }
+ } catch (e) {}
+}
+
+function stopNativePlayback() {
+ if (voicePcmFlushTimer) { clearInterval(voicePcmFlushTimer); voicePcmFlushTimer = null; }
+ flushPcmBatch();
+ if (voiceTapNode) {
+ try { voiceTapNode.disconnect(); } catch (e) {}
+ try { voiceTapNode.port.onmessage = null; } catch (e) {}
+ voiceTapNode = null;
+ }
+ const native = getNativeVoiceRouting();
+ if (native && native.nativeAudioStop) native.nativeAudioStop().catch(() => {});
+}
+
+// Fired natively when Android reverted MODE_IN_COMMUNICATION and the plugin
+// restored it - Chromium's playout track must be re-initialized afterwards.
+function voiceModeChangedHandler() {
+ console.debug("Voice: native mode restore detected, replugging playout");
+ setTimeout(() => replugVoiceOutputElement(), 150);
+ setTimeout(() => replugVoiceOutputElement(), 700);
+}
+
+function voicePlayoutOk() {
+ let connected = voiceLoopRecvPc && voiceLoopRecvPc.connectionState === "connected";
+ let playing = voiceOutputAudio && !voiceOutputAudio.paused;
+ return !!connected && !!playing;
+}
+
+// Re-attaching the stream forces the browser audio stack to re-initialize its
+// output track - needed after communication device changes on Android.
+async function replugVoiceOutputElement() {
+ if (!voiceOutputAudio || !voiceRemoteStream) return;
+ console.debug("Voice: replugging WebRTC playout element");
+ try { voiceOutputAudio.pause(); } catch (e) {}
+ voiceOutputAudio.srcObject = null;
+ voiceOutputAudio.srcObject = voiceRemoteStream;
+ try { await voiceOutputAudio.play(); } catch (e) {}
+}
+
+function fallbackVoiceToMediaOutput() {
+ if (!receiverNode || !audioContext || !voicePlayoutDest) return;
+ console.warn("Voice: WebRTC playout unavailable, falling back to media output");
+ teardownVoiceLoopback();
+ try { receiverNode.disconnect(); } catch (e) {}
+ try { receiverNode.connect(audioContext.destination); } catch (e) {}
+}
+
+function recoverVoiceLoopback() {
+ if (!receiverNode || !audioContext || !voicePlayoutDest) return;
+ const native = getNativeVoiceRouting();
+
+ // First aid: re-plug the playout element (fixes stuck routes after device switches)
+ replugVoiceOutputElement().then(() => {
+ setTimeout(() => {
+ if (!voicePlayoutDest || voicePlayoutOk()) return;
+ if (native && voiceLoopRestarts < 2) {
+ voiceLoopRestarts++;
+ console.warn("Voice: restarting WebRTC loopback (attempt " + voiceLoopRestarts + ")");
+ const wasSpeaker = isVoiceSpeakerMode;
+ teardownVoiceLoopback();
+ isVoiceSpeakerMode = wasSpeaker;
+ setupVoiceOutput();
+ } else {
+ fallbackVoiceToMediaOutput();
+ }
+ }, 800);
+ });
+}
+
+function setupVoiceOutput() {
+ if (!audioContext || !receiverNode) return;
+ try { receiverNode.disconnect(); } catch (e) {}
+ if (screenReceiverNode) {
+ try { screenReceiverNode.disconnect(); } catch (e) {}
+ screenReceiverNode.connect(audioContext.destination);
+ }
+
+ const native = getNativeVoiceRouting();
+
+ // App + native plugin: the mixed call audio is played by a native AudioTrack
+ // (USAGE_VOICE_COMMUNICATION), so it follows the call volume slider and the
+ // earpiece/speaker switch. Nothing is output through the WebAudio graph.
+ if (native && isMobileVoiceDevice()) {
+ stopNativePlayback();
+ pcmBatch = new Int16Array(1536); // 32 ms @ 48 kHz
+ pcmBatchLen = 0;
+ voiceTapNode = new AudioWorkletNode(audioContext, 'audio-tap');
+ voiceTapNode.port.onmessage = handlePcmChunk;
+ receiverNode.connect(voiceTapNode);
+ if (voicePcmFlushTimer) clearInterval(voicePcmFlushTimer);
+ voicePcmFlushTimer = setInterval(flushPcmBatch, 25);
+ if (native.nativeAudioStart) native.nativeAudioStart({ sampleRate: audioContext.sampleRate }).catch(() => {});
+ return;
+ }
+
+ if (!isMobileVoiceDevice()) {
+ receiverNode.connect(audioContext.destination);
+ return;
+ }
+
+ // Browser-only speaker mode plays through plain media output.
+ // With the native plugin present, routing stays on the call path
+ // and the speaker switch is handled natively.
+ if (isVoiceSpeakerMode) {
+ receiverNode.connect(audioContext.destination);
+ return;
+ }
+
+ voiceLoopRestarts = 0;
+ teardownVoiceLoopback();
+ voicePlayoutDest = audioContext.createMediaStreamDestination();
+ receiverNode.connect(voicePlayoutDest);
+
+ voiceLoopSendPc = new RTCPeerConnection();
+ voiceLoopRecvPc = new RTCPeerConnection();
+ voiceLoopSendPc.onicecandidate = e => { if (e.candidate) try { voiceLoopRecvPc.addIceCandidate(e.candidate); } catch (err) {} };
+ voiceLoopRecvPc.onicecandidate = e => { if (e.candidate) try { voiceLoopSendPc.addIceCandidate(e.candidate); } catch (err) {} };
+ voiceLoopRecvPc.onconnectionstatechange = () => {
+ const st = voiceLoopRecvPc && voiceLoopRecvPc.connectionState;
+ if (st === "failed") recoverVoiceLoopback();
+ };
+ voiceLoopRecvPc.ontrack = e => {
+ voiceRemoteStream = e.streams[0];
+ if (!voiceOutputAudio) {
+ voiceOutputAudio = document.createElement("audio");
+ voiceOutputAudio.autoplay = true;
+ voiceOutputAudio.setAttribute("playsinline", "");
+ document.body.appendChild(voiceOutputAudio);
+ }
+ voiceOutputAudio.srcObject = voiceRemoteStream;
+ voiceOutputAudio.play().catch(() => {});
+ };
+ document.addEventListener("click", voicePlayRetry, true);
+ window.addEventListener("voicemodechanged", voiceModeChangedHandler);
+ if (navigator.mediaDevices && navigator.mediaDevices.addEventListener) {
+ voiceDeviceChangeHandler = () => {
+ clearTimeout(voiceDeviceChangeTimer);
+ // Audio route changed (BT/headset/speaker) - re-init the playout track
+ voiceDeviceChangeTimer = setTimeout(() => replugVoiceOutputElement(), 400);
+ };
+ navigator.mediaDevices.addEventListener("devicechange", voiceDeviceChangeHandler);
+ }
+ voiceLoopSendPc.addTrack(voicePlayoutDest.stream.getAudioTracks()[0], voicePlayoutDest.stream);
+ voiceLoopSendPc.createOffer()
+ .then(offer => voiceLoopSendPc.setLocalDescription(offer))
+ .then(() => voiceLoopRecvPc.setRemoteDescription(voiceLoopSendPc.localDescription))
+ .then(() => voiceLoopRecvPc.createAnswer())
+ .then(answer => voiceLoopRecvPc.setLocalDescription(answer))
+ .then(() => voiceLoopSendPc.setRemoteDescription(voiceLoopRecvPc.localDescription))
+ .catch(() => {
+ recoverVoiceLoopback();
+ });
+
+ // Safety net: verify the WebRTC playout actually produces sound and repair it if not
+ if (voiceLoopWatchdog) clearTimeout(voiceLoopWatchdog);
+ voiceLoopWatchdog = setTimeout(() => {
+ voiceLoopWatchdog = null;
+ if (!voicePlayoutDest) return;
+ voicePlayRetry();
+ setTimeout(() => {
+ if (!voicePlayoutDest || voicePlayoutOk()) return;
+ recoverVoiceLoopback();
+ }, 600);
+ }, 4000);
+}
+
+window.toggleVoiceSpeakerMode = async function() {
+ isVoiceSpeakerMode = !isVoiceSpeakerMode;
+ let btn = document.getElementById("voice-btn-speaker");
+ if (btn) btn.classList.toggle("voice-btn-active", isVoiceSpeakerMode);
+
+ const native = getNativeVoiceRouting();
+ if (native && native.setSpeaker) {
+ // Native routing keeps playback on the call volume stream - only the
+ // physical output (earpiece <-> loudspeaker) changes, like a phone call.
+ // The native AudioTrack follows the communication device automatically.
+ try { await native.setSpeaker({ enabled: isVoiceSpeakerMode }); } catch (e) {}
+ setTimeout(() => replugVoiceOutputElement(), 250);
+ setTimeout(() => replugVoiceOutputElement(), 900);
+ setTimeout(() => { if (voicePlayoutDest && !voicePlayoutOk()) recoverVoiceLoopback(); }, 1700);
+ return;
+ }
+
+ if (!receiverNode) return;
+ try { receiverNode.disconnect(); } catch (e) {}
+
+ if (!isVoiceSpeakerMode && voicePlayoutDest) {
+ receiverNode.connect(voicePlayoutDest);
+ if (voiceOutputAudio) voiceOutputAudio.play().catch(() => {});
+ } else {
+ receiverNode.connect(audioContext.destination);
+ if (voiceOutputAudio) { try { voiceOutputAudio.pause(); } catch (e) {} }
+ }
+};
+
function setVoiceStatus(state) {
let el = document.getElementById("voice-status");
if (!el) return;
@@ -88,8 +365,12 @@ function setVoiceStatus(state) {
}
}
-function setTileSpeaking(clientId, speaking) {
+function setTileSpeaking(clientId, speaking, streamDecoderId = null) {
let tile = document.getElementById(`voice-tile-${clientId}`);
+ if (streamDecoderId) {
+ let streamTile = document.getElementById(`voice-tile-stream-${streamDecoderId}`);
+ if (streamTile) tile = streamTile;
+ }
if (!tile) return;
if (tile._speakingTimer) {
@@ -197,6 +478,25 @@ class AudioReceiver extends AudioWorkletProcessor {
} return true;
}
}
+class AudioTap extends AudioWorkletProcessor {
+ constructor() { super(); this.acc = new Int16Array(512); this.accLen = 0; }
+ process(inputs) {
+ const ch = inputs[0] && inputs[0][0];
+ if (ch && this.port) {
+ for (let i = 0; i < ch.length; i++) {
+ const s = Math.max(-1, Math.min(1, ch[i]));
+ this.acc[this.accLen++] = s < 0 ? s * 0x8000 : s * 0x7FFF;
+ }
+ if (this.accLen >= this.acc.length) {
+ this.port.postMessage(this.acc.buffer, [this.acc.buffer]);
+ this.acc = new Int16Array(512);
+ this.accLen = 0;
+ }
+ }
+ return true;
+ }
+}
+registerProcessor('audio-tap', AudioTap);
registerProcessor('audio-sender', AudioProcessor);
registerProcessor('audio-receiver', AudioReceiver);`;
@@ -289,16 +589,22 @@ async function startVoiceSession(serverUrl) {
const micConstraints = {audio: {echoCancellation: false, noiseSuppression: false, autoGainControl: false}};
micStream = await navigator.mediaDevices.getUserMedia(micConstraints);
-
+
+ const nativeRouting = getNativeVoiceRouting();
+ if (nativeRouting && nativeRouting.startCall) {
+ try { await nativeRouting.startCall(); } catch (e) {}
+ }
+
if (!audioContext) audioContext = new (window.AudioContext || window.webkitAudioContext)({sampleRate: 48000});
if (!isAudioWorkletLoaded) {
await audioContext.audioWorklet.addModule(URL.createObjectURL(new Blob([voiceWorkletCode], {type: 'application/javascript'})));
senderNode = new AudioWorkletNode(audioContext, 'audio-sender');
receiverNode = new AudioWorkletNode(audioContext, 'audio-receiver');
- receiverNode.connect(audioContext.destination);
+ screenReceiverNode = new AudioWorkletNode(audioContext, 'audio-receiver');
isAudioWorkletLoaded = true;
}
if (audioContext.state === 'suspended') await audioContext.resume();
+ setupVoiceOutput();
micSourceNode = audioContext.createMediaStreamSource(micStream);
micSourceNode.connect(senderNode);
@@ -361,13 +667,14 @@ async function startVoiceSession(serverUrl) {
remoteAudio[audioId].lastUpdate = Date.now();
if (!audioDecryptChains[audioId]) audioDecryptChains[audioId] = new TaskQueue();
-
+
+ const targetReceiver = isScreenAudio ? screenReceiverNode : receiverNode;
audioDecryptChains[audioId].enqueue(async () => {
try {
const decryptedBuffer = await crypto.subtle.decrypt({name: "AES-GCM", iv}, voiceAesCryptoKey, ciphertext);
- if(receiverNode) receiverNode.port.postMessage({ clientId: audioId, audioData: decryptedBuffer }, [decryptedBuffer]);
-
- setTileSpeaking(clientId, true);
+ if(targetReceiver) targetReceiver.port.postMessage({ clientId: audioId, audioData: decryptedBuffer }, [decryptedBuffer]);
+
+ setTileSpeaking(clientId, true, isScreenAudio ? `${clientId}-2` : null);
} catch (err) {}
});
} else if (type === 1 || type === 2) {
@@ -443,7 +750,7 @@ async function startVoiceSession(serverUrl) {
if (remoteAudio[audioId]) {
if(audioDecryptChains[audioId]) audioDecryptChains[audioId].clear();
delete audioDecryptChains[audioId]; delete remoteAudio[audioId];
- if(receiverNode) receiverNode.port.postMessage({ action: 'remove', clientId: audioId });
+ if(screenReceiverNode) screenReceiverNode.port.postMessage({ action: 'remove', clientId: audioId });
}
} else {
const decoderId = `${clientId}-${stoppedTypeId}`;
@@ -499,7 +806,8 @@ function handleCallUpdate(data) {
if (audioDecoders[u]) try { audioDecoders[u].close(); } catch(e){}
delete audioDecoders[u];
delete remoteAudio[u];
- if(receiverNode) receiverNode.port.postMessage({ action: 'remove', clientId: u });
+ const rn = u.endsWith("_screen") ? screenReceiverNode : receiverNode;
+ if(rn) rn.port.postMessage({ action: 'remove', clientId: u });
}
}
@@ -727,6 +1035,9 @@ function showVoiceUI() {
+ ${(isMobileVoiceDevice() && getNativeVoiceRouting()) ? `` : ""}
@@ -770,11 +1081,34 @@ function showVoiceUI() {
header.addEventListener('pointerup', stopDrag);
header.addEventListener('pointercancel', stopDrag);
+ ensureVoiceFooterFits(voiceUiContainer);
+
ensureVoiceGridObserver();
setupVoiceWindowResize();
}
+// Raises the popup's min-width so the footer buttons always fit with the same
+// side padding the footer uses, regardless of how many buttons are rendered.
+function ensureVoiceFooterFits(popupEl) {
+ let footer = popupEl.querySelector("#voice-footer");
+ if (!footer) return;
+ const cs = getComputedStyle(footer);
+ let need = (parseFloat(cs.paddingLeft) || 0) + (parseFloat(cs.paddingRight) || 0);
+ const kids = Array.from(footer.children);
+ const gap = parseFloat(cs.columnGap) || parseFloat(cs.gap) || 0;
+ kids.forEach((kid, i) => {
+ if (i > 0) need += gap;
+ need += kid.offsetWidth;
+ });
+ const bcs = getComputedStyle(popupEl);
+ need += ((parseFloat(bcs.borderLeftWidth) || 0) + (parseFloat(bcs.borderRightWidth) || 0));
+ if (need > 0) {
+ popupEl.style.minWidth = Math.ceil(need) + "px";
+ clampVoiceWindowToViewport(popupEl);
+ }
+}
+
function setupVoiceWindowResize() {
const popup = voiceUiContainer;
if (!popup || popup.dataset.resizeInit) return;
@@ -1046,6 +1380,14 @@ function relayoutVoiceTiles() {
const cs = getComputedStyle(container);
const innerW = container.clientWidth - parseFloat(cs.paddingLeft) - parseFloat(cs.paddingRight);
const innerH = container.clientHeight - parseFloat(cs.paddingTop) - parseFloat(cs.paddingBottom);
+
+ if (!isFinite(innerW) || !isFinite(innerH) || !isFinite(rootFs) || innerW <= 0 || innerH <= 0 || rootFs <= 0) {
+ container.style.removeProperty("--voice-tile-w");
+ container.style.removeProperty("--voice-tile-h");
+ delete container.dataset.layoutSig;
+ return;
+ }
+
const minCol = 6.25 * rootFs;
const minRow = 7 * rootFs;
const gap = 0.75 * rootFs;
@@ -1128,8 +1470,9 @@ window.updateVoiceVol = function(clientId, val, type) {
if (el) el.innerText = val + '%';
const audioId = type === 'screen' ? `${clientId}_screen` : clientId;
const volumeMultiplier = parseInt(val) / 100.0;
- if (receiverNode) {
- receiverNode.port.postMessage({ action: 'setVolume', clientId: audioId, volume: volumeMultiplier });
+ const rn = type === 'screen' ? screenReceiverNode : receiverNode;
+ if (rn) {
+ rn.port.postMessage({ action: 'setVolume', clientId: audioId, volume: volumeMultiplier });
}
};
@@ -1149,6 +1492,16 @@ function toggleVoiceMic() {
function endVoiceSession() {
setVoiceStatus("disconnected");
+ const nativeRouting = getNativeVoiceRouting();
+ if (nativeRouting && nativeRouting.stopCall) {
+ try { nativeRouting.stopCall(); } catch (e) {}
+ }
+ isVoiceSpeakerMode = false;
+ voiceLoopRestarts = 0;
+ stopNativePlayback();
+ pcmBatch = null;
+ pcmBatchLen = 0;
+
if (currentVoiceCallId) {
let payload = JSON.stringify({ string1: currentVoiceCallType, string2: currentVoiceCallId });
if (window.fetchEncrypted) window.fetchEncrypted("room/voice/leave", payload).catch(()=>{});
@@ -1182,7 +1535,13 @@ function endVoiceSession() {
if (receiverNode) {
receiverNode.port.postMessage({ action: 'clear' });
+ try { receiverNode.disconnect(); } catch (e) {}
}
+ if (screenReceiverNode) {
+ screenReceiverNode.port.postMessage({ action: 'clear' });
+ try { screenReceiverNode.disconnect(); } catch (e) {}
+ }
+ teardownVoiceLoopback();
if (camControl) { camControl.stop(); camControl = null; }
if (screenControl) { screenControl.stop(); screenControl = null; }