Release Preview 20 shared desktop, Android and Sargo updates
Restore Gaia settings and media workflows, extend native network adapters, and align the APK payload. Generate French/English changelogs and website entries from the simplified JSON source. Validation: shared JS and Tundra unit tests; desktop workflows and persistence; signed APK payload parity; Sargo RAM and installed startup with boot readback. Android runtime qualification is recorded separately.
This commit is contained in:
parent
be2cdce823
commit
1311bed5e9
170 changed files with 19698 additions and 2495 deletions
|
|
@ -1,6 +1,7 @@
|
|||
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<uses-permission android:name="android.permission.INTERNET" />
|
||||
<uses-permission android:name="android.permission.CAMERA" />
|
||||
<uses-permission android:name="android.permission.RECORD_AUDIO" />
|
||||
<uses-feature android:name="android.hardware.camera.any" android:required="false" />
|
||||
<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
|
||||
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
|
||||
|
|
|
|||
|
|
@ -102,6 +102,18 @@ final class AndroidServices {
|
|||
);
|
||||
result.complete(null);
|
||||
break;
|
||||
case "android.storage":
|
||||
io.execute(() -> {
|
||||
try {
|
||||
File data = new File(app.getApplicationInfo().dataDir);
|
||||
File mediaRoot = new File(app.getFilesDir(), "media");
|
||||
JSONObject stats = new JSONObject().put("free", data.getUsableSpace())
|
||||
.put("apps", storageBytes(data, mediaRoot)).put("sdcard", storageBytes(mediaRoot, null))
|
||||
.put("scope", "vulpes-profile");
|
||||
main.post(() -> result.complete(stats));
|
||||
} catch (Exception e) { fail(result, e); }
|
||||
});
|
||||
break;
|
||||
case "android.media":
|
||||
JSONObject params = p;
|
||||
io.execute(() -> {
|
||||
|
|
@ -122,6 +134,15 @@ final class AndroidServices {
|
|||
return result;
|
||||
}
|
||||
|
||||
private static long storageBytes(File file, File skip) throws IOException {
|
||||
if (file.equals(skip) || !file.exists() || !file.getCanonicalFile().equals(file.getAbsoluteFile())) return 0;
|
||||
if (file.isFile()) return file.length();
|
||||
long size = 0;
|
||||
File[] children = file.listFiles();
|
||||
if (children != null) for (File child : children) size += storageBytes(child, skip);
|
||||
return size;
|
||||
}
|
||||
|
||||
private void fail(GeckoResult<Object> result, Exception e) {
|
||||
main.post(() -> {
|
||||
try {
|
||||
|
|
|
|||
|
|
@ -550,12 +550,17 @@ public final class MainActivity extends Activity {
|
|||
"http".equals(origin.getScheme()) &&
|
||||
"camera.localhost".equals(origin.getHost()) &&
|
||||
origin.getPort() == 18765;
|
||||
if (!camera || (audio != null && audio.length > 0) || video == null || video.length == 0) {
|
||||
boolean hasVideo = video != null && video.length > 0;
|
||||
boolean hasAudio = audio != null && audio.length > 0;
|
||||
if (!camera || (!hasVideo && !hasAudio)) {
|
||||
callback.reject();
|
||||
return;
|
||||
}
|
||||
permission(new String[] { android.Manifest.permission.CAMERA }, granted -> {
|
||||
if (granted) callback.grant(video[0], null);
|
||||
java.util.ArrayList<String> requested = new java.util.ArrayList<>();
|
||||
if (hasVideo) requested.add(android.Manifest.permission.CAMERA);
|
||||
if (hasAudio) requested.add(android.Manifest.permission.RECORD_AUDIO);
|
||||
permission(requested.toArray(new String[0]), granted -> {
|
||||
if (granted) callback.grant(hasVideo ? video[0] : null, hasAudio ? audio[0] : null);
|
||||
else callback.reject();
|
||||
});
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue