This chapter includes the following sections:
Preferences enable you to add settings that can be configured by end users. Within both the maf-application.xml
and maf-feature.xml
files, the user preference pages are defined with the <adfmf:preferences>
element. You also use the <adfmf:preferences> element to create the preferences that users manage within each application feature.
As shown in the following example, the child element of <adfmf:preferences>
called <adfmf:preferenceGroup>
and its child elements define the user preferences by creating pages that present options in various forms, such as text strings, drop-down menus, or in this case, as a child page that can present the user with additional options for application settings.
<?xml version="1.0" encoding="UTF-8" ?> <adfmf:application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:adfmf="http://xmlns.oracle.com/adf/mf" name="MobileApplication" id="com.company.MobileApplication" appControllerFolder="ApplicationController" version="1" vendor="oracle" listener-class="application.LifeCycleListenerImpl"> <adfmf:description>This app created by Mobile Application Framework</adfmf:description> <adfmf:featureReference id="PROD"/> <adfmf:featureReference id="HCM"/> <adfmf:featureReference id="Customers"/> <adfmf:preferences> <adfmf:preferenceGroup id="a" label="Prefs Group A"> <adfmf:preferenceBoolean id="a1_sound" label="Sound Effects"/> <adfmf:preferenceNumber id="a2_retries" label="Retries" default="3"/> <adfmf:preferenceList id="a3_background" label="Background" default="3"> <adfmf:preferenceValue name="None" value="0" id="pv4"/> <adfmf:preferenceValue name="Field" value="1" id="pv1"/> <adfmf:preferenceValue name="Galaxy" value="2" id="pv5"/> <adfmf:preferenceValue name="Mountain" value="3" id="pv6"/> </adfmf:preferenceList> <adfmf:preferenceText id="a4_name" label="Default Name"/> <adfmf:preferencePage id="aa" label="Prefs SubGroup AA"> <adfmf:preferenceGroup id="aa_sec" label="Security"> <adfmf:preferenceBoolean id="aa_sec_useSec" label="Use Security"/> <adfmf:preferenceNumber id="aa_sec_timeout" label="Timeout (secs)" default="120"/> </adfmf:preferenceGroup> </adfmf:preferencePage> </adfmf:preferenceGroup> <adfmf:preferenceGroup id="b" label="Prefs Group B"> <adfmf:preferenceBoolean id="b_cloudSync" label="Cloud Sync"/> <adfmf:preferenceList id="b_dispUsage" label="Display Usage As" default="1"> <adfmf:preferenceValue name="Percent" value="1" id="pv2"/> <adfmf:preferenceValue name="Minutes" value="2" id="pv3"/> </adfmf:preferenceList> </adfmf:preferenceGroup> </adfmf:preferences> </adfmf:application>
Figure 23-1 shows an example of how opening a child user preference page can offer subsequent options.
Figure 23-1 User Preferences Pages
Preference pages are defined within the <adfmf:preferenceGroup>
element and have the following child elements:
<adfmf:preferencePage>
—Specifies a new page in the user interface.
<adfmf:preferenceList>
—Provides users with a specific set of options.
<adfmf:preferenceValue>
—A child element that defines a list element.
<adfmf:preferenceBoolean>
—A boolean setting.
<adfmf:preferenceText>
—A text preference setting.
See Tag Reference for Oracle Mobile Application Framework for more information on these elements and their attributes.
For an example of creating preference pages at both the application and application-feature levels, refer to the PrefDemo sample application. This sample application is located in the PublicSamples.zip
file at the following location within the JDeveloper installation directory of your development computer:
jdev_install/jdeveloper/jdev/extensions/oracle.maf/Samples
The PrefDemo application is comprised of an application-level settings page as well as three application feature preference pages, which are implemented as MAF AMX. Figure 23-2 shows the PrefDemo application settings page, which you invoke from the general settings page. In this illustration, the preference settings page is invoked from the iOS Settings application.
Figure 23-2 The PrefDemo Application Settings Page
The application feature preference pages, illustrated by App, Feature1 (which is selected), and Feature 2 in Figure 23-3, provide examples of preferences pages constructed from the MAF AMX Boolean Switch, Input Text, and Output Text components that use EL (Expression Language) to access the application feature and the various <adfmf:preferences>
components configured within it. For more information, see Using EL Expressions to Retrieve Stored Values for User Preference Pages.
Figure 23-3 An Application Feature Preference Page from the PrefDemo Application
In the PrefDemo application, each MAF AMX preference page is referenced by a single bounded task flow comprised of a view activity and a control flow case that enables the page refresh.
The Preferences page of the maf-application.xml
overview editor, shown in Figure 23-4, enables you to build sets of application-level preference pages by nesting the child preference page elements within <adfmf:preferenceGroup>
. The page presents the <adfmf:preferenceGroup>
and its child elements as similarly named options (such as Preference Page, Preference List, Boolean Preference), which you assemble into a hierarchy (or tree), similar to the Structure window in JDeveloper.
Figure 23-4 Adding Mobile Application-Level Preferences Using the Preferences Page
To ensure that the maf-application.xml
file is well-formed, use the Preferences page's Add drop-down list, shown in Figure 23-4, to construct the user preferences pages. While you can also drag components from the Preferences palette, shown in Figure 23-5, into either the editor, the Source window, or the Structure window, the page's drop-down list presents only the elements that can have the appropriate parent, child, or sibling relationship to a selected preferences element. For example, Figure 23-4 shows only the components that can be inserted within the Preference Group element, MobileApp. The editor also enables you to enter the values for the attributes specific to each preference element.
Figure 23-5 Preferences in the Component Palette
To create preferences pages:
The Preference Page component enables you to create a new user interface page. You create a Preference Page using the Insert Before, Insert Inside, Insert After options.
Before you begin:
You must create a Preference Group element.
To create a new user preference page:
After you define the Preference Page and its child Preference Group components in the overview editor, JDeveloper generates an <adfmf:preferencePage>
with attributes, as shown in the following example. The <adfmf:preferencePage>
is nested within a parent <adfmf:preferenceGroup>
element.
<adfmf:preferences> <adfmf:preferenceGroup id="gen" label="MobileApp"> <adfmf:preferencePage id="application_version" label="Version"> <adfmf:preferenceGroup id="version_select" label="Select Your Version"> <adfmf:preferenceList id="edition" label="Edition" default="PERSONAL"> adfmf:preferenceValue name="Enterprise" id="pv2"/> <adfmf:preferenceValue name="Personal" value="PERSONAL" id="pv1"/> </adfmf:preferenceList> </adfmf:preferenceGroup> </adfmf:preferencePage> </adfmf:preferences>
Add a Preference List component to create a list of options.
Before you begin:
You must create Preference Group as the parent to the Preference List or any other list-related component.
To create a user preference list:
After you add a Preference List component to a Preference Group and then define a series of Preference Values, JDeveloper updates the <adfmf:preferences>
section with an <adfmf:preferenceList>
element, as shown in What Happens When You Add a Preference Page.
See, for example, Creating User Preference Pages for a Mobile Application.
Before you begin:
Because an <adfmf:preferenceBoolean>
element must be nested within an <adfmf:preferenceGroup>
element, you must first insert a Preference Group component to the hierarchy.
To create a user boolean list:
When you add a Boolean Preference and designate its default value, JDeveloper updates the <adfmf:preferences>
section of the maf-application.xml
file with a <adfmf:preferenceBoolean>
element, as illustrated in the following example.
<adfmf:preferencePage id="gps_tracking" label="Your_GPS_Locations"> <adfmf:preferenceGroup id="gps" label="GPS Settings"> <adfmf:preferenceBoolean id="track_gps" label="Automatically Track Location" default="true"/> </adfmf:preferencePage>
Use the insert options, shown in Figure 23-15, to create a Text Preference, a dialog that enables users to store information or view default text. Figure 23-15 shows creating a text preference within a Preference Group called Security.
Figure 23-15 Inserting a Text Preference
Before you begin:
Create a Preference Group element.
To create a text preference:
Figure 23-17 Defining the Text Preference
When you add a Text Preference and designate its default value, JDeveloper updates the <adfmf:preferences>
section of the maf-application.xml
file with a <adfmf:preferenceText>
element, as illustrated in the following example.
<adfmf:preferenceGroup id="security" label="Security"> <adfmf:preferenceText id="serviceURL" label="Security URL" default="http://security.example.com/provider"/> <adfmf:preferenceText id="username" label="User Name"/> <adfmf:preferenceText id="password" label="Password" secret="true"/> </adfmf:preferenceGroup>
The Preference Group elements that define a security URL, user name, and password preference setting display similarly to Figure 23-18.
Figure 23-18 Text Preferences
Figure 23-18 illustrates <adfmf:preferenceText>
elements with a seeded value for the Security URL and an input value for the User Name. Because the MAF preferences are integrated with the iOS Settings application, the secret="true"
attribute for the Password input text results in the application following the iOS convention of obscuring the user input with bullet points. For more information, see the description for the isSecure
text field element in Settings Application Schema Reference, available from the iOS Developer Library (http://developer.apple.com/library/ios/navigation/
) and Platform-Dependent Display Differences.
After you deploy the mobile application, the application-wide preference settings page is propagated to the device's global settings application, such as the Settings application on iOS-powered devices. For more information, see Converting Preferences for Deployment.
As described in Reusing MAF Application Content , you can distribute an application feature independently of its mobile application by adding a Feature Application Archive (FAR) .jar
file containing the application feature to the library of another mobile application. You then reference the application feature in the application's maf-application.xml
file. If an application feature requires a specific set of user preferences in addition to the general preferences defined for the consuming application, you can define them using the Preferences tab of the maf-feature.xml
overview editor, shown in Figure 23-19. You build application feature preferences in the same manner as the application-level preferences, which are described in Creating User Preference Pages for a Mobile Application. After you define the preferences in the maf-feature.xml
file, you then create the actual preference page by creating an application feature that references a MAF AMX page that is embedded with the Boolean Switch, Input, and Output components described in Creating and Using UI Components.
Figure 23-19 Setting Application Feature-Level Preferences
When creating an application feature-level preference page, you add EL expressions to the MAF AMX components, such as the Input Text component in the following example.
<amx:inputText label="Number" id="it1" inputType="number" value="#{preferenceScope.feature.Feature1.f1top.f1Number}"/>
As illustrated in this example, EL expressions use the preferenceScope
object to enable applications to access an application feature-level preference. These EL expressions are in the following format:
preferenceScope.feature.feature-id.group-id.property-id
Figure 23-20 illustrates using the Expression Builder to create the EL expression. The preference itself is designated by the IDs configured for various components in maf-feature.xml
, such as the ID of the application feature <adfmf:feature id="Feature1">
), the ID of a Preference Group (<adfmf:preferenceGroup id="f1top">
), and the ID of a preference property (<adfmf:preferenceNumber id="f1Number">
).
The EL expression may include zero or more group-id
and property-id
elements.
Figure 23-20 Building an EL Expression for a Preference
An EL expression has the following resolution pattern:
From the JavaScript layer, EL value expressions are resolved using the following JavaScript function:
adf.mf.el.getValue(expression, success, failed)
The resolution of adf.mf.el.getValue
begins with an attempt to resolve the expression locally using the JS-EL parser and JavaScript Context Cache. If the expression cannot be resolved locally, the expression is passed to the embedded Java layer for evaluation where it is resolved by the Java EL parser. This is done through the GenericInvokeRequest
to the Model's getValue
method.
At the Java layer, an EL value expression is resolved using the following approach:
String val = AdfmfJavaUtilities.evaluateELExpression("#{preferenceScope.feature.f0.vendor}");
For a setValue
method, the expression is resolved as follows:
ValueExpression ve = AdfmfJavaUtilities.getValueExpression("#{preferenceScope.feature.f0.vendor}"); ve.setValue(AdfmfJavaUtilities.getADFELContext(), value);
Evaluation of the EL expression involves looking up the preferenceScope
object. The evaluation is from left to right, where each token is resolved independently. After a token is resolved, it is used to resolve the next token (which is on its right).
Preferences cannot be exposed without the preferenceScope
object. For more information about the preferenceScope
object, see About the Mobile Application Framework Objects Category.
MAF integrates APIs provided for a native UI (such as UIView
or UIViewController
) to allow certain configurations on iOS platform.
When the native UI is initialized, an instance of the ADFSession
object becomes available. You can use its getPreferences
method to instruct MAF to provide a listing of the available preferences for the application as defined in the maf-application.xml
file. As shown in the following example, this method returns a NSArray*
of preference property objects that can include the id
, value
, and label
for the preference. This API call ensures that either the end user provided the value for a particular preference, or that the default value of the preference is returned.
//... -(id) initWithADFSession:(id<ADFSession>) providedSession { id me = [self init]; session = providedSession; //... // Dump the preferences to the data display NSArray* prefsArray = [session getPreferences]; NSString* prefs = [prefsArray JSONRepresentation]; self.theData.text = [[NSString alloc ] initWithFormat: :@"%@\nUser Preferences = --> %@ <--", self.theData.text, prefs]; //... return me; }
The MAF preference pages maintain the native look-and-feel for both the iOS and Android platforms. Consequently, the MAF preference pages display differently on the two platforms. As shown in Table 23-1, preferences display inline on the iOS platform, meaning that the system does not invoke dialog pages. With a few exceptions, the Android platform presents these components as dialogs.
Table 23-1 Preference Component Comparison by Platform
Component | iOS | iOS Display Examples | Android | Android Display Examples |
---|---|---|---|---|
Preference Groups (Category Selection) |
The iOS platform displays the preference elements within their parent preference group. |
The Android platform displays the preference elements within their parent preference group. |
||
Boolean Preference List |
The Boolean preference is represented as value pair, such as on and off. |
Android presents the Boolean preference as a checkbox. |
||
Text Preference |
iOS displays the text inline. |
Android displays the default text within an input field. |
||
Text Preference (as secret input text) |
On iOS platforms, user enter text inline, with each character obscured by a bullet point after it has been entered. For more information, see What Happens When You Define a Text Preference. |
Android launches an input text dialog and obscures each character with a bullet point after it has been entered. |
||
Single Item Selection List (from a Preference List) |
iOS platforms display the single item selection list in a separate preferences page. |
Android displays the single item selection list in a dialog. |
||
Preference Page |
iOS launches a child preference page from a preference group. |
Android launches a child preference page from a preference group. |
Although iOS and Android platforms have a Settings application, only the iOS platform supports integrating application-level preferences into the Settings application, as shown by the preferences in Figure 23-21.
Figure 23-21 Oracle Mobile Preferences in the iOS Settings Application
On Android-powered devices, users access application-specific preferences pages similar to the one shown in Figure 23-22 only when the application is running.
Figure 23-22 The Preferences Menu on an Android-Powered Device