todo: Google Latitude Client for Maemo

I figure it’d take me four hours to create an app that, when launched gets the current location from the device (there’s a lib for that), converts it to long/lat coords and posts it to Google using the Google Latitude API (a simple RESTful service).

  1. Register for API key
  2. Register Application
  3. Get OAuth up and running (1h)
  4. Post dummy coordinates to Google Latitude (1h)
  5. Get location from the device (1h)
  6. Write authentication GUI (1h)
  7. Write application that looks for valid credentials (step 3), ask for authorization if not given already (step 6), gets location from the device (step 5) and posts it to Google Latitude (step 4)

I’d call that a day and the next day I’d look at creating a service out of this.

  1. Write application that wakes up at a certain interval (or several, more often during wake hours)
  2. Write GUI to change interval settings (or several …)
  3. Write settings storage (GConf)
  4. Write application that checks for authentication, if not present, launch GUI? (if not running) otherwise update position with Google Latitude and then sleep until next “interval”

After that, I’d call it a day and the next day:

  1. Register a new product with Maemo Garage.
  2. Post a message on the Maemo Forum.
  3. Publish “product” to Extras and wait.

All it takes is a little Python, some extra time and some patience for the Maemo community to have it’s way with QA-testing etc.

Python, Maemo, WLAN & webbrowser

Just scratched an itch with a couple of lines of Python code, which launches a browser if my cellphone (Nokia N900, Maemo 5) connects to a specific WLAN. The WLAN names to look for, as well as the URL that is opened in the browser are specified in gconf.
The itch is about WLANs with login pages/portals and is reported in Maemo bug tracker as Bug 7678.

I put the source on source.wendt.se but also “inlined” here (spaces might get truncated by WordPress):

#!/usr/bin/python2.5 

"""
This is a quick hack that launches a browser when the device connects to an IAP with a
name that is present in gconf key 

There's no fancy GUI. To set the IAP names to listen for, run:
gconftool-2 -s --type=list --list-type=string "/apps/wlan-browser-launcher/iap-names" "[limbergwendt2,CSWLAN]"

To change the URL that opens, run
gconftool-2 -s --type=string "/apps/wlan-browser-launcher/url" "http://wendt.se/ip/"

All gconf values are re-read on each connect signal.

Based on Conic examples on PyMaemo wiki by Lauro Moura [lauro .neto_indt.org.br].
"""

import conic
import dbus
import gobject
import gnome.gconf
import dbus.glib
import webbrowser

GCONF_KEY_NAMES = "/apps/wlan-browser-launcher/iap-names"
GCONF_KEY_URL = "/apps/wlan-browser-launcher/url"

iap_id_to_name = {}
names_to_look_for = []

def load_iap_id_to_name(connection):
    global iap_id_to_name
    iap_id_to_name = {}
    iaps = connection.get_all_iaps()
    for iap in iaps:
        iap_id = iap.get_id()
        iap_name = iap.get_name()
        iap_id_to_name[iap_id] = iap_name

def load_names_to_look_for():
    global names_to_look_for, url_to_open
    gc = gnome.gconf.client_get_default()
    names_to_look_for = gc.get_list(GCONF_KEY_NAMES, gnome.gconf.VALUE_STRING)
    url_to_open = gc.get_string(GCONF_KEY_URL)
    print "Looking for IAP with these names: %s" % names_to_look_for

def connection_cb(connection, event):
    global iap_id_to_name, names_to_look_for, url_to_open
    status = event.get_status()
    iap_id = event.get_iap_id()
    if status == conic.STATUS_CONNECTED:
        load_iap_id_to_name(connection)
        load_names_to_look_for()
        iap_name = 'UNRECOGNIZED'
        if (iap_id_to_name.has_key(iap_id)):
            iap_name = iap_id_to_name[iap_id]
        print "CONNECTED (%s, %s, %i)" % (iap_id, iap_name, status)
    
        if (iap_name in names_to_look_for):
            if (not url_to_open):
                print "No URL setup for gconf key %s: not launching browser" % GCONF_KEY_URL
            else:
                print "Opening browser (pointing it to %s) for IAP %s" % (url_to_open, iap_name)
                webbrowser.open_new(url_to_open)

def start():
    connection = conic.Connection()
    connection.connect("connection-event", connection_cb)
    connection.set_property("automatic-connection-events", True)
    return connection
    
def stop(connection, loop):
    connection.set_property("automatic-connection-events", False)
    loop.quit()

def check_browser():
     gc = gnome.gconf.client_get_default()
     if (gc.get_string('/desktop/gnome/url-handlers/http/command') == 'epiphany %s'):
         raise Exception('Browser in gconf invalid (see NB#136012). Installation error.')

if __name__ == "__main__":
    check_browser()
    loop = gobject.MainLoop()
    bus = dbus.SystemBus(private=True)
    
    connection = start()
    loop.run()
    stop(connection, loop)

Python and Maemo, where’s that N900

Work in progress! :)

Väntar tålmodigt på att Nokia Online Store skall skicka mig meddelande om att “nu är din beställning skickad” – i Italien verkar utrullningen vara i full gång, i Sverige har den inte börjat ännu. Senaste budet är att i vecka 50 kommer de första beställningarna skickas ut. Vet inte om jag ligger med bland dem.

Nåväl. Jag har jobbat på att få till en applikation som kan visa avgångar och resvägar inom Göteborg med hjälp av Västtrafiks web services. Det har tagit ungefär så lång tid som jag förävntat mig och följande var utmaningarna.

[flashvideo file=http://wendt.se/misc/maemo-vasttrafik-091203-a.flv width=400 height=286 /]

Python

Jag är inte överens om att block-level avgörs av indentering – vilket företag vill betala utvecklare för att sitta och flytta kod till vänster och höger? Jag programmerar mycket hellre med {} och låter ett verktyg formatera koden “vackert”.

IDE – här har jag dock varit lat. PyEclipse skall tydligen vara rätt bra och ge bra stöd (hoppas det finns code completion-stöd för gtk.* med signaler och annat?)

PyGtk (API)

Väldokumenterat. Ihop med GTK+-dokumentationen måste jag säga att det är komplett. Widget-galleriet är också kanon att kunna snegla på.

PyMaemo och Hildon

(API) Hildon C-API

Detta upplever jag vara den svagaste länken i kedjan. Att jobba med en touch-applikation är nytt för mig, och jag gissar att det gäller många andra också, och då behövs vägledning, widget gallerier och tonvis med exempel så att man kan få en känsla för hur man bör bygga bra GUI:n.

Lite vägledning finns (plus Nokias UI guide lines och usability-dokument), men widget galleri och tonvis med exempel saknas – det finns ett tiotal exempel som visar lika många widgets, men inte ett enda “riktigt” program.

Py* för Web Services

Efter att ha prövat ett par bibliotek, alla med olika tillkortakommanden (schematolkning, teckenkodning, …), så stötte jag på suds som fungerar utmärkt om man bara vill ha en väl fungerande klientdel.

PS

Screen captures with XVidCap, konverterat med

ffmpeg -y -i test-0000.mpeg -qscale 5 -an -s 400x240 -f flv test.flv

[flashvideo file=http://wendt.se/misc/maemo-vasttrafik-091203-b.flv width=400 height=286 /]