diff --git a/OsmAnd-telegram/res/layout/fragment_live_now_tab.xml b/OsmAnd-telegram/res/layout/fragment_live_now_tab.xml
index b9b6feb1d9..0995bb0735 100644
--- a/OsmAnd-telegram/res/layout/fragment_live_now_tab.xml
+++ b/OsmAnd-telegram/res/layout/fragment_live_now_tab.xml
@@ -5,12 +5,30 @@
android:layout_height="match_parent"
android:orientation="vertical">
-
+ android:layout_height="match_parent">
+
+
+
+
+
+
diff --git a/OsmAnd-telegram/res/values/strings.xml b/OsmAnd-telegram/res/values/strings.xml
index 42f668e25d..0546dbd120 100644
--- a/OsmAnd-telegram/res/values/strings.xml
+++ b/OsmAnd-telegram/res/values/strings.xml
@@ -1,4 +1,5 @@
+ Open OsmAnd
Live
Bot
Registration in Telegram
diff --git a/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramHelper.kt b/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramHelper.kt
index 3cd053c849..553f8fd28f 100644
--- a/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramHelper.kt
+++ b/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramHelper.kt
@@ -7,7 +7,6 @@ import org.drinkless.td.libcore.telegram.Client
import org.drinkless.td.libcore.telegram.Client.ResultHandler
import org.drinkless.td.libcore.telegram.TdApi
import org.drinkless.td.libcore.telegram.TdApi.AuthorizationState
-import org.json.JSONObject
import java.io.File
import java.util.*
import java.util.concurrent.ConcurrentHashMap
@@ -28,6 +27,9 @@ class TelegramHelper private constructor() {
private const val UPDATE_LIVE_MESSAGES_INTERVAL_SEC = 30L
private const val MESSAGE_ACTIVE_TIME_SEC = 24 * 60 * 60 // 24 hours
+ private const val DEVICE_PREFIX = "Device: "
+ private const val LOCATION_PREFIX = "Location: "
+
// min and max values for the Telegram API
const val MIN_LOCATION_MESSAGE_LIVE_PERIOD_SEC = 61
const val MAX_LOCATION_MESSAGE_LIVE_PERIOD_SEC = 60 * 60 * 24 - 1 // one day
@@ -83,6 +85,7 @@ class TelegramHelper private constructor() {
var listener: TelegramListener? = null
private val incomingMessagesListeners = HashSet()
+ private val fullInfoUpdatesListeners = HashSet()
fun addIncomingMessagesListener(listener: TelegramIncomingMessagesListener) {
incomingMessagesListeners.add(listener)
@@ -92,6 +95,14 @@ class TelegramHelper private constructor() {
incomingMessagesListeners.remove(listener)
}
+ fun addFullInfoUpdatesListener(listener: FullInfoUpdatesListener) {
+ fullInfoUpdatesListeners.add(listener)
+ }
+
+ fun removeFullInfoUpdatesListener(listener: FullInfoUpdatesListener) {
+ fullInfoUpdatesListeners.remove(listener)
+ }
+
fun getChatList(): TreeSet {
synchronized(chatList) {
return TreeSet(chatList.filter { !it.isChannel })
@@ -128,9 +139,21 @@ class TelegramHelper private constructor() {
return res
}
- fun getBasicGroupFullInfo(id: Int) = basicGroupsFullInfo[id]
+ fun getBasicGroupFullInfo(id: Int): TdApi.BasicGroupFullInfo? {
+ val res = basicGroupsFullInfo[id]
+ if (res == null) {
+ requestBasicGroupFullInfo(id)
+ }
+ return res
+ }
- fun getSupergroupFullInfo(id: Int) = supergroupsFullInfo[id]
+ fun getSupergroupFullInfo(id: Int): TdApi.SupergroupFullInfo? {
+ val res = supergroupsFullInfo[id]
+ if (res == null) {
+ requestSupergroupFullInfo(id)
+ }
+ return res
+ }
fun isGroup(chat: TdApi.Chat): Boolean {
return chat.type is TdApi.ChatTypeSupergroup || chat.type is TdApi.ChatTypeBasicGroup
@@ -178,6 +201,11 @@ class TelegramHelper private constructor() {
fun updateLocationMessages()
}
+ interface FullInfoUpdatesListener {
+ fun onBasicGroupFullInfoUpdated(groupId: Int, info: TdApi.BasicGroupFullInfo)
+ fun onSupergroupFullInfoUpdated(groupId: Int, info: TdApi.SupergroupFullInfo)
+ }
+
interface TelegramAuthorizationRequestListener {
fun onRequestTelegramAuthenticationParameter(parameterType: TelegramAuthenticationParameterType)
fun onTelegramAuthorizationRequestError(code: Int, message: String)
@@ -253,6 +281,19 @@ class TelegramHelper private constructor() {
}
}
+ fun getOsmAndBotDeviceName(message: TdApi.Message): String {
+ var deviceName = ""
+ if (message.replyMarkup is TdApi.ReplyMarkupInlineKeyboard) {
+ val replyMarkup = message.replyMarkup as TdApi.ReplyMarkupInlineKeyboard
+ try {
+ deviceName = replyMarkup.rows[0][1].text.split("\\s".toRegex())[1]
+ } catch (e: Exception) {
+
+ }
+ }
+ return deviceName
+ }
+
fun isOsmAndBot(userId: Int) = users[userId]?.username == OSMAND_BOT_USERNAME
fun isBot(userId: Int) = users[userId]?.type is TdApi.UserTypeBot
@@ -351,6 +392,42 @@ class TelegramHelper private constructor() {
listener?.onTelegramChatsRead()
}
+ private fun requestBasicGroupFullInfo(id: Int) {
+ client?.send(TdApi.GetBasicGroupFullInfo(id)) { obj ->
+ when (obj.constructor) {
+ TdApi.Error.CONSTRUCTOR -> {
+ val error = obj as TdApi.Error
+ if (error.code != IGNORED_ERROR_CODE) {
+ listener?.onTelegramError(error.code, error.message)
+ }
+ }
+ TdApi.BasicGroupFullInfo.CONSTRUCTOR -> {
+ val info = obj as TdApi.BasicGroupFullInfo
+ basicGroupsFullInfo[id] = info
+ fullInfoUpdatesListeners.forEach { it.onBasicGroupFullInfoUpdated(id, info) }
+ }
+ }
+ }
+ }
+
+ private fun requestSupergroupFullInfo(id: Int) {
+ client?.send(TdApi.GetSupergroupFullInfo(id)) { obj ->
+ when (obj.constructor) {
+ TdApi.Error.CONSTRUCTOR -> {
+ val error = obj as TdApi.Error
+ if (error.code != IGNORED_ERROR_CODE) {
+ listener?.onTelegramError(error.code, error.message)
+ }
+ }
+ TdApi.SupergroupFullInfo.CONSTRUCTOR -> {
+ val info = obj as TdApi.SupergroupFullInfo
+ supergroupsFullInfo[id] = info
+ fullInfoUpdatesListeners.forEach { it.onSupergroupFullInfoUpdated(id, info) }
+ }
+ }
+ }
+ }
+
private fun requestCurrentUser(){
client?.send(TdApi.GetMe()) { obj ->
when (obj.constructor) {
@@ -384,6 +461,9 @@ class TelegramHelper private constructor() {
val oldContent = message.content
if (oldContent is TdApi.MessageText) {
message.content = parseOsmAndBotLocation(oldContent.text.text)
+ } else if (oldContent is TdApi.MessageLocation &&
+ (isOsmAndBot(message.senderUserId) || isOsmAndBot(message.viaBotUserId))) {
+ message.content = parseOsmAndBotLocation(message)
}
removeOldMessages(message.senderUserId, message.chatId)
usersLocationMessages[message.id] = message
@@ -627,51 +707,54 @@ class TelegramHelper private constructor() {
val content = content
return when (content) {
is TdApi.MessageLocation -> true
- is TdApi.MessageText -> {
- if (content.text.text.startsWith("{")) {
- // TODO: get user from library if null
- if (isOsmAndBot(senderUserId)) {
- return true
- }
- }
- false
- }
+ is TdApi.MessageText -> isOsmAndBot(senderUserId) || isOsmAndBot(viaBotUserId)
else -> false
}
}
- private fun parseOsmAndBotLocation(json: String): MessageOsmAndBotLocation {
- val obj = JSONObject(json)
- return MessageOsmAndBotLocation(
- obj.optString("name", ""),
- obj.optDouble("lat", -1.0),
- obj.optDouble("lon", -1.0),
- obj.optDouble("alt", -1.0),
- obj.optDouble("azi", -1.0),
- obj.optDouble("spd", -1.0),
- obj.optInt("updAgo", -1),
- obj.optInt("locAgo", -1),
- obj.optInt("updId", -1),
- obj.optInt("updTime", -1)
- )
+ private fun parseOsmAndBotLocation(message: TdApi.Message): MessageOsmAndBotLocation {
+ val messageLocation = message.content as TdApi.MessageLocation
+ val res = MessageOsmAndBotLocation()
+ res.name = getOsmAndBotDeviceName(message)
+ res.lat = messageLocation.location.latitude
+ res.lon = messageLocation.location.longitude
+ return res
+ }
+
+ private fun parseOsmAndBotLocation(text: String): MessageOsmAndBotLocation {
+ val res = MessageOsmAndBotLocation()
+ for (s in text.lines()) {
+ when {
+ s.startsWith(DEVICE_PREFIX) -> {
+ res.name = s.removePrefix(DEVICE_PREFIX)
+ }
+ s.startsWith(LOCATION_PREFIX) -> {
+ val locStr = s.removePrefix(LOCATION_PREFIX)
+ try {
+ val (latS, lonS) = locStr.split(" ")
+ res.lat = latS.dropLast(1).toDouble()
+ res.lon = lonS.toDouble()
+ } catch (e: Exception) {
+ e.printStackTrace()
+ }
+ }
+ }
+ }
+ return res
}
- class MessageOsmAndBotLocation internal constructor(
- val name: String,
- val lat: Double,
- val lon: Double,
- val alt: Double,
- val azi: Double,
- val spd: Double,
- val updAgo: Int,
- val locAgo: Int,
- val updId: Int,
- val updTime: Int
- ) : TdApi.MessageContent() {
+ class MessageOsmAndBotLocation : TdApi.MessageContent() {
+
+ var name: String = ""
+ internal set
+ var lat: Double = Double.NaN
+ internal set
+ var lon: Double = Double.NaN
+ internal set
override fun getConstructor() = -1
- fun isValid() = name != "" && lat != -1.0 && lon != -1.0
+ fun isValid() = name != "" && lat != Double.NaN && lon != Double.NaN
}
class OrderedChat internal constructor(internal val order: Long, internal val chatId: Long, internal val isChannel: Boolean) : Comparable {
@@ -881,6 +964,9 @@ class TelegramHelper private constructor() {
val newContent = updateMessageContent.newContent
message.content = if (newContent is TdApi.MessageText) {
parseOsmAndBotLocation(newContent.text.text)
+ } else if (newContent is TdApi.MessageLocation &&
+ (isOsmAndBot(message.senderUserId) || isOsmAndBot(message.viaBotUserId))) {
+ parseOsmAndBotLocation(message)
} else {
newContent
}
@@ -989,11 +1075,21 @@ class TelegramHelper private constructor() {
}
TdApi.UpdateBasicGroupFullInfo.CONSTRUCTOR -> {
val updateBasicGroupFullInfo = obj as TdApi.UpdateBasicGroupFullInfo
- basicGroupsFullInfo[updateBasicGroupFullInfo.basicGroupId] = updateBasicGroupFullInfo.basicGroupFullInfo
+ val id = updateBasicGroupFullInfo.basicGroupId
+ if (basicGroupsFullInfo.containsKey(id)) {
+ val info = updateBasicGroupFullInfo.basicGroupFullInfo
+ basicGroupsFullInfo[id] = info
+ fullInfoUpdatesListeners.forEach { it.onBasicGroupFullInfoUpdated(id, info) }
+ }
}
TdApi.UpdateSupergroupFullInfo.CONSTRUCTOR -> {
val updateSupergroupFullInfo = obj as TdApi.UpdateSupergroupFullInfo
- supergroupsFullInfo[updateSupergroupFullInfo.supergroupId] = updateSupergroupFullInfo.supergroupFullInfo
+ val id = updateSupergroupFullInfo.supergroupId
+ if (supergroupsFullInfo.containsKey(id)) {
+ val info = updateSupergroupFullInfo.supergroupFullInfo
+ supergroupsFullInfo[id] = info
+ fullInfoUpdatesListeners.forEach { it.onSupergroupFullInfoUpdated(id, info) }
+ }
}
}
}
diff --git a/OsmAnd-telegram/src/net/osmand/telegram/ui/LiveNowTabFragment.kt b/OsmAnd-telegram/src/net/osmand/telegram/ui/LiveNowTabFragment.kt
index 34fbc8355c..2b7dd7b40b 100644
--- a/OsmAnd-telegram/src/net/osmand/telegram/ui/LiveNowTabFragment.kt
+++ b/OsmAnd-telegram/src/net/osmand/telegram/ui/LiveNowTabFragment.kt
@@ -11,6 +11,7 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ArrayAdapter
+import android.widget.Button
import android.widget.ImageView
import android.widget.TextView
import net.osmand.Location
@@ -18,6 +19,7 @@ import net.osmand.telegram.R
import net.osmand.telegram.TelegramApplication
import net.osmand.telegram.TelegramLocationProvider.TelegramCompassListener
import net.osmand.telegram.TelegramLocationProvider.TelegramLocationListener
+import net.osmand.telegram.helpers.OsmandAidlHelper
import net.osmand.telegram.helpers.TelegramHelper.*
import net.osmand.telegram.helpers.TelegramUiHelper
import net.osmand.telegram.helpers.TelegramUiHelper.ChatItem
@@ -33,7 +35,7 @@ private const val CHAT_VIEW_TYPE = 0
private const val LOCATION_ITEM_VIEW_TYPE = 1
class LiveNowTabFragment : Fragment(), TelegramListener, TelegramIncomingMessagesListener,
- TelegramLocationListener, TelegramCompassListener {
+ FullInfoUpdatesListener, TelegramLocationListener, TelegramCompassListener {
private val app: TelegramApplication
get() = activity?.application as TelegramApplication
@@ -67,6 +69,12 @@ class LiveNowTabFragment : Fragment(), TelegramListener, TelegramIncomingMessage
}
})
}
+ mainView.findViewById
diff --git a/OsmAnd/res/values-et/strings.xml b/OsmAnd/res/values-et/strings.xml
index 4f63b05a38..c77c7ae1f3 100644
--- a/OsmAnd/res/values-et/strings.xml
+++ b/OsmAnd/res/values-et/strings.xml
@@ -1,4 +1,5 @@
-Lisa lahioleku ajad
+
+Lisa lahioleku ajad
Kirjeldus
Kontakti info
@@ -171,4 +172,42 @@
Näita/peida OSM Notes
Näita OSM Notes
Peida OSM Notes
-
\ No newline at end of file
+ Täname tagasiside eest
+ Sõlme või teed ei leitud.
+ Otsingutulemused puuduvad? Anna meile tagasisidet
+ Suurenda otsingu raadiust kuni %1$s
+ Saada otsingu päring?
+ Maailm
+ Punkt %1$s kustutatud
+ Muuda punkti
+ Lisa punkt
+ Salvesta jäljena
+ Lisasid %1$s punkti. Sisesta faili nimi ja vajuta \"Salvesta\".
+ Palun saada ekraanipilt sellest teatest aadressil support@osmand.net
+ Muuda tegevusi
+ Järjehoidja
+ Peida täielik kirjeldus
+ Näita täielikku kirjeldust
+ Ava Wikipedia link veebis
+ Link avatakse brauseris.
+ Kuidas link avada?
+ Loe Wikipediat ilma võrguühenduseta
+ Lae kõik alla
+ Rakenduse taaskäivitamine
+ Näita pilte
+ Kaardid, mida vajad
+ OsmAnd meeskond
+ Populaarsed sihtkohad
+ Makstud rakendus
+ Makstud lisa
+ Uuendus saadaval
+ Lae fail alla
+ Alusta muutmist
+ Hangi piiramatu ligipääs
+ Kaardiuuendused: iga kuu
+ Kaardiuuendused: iga tund
+ Rakenduse sisene ost
+ Ühekordne makse
+ Osta - %1$s
+ Liitu - %1$s
+
diff --git a/OsmAnd/res/values-fa/phrases.xml b/OsmAnd/res/values-fa/phrases.xml
index 32bd87afc0..7bba9b84ee 100644
--- a/OsmAnd/res/values-fa/phrases.xml
+++ b/OsmAnd/res/values-fa/phrases.xml
@@ -618,7 +618,7 @@
حوضه بندرگاه
بندرگاه
لندمارک
-]چراغ دریایی
+چراغ دریایی
چراغ بزرگ دریایی
چراغ کوچک دریایی
چراغ شناور دریایی
diff --git a/OsmAnd/res/values-fa/strings.xml b/OsmAnd/res/values-fa/strings.xml
index 783569ce28..34440ee014 100644
--- a/OsmAnd/res/values-fa/strings.xml
+++ b/OsmAnd/res/values-fa/strings.xml
@@ -738,7 +738,7 @@
قبلاً از نقاط برگزیده یک خروجی تهیه کردهاید و فایلش وجود دارد. خروجی جدید را جایگزین آن میکنید؟
- بهوسیلهٔ این افزونه میتوانید تنظیمات توسعهای و امکانات عیبیابی را مشاهده کنید؛ مانند شبیهسازی مسیریابی، آزمایش عملکرد رندرینگ یا امتحانکردن پیامهای صوتی.
+ بهوسیلهٔ این افزونه میتوانید تنظیمات توسعهای و امکانات عیبیابی را مشاهده کنید؛ مانند شبیهسازی مسیریابی، آزمایش عملکرد رندر یا امتحانکردن پیامهای صوتی.
\nاین تنظیمات برای توسعهدهندگان فراهم شده است و بهکار کاربران عادی نمیآید.
پایان شبیهسازی
شروع شبیهسازی
@@ -892,7 +892,7 @@
GPX
همهٔ عوارض زمین را روی نقشه ناپدید کنید.
چندضلعیها
- حالت رندرکردن
+ حالت رندرگیری
بهینهسازی نقشه برای
از این زوم نمایان شود (نیازمند دادههای منحنی تراز):
نشاندادن منحنیهای تراز
@@ -1170,8 +1170,8 @@
هیچموردی برای %1$s وجود ندارد
دارید %2$s مورد را %1$s میکنید. ادامه میدهید؟
- اطلاعات عیبیابی رندرینگ
- عملکرد رندرینگ را نمایش میدهد.
+ اطلاعات عیبیابی رندرگیری
+ عملکرد رندرگیری را نمایش میدهد.
بلندگوی پخش راهنمای صوتی را انتخاب کنید.
منبع صدای تماس تلفنی (همچنین برای وقفهانداختن در دستگاه پخش خودرو)
@@ -1195,11 +1195,11 @@
برای مشاهدهٔ مکان، پیوند اینترنتی %1$s یا پیوند اندرویدی %2$s را باز کنید
Geocache
- بهجای نمایش یکبارهٔ تصویر از رندرینگ پیوسته استفاده شود.
+ بهجای نمایش یکبارهٔ تصویر از رندرکردن پیوسته استفاده شود.
رندرکننده بارگذاری شد
بارگذاری رندرکننده ناموفق بود
- رسمکنندهٔ بُرداری
- شکلوشمایل رندر را انتخاب نمایید.
+ رندرکنندهٔ بُرداری
+ شکلوشمایل رندرگیری را انتخاب نمایید.
فیلتر
جستوجوی وسیلهٔ حملونقل در ایستگاه
نحوهٔ چرخش نقشه را انتخاب کنید.
@@ -1751,8 +1751,8 @@
همهٔ دانلودها
بهروزرسانیها
بیخیال
- استفاده از رندرینگ OpenGL
- از رندرینگ سرعتیافتهٔ سختافزاری OpenGL استفاده کن (شاید مصرف باتری افزایش یابد یا روی دستگاههای خیلی قدیمی کار نکند).
+ استفاده از رندرگیری OpenGL
+ از رندرگیری سرعتیافتهٔ سختافزاری OpenGL استفاده کن (شاید مصرف باتری افزایش یابد یا روی دستگاههای خیلی قدیمی کار نکند).
%1$s به این مجوز نیاز دارد تا برای صرفهجویی در انرژی، بتواند نمایشگر را خاموش کند.
قبل از رسیدن به پیچ، نمایشگر روشن شود (اگر خاموش است).
هرگز
@@ -2241,7 +2241,7 @@
نشانههای فعال
نشانههای نقشه
نشانهٔ نقشه
- توصیه میکنیم رسم چندضلعیها را غیرفعال کنید.
+ توصیه میکنیم رندرشدن چندضلعیها را غیرفعال کنید.
نمایش مسیرهای دوچرخهسواری کوهستانی (MTB)
چندضلعیها را نشان بده
وضعیت
diff --git a/OsmAnd/res/values-sk/strings.xml b/OsmAnd/res/values-sk/strings.xml
index 99b7719fc3..3fabe83e0f 100644
--- a/OsmAnd/res/values-sk/strings.xml
+++ b/OsmAnd/res/values-sk/strings.xml
@@ -2965,15 +2965,17 @@ Zodpovedá oblasti: %1$s x %2$s
Pridali ste %1$s bodov. Zadajte názov súboru a stlačte \"Uložiť\".
Bod %1$s vymazaný
Celý svet
- • Navigácia: Opravený indikátor postupu, rýchle prepínanie začiatočného a koncového bodu trasy
+ • Navigácia: Opravený indikátor postupu, rýchle prepínanie začiatočného a koncového bodu trasy
\n
-\n • Mapové značky: opravené zapínanie a vypínanie skupín, možnosť skryť značky z mapy
+\n • Mapové značky: opravené zapínanie a vypínanie skupín, možnosť skryť značky z mapy
\n
-\n • Úpravy OSM: Možnosť meniť značky nebodových objektov, oprava chýbajúcich komentárov na poznámkach, záloha úprav
+\n • Úpravy OSM: Možnosť meniť značky nebodových objektov a ciest, oprava chýbajúcich komentárov na poznámkach, záloha úprav
\n
-\n • Vylepšené čítanie Wikipédie a Wikivoyage, aktualizované súbory sú už k dispozícii
+\n • Vylepšené čítanie Wikipédie a Wikivoyage, aktualizované súbory sú už k dispozícii
\n
-\n • Kontextové menu: opravené farby znakov ciest v nočnom režime, opravené doplnkové veľkosti menu
+\n • Kontextové menu: opravené farby znakov ciest v nočnom režime, opravené doplnkové veľkosti menu
+\n
+\n • Navigácia lodí: podpora pre vodné cesty
\n
\n • Opravy ďalších chýb
\n
@@ -2983,4 +2985,8 @@ Zodpovedá oblasti: %1$s x %2$s
Žiadne výsledky?
\nPovedzte nám o tom.
Odoslať vyhľadávaciu požiadavku?
+ Ďakujeme za vašu spätnú väzbu
+ Nebol nájdený bod ani cesta.
+ Žiadne výsledky vyhľadávania?
+\nDajte nám spätnú väzbu