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; }