This blog is part of my blog series about Business Apps.

—work in progress / stay tuned / will tweet @ekkescorner


Overview Goods Receipt APP


Goods Receipt APP (Intermarkt Thielen) (c) 2015 by ekke (BlackBerry Elite Developer)

This app is running at a german Plants Wholesale company. Plants are delivered via Trucks to stores. Before the goods are going out there’s a check if quantity and content is the same as ordered and packed. If all is OK, data will be send via EDI from Plants Wholesale company to Plants Store to avoid the time consuming work of Goods Receipt at arrival of the truck.


The challenge was to develop a mobile app to make this work of checking the goods easy, fast and avoid errors. Plants are collected as single plants or in containers, Euro Pallets etc. All Plants have a barcode (EAN13) and also the Customer’s Sales Price printed on a label. All the Goods belonging to one order can be collected on some carts / trailers where it must be possible to start the check before the complete order was packed.

So this is the workflow: Scan the barcode from the order, get quantities and units of packed data from server, cache on device, then scan all goods. If ready get expexted (packed) data again from server and compare. Show positions and mark correct data, too much or less / missing. Correct, add or remove data, add all the containers / Euro Pallets and send quantities and units back to server.

Server is connected via REST services. All work on the mobile device is cached on the device to allow working while offline.



The mobile App must be robust and easy to handle with large fonts and big buttons. The device will be placed inside a arm bag and all the navigation and data entry must work by tapping on the device without getting the virtual keyboard where keys are too small. Barcode Scanner will be placed on the index finger to be able to work hands-free.

So this is the Hardware:

  • Fulltouch Device: BlackBerry Leap
  • LXE 8650 Honeywell Ring Scanner
  • Custom – made arm bag for the Leap



Image of the Arm bag will follow – it’s just in-production. The bag must work inside and outside in the sun, so must be glare-free. Wasn’t easy to find the right one so finally we decided to produce a custom made bag.


APP-in-action (Video)


The mobile APP (Screenshots)

At startup the APP automatically switches Bluetooth ON and at the end Bluetooth will be switched OFF.

There’s no other Bluetooth APP on these devices, so it’s a good idea to be energy efficient.

After switching Bluetooth ON, the APP is searching for the last connected Scanner.

If no one found you can manage all the Bluetooth stuff without any tech knowledge from inside the app (see below at the end of this article)


Bluetooth is ON and Scanner is connected: you’re ready to start work for Goods Receipt.


Now scan the Order number from the Picking List you want to check.


Picking List with informations on Customer and Positions will be downloaded from server via REST service and cached inside your secure app sandbox.

Scanning the same Order number again will load the data from cache – so it’s easy to switch.

All Pages are using large fonts and designed to make it easy to read, understand and to tap on.



As soon as one of the Picking Lists (Orders) is active you can start to scan EAN13 Barcodes from the packed goods.

If a Barcode was not found inside the active Order, the APP is looking at other cached and not yet completed lists. If Barcode was found inside another Order, you’ll get the info using a Custom Dialog.

Then it’s easy to switchto another Order by a single Tap or cancel if the wrong article was scanned.


Each Order Position knows allowed Barcodes, so from scanned EAN 13 Code the APP detects the Order Position and displays description, price, size, quantity and content.

You also see the amount of already scanned quantity (in the example below: 60) and you get an Icon at the right to know about the current state:



red arrow down: less scanned then packed





blue arrow up: more scanned then expected




green checkmark: all is OK – scanned quantity same as packed



Tapping on the Icon you’ll get a list of all single scans for this position.

From here you can tap on on Unit (Menge) or Content (Inhalt) to edit the value.

Tapping on the trash sets quantity to 0.


One of the great things from BlackBerry 10 OS is the “peek-back” functionality: you always know about the context by simply swipe the current Page to the right border.

Here peeking back from an Order Position to Order Header gives easy access to Order and Customer info:


Remember: the Device is inside an arms bag and it must be easy to enter data.

Key caps from virtual keyboard are too small, so I developed a numeric keypad occupying complete space from Device in Landscape orientation.

This numeric keyboard knows about the context and so it’s optimized to enter Quantity, Content, Prices, Order Numbers or EAN13 Codes.

The screenshot below shows entering Quantity (Menge):


Want to get Info about corresponding Position data ?

Simply peek back and go on without closing / opening pages – that’s the BlackBerry 10 FLOW:


Here a quantity of 4 Containers was entered where each one contains 6 Plants = Total (Summe) of 24 Plants:


If a Barcode (EAN13) is dirty and cannot be scanned it’s easy to enter the number manually.

The APP checks immediately if you entered exactly 13 digits and also validates if checksum is correct before searching the position.

Goal is always to make it as fast as possible and avoiding errors.


Sometimes it happens that inside an Order there are more then one positions found for a given Barcode:

in this case the employee can select if he/she’s scanning the position with a content of 6 or only 1 in each container:


All Lists, all Dialogs have custom big Buttons and large List Rows to make it easy to tap on.

If something went wrong, the Device does a vibration to alert the user.


While checking the scanned data before sending them to the Server a list with all the scanned or not scanned data is displayed.

Tapping on an entry shows the history and quantity or content values can be changed or removed.


If no scanned data was already entered for a specific position you can also enter data manually.

At first you must verify the Barcode – in some cases there can be more then one Barcode valid for a position, so you must select the right one:


As last step quantities of all Empty-Containers put on the Truck must be entered.

If all is done you can send data back to server. Then in the Office data can be varified again and if all is done, the Goods Receipt will be sent via EDI to Customers IT.


If more then one orders are active (stored in offline – cache) you can easy switch to another one:


The APP also provides all Bluetooth Management from inside the APP without going to Device Settings to make this an easy stuff.

After scanning for Bluetooth Devices nearby, found Devices are grouped by Type and Scanners can be edited.


Tapping on a row shows the details and allows to Pair / Unpair or Connect / Unconnect a Scanner:


There’s also a special testpage from where you can test if the Scanner works well.


Over all BlackBerry 10 OS  and hands-free working makes following the workflow fun and also to be productive.

Running the Scanner in serial mode (SPP Profile) makes it very comfortable, because scans can always be done and not only while focused on entry fields as done in HID profile.

It’s some more work to implement serial connected Scanners, but Customers will thank you for this.

The Backend

Here’s a short snapshot from the backend (ERP solution): Positions ordered (bestellt)….


… packed (Gepackt) and compared (Geprüft) from mobile Goods receipt APP.

The Barcode Icon at the very left shows the details of all scanned data.


Take a look at the Video to get a feeling how smooth this app is working. Then you understand why my first choice for Business Apps is always BlackBerry10 OS. More of my BlackBerry 10 Business Apps can be found here.

Business Apps

November 15, 2015 — Leave a comment

BB10 vs Android Development

Often I was asked, why I’m still developing business apps for BlackBerry 10.

Why not Android – even now where BlackBerry is providing a first Device powered by Android (BlackBerry PRIV) ?

I really like the PRIV giving me a great touch screen plus keyboard plus all the apps and services from Google Play with all the security by BlackBerry on top: unbeatable in the Android world.

If you need all these apps for your daily business: use the PRIV – it’s made for you and gives you the most secure Android Device. Of course I’ll also develop business apps for the BlackBerry PRIV.

If you need the most secure OS or Push Services inside secure BlackBerry infrastructure or Apps providing the smoothest way to follow your workflows: use a BlackBerry 10 Device.

The good news: you can manage and run all together from your BES12: Android, BlackBerry10, iOS, Windows 10, Android for Work, Samsung KNOX !

To give you some infos what kind of apps can be done with BlackBerry 10 you can take a look at BlackBerry World (search for ‘ekke’) – it’s the only reason why I’m publishing some apps there. Most of my business apps are ‘hidden’: they’re running on BES12 at small, medium or large Enterprise Companies worldwide.

To give you some first impressions I’ll blog about some of the native business apps I developed for customers or BlackBerry Partners. Stay tuned …

BB10 Business Apps

  • Goods Receipt (Plants Wholesale)
  • Red Price (Closing Department Store Chain)
  • Services Property / Facility Management
  • Time Tracker Enterprise
  • Conferences / Events
  • BI, Statistics
  • Training, Event Management
  • Work Force Management

BB10 is all about Speed

BlackBerry 10 is built from ground for speed and smooth workflows to be as productive as possible esp. in Business Apps.

A good summary on this from CrackBerry by Bla1ze from an article comparing UX of Android (BlackBerry PRIV) and BlackBerry 10:

Speed – Losing the ability to fly through the OS quickly was something I was fully aware I was going lose going into the Priv. The ability to hop in and out of apps, switch windows, complete tasks, glance at the pertinent info and just get right down to business is intense on BlackBerry 10, and I’ve not yet been able to reach the same level on the Priv. I’m not saying it’s impossible on the Priv or Android in general; I’m just saying it that experience and speed were built into BlackBerry 10. On Priv, it’s going to take a bit more effort to get things set up the right way and customize the experience to get to the same point. BlackBerry had the pleasure of being able to create BlackBerry 10 from the ground up and build in those experiences. On Priv, they’re playing in someone else’s sandbox and those experiences have to be recreated.

This doesn’t help if you miss Apps important for your work on BB10 – then you should go with Android or iOS. But there are many use-cases and scenarios where missing Apps is not a problem and you should choose BB10 where possible to get the best performance. Perhaps my BB10 – Business – Apps – stories will help you to decide.

BlackBerry 10 and BlackBerry Android Devices are brothers in respect of secure devices and both are great for small and big enterprises.


While developing mobile Business Apps I recognized that there are many patterns to provide Offline-Cache, to access REST Services, to transform and bind data to UI and much more. So I developed a DSL (Domain Specific Language) based on Xtext and Xtend and this DSL will become Open Source next months. Read more at mobaDSL.

mobaDSL will speed up development of mobile business apps and will be available for native BB10, Android and iOS App Development. mobaDSL is not an App generator – it’s more like a toolbox / workbench to help you to avoid all the boring copy/paste stuff and to generate Entities, Data Transfer Objects, REST Services and more.

This year first time ever I’ll attend Qt World Summit in Berlin and so I also in my spare time wrote a conference app.

Conference2Go Qt World Summit can be downloaded here


There was only a very short timeframe, a new API and also a complete rewrite from scratch, so if you know some of my other Conference2Go apps, this first version misses some things: Calendar- , Notebook-, Foursquare – Integration, Search for Sessions / Speaker, birds-eye-view of all sessions, Shortcuts for keyboard devices and full Classic Trackpad support. I’ll add this later.

Conference2Go Qt World Summit gives you:

  • Sessions –> Details with Speaker –> Room
  • Trainings –> Details with Speaker –> Room
  • Speaker –> Details –> all Sessions of this Speaker –> Details
  • Tracks –> Sessions –> Details …
  • Favorite /set / remove from all Sites with Session data)
  • Venue
    • Floorplan / Rooms
    • Twitter Search #QtWS15
    • Location on BlackBerry Map / Navigate to…
    • Qt World Summit Homepage
  • ekkes-corner (BBM, Blogs, Mail to, Profiles)

Sessions and Trainings are segmented by Conference Day and grouped by Time.

Scheduled Items (Break, Lunch, Party, …) have a light background

Keynotes and Lightning Talks have own Icon, Session Tracks are colored.

Sessions marked as Favorite have an orange flag.

Tap on a Room / Floor and open in MediaPlayer to zoom in / out

All Screens support Portrait and Landscape

Video and more info will follow – here are some screenshots:

01_app_tabs 02_sessionlist_1 03_sessionlist_2 04_sessiondetail_1 05_sessiondetail2 06_sessiondetail_landscape 07_sessiondetail_room 08_trainings 10_spekaerlist_1 11_speakerdetail_1 12_speakerdetail_2

13_tracks 14_favorite 15_venue 16_floorplan 17_floorplan_2 18_location 19_homepage 20_ekkes_corner 21_ekkes_corner_2

See you in Berlin and have fun with the app. If there’s something wrong or missing please send feedback from ekkes-corner Tab inside the app.

(edited 2015-09-26 – see below new tests added)

This is the first part of a series about performance in mobile business apps. Developing apps for the enterprise always is a great challenge: you have to deal with servers from backend, Online / Offline – mode, complex workflows and your app should help the employees to get their work easy done. Performance is one of the keys to success. I’ll talk here about some scenarios you may run into if developing business apps.

Getting data from a server via REST or SOAP you have to rely on data sent to you and sometimes it’s not as expected. Per ex. in one of my Enterprise projects from time to time I had to sync master data where 150k records must be fetched from server and stored locally into SQLite. From API documentation there was one field as unique index declared.

Persisting bulk data into SQLite should be done in a batch transaction. (More about this in another part of this series)

Did so and suddenly SQLite reports an error: INSERT failed because of “Index not unique”. From batch transaction SQLite doesn’t tell you which records are duplicates. To verify this I inserted record by record and found 20 duplicates and could report to IT. Inserting record by record was very slow: 80 minutes instead of some seconds. So what to do ?

To verify data it would be the best to check if the indexes are unique before inserting them into the SQLite. In this case index was a String field and my first idea was to use a QStringList:

void ApplicationUI::checkIndexQStringList()
    JsonDataAccess jda;
    QVariantList cacheList;
    QStringList myIndexes;
    int duplicates;
    cacheList = jda.load(dataAssetsPath("fakeName.json")).toList();
    duplicates = 0;
    for (int i = 0; i < cacheList.size(); ++i) {
        QVariantMap fakeMap =;
        QString myIndex = fakeMap.value("Username").toString();
        if (myIndexes.contains(myIndex)) {
        } else {
            myIndexes << myIndex;

Unfortunately this took 13 minutes – so was no solution.

Then instead of a QStringList I tried to use a QVariantMap:

void ApplicationUI::checkIndexQVariantMap()
    JsonDataAccess jda;
    QVariantList cacheList;
    QVariantMap myIndexes;
    int duplicates;
    cacheList = jda.load(dataAssetsPath("fakeName.json")).toList();
    duplicates = 0;
    for (int i = 0; i < cacheList.size(); ++i) {
        QVariantMap fakeMap =;
        QString myIndex = fakeMap.value("Username").toString();
        if (myIndexes.contains(myIndex)) {
        } else {
            myIndexes.insert(myIndex, "");

Now it took only some seconds :)

You can check this from a project at Github:

There I’m using fake data of 50k records and the difference is huge:

  • 2 minutes (using a QStringList)
  • 1.2 seconds (using a QVariantMap)


If there’s something slow in your app – it’s always worth to search for the reason. I never would have thought that a QStringList is so much slower in this usecase as a QVariantMap.

… updated 2015-09-26 ….

thanks to feedback from twitter @ICODeRUS and @qtproject I added two more tests to make it even faster :)

Using a QMap<QString> instead of a QVariantMap reduces time by 10% and using QHash<QString> speeds it up to 400 mS (3 times faster as QVariantMap). see the details from GitHub project, here are the results:


… more blog posts will follow: SQLDataAccess vs Qt/SQL, Threads or what else ?, Objects and Pointer in QML, Caching into JSO or SQLite ?, SQLite tuning, optimize Queries, Startup time of your app, …

This is part #3 of my blog series ‘Supporting BlackBerry Classic’ as native BlackBerry10 developer.

Please read about screen sizes and first steps here and about Shortcuts here.

BlackBerry Classic isn’t only a great BlackBerry 10 Device with a physical keyboard and touch screen above –

there’s also the TrackPad back which gives you control on focus and speeds up working:


On a ‘normal’ Touchscreen Device (with or without a physical Keyboard) most times you’re not thinking about foucs: you touch on a UI Control or ActionItem and then something happens or you scroll through the content (using your fingers on touchable screen or on touchable keyboard on BlackBerry Passport)

Using a TrackPad is different. Think using a very small TouchPad outside of your TouchScreen or using a Mouse with clickable TrackWeel.

The TrackPad makes it very easy to move around on your screen and to ‘click’ on something. Of course you want to know which UI Control gets the Focus before clicking on it. In most cases Cascades does this for you and highlights the control getting the focus.

Here’s a TabbedPane where the actualTab is selected as usual:


While using the TrackPad the focus was shown to let you know which Tab gets the focus. Clicking on the Tab with focus selects this Tab.

Using a TrackPad you – as a developer – must always think about focus vs selected. For users of your app it should be easy to distinguish.

For this TabbedPane Cascades uses different background colors from the uipalette of your Theme to highlight the control with focus.

There are some UI Controls not getting focus by default: per ex. Labels, Containers, ImageView.

Here’s an ImageView using focusPolicy to let Cascades know that this control needs to get the focus:

ImageView {
    id: startButton
    navigation {
        focusPolicy: NavigationFocusPolicy.Focusable
    // ...
    gestureHandlers: [
        TapHandler {
            onTapped: {
                // doSomething

Using the TrackPad and ‘clicking’ on the Image will be the same as tapping on it: the onTapped() was executed – so it’s the same as tapping with a finger on it.

Tip: don’t use onTouch() instead of TapHandler – clicking the TrackPad will do nothing !

Using the NavigationPolicy.Focusable Cascades will highlight the ImageView with focus:


There are two lines at top and bottom and the background is slightly different. If this is ok for you, you’re done.

There will be situations where you want to change something more. Here’s another ImageView used as a placeholder for an empty list as long as there’s no data to be displayed. The Image has a Taphandler and ‘clicked’ there will be some informations for the user why there’s no data.

Here are the ImageViews on bright or dark theme and NO focus:


Before going on with focus from TrackPad take a look at the ActionBar: the Signature ActionItem in the middle is disabled, because we don’t have data.

NEVER disable a Signature ActionItem ! Signature Actionitems are colored and it’s not easy to know if it’s enabled or disabled – a better way is to remove the ActionItem and to add as soon as there’s some data:


Adding or removing is easy done:

    attachedObjects: [
        ActionItem {
            id: summaryOpenAction
            title: qsTr("Summary")
            imageSource: "asset:///images/ic_calendar_month.png"
            ActionBar.placement: ActionBarPlacement.Signature
            onTriggered: {
ScrollView {
    id: scrollView
    visible: false
    onVisibleChanged: {
        } else {
    // ...

and now the ImageView with focus from TrackPad navigation:


Cascades allows you to customize the colors or to change the brightness or saturation.

Same ImageViews customized:


The Label on top of the ImageView becomes red if focused and the brightness was changed so the user knows immediately which control has focus.


Container {
    ImageView {
        id: image_01
        navigation.focusPolicy: NavigationFocusPolicy.Focusable
        effects: [
            BrightnessEffect {
                enabled: image_01.navigation.wantsHighlight
                brightness: rootPane.isDark()? 50.0 : -10.0
    Label {
        id: label_01
        text: ""
        textStyle.color: image_01.navigation.wantsHighlight? Color.Red :Color.Black
    gestureHandlers: [
        TapHandler {
            onTapped: {
    // ...

The ImageView gets NavigationFocusPolicy.Focusable and a BrightnessEffect with different values for dark or bright theme.

Text color of the Label changes from black to red as soon as the ImageView wants to be highlighted.

Tip: Don’t forget: if coloring Labels try to use Colors from your uipalette.

Below you can see some Labels using uipalette.primaryBase and uipalette.primary:


Label {
     text: qsTr("in")
     textStyle.fontSize: FontSize.Large
     textStyle.color: ui.palette.primaryBase
 Label {
     id: daysLeftLabel
     text: ""
     textStyle.fontSize: FontSize.XXLarge
     textStyle.color: ui.palette.primary
 Label {
     text: qsTr("days")
     textStyle.fontSize: FontSize.Large
     textStyle.color: ui.palette.primaryBase

Documentation TrackPad, BrightnessEffect

stay tuned – more info HowTo support BlackBerry Classic will follow.

This is part #2 of my blog series ‘Supporting BlackBerry Classic’ as native BlackBerry10 developer.

Please read about screen sizes and first steps here.


Shortcuts are a powerful concept to help users to navigate through your app using the keyboard. BlackBerry Q10 and Q5 were the first devices with full QWERTY / QWERTZ keyboard for BlackBerry 10 followed by BlackBerry Passport. Read about differences between Q10 and Passport here.

Device Shortcuts

Doing a long-press on a key using OS 10.2 / 10.3.0 you could add a speed-dial – shortcut.

OS 10.3.1 and BlackBerry Classic are offering much more options what to do from long-pressing a key:


YES gives you some options:



From Settings | Shortcuts …


… it’s easy to get an overview of all assigned keys:


It’s a good idea to explain to your users HowTo define a shortcut to open your app with a single longpress.

Shortcuts inside your APP

The easiest way to use Shortcuts inside your App is to add them to your Actions:

actions: [
        ActionItem {
            title: qsTr("Edit Pos") + Retranslate.onLanguageChanged
            imageSource: "asset:///images/ic_view_list.png"
            ActionBar.placement: ActionBarPlacement.Signature
            onTriggered: {
                // do your stuff
            shortcuts: [
                SystemShortcut {
                    type: SystemShortcuts.Edit
        ActionItem {
            title: qsTr("Map of this site") + Retranslate.onLanguageChanged
            imageSource: "asset:///images/ic_map.png"
            ActionBar.placement: ActionBarPlacement.InOverflow
            onTriggered: {
                // do your stuff
            shortcuts: [
                Shortcut {
                    key: qsTr("m")

There are two different types of shortcuts:

  • SystemShortcut
  • Shortcut

SystemShortcuts will be translated by Cascades – to avoid collisions it’s recommended to translate your custom Shortcuts using qsTr(“xxx”)

Opening the Menu, Users will see the small letter of the shortcut – so it’s easy to learn and understand them:


You can add Shortcuts also to Tabs, Images, Pages, …

Here’s a (simplified) Layout from one of my apps where Shortcuts are defined at Page level and working great on OS 10.2.x (Q5, Q10) and also OS 10.3.0 (Passport):


Running the same app on OS 10.3.1 and BlackBerry Classic the Shortcuts stopped working.

BlackBerry Classic and Trackpad are changing the way UI Controls can be focussed or selected. (Will blog about this in Part #3)

So I tried to place the Shortcuts at the Container and it still didn’t work. Then I tried to place them at the ListView because the ListView is the UI Control the TrackPad is using to scroll and to focus. Voilá: This was working on BlackBerry Classic:


But it only works on 10.3.1 and Classic – not on 10.3.0 and Passport – so I added a switch like this:

// ...
attachedObjects: [
    ComponentDefinition {
        id: myShortcutComponent
        SystemShortcut {
            type: SystemShortcuts.Search
            onTriggered: {
                // do your stuff
// ...
if (app.isPassport()){
    myPage.shortcuts = [myShortcutComponent.createObject()]
    } else {
     myListView.shortcuts = [myShortcutComponent.createObject()]

Now my app is working fine on 10.3.0 / 10.3.1 and Passport or Classic.

There were no problems using KeyListeners. Shortcuts are bound to a specific UI Control, where KeyListeners can be everywhere and if a Key wasn’t catched it goes up to the parent until root object is reached. I’m using KeyListener for attached external Keyboards and handling ESC for Back, Arrows etc.

Sample at Github

To see Shortcuts in action I created a sample at Github.


Curious: Now from this small sample app OS 10.3.1 and Classic also work fine using Shortcuts at Page level. Haven’t figured out what makes it different in my more complex app. At Cascades Forum I noticed that other’s also have some problems with Shortcuts on 10.3.1 / Classic. So if you’re running into this try to move the Shortcuts to the UI Control getting the focus from Trackpad.

Have Fun with the Classic and stay tuned for Part #3 about Focus and TrackPad.

BlackBerry Classic was just launched on 2014-12-17 and – like BlackBerry Passport – introduces some new ways to navigate through the apps. It’s new for BlackBerry10 Apps, but for users coming from Bold 9900 or so it’s the classic way to navigate.

BlackBerry Passport introduced a touchable Keyboard and a large square screen (1440×1440) with high density. BlackBerry Passport also was the first device with OS 10.3.0. I wrote a blog series ‘HowTo support BlackBerry Passport‘ – you should read this first, because some new ways to develop native BlackBerry 10 apps (like Design Units – du) are explained in detail.

BlackBerry Classic introduced the TrackPad and some hardware keys users voted for. BlackBerry Classic is the first device running OS 10.3.1. All existing devices  running OS 10.2 will also get an update to 10.3.1 in first quarter of 2015.

This blog series will give you some tips and tricks HowTo support the Classic from your native BlackBerry 10 apps. In most cases there’s nothing you have to do to make your apps run on Classic, but to support all new features best and to provide the native UX there will be some work. It’s also a good idea for all your apps to support OS 10.3.1 – then your apps will look and work great in 2015 on all devices

Screen Size

If your app already supports the Q10, your app will display content correct, because both devices are square and have 720 x 720 Pixel.

But there are differences: the Classic screen is larger with 3.5″ where the Q10 has 3.1″ – the density of Classic is lower: 294 ppi (Q10 328 ppi)


If you’re using OS 10.2 or design your screens the old way using pixel, your app will display the same content on Classic as on Q10 – so your app won’t profit from the extra space. That’s why – starting with OS 10.3.0 and Passport – you should use Design units (ui).


Using design units you’ll get an extra row in lists or see more text. To understand du’s please read also my blog from ‘Support Passport‘ series.

The good thing for all your Icons: if you already support the Z30 with 8ppd – Cascades will use them on BlackBerry Classic.

Navigation concept

The Passport was the first BlackBerry 10 device offering a second touchable area outside the touch screen itself: the Keyboard. Read all about the Passport from my blog series here.

BlackBerry Classic does the same but different: Between the touchscreen and physical keyboard you’ll find the BlackBerry Toolbelt with the TrackPad in the middle:


If you ever used a legacy BlackBerry like Bold 9900 you already know the toolbelt – now BlackBerry makes this available for BlackBerry 10.

There’s no other way I know to navigate fast through your apps and typing as using a BlackBerry physical keyboard together with the toolbelt. The best is to test it out – you really must feel this under your thumbs. There are also some articles and videos available at blackberry blogs. My blog series explains what this means to you as a developer of native BlackBerry 10 apps.

OS 10.3.1 – external Keyboards

The Classic is also the first device using OS 10.3.1 which will be available for all devices soon in 2015.

One of the most important – and long missed – features for business apps is supporting international keyboard layouts if connecting external keyboards via Bluetooth or USB.


Using a Classic in normal situations you don’t need an external keyboard, but for mobile-only scenarios where you connect the device to a large screen via HDMI / Miracast and an external keyboard via Bluetooth / USB it makes sense. OS 10.3.1 will also run on touch-only devices like Z30 where from time to time it’s a great idea to enter long text from a physical keyboard.

OS 10.3.1 and Bluetooth issues

Over all I had less issues while testing OS 10.3.1 early releases – and these issues were some ‘special’ issues not targeting most of you.

If you explore all the Bluetooth stuff you’ll notice many new functions and API for 10.3.1. It’s great to see that BlackBerry is working on this and most enhancements will cover Bluetooth LE.

I detected the issues from an app supporting the ‘old’ Bluetooth to connect Scanner and mobile Printer via serial protocol (SPP). In my usecase customer has only this app in work perimeter using Bluetooth – so to reduce battery consumption while launching the app I switched Bluetooth on, then wait for the event BT_EVT_RADIO_INIT before connecting my devices. Closing the app, Bluetooth was switched off automatically by the app.

Worked fine under 10.2 and 10.3.0 on Passport, but failed on 10.3.1. From my tests I found out that there are some new Events for 10.3.1, but two of the existing events were not sent:


Thanks to @jcmrim pointing me to the right direction to find the reason and a workaround. There’s a new filtering option on 10.3.1 – see here. From docs the default is NOT filtering, so all events should come through. Setting this default manually again will bring back the missing events :)

int filterSuccess =  bt_ldev_set_filters(BT_EVT_ALL_EVENT, true);
if(filterSuccess == -1){
    qWarning() << "Filtering wrong " << filterSuccess;

The other issue happens if more then one Bluetooth device is connected via SPP to the BlackBerry – in my use-case a Scanner together with a Printer. Disconnecting one of the devices – per ex. while changing the battery – also disconnects the other one. Worked well on 10.2 and 10.3.0 on Passport but not on 10.3.1 and Classic. This issue is reported to BlackBerry and I got info it’s already fixed and will be available soon.

In my app I made it easy to re-connect using NFC, so it’s only one extra tap to work on. (will blog about this Bluetooth App soon)

OS 10.3.1 and ‘TabbedPane-inside-Sheet’ issue

One of my apps (SerCar10 for ServiceCars) is a complex app supporting different users with different roles like office, sales, driver, dispatcher, …

My first idea was to develop some small apps and “connect” those feature-apps using InvokationFramework and CARDs. The integration I needed was too deep, so I had to put it all into one big app where UI will look different for different roles: a service car driver can only select parts from a list and add to the work order, where from office this list can be managed (add, edit, delete).

Finally I separated modules using their own TabbedPane to make it easy to navigate. This means some users with some roles must get access to more then one module and so I created a hierarchical TabbedPane, which is no default Cascades UI Control. But there are Sheets to separate a sub-workflow and Sheets can have a Pane as root element: doesn’t matter if it’s a NavigationPane or a TabbedPane. So I’m using Sheets to separate the modules.

Here’s a short sample so you can understand better:

The usual root TabbedPane will push another TabbePane on top, which means: a Sheet was opened with another TabbedPane on board. In this case the ‘Data’ Tab from root TabbedPane opens another TabbedPane on top from where office employee can edit some data.


This (Sub) TabbedPane works same way as the root TabbedPane. Here you get acces to lists of Units, Groups, Parts, Contacts with CRUD functionality. Because it’s a Sheet you can peek back but not close the Sheet by swiping.

02_data_ tabbed_pane

Normaly there would be buttons like OK and Cancel to exit a Sheet. For my (sub) TabbedPanes I’m using a special (Back) Tab at the bottom to go back explicitely.


Going back the Sheet and all content was destroyed to free up memory.

So far so good. Works on 10.2 and 10.3.0 but crashed the app on 10.3.1

Took some time to figure out what happened and to find a workaround. The TabbedPane was created together with the Sheet and this won’t work anymore. Using an empty Page instead and creating the (Sub) TabbedPane with a delay of 30 ms makes it run on 10.3.1 :)

Sheet {
    id: dataEntrySheet
    onClosed: {
        // ....
    attachedObjects: [
        DataEntryTabbedPane {
            id: tabbedPane
        QTimer {
            id: startupDelayedTimer
            interval: 30
            singleShot: true
            onTimeout: {
    Page {
        // DUMMY

    onCreationCompleted: {

The good thing: there’s no flicker or so while creating the TabbedPane.

again: not a common use-case but perhaps you run into similar situations and using a QTimer to create Controls async can help.

UX on Classic

I tested my apps on BlackBerry Classic and found some layouts looking ugly while navigating using the TrackPad. This was expected because now there’s a special highlight color for List Rows or UI Controls with focus from TrackPad and if you’re already using colored text or images the highlighting must be adjusted.

Also found some workflows with different behaviour between Passport and Classic – esp. if using Shortcuts and KeyListener.

I’ll report about my experiences and solutions in detail to help you to provide smooth workflows.

The great thing: Cascades offers all you need from new OS 10.3.1 API to provide great UX on all devices :)

Please stay tuned for the next parts coming soon.

Over all it’s really fun to navigate through BlackBerry10 apps from TrackPad. This enables me to design fast and smooth workflows in business apps which will make users more productive.