Google Photos, bring back your filters (Deimos, Ariel, Triton, Phobos, etc…)

Since Novembre 2016, Google has “improved” the Google Photos app, but they simply removed all filters for something that is not equal… I’ve sent a feedback through the Google Photos contact form (https://photos.google.com/ > left menu > give feedback).

The workaround is to download an old version of Google Photos and install to a simulator or on your phone. You can find all APK versions on the APKMirror website.

If you don’t know which version is needed for your phone, check on Google your phone architecture version and dpi. For example, for a Nexus 5X, it’s arm64 – dpi 420 (default), so you need to download the 540717 (October 31, 2016) version which corresponds to: arm64, Android 4.1+, 400-480dpi

Forum posts

Google Forum – Is there way to use the previous filter?

Google, bring back your filters! They were good!

W28Y16 – Fibonacci implementation, compare JS UI frameworks performance, Android viz libraries and Hungarian notation

Fibonacci implementation

Why fibonacci ? Hum, juste because I was asked for this on my last interview and I stupidly failed with it… So, you’ll two different ways of implementing this algorithm:

  • recursive
  • iterative

The first one (recursive), is more elegant but not performant for big numbers (in fact, you’ll crash your memory by doing a recursive fibo for a number like 10000). The second one is in basic iterative loop do/while.

Mathmatics fonction: fibonacci(x) = fibonacci(x-1) + fibonacci(x-2)

Recursive

function fibonacci(n) {
  if (n < 2) {
    return 1;
  } else {
    return fibonacci(n - 2) + fibonacci(n - 1);
  }
}

Iterative

function fibonacci(n) {
  var a = 0, b = 1, f = 1;
  for(var i = 2; i <= n; i++) {
    f = a + b;
    a = b;
    b = f;
  }
  return f;
}

The fibo implementation in a looooot of different languages: http://www.scriptol.fr/programmation/fibonacci.php

JS UI framework perfs

ui_frameworks_comparison My colleague Justin (the tech surveillance killer) just sent me a nice repo about the comparaison most famous UI frameworks you could find. This dashboard allows you to decide regarding performances on:

  • rows creation
  • rows upodating
  • partial rows updating
  • selection of rows
  • swapping
  • etc, etc…

Just follow this link to see the comparison: HERE
And here to see the github repository: HERE

Hungarian notation

The Hungarian notation is very useful for languages with a loosely type like Javascript. This notation method is also used like an identifier to know the expected type of the variable. Some examples of naming variables using this convention:

  • bBusy : boolean
  • chInitial : char
  • cApples : count of items
  • fBusy : float (or flag)
  • nSize : integer (Systems) or count (Apps)
  • iSize : integer (Systems) or index (Apps)
  • dbPi : double (Systems)
  • rgStudents : array, or rangee
  • fnFunction : function name

Wikipedia about Hungarian notation

Android chart/viz libraries

I just tested two different Android chart/viz libraries from this github repo who regroups a good exhaustive list of viz libraries for a lot a languages (including Android of course)

HelloCharts

Very good if you only want to show some column charts, bar charts, lines charts, donuts. Charts are highly customizable :

  • fonts
  • sizes
  • colors (lines, points, axes, …)
  • background
  • with/without points
  • filled spaces
  • etc, etc…

HelloCharts Github Repository

I’ll stress a point, you don’t have any legends for your charts! that’s important because if you want one, you want need to create it manually…

MPAndroidChart

I’ve got some problems while adding MPAndroidChart as a dependency to my Android project, so I switched to HelloCharts. Maybe the wiki was deprecated, in the middle of a new version ?… I don’t know.
Anyway, this library is more complete, and maybe better, so if you are successful on adding this lib to your project: use it!

Animation concept

Nice animation concept by Mario Wahl that you can find on Dribbble.

Because code without design is not really usable, I’ll share, in each weekly article, a design creation that I liked (icon, animation, UI, workflow, …).

preview

MySQL sous Android: fonctionnement, avantages et inconvénients

MySQL est probablement l’une des bases de données la plus utilisée en informatique. Que l’on soit développeur en herbe ou confirmé, on a tous déjà travaillé au moins une fois avec ce système de gestion de base de données. Les géants du monde d’internet tels que Google l’utilisent pour certains sites, applications ou en embarquant directement MySQL au sein de leur solution.

Android & MySQL

Une application Android et une base de données MySQL ne peuvent pas communiquer directement ensemble (c’est un peu comme demander à un Chinois de discuter avec un Polonais), il faut donc implémenter un processus (un peu fastidieux!) qui va faire la connexion entre les deux : le langage PHP.

Visuellement, le processus de communication entre l’application et la base de données :

android_php_mysql

Tous les appels entre l’application et la base de données passeront donc par un webservice en PHP qui se chargera de réceptionner la requête, la transmettre au SGBD et renvoyer une réponse à l’application au format JSON. Le message JSON créé peut ressembler à ça :

{
“successful” : 1,
“response” : “Bravo, l’utilisateur a été ajouté!”
}

Il contient le statut de l’exécution de la requête ainsi qu’un court message qui peut être parsé et affiché à l’écran pour informer l’utilisateur.

Les avantages de MySQL

  • Disponible et abordable pour tous
  • Facile d’utilisation
  • Rapide, sûr et fiable
  • API
  • Open source
  • Portable

MySQL apporte beaucoup de libertés opérationnelles avec des fonctionnalités avancées. Les fonctions de sécurité de MySQL offrent également une protection fiable pour les accès aux données de manière simple.

Les inconvénients de MySQL

  • Limitations fonctionnelles
  • Processus de développement douteux

Selon le choix du moteur de la base de données, MySQL peut être allégé de certaines fonctionnalités (il faut s’assurer que les fonctionnalités primordiales à notre besoin soient incluses). Attention également aux accès concurrents qui peuvent poser quelques problèmes.

Notre expérience sur cet outil

L’utilisation de MySQL dans notre application n’a pas été nécessaire donc nous ne l’avons pas utilisé. Pour la même raison que SQLite, les données que nous utilisons sont directement stockées dans les bases de données de Twitter. Cependant nous l’avons utilisé de nombreuses fois pour des projets étudiants et en entreprise. MySQL est une référence dans les systèmes de gestion de base de données.

[JAVA] Faire une capture d’écran d’une Android Activity et la partager

Une fonctionnalité intéressante à implémenter à votre application Android est d’ajouter un bouton de partage. Dans ce petit tutoriel je vais partager le code que j’ai implémenté et qui permet de faire une capture d’écran de l’activité courante et la partager vers les réseaux sociaux, par SMS, mail etc…

1. Manifest

La première étape de est de modifier le fichier Manifest (VOTREPROJET/AndroidManifest.xml). Ajoutez simplement la ligne suivante :

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Cette ligne permettra d’enregistrer la capture d’écran.

2. Le code Java

La capture d’écran est faite au format bitmap.

// Capture d'ecran
Bitmap bitmap;
View v1 = v.getRootView();
v1.setDrawingCacheEnabled(true);
bitmap = Bitmap.createBitmap(v1.getDrawingCache());
v1.setDrawingCacheEnabled(false);

La sauvegarde du fichier sur le téléphone (stockage externe) :

// Creation du dossier de destination
OutputStream output;
File filepath = Environment.getExternalStorageDirectory();
File dir = new File(filepath.getAbsolutePath() + "/Captures de mon Appli/");
dir.mkdirs(); 

// Creation du fichier
DateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
Calendar cal = Calendar.getInstance();
File file = new File(dir, "capture" + dateFormat.format(cal.getTime()) + ".png");

Premièrement on ouvre l’Intent de partage qui regroupe les applications disponibles sur le téléphone de l’utilisateur, ensuite on convertit l’image au format .PNG et on la partage avec l’application (Hangouts, Twitter ou Facebook par exemple)


try {
// Intent de partage
Intent share = new Intent(Intent.ACTION_SEND);
share.setType("image/jpeg");
output = new FileOutputStream(file);

// Convertion au format PNG
screenshot.compress(Bitmap.CompressFormat.PNG, 100, output);
output.flush();
output.close();

// Recuperation de l'image à partager
Uri uri = Uri.fromFile(file);
share.putExtra(Intent.EXTRA_STREAM, uri);
startActivity(Intent.createChooser(share, getResources().getString(R.string.share_tweet)));
} catch (Exception e) {
e.printStackTrace();
}

Voilà, recopiez tout ce code dans la classe Java de votre Activity, appliquez ces actions à un bouton et votre application est prête à partager des captures d’écran!

 

Gérer les rapports d’erreurs d’une application Android avec Acra

ACRA est une librairie pour les développeurs d’applications Android qui permet l’envoi automatique de rapports de crash lorsque l’application s’arrête brutalement ou ne fonctionnement pas correctement.

1. La philosophie de la libraire

Directement inspiré de ce que propose Alocaly (envoi de rapports d’erreurs par e-mail qui nécessite cependant une confirmation à chaque envoi), ACRA fait beaucoup plus fort. Là où certaines librairies impliquent d’avoir un serveur dédié sur lequel les rapports d’erreurs sont hébergés, ACRA intègre l’envoi/stockage des rapports directement sur une feuille d’un tableur de type Google Spreadsheets.

La librairie est Open Source, sous licence Apache. Elle peut donc être utilisée dans nimporte quelle application (payante ou gratuite).

2. Qui utilise ACRA ?

D’après AppBrain, la célèbre source d’informations sur les applications du Google Play Store, ACRA est utilisé dans 2,76% des applications disponibles sur la plateforme de Google (chiffres à Janvier 2015).

acra_install_google_play

 

Les applications qui implémentent le service proposé par ACRA n’appartiennent pas à une catégorie en particulier. On retrouve aussi bien des applications de productivité comme Adobe Reader que des jeux ou des launchers.

Le récapitulatif complet de l’utilisation de la librairie ACRA : http://goo.gl/w6vQ0K

3. Les avantages

Parmi les nombreux avantages de cette librairie :

  • Hébergement par Google (Google Docs Sheets)
  • Si la connexion internet n’est pas active au moment du crash, le rapport de bug est stocké en local et sera synchronisé ultérieurement
  • Ne nécessite pas la validation de l’envoi par l’utilisateur
  • Simplicité de mise en place

4. L’interaction avec l’utilisateur

Lors de l’arrêt brutal de votre application, vous avez 4 possibilités d’interagir avec l’utilisateur pour l’informer :

  • Silencieux : Les rapports d’erreurs sont envoyés en fond de tâche
  • Toast : Un message est affiché temporairement et les rapports d’erreurs sont envoyés simultanément
  • Notification : Une notification est ajoutée dans la “Status Bar” et le rapport sera envoyé seulement si l’utilisateur accepte l’envoi du rapport (avec un commentaire optionnel).
  • Boite de dialogue: une boite de dialogue contenant les informations du rapport d’erreur.

5. Mise en place

La simplicité de mise en place est un des principal avantage de ACRA. Ci-dessous, la procédure de mise en place de la librairie au sein d’un projet d’application Android (Eclipse) :

  • Télécharger la dernière version de la librairie ACRA : acra-X-X-X.jar (4.5.0 au 06/02/2015)
  • Placer la librairie dans un dossier “libs” à la racine de votre projet
  • Ajouter la librairie au “Build Path” de votre application :
  • Project> Properties > Java Build Path > Add JARs…
  • Création de la classe “MyApplication” qui hérite de android.app.Application.

acra_myapplication

  • Ajouter la classe “MyApplication” à l’élément <application> du fichier MANIFEST (/AndroidManifest.xml) et donner les droits d’accès à internet pour l’application.

acra_manifest_myapplication

  • Donner la permission à l’application de se connecter à Internet

acra_permissions_internet

C’est prêt!