archdroid-parallel-workers / workers /settings-worker.js
jonin925's picture
lets deploy parallel workers to speed up the development process. make the app fetch current settings, app data from android to display in the application drawer. the navigation gestures and other daily use settings like the ones in notification bar should comply with current android settings. help me build an apk ready pwa stack that can be tested on samsung s23 ultra
3a08226 verified
Raw
History Blame Contribute Delete
3.23 kB
// Settings Worker - Handles Android system settings in parallel
self.addEventListener('message', async (e) => {
const { action, settings } = e.data;
switch (action) {
case 'READ_ALL':
const allSettings = await readAllSettings();
self.postMessage({ type: 'SETTINGS_BULK', settings: allSettings });
break;
case 'READ':
const value = await readSetting(settings.key);
self.postMessage({ type: 'SETTING_VALUE', key: settings.key, value });
break;
case 'WRITE':
await writeSetting(settings.key, settings.value);
self.postMessage({ type: 'SETTING_SAVED', key: settings.key });
break;
case 'WATCH':
await watchSetting(settings.key);
break;
}
});
const ANDROID_SETTINGS = {
// Display
'display_brightness': 'system.SCREEN_BRIGHTNESS',
'display_auto_rotate': 'system.ACCELEROMETER_ROTATION',
'display_font_size': 'system.FONT_SCALE',
'display_screen_timeout': 'system.SCREEN_OFF_TIMEOUT',
'display_night_mode': 'secure.UI_NIGHT_MODE',
// Sound
'sound_volume_ring': 'system.VOLUME_RING',
'sound_volume_media': 'system.VOLUME_MUSIC',
'sound_volume_alarm': 'system.VOLUME_ALARM',
'sound_vibrate_mode': 'system.VIBRATE_WHEN_RINGING',
'sound_dnd': 'global.ZEN_MODE',
// Notifications
'notification_enabled': 'global.ENABLED_NOTIFICATION_LISTENERS',
'notification_badging': 'secure.NOTIFICATION_BADGING',
'notification_heads_up': 'global.HEADS_UP_NOTIFICATIONS_ENABLED',
// Connectivity
'wifi_enabled': 'global.WIFI_ON',
'mobile_data': 'global.MOBILE_DATA',
'airplane_mode': 'global.AIRPLANE_MODE_ON',
'bluetooth_enabled': 'global.BLUETOOTH_ON',
// Location
'location_mode': 'secure.LOCATION_MODE',
// Privacy
'camera_disabled': 'secure.CAMERA_DISABLED',
'microphone_disabled': 'secure.MICROPHONE_DISABLED',
};
async function readAllSettings() {
const results = {};
const batch = [];
// Read in parallel batches of 4
const entries = Object.entries(ANDROID_SETTINGS);
for (let i = 0; i < entries.length; i += 4) {
const batch = entries.slice(i, i + 4).map(([key, uri]) => readSetting(key));
await Promise.all(batch);
}
return results;
}
async function readSetting(key) {
// Try to access via Android interface or fallback
if (self.Android?.Settings?.get) {
return self.Android.Settings.get(ANDROID_SETTINGS[key]);
}
// Fallback for PWA testing
return localStorage.getItem(`arch_setting_${key}`) ?? getDefaultSetting(key);
}
async function writeSetting(key, value) {
if (self.Android?.Settings?.put) {
self.Android.Settings.put(ANDROID_SETTINGS[key], value);
}
localStorage.setItem(`arch_setting_${key}`, value);
}
function getDefaultSetting(key) {
const defaults = {
'display_brightness': 128,
'display_auto_rotate': 1,
'display_screen_timeout': 30000,
'sound_volume_media': 80,
'wifi_enabled': 1,
'location_mode': 3
};
return defaults[key] ?? null;
}
async function watchSetting(key) {
// Set up content observer simulation
setInterval(async () => {
const value = await readSetting(key);
self.postMessage({ type: 'SETTING_CHANGED', key, value });
}, 1000);
}