Tuesday, January 27, 2009

CheckBoxLists and Branching

The ability to dynamically select follow-up questions based on the user's current responses and/or sensor states is a powerful feature in MyExperience. For example, with MyExperience you might ask, "On a scale of a 1-10, how exhausted are you feeling right now (1=Not Exhausted, 10=Very Exhausted)." You could then dynamically branch to a set of questions if the participant indicates that they are exhausted (e.g., a response greater than or equal to 7).

MyExperience offers many different ways of specifying question branches from within response options to short scripts. These different methods are covered here. A common question, however, is with regards to how MyExperience and CheckBoxList branching works. CheckBoxLists allow the participant to select more than one answer, each with their own specific branch in the survey.

The CheckBoxWorkOut example (available here, see Example 1) demonstrates the power of branching with CheckBoxLists and using parameterized question text. Observe how MyExperience's branching functionality loops over each of the response options in the CheckBoxList and then finally pursues the main trunk of the survey after all branches have been exhausted. This example also highlights the usage of the special options: "All of the above" and "None of the above." Note that you must have version 0.8.2 or later to run this example.

Friday, January 16, 2009

MyExperience Version 0.8.3 Released

You can download version 0.8.2 of MyExperience here, which includes a much requested feature to be able to change font sizes of response options. See screenshot below. For more on this, see http://myexperience.wikispaces.com/Questions. Also, special thanks to Jennifer Beaudin and the MIT House_N team for contributing so much to this release.

Other changes:
- Added Volume property to NotificationAction and PlayerAction. Gets or sets playback volume on the current wave device. 100 is full volume, 0 is silent. Set to -1 to use default volume.
- Renamed SetProperty, GetProperty and ContainsProperty to SetGlobalProperty, GetGlobalProperty, and ContainsGlobalProperty
- Added ability to specify properties for response options. See MyExperience_CustomizeQuestionLookAndFeel.xml in SampleXmlFiles
- Made a few changes to make text and countdown # more visible and readable in TimeOutForm, particularly on landscape screens, such as the HTC Dash. TimeOutUseLargeFont specified that larger text should be used to print the warning message on the TimeOut form. TitleBarText and ShowsCountInTitleBar allow customization of the text show in the title bar on survey panels.
- Added SuspendPreventer to address power management issue in PocketPC devices. Periodically uses P/Invokes methods to prevent PocketPC devices from going into suspend mode. Called from MainForm
- Add class to read values from device registry; used by KeyboardLockSensor
- Added new sensor to query the registry to monitor changes to keyboard lock status. On some devices, when a device is keyboard locked, only the device home screen is visible - even though the sound and vibration will play, MyExperience will not be in foreground and even if the user unlocks the keyboard during the notification, MyExperience will remain in the background. Uses the KeyboardLockSensor to detect a state change (user unlocks device), so that MyExperience can be put in the foreground and the notification can be restarted.
- In the NotificationForm, if Snooze is not enabled, simplify buttons to be "OK" and "Skip"; if neither Snooze or Dismiss are enabled, simplify buttons to be "OK" only (rather than disabling the Menu options)
- Added static method (Application_BringToForeground) to help force MyExperience to foreground (used in NotificationAction when keyboard unlocking event detected)
- Add property (LeftButtonText) to change text of left-button on NotificationForm (by default is "OK," but an example of a reasonable alternative might be be "Start")
- NotificationAction calls MyExperienceFramework Application_BringToFront method to ensure application comes to front in keyboard recently unlocked situations
- Added actions to hide and show the MyExperience Main form. Useful for: 1) hiding MyExperience after it is initialized on start-up (although we may want to look into hiding MyExperience completely on start-up at some point, so that even the initialization doesn't show up); 2) showing MyExperience just prior to a NotificationAction, so that the desktop is not visible between selecting OK and viewing the first survey panel. The 2nd purpose inspired the development of these Actions, as one user found the typical transition jarring.
- Added action (SelectNextQuestionAction) to determine next question to present (using Goto in the MyExperience protocol) based on a probability that any given question in a list of questions is presented. Replaces massive if-then statements from within MyExperience protocol script.
- Added method to Executable base: IsKeyboardLocked() checks the device registry to determine whether the keyboard is locked; returns true if locked, false if unlocked
- Added two properties that may be useful if using SetWallpaperAction to present images to the user that convey information, such as the status of MyExperience. Default values preserve original SetWallpaperAction procedures. UsesSimpleCopy uses File.Copy to copy the image to the wallpaper folder, bypassing resizing, transparency, and reformatting with JPEG compression. This is useful when an image includes text and can be tailored to the device screen dimensions ahead of time. ForcesRefresh is true by default. When set to false, skips step of switching to desktop and back to force the wallpaper to change. Useful if changing wallpaper when about to hide MyExperience (otherwise, jarring to switch back and forth, when going to the desktop anyway).
- Added MonitorKeyboardLock property to NotificationAction to allow protocol to specify whether to monitor the registry for change in locking status; by default, is false. I have some question about whether the registry checking may sometimes cause a phone to freeze. I haven't seen it in any of my devices, but I have received a few reports of MyExperience freezing on phones running this code. In case the registry is the cause, I have changed the feature to be optional (done only if the property is set to true in the protocol).
- Added new XML example (MyExperience_HaveUserSetRAndomStartEndTimes.XML) that demonstrates how to setup custom sensor settings based on user response
- Added properties to the MessageAction and the SurveyAction to allow a few customization options, particularly for running MyExperience with user-initiated surveys. Re-introduced AlwaysOnTop property for the SurveyAction, using the OnDeactivate method of the SurveyForm. If true (false by default), the SurveyForm will re-activate and stay on top, even if the user presses the home key or end-call key. Note that this setting may be problematic if widgets (such as the Camera/Video widget) need to be shown over the SurveyForm. Added a ShowTwoOptions property to the MessageAction to allow for left and right softkey options on that form. Also added an AlwaysOnTop property, which may be especially useful when the MessageAction is employed as an always-up form where the user can initiate survey entry. Both of these properties are false by default.