Stats: считать только холодный запуск; время по Москве

Засчитываем запуск лишь когда процесс создан заново (приложение было
выгружено), через флаг SvxApp.coldStart из SplashActivity. Выход из фона
и повторный тап по иконке (процесс жив) больше не учитываются. Время
последнего запуска пишем по Москве (формат ISO с офсетом +03:00).
Убрана зависимость lifecycle-process.
This commit is contained in:
ua1zbe
2026-10-09 14:11:56 +03:00
parent 4e7bf86f37
commit 96ab5c76e2
4 changed files with 15 additions and 20 deletions

View File

@@ -44,7 +44,6 @@ kotlin {
dependencies { dependencies {
implementation("ru.rustore.sdk:pushclient:7.4.0") implementation("ru.rustore.sdk:pushclient:7.4.0")
implementation("androidx.lifecycle:lifecycle-process:2.7.0")
testImplementation("junit:junit:4.13.2") testImplementation("junit:junit:4.13.2")
} }

View File

@@ -16,6 +16,12 @@ class SplashActivity : Activity() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
// Засчитываем запуск только при холодном старте (процесс был выгружен).
// Выход из фона или повторный тап по иконке (процесс жив) не считаем.
if (SvxApp.coldStart) {
SvxApp.coldStart = false
StatsReporter.report(this)
}
if (mainAlive) { if (mainAlive) {
openMain() openMain()
return return

View File

@@ -63,8 +63,8 @@ object StatsReporter {
get.disconnect() get.disconnect()
} }
val now = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US).apply { val now = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX", Locale.US).apply {
timeZone = TimeZone.getTimeZone("UTC") timeZone = TimeZone.getTimeZone("Europe/Moscow")
}.format(Date()) }.format(Date())
val launches = (root.optJSONObject(callsign)?.optInt("launches", 0) ?: 0) + 1 val launches = (root.optJSONObject(callsign)?.optInt("launches", 0) ?: 0) + 1
root.put(callsign, JSONObject().apply { root.put(callsign, JSONObject().apply {

View File

@@ -4,9 +4,6 @@ import android.app.Application
import android.app.NotificationChannel import android.app.NotificationChannel
import android.app.NotificationManager import android.app.NotificationManager
import android.util.Log import android.util.Log
import androidx.lifecycle.DefaultLifecycleObserver
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.ProcessLifecycleOwner
import ru.rustore.sdk.pushclient.RuStorePushClient import ru.rustore.sdk.pushclient.RuStorePushClient
import ru.ua1zbe.svxremote.prefs.Prefs import ru.ua1zbe.svxremote.prefs.Prefs
@@ -18,22 +15,11 @@ class SvxApp : Application() {
override fun onCreate() { override fun onCreate() {
super.onCreate() super.onCreate()
// Процесс только что создан — значит приложение было выгружено и
// запускается заново (а не выходит из фона/по иконке).
coldStart = true
createPushChannel() createPushChannel()
initRuStorePush() initRuStorePush()
trackLaunches()
}
/**
* Считаем запуском каждый вывод приложения на передний план (холодный старт
* и повторное открытие), а не только создание процесса — иначе при живом
* процессе в фоне повторные открытия не учитывались бы.
*/
private fun trackLaunches() {
ProcessLifecycleOwner.get().lifecycle.addObserver(object : DefaultLifecycleObserver {
override fun onStart(owner: LifecycleOwner) {
StatsReporter.report(this@SvxApp)
}
})
} }
private fun createPushChannel() { private fun createPushChannel() {
@@ -76,5 +62,9 @@ class SvxApp : Application() {
private const val TAG = "RuStorePush" private const val TAG = "RuStorePush"
private const val RUSTORE_PROJECT_ID = "Yd7tDjVDHqsnTJwHNYN08cYIvy8fsWU-" private const val RUSTORE_PROJECT_ID = "Yd7tDjVDHqsnTJwHNYN08cYIvy8fsWU-"
private const val PUSH_TOPIC = "svxhomyak" private const val PUSH_TOPIC = "svxhomyak"
/** true, если процесс создан заново (приложение было выгружено). */
@Volatile
var coldStart = false
} }
} }