Programming

Dependency injection in Android

I am a great fan of dependency injection in Java. I have used Guice in the past, I have used Apache Tapestry that has a great implementation of dependency injection, but Spring Boot makes DI so easy to use that it surprises me that there are still projects that don’t use it.

On Android, it’s a different story. In the old days, there was Roboguice. Roboguice was based on Google’s Guice, with additions and changes to accomodate Activity and Service classes. I loved Roboguice, but changes in Android made it harder for its developers to maintain it, until they came to the point that they stopped supporting it. I switched to using Toothpick, which I like, but as so few projects use it, I abandoned it.

I also used Robolectric, a testing framework that allows you to integrate DI into your testing.

Dagger is now the DI tool of choice on Android. Dagger requires you to explicitely inject members into activities and other classes. This is a consequence of the architecture of Android that requires extending Activity and Fragment classes. Roboguice had classes like “RoboActivity”, which became cumbersome after we had FragmentActivity, AppCompatActivity and others. Also Dagger requires module classes for configuration, which are similar to Spring Boot configuration classes. Also, you need Component interfaces to allow for DI in activities etc.

The amount of boilerplate code you need for Dagger makes me think that the old Factory pattern is easier to use than Dagger. Also, Dagger comes in versions, when you read a tutorial you need to be careful if the tutorial is actually applicable for the version of Dagger that you use.

The main trouble with DI in Android is a design flaw in Android: your activities extend the Android Activity class, rather than implement an Android Activity interface. Same for Service, Fragment, etc. Activity being an interface would make life easier for DI and for developers. It would also make testing less complicated: if you use DI in tests you need a context object that you don’t have. A few years ago you could use Robolectric that creates a fake context object for you, today you can test on a device, using the device’s context.  I use DaggerMockRule to provide an application context to a test, I have different DaggerMockRules for different types of test.

If only Android had made Activity an Interface rather than a class, we could  have used a simplified version of Spring Boot DI on Android….

Programming

Experiment met nabijheid-app

Screenshot_20200503-112146In de discussies over “corona apps” heb ik een voorbeeld Android app gemaakt waarmee ik kan zien hoe gemakkelijk twee smartphones elkaar met Bluetooth (meer specifiek, met “Bluetooth Low Energy”) kunnen detecteren en bijvoorbeeld hoe goed je de afstand en de tijdsduur van de ontmoeting kunt afleiden.

Op github heb ik de source staan van die app. De app kan twee dingen: de omgeving scannen, met Bluetooth LE, op andere telefoons met deze app, en ook zichzelf zichtbaar maken voor zo’n scan. Je kunt beide functies in de app aan en uit zetten.

Verder kun je een aantal parameters zetten:

  • signaalsterkte waarmee de app zichzelf aan anderen adverteert
  • advertise mode
  • time window, dat is de tijd dat de app een aantal detecties als één contact beschouwt

Je ziet op het scherm de gedetecteerde andere telefoons, met een uniek ID per telefoon dat de app random genereert. Je kunt dat random ID zelf opnieuw genereren zodat je een nieuwe telefoon, een nieuw contact, simuleert. In een tweede scherm (swipe) zie je de verzameling ID’s die de app heeft verzameld. Je hebt dus twee telefoons nodig om dit te testen: de app detecteert alleen telefoons die dezelfde app draaien.Screenshot_20200503-112453

Je kunt aan de ontvangende kant instellen wat de drempel is voor een “detectie”:

  • hoe sterk het ontvangen signaal moet zijn en
  • hoeveel keer je de betreffende zendende telefoon hebt gedetecteerd.

Zo kun je instellen dat je een contact pas “ziet” als je het drie keer hebt gedetecteerd met minimaal -50dB. Zo’n contact wordt dan rood. Met deze app kun je experimenteren wat de juiste waarden zijn zou je de techniek willen inzetten voor detectie van “corona contacten”.

Je kunt de app hier downloaden (als je al een eerdere versie had geïnstalleerd, dan eerst de app verwijderen. Ik had een foutje gemaakt in de eerste versie waardoor een upgrade niet goed werkt). Ik geef geen garanties voor de app, het is een hulpmiddel om te experimenteren met Bluetooth LE. In het derde scherm (swipe) vind je een help scherm.

De app dient niet om “mogelijke besmettingen” op te slaan of te rapporteren. De app heeft geen verbinding met een server. Wat de app alleen doet is aangeven wanneer iemand anders met dezelfde app bij jou in de buurt is.

Blog, Programming

Een display voor je Raspberry Pi

In een vorige blogpost heb ik beschreven hoe je een Raspberry Pi kunt gebruiken als desktop computer. Nuttig in lockdown tijd, maar bovenal leuk om te knutselen. Raspberry verkoopt ook 7 inch displays voor de Pi. Dat kost €66, goedkoper dan een gewoon display.

Ook voor dat display moet je knutselen, maar dat is leuk. Je schroeft je Pi aan de achterkant op het display, je verbindt wat draadjes (zie hier) en je hebt een touch display aan je Pi.

IMG_20200412_121623

Met een toetsenbord erbij heb je nu een volwaardige computer met Debian of Ubuntu, maar wel met touch screen.

IMG_20200412_121919

 

Een goedkope oplossing voor je lockdown computer, niet het grootste display, wel het leukste geknutsel.