Just a little announcement: ABMaterial finally got its own domain abmaterial.com! My brainchild is moving out…
Just a little announcement: ABMaterial finally got its own domain abmaterial.com! My brainchild is moving out…
So, what happened to 1.09, 1.10 and 1.11?
Version 1.09 does not exist. I’ve changed it to 1.10 so I can use the major number as the main release update and the minor number for maintenance releases. e.g. maintenance releases for 1.10 are 1.11,1.12, etc… The next big release is 1.20.
Highlights of the releases:
All components are fully dynamic
In a ‘static’ page, all the components are written in the .html file. In a ‘dynamic’ page they are not. Only when you connect as a user, the components are inserted in their browser.
New component ABMTimeLine
ABMTimeline is a component to present a time line of events. Using the ABMTimeLineElement you can create events, with some assets like images.
New component ABMFlexWall
ABMFlexWall is a simple galarie component for images. Together with the IsMaterialBoxed=true setting, it creates an easy to use image wall.
Speed, the need for speed…
Following all the guidelines of Google, ABMaterial is one of the fastest framesworks around. Not only in time of development, but this is certainly the case for the user experience. And all done in the background for you!
Firebase Auth and Storage support (1.20)
ABMaterial is always on top of new technologies. Latest in line is support of Googles Firebase API. You can use Firebase Auth to login to your ABMaterial (1.20) WebApp and with Storage, you can upload/download files with ease. Together with B4X Firebase support, you can build the most powerful apps ever.
New components ABMSVGSurface, ABMFileInput, ABMTableMutable and ABMPatternLock (1.20)
Always on the move, new components are introduced with every release. Donators can find more info on these new components in their mail. More on this blog when 1.20 is released to the public.
Until next time!
Bots are the next hot thing in 2016! So in my spare-spare time I’ve been working on a wrapper for the Telegram API v2.0. It has a rather unconventional API but I’m reworking it to make it very easy to write bots in B4J.
Bots could be very useful as yet another way to ‘talk’ with IoT devices. You can control LEDs, temperatures, ask for stats etc right from within the Telegram Chat App (which runs on about every kind of platform, being the desktop, a browser, iOS, Android, etc…). Or you can, like I did to test the wrapper, write a little game:
Note: this library is in very early stages so the wrapper is not available for download yet. Full source code of the game will also be available when released.
Some sample code to show you how easy it is to write a bot in B4J (this is not the game code, just some tests):
Code to initialize the library:
Sub Process_Globals Dim ABT As ABTelegram End Sub Sub AppStart (Args() As String) Dim b As MyBot b.Initialize ABT.RegisterLongPollingBot(b.Bot) StartMessageLoop End Sub
Code for the Bot:
'Class module Sub Class_Globals Dim ABT As ABTelegram Public Bot As ABTLongPollingBot Private botToken As String = "207189xxxx:yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy" Private botUserName As String = "zzzzzzzzzBot" 'Private callbackCounter As Int End Sub 'Initializes the object. You can add parameters to this method if needed. Public Sub Initialize Bot.Initialize("Bot", Me, botToken, botUserName) Dim upds As List = Bot.botgetUpdates For i = 0 To upds.Size - 1 Dim upd As ABTUpdate = upds.Get(i) Log("Go update: " & upd.UpdateId) Next End Sub Sub Bot_UpdateReceived(update As ABTUpdate) Log("Got an update") If update.hasMessage Then Dim msg As ABTMessage = update.GetMessage Log("Message: " & msg.Text) ' Dim userPhotos As ABTUserProfilePhotos = Bot.BotGetUserProfilePhotos(msg.Chat.id) ' Log("photos: " & userPhotos.TotalCount) ' Dim Photos As List = userPhotos.Photos ' For i = 0 To Photos.Size - 1 ' Dim photoSizes As ABTPhotoSizes = Photos.Get(i) ' For j = 0 To photoSizes.Sizes.Size - 1 ' Dim photoSize As ABTPhotoSize = photoSizes.Sizes.Get(j) ' Dim photoFile As ABTFile = Bot.BotGetFile(photoSize.FileId) ' Log(photoFile.FilePath) ' ' Dim job1 As HttpJob ' job1.Initialize("Job" & j, Me) ' job1.Tag = photoFile.FilePath.Replace("photo/", "") ' ' Dim url As String = "https://api.telegram.org/file/bot" & botToken & "/" & photoFile.FilePath ' job1.Download(url) ' Next ' Next ' callbackCounter = callbackCounter + 1 ' Bot.BotSendMessageAsync(callbackCounter, msg.ChatId, "Alweer hallo " & msg.Chat.FirstName) Bot.BotSendMessage(msg.ChatId, "Using an Emoji " & ":grinning: in the message!") ' see https://github.com/vdurmont/emoji-java for a list of emojis ' Bot.BotSendPhoto(True, msg.ChatId, File.DirApp & "/" & "telegram.png") ' callbackCounter = callbackCounter + 1 ' Bot.BotSendDocumentAsync(callbackCounter, True, msg.ChatId, File.DirApp & "/" & "mydocument.pdf", "mydocument.pdf") ' Bot.BotSendDocument(True, msg.ChatId, File.DirApp & "/" & "mydocument.pdf", "mydocument.pdf") Bot.BotSendAudio(True, msg.ChatId, File.DirApp & "/" & "myaudio.mp3") ' Bot.BotSendVideo(True, msg.ChatId, File.DirApp & "/" & "myvideo.mp4") ' Bot.BotSendSticker(True, msg.ChatId, File.DirApp & "/" & "mysticker.webp") ' Bot.BotSendContact(msg.ChatId, "+32496000000", "Alain") ' Bot.BotSendChatAction(msg.ChatId, ABT.CHATACTIONTYPE_TYPING) ' Bot.BotSendLocation(msg.ChatId, 50.8492, 2.8779) ' Bot.BotSendVenue(msg.ChatId, 50.8492, 2.8779, "my venue", "Grote markt 1") Bot.BotSendVoice(True, msg.ChatId, File.DirApp & "/" & "telegram.ogg") ' Dim keyb As ABTReplyKeyboard ' Dim rows As List ' rows.Initialize ' Dim tmpRow As ABTInlineKeyboardRow ' tmpRow.Initialize ' tmpRow.AddButton("test button", "http://one-two.com", "", "") ' rows.Add(tmpRow) ' keyb.InitializeAsInlineKeyboardMarkup(rows) ' Bot.BotEditMessageTextEx(msg.ChatId, msg.MessageId, 0, "Extended test", ABT.PARSEMODE_HTML, False, keyb) Dim rkeyb As ABTReplyKeyboard rkeyb.InitializeAsForceReplyKeyboard(False) Bot.BotSendMessageEx(msg.ChatId, "some test: reply please", ABT.PARSEMODE_HTML, False, False, 0, rkeyb) ' Dim rkeyb2 As ABTReplyKeyboard ' Dim rows2 As List ' rows2.Initialize ' For i = 1 To 100 ' Dim tmpRow2 As ABTKeyboardRow ' tmpRow2.Initialize ' tmpRow2.AddButton("Press me") ' rows2.Add(tmpRow2) ' Next ' rkeyb2.InitializeAsReplyKeyboardMarkup(rows2,False, False, False) ' Bot.BotSendMessageEx(msg.ChatId, "some test: press the button", ABT.PARSEMODE_HTML, False, False, 0, rkeyb2) ' Dim rkeyb3 As ABTReplyKeyboard ' Dim rows3 As List ' rows3.Initialize ' Dim tmpRow3 As ABTInlineKeyboardRow ' tmpRow3.Initialize ' tmpRow3.AddButton("Show image", "", "showimage", "") ' rows3.Add(tmpRow3) ' ' rkeyb3.InitializeAsInlineKeyboardMarkup(rows3) ' Bot.BotSendMessageEx(msg.ChatId, "some test: press the button", ABT.PARSEMODE_HTML, False, False, 0, rkeyb3) End If If update.hasCallbackQuery Then Dim cquery As ABTCallbackQuery = update.GetCallbackQuery Log("CallbackQuery: " & cquery.data) Select Case cquery.Data Case "showimage" Dim msg As ABTMessage = cquery.Message Bot.BotSendPhotoEx(True, msg.ChatId , File.DirApp & "/" & "myphoto.jpg", "A new photo of darth vader!",False, 0, Null ) Bot.BotSendLocation(msg.ChatId, 50.8492, 2.8779) Bot.BotEditMessageText(msg.ChatId, msg.MessageId, "", "Shown") End Select End If If update.hasInlineQuery Then Dim ciquery As ABTInlineQuery = update.GetInlineQuery Log("InlineQuery: " & ciquery.Query) If ciquery.Query = "loc" Then Dim lstResults As List lstResults.Initialize Dim myanswer As ABTInlineQueryResult myanswer.InitializeAsLocation("1", 50.8492, 2.8779, "Your location") lstResults.Add(myanswer) Bot.BotAnswerInlineQuery(ciquery.Id, lstResults) End If End If If update.hasChosenInlineResult Then Dim ccresult As ABTChosenInlineResult = update.GetChosenInlineResult Log("ChosenInlineResult: " & ccresult.Query) End If End Sub Sub Bot_AsyncSendReceived(methodType As String, callbackId As String, success As Boolean, asyncObject As ABTObject) Log("Async method: " & callbackId & " " & methodType & " " & success) If success And asyncObject <> Null Then If asyncObject.objectType="ABTMessage" Then Dim message As ABTMessage = asyncObject Log("Async callback: " & message.MessageId) End If End If End Sub Sub JobDone (Job As HttpJob) Log("JobName = " & Job.JobName & ", Success = " & Job.Success) If Job.Success = True Then Dim fSave As OutputStream = File.OpenOutput(File.DirApp, Job.tag, False) File.Copy2(Job.GetInputStream, fSave) fSave.Close Else Log("Error: " & Job.ErrorMessage) End If Job.Release End Sub
ABMaterial public version 1.07 is now available from the B4J website!
ABMGenerator object: allows generating CRUD and messagebox modal sheets fast
Given a set of parameters in a couple of lines of code, ABMGenerator can generate several hundreds of lines of B4J code that only need to be tuned by the programmer to its specific wishes.
Refer to this post for more info.
Infinite Scrolling pages (e.g. like Twitter or Facebook)
With just a couple of lines code, you can create Infinite Scrolling Pages with ABMaterial.
See this post for more info and a demo.
Support for Google Analytics
more info and a tutorial, check out this previous article.
New component ABMSocialShare
New component ABMEditor
Read the README1.07.TXT for the full release notes.
Download ABMaterial Public version 1.07
Version 1.08 is going to be all about speed! But I’ll post a seperate article on my experiences here later on this. A couple of new components off course and some new functionalities in the ABMNavigationBar. Donators should have received this version by now. (mail me if you didn’t).
Excellent news from Erel (CEO of Anywhere Software). The excellent B4X suite will support yet another platform: Arduino! Next to support for all desktop platforms, webapps, Raspberry Pi, Android and iOS this new addition is another great step from Anywhere Software towards the most simple framework to make IoT applications.
Unlike the other platforms which generate Java, B4R will generate native C. Users will be able to write their own libraries or use inline C for specific functionalities. More on this later, but make sure you check out the video!
The public version 1.06 of ABMaterial is now available from the B4J website!
Some highlights on this public release:
Theme and controls have a Colorize() method to quickly change a theme
Getting more out of the Theme system. Just by using the one single line in B4J, theme.Colorize(myColor), you can change the base color of ABMaterial. You can of course still tune it manually.
New component to let the user choose a date through a scroller. Can be used to get the date, the time or both. See the demo for more.
Alternative component to let the user choose a date/time. The date can be picked on a calendar, the time on a clock. See the demo for more.
This is just the first step in speeding up ABMaterial and the user experience both on a desktop and a mobile device. I continue searching for methods to make ABMaterial even faster!
Read the README1.06.TXT for the full release notes.
Download ABMaterial Public version 1.06
Donators will receive an email with the download link to ABMaterial 1.07 containing two new controls, ABMEditor and ABMSocialShare. A optimized TreeView and Google Analytics support is also included!
As ABMaterial is a hybrid website/webapp framework, you can use SEO (see previous article), and now even Google Analytics in the upcoming version 1.07. This article shows how you can use Google Analytics by adding just one extra line of B4J code on your page!
Note: This post is an ABMaterial adaptation of an excellent article for beginners on Google Analytics by Kristi Hines. Just to make it easier for you, I used and changed it just up to where ABMaterial comes in. At the end of this post you can then continue reading the original one for more tips and tricks.
Here are just a few of the many questions about your ABMaterial website/webapp that you can answer using Google Analytics.
There are many, many additional questions that Google Analytics can answer, but these are the ones that are most important for most website/webapp owners. Now let’s look at how you can get Google Analytics on your ABMaterial website/webapp.
First, you need a Google Analytics account. If you have a primary Google account that you use for other services like Gmail, Google Drive, Google Calendar, Google+, or YouTube, then you should set up your Google Analytics using that Google account. Or you will need to create a new one.
This should be a Google account you plan to keep forever and that only you have access to. You can always grant access to your Google Analytics to other people down the road, but you don’t want someone else to have full control over it.
don’t let anyone (your web designer, web developer, web host, SEO person, etc.) create your website’s Google Analytics account under their own Google account so they can “manage” it for you. If you and this person part ways, they will take your Google Analytics data with them, and you will have to start all over.
Once you have a Google account, you can go to Google Analytics and click the Sign into Google Analytics button. You will then be greeted with the three steps you must take to set up Google Analytics.
After you click the Sign Up button, you will fill out information for your website.
For the absolute beginner’s guide, we’re going to assume you have one website and only need one view (the default, all data view. The setup would look something like this.
Beneath this, you will have the option to configure where your Google Analytics data can be shared.
Our google account is setup and all we need now is get our Tracking ID and add it in ABMaterial.
Click the Get Tracking ID button. You will get a popup of the Google Analytics terms and conditions, which you have to agree to. Then you will get your Google Analytics Tracking ID.
In our ABMaterial app, all we have to do is add this single line to each of our pages in the BuildPage() method:
page.Initialize(Name, “/ws/appName/Name, False)
I guess it can’t get much easier, no?
If you want to go deeper into Google Analytics, I suggest reading the original article The Absolute Beginner’s Guide to Google Analytics.
ABMaterial 1.07 will be realeased in a couple of weeks for the donators. Addidtional to Google Analytics support, two new components ABMEditor and ABMSocialShare will be included, but more on this in a next article.