a implementer's story - integrating maavis with the gpii
DESCRIPTION
Steve Lee, from Open Directive, tells his experience on integrating Maavis with the GPII architecture.TRANSCRIPT
At the 16th International Conference on Human-Computer Interaction
2014 Crete, Greece
Implementers’ hackathon
A Implementer's Story
Steve LeeOpenDirective Ltd.
2
Maavis
• Simple access to media and communications• Research tech for people living with dementia• People with cognitive disabilities• People with low digital literacy
3
Demo
• Standalone• With GPII
4
What we did
• Understand architecture• Figure how to integrate• Install and test GPII• Create a few declarative docs• Create a new settings handler
Effort
A User Profile{ "display": { "screenEnhancement": { "applications": { "net.opendirective.maavis": { "name": "maavis", "priority": 100, "parameters": { "theme": "bw" } } } } }}
Solution life cycle (dev version)
• User Logs in (simulates listener)• Retrieve user settings– Set Maavis settings– Launch Maavis
• User logs out (simulates listener)– Restore Maavis settings– Exit Maavis
Solution{ "name": "maavis", "id": "net.opendirective.maavis", "contexts": { "OS": [ { "id": "win32", "version": ">=5.0" } ] }, "settingsHandlers": [ { "type": "gpii.settingsHandlers.noSettings", "capabilities": [ "display.screenEnhancement.applications.net\\.opendirective\\.maavis.name" ] } ] }}
+ Common Terms
10
Maavis Settings
{"userType":"touch","theme":“colour","speakTitles":"yes","speakLabels":"no","showLabels":"yes","showImages":"yes","useSkype":"no","scanMode":"AUTO1SWITCHAUTOSTART","scanRate":"2500","selectionsSetSize":"2x3","language": "en"}
Settings Handler gpii.settingsHandlers.JSONSettingsHandler.set = function(profile) {
var app = fluid.copy(profile); for (var appId in app) { for (var j = 0; j < app[appId].length; j++) {
// load the default settings used by MAAVIS var path = app[appId][j].options.path;
var defaultSettings = require(path);
// record differences between required and default settings// so that they default settings can be restoredvar requiredSettings = app[appId][j].settings;var changedSettings = fluid.copy(requiredSettings);for (var settingKey in requiredSettings) { var oldValue = defaultSettings[settingKey]; var newValue = requiredSettings[settingKey]; changedSettings[settingKey] = {
"oldValue": oldValue,"newValue": newValue
};}app[appId][j].settings = changedSettings;
// merge the required settings and default settings// this means required settings overwrite default settingsfluid.merge(null, defaultSettings, requiredSettings);
// Write the new settings to a file for MAAVIS to readfs.writeFileSync(path, JSON.stringify(defaultSettings));
} }
Lifecycle manager"lifecycleManager": { "start": [ "setSettings", { "type": "gpii.launch.exec", "command": "${{environment}.ComSpec} /c \"cd ${{environment}.MAAVIS_HOME} && MaavisPortable.cmd\"" } ], "stop": [ { "type": "gpii.launch.exec", "command": "${{environment}.SystemRoot}\\System32\\taskkill.exe /f /im firefox.exe" }, "restoreSettings" ]}
13
Common Terms mapping
In solution registry entry
• HighContrast -> "theme"• Speech -> "speakTitles“ + "speakLabels"
In summary
Easily done and low impact
• Modified Maavis installer so GPII can find it• Entry in the Solution Registry• New JSON Settings handler• Configure Lifecycle Manager• Test Profiles
15
Challenges
• Early adopter – high churn– A: Engage with the architecture team!
• Lack of documentation– A: Get architecture team to do the work for you!
16
Contribution
• Reduce your maintenance costs• Best way to learn• Open Source skills• Fun
Further Developments
• Dynamic reading of settings– eg for context awareness
• Prosperity4All + low digital literacy– Framework and Components
• Porting to HTML components– Move to browser context
18
Thank You
This research was funded by the European Union's Seventh Framework Programme (FP7/2007-2013) grant agreement 289016 (Cloud4all)