Користувацькі показники

Що таке Користувацькі показники?

Якщо Ви подивитеся на екран блокування, Ви побачите коло. Всередині кола є текст. Якщо подивитися ближче, можна побачити, що текст містить дані щодо користувацької активності. Тицьніть по центру двічі й зможете побачити інші «показники» користувача.

../../_images/met1.png

Тут видно, що «Сьогодні надіслано 7 повідомлень». Звідки це відомо?

../../_images/met2.png

Це отримано зі сторонньої програми (nCounter), яка використовує засоби Користувацьких показників.

Здебільшого ці повідомлення досить чітко говорять про те, що вони рахують та якої програми це стосується. Але звідки беруться ці показники?

Як можна використовувати Користувацькі показники у своїй програмі?

Вся наступна інформація буде заснована на коді для nCounter.

Файл apparmor Вашої програми повинен у політиках містити usermetrics:

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

Далі Вам буде потрібно імпортувати модуль до файлу QML, який буде обробляти Користувацькі показники:

import UserMetrics 0.1

(Можуть бути оновлені версії вище 0.1)

Далі потрібно визначити в коді Показник як об’єкт:

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.
}

Тепер, коли показник створений, в разі виникнення події можна оновити «format» або «emptyFormat» з посиланням на змінні в об’єкті типу Показник.

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

Тут ми призначаємо нове значення змінній circleMetric типу string (рядок), яка знаходиться всередині об’єкта Показник:

(Пам’ятайте, що circleMetric — це значення змінної, яке призначається у форматі)

Metric Id [dot] Назва змінної [equals] Нове значення змінної

metric.circleMetric = "Нове повідомлення з показниками"

Після цього скажемо екрану блокування оновити цей показник.

Metric ID [dot] update (певне значення для встановлення, якщо міститься у форматі)

metric.update(0)

(Підказка: у цьому прикладі 0 — вільне значення, оскільки значення показника не містить лічильника)

Тепер ми оновили показник станом на сьогодні. Якщо наступить завтра, показник буде скинутий на будь-що, вказане у emptyFormat.

Для більшості програм типове значення для повідомлень, дзвінків та ін. — 0.

Як працюють Користувацькі показники?

Користувацькі показники складаються з двох «форматів»:

  • показники/повідомлення за сьогодні (format)

  • показники/повідомлення для завтрашнього дня (emptyFormat)

Значення emptyFormat зображується на екрані блокування, якщо іншого значення не було збережено у format. Для зображення нового значення format показник повинен оновитися.

Існує два способи оновлення показника:

  • Задайте показнику певне значення:

metricID.update(x) (де x — число подвійного значення double, яке визначає значення лічильника). metricID — це ідентифікатор id:, вказаний в елементі Показник (Metric). Це значення лічильника може включати у форматі format зі значенням %1. напр. format: "сьогодні натиснуто %1 кнопок"

  • Збільшення (increment) показника:

metricID.increment(x) (де x — значення, яке потрібно додати поточного значення лічильника)

Цей показник скидатиметься щодня на значення, збережене у emptyFormat.

Програми використовують Користувацькі показники, встановлюючи та оновлюючи «формат» з певними подіями, напр. коли Ви натискаєте Надіслати у Telegram або коли отримуєте вхідний виклик. Програма може зберігати дані для обробки, але зазвичай вони зберігаються у системі (/var/lib/usermetrics).

(Простий приклад можете знайти на сторінці цього блогу)

Обмеження та особливості

Коли показник зареєстрований, він залишається на екрані блокування навіть після видалення програми. Файл бази даних (db) зберігається у /var/lib/usermetrics, та може бути видалений користувачем root (але не з sudo). Видалення цього файлу та перезавантаження вилучать усі збережені показники. Файл замість видалення можна змінити.

Залежно від налаштувань «форматів», може здатися, що обслуговувати поточний стан більше одного дня складно (хоча це і не є чимось неможливим. Див. FluffyChat).

На прикладі програми nCounter. Мені хочеться порахувати кількість днів, але оскільки показники «скидаються» щодня, це може здатися проблемою. То ж я створив оточення, яке оновлює показник щоразу як відкривається програма. Таким чином, emptyFormat (типово) говорить користувачеві відкрити програму. Але це, майже перекриває мету показника, окрім гарного нагадування про стан за день.

Повинна бути можливість незалежного запуску фонового процесу (напр. cron) для отримання даних з відповідного коду програми. Одна з відомих — Індикатор Погоди. Для оновлення індикатора вона запускає процес кожні Х хвилин без необхідності запуску програми.