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