diff --git a/OsmAnd-telegram/AndroidManifest.xml b/OsmAnd-telegram/AndroidManifest.xml
index a1863ff954..558d4b38df 100644
--- a/OsmAnd-telegram/AndroidManifest.xml
+++ b/OsmAnd-telegram/AndroidManifest.xml
@@ -41,6 +41,7 @@
+
\ No newline at end of file
diff --git a/OsmAnd-telegram/src/net/osmand/telegram/OnTelegramServiceAlarmReceiver.kt b/OsmAnd-telegram/src/net/osmand/telegram/OnTelegramServiceAlarmReceiver.kt
index d41cbfa16e..ee2851dcb6 100644
--- a/OsmAnd-telegram/src/net/osmand/telegram/OnTelegramServiceAlarmReceiver.kt
+++ b/OsmAnd-telegram/src/net/osmand/telegram/OnTelegramServiceAlarmReceiver.kt
@@ -5,11 +5,9 @@ import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.location.LocationManager
-import net.osmand.telegram.TelegramApplication
-import net.osmand.telegram.TelegramService
import net.osmand.telegram.utils.AndroidUtils
-class OnNavigationServiceAlarmReceiver : BroadcastReceiver() {
+class OnTelegramServiceAlarmReceiver : BroadcastReceiver() {
@SuppressLint("MissingPermission")
override fun onReceive(context: Context, intent: Intent) {
val lock = TelegramService.getLock(context)
@@ -19,23 +17,23 @@ class OnNavigationServiceAlarmReceiver : BroadcastReceiver() {
if (lock.isHeld || service == null) {
return
}
- lock.acquire(10 * 60 * 1000L /*10 minutes*/)
+ lock.acquire(15 * 60 * 1000L)
// request location updates
val locationManager = service.getSystemService(Context.LOCATION_SERVICE) as LocationManager
try {
if (AndroidUtils.isLocationPermissionAvailable(app)) {
locationManager.requestLocationUpdates(service.serviceOffProvider, 0, 0f, service)
- val handler = service.handler
- if (service.serviceOffInterval > service.serviceError && handler != null) {
- handler.postDelayed({
- // if lock is not anymore held
- if (lock.isHeld) {
- lock.release()
- locationManager.removeUpdates(service)
- }
- }, service.serviceError)
- }
+ }
+ val handler = service.handler
+ if (service.serviceOffInterval > service.serviceErrorInterval && handler != null) {
+ handler.postDelayed({
+ // if lock is not anymore held
+ if (lock.isHeld) {
+ lock.release()
+ locationManager.removeUpdates(service)
+ }
+ }, service.serviceErrorInterval)
}
} catch (e: RuntimeException) {
e.printStackTrace()
diff --git a/OsmAnd-telegram/src/net/osmand/telegram/TelegramApplication.kt b/OsmAnd-telegram/src/net/osmand/telegram/TelegramApplication.kt
index d758f0cfda..8fe6a60d71 100644
--- a/OsmAnd-telegram/src/net/osmand/telegram/TelegramApplication.kt
+++ b/OsmAnd-telegram/src/net/osmand/telegram/TelegramApplication.kt
@@ -92,17 +92,24 @@ class TelegramApplication : Application(), OsmandHelperListener {
showLocationHelper.setupMapLayer()
}
- private fun startTelegramService(intent: Int) {
+ private fun startTelegramService(intent: Int, serviceOffInterval: Long = 0) {
var i = intent
+ var interval = serviceOffInterval
val serviceIntent = Intent(this, TelegramService::class.java)
val telegramService = telegramService
if (telegramService != null) {
i = intent or telegramService.usedBy
+ interval = if (TelegramService.isOffIntervalDepended(intent)) {
+ Math.min(telegramService.serviceOffInterval, interval)
+ } else {
+ telegramService.serviceOffInterval
+ }
telegramService.stopSelf()
}
serviceIntent.putExtra(TelegramService.USAGE_INTENT, i)
+ serviceIntent.putExtra(TelegramService.USAGE_OFF_INTERVAL, interval)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
startForegroundService(serviceIntent)
} else {
@@ -111,7 +118,8 @@ class TelegramApplication : Application(), OsmandHelperListener {
}
fun startMyLocationService() {
- startTelegramService(TelegramService.USED_BY_MY_LOCATION)
+ val interval = settings.sendMyLocationInterval
+ startTelegramService(TelegramService.USED_BY_MY_LOCATION, TelegramService.normalizeOffInterval(interval))
}
fun stopMyLocationService() {
diff --git a/OsmAnd-telegram/src/net/osmand/telegram/TelegramService.kt b/OsmAnd-telegram/src/net/osmand/telegram/TelegramService.kt
index df39894b26..21767c1680 100644
--- a/OsmAnd-telegram/src/net/osmand/telegram/TelegramService.kt
+++ b/OsmAnd-telegram/src/net/osmand/telegram/TelegramService.kt
@@ -32,7 +32,7 @@ class TelegramService : Service(), LocationListener, TelegramIncomingMessagesLis
private set
var serviceOffInterval = 0L
private set
- var serviceError = 0L
+ var serviceErrorInterval = 0L
private set
private var pendingIntent: PendingIntent? = null
@@ -51,19 +51,14 @@ class TelegramService : Service(), LocationListener, TelegramIncomingMessagesLis
shouldCleanupResources = false
val serviceIntent = Intent(ctx, TelegramService::class.java)
ctx.stopService(serviceIntent)
- } else if (!needLocation()) {
- // Issue #3604
+ } else if (isUsedByMyLocation(usedBy)) {
val app = app()
- if (usedBy == 2 && app.settings.sendMyLocationInterval >= 30000 && serviceOffInterval == 0L) {
+ if (app.settings.sendMyLocationInterval >= OFF_INTERVAL_THRESHOLD && serviceOffInterval == 0L) {
serviceOffInterval = app.settings.sendMyLocationInterval
- // From onStartCommand:
- serviceError = serviceOffInterval / 5
- serviceError = Math.min(serviceError, 12 * 60 * 1000)
- serviceError = Math.max(serviceError, 30 * 1000)
- serviceError = Math.min(serviceError, serviceOffInterval)
+ setupServiceErrorInterval()
val alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager
- pendingIntent = PendingIntent.getBroadcast(this, 0, Intent(this, OnNavigationServiceAlarmReceiver::class.java), PendingIntent.FLAG_UPDATE_CURRENT)
+ pendingIntent = PendingIntent.getBroadcast(this, 0, Intent(this, OnTelegramServiceAlarmReceiver::class.java), PendingIntent.FLAG_UPDATE_CURRENT)
alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 500, serviceOffInterval, pendingIntent)
}
app.notificationHelper.refreshNotification(NotificationType.LOCATION)
@@ -76,20 +71,12 @@ class TelegramService : Service(), LocationListener, TelegramIncomingMessagesLis
usedBy = intent.getIntExtra(USAGE_INTENT, 0)
serviceOffInterval = intent.getLongExtra(USAGE_OFF_INTERVAL, 0)
- // use only gps provider
- serviceOffProvider = LocationManager.GPS_PROVIDER
- serviceError = serviceOffInterval / 5
- // 1. not more than 12 mins
- serviceError = Math.min(serviceError, 12 * 60 * 1000)
- // 2. not less than 30 seconds
- serviceError = Math.max(serviceError, 30 * 1000)
- // 3. not more than serviceOffInterval
- serviceError = Math.min(serviceError, serviceOffInterval)
+ setupServiceErrorInterval()
app.telegramService = this
app.telegramHelper.incomingMessagesListener = this
- if (needLocation()) {
+ if (isUsedByMyLocation(usedBy)) {
initLocationUpdates()
}
@@ -100,6 +87,16 @@ class TelegramService : Service(), LocationListener, TelegramIncomingMessagesLis
return Service.START_REDELIVER_INTENT
}
+ private fun setupServiceErrorInterval() {
+ serviceErrorInterval = serviceOffInterval / 5
+ // 1. not more than 12 mins
+ serviceErrorInterval = Math.min(serviceErrorInterval, 12 * 60 * 1000)
+ // 2. not less than 30 seconds
+ serviceErrorInterval = Math.max(serviceErrorInterval, 30 * 1000)
+ // 3. not more than serviceOffInterval
+ serviceErrorInterval = Math.min(serviceErrorInterval, serviceOffInterval)
+ }
+
override fun onDestroy() {
super.onDestroy()
val app = app()
@@ -141,7 +138,7 @@ class TelegramService : Service(), LocationListener, TelegramIncomingMessagesLis
}
} else {
val alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager
- pendingIntent = PendingIntent.getBroadcast(this, 0, Intent(this, OnNavigationServiceAlarmReceiver::class.java), PendingIntent.FLAG_UPDATE_CURRENT)
+ pendingIntent = PendingIntent.getBroadcast(this, 0, Intent(this, OnTelegramServiceAlarmReceiver::class.java), PendingIntent.FLAG_UPDATE_CURRENT)
alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 500, serviceOffInterval, pendingIntent)
}
}
@@ -156,10 +153,6 @@ class TelegramService : Service(), LocationListener, TelegramIncomingMessagesLis
}
}
- private fun needLocation(): Boolean {
- return (usedBy and USED_BY_MY_LOCATION) > 0
- }
-
private fun isContinuous(): Boolean {
return serviceOffInterval == 0L
}
@@ -228,6 +221,8 @@ class TelegramService : Service(), LocationListener, TelegramIncomingMessagesLis
const val USAGE_INTENT = "SERVICE_USED_BY"
const val USAGE_OFF_INTERVAL = "SERVICE_OFF_INTERVAL"
+ const val OFF_INTERVAL_THRESHOLD: Long = 30000L
+
private var lockStatic: PowerManager.WakeLock? = null
@Synchronized
@@ -243,6 +238,18 @@ class TelegramService : Service(), LocationListener, TelegramIncomingMessagesLis
}
}
+ fun isUsedByMyLocation(usedBy: Int): Boolean {
+ return (usedBy and USED_BY_MY_LOCATION) > 0
+ }
+
+ fun isOffIntervalDepended(usedBy: Int): Boolean {
+ return isUsedByMyLocation(usedBy)
+ }
+
+ fun normalizeOffInterval(interval: Long): Long {
+ return if (interval < OFF_INTERVAL_THRESHOLD) 0 else interval
+ }
+
fun convertLocation(l: Location?): net.osmand.Location? {
if (l == null) {
return null
diff --git a/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramHelper.kt b/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramHelper.kt
index 3f5940c566..ee0292447e 100644
--- a/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramHelper.kt
+++ b/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramHelper.kt
@@ -230,7 +230,7 @@ class TelegramHelper private constructor() {
offsetOrder = last.order
offsetChatId = last.chatId
}
- client?.send(TdApi.GetChats(offsetOrder, offsetChatId, CHATS_LIMIT - chatList.size), { obj ->
+ client?.send(TdApi.GetChats(offsetOrder, offsetChatId, CHATS_LIMIT - chatList.size)) { obj ->
when (obj.constructor) {
TdApi.Error.CONSTRUCTOR -> {
val error = obj as TdApi.Error
@@ -250,7 +250,7 @@ class TelegramHelper private constructor() {
}
else -> listener?.onTelegramError(-1, "Receive wrong response from TDLib: $obj")
}
- })
+ }
return
}
}
@@ -264,7 +264,7 @@ class TelegramHelper private constructor() {
for (chatTitle in chatTitles) {
val chatId = this.chatTitles[chatTitle]
if (chatId != null) {
- client?.send(TdApi.SearchChatRecentLocationMessages(chatId, CHAT_LIVE_USERS_LIMIT), { obj ->
+ client?.send(TdApi.SearchChatRecentLocationMessages(chatId, CHAT_LIVE_USERS_LIMIT)) { obj ->
when (obj.constructor) {
TdApi.Error.CONSTRUCTOR -> {
val error = obj as TdApi.Error
@@ -284,7 +284,7 @@ class TelegramHelper private constructor() {
}
else -> listener?.onTelegramError(-1, "Receive wrong response from TDLib: $obj")
}
- })
+ }
}
}
}
@@ -313,7 +313,7 @@ class TelegramHelper private constructor() {
private fun getActiveLiveLocationMessages(onComplete: (() -> Unit)?) {
requestingActiveLiveLocationMessages = true
- client?.send(TdApi.GetActiveLiveLocationMessages(), { obj ->
+ client?.send(TdApi.GetActiveLiveLocationMessages()) { obj ->
when (obj.constructor) {
TdApi.Error.CONSTRUCTOR -> {
val error = obj as TdApi.Error
@@ -336,7 +336,7 @@ class TelegramHelper private constructor() {
else -> listener?.onSendLiveLicationError(-1, "Receive wrong response from TDLib: $obj")
}
requestingActiveLiveLocationMessages = false
- })
+ }
}
private fun sendLiveLocationImpl(chatTitles: List, livePeriod: Int = 61, latitude: Double, longitude: Double) {
@@ -575,7 +575,7 @@ class TelegramHelper private constructor() {
val remotePhoto = chat.photo?.small?.remote
if (remotePhoto != null && remotePhoto.id.isNotEmpty()) {
downloadChatFilesMap[remotePhoto.id] = chat
- client!!.send(TdApi.GetRemoteFile(remotePhoto.id, null), { obj ->
+ client!!.send(TdApi.GetRemoteFile(remotePhoto.id, null)) { obj ->
when (obj.constructor) {
TdApi.Error.CONSTRUCTOR -> {
val error = obj as TdApi.Error
@@ -590,7 +590,7 @@ class TelegramHelper private constructor() {
}
else -> listener?.onTelegramError(-1, "Receive wrong response from TDLib: $obj")
}
- })
+ }
}
}
val order = chat.order
@@ -630,6 +630,7 @@ class TelegramHelper private constructor() {
chat.lastMessage = updateChat.lastMessage
setChatOrder(chat, updateChat.order)
}
+ //listener?.onTelegramChatsChanged()
}
}
TdApi.UpdateChatOrder.CONSTRUCTOR -> {
@@ -650,6 +651,7 @@ class TelegramHelper private constructor() {
chat.isPinned = updateChat.isPinned
setChatOrder(chat, updateChat.order)
}
+ //listener?.onTelegramChatsChanged()
}
}
TdApi.UpdateChatReadInbox.CONSTRUCTOR -> {
@@ -751,6 +753,7 @@ class TelegramHelper private constructor() {
chat.draftMessage = updateChat.draftMessage
setChatOrder(chat, updateChat.order)
}
+ //listener?.onTelegramChatsChanged()
}
}
TdApi.UpdateNotificationSettings.CONSTRUCTOR -> {