Publish Vulpes Preview 15 sources for desktop, Android and Tundra

Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
This commit is contained in:
OverSu 2026-09-30 23:13:03 +02:00
commit b38dea0597
25901 changed files with 9982925 additions and 369 deletions

View file

@ -0,0 +1,126 @@
'use strict';
/* global MockVCFReader */
/* exported MockSdCard */
var MockSdCard = function MockSdCard() {
var observers = {};
var mock_sdcard_vcf = 'BEGIN:VCARD\n' +
'VERSION:2.1\n' +
'N:Gump;Forrest\n' +
'FN:Forrest Gump\n' +
'ORG:Bubba Gump Shrimp Co.\n' +
'TITLE:Shrimp Man\n' +
'PHOTO;GIF:http://www.example.com/dir_photos/my_photo.gif\n' +
'TEL;WORK;VOICE:(111) 555-1212\n' +
'TEL;HOME;VOICE:(404) 555-1212\n' +
'ADR;WORK:;;100 Waters Edge;Baytown;LA;30314;United States of America\n' +
'LABEL;WORK;ENCODING=QUOTED-PRINTABLE:100 Waters Edge=0D=0ABaytown, ' +
'LA 30314=0D=0AUnited States of America\n' +
'ADR;HOME:;;42 Plantation St.;Baytown;LA;30314;United States of America\n' +
'LABEL;HOME;ENCODING=QUOTED-PRINTABLE:42 Plantation St.=0D=0ABaytown, ' +
'LA 30314=0D=0AUnited States of America\n' +
'EMAIL;PREF;INTERNET:forrestgump@example.com\n' +
'REV:20080424T195243Z\n' +
'END:VCARD';
var failOnRetrieveFiles = false;
var STATUSES = {
NOT_INITIALIZED: 0,
NOT_AVAILABLE: 1,
AVAILABLE: 2,
SHARED: 3
};
var status = STATUSES.AVAILABLE;
var updateStorageState = function updateStorageState(state) {
switch (state) {
case 'available':
status = STATUSES.AVAILABLE;
break;
case 'shared':
status = STATUSES.SHARED;
break;
case 'unavailable':
case 'deleted':
status = STATUSES.NOT_AVAILABLE;
break;
}
};
var deviceStorage = null;
var subscribeToChanges = function subscribeToChanges(name, func, force) {
if (observers[name] !== undefined && !force) {
return false;
}
observers[name] = func;
return true;
};
var unsubscribeToChanges = function unsubscribeToChanges(name) {
if (observers[name]) {
delete observers[name];
return true;
} else {
return false;
}
};
return {
NOT_INITIALIZED: STATUSES.NOT_INITIALIZED,
NOT_AVAILABLE: STATUSES.NOT_AVAILABLE,
AVAILABLE: STATUSES.AVAILABLE,
SHARED: STATUSES.SHARED,
set failOnRetrieveFiles(value) {
failOnRetrieveFiles = value;
},
getStatus: function(cb) {
cb(status);
},
get status() {
return status;
},
set status(value) {
status = value;
// Trigger the status change to any observer
Object.keys(observers).forEach(function onStatus(name) {
if (typeof(observers[name]) === 'function') {
observers[name].call(null, value);
}
});
},
get deviceStorage() {
return deviceStorage;
},
set deviceStorage(storage) {
deviceStorage = storage;
},
'updateStorageState': updateStorageState,
'checkStorageCard': function checkStorageCard() {
return status === STATUSES.AVAILABLE;
},
'retrieveFiles': function retrieveFiles(mimes, ext, cb) {
cb(failOnRetrieveFiles, [
{
name: 'vcf1.vcf',
type: 'text/vcard'
}
]);
},
'getTextFromFile': function getTextFromFile(fileArray, cb) {
return cb(mock_sdcard_vcf).then(() => {
return Promise.resolve(MockVCFReader.prototype.numDuplicated);
});
},
'subscribeToChanges': subscribeToChanges,
'unsubscribeToChanges': unsubscribeToChanges
};
}();