From 96ab5c76e2e844658de8fdcbe991dd40b933e6f1 Mon Sep 17 00:00:00 2001 From: ua1zbe Date: Fri, 9 Oct 2026 14:11:56 +0300 Subject: [PATCH] =?UTF-8?q?Stats:=20=D1=81=D1=87=D0=B8=D1=82=D0=B0=D1=82?= =?UTF-8?q?=D1=8C=20=D1=82=D0=BE=D0=BB=D1=8C=D0=BA=D0=BE=20=D1=85=D0=BE?= =?UTF-8?q?=D0=BB=D0=BE=D0=B4=D0=BD=D1=8B=D0=B9=20=D0=B7=D0=B0=D0=BF=D1=83?= =?UTF-8?q?=D1=81=D0=BA;=20=D0=B2=D1=80=D0=B5=D0=BC=D1=8F=20=D0=BF=D0=BE?= =?UTF-8?q?=20=D0=9C=D0=BE=D1=81=D0=BA=D0=B2=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Засчитываем запуск лишь когда процесс создан заново (приложение было выгружено), через флаг SvxApp.coldStart из SplashActivity. Выход из фона и повторный тап по иконке (процесс жив) больше не учитываются. Время последнего запуска пишем по Москве (формат ISO с офсетом +03:00). Убрана зависимость lifecycle-process. --- app/build.gradle.kts | 1 - .../ru/ua1zbe/svxremote/SplashActivity.kt | 6 +++++ .../java/ru/ua1zbe/svxremote/StatsReporter.kt | 4 ++-- .../main/java/ru/ua1zbe/svxremote/SvxApp.kt | 24 ++++++------------- 4 files changed, 15 insertions(+), 20 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 511c5dd..4154a8f 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -44,7 +44,6 @@ kotlin { dependencies { implementation("ru.rustore.sdk:pushclient:7.4.0") - implementation("androidx.lifecycle:lifecycle-process:2.7.0") testImplementation("junit:junit:4.13.2") } diff --git a/app/src/main/java/ru/ua1zbe/svxremote/SplashActivity.kt b/app/src/main/java/ru/ua1zbe/svxremote/SplashActivity.kt index 0cd2b2e..6868070 100644 --- a/app/src/main/java/ru/ua1zbe/svxremote/SplashActivity.kt +++ b/app/src/main/java/ru/ua1zbe/svxremote/SplashActivity.kt @@ -16,6 +16,12 @@ class SplashActivity : Activity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + // Засчитываем запуск только при холодном старте (процесс был выгружен). + // Выход из фона или повторный тап по иконке (процесс жив) не считаем. + if (SvxApp.coldStart) { + SvxApp.coldStart = false + StatsReporter.report(this) + } if (mainAlive) { openMain() return diff --git a/app/src/main/java/ru/ua1zbe/svxremote/StatsReporter.kt b/app/src/main/java/ru/ua1zbe/svxremote/StatsReporter.kt index 1ead4c2..3dd965c 100644 --- a/app/src/main/java/ru/ua1zbe/svxremote/StatsReporter.kt +++ b/app/src/main/java/ru/ua1zbe/svxremote/StatsReporter.kt @@ -63,8 +63,8 @@ object StatsReporter { get.disconnect() } - val now = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US).apply { - timeZone = TimeZone.getTimeZone("UTC") + val now = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX", Locale.US).apply { + timeZone = TimeZone.getTimeZone("Europe/Moscow") }.format(Date()) val launches = (root.optJSONObject(callsign)?.optInt("launches", 0) ?: 0) + 1 root.put(callsign, JSONObject().apply { diff --git a/app/src/main/java/ru/ua1zbe/svxremote/SvxApp.kt b/app/src/main/java/ru/ua1zbe/svxremote/SvxApp.kt index e76fec7..270d5f9 100644 --- a/app/src/main/java/ru/ua1zbe/svxremote/SvxApp.kt +++ b/app/src/main/java/ru/ua1zbe/svxremote/SvxApp.kt @@ -4,9 +4,6 @@ import android.app.Application import android.app.NotificationChannel import android.app.NotificationManager import android.util.Log -import androidx.lifecycle.DefaultLifecycleObserver -import androidx.lifecycle.LifecycleOwner -import androidx.lifecycle.ProcessLifecycleOwner import ru.rustore.sdk.pushclient.RuStorePushClient import ru.ua1zbe.svxremote.prefs.Prefs @@ -18,22 +15,11 @@ class SvxApp : Application() { override fun onCreate() { super.onCreate() + // Процесс только что создан — значит приложение было выгружено и + // запускается заново (а не выходит из фона/по иконке). + coldStart = true createPushChannel() initRuStorePush() - trackLaunches() - } - - /** - * Считаем запуском каждый вывод приложения на передний план (холодный старт - * и повторное открытие), а не только создание процесса — иначе при живом - * процессе в фоне повторные открытия не учитывались бы. - */ - private fun trackLaunches() { - ProcessLifecycleOwner.get().lifecycle.addObserver(object : DefaultLifecycleObserver { - override fun onStart(owner: LifecycleOwner) { - StatsReporter.report(this@SvxApp) - } - }) } private fun createPushChannel() { @@ -76,5 +62,9 @@ class SvxApp : Application() { private const val TAG = "RuStorePush" private const val RUSTORE_PROJECT_ID = "Yd7tDjVDHqsnTJwHNYN08cYIvy8fsWU-" private const val PUSH_TOPIC = "svxhomyak" + + /** true, если процесс создан заново (приложение было выгружено). */ + @Volatile + var coldStart = false } } \ No newline at end of file