Kotlin, le Scala agile

Par défaut

Android mange du Scala = indigestion

Coder pour Android se fait normalement en Java, ce qui m’a permis d’appréhender le SDK Android assez vite, vu que je connaissais bien le langage. Puis on me parle un jour de Scala, langage qui monte à vitesse grand V dans la Silicon Valley. Curieux comme je suis, je commence à me renseigner sur l’animal et ce que je lis est alléchant : programmation fonctionnelle.

La syntaxe est concise et agréable, on est obligé de spécifier à la déclaration si l’élément est mutable ou pas, le pattern matching fini de me convaincre d’essayer. C’est alors que je me suis mis en tête de mettre du Scala dans Radis, mon application Android.

Je lis et vois plusieurs exemple de code Scala qui tourne sur Android, c’est donc possible et je me lance dans l’écriture d’une nouvelle fonctionnalité en Scala ! Les première lignes compilées, je test et ça fonctionne, chouette ! Je continue à coder la fonctionnalité, j’ajoute des dépendances à des bibliothèques Scala quand soudain, c’est le drame.

La compilation échoue pour cause de limite atteinte du nombre de méthodes. Stupéfaction, je ne savais même pas qu’il existait ce genre de limitation. En creusant un peu, j’apprends qu’effectivement, les fichiers Dex ont une limite à ce qui ressemble à max_int méthodes, et que le runtime Scala en bouffe beaucoup à lui tout seul. En parallèle, j’avais commencé un projet de client RSS en Scala pour Android, et pareil, juste le runtime Scala avec du Spring et c’était fini.

Tristesse ! Mais c’est alors que Swift est sorti pour iOS et que je me suis à chercher « Swift for Android ». Car oui, même si je ne l’ai pas expérimenté, sur le papier, Swift à l’air très bien comme langage, j’ai même interprété son annonce à un aveux d’Apple sur la shittiness d’Objective-C ^^ (on peut rêver).

Kotlin, copain d’Android

kotlinEt cette recherche donc, elle m’a fait croiser le chemin de Kotlin via un article avec le titre parfait : Kotlin, the Swift for Android. Exactement ce que je cherchais !

En le lisant, je vois que la syntaxe est très similaire et que la philosophie est la même que Scala, sauf sur un point, et un point d’importance : un runtime minimal.

Kotlin ne va pas chercher à tout recoder le SDK Java, il va utiliser les structures de données existantes et utiliser la force de ses extension functions pour rendre le SDK Java plus élégant.

Me voilà donc en train de reconvertir mon code Scala en Kotlin et les deux sont tellement similaires que le tout fut converti et débuggé en l’espace d’une demi journée (pour la feature des graphiques donc). Depuis, je convertis petit à petit le code Java vers Kotlin lors de correction de bugs par exemple et ce langage m’a permis de rendre le tout bien plus stable et m’a aidé à identifier les crash de manière plus précise, notamment grâce au fait qu’il faille absolument définir à la déclaration si l’élément peut être null ou pas.

De plus, vu que tout est fait par la même boîte, l’intégration de Kotlin dans IntelliJ est poussée et ils visent clairement tout le monde couvert par Java, sans oublier Android donc.

Le langage à toutefois un soucis important : il n’est pas encore en 1.0. Ce qui signifie qu’à chaque sortie, il se peut que des choses ne fonctionnent plus ou pire, ne fonctionnent pas exactement de la même façon. Heureusement, le blog dédié au langage documente chaque changement et donne les outils (souvent intégrés à IntelliJ) pour faire la transition sans douleur. De plus, cette fameuse 1.0 a été annoncée pour cet été 2015, ce qui mettra un terme à ce bémol et permettra à ce langage de prendre son envol.

Bref, je conseille à tout programmeurs sur JVM à essayer ce langage, et j’espère vraiment que la 1.0 lui permettra de gagner ses lettres de noblesses dans le monde professionnel. Moi je sais déjà que tous mes projets perso Android seront en Kotlin 😉

Une image à fond blanc qui est verdâtre ?

Par défaut

Attention : article purement technique, connaissance en codage Android souhaitées.

J’ai été confronté récemment à un souci de rendu de d’image jpg sur le Galaxy S et le Galaxy S2 : le fond des images était blanc mais ce blanc ressortait verdâtre sur l’écran de ces deux appareils alors que le blanc était correct sur le reste du parc d’appareils qu’on a au bureau.

La solution à ce problème est toute simple, il faut forcer le dithering dans le décodage de l’image :

BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inDither = true;
Bitmap image = BitmapFactory.decodeStream(buffer.getContent(), null, opts);

Pourquoi ça ne le fait pas partout ? Aucune idée surtout que j’ai eu le bug sur une ROM Samsung et une Cyanogen.