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,197 @@
/* exported ActivityHandler */
/**
* ActivityHandler handles activity requests and parse the information from the
* request including section name and filter.
*
* @module js/activity_handler
*/
(function(exports) {
'use strict';
var ActivityHandler = {
/**
* A promise indicating whether the module has received the activity
* request.
*
* @access private
* @memberOf ActivityHandler
* @type {Promise}
*/
_readyPromise: null,
/**
* The target panel id retrieved from the activity request.
*
* @access private
* @memberOf ActivityHandler
* @type {String}
*/
_targetPanelId: null,
/**
* Possible target panel options retrieved from the activity request.
*
* @access private
* @memberOf ActivityHandler
* @type {Object}
*/
_targetPanelOptions: null,
/**
* The activity object received from the message handler.
*
* @access private
* @memberOf ActivityHandler
* @type {Object}
*/
_currentActivity: null,
/**
* An object that defines functions for handling different type of
* activities. The handling function must return the target panel id for
* handling the activity.
*
* @access private
* @memberOf ActivityHandler
* @type {Object}
*/
_handlers: {
'configure': function ah_configureHandler(activitySource) {
var targetPanelId = activitySource.data.section || 'root';
var targetPanel = document.getElementById(targetPanelId);
// Validate if the section exists
if (!targetPanel || targetPanel.tagName !== 'SECTION') {
var msg =
'Trying to open an non-existent section: ' + targetPanelId;
console.warn(msg);
// fallback to root panel
targetPanelId = 'root';
targetPanel = document.getElementById(targetPanelId);
}
switch(targetPanelId) {
case 'root':
// Apply the filter
document.body.dataset.filterBy =
activitySource.data.filterBy || 'all';
break;
default:
// Mark the desired panel as a dialog
targetPanel.dataset.dialog = true;
break;
}
return {
targetPanelId: targetPanelId,
options: activitySource.data.options
};
}
},
/**
* It calls to corresponding handlers based on the activity name. It should
* also set the target panel id and, optionally, target panel options.
*
* @access private
* @memberOf ActivityHandler
* @param {Object} activitySource
* The source object in an activity.
*/
_handleActivity: function ah_handler(activitySource) {
var handle = this._handlers[activitySource.name];
if (handle) {
var {targetPanelId, options} = handle(activitySource);
this._targetPanelId = targetPanelId;
this._targetPanelOptions = options;
}
},
/**
* It registers a handler for visibility changes so that the activity can
* be completed when users press on the home button.
*
* @access private
* @memberOf ActivityHandler
*/
_registerListener: function ah_registerListener() {
// Post result when pressing home button
document.addEventListener('visibilitychange', function change() {
if (document.hidden) {
document.removeEventListener('visibilitychange', change);
// An activity can be closed either by pressing the 'X' button
// or by a visibility change (i.e. home button or app switch).
// Send a result to finish this activity
if (this._currentActivity) {
this._currentActivity.postResult(null);
}
}
}.bind(this));
},
/**
* It returns the id of the target panel that can handle the activity.
*
* @access public
* @memberOf ActivityHandler
* @returns {String}
*/
get targetPanelId() {
return this._targetPanelId;
},
/**
* Returns possible target panel options needed to handle the activity.
*
* @access public
* @memberOf ActivityHandler
* @returns {Object}
*/
get targetPanelOptions() {
return this._targetPanelOptions;
},
/**
* It waits for the system message of an activity and initializes all
* properties by parsing the information in an activity.
*
* @access public
* @memberOf ActivityHandler
* @returns {Promise}
*/
ready: function ah_ready() {
if (!this._readyPromise) {
this._readyPromise = new Promise((resolve) => {
navigator.mozSetMessageHandler('activity', (activity) => {
this._currentActivity = activity;
this._handleActivity(this._currentActivity.source);
this._registerListener();
resolve();
});
});
}
return this._readyPromise;
},
/**
* It sends the result back to the caller of the activity and finishes the
* activity.
*
* @access public
* @memberOf ActivityHandler
* @param {Object} result
* The result to be sent back to the caller.
* @returns {Promise}
*/
postResult: function ah_postResult(result) {
return this.ready().then(() => {
if (this._currentActivity) {
this._currentActivity.postResult(result);
}
});
}
};
exports.ActivityHandler = ActivityHandler;
})(window);