Monday, January 16, 2017

Use Tasker to Notify when your Tethered Devices lose Internet Access

From the last article, you know that I spend quite a bit of my time on a train. It's an excellent time to write an article or two, provided I have access to the Internet to look up facts and ideas. Tethering can be tricky on the train, as reception-less areas are scattered across my route. I find it quite easy to tell that I'm about to go offline when I'm in a tunnel, but the situation is less apparent when the train cruises through the open meadows of North Yorkshire. Android's built-in tethering solution doesn't have any way to let you know that you are not going to be able to load that website for the next 5 minutes.

That's why, as a Tasker aficionado, I thought about how to solve my problem using the popular Android automation app. I've solved my problem by building a tethering 'no network' warning using Tasker. The aim of the project is to let you know when your phone no longer is in cellular network range. This will be done in 3 ways:

  • Using notification LED (best for when you tether for friends)
  • Using a smartphone icon (needs a smartwatch)
  • Using a Join push (best for personal devices -can be replaced with AutoRemote)

You can get more creative with notifications, however, I will use only discrete options as tethering is most likely to be used in public places. No one likes obnoxious notifications, right? Please bear in mind that the notifications will use an internet connection to show up on the connected device. You could use AutoRemote (via Bluetooth) to send out warnings when the network is not present. This will require the device in question to be paired via Bluetooth.

You will need:
Android version: 4.0+, Android 7.0 needed for the notification tile
Apps: Join
Plugins:  AutoWear (optional), AutoRemote (can replace Join), AutoNotification (optional)


Enable a tethering 'no network' warning with Tasker

Instead of checking if tethering is enabled, it's easier to replace a tile in the status bar with AutoNotification and set up a toggle behavior. If you are not on Android 7.0 you can use a shortcut or a widget instead.

If you have never enabled a tile with AutoNotification – you will see that this is a bit awkward. You will need to create a setup task which will convert a template tile into a tile of our choice. Place an empty tile, i.e. AutoNotification 02 onto the tiles area (click edit to edit the visible tiles).

Create a Tethering tile

Tethering tile

  Tile Setup          A1: AutoNotification Tiles [ Configuration:Tile: 2  Command: hotspottoggle  Label: Hotspot  Icon: android.resource://net.dinglisch.android.taskerm/hd_aaa_ext_signal  State: 1  Require Unlock: false  Hide Notifications: true Timeout (Seconds):60 ]           A2: Variable Set [ Name:%HotspotVariable To:0 Recurse Variables:Off Do Maths:Off Append:Off ]           A3: Variable Set [ Name:%HotspotDialog To:0 Recurse Variables:Off Do Maths:Off Append:Off ]  

You will only need to run this once to set up the tiles and variables. The tile will use a command hotspottoggle to change the state of tethering and will set it as inactive. It will also collapse the status bar once pressed. You can dress up the tile with a label of your choice and the icon.

Two more variables will be created and set to 0. %HotspotVariable will display the status of the tether (0 = no, 1 = yes) and %HotspotDialog will display a dialog asking us what device we want to notify (0 = do not show, 1 = show dialog).

Tethering toggle

Tethering toggle

  Hotspot Toggle           A1: Variable Add [ Name:%HotspotDialog Value:1 Wrap Around:2 ]           A2: AutoNotification Tiles [ Configuration:Tile: 2  Command: hotspottoggle  Label: Hotspot  Icon: android.resource://net.dinglisch.android.taskerm/hd_aaa_ext_signal  State: 999  Require Unlock: false  Hide Notifications: true Timeout (Seconds):60 ]           A3: WiFi Tether [ Set:Toggle ]           A4: Perform Task [ Name:Hotspot Dialog Priority:%priority Parameter 1 (%par1): Parameter 2 (%par2): Return Value Variable: Stop:Off ] If [ %HotspotDialog ~ 1 ]          A5: Wait [ MS:0 Seconds:5 Minutes:0 Hours:0 Days:0 ]           A6: Variable Add [ Name:%HotspotVariable Value:1 Wrap Around:2 ]           A7: Variable Clear [ Name:%HotspotDevice Pattern Matching:Off ] If [ %HotspotVariable ~ 0 ]  

I want to display a dialog only when tethering is enabled. The dialog will show some devices I own and will allow me to set the target for the notifications. In each case, I will set my tethering phone to blink the notification LED rapidly each time the reception is poor.

When the tile is pressed, it changes the status to active. %HotspotDialog changes to 1 and it triggers the HotspotDialog task. While we select our device, the Hotspot profiles are armed by setting the variable %HotspotVariable to 1. When I press on a tile again to end tethering, the HotspotDialog returns to 0 and no longer prompts the dialog to be displayed, and the %HotspotVariable is set to the neutral value 0.

A1,A6

The action Variable Add +1 will change the value of our starting variables from 0 to 1 and will wrap it around 2. This means these variables will always take values of 1 or 0. The action placement is relevant as well, as the %HotspotDialog will control when the dialog is displayed. We are running the same task to disable and enable the tethering, but we don't want the dialog to appear each time we toggle it.

A7

While we are at it, if the task is performed to disable the tether (%HotspotVariable = 0), we want to clear the variable that stores the name of the device which gets notified by the Hotspot Dialog task.

A5

The Wait action is added to prevent the information about poor range from being displayed straight away which may happen when the hotspot setting is toggled.

A3

Simply toggle the WiFi tether action. Nothing complicated about this step.

A4

A separate task is displayed to show the AutoTools Dialog and action for the choice I've made. This will run when our dialog controlling variable %HotspotDialog = 1.

A2

When the toggle is pressed, we want to make sure that the tile toggles the state active/inactive and retains the same command: hotspottoggle. Lastly, make sure it will collapse the status bar.

Hotspot Dialog

Hotspot dialog

  Hotspot Dialog           A1: AutoTools Dialog [ Configuration:Dialog Type: List  Title: Enable poor network notification?  Icon: /storage/emulated/0/Tasker/Material Icons/ic_wifi.png  List Type: 1  Texts: Tablet,Mobile,Computer,Watch,Laptop  Text Size: 20  Images: /storage/emulated/0/Tasker/Material Icons/ic_tablet-1.png,/storage/emulated/0/Tasker/Material Icons/ic_cellphone_android-1.png,/storage/emulated/0/Tasker/Material Icons/ic_desktop_mac-1.png,/storage/emulated/0/Tasker/Material Icons/ic_watch-1.png,/storage/emulated/0/Tasker/Material Icons/ic_laptop-1.png  Image Width: 50  Dim Background: true  Number Of Columns: 3  Top Margin: 16  Bottom Margin: 16  Bottom Buttons Top Margin: 16  Bottom Buttons Bottom Margin: 16  Close On Select: true  Separator: ,  Command Variable: atcommand  Cancelable: true  Turn Screen On: true Timeout (Seconds):60 ]           A2: Variable Set [ Name:%HotspotDevice To:%attext Recurse Variables:Off Do Maths:Off Append:Off ]   

The AutoTools dialog is used to display available devices. When the device is selected, dialog will close and set the value of the %HotspotDevice to the name of that device. This variable gets cleared each time the tethering is stopped.

Poor reception/No data

Poor reception/No data profiles

I have created 2 profiles which will check the signal strength and the Internet connection. Each one is controlled by the variable %HotspotVariable and is only active when tethering is enabled. Both profiles will trigger the same task when activated and deactivated. One contains the state context – signal strength –  and the other the mobile network. Ideally, the connection will be still present when the notification is issued. This is why I'm including the signal strength set to 1 in the profile condition.

Poor Signal

Poor signal

  Profile: Poor Reception (91)          State: Variable Value [ %HotspotVariable ~ 1 ]          State: Signal Strength [ From:0 To:1 ]  Enter: PoorSignal (89)                    A1: AutoNotification [ Configuration:Use HTML: false  Title: Poor reception  Icon: android.resource://net.dinglisch.android.taskerm/hl_device_access_network_cell  Status Bar Icon: device_access_network_cell  Status Bar Text Size: 16  Id: 55  Priority: -1  Persistent: true  Is Group Summary: false  LED Color: red  LED On: 300  LED Off: 30p  Skip Picture Cache: false  Update Notification: false  Only on Phone: true Timeout (Seconds):20 ]                     A2: Join Send Push [ Configuration:Device: Chrome@Laptop  Text: Poor range  Title: Poor reception  Icon: /storage/emulated/0/Tasker/Material Icons/ic_wifi.png Timeout (Seconds):60 ] If [ %HotspotDevice ~ Laptop ]                    A3: Join Send Push [ Configuration:Device: Chrome@Home  Text: Poor range  Title: warning  Icon: /storage/emulated/0/Tasker/Material Icons/ic_wifi.png Timeout (Seconds):60 ]                     A4: Join Send Push [ Configuration:Device: Tablet  Text: Poor range  Icon: /storage/emulated/0/Tasker/Material Icons/ic_wifi.png Timeout (Seconds):60 ] If [ %HotspotDevice ~ Tablet ]          A5: AutoWear App [ Configuration:Execute Now: true  Trigger Event: true  Haptic Feedback: true  Name: App  AutoWear Elements: Show  AutoWear Element Id: poorrange  Turn Screen On: true Timeout (Seconds):60 ] If [ %HotspotDevice ~ Watch ]    Exit: Cancel (90)          A1: AutoNotification Cancel [ Configuration:Id: 55  Cancel All: false Timeout (Seconds):0 ]           A2: AutoWear App [ Configuration:Execute Now: true  Trigger Event: true  Haptic Feedback: true  Name: App  AutoWear Elements: Hide  AutoWear Element Id: poorrange  Turn Screen On: true Timeout (Seconds):60 ] If [ %HotspotDevice ~ Watch ]    Profile: No Data (92)          State: Variable Value [ %HotspotVariable ~ 1 ]          State: Mobile Network [ 2G:On 3G:Off 3G - HSPA:Off 4G:Off ]  Enter: PoorSignal (89)                    A1: AutoNotification [ Configuration:Use HTML: false  Title: Poor reception  Icon: android.resource://net.dinglisch.android.taskerm/hl_device_access_network_cell  Status Bar Icon: device_access_network_cell  Status Bar Text Size: 16  Id: 55  Priority: -1  Persistent: true  Is Group Summary: false  LED Color: red  LED On: 300  LED Off: 30p  Skip Picture Cache: false  Update Notification: false  Only on Phone: true Timeout (Seconds):20 ]                     A2: Join Send Push [ Configuration:Device: Chrome@Laptop  Text: Poor range  Title: Poor reception  Icon: /storage/emulated/0/Tasker/Material Icons/ic_wifi.png Timeout (Seconds):60 ] If [ %HotspotDevice ~ Laptop ]                    A3: Join Send Push [ Configuration:Device: Chrome@Home  Text: Poor range  Title: warning  Icon: /storage/emulated/0/Tasker/Material Icons/ic_wifi.png Timeout (Seconds):60 ]                     A4: Join Send Push [ Configuration:Device: Tablet  Text: Poor range  Icon: /storage/emulated/0/Tasker/Material Icons/ic_wifi.png Timeout (Seconds):60 ] If [ %HotspotDevice ~ Tablet ]          A5: AutoWear App [ Configuration:Execute Now: true  Trigger Event: true  Haptic Feedback: true  Name: App  AutoWear Elements: Show  AutoWear Element Id: poorrange  Turn Screen On: true Timeout (Seconds):60 ] If [ %HotspotDevice ~ Watch ]    Exit: Cancel          A1: AutoNotification Cancel [ Configuration:Id: 55  Cancel All: false Timeout (Seconds):0 ]           A2: AutoWear App [ Configuration:Execute Now: true  Trigger Event: true  Haptic Feedback: true  Name: App  AutoWear Elements: Hide  AutoWear Element Id: poorrange  Turn Screen On: true Timeout (Seconds):60 ] If [ %HotspotDevice ~ Watch ]  

The AutoNotification notification is created on the phone, but only to make the LED blink. Choose the other values of the notification to your personal liking and set fast LED blink (mine is 300ms on/off) in your preferred color. The idea is to display discrete information rather than a fully invasive alert when the screen wake. The notification is saved as a permanent notification with ID 55.

What follows next is a Join push for each device you own. Select a Join push for each device, and use the IF condition to match the value of %HotspotDevice variable.

Configure the Join push action to send a notification of your choice. Since these notifications will be dismissed on the target device, no other actions are needed.

SmartWatch

Smartwatch profile

  Profile: Remove Watch Icon           Event: AutoWear Command [ Configuration:Command Filter: closepoorrange  Case Insensitive: false  Exact: true  Regex: false  Variable Array: false ]  Enter: Close WearIcon (55)          A1: AutoWear App [ Configuration:Execute Now: true  Trigger Event: true  Haptic Feedback: true  Name: App  AutoWear Elements: Hide  AutoWear Element Id: poorrange  Turn Screen On: true Timeout (Seconds):60 ]   

You will notice that I have changed the way the notification works for the smartwatch. None of the above will show up on my watch. The only thing I want to show on my watch is a small icon which can be dismissed on request.

Create an icon using AutoWear Manage Floating Icons *(you have to go to the AutoWear app) and test the size and placement on your watch. The icon will draw over any screen, so make sure it contain a command on tap to close it. I used closepoorrange and named the icon poorrange. The size of my icon is 30×30 pixels and it is placed 65% to the right and 20% from the top.

Once you are happy with the size and location – use the AutoWear App action to show the icon and the IF condition to link it to the %HotspotDevice variable.

Cancel

Cancel

  Cancel (90)          A1: AutoNotification Cancel [ Configuration:Id: 55  Cancel All: false Timeout (Seconds):0 ]           A2: AutoWear App [ Configuration:Execute Now: true  Trigger Event: true  Haptic Feedback: true  Name: App  AutoWear Elements: Hide  AutoWear Element Id: poorrange  Turn Screen On: true Timeout (Seconds):60 ] If [ %HotspotDevice ~ Watch ]  

To end the LED blink and remove the floating icon from the watch, I'm going to use a simple AutoNotification Cancel action with the ID of my notification (55) to perform the AutoWear App action which hides the floating icon.

The smartwatch has an additional profile that will remove the floating icon if the icon is pressed. To do this I use the AutoWear Command event 'closepoorrange' then I run a separate task that contains pretty much the same action as the Cancel task.


We hope you enjoy this little creation of ours, and let us know if you think we can make any enhancements! As always, you can download the project by clicking the link below.

Download the Tethering 'No Network' Warning Project File here!

In order to import the tethering 'no network' warnings with Tasker project file, download the above file and save it anywhere in your internal storage. Open up Tasker and check to make sure that "beginner mode" is disabled in the preferences menu. Then, long-press on the "home" icon in the bottom left hand corner and click on "import". Find the prj.xml file you saved earlier, and select it to import it. You will now see a new tab in the bottom row containing all of the profiles and tasks we referenced in this article.



from xda-developers http://ift.tt/2jsjA9l
via IFTTT

No comments:

Post a Comment