Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 745b4a07c0 | |||
| 23ca815cb2 | |||
| cc3fac8142 | |||
| cd89e36ec2 |
@@ -79,8 +79,8 @@ android {
|
|||||||
applicationId "com.ariacockpit"
|
applicationId "com.ariacockpit"
|
||||||
minSdkVersion rootProject.ext.minSdkVersion
|
minSdkVersion rootProject.ext.minSdkVersion
|
||||||
targetSdkVersion rootProject.ext.targetSdkVersion
|
targetSdkVersion rootProject.ext.targetSdkVersion
|
||||||
versionCode 600
|
versionCode 602
|
||||||
versionName "0.0.6.0"
|
versionName "0.0.6.2"
|
||||||
// Fallback fuer Libraries mit Product Flavors
|
// Fallback fuer Libraries mit Product Flavors
|
||||||
missingDimensionStrategy 'react-native-camera', 'general'
|
missingDimensionStrategy 'react-native-camera', 'general'
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "aria-cockpit",
|
"name": "aria-cockpit",
|
||||||
"version": "0.0.6.0",
|
"version": "0.0.6.2",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"android": "react-native run-android",
|
"android": "react-native run-android",
|
||||||
|
|||||||
@@ -459,7 +459,13 @@ class AudioService {
|
|||||||
|
|
||||||
/** Einen PCM-Chunk aus einer audio_pcm Nachricht empfangen.
|
/** Einen PCM-Chunk aus einer audio_pcm Nachricht empfangen.
|
||||||
* silent=true → nur cachen, nicht abspielen (z.B. wenn TTS geraetelokal gemutet).
|
* silent=true → nur cachen, nicht abspielen (z.B. wenn TTS geraetelokal gemutet).
|
||||||
* Gibt bei final=true den Cache-Pfad zurueck (file://) oder '' wenn nicht gecached. */
|
* Gibt bei final=true den Cache-Pfad zurueck (file://) oder '' wenn nicht gecached.
|
||||||
|
*
|
||||||
|
* Wrapper serialisiert aufeinanderfolgende Chunk-Calls via Promise-Queue —
|
||||||
|
* sonst gabs bei kurzen Streams einen Race: final-Chunk konnte `end()` rufen
|
||||||
|
* BEVOR der vorherige `start()` im Native-Modul fertig war. Der Writer-
|
||||||
|
* Thread sah dann endRequested=true ohne jemals Chunks zu verarbeiten. */
|
||||||
|
private _pcmChunkQueue: Promise<any> = Promise.resolve();
|
||||||
async handlePcmChunk(payload: {
|
async handlePcmChunk(payload: {
|
||||||
base64: string;
|
base64: string;
|
||||||
sampleRate?: number;
|
sampleRate?: number;
|
||||||
@@ -468,6 +474,24 @@ class AudioService {
|
|||||||
chunk?: number;
|
chunk?: number;
|
||||||
final?: boolean;
|
final?: boolean;
|
||||||
silent?: boolean;
|
silent?: boolean;
|
||||||
|
}): Promise<string> {
|
||||||
|
const p = this._pcmChunkQueue.then(() => this._handlePcmChunkImpl(payload)).catch(err => {
|
||||||
|
console.warn('[Audio] handlePcmChunk queued err:', err);
|
||||||
|
return '';
|
||||||
|
});
|
||||||
|
// Chain only on the side effect — callers still get the per-call result
|
||||||
|
this._pcmChunkQueue = p;
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async _handlePcmChunkImpl(payload: {
|
||||||
|
base64: string;
|
||||||
|
sampleRate?: number;
|
||||||
|
channels?: number;
|
||||||
|
messageId?: string;
|
||||||
|
chunk?: number;
|
||||||
|
final?: boolean;
|
||||||
|
silent?: boolean;
|
||||||
}): Promise<string> {
|
}): Promise<string> {
|
||||||
const silent = !!payload.silent;
|
const silent = !!payload.silent;
|
||||||
if (!silent && !PcmStreamPlayer) {
|
if (!silent && !PcmStreamPlayer) {
|
||||||
|
|||||||
@@ -29,6 +29,11 @@ class UpdateService {
|
|||||||
private downloading = false;
|
private downloading = false;
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
|
// Beim Start alte APK-Reste aus dem Cache wegraeumen — wenn diese App
|
||||||
|
// laeuft, sind frueher heruntergeladene APKs entweder schon installiert
|
||||||
|
// oder unvollstaendig gewesen. Spart sonst pro Update 20-30MB auf dem Handy.
|
||||||
|
this.cleanupOldApks().catch(() => {});
|
||||||
|
|
||||||
// Auf update_available Nachrichten lauschen
|
// Auf update_available Nachrichten lauschen
|
||||||
rvs.onMessage((msg: RVSMessage) => {
|
rvs.onMessage((msg: RVSMessage) => {
|
||||||
if (msg.type === 'update_available' as any) {
|
if (msg.type === 'update_available' as any) {
|
||||||
@@ -45,6 +50,30 @@ class UpdateService {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Raeumt alte heruntergeladene APK-Dateien aus dem Cache auf. */
|
||||||
|
private async cleanupOldApks(): Promise<void> {
|
||||||
|
try {
|
||||||
|
const files = await RNFS.readDir(RNFS.CachesDirectoryPath);
|
||||||
|
const apks = files.filter(f => /\.apk$/i.test(f.name));
|
||||||
|
let freed = 0;
|
||||||
|
for (const f of apks) {
|
||||||
|
try {
|
||||||
|
const size = parseInt(f.size as any, 10) || 0;
|
||||||
|
await RNFS.unlink(f.path);
|
||||||
|
freed += size;
|
||||||
|
console.log(`[Update] Alte APK geloescht: ${f.name} (${(size / 1024 / 1024).toFixed(1)}MB)`);
|
||||||
|
} catch (err: any) {
|
||||||
|
console.warn(`[Update] APK-Loeschen fehlgeschlagen: ${f.name} (${err?.message || err})`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (apks.length > 0) {
|
||||||
|
console.log(`[Update] Cleanup fertig: ${apks.length} APKs entfernt, ${(freed / 1024 / 1024).toFixed(1)}MB freigegeben`);
|
||||||
|
}
|
||||||
|
} catch (err: any) {
|
||||||
|
console.warn(`[Update] Cleanup-Fehler: ${err?.message || err}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/** Bei App-Start Update pruefen */
|
/** Bei App-Start Update pruefen */
|
||||||
checkForUpdate(): void {
|
checkForUpdate(): void {
|
||||||
if (this.checking) return;
|
if (this.checking) return;
|
||||||
@@ -111,6 +140,10 @@ class UpdateService {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Vor dem Schreiben alte APKs im Cache wegraeumen — falls mehrere
|
||||||
|
// Updates in einer Session gezogen werden
|
||||||
|
await this.cleanupOldApks();
|
||||||
|
|
||||||
// Base64 als APK-Datei speichern
|
// Base64 als APK-Datei speichern
|
||||||
const destPath = `${RNFS.CachesDirectoryPath}/${apkData.fileName}`;
|
const destPath = `${RNFS.CachesDirectoryPath}/${apkData.fileName}`;
|
||||||
await RNFS.writeFile(destPath, apkData.base64, 'base64');
|
await RNFS.writeFile(destPath, apkData.base64, 'base64');
|
||||||
|
|||||||
Reference in New Issue
Block a user