Skip to main content

Configuration of TheFlex with Intune

An MDM (Mobile Device Management System) is a software solution that helps businesses manage and secure mobile devices such as smartphones, tablets, and laptops. MDM systems allow organizations to remotely monitor, configure, and control devices, regardless of location or the network they are connected to. MDM systems are particularly useful for companies with a large number of employees accessing corporate resources through mobile devices.

The following article describes the procedure for configuring the Android version of TheFlex with Microsoft Intune.

Create an app-configuration policy

Visit the Microsoft Endpoint Manager website and log in with your credentials. Navigate to Apps and select App configuration policies.

Screenshot of the Intune App Configuration Policy

Click on Create new policy and select Managed Devices.

There you can select TheFlex as the name, Android Enterprise as the target platform, a corresponding profile type and finally the app TheFlex.

Screenshot of the Intune App Configuration Policy

Configuration of the settings

Optionally, you can directly activate the required authorizations for TheFlex. The following authorizations are required for TheFlex:

  • WiFi
  • NFC
  • Bluetooth
  • Camera
  • GPS
  • Flashlight
  • Vibrate
  • Audio
  • Read Storage
  • Write Storage

Screenshot of the Intune Android permissions

The next step is to configure the TheFlex-specific settings. As the most important and mandatory setting is the start pages, this cannot be done via the Intunes interface. The reason for this is that several start pages can be configured and this function is not supported by Intunes.

For this reason, the settings must be entered as JSON data:

Screenshot of the Intune Android JSON settings

Intune automatically generates sample data. The recommendation is to copy this into another program such as Notepad++ and edit it there.

Configuration of normal settings

Most settings are predefined as either "true" or a number. These can be adjusted to the appropriate value as required or left at the default value.

Important: Intune automatically writes the value STRING_VALUE for all text settings. This must at least be replaced by an empty string "". However, it is recommended to replace this STRING_VALUE with a valid setting:

SettingPossible values (always enter in "")
Additional displays"none", "PROGLOVE_MARK_DISPLAY_SDK", "NIMMSTA_HS50_SDK"
Keyboard behavior"default", "deactivated", "Active_on_tap"
Language"de_DE", "en_EN"
Logging"ERROR", "WARN", "INFO", "DEBUG"

Configuration of the license

The license code can be entered as valueString under the flx_license key. The license code must also be placed in quotation marks here, otherwise it will not be recognized as valid by Intune.

Configuration of the start pages

At least one start page must be configured, otherwise TheFlex will reject the configuration as invalid and reset it. To do this, at least one managedProperty must be added or configured in the fioriURL_Configuration section:

  • fioriURLName: Name of the start page (mandatory, must not be empty)
  • fioriURL: URL of the start page (mandatory, must not be empty)
  • fioriURLUsername: Optional SAP user
  • fioriURLPassword: Optional SAP password
Recommendation

At the end of this article is a valid configuration as JSON. This can be copied into Microsoft Intune. It is recommended to insert a valid license code directly.

Note

In some cases, it may be useful to transfer all settings to the devices via Intune except for the username and password.

This may be necessary if all settings are to be centrally managed, but users still need to be able to save their personal login credentials for certain startpages.

To enable this with Intune, a "/" (a single slash) must be entered as fioriURLUsername and fioriURLPassword in Intune. If the device receives a "/", it will not overwrite the local setting.

Selection of user groups

The next step is to configure which device or user groups this configuration policy should apply to.

Screenshot of the Intune user groups

The app and Intune settings are then automatically distributed to all selected devices.

Caution

If TheFlex was already installed and configured, for example for local testing, the settings must be reseted. This can be done either in the TheFlex or the general Android settings.

Example JSON for an Intune configuration

The following JSON contains all available TheFlex settings. Copy it into Intune’s JSON editor and adjust the values as needed. Keys you don’t need can simply be removed.

{
"kind": "androidenterprise#managedConfiguration",
"productId": "app:de.flexus.apps.theflex",
"managedProperty": [

{ "key": "flx_license", "valueString": "" },

{
"key": "fioriURL_Configuration",
"valueBundleArray": [
{
"managedProperty": [
{ "key": "fioriURLName", "valueString": "My App" },
{ "key": "fioriURL", "valueString": "https://my-sap-system.example.com" },
{ "key": "fioriURLUsername", "valueString": "" },
{ "key": "fioriURLPassword", "valueString": "" }
]
}
]
},

{ "key": "menuStartpagesEnabled", "valueBool": true },
{
"key": "menuStartpage_Configuration",
"valueBundleArray": [
{
"managedProperty": [
{ "key": "menuStartpageTitle", "valueString": "Picking" },
{ "key": "menuStartpageUrl", "valueString": "https://my-sap-system.example.com/picking" },
{ "key": "menuStartpageFolder", "valueString": "Warehouse/Zone A" }
]
},
{
"managedProperty": [
{ "key": "menuStartpageTitle", "valueString": "Goods Receipt" },
{ "key": "menuStartpageUrl", "valueString": "https://my-sap-system.example.com/goods-receipt" },
{ "key": "menuStartpageFolder", "valueString": "Warehouse/Zone A" }
]
},
{
"managedProperty": [
{ "key": "menuStartpageTitle", "valueString": "Inventory" },
{ "key": "menuStartpageUrl", "valueString": "https://my-sap-system.example.com/inventory" },
{ "key": "menuStartpageFolder", "valueString": "Warehouse" }
]
},
{
"managedProperty": [
{ "key": "menuStartpageTitle", "valueString": "Dashboard" },
{ "key": "menuStartpageUrl", "valueString": "https://my-sap-system.example.com/dashboard" },
{ "key": "menuStartpageFolder", "valueString": "" }
]
}
]
},

{ "key": "adminPassword", "valueString": "" },
{ "key": "requirePasswordLaunchpad", "valueBool": false },
{ "key": "SslUntrustIgnore", "valueBool": false },
{ "key": "flxBlockCopyPaste", "valueBool": false },
{ "key": "FlxCertChooser", "valueBool": false },
{ "key": "FlxUseSmartcard", "valueBool": false },
{ "key": "NFCConfig", "valueString": "" },

{ "key": "FlxPdfViewerEnabled", "valueBool": true },
{ "key": "FlxProgressIndicator", "valueBool": true },
{ "key": "FlxDebugMode", "valueBool": false },

{ "key": "FLXShowStatusBar", "valueBool": true },
{ "key": "FLXShowNavigationBar", "valueBool": true },
{ "key": "FlxToolbarOverlap", "valueBool": true },
{ "key": "FlxShowCloseButton", "valueBool": false },
{ "key": "FlxKeepScreenOn", "valueBool": false },
{ "key": "FlxConnectionStatus", "valueBool": false },
{ "key": "ZoomAmount", "valueInteger": 100 },
{ "key": "flxSelectedLanguage", "valueString": "" },

{ "key": "FLXSoftInputModeResize", "valueBool": true },
{ "key": "flxKeyboardPreferences", "valueString": "default" },

{ "key": "flxPairedDevice", "valueString": "none" },
{ "key": "flxPairedDevice_ScanMode", "valueString": "default" },

{ "key": "ClearSessions", "valueBool": true },
{ "key": "ClearCacheOnExit", "valueBool": true },
{ "key": "ClearCookieOnSwitchingLaunchpad","valueBool": true },
{ "key": "ClearCacheOnSwitchingLaunchpad", "valueBool": true },

{ "key": "LogLevel", "valueString": "ERROR" },

{
"key": "customScript_Configuration",
"valueBundleArray": [
{
"managedProperty": [
{ "key": "customScriptDescription", "valueString": "My Script" },
{ "key": "customScriptName", "valueString": "https://my-sap-system.example.com*" },
{ "key": "customScriptCode", "valueString": "console.log(‘TheFlex ready’);" },
{ "key": "customScriptActive", "valueBool": true }
]
}
]
},

{
"key": "customCSSSet_Configuration",
"valueBundleArray": [
{
"managedProperty": [
{ "key": "customCSSDescription", "valueString": "My CSS" },
{ "key": "customCSSName", "valueString": "https://my-sap-system.example.com*" },
{ "key": "customCSSCode", "valueString": "body { font-size: 16px; }" },
{ "key": "customCSSActive", "valueBool": true }
]
}
]
},

{
"key": "customKeyboardSet_Configuration",
"valueBundleArray": [
{
"managedProperty": [
{ "key": "inputType", "valueString": "default" },
{ "key": "cKeyboard", "valueString": "{ ‘rows’: [{ ‘buttons’: [{ ‘text’: ‘ENTER’, ‘function’: ‘ENTER’, ‘color’: ‘#ffff33’, ‘weight’: 1 }] }] }" },
{ "key": "customParameter", "valueString": "" }
]
}
]
},

{
"key": "scanConfig_Configuration",
"valueBundleArray": [
{
"managedProperty": [
{ "key": "scanConfigName", "valueString": "EAN-13" },
{ "key": "scanConfigLengthRule", "valueString": "EXACT" },
{ "key": "scanConfigMatchLength", "valueInteger": 13 },
{ "key": "scanConfigMatchText", "valueString": "" },
{
"key": "scanConfigActions",
"valueBundleArray": [
{
"managedProperty": [
{ "key": "scanConfigActionType", "valueString": "CUT_FIRST" },
{ "key": "scanConfigActionCount", "valueInteger": 1 },
{ "key": "scanConfigActionText", "valueString": "" }
]
}
]
}
]
}
]
}

]
}
Note

JSON does not support comments. The structure above is for readability in this documentation only. Simply remove entries you don’t need before pasting into Intune.

Explanation of all Intune JSON keys

License

KeyTypeDescription
flx_licensestringTheFlex license key

Classic start pages (fioriURL_Configuration)

KeyTypeDescription
fioriURLNamestringDisplay name (required)
fioriURLstringURL to open (required)
fioriURLUsernamestringSAP username – use "/" to preserve the local value
fioriURLPasswordstringSAP password – use "/" to preserve the local value
KeyTypeDefaultDescription
menuStartpagesEnabledboolfalseActivates the folder-based menu navigation. Note: When enabled, the classic start pages (fioriURL_Configuration) are no longer shown in the menu.
menuStartpageTitlestringDisplay label
menuStartpageUrlstringURL to open
menuStartpageFolderstring""Folder path for this entry. Use "/" as separator for nested subfolders, e.g. "Warehouse/Zone A". All entries with the same path appear in the same folder. Leave empty ("") to place the entry at the root level (no folder).
Folder path examples

The value of menuStartpageFolder determines where in the menu the entry appears:

ValuePosition in the menu
""Root level – directly in the menu, not inside any folder
"Warehouse"Inside folder Warehouse
"Warehouse/Zone A"Inside subfolder Zone A, which is inside Warehouse

The JSON example above would produce this menu structure:

📁 Warehouse
📁 Zone A
📄 Picking
📄 Goods Receipt
📄 Inventory
📄 Dashboard

Entries with identical paths are automatically grouped into the same folder. Folders are created implicitly – they do not need to be defined separately.

Security

KeyTypeDefaultDescription
adminPasswordstring""Admin password for settings access
requirePasswordLaunchpadboolfalseRequire password to switch start pages
SslUntrustIgnoreboolfalseAllow HTTPS connections with invalid certificates
flxBlockCopyPasteboolfalseBlock copy & paste from web content
FlxCertChooserboolfalseShow certificate selection dialog at login
FlxUseSmartcardboolfalseEnable NFC smartcard authentication
NFCConfigstring""Smartcard configuration (imported via QR)

User interface

KeyTypeDefaultDescription
FLXShowStatusBarbooltrueShow Android status bar
FLXShowNavigationBarbooltrueShow Android navigation bar
FlxToolbarOverlapbooltrueToolbar overlays content instead of pushing it down
FlxShowCloseButtonboolfalseShow close/exit button in toolbar
FlxKeepScreenOnboolfalsePrevent screen from turning off
FlxConnectionStatusboolfalseShow connection status indicator
ZoomAmountstring"100"Page zoom in percent
flxSelectedLanguagestring""App language: "" (system), "de_DE", "en_EN"

Keyboard

KeyTypeDefaultDescription
FLXSoftInputModeResizebooltrueKeyboard pushes UI content up (instead of overlaying)
flxKeyboardPreferencesstring"default"When keyboard opens: "default", "Active_on_tap", "deactivated"

Paired device (backhand scanner)

KeyTypeDefaultDescription
flxPairedDevicestring"none""none", "PROGLOVE_MARK_DISPLAY_SDK", "NIMMSTA_HS50_SDK"
flxPairedDevice_ScanModestring"default""default", "onlyBarcodes", "onlyQRCode"

Cache & cookies

KeyTypeDefaultDescription
ClearSessionsbooltrueClear session data on app exit
ClearCacheOnExitbooltrueClear file cache on app exit
ClearCookieOnSwitchingLaunchpadbooltrueClear cookies when switching start pages
ClearCacheOnSwitchingLaunchpadbooltrueClear file cache when switching start pages

PDF & display

KeyTypeDefaultDescription
FlxPdfViewerEnabledbooltrueOpen PDF links in the embedded viewer
FlxProgressIndicatorbooltrueShow loading indicator at the screen edge
FlxDebugModeboolfalseEnable extended debug logging

Logging

KeyTypeDefaultDescription
LogLevelstring"ERROR""ERROR", "WARNING", "INFO", "DEBUG"

Custom scripts (customScript_Configuration)

KeyTypeDescription
customScriptDescriptionstringDisplay name
customScriptNamestringURL pattern the script applies to (e.g. "https://my-system.com*")
customScriptCodestringJavaScript code to inject
customScriptActiveboolEnable/disable this entry

Custom CSS (customCSSSet_Configuration)

KeyTypeDescription
customCSSDescriptionstringDisplay name
customCSSNamestringURL pattern the CSS applies to
customCSSCodestringCSS code to inject
customCSSActiveboolEnable/disable this entry

Custom keyboards (customKeyboardSet_Configuration)

KeyTypeDescription
inputTypestringInput type: "default", "text", "password", "number", "email", "tel", "textarea", "custom"
cKeyboardstringKeyboard layout as JSON string
customParameterstringOptional parameter for "custom" input type

Scan configuration (scanConfig_Configuration)

KeyTypeDescription
scanConfigNamestringDisplay name
scanConfigLengthRulestringRule type: "FALLBACK", "EXACT", "AT_MOST", "AT_LEAST", "LENGTH_RANGE", "STARTS_WITH", "ENDS_WITH", "CONTAINS"
scanConfigMatchLengthintegerTarget length (for length-based rules)
scanConfigMatchLengthMaxintegerMaximum length (for LENGTH_RANGE only)
scanConfigMatchTextstringText pattern (for STARTS_WITH, ENDS_WITH, CONTAINS)

Scan actions (scanConfigActions – nested bundle array):

KeyTypeDescription
scanConfigActionTypestring"CUT_FIRST", "CUT_LAST", "TAKE_FIRST", "TAKE_LAST", "PREFIX", "SUFFIX", "INSERT_AT", "EXTRACT", "REPLACE", "REMOVE_LEADING_ZEROS", "REMOVE_TRAILING_ZEROS", "PAD_LEFT", "PAD_RIGHT", "UPPERCASE", "LOWERCASE"
scanConfigActionCountintegerNumeric parameter (character count, position)
scanConfigActionCount2integerSecond numeric parameter (e.g. length for EXTRACT)
scanConfigActionTextstringText parameter (prefix/suffix text, search value, pad character)
scanConfigActionText2stringReplacement value (for REPLACE)