Meetup for BlackBerry 10 release 1.1.3

I just got the update 1.1.3 for my Meetup for BlackBerry 10 app in BlackBerry World. I didn’t put in all the changes that I wanted to, mostly because of issues that came up while I was making the upgrade. Beyond my computer having problems, Meetup had a DDoS attack, which brought the app down for over a week. Unfortunately for my app reviews, a few people downloaded the app during that time and couldn’t get the app working. Because of that, I decided to release the app with what I had changed and then start another version with some more changes.

In this release, I added event chat/discussion. Event chat/discussion is where people can make comments about the event before and after the event. Usually this is helpful when people are planning things before the event. It is somewhat helpful for the Organizer when people leave reviews after the event. To get this to work, I modified a ListView to look like a chat screen.

Event Chat

Event Info

Event Info Menu

I also updated the App Settings menu. The Privacy Policy and Change Log now open in a WebView instead of opening the browser. I also added some text about joining the BBM Group for app support and subscribing to the DeanLogic BBM Channel, with a button to open the channel. Adding the channel was a little more work than expected, because when I ran the app on my phone, the BBM Channel would automatically open up. I used a tip found on the Internet to check to see if the uri was added before triggering the Invoke. Then I just add the uri when the button is pressed.

Unfortunately, I couldn’t get Join BBM Group to work. Apparently there are still some bugs in that with the API or maybe just general inability to do so or something. I think it will be fine for people to join the Channel, because the Channel does offer chat.

actions: [
                    ActionItem {
                        id: aiBBMChannel
                        imageSource: "asset:///images/Channel-d.png"
                        title: qsTr("DeanLogic Channel")
                        ActionBar.placement: ActionBarPlacement.OnBar
                        onTriggered: {
                            bbmChannelInvoke.query.uri = "bbmc:C004DD717";
                            bbmChannelInvoke.query.updateQuery();
                            bbmChannelInvoke.armed();
                        }
                    }
                ]
 attachedObjects: [
Invocation {
                        id: bbmChannelInvoke
                        query {
                            invokeActionId: "bb.action.OPENBBMCHANNEL"
                            invokeTargetId: "sys.bbm.channels.card.previewer"
                        }
                        onArmed: {
                            if(bbmChannelInvoke.query.uri != "") {
                                trigger("bb.action.OPENBBMCHANNEL")
                            }
                        }
                    }
]

App Settings Menu

App Support Form

Cascades and auto animation

While I am trying to work on the next release for my Meetup app, I decided to take a little diversion to make a simple game app. Well, simple game app has taken a little bit longer than expected, but while working on the code, I learned a little unexpected feature about Cascades. When you want to place an item in a Container, you can let the Container handle the placement, or you can set the X and Y coordinates for the control (which is a subclass of a VisualNode). The values to set are the TranslationX and TranslationY, which doesn’t sound like something for setting coordinates, but more to do with language. If you set these values and do nothing more with the control, then nothing in particular will happen. However, if you set the values in a way to place the control outside of the visible area and then later set the values to be in the visible area, then you will see an animation happen.

In this video, the buttons move to the end point (on or off the screen) when triggered. I used my video camera pointing at my computer monitor. So the quality is not the best.

In this video, I move a Container and everything in it to a spot in order to hide the gaming board. Because I used a Java based web screen capture, not all the frames are captured, so it is hard to see the animation. But, in real time, the Container slides up to cover and down to uncover the play area.

The quality of the demonstration goes back to the annoyance that Adobe Captivate is not part of Adobe Creative Cloud. I was thinking about putting How To videos with my apps using Captivate. I will probably have to figure out how I can do it using Edge Animate.

Fly FLy Up Testing and Review

As part of being a developer you end up spending some time in developer forums. Usually those forums are part of the official site for the development tool or application. But, sometimes you end up in a fan forum that happens to have a developer forum of its own, like the one on CrackBerry.com. And sometimes when you want to find an active group of new developers, you end up in a BBM Group for new developers called Baby Steps: BB Dev.

Well, that’s where I found myself when a user named Tom asked for some help. Tom was dipping his toe into Unity for BlackBerry 10. And apparently one of the issues with developing is not being able to know for sure if the app will work on all the devices. Luckily for Tom, he was in a group that had users with Z10s, Q10s, Q5s and one guy had a Z30. I am that one guy.

For testing, Tom chose the route of sharing his updated bar file with the group testing his app. I used vnBb10 to side load the app for testing. It took several revision to get to the released version, but it was fun getting there.

FlyFly Up BlackBerry World

Fly Fly Up is a color matching game. Which means, the player selects a color to match a color presented in order for the game to continue. What you want to do in Fly Fly Up is to keep the red ant, Elliot, flying up and up on his jet pack that indicates your selected color. The premise is simple and the game starts out easy, but if you are a little slow on the finger press, the game gets hard quick.

“Touch quickly. Touch softly. Touch only when necessary. ” – Lloyd Summers

Sage advise. The game is addictive because you want to do better and better to beat the high score.

Check out Fly Fly Up! in BlackBerry World! You can find it at http://appworld.blackberry.com/webstore/content/49730421

Painter Help And Review

A little while ago, a guy named Joe gave me some help creating a Chat Style ListView.  While I was working on my app, he was working on his app called Painter.

BlackBerry World Painter

BlackBerry World Painter

Joe is still making updates to the app, but it is a great app already. You are given the option of brush size, opacity and color. There are also eraser options for when you want to clear something.  For basic doodles, this would be fine. But, you can also load an image to make your doodles on top of. Of course, with the opacity option, it makes it a great tool for capturing images on your phone and then highlighting something in the image.

Highlight something

Highlight something

But, it gets better. Joe setup Painter as an option for editing images. So, instead of opening Painter and then loading an image, you can use the Action Menu on an image an “Open in Painter”.  This way, you don’t have to keep Painter on your first page of apps, because it is always there when you need it.

Joe asked for some help on the Invoke action and some other ideas, which I did my best to explain and he graciously gave me a “hat tip” in his app.

Hat Tip to DeanLogic

Hat Tip to DeanLogic

I have made some suggestions for future updates and it sounds like Joe is going to make some nice feature additions in the future.

Check out Painter in BlackBerry World! You can find it at http://appworld.blackberry.com/webstore/content/46330888

Chat Style ListView

While I am continuing to add features to my Meetup for BlackBerry 10 app, I was wondering how I could add a chat like look when I show the Event Comments.  I was hoping that there would be a simple setting in the ListView to display the items in that format, but alas, that’s not the case.  However, with the help from Joe on the BBM Group for BB10 developer newbies (Baby Steps: BB Dev), we came up with a simple solution.

The first step is to get your DataGroupModel in the right format.  When Meetup sends the Event Comments, it is in the order of when the comments were created; newest to oldest.  However, that doesn’t help if someone puts a comment reply to an earlier comment, because now it will be out of place.  When you get your comment list, you need to make sure that it has a way to point back to the parent comment.  Luckily, Meetup does provide a “reply to ID” for the comments.  Since I load all of my comments in to a sqlite table, when I want to build the DataGroupModel, I simple call the first query of only the top level comments (they will have a reply ID of “0″).  As I loop through each of those comments, I run a second query to call all the comments whose “reply to ID” matches the parent comment I am working with.


if (query.exec()) {
	while(query.next()) {
		QVariantMap map;
		// set the parentCommentID for the second query
		int parentCommentID = query.value(0).toInt();

		map["id"] =  query.value(0).toInt();
		map["inReplyTo"] = query.value(5).toInt();
		map["comment"] = query.value(6).toString();
		map["memberName"] = query.value(7).toString();
		map["memberID"] = query.value(9).toInt();
		map["commentRow"] = commentRow;

		returnGDM->insert(map);
		commentRow++;

		if (query2.exec()) {
			while(query2.next()) {
				QVariantMap map2;
				map2["id"] =  query2.value(0).toInt();
				map2["inReplyTo"] = query2.value(5).toInt();
				map2["comment"] = query2.value(6).toString();
				map2["memberName"] = query2.value(7).toString();
				map2["memberID"] = query2.value(9).toInt();
				map2["commentRow"] = commentRow;

				returnGDM->insert(map2);
				commentRow++;
			}
		}
	}
}

If you had more than one level of comments, then I guess you would have to do more loops.  Which is probably why it is a good thing not to have too many levels of comments.  The returnGDM gets populated at each pass and all the comments are in the correct order.  At this point, the ListView would look very plain.  So, next we need to make things pretty and that’s were ImageView , Nine-slice Scaling and Joe comes in.

Chat_ListView

Joe created a couple of images to be used as the chat bubbles.  With those images, you also need AssetMetaData files to control the images for scaling.  This basically means, when the image adjusts itself to the ImageView area, it won’t get distorted because the amd file shows which areas can be stretched and which ones can’t be stretched.

Here are the BBM border images and amd file codes.  Not much to it.  The only real difference is making one a Left chat bubble and the other a Right chat bubble.
bbmborder


#RimCascadesAssetMetaData version=1.0
source: "bbmborder.png"
sliceMargins: 22 22 22 22

lbbmborder


#RimCascadesAssetMetaData version=1.0
source: "lbbmborder.png"
sliceMargins: 22 22 22 22

Once we have the images, then we need put everything in a Container for placement and display.  We actually need to Containers; first for the ImageView and second for the text Label.  A DockLayout is used for the outer Container so that the ImageView overlaps the area used by the inner Container and the Label within it. The horizontalAlignment and verticalAlignment are set to Fill, which expands the image to the full size of the ImageView.  In order to switch the chat bubble from a left to a right chat, the imageSource is changed using JavaScript that checks to see if there is a “Reply to ID”.  This check is also used to adjust the padding based on if the things need to be pushed to the left or to the right.


Container {
	id: cOutterChat
	preferredWidth: Qt.mainTab.screenWidth
	layout: DockLayout {}
	leftPadding: (ListItemData.inReplyTo == "0") ? 15.0 : 40.0
	rightPadding: (ListItemData.inReplyTo == "0") ? 40.0 : 15.0
	ImageView {
		imageSource: (ListItemData.inReplyTo == "0") ?  "asset:///images/lbbmborder.amd" : "asset:///images/bbmborder.amd"
		horizontalAlignment: HorizontalAlignment.Fill
		verticalAlignment: VerticalAlignment.Fill
	}
	Container {
		id: cInnerBubble
		leftPadding: 20.0
		topPadding: 20.0
		rightPadding: 20.0
		bottomPadding: 30.0
		Label {
			minHeight: (Math.round(String(ListItemData.comment.toString()).length / 55) + 1) * 40
			text: ListItemData.comment
			textStyle {
				color: Color.White
				fontFamily: "Slate Pro"
				fontSize:  FontSize.Small
				textAlign: TextAlign.Left
			}
			preferredWidth: cOutterChat.preferredWidth - 100.0
			textFormat: TextFormat.Auto
			multiline: true
		}
	}
}

The Label has to expand in order to accommodate for multiple lines of text. Since we don’t want to use the same height regardless of the number of lines of text, we simply just calculate the number of lines and adjust the minimumHieght.  The calculation used is based on a FontSize.Small of a device with the default font.  This will not work if someone has increased their font size on their device.  This can be resolved in OS 10.2.1 with the minimum and maximum Font size restrictions, which basically lock out any device settings made by the user.

BBM_chat_ListView

Finally, to make everything work, we add the Container to a ListView that is populated from the comment data.  I populate the data in the c++ code by using a findChild for the ListView.  You can populate the ListView anyway you like, just as long as the chats are in the correct order.  And, you can change the chat bubbles, I made them match my app.

	ListView* tlvMeetupChat = Application::instance()->findChild<ListView*>("lvMeetupChat");
	qDebug() << "Setting Datamodel for lvMeetupChat";
	tlvMeetupChat->setDataModel(returnGDM);

Here is a comparison of what the Comments look like on the Meetup webpage vs the ListView

BBM Chat vs Meetup Chat

Here is the complete code for the ListView

ListView {
	id: lvMeetupChat
	objectName: "lvMeetupChat"
	listItemComponents: ListItemComponent {
		type: "item"
		Container {
			id: cMain
			layout: StackLayout {

			}
			preferredWidth: Qt.mainTab.screenWidth
			preferredHeight: 130;
			topMargin: 10.0
			bottomMargin: 10.0
			Container {
				id: cOutterChat
				preferredWidth: Qt.mainTab.screenWidth
				layout: DockLayout {}
				leftPadding: (ListItemData.inReplyTo == "0") ? 15.0 : 40.0
				rightPadding: (ListItemData.inReplyTo == "0") ? 40.0 : 15.0
				ImageView {
					imageSource: (ListItemData.inReplyTo == "0") ?  "asset:///images/lbbmborder.amd" : "asset:///images/bbmborder.amd"
					horizontalAlignment: HorizontalAlignment.Fill
					verticalAlignment: VerticalAlignment.Fill
				}
				Container {
					id: cInnerBubble
					leftPadding: 20.0
					topPadding: 20.0
					rightPadding: 20.0
					bottomPadding: 30.0
					Label {
						minHeight: (Math.round(String(ListItemData.comment.toString()).length / 55) + 1) * 40
						text: ListItemData.comment
						textStyle {
							color: Color.White
							fontFamily: "Slate Pro"
							fontSize:  FontSize.Small
							textAlign: TextAlign.Left
						}
						preferredWidth: cOutterChat.preferredWidth - 100.0
						textFormat: TextFormat.Auto
						multiline: true
					}
				}
			}
			Label {
				text: ListItemData.memberName
				textStyle.color: Color.White
				preferredWidth: cMain.preferredWidth - 30.0
				multiline: false
				textStyle.fontFamily: "Slate Pro"
				textStyle.fontSize: FontSize.XSmall
				rightMargin: 10.0
				textStyle.textAlign: (ListItemData.inReplyTo == "0") ? TextAlign.Left : TextAlign.Right
				translationX: (ListItemData.inReplyTo == "0") ? 15.0 : 5.0
			}
		}
	}
}

In App link to BBM Channel

In my last post, I announced that I now had a BBM Channel.  As I mentioned, the main reason for creating the channel was for updates on any apps that I am creating for BB10.  As part of one of the updates to my Meetup app, I wanted a direct link to the channel, so that new users could subscribe and existing users a could see what I was up to as far as app development was concerned.

I initially tried to add the link as a URL to launch from the app, but that only launches the browser and requires the user to do another step to get to the channel.  While it did open up BBM separately from the app, it felt like something that was not connected with the app.  It almost felt like one of those annoying pop-up ads.  So, I need to find a different way.

BBM Channel web

BB10 offers Invoke access for built-in apps.  Basically, you tell the Invoke manager what application you want to open, pass in some data and the application is launched.  BBM Channels is part of BBM and is handled like BBM with a Pin to identify the channel.  This means it is handled just like calling up a BBM user by Invoking BBM and passing in the Pin. And, even though BBM Channels is new, there is a call for opening up a BBM Channel. An issue I ran into, was calling it from the place I wanted to call it from.  I had created an Application menu (swipe down menu) that allows five spots.  The plan was to combine the Privacy Policy and the Change Log into one button and then add a button for launching the BBM Channel.  However, you can’t add an InvokeActionItem to the Menu Definition section that creates the Application menu.  Which left me to adding it to an Action item on the Sheet for the Privacy Policy/Change Log.


InvokeActionItem {
	id: asBBMInvoke
	imageSource: "asset:///images/Channel-d.png"
	ActionBar.placement: ActionBarPlacement.OnBar
	title: qsTr("BBM Channel")
	query {
		invokeTargetId: "sys.bbm.channels.card.previewer"
		invokeActionId: "bb.action.OPENBBMCHANNEL"
		uri: "bbmc:C004DD717"
	}
}

And, because it is a Invoke, it opens the BBM within the application.  The “back” button presented takes the user back to the application.  Since this still allows the user to subscribe and then see what is on the channel, I’m not too worried about it.

BBM Channel Feed BBM Channel ProfileBBM Channel Sheet

Also, as you can see in the screen shot.  Instead of launching the browser in order to display the Privacy Policy and Change Log, I am just using a WebView and passing in the URL. This keeps the user in my application, while still giving me the flexibility to change the HTML for those two pages at any time without needing to update the application itself.

DeanLogic now has a BBM Channel

BlackBerry has been trying to get back its mobile market share. Part of this strategy was to create BlackBerry Messenger (BBM) for Android and Apple.  BBM is probably the best messenger app out there, but due to Android and Apple’s increased popularity, BBM has fallen in popularity.  However, even before the official release, BBM on Apple and Android definitely has a demand.  BlackBerry wasn’t going to just keep the old BBM either.  For BlackBerry users, they added Voice and Video chat over Wi-fi.  And then for the BB10 phones, they added Screenshare through BBM.  As an IT person and an app developer, this is a very valuable feature, because user sometimes can’t explain what they are doing when an error happens.  Sometimes it just isn’t an error, but the user not doing what they are supposed to be doing.  Now, the latest addition to BBM is BBM Channels, which is what happens when “Twitter, Pinterest and Facebook have a love child”.  BBM Channels also the channel owner to post 400 character messages, with or without photos.  Anyone can subscribe to the channel and get updates in their BBM when things are posted to the channel.  And beyond the posts, the channel can also have chats for discussion.  I believe that the end goal for BBM Channels is for BlackBerry to create another revenue stream as companies and businesses create channels for people to subscribe.  And since everyone (except Windows) can now get BBM, the user base is huge.

After I did some updates to my Meetup for BlackBerry 10 app, I created a BBM Group for support.  When anyone emailed me a question about the app, I sent them a request to join the group.  I would also have to send them a personal request to BBM them directly.  With the channels, I can just broadcast updates about my apps to anyone who has subscribe to the channel and people can subscribe by simply clicking on a link or entering the PIN number.

The url for connect to BBM pins is “http://www.pin.bbm.com/” +  plus your channel pin “C004DD717″.  There are a couple of steps, because it goes to BlackBerry’s site and then asks you to open it in either your existing BBM app or to download the latest one.

The channel also provides a QR code, just like a regular BBM account, so if someone is standing next to you, they can scan your QR code to subscribe to the channel.  And of course, if someone is a BBM contact, you can invite them to your channel directly.DeanLogic channel QR

I plan on using the channel for updates for the app, but I will probably also link to blog post like these in the channel.  Can’t hurt with driving traffic to my blog.  I has to create a new logo for m site, because I lost the files for the old one.  It took a little while to get the light bulb right and I’ll probably mess around with it again in the future, since I now of the Photoshop files.  As part of the channel, I added the icon for the Meetup for BlackBerry 10 app.  I plan to add any other icons for the next apps that I release as well.  So, now I need to get back to working on the apps.

DeanLogic channel logo

Dynamic Navigation Pane Push Pages

That is somewhat of a tongue twister and it all came about because of a question on a forum.  The CrackBerry.com forums has a section for new developers, which is always a nice thing to have.  The poster is apparently trying to create an app to serve up radio stations (I think) and he wants to provide a Page for each station and also provide the list of stations through an xml file.  On the main page, he wants to display a ListView with links to the secondary Pages.

Normally, I would just create ComponentDefinition for each Page and then Push the Page by calling that definition.

Something like this.

NavigationPane {
id: nav
Page {
titleBar: TitleBar {
title:  qsTr(Qt.pageTitle) + Retranslate.onLocaleOrLanguageChanged
}
Container {
ListView {
id: mainList
dataModel: XmlDataModel {source: "main.xml"}
listItemComponents: [
ListItemComponent {
type: "item"
StandardListItem {
title: ListItemData.title
description: ListItemData.text
imageSource: ListItemData.image
}
}
]
onTriggered: {
nav.push(myOtherPageDef.createObject());

}
}
}
}
attachedObjects: [
// Definition of the second Page, used to dynamically create the Page above.
ComponentDefinition {
id: myOtherPageDef
MyOtherPage{}
}
]
}


 

 

Doing it this way helps when trying to pass things from the main navigation to and fro from the pushed Pages.  But the original poster had other ideas on what he wanted to do and it helped me figure out another way to push Pages.

The key to pushing the Page is still the ComponentDefinition.  But, since the actual Page isn’t defined in the Component Definition, that needs to be added before the ComponentDefinition is created.  The file name of the Page, plus title and image icon is contained in the xml file.  The xml file is the datasource for the ListView on the main page.

<root>
<item title="Choose a station"    image="asset:///images/ic_add_entry.png" file="DetailsPage.qml" />
<item title="Social" text="Don't be anti-social" image="asset:///images/ic_add.png"    file="SubDetailsPage.qml" />
<item title="About this App" image="asset:///images/ic_all.png" file="About.qml" />
</root>

 

When the item on the ListView is selected (onTriggered), you can find the items information, which are returned as strings.  Another dynamic option the poster wanted was to set the Page title to the name of the one selected.  The easiest way to do this is to set a Qt variable (Qt.pageTitle), which can be called by the page that is pushed.

var chosenItem = dataModel.data(indexPath);
Qt.pageTitle = chosenItem.title;

From this information, it is simple as setting the source for the blank ComponentDefinition and then doing the push and create.


chosenPage.source = chosenItem.file;
nav.push(chosenPage.createObject());

Of course, the qml Page that is being pushed has to exit in the Asset folder, which goes back to my original point about creating a ComponentDefinition for each Page.  However, in this case, since there are so many Pages for this project, doing this dynamically is probably a better method, since you only need one ComponentDefinition.

The poster also wanted to set the Station Page to have a dynamic list of Stations.  This works exactly the same way, but you don’t need the NavigationPane, since that already exists in the main.qml.

main.qml


import bb.cascades 1.2

NavigationPane {
id: nav

Page {
titleBar: TitleBar {
// Localized text with the dynamic translation and locale updates support
title: qsTr("Welcome") + Retranslate.onLocaleOrLanguageChanged
}
Container {
ListView {
id: mainList
dataModel: XmlDataModel {source: "main.xml"}
listItemComponents: [
ListItemComponent {
type: "item"
StandardListItem {
title: ListItemData.title
description: ListItemData.text
imageSource: ListItemData.image
}
}
]
onTriggered: {
// When an item is selected, we push the recipe Page in the chosenItem file attribute.
var chosenItem = dataModel.data(indexPath);
Qt.pageTitle = chosenItem.title;

// Set the correct file source on the ComponentDefinition, create the Page, and set its title.
chosenPage.source = chosenItem.file;
nav.push(chosenPage.createObject());

}
}
}
}
attachedObjects: [
// Definition of the second Page, used to dynamically create the Page above.
ComponentDefinition {
id: chosenPage
}
]

onPopTransitionEnded: {
// Destroy the popped Page once the back transition has ended.
page.destroy();
}
}

 

Dynamic Context Menu and the Period

While I am still slowly working on my Meetup for BlackBerry 10 app, I decided to do a “quick” app that handles shopping lists.  This was suggested by a user on the Crackberry.com Forum.  He wanted a basic shopping list that he could easily move regularly bought items to a buy list and check of the items when he purchased them.  He also wanted to be able to move items on the list, but that will be another post (if I get it working).

I decide to keep things really easy and only do a single page for the entire app with a sheet for editing the list items. Since there would be different context menu options based on whether it was the Master or Buy list, I need to figure out a way to change the menu based on which list was loaded.  Each list is created from the same tables by calling the list ID to get the correct items.  Also, the lists are sorted and grouped differently for each view.  The Master list is grouped by the first ItemGrouping::ByFirstChar and the Buy list is ItemGrouping::None.  I also had to make sure that the sort key was unique for each list, since the Master would be alphabetical and the Buy list is by the item position.

List context menus are created using ActionSet and ActionItem to define the menu.  For what I needed to do, the ActionSet would have to be built each time the list changed.  The easy part was to call the C++ code to update the ListView each time the button was clicked.  And from the code in the documentation, I could easily create each of the ActionItems to represent the menu actions.

Here is an example of how to specify ActionSet objects, in C++:

</pre>
<div class="container">ImageView* imageView = ImageView::create("john.png");
ActionSet* actionSet = ActionSet::create()
.title("Email")
.subtitle("From: John Doe")
.add(ActionItem::create().title("Reply"))
.add(ActionItem::create().title("Forward"));
imageView->addActionSet(actionSet);</div>
<pre>

The action item has a title and an image, and it’s created using the builder pattern.

 

ActionItem* aItem = ActionItem::create()
.title("myActionTitle")
.image(Image("asset:///myImage.png"));

 

While the documentation showed how to create an ActionItem with a Title and an Image, it didn’t show how to do something when the menu option was triggered.  This stumped me for a while and I even tried to create AttachedObjects to define the ActionSets and the dynamically added them to the ListView, but that wasn’t working either.  So, I put up a question on Developer Forum and one of the developers there reminded me of hitting the period to see more things that can be done. [face palm]

So, with that little issue solved, it was just a matter of triggering something either on the QML or C++ side.  Since I was doing screen updates, I found it easier to use a Signal than a Slot, which can easily be connected to QML Javascript functions.

First I create each ActionItem


ActionItem* aiItemDone = ActionItem::create().onTriggered(this, SIGNAL(onItemDone()));
aiItemDone->setTitle(QString("Item Done"));
aiItemDone->setImage(Image("asset:///images/ic_done.png"));

And then I add them to the ActionSet based on the list.  And finally attach it to the ListView.


ActionSet* actionSet = ActionSet::create()
.title("Modify Item");
if(master) {
actionSet->add(aiEditItem);
actionSet->add(aiDeleteItem);
actionSet->add(aiAddItem);
} else {
actionSet->add(aiEditItem);
actionSet->add(aiDeleteItem);
actionSet->add(aiRemoveItem);
actionSet->add(aiMoveItemUp);
actionSet->add(aiMoveItemDown);
actionSet->add(aiItemDone);
}
ListView* tlvcListView = Application::instance()->findChild<ListView*>("lvMasterList");
if(tlvcListView) {
tlvcListView->removeAllActionSets();
tlvcListView->addActionSet(actionSet);
}

The final results is using one ListView for two lists with two different context menus.

DynamicContextMenus

Release 1.1.1 look at the download reports

I did a small update to fix an issue with the OAuth Token expiring while the app was working. When the user enters the app from being closed, it updates (sometimes it requires a user action). I would prefer to get this fixed that after the initial authentication, any other update will go automatically.

I also fixed the pinch to zoom method of looking at the pictures and added an email feedback in the app menu. I added the email feedback because I got another review stating that the app didn’t work on a Z10. With no way of contacting the reviewer, I figured the next best thing was to provide a way for users to contact me directly with their issues. I did get a review after the update from a Z10 user that said it does work. So, I don’t know what the issue is.

Anyway, this wasn’t a big update, so this release was 1.1.1 (build 2, because I had to remove “BB10″ on the splash screen and replace it with BlackBerry 10)

Looking at my download report-meetupforblackberry10-11jan_marks.png

The chart does show that I am stilling getting new users since the last update. It looks like I have about 200 users, even thought there are a lot more downloads of the app. The spread is still over over the place. I am amazed at the different locations that are downloading the app. I just hope it works with all the different languages.

I also had one of these listed
Porsche Design P9982 10.2.0 T-Mobile US

Hopefully I can get more features added soon and get to the point of adding an in app purchase to see how that will work.