Métriques utilisateur#

Que sont les métriques utilisateur ?#

Si vous regardez sur l’écran de verrouillage, vous verrez un cercle. À l’intérieur de ce cercle se trouve du texte. Regardez de plus près, et vous remarquerez que sont des données concernant l’activité de l’utilisateur. Appuyez deux fois sur le milieu du cercle et vous verrez d’autres « mesures » concernant l’activité de l’utilisateur.

../../_images/met1.png

Le texte indique « 7 messages texte envoyés aujourd’hui ». Comment cette donnée est-elle récupérée ?#

../../_images/met2.png

Ceci provient d’une application tierce (nCounter) qui utilise la fonction User Metrics.#

Pour la plupart, ces messages indiquent clairement ce qu’ils comptent, et quelle application est concernée. Mais d’où viennent ces données ?

Comment puis-je utiliser les métriques utilisateur dans mon application ?#

Les explications suivantes seront basées sur le code de nCounter.

Le fichier apparmor de votre application doit inclure usermetrics dans la stratégie de sécurité :

{
    "policy_groups": [
        "usermetrics"
    ],
    "policy_version": 16.04
}

Ensuite, vous il faut importer le module dans le fichier QML qui gérera les données utilisateur :

import UserMetrics 0.1

(Il peut y avoir des versions plus à jour pour ceci après la 0.1)

Ensuite, la métrique en question doit être définie dans le code comme un objet (Metric) :

Metric { // Define the Metric object.
    property string circleMetric // Create a string-type variable called "circleMetric". This is so you can update it later from somewhere else.
    id: metric // A name to reference the metric elsewhere in the code. i.e. when updating format values below.
    name: "nCounter" // This is a unique ID for storing the user metric data
    format: circleMetric // This is the metric/message that will display "today". Again it uses the string variable that we defined above
    emptyFormat: i18n.tr("Check nCounter") // This is the metric/message for tomorrow. It will "activate" once the day roles over and replaces "format". Here I have use a simple translatable string instead of a variable because I didn’t need it to change.
    domain: "ncounter.joe" // This is the appname, based on what you have in your app settings. Presumably this is how the system lists/ranks the metrics to show on the lock screen.
}

Maintenant que la métrique est créée, nous pouvons mettre à jour « format » ou « emptyFormat » lorsqu’un événement se produit en faisant référence aux variables de l’objet Metric.

onButtonPressed: {
    metric.circleMetric = "New Metric Message"
    metric.update(0)
    console.log("Metric updated")
}

Ici, nous attribuons une nouvelle valeur à la variable chaîne circleMetric qui se trouve dans l’objet Metric :

(Rappelez-vous que circleMetric est la valeur de la variable affectée au format)

Id Metric [point] Nom de la variable [égal] Nouvelles informations sur la variable

metric.circleMetric = "New Metric Message"

Nous demandons ensuite à l’écran de verrouillage de mettre à jour la métrique.

Id Metric [point] mise à jour (contenu spécifique à définir si inclus dans le format)

metric.update(0)

(Note : Dans cet exemple, 0 est arbitraire puisque metric n’inclut pas de compteur)

Nous avons maintenant mis à jour la métrique pour le jour courant. Rendu à demain, cette métrique sera réinitialisé à ce qui se trouve dans emptyFormat.

Pour la plupart des appli, la valeur par défaut est de 0 pour les messages, les appels, etc.

Comment les métriques utilisateur fonctionne-t-elles ?#

L’objet est constitué de deux « formats » :

  • metrics/messages pour aujourd’hui (format)

  • metrics/messages pour demain (emptyFormat)

La valeur de emptyFormat est ce qui s’affiche sur l’écran de verrouillage quand aucune valeur n’a été stockée dans format. Afin d’afficher une nouvelle valeur de format, metric doit être mis à jour.

Il existe deux façon de mettre à jour metric :

  • Positionner la métrique à un certain montant :

metricID.update(x) (où x est un nombre de type double à définir pour une valeur de compteur). metricID est le id: spécifié dans l’élément Metric. La valeur du compteur peut être incluse dans le paramètre format en utilisant %1. Par exemple, format : "%1 boutons pressés aujourd'hui"

  • Incrémenter la métrique:

metricID.increment(x) (où x est le montant à ajouter au compteur actuel)

La métrique sera réinitialisé à la valeur stockée dans emptyFormat chaque jour.

Les applications utilisent les métriques utilisateur en définissant et en mettant à jour les « formats » chaque fois qu’un certain événement a lieu, par exemple lorsque vous appuyez sur envoyer dans Telegram, ou lorsque vous recevez un appel téléphonique. L’application peut stocker les données pour les manipuler, mais généralement celles-ci sont stockées dans le système (/var/lib/usermetrics).

(Voir cet article de blog pour un exemple simple)

Limitations et expectatives#

Une fois qu’une métrique est enregistrée, elle reste sur l’écran de verrouillage même après la désinstallation de l’application. Un fichier de base de données (db) est stocké dans /var/lib/usermetrics, qui peut être supprimé par root (mais pas avec sudo). La suppression de ce fichier et le redémarrage supprimeront toutes les métriques stockées. Le fichier db pourrait sans doute être édité au lieu d’être supprimé.

En se basant sur la façon dont les « formats » sont mis en place, il semble qu’il soit difficile de maintenir un décompte courant au-delà d’un jour (mais pas impossible. Voir FluffyChat).

Dans le cas de l’application nCounter. Je voulais compter le nombre de jours, mais comme la métrique se « réinitialise » chaque jour, cela pose un problème. J’ai créé une solution de contournement qui met à jour la métrique chaque fois que l’application est ouverte. Ainsi, emptyFormat (par défaut) indique à l’utilisateur d’ouvrir l’application. Cependant, cela va presque à l’encontre de l’utilité des métriques, si ce n’est d’avoir un rappel des statistiques pour la journée.

Il y a sûrement un moyen pour un processus de s’exécuter indépendamment en arrière-plan (par exemple, cron) pour récupérer les données d’une d’application spécifique. L’application Indicator Weather en est un exemple. Elle exécute un processus toutes les X minutes pour mettre à jour automatiquement l’indicateur météo sans avoir à être ouverte.