Room Persistence Library

Comment

Room Persistence Library

SQLite bietet sich seit jeher als Datenbanksystem für Android an. Auch wenn mittlerweile potentere Alternativen wie die dokumentenbasierten Realm oder Firebase existieren, bildet SQLite nach wie vor den Unterboden vieler Apps. Der Zugriff auf diese SQLite-Datenbanken erfolgte über ContentValues, Cursor und Raw Queries, welche aufwendig in der Einrichtung und fehleranfällig in der Wartung sind. Aus dieser Not entstanden zahlreiche Drittanbieterbibliotheken für objektrelationale Abbildungen (Object Relational Mapping, kurz ORM) greenDao, ActiveAndroid oder SugarORM und bestehende Größen wie OrmLite wurden portiert.

Auf der diesjährigen Google I/O stellte Google mit der Room Persistence Library (Room) endlich einen hauseigenen ORM für Android vor. Durch den geschickten Einsatz von Annotationen verringert Room den Boilerplate Code auf ein absolutes Minimum und nimmt uns Entwicklern einen Heidenaufwand ab, um uns der eigentlichen Geschäftslogik unserer Apps zuzuwenden. Hierbei behalten wir den vollen Funktionsumfang von SQLite, da nach wie vor Raw Queries geschrieben werden. Diese werden im Gegensatz zum Plain SQLite zur Übersetzungszeit validiert und nicht erst zur Laufzeit, wodurch Fehler vermieden und Korrekturen vereinfacht werden. Weiterhin werden Datenbankabfragen im Background Thread forciert, um ein versehentliches Blockieren der UI zu verhindern.

Grundsätzlich setzt sich die Datenbankschicht mit Room aus drei Komponenten zusammen:

  1. Datenbank
  2. Entitäten
  3. Data Access Objects (Dao)

Die Datenbank wird mit @Database annotiert und leitet als abstrakte Klasse von RoomDatabase ab. Sie konfiguriert Datenbankversion und -namen sowie unterstützte Entitäten, Type Converter und benötigte Migrationspfade. Weiterhin dient sie als Sammelstelle für verwendete DAOs.

Entitäten werden mit @Entity annotiert und bestehen in ihrer schlanksten Form aus nicht mehr als public fields. Felder, die ignoriert werden sollen, kennzeichnen wir mit @Ignore. Für nicht-unterstützte Datentypen können Type Converter geschrieben werden, welche z. B. die DateTime aus JodaTime in ein Objekt vom Typ Long oder String umwandeln.

Data Access Objetcs werden mit @Dao annotiert und dienen als Zugriffsschicht auf die Datenbank. Für Standardaktionen wie @Insert, @Update oder @Delete muss nichts weiter als die entsprechende Annotation gesetzt werden. Abfragen werden mit @Query und einem Raw Statement definiert, welchem Parameter übergeben werden können.

Zu diesen drei Komponenten gesellt sich bei Bedarf noch das ViewModel hinzu, welches bei den neuen Lifecycle Aware Components eingesetzt wird.

Aus diesen Komponenten erstellt Room zur Übersetzungszeit die entsprechenden Implementierungen, womit der produzierte Code einsehbar aber nach wie vor komplett abstrahiert bleibt. Aktuell bereiten uns noch Generics Probleme, die wir z. B. für einen BaseDao verwenden, welcher Standardmethoden wie insert(), delete() oder findById() implementiert. Room verliert die Typparameter und kann mit dem unbekannten Typ T nichts mehr anfangen. Ironischerweise tippt uns der Compiler an der Stelle auf die Schulter und schlägt uns eine Basisklasse vor, da es scheint, als wollen wir einen BaseDao definieren. Dass unsere Implementierung exakt diesem Vorschlag entspricht, interessiert ihn nicht.

Kinderkrankheiten wie diese werden aber mit Sicherheit in den kommenden Iterationen des ansonsten bereits sehr vielversprechenden ORMs behoben. Aktuell befindet sich Room in der Alpha 1 und wird wie gewohnt, zusammen mit seinem Annotation Processor, über Gradle vertrieben:

compile "android.arch.persistence.room:runtime:1.0.0-alpha1"
annotationProcessor "android.arch.persistence.room:compiler:1.0.0-alpha1"

 

Codebeispiel:

@Database(entities = {Example.class}, version = 1)
@TypeConverters({DateTimeConverter.class})
public abstract class AppDatabase extends RoomDatabase {

    private static AppDatabase instance;

    public static AppDatabase getDatabase(Context context) {
        if (instance == null) {
            instance = Room.databaseBuilder(context, AppDatabase.class, "db_name").build();
        }
        return instance;
    }

    public abstract ExampleDao getExampleDao();
}
@Entity
public class Example {
    @PrimaryKey(autoGenerate = true)
    public int uid;
    public DateTime createdAt;
    public DateTime updatedAt;
    public String name;
}
@Dao
public interface ExampleDao {

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    public void insert(Example entity);
  
    @Delete
    public void delete(Example entity);
     
    @Query("SELECT * FROM example")
    List<Example> findAll();
}

Comment

Google I/O 2017

Comment

Google I/O 2017

Seit gestern findet die alljährliche Google I/O statt, die von Sundar Pichai mit dem Slogan "From Mobile First to AI First" eingeleitet wurde.

Google.ai ist Dreh- und Angelpunkt dieser Entwicklung. Auf dieser Plattform für künstliche Intelligenz entstehen neuronale Netzwerke, welche mittlerweile selbst in der Lage sind, eigenständig Netze zu bilden (Automatic Machine Learning). Die hierfür verwendeten Tensor Processing Units (TPU) lassen sich demnächst als Cloud-Dienst mieten, wo sie im Verbund eine erstaunliche Rechenkraft von bis zu 11,5 Petaflops erreichen. Interessenten können sich vorab hier für diesen Dienst anmelden.
Das letztjährige Buzzword Machine Learning wird dieses Jahr mit der Augmented Reality verknüpft, um unter anderem Objekte auf (Bewegt-)Bildern zu erkennen. Praxisrelevant wird diese Technologie voraussichtlich, sobald Google Lens erscheint und die Kameras unserer Smartphones mit Deep Learning ausstattet.

 
inception_we-have-to-go-deeper.jpg
 

Für Endanwender wurden der Chromecast Ultra sowie neue Virtual Reality- bzw. Daydram-Geräte vorgestellt. Neben dem LG V30, Asus ZenFone AR kündigte man auch ein Standalone-VR-Headset an, welches von Google in Zusammenarbeit mit HTC und Lenovo entwickelt wird und ohne Kabel auskommt, weil die komplette Hardware direkt im Headset verbaut ist.

Android O erhält seine zweite Preview, welche die auf der Konferenz vorgestellten Features wie Picture-in-Picture, Notification Dots, Autofill for Google und Smart Text Selection vorführt. Die Machine Learning-Bibliothek Tensorflow erhält mit Tensorflow Lite einen mobilen Ableger samt API, welcher lokal läuft und direkt ins Betriebssystem integriert wird. Android O Preview 2 ist ab sofort öffentlich erhältlich für alle Pixel- und Nexus-Geräte der letzten Generation. Eine Migrationsanleitung bereitet uns Entwickler auf die ab Juni finalen APIs und schlussendlich auf die im Herbst erscheinende finale Version des mobilen Betriebssystems vor. 

Firebase wird seit seinem Auftritt auf der letztjährigen Google I/O kontinuierlich ausgebaut und von uns bereits in mehreren Projekten mit hoher Zufriedenheit genutzt. Firebase Performance Monitoring soll die Nutzererfahrung weiter verbessern, indem es Schwachstellen aufdeckt und dem Entwickler so hilft, die Performance und Stabilität seiner Apps zu verbessern. Dass Google den Blick über den Tellerrand nicht scheut, bestätigt der verbesserte Support für Swift und den Apple Push Notification Service. Die Akquisition von Fabric im Januar hinterlässt ebenfalls ihre Spuren, da einerseits Crashlytics nun als primäres Crash Reporting Tool und andererseits die Authentifizierung via Telefonnummer übernommen werden sollen. Ach ja, Firebase Analytics heißt nun Google Analytics for Firebase.

Vitals beschreibt eine Initiative, die sich aus den Punkten Sicherheit, Performance und Entwicklertools zusammensetzt. Hierfür wurde mit Google Play Protect ein Virenscanner direkt in den Play Store integriert, welcher Nutzer sensibilisieren und die Verbreitung von schädlichen Apps erschweren soll. Die Startzeit von Apps konnte mit Android O auf die Hälfte reduziert werden, ohne dass diese vom Entwickler vorher angepasst werden müssen.

Android Studio 3.0 steht ab sofort als Preview zum Download bereit. Das Grundgerüst wurde von IntelliJ 2016.2 auf 2017.1.2 angehoben, wodurch der Java 8-Support noch weiter ausgebaut und der Jack Compiler zu Grabe getragen wird. Weiterhin wird der Android Monitor vom neuen Android Profiler abgelöst. Android Instant Apps sind nun öffentlich verfügbar und erlauben es Nutzern ab Android 6.0, Apps ohne vorherige Installation zu verwenden.  Die Abwärtskompatibilität bis hin zu Lollipop folgt in Kürze.

Unser persönliches und professionelles Augenmerk gilt allerdings Kotlin, welche ab sofort und offiziell als zweite Programmiersprache für Android unterstützt wird. Die vom russischen Studio JetBrains entwickelte statisch typisierte Sprache wurde 2011 vorgestellt und 2016 in der Version 1.0 veröffentlicht. Dementsprechend moderne Features bringt sie mit sich, die wir bereits von Apples hauseigener Programmiersprache Swift kennen und lieben: Extensions, Optionals, Lambdas, Named Parameters, Default Arguments, Type Inference - sowie zusätzliche Kniffe wie When Statements oder Smart Casts. Dabei bleibt Kotlin interoperabel zu Java-Code und kann somit leicht und peu à peu Einzug in bestehende Projekte erhalten.

Comment

Android Wear 2.0 im Ersteindruck

Comment

Android Wear 2.0 im Ersteindruck

Mit etwas Verspätung hat Android Wear 2.0 grünes Licht erhalten und seinen Weg auf die meisten Smartwatches gefunden. Wir haben diese aktuelle Version des mobilen Betriebssystems auf der LG Watch Urbane getestet.

Die auffälligste Neuerung ist optischer Natur, denn das 2014 eingeführte Material Design zieht sich nun durch das User Interface der intelligenten Uhren. Komplikationen lassen sich unabhängig vom verwendeten Watchface anzeigen und in wenigen Schritten bearbeiten. Unser persönliches Highlight ist jedoch die wachsende Unabhängigkeit von Android Wear. Hierfür wurde der Play Store ins Betriebssystem integriert, wodurch sich Apps direkt von der Uhr aus installieren lassen - sofern diese vorher für Android Wear 2.0 angepasst worden sind.

Für Entwickler ergeben sich einige Änderungen: so wurden die WearableListView und der GridViewPager durch die WearableRecyclerView ersetzt, welche u.a. den aus der RecyclerView bekannten SnapHelper unterstützt. Die ActionChooserView weicht dem AlertDialog, der ProgressSpinner der ProgressBar und die CrossfadeDrawable dem AnimationSet. Hier wird das Bestreben von Google deutlich, die Grenze zwischen Android und Android Wear zu minimieren, da alle Deprecations von Klassen aus dem SDK des großen Bruders abgelöst wurden.

Uns erinnert dieses Update an den Sprung von Honeycomb zu Ice Cream Sandwich. Damals hatte man es erfolgreich geschafft, aus zwei unterschiedlichen Betriebssystemen heraus eine einheitliche Plattform für Tablets und Smartphones zu schaffen. Android Wear 2.0 ist ein weiterer Schritt in eine Zukunft, in der wir alle Endgeräte mit ein und demselben Toolset bedienen können.

Komplikationen lassen sich in wenigen Schritten anlegen und positionieren

Komplikationen lassen sich in wenigen Schritten anlegen und positionieren

Der Play Store für Android Wear bietet die von den Smartphones gewohnte Funktionalität

Der Play Store für Android Wear bietet die von den Smartphones gewohnte Funktionalität

Comment

Swift 3 - The Good, the Bad and the Ugly

Comment

Swift 3 - The Good, the Bad and the Ugly

Mit dem Release von Xcode 8.3 und Swift 3.1 schneidet Apple alte Zöpfe ab und verweigert Swift 2-Anwendungen jeglichen Support. Aus diesem Grund beschäftigen wir uns aktuell intensiv mit der Migration bestehender Apps und halten unsere Erfahrungen mit der aktuellen Version der Apple-eigenen Programmiersprache fest:

Neuerungen

  • Swift Package Manager erlaubt das Teilen von Code über mehrere Projekte ohne Cocoapods oder Carthage
  • Neue Code Konstanten (Float.pi, CGFloat.pi)

Änderungen

  • Funktionsparameter sind Konstanten
  • Alle Funktionsparameter (auch der erste) werden nun benannt: array.removeAtIndex() wird zu array.remove(at:)
  • Inkrementoperatoren ++ und -- wurden komplett durch += und -= abgelöst
  • Redundante Bezeichnungen werden gestutzt: stringByAppendingString wird zu appending, NSBundle.mainBundle() wird zu Bundle.main
  • der NS-Präfix verabschiedet sich und damit eine der letzten Überbleibsel von NeXTStep, einem Betriebssystem, das unter Steve Jobs in den 80er Jahren entwickelt worden war: NSBundle wird zu Bundle, NSFileManager wird zu FileManager
  • Grand Central Dispatch mit Swift-Syntax: dispatch_async(dispatch_queue_create("Queue", nil) wird zu DispatchQueue(label: "Queue").async
  • lowerCamelCasing statt UpperCamelCasing bei enums und const: UIStatusBarStyle.LightContent wird zu UIStatusBarStyle.lightContent

Probleme

  • Das automatische Konvertieren von Swift 2 nach 3 funktioniert nur bedingt und ignoriert so manche Konvention
  • Das Core Framework bietet nach wie vor zahllose obsolete Datentypen an, die händisch konvertiert werden müssen
 
Bei all den Deprecations fühlt sich sogar Guardlet Johansson wie eine leere Hülle

Bei all den Deprecations fühlt sich sogar Guardlet Johansson wie eine leere Hülle

 

Der Aufwand ist dieses Mal erheblich größer als noch von Swift 1 auf 2, allerdings halten wir den Großteil der Änderungen für sinnvoll.
Und dann wartet mit Swift 4 ja schon das nächste große Update um die Ecke.

Comment

Android Wear 2.0 verzögert sich erneut

Android Wear 2.0 verzögert sich erneut

Eigentlich wird Android Wear 2.0 bereits seit Februar auf die Geräte einiger weniger Hersteller verteilt. Nun sorgt ein Fehler im Betriebssystem jedoch für eine weitere Verzögerung. Google lässt den Zeitraum für das finale Update noch offen:

"We have started rolling out the Android Wear 2.0 update to Fossil Q Founder, Casio Smart Outdoor Watch WSD-F10 and Tag Heuer Connected. For other devices, the update is currently being delayed due to a bug found in final testing. We will push the update to the remaining devices as soon as the issue is resolved." - 9to5google.com

Android Wear 2.0 erlaubt eine direkte Netzwerkverbindung der Smartwatches ohne den Umweg über ein gekoppeltes Smartphone. Hierfür wird eine angepasste Version des Google Play Stores auf den Uhren vorinstalliert, um das Betriebssystem möglichst autark zu gestalten. Der Play Store listet dann ausschließlich solche Apps, welche für Android Wear 2.0 angepasst wurden. Weiters werden der Google Assistant und zusätzliche Eingabemöglichkeiten vorinstalliert, u.a. eine Bildschirmtastatur sowie Handschrifterkennung mittels optischer Zeichenerkennung (OCR). Komplikationen können nun unabhängig vom Watchface angezeigt und über dieses gelegt werden. Und nicht zuletzt findet auch das von Smartphone und Web bekannte Material Design Einzug auf die Uhren.

Wir bleiben gespannt auf Android Wear 2.0 und hoffen, dass diese Generalüberholung die Basis für einen gesunden Konkurrenzkampf auf dem Markt der Smartwatches bildet, welcher aktuell stark von Apple dominiert wird.

Android O: Erste Developer Preview

Comment

Android O: Erste Developer Preview

Es scheint, als würde Android N schneller in Vergessenheit geraten als man "Nutella" sagen kann, denn während dessen Distributionsrate noch bei unter drei Prozent liegt (sieben Monate nach Release), wurde nun sein Nachfolger angekündigt.

Android O präsentiert sich erstaunlich früh und folgt damit einem Credo, das Google im letzten Jahr eingeführt hat und hoffentlich auch weiterhin fortführen wird. Die Developer Preview wird seit dem 21. März 2017 verteilt und gibt einen ersten Einblick auf kommende Neuerungen. In erster Linie richtet sich diese Version an Entwickler und ändert dementsprechend viel unter der Haube. Die kompletten Changenotes finden sich in der offiziellen Dokumentation.

Schriftarten sind ab sofort vollwertige Ressourcen, die - analog zu String, Drawable oder Style - in XML Layouts verwendet werden können. Das neue Autofill Framework richtet sich an Passwortmanager, welche aktuell noch als Bedienungshilfe im Betriebssystem laufen. Adaptive Icons gehen einen Schritt weiter in Richtung Responsive Design und erlauben es, Icons abhängig vom Zielgerät zu maskieren.
Mit den Backgrund limits führt man fort, was unter Android 6 mit Doze und App Standby begonnen wurde: Akkulaufzeit erhöhen und Performance verbessern. Hierfür müssen Apps angepasst werden, die Background Services nutzen und deren Target auf API 26 oder höher gesetzt ist.

Picture in Picture (PIP) ist eines von zwei Features, die sich direkt an Endnutzer richten. PIP ist eine spezielle Form des aus Android N bekannten Multi Window. Diese erlaubt das Übereinanderlegen zweier Apps, z. B. um ein Overlay mit Videoplayback darzustellen, wie man es bereits von Android TV oder aus der YouTube-App kennt.
Des weiteren fallen uns die Notification Channels auf, welche eine Kategorisierung von Benachrichtigungen erlauben. Entwickler legen hierbei für jede Benachrichtigung fest, in welchem Kanal sie gesendet wird. Folgende Einstellungen können dann vom Nutzer einzeln für jeden Kanal getroffen werden: Ton, Vibration, LED-Signal, auf dem Sperrbildschirm anzeigen, "Nicht stören"-Modus überschreiben. Dies sollte das Leben vieler erleichtern, deren Partner Fans von mobilen Aufbauspielen sind. Deren Entwickler bieten nämlich nur allzu selten eine Möglichkeit, solche Störgeräusche zu minimieren, ohne das komplette Gerät stumm zu schalten.

Dies sind nur einige der Neuerungen von Android O und wir sind gespannt, was sich bis zum finalen Release noch ändern wird. Dabei hoffen wir stets auf eine weitreichende Integration in die Support Library, damit die neuen Features ohne Verzögerung auf so viele Geräte wie möglich ausgerollt werden können.
Genauso neugierig sind wir auf den Alias der neuen Betriebssystemversion. Welche Süßigkeit wird es diesmal? Oreo? Oatmeal Cookie? Ontbijtkoek? Es bleibt spannend.

Notifications Channels unter Android O

Notifications Channels unter Android O

Comment

x-game three - und täglich grüßt das Murmelspiel

x-game three - und täglich grüßt das Murmelspiel

x-game three komplettiert unsere Match-3-Spieletrilogie, die branchenfremden Unternehmen einen schnellen und kostengünstigen Einstieg in das Thema Gamification gewährt. 

x-game three ist eine zuckersüße Variante der beliebten Bubble-Shooter-Spielmechanik und damit das perfekte Spiel für zwischendurch. Diesmal werden runde Spielsteine aufs Spielfeld geschossen, um Ketten aus gleichfarbigen Kugeln zu bilden und abzuräumen. Messe Dich mit Spielern aus der ganzen Welt im Leaderboard und teile Deine Erfahrung mit Freunden über soziale Netzwerke. Begleite uns auf einer Reise durch mehr als fünfzig herausfordernde Level und erhasche einen Blick hinter die Kulissen der mobilen App-Entwicklung.

Zu Gast beim Google Chrome Team

Zu Gast beim Google Chrome Team

Das MunichJS Meetup gastierte gestern Abend bei Google München zu den Themen:

Das Google V8-Engine Team erläuterte seinen Ansatz der Performancemessung und damit verbundene Probleme. Eine interessante Anekdote war hierbei, dass noch keine reale ECMAScript2015-Anwendung in-the-wild existiert - ein klassisches Henne-Ei-Problem. Im persönlichen Gespräch mit dem V8-Engine-Team debatierte man über Benchmarks im NodeJS- und Mobile-Hybrid-Szenario und den schmalen Grat zwischen Performance und Akkulaufzeit. Danach demonstrierte man eine Workflow-Engine, welche Eingaben kombiniert und diese in verschiedenartige Ausgaben transformiert - zum Beispiel in die Logos diverser JetBrains-Produkte. Der abschließende Vortrag hatte zum Thema, mit mehreren JavaScript-Workern parallel einen geteilten Speicherbereich zu bearbeiten und wie man diese Atomics absichert.

Der Andrang zu Veranstaltung war groß: 70 Leute standen auf der Gästeliste und über 200 auf der Warteliste.

They see us rodeln, they hatin'

They see us rodeln, they hatin'

Freitag Abend, achtzehn Uhr, zieht man sich Skijacken an.
Es geht fünfzig Kilometer weiter zur Kala Alm und ihrem Hang.
Der Aufstieg ist weder schwer noch beschwerlich,
die Gespräche sind lustig - aber seien wir mal ehrlich -
vom Nerdhumor fangen wir besser gar nicht erst an.

Nach einer Stunde kehrt in besagter Alm man ein,
das Schönramer fließt - und Alkoholfreies natürlich auch, denn bei uns trinkt keiner allein -
bevor man sich an das eigentliche Ziel, den Abstieg, macht
und das aber nicht zu Fuß, mit Ski oder Snowboard, nein,
es wird geritten, ohne Protektoren und zu Schlitten.

Die Geschwindigkeit ist hoch, die Streckenbeleuchtung nicht die beste,
aber Spaß macht es großen und darauf kommt es an.
Wer zu langsam ist, bleibt womöglich im Dunkeln,
denn nur Zwei von uns Sechs dachten daran,
mit Stirnlampen über den Weg voraus zu funkeln.

Nach und nach treffen die Kollegen am Fuße des Schneebergs ein,
mancher ging unterwegs verloren, aber kameradschaftlich, wie es scheint,
haben wir uns lauthals darüber geärgert, damit wir leicht zu orten sind,
denn auf dem Rückweg dort zum Abhang hin,
they see us rodeln, they hatin'.

Ingwer Shots und Apfelkerne

Ingwer Shots und Apfelkerne

Nachdem uns die Apfelkerne bereits im Winter mit Plätzchen versorgt haben, brachten sie uns diesmal eine Flasche mit einer ganz besonderen Mischung vorbei: Ingwer und Zitrone bilden die wohl gesündesten (alkoholfreien) Shots der Welt - genau das Richtige für unsere koffeingetränken Entwicklerköpfe.

Wir bedanken uns herzlich und kippen noch ein paar Stamperl - Prost!

App-Entwicklung für Agenturen

App-Entwicklung für Agenturen

Ihr seid eine Agentur, egal ob Werbe-, Kreativ- oder Full-Service, und seid gesettelt in Eurem Revier? Am Rande zur App-Technik jedoch fehlt das gewisse technische Etwas? Hier setzen wir an und unterstützen Euch mit jahrelanger Erfahrung, die durch tägliche Programmierung aufgebaut worden ist.

Jeder macht genau das, was er am besten kann.

Wir sehen uns nicht als Konkurrenz zu Euch, sondern als Partner. Wir klinken uns nahtlos in Euer Agentur-Team ein, beraten Euch und übernehmen in enger Abstimmung die technische Umsetzung und Verantwortung bis hin in die App-Stores. Bei größeren Herausforderungen sind wir in der Lage, ein Gesamtsystem inkl. Backend, Schnittstellen und Servern sicher und skalierbar aufzubauen und betreiben zu können.

Wir unterstützen aus und für ganz Deutschland, aus Rosenheim in der Nähe von München. Wir haben keine versteckte Hinterzimmer-Mannschaft im Nearshoring, kein Offshoring und keine Sprachbarrieren. Genießt den direkten Draht und die nahtlose Integration – unabdingbar bei komplexeren Themen. 

Hier erfahrt Ihr mehr - oder nehmt direkt Kontakt zu uns auf.