👁 itoo Push Notification Examples for ALL!

EXAMPLE 2

Firebase using own project, the Web component and a timer

Prerequisites:

  • a project setup on Firebase
  • in that project a node(tag), at top level, called itoo

image

  • secure rules for that node set to read:true / write:true

image
(note: I have another node setup with secure rules, this stops the firebase people bugging you about your project being insecure)

Setup:

  • with the example aia, you will need to add your firebase project url in the blocks, in two places.

Blocks

AIA (blank)

FBMessage_iToo_blank.aia (115.9 KB)

1 Like

EXAMPLE 3

CloudDB using own redis server (!important)

Prerequisites:

  • your own redis server up and running with SSL, and configured to work with the CloudDB component. See this guide on how you can do that.
  • a CloudDB component for the admin blocks

Setup:

  • enter your redis server details in the CloudDB properties in the designer (required for setting a message)

  • enter your redis server details in the blocks where indicated

  • please do not change the value for code. Code "2" is for CloudDB

Blocks

AIA

ItooCloudDB_blank.aia (115.2 KB)

Addendum

Setting up your own redis server may be somewhat onerous, if you just want to test this method out. Therefore if you do just want to test, you can setup the blocks to use the MIT provided redis server. If that is the case, in the Designer, set the RedisServer to DEFAULT, the Token will magically appear. In the blocks, replace the <YOUR REDIS SERVER ADDRESS> content with clouddb.appinventor.mit.edu, and the YOUR REDIS SERVER PASSWORD with the Token from the designer

DISCLAIMER: You should only use the MIT redis server for demo/testing purposes. Excessive or heavy use may result in your app/s being blocked. There is also no guarantee of data retention, the server data may be cleared without notice.

1 Like

EXAMPLE 4

Google Sheet and Google Form using a timer

Prerequisites

  • A google account :wink:
  • Create a simple Google Form with just one question
  • Create a Google Sheet to receive the form responses
    image
  • In your Google Sheet create a new worksheet, that using a clever formula, will return the last form response value:

    =INDEX(FormResponses1!B1:B,ARRAYFORMULA(MAX(ROW(FormResponses1!B1:B)*(--(FormResponses1!B1:B<>"")))))
    (If you want to see how the formula is constructed see this excellent youtube video)
  • Get the Sheet ID, The worksheet GID for the latest response, and the Form ID
  • Run the Pre-filled link for the Form to get the "entry" number.

Setup

  • in your blank aia project, enter the various IDs in the correct places. Do not use variable blocks.
  • enter the entry number in the position provided
  • use the admin blocks to send a new message via the form to the spreadsheet
  • the process will then poll the spreadsheet for the latest value and return it as a notification

Blocks

AIA

GSMessageiToo_blank.aia (115.8 KB)

EXAMPLE 5

PHP and http server using a timer

Prerequisites:

  • you will need an online http server, running php
  • create two php files, one to create a message, one to get the message

setMsg.php

<?php

$message = $_REQUEST['message'];

$file = '/tmp/itoofile';
$content = json_encode($message);
file_put_contents($file, $content);
$content = json_decode(file_get_contents($file), TRUE);
echo $content

?>

getMsg.php

<?php

$file = '/tmp/itoofile';
$content = json_decode(file_get_contents($file), TRUE);
echo $content

?>

The setMsg php places your message in a file on the server. The getMsg php retrieves the message from the file.

Setup:

  • enter your http server url in the two positions indicated in the block
  • using the admin blocks, setup a message on your server

Blocks

AIA

PHPMessage_iToo_blank.aia (115.6 KB)

EXAMPLE 6

PHP & MYSQL using a timer

Prerequisites:

  • An online http server set up with php and a mysql database
  • create a simple table in a new or existing database
    image
  • create two php files, one for setting the other for getting the message

setitoomessage.php

<?php
    
     require '../creds.php';

     $message = $_REQUEST["message"];

     $conn = mysqli_connect($servername, $username, $password, $dbname);

     if (!$conn) {
     die("Connection failed: " . mysqli_connect_error());
     }

     $sql = "UPDATE itooMessage SET message='$message' WHERE id=1";

     if (mysqli_query($conn, $sql)) {
       echo "Record updated successfully";
     } else {
       echo "Error updating record: " . mysqli_error($conn);
     }

    mysqli_close($conn);
?>

getitoomessage.php

<?php
    
     require '../creds.php';

    // Create connection
    $conn = mysqli_connect($servername, $username, $password, $dbname);
    // Check connection
    if (!$conn) {
      die("Connection failed: " . mysqli_connect_error());
    }

    $sql = "SELECT * FROM itooMessage WHERE id=1";
    $result = mysqli_query($conn, $sql);

    if (mysqli_num_rows($result) > 0) {
    // output data of each row
    while($row = mysqli_fetch_assoc($result)) {
      echo $row["message"];
    }
    } else {
      echo "0 results";
    }

    mysqli_close($conn);
?>

you will note I have my db credentials stored in a separate file...

SETUP

  • enter the http server url in the two positions where it is required in the blocks
  • create a message using the admin blocks

Blocks

AIA

PHPMYSQLMessage_iToo_blank.aia (115.6 KB)

SUMMARY

Well, there you are, six different ways to get push notifications running in your app, at relatively no cost.

I am slightly uncomfortable about the timer approach, because this is always calling data back to be tested in the background process, there are polling routines for php, and triggers for mysql, but integrating these would be a headache, let us keep it simple. I also considered a version for going direct to my redis server using webdis (SEE HERE), but the setup is onerous, and again, let us keep it simple. If anyone has a better solution, I am all ears.

Which one is best ?

This will all depend on your circumstances, what you may have already available, and what you consider to be free (free as in beer...). The Google Sheet/Form approach seems best on this front, but if you have your own online server, then this may be better. It will all come down to what works for you.

I ran a test on Firebase, after leaving the app running for @ 12 hours, and checked the data usage. Calculating it out, it seems that your app could make @ 1 million calls before reaching the 360mb free limit per project, so one call per user per day = 1 million users. Should be enough?

Battery usage on device?

Lots of discussion about this. I am yet to see any significant change to my device battery levels as a result of running this service, either with dataChanged or with a timer.

Support

I have assumed that you have sufficient knowledge with regarding to Google/php/mysql/Firebase to get these examples working, most questions about these web technologies will probably be off-topic, any questions therefore should be about the specifics of using these examples.

Updates
The itoo and notificationStyle extensions have now been updated for Android 14 users / API 34.

Update 2024-12-21
I have now tested with the latest itoo (v4.4) and the new melonNotification extension (v1.1). The examples continue to work but you will need to make some changes to the blocks.

For all examples, make the following changes:

Replace
image

with

image

and replace this notificationStyle block
image

with these two melonNotification blocks
image

add the melonnotification extension to your downloaded project example before removing the notificationStyle extension, so that you can see where everything needs to be replaced.

note the basic icon contains a colon at the start - ":ic_dialog_alert"

Continued thanks to @Kumaraswamy for his help and support

If any other such issues arise, then please report here or in the respective topics.

2 Likes

Thank you for the fantastic work. This has given me an idea to address the issues Android 14 users face when using iToo. We could use an Alarm Manager to periodically check for updates in the Google Sheet throughout the day and if at a certain alarm an update is available, the system would send a notification. This setup allows you to continue using Alarm Manager as usual, simply by adding a new Alarm Manager item.

1 Like

Thanks alot for your great efforts
The app crashes when i use timer only when i changed the target sdk to 34
Tested in android 14 Samsung A04s

Ensure you update your itoo and notification style extensions to the very latest version that work with API 34 and android 14. Remember, that you need to compile, this will not work with companion.

For now, use this update v4.3:

2 Likes

Example 1: App closes immediately. Device running on Android 11 and itoo version 4.3.1

Did you use the latest NotificationStyle extension as well ?

Yes
Screenshot 2024-09-16 at 4.04.24 PM
Screenshot 2024-09-16 at 4.04.16 PM

Did you use a correct url and api key?

To find out what is going on use logcat

Taifun

Yes, @Taifun. I have filled all the information. And also I will soon be debugging.

I don't get a crash, but I also do not get any response. Tested Android 12 and 14.

[EDIT - oops! forgot to build - will test again] :upside_down_face:

The original apks I created and tested are still working OK on Android 13 Pixel 4a, but if I attempt to create a new apk from the aia file, then this does not work (using either the previous extensions or the most recent), this tested on Android 12, 13 and 14.

I'll be running logcat to see what is occuring.

In the meantime test this aia project (build it first, of course), should just show that itoo and notficationStyle is working.

SimpleItooProject2 (1).aia (117.1 KB)

@husnain

All the other examples appear to work on Android 12 and 14 for me, it is just the one with the Firebase dataChanged event causing an issue. It is being investigated.

Have now figured out the problem.

Set your firebase project rules as follows:

{
  // Allow read/write access to all users under any conditions
  // Warning: **NEVER** use this ruleset in production; it allows
  // anyone to overwrite your entire database.

  "rules": {
    ".read": true,
    ".write": true
  }
}
2 Likes