From cfaf362a5e972d7a53b39b89985f72fdef251e06 Mon Sep 17 00:00:00 2001 From: Chumva Date: Wed, 15 Aug 2018 19:08:30 +0300 Subject: [PATCH 01/17] add TelegramLocationListeners to SetTimeDialogFragment --- OsmAnd-telegram/res/values/strings.xml | 2 + .../telegram/ui/SetTimeDialogFragment.kt | 103 +++++++++++++++++- 2 files changed, 103 insertions(+), 2 deletions(-) diff --git a/OsmAnd-telegram/res/values/strings.xml b/OsmAnd-telegram/res/values/strings.xml index 24d6e5811e..f9fb2b5764 100644 --- a/OsmAnd-telegram/res/values/strings.xml +++ b/OsmAnd-telegram/res/values/strings.xml @@ -1,4 +1,6 @@ + Group + To properly log out from your Telegram account, the Internet is needed. Close To invoke access from OsmAnd, open Telegram, go to Settings - Privacy and Security - Sessions and terminate that session. How to disconnect OsmAnd Location Sharing from the Telegram account diff --git a/OsmAnd-telegram/src/net/osmand/telegram/ui/SetTimeDialogFragment.kt b/OsmAnd-telegram/src/net/osmand/telegram/ui/SetTimeDialogFragment.kt index 17d5297909..ee2e41ae31 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/ui/SetTimeDialogFragment.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/ui/SetTimeDialogFragment.kt @@ -12,16 +12,23 @@ import android.view.View import android.view.ViewGroup import android.widget.ImageView import android.widget.TextView +import net.osmand.Location +import net.osmand.data.LatLon import net.osmand.telegram.R import net.osmand.telegram.TelegramApplication +import net.osmand.telegram.TelegramLocationProvider.TelegramLocationListener +import net.osmand.telegram.TelegramLocationProvider.TelegramCompassListener import net.osmand.telegram.helpers.ShareLocationHelper import net.osmand.telegram.helpers.TelegramUiHelper import net.osmand.telegram.ui.SetTimeDialogFragment.SetTimeListAdapter.ChatViewHolder import net.osmand.telegram.utils.AndroidUtils +import net.osmand.telegram.utils.OsmandFormatter +import net.osmand.telegram.utils.UiUtils +import net.osmand.util.MapUtils import org.drinkless.td.libcore.telegram.TdApi import java.util.concurrent.TimeUnit -class SetTimeDialogFragment : DialogFragment() { +class SetTimeDialogFragment : DialogFragment(), TelegramLocationListener, TelegramCompassListener { private val app: TelegramApplication get() = activity?.application as TelegramApplication @@ -29,6 +36,7 @@ class SetTimeDialogFragment : DialogFragment() { private val telegramHelper get() = app.telegramHelper private val settings get() = app.settings + private lateinit var locationViewCache: UiUtils.UpdateLocationViewCache private val adapter = SetTimeListAdapter() private lateinit var timeForAllTitle: TextView @@ -36,6 +44,10 @@ class SetTimeDialogFragment : DialogFragment() { private val chatLivePeriods = HashMap() + private var location: Location? = null + private var heading: Float? = null + private var locationUiUpdateAllowed: Boolean = true + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setStyle(DialogFragment.STYLE_NO_FRAME, R.style.AppTheme_NoActionbar) @@ -98,9 +110,16 @@ class SetTimeDialogFragment : DialogFragment() { override fun onResume() { super.onResume() + locationViewCache = app.uiUtils.getUpdateLocationViewCache() + startLocationUpdate() updateList() } + override fun onPause() { + super.onPause() + stopLocationUpdate() + } + override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) val chats = mutableListOf() @@ -111,6 +130,47 @@ class SetTimeDialogFragment : DialogFragment() { outState.putLongArray(CHATS_KEY, chats.toLongArray()) } + override fun updateLocation(location: Location?) { + val loc = this.location + val newLocation = loc == null && location != null + val locationChanged = loc != null && location != null + && loc.latitude != location.latitude + && loc.longitude != location.longitude + if (newLocation || locationChanged) { + this.location = location + updateLocationUi() + } + } + + override fun updateCompassValue(value: Float) { + // 99 in next line used to one-time initialize arrows (with reference vs. fixed-north direction) + // on non-compass devices + val lastHeading = heading ?: 99f + heading = value + if (Math.abs(MapUtils.degreesDiff(lastHeading.toDouble(), value.toDouble())) > 5) { + updateLocationUi() + } else { + heading = lastHeading + } + } + + private fun startLocationUpdate() { + app.locationProvider.addLocationListener(this) + app.locationProvider.addCompassListener(this) + updateLocationUi() + } + + private fun stopLocationUpdate() { + app.locationProvider.removeLocationListener(this) + app.locationProvider.removeCompassListener(this) + } + + private fun updateLocationUi() { + if (locationUiUpdateAllowed) { + app.runInUIThread { adapter.notifyDataSetChanged() } + } + } + private fun readFromBundle(bundle: Bundle?) { chatLivePeriods.clear() bundle?.getLongArray(CHATS_KEY)?.also { @@ -216,7 +276,35 @@ class SetTimeDialogFragment : DialogFragment() { TelegramUiHelper.setupPhoto(app, holder.icon, chat.photo?.small?.local?.path, placeholderId, false) holder.title?.text = chat.title - holder.description?.visibility = View.INVISIBLE + + val message = telegramHelper.getChatMessages(chat.id).firstOrNull() + if (message != null) { + val content = message.content + if (content is TdApi.MessageLocation && (location != null && content.location != null)) { + holder.description?.visibility = View.VISIBLE + if (telegramHelper.isGroup(chat)) { + holder.description?.text = getString(R.string.shared_string_group) + } else { + holder.description?.text = getListItemLiveTimeDescr(message) + + holder.locationViewContainer?.visibility = View.VISIBLE + locationViewCache.outdatedLocation = System.currentTimeMillis() / 1000 - + message.editDate > settings.staleLocTime + + app.uiUtils.updateLocationView( + holder.directionIcon, + holder.distanceText, + LatLon(content.location.latitude, content.location.longitude), + locationViewCache + ) + } + } else { + holder.locationViewContainer?.visibility = View.GONE + } + } else { + holder.description?.visibility = View.INVISIBLE + } + holder.textInArea?.apply { visibility = View.VISIBLE chatLivePeriods[chat.id]?.also { text = formatLivePeriod(it) } @@ -229,9 +317,20 @@ class SetTimeDialogFragment : DialogFragment() { override fun getItemCount() = chats.size + private fun getListItemLiveTimeDescr(message: TdApi.Message): String { + return getString(R.string.shared_string_live) + + ": ${OsmandFormatter.getFormattedDuration(app, getListItemLiveTime(message))}" + } + + private fun getListItemLiveTime(message: TdApi.Message): Long = (System.currentTimeMillis() / 1000) - message.date + + inner class ChatViewHolder(val view: View) : RecyclerView.ViewHolder(view) { val icon: ImageView? = view.findViewById(R.id.icon) val title: TextView? = view.findViewById(R.id.title) + val directionIcon: ImageView? = view.findViewById(R.id.direction_icon) + val distanceText: TextView? = view.findViewById(R.id.distance_text) + val locationViewContainer: View? = view.findViewById(R.id.location_view_container) val description: TextView? = view.findViewById(R.id.description) val textInArea: TextView? = view.findViewById(R.id.text_in_area) val bottomShadow: View? = view.findViewById(R.id.bottom_shadow) From 801385f9d268eff6de94a81d24b0a7f7318a5bd2 Mon Sep 17 00:00:00 2001 From: Chumva Date: Wed, 15 Aug 2018 19:12:24 +0300 Subject: [PATCH 02/17] remove unnecessary string --- OsmAnd-telegram/res/values/strings.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/OsmAnd-telegram/res/values/strings.xml b/OsmAnd-telegram/res/values/strings.xml index 3b9b367ed1..d029a09d44 100644 --- a/OsmAnd-telegram/res/values/strings.xml +++ b/OsmAnd-telegram/res/values/strings.xml @@ -1,5 +1,4 @@ - To properly log out from your Telegram account, the Internet is needed. Group To properly log out from your Telegram account, the Internet is needed. Close From be04f298e62184e036b1505cce5cc2917ec04d32 Mon Sep 17 00:00:00 2001 From: Chumva Date: Thu, 16 Aug 2018 10:41:46 +0300 Subject: [PATCH 03/17] add check for messages expire time --- .../telegram/ui/MyLocationTabFragment.kt | 28 ++++++++++++++----- .../telegram/ui/SetTimeDialogFragment.kt | 1 - 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/OsmAnd-telegram/src/net/osmand/telegram/ui/MyLocationTabFragment.kt b/OsmAnd-telegram/src/net/osmand/telegram/ui/MyLocationTabFragment.kt index ddc2238eff..74d4cd7401 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/ui/MyLocationTabFragment.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/ui/MyLocationTabFragment.kt @@ -577,19 +577,33 @@ class MyLocationTabFragment : Fragment(), TelegramListener { } holder.stopSharingDescr?.apply { - visibility = View.VISIBLE - text = "${getText(R.string.stop_at)}:" + if (expiresIn > 0) { + visibility = View.VISIBLE + text = "${getText(R.string.stop_at)}:" + } else { + visibility = View.INVISIBLE + } } holder.stopSharingFirstPart?.apply { - visibility = View.VISIBLE - text = OsmandFormatter.getFormattedTime(expiresIn) + if (expiresIn > 0) { + visibility = View.VISIBLE + text = OsmandFormatter.getFormattedTime(expiresIn) + } else { + visibility = View.INVISIBLE + } } holder.stopSharingSecondPart?.apply { - visibility = View.VISIBLE - text = "(${getString(R.string.in_time, - OsmandFormatter.getFormattedDuration(context!!, expiresIn, true))})" + if (expiresIn > 0) { + visibility = View.VISIBLE + text = "(${getString( + R.string.in_time, + OsmandFormatter.getFormattedDuration(context!!, expiresIn, true) + )})" + } else { + visibility = View.INVISIBLE + } } } } diff --git a/OsmAnd-telegram/src/net/osmand/telegram/ui/SetTimeDialogFragment.kt b/OsmAnd-telegram/src/net/osmand/telegram/ui/SetTimeDialogFragment.kt index ee2e41ae31..3e128186d4 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/ui/SetTimeDialogFragment.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/ui/SetTimeDialogFragment.kt @@ -324,7 +324,6 @@ class SetTimeDialogFragment : DialogFragment(), TelegramLocationListener, Telegr private fun getListItemLiveTime(message: TdApi.Message): Long = (System.currentTimeMillis() / 1000) - message.date - inner class ChatViewHolder(val view: View) : RecyclerView.ViewHolder(view) { val icon: ImageView? = view.findViewById(R.id.icon) val title: TextView? = view.findViewById(R.id.title) From ebd912bd42cfb038074c56d8dec79383bbb3696a Mon Sep 17 00:00:00 2001 From: Chumva Date: Thu, 16 Aug 2018 11:31:28 +0300 Subject: [PATCH 04/17] fix lastUpdated item time and refactor onBindViewHolder for holder in SetTimeDialogFragment --- .../telegram/helpers/TelegramUiHelper.kt | 14 +++++++++-- .../telegram/ui/MyLocationTabFragment.kt | 6 ++--- .../telegram/ui/SetTimeDialogFragment.kt | 24 +++++++++++-------- 3 files changed, 28 insertions(+), 16 deletions(-) diff --git a/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramUiHelper.kt b/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramUiHelper.kt index 6e11d46490..b1be155f27 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramUiHelper.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramUiHelper.kt @@ -54,7 +54,12 @@ object TelegramUiHelper { val type = chat.type val message = messages.firstOrNull() if (message != null) { - res.lastUpdated = message.editDate + val lastUpdated = message.editDate + res.lastUpdated = if (lastUpdated != 0) { + lastUpdated + } else { + message.date + } res.created = message.date } if (type is TdApi.ChatTypePrivate || type is TdApi.ChatTypeSecret) { @@ -147,7 +152,12 @@ object TelegramUiHelper { photoPath = helper.getUserPhotoPath(user) placeholderId = R.drawable.img_user_picture userId = message.senderUserId - lastUpdated = message.editDate + val editDate = message.editDate + lastUpdated = if (editDate != 0) { + editDate + } else { + message.date + } created = message.date } } diff --git a/OsmAnd-telegram/src/net/osmand/telegram/ui/MyLocationTabFragment.kt b/OsmAnd-telegram/src/net/osmand/telegram/ui/MyLocationTabFragment.kt index 74d4cd7401..9f128a250f 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/ui/MyLocationTabFragment.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/ui/MyLocationTabFragment.kt @@ -597,10 +597,8 @@ class MyLocationTabFragment : Fragment(), TelegramListener { holder.stopSharingSecondPart?.apply { if (expiresIn > 0) { visibility = View.VISIBLE - text = "(${getString( - R.string.in_time, - OsmandFormatter.getFormattedDuration(context!!, expiresIn, true) - )})" + text = "(${getString(R.string.in_time, + OsmandFormatter.getFormattedDuration(context!!, expiresIn, true))})" } else { visibility = View.INVISIBLE } diff --git a/OsmAnd-telegram/src/net/osmand/telegram/ui/SetTimeDialogFragment.kt b/OsmAnd-telegram/src/net/osmand/telegram/ui/SetTimeDialogFragment.kt index 3e128186d4..cec8d44d66 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/ui/SetTimeDialogFragment.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/ui/SetTimeDialogFragment.kt @@ -277,14 +277,16 @@ class SetTimeDialogFragment : DialogFragment(), TelegramLocationListener, Telegr TelegramUiHelper.setupPhoto(app, holder.icon, chat.photo?.small?.local?.path, placeholderId, false) holder.title?.text = chat.title - val message = telegramHelper.getChatMessages(chat.id).firstOrNull() - if (message != null) { - val content = message.content - if (content is TdApi.MessageLocation && (location != null && content.location != null)) { - holder.description?.visibility = View.VISIBLE - if (telegramHelper.isGroup(chat)) { - holder.description?.text = getString(R.string.shared_string_group) - } else { + if (telegramHelper.isGroup(chat)) { + holder.locationViewContainer?.visibility = View.GONE + holder.description?.visibility = View.VISIBLE + holder.description?.text = getString(R.string.shared_string_group) + } else { + val message = telegramHelper.getChatMessages(chat.id).firstOrNull() + if (message != null) { + val content = message.content + if (content is TdApi.MessageLocation && (location != null && content.location != null)) { + holder.description?.visibility = View.VISIBLE holder.description?.text = getListItemLiveTimeDescr(message) holder.locationViewContainer?.visibility = View.VISIBLE @@ -297,12 +299,14 @@ class SetTimeDialogFragment : DialogFragment(), TelegramLocationListener, Telegr LatLon(content.location.latitude, content.location.longitude), locationViewCache ) + } else { + holder.locationViewContainer?.visibility = View.GONE + holder.description?.visibility = View.INVISIBLE } } else { holder.locationViewContainer?.visibility = View.GONE + holder.description?.visibility = View.INVISIBLE } - } else { - holder.description?.visibility = View.INVISIBLE } holder.textInArea?.apply { From 4ca99c10ee9e4b61e9168c34afce82997dc8e9c4 Mon Sep 17 00:00:00 2001 From: Alex Sytnyk Date: Thu, 16 Aug 2018 12:23:50 +0300 Subject: [PATCH 05/17] Refactor TelegramHelper#addNewMessage --- .../src/net/osmand/telegram/helpers/TelegramHelper.kt | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramHelper.kt b/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramHelper.kt index 519bc862d0..f1f67c4ee6 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramHelper.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramHelper.kt @@ -481,13 +481,14 @@ class TelegramHelper private constructor() { private fun addNewMessage(message: TdApi.Message) { if (message.isAppropriate()) { + val fromBot = isOsmAndBot(message.senderUserId) + val viaBot = isOsmAndBot(message.viaBotUserId) val oldContent = message.content if (oldContent is TdApi.MessageText) { - val messageOsmAndBotLocation = parseOsmAndBotLocation(oldContent.text.text) - messageOsmAndBotLocation.created = message.date - message.content = messageOsmAndBotLocation - } else if (oldContent is TdApi.MessageLocation && - (isOsmAndBot(message.senderUserId) || isOsmAndBot(message.viaBotUserId))) { + message.content = parseOsmAndBotLocation(oldContent.text.text).apply { + created = message.date + } + } else if (oldContent is TdApi.MessageLocation && (fromBot || viaBot)) { message.content = parseOsmAndBotLocation(message) } removeOldMessages(message.senderUserId, message.chatId) From e668e12143e5c4c9c914afd204fd0e3910c91cf0 Mon Sep 17 00:00:00 2001 From: Chumva Date: Thu, 16 Aug 2018 12:43:47 +0300 Subject: [PATCH 06/17] change live to last response --- OsmAnd-telegram/res/values/strings.xml | 1 + .../osmand/telegram/ui/LiveNowTabFragment.kt | 4 +- .../telegram/ui/SetTimeDialogFragment.kt | 46 ++++++++++--------- 3 files changed, 27 insertions(+), 24 deletions(-) diff --git a/OsmAnd-telegram/res/values/strings.xml b/OsmAnd-telegram/res/values/strings.xml index d029a09d44..ec6f5d166c 100644 --- a/OsmAnd-telegram/res/values/strings.xml +++ b/OsmAnd-telegram/res/values/strings.xml @@ -1,4 +1,5 @@ + Last response Group To properly log out from your Telegram account, the Internet is needed. Close diff --git a/OsmAnd-telegram/src/net/osmand/telegram/ui/LiveNowTabFragment.kt b/OsmAnd-telegram/src/net/osmand/telegram/ui/LiveNowTabFragment.kt index af2037eb4b..62d64d5001 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/ui/LiveNowTabFragment.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/ui/LiveNowTabFragment.kt @@ -362,11 +362,11 @@ class LiveNowTabFragment : Fragment(), TelegramListener, TelegramIncomingMessage } private fun getListItemLiveTimeDescr(item: ListItem):String { - return getString(R.string.shared_string_live) + + return getString(R.string.last_response) + ": ${OsmandFormatter.getFormattedDuration(app, getListItemLiveTime(item))}" } - private fun getListItemLiveTime(item: ListItem): Long = (System.currentTimeMillis() / 1000) - item.created + private fun getListItemLiveTime(item: ListItem): Long = (System.currentTimeMillis() / 1000) - item.lastUpdated private fun showPopupMenu(holder: ChatViewHolder, chatId: Long) { val ctx = holder.itemView.context diff --git a/OsmAnd-telegram/src/net/osmand/telegram/ui/SetTimeDialogFragment.kt b/OsmAnd-telegram/src/net/osmand/telegram/ui/SetTimeDialogFragment.kt index cec8d44d66..495657f70a 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/ui/SetTimeDialogFragment.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/ui/SetTimeDialogFragment.kt @@ -283,26 +283,26 @@ class SetTimeDialogFragment : DialogFragment(), TelegramLocationListener, Telegr holder.description?.text = getString(R.string.shared_string_group) } else { val message = telegramHelper.getChatMessages(chat.id).firstOrNull() - if (message != null) { - val content = message.content - if (content is TdApi.MessageLocation && (location != null && content.location != null)) { - holder.description?.visibility = View.VISIBLE - holder.description?.text = getListItemLiveTimeDescr(message) - - holder.locationViewContainer?.visibility = View.VISIBLE - locationViewCache.outdatedLocation = System.currentTimeMillis() / 1000 - - message.editDate > settings.staleLocTime - - app.uiUtils.updateLocationView( - holder.directionIcon, - holder.distanceText, - LatLon(content.location.latitude, content.location.longitude), - locationViewCache - ) + val content = message?.content + if (message != null && content is TdApi.MessageLocation && (location != null && content.location != null)) { + val lastUpdated = if (message.editDate != 0) { + message.editDate } else { - holder.locationViewContainer?.visibility = View.GONE - holder.description?.visibility = View.INVISIBLE + message.date } + holder.description?.visibility = View.VISIBLE + holder.description?.text = getListItemLiveTimeDescr(lastUpdated) + + holder.locationViewContainer?.visibility = View.VISIBLE + locationViewCache.outdatedLocation = System.currentTimeMillis() / 1000 - + lastUpdated > settings.staleLocTime + + app.uiUtils.updateLocationView( + holder.directionIcon, + holder.distanceText, + LatLon(content.location.latitude, content.location.longitude), + locationViewCache + ) } else { holder.locationViewContainer?.visibility = View.GONE holder.description?.visibility = View.INVISIBLE @@ -321,12 +321,14 @@ class SetTimeDialogFragment : DialogFragment(), TelegramLocationListener, Telegr override fun getItemCount() = chats.size - private fun getListItemLiveTimeDescr(message: TdApi.Message): String { - return getString(R.string.shared_string_live) + - ": ${OsmandFormatter.getFormattedDuration(app, getListItemLiveTime(message))}" + private fun getListItemLiveTimeDescr(lastUpdated: Int): String { + return getString(R.string.last_response) + + ": ${OsmandFormatter.getFormattedDuration(app, getListItemLiveTime(lastUpdated))}" } - private fun getListItemLiveTime(message: TdApi.Message): Long = (System.currentTimeMillis() / 1000) - message.date + private fun getListItemLiveTime(lastUpdated: Int): Long { + return (System.currentTimeMillis() / 1000) - lastUpdated + } inner class ChatViewHolder(val view: View) : RecyclerView.ViewHolder(view) { val icon: ImageView? = view.findViewById(R.id.icon) From f1ece529408cf126c058bb67c9ef3c5e952bedbd Mon Sep 17 00:00:00 2001 From: Chumva Date: Thu, 16 Aug 2018 12:47:41 +0300 Subject: [PATCH 07/17] add scroll listener to recyclerView --- .../src/net/osmand/telegram/ui/SetTimeDialogFragment.kt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/OsmAnd-telegram/src/net/osmand/telegram/ui/SetTimeDialogFragment.kt b/OsmAnd-telegram/src/net/osmand/telegram/ui/SetTimeDialogFragment.kt index 495657f70a..7d67409779 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/ui/SetTimeDialogFragment.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/ui/SetTimeDialogFragment.kt @@ -78,6 +78,12 @@ class SetTimeDialogFragment : DialogFragment(), TelegramLocationListener, Telegr view.findViewById(R.id.recycler_view).apply { layoutManager = LinearLayoutManager(context) adapter = this@SetTimeDialogFragment.adapter + addOnScrollListener(object : RecyclerView.OnScrollListener() { + override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) { + super.onScrollStateChanged(recyclerView, newState) + locationUiUpdateAllowed = newState == RecyclerView.SCROLL_STATE_IDLE + } + }) } view.findViewById(R.id.secondary_btn).apply { From 9e697a40807c41a46157c78244716b1810486681 Mon Sep 17 00:00:00 2001 From: Chumva Date: Thu, 16 Aug 2018 13:16:58 +0300 Subject: [PATCH 08/17] add getLastUpdatedTime --- OsmAnd-telegram/res/values/strings.xml | 1 + .../osmand/telegram/helpers/TelegramHelper.kt | 25 ++++++++----------- .../telegram/helpers/TelegramUiHelper.kt | 19 ++------------ .../osmand/telegram/ui/LiveNowTabFragment.kt | 3 ++- .../telegram/ui/SetTimeDialogFragment.kt | 10 +++----- 5 files changed, 19 insertions(+), 39 deletions(-) diff --git a/OsmAnd-telegram/res/values/strings.xml b/OsmAnd-telegram/res/values/strings.xml index ec6f5d166c..11ffae080c 100644 --- a/OsmAnd-telegram/res/values/strings.xml +++ b/OsmAnd-telegram/res/values/strings.xml @@ -1,4 +1,5 @@ + ago Last response Group To properly log out from your Telegram account, the Internet is needed. diff --git a/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramHelper.kt b/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramHelper.kt index f1f67c4ee6..d5c38cfc14 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramHelper.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramHelper.kt @@ -177,6 +177,14 @@ class TelegramHelper private constructor() { return chat.type is TdApi.ChatTypeSupergroup || chat.type is TdApi.ChatTypeBasicGroup } + fun getLastUpdatedTime(message: TdApi.Message): Int { + return if (message.editDate != 0) { + message.editDate + } else { + message.date + } + } + fun isPrivateChat(chat: TdApi.Chat): Boolean = chat.type is TdApi.ChatTypePrivate private fun isChannel(chat: TdApi.Chat): Boolean { @@ -485,9 +493,7 @@ class TelegramHelper private constructor() { val viaBot = isOsmAndBot(message.viaBotUserId) val oldContent = message.content if (oldContent is TdApi.MessageText) { - message.content = parseOsmAndBotLocation(oldContent.text.text).apply { - created = message.date - } + message.content = parseOsmAndBotLocation(oldContent.text.text) } else if (oldContent is TdApi.MessageLocation && (fromBot || viaBot)) { message.content = parseOsmAndBotLocation(message) } @@ -761,13 +767,7 @@ class TelegramHelper private constructor() { name = getOsmAndBotDeviceName(message) lat = messageLocation.location.latitude lon = messageLocation.location.longitude - created = message.date - val date = message.editDate - lastUpdated = if (date != 0) { - date - } else { - message.date - } + lastUpdated = getLastUpdatedTime(message) } } @@ -777,7 +777,6 @@ class TelegramHelper private constructor() { name = oldContent.name lat = messageLocation.location.latitude lon = messageLocation.location.longitude - created = oldContent.created lastUpdated = (System.currentTimeMillis() / 1000).toInt() } } @@ -1069,9 +1068,7 @@ class TelegramHelper private constructor() { synchronized(message) { val newContent = updateMessageContent.newContent message.content = if (newContent is TdApi.MessageText) { - val messageOsmAndBotLocation = parseOsmAndBotLocation(newContent.text.text) - messageOsmAndBotLocation.created = message.date - messageOsmAndBotLocation + parseOsmAndBotLocation(newContent.text.text) } else if (newContent is TdApi.MessageLocation && (isOsmAndBot(message.senderUserId) || isOsmAndBot(message.viaBotUserId))) { parseOsmAndBotLocationContent(message.content as MessageOsmAndBotLocation, newContent) diff --git a/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramUiHelper.kt b/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramUiHelper.kt index b1be155f27..32ce38243a 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramUiHelper.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramUiHelper.kt @@ -54,13 +54,7 @@ object TelegramUiHelper { val type = chat.type val message = messages.firstOrNull() if (message != null) { - val lastUpdated = message.editDate - res.lastUpdated = if (lastUpdated != 0) { - lastUpdated - } else { - message.date - } - res.created = message.date + res.lastUpdated = helper.getLastUpdatedTime(message) } if (type is TdApi.ChatTypePrivate || type is TdApi.ChatTypeSecret) { val userId = getUserIdFromChatType(type) @@ -130,7 +124,6 @@ object TelegramUiHelper { latLon = LatLon(content.lat, content.lon) placeholderId = R.drawable.img_user_picture lastUpdated = content.lastUpdated - created = content.created } } else { null @@ -152,13 +145,7 @@ object TelegramUiHelper { photoPath = helper.getUserPhotoPath(user) placeholderId = R.drawable.img_user_picture userId = message.senderUserId - val editDate = message.editDate - lastUpdated = if (editDate != 0) { - editDate - } else { - message.date - } - created = message.date + lastUpdated = helper.getLastUpdatedTime(message) } } @@ -178,8 +165,6 @@ object TelegramUiHelper { internal set var lastUpdated: Int = 0 internal set - var created: Int = 0 - internal set abstract fun canBeOpenedOnMap(): Boolean diff --git a/OsmAnd-telegram/src/net/osmand/telegram/ui/LiveNowTabFragment.kt b/OsmAnd-telegram/src/net/osmand/telegram/ui/LiveNowTabFragment.kt index 62d64d5001..5949984077 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/ui/LiveNowTabFragment.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/ui/LiveNowTabFragment.kt @@ -363,7 +363,8 @@ class LiveNowTabFragment : Fragment(), TelegramListener, TelegramIncomingMessage private fun getListItemLiveTimeDescr(item: ListItem):String { return getString(R.string.last_response) + - ": ${OsmandFormatter.getFormattedDuration(app, getListItemLiveTime(item))}" + ": ${OsmandFormatter.getFormattedDuration(app, getListItemLiveTime(item))} " + + getString(R.string.time_ago) } private fun getListItemLiveTime(item: ListItem): Long = (System.currentTimeMillis() / 1000) - item.lastUpdated diff --git a/OsmAnd-telegram/src/net/osmand/telegram/ui/SetTimeDialogFragment.kt b/OsmAnd-telegram/src/net/osmand/telegram/ui/SetTimeDialogFragment.kt index 7d67409779..90c5228513 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/ui/SetTimeDialogFragment.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/ui/SetTimeDialogFragment.kt @@ -291,11 +291,7 @@ class SetTimeDialogFragment : DialogFragment(), TelegramLocationListener, Telegr val message = telegramHelper.getChatMessages(chat.id).firstOrNull() val content = message?.content if (message != null && content is TdApi.MessageLocation && (location != null && content.location != null)) { - val lastUpdated = if (message.editDate != 0) { - message.editDate - } else { - message.date - } + val lastUpdated = telegramHelper.getLastUpdatedTime(message) holder.description?.visibility = View.VISIBLE holder.description?.text = getListItemLiveTimeDescr(lastUpdated) @@ -328,8 +324,8 @@ class SetTimeDialogFragment : DialogFragment(), TelegramLocationListener, Telegr override fun getItemCount() = chats.size private fun getListItemLiveTimeDescr(lastUpdated: Int): String { - return getString(R.string.last_response) + - ": ${OsmandFormatter.getFormattedDuration(app, getListItemLiveTime(lastUpdated))}" + return "${OsmandFormatter.getFormattedDuration(app, getListItemLiveTime(lastUpdated))} " + + getString(R.string.time_ago) } private fun getListItemLiveTime(lastUpdated: Int): Long { From 85bd983223f18652605d31b9fef69002bb0e2470 Mon Sep 17 00:00:00 2001 From: Chumva Date: Thu, 16 Aug 2018 13:25:40 +0300 Subject: [PATCH 09/17] refactor getLastUpdatedTime --- .../src/net/osmand/telegram/helpers/TelegramHelper.kt | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramHelper.kt b/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramHelper.kt index d5c38cfc14..6aec7619ad 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramHelper.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramHelper.kt @@ -177,14 +177,8 @@ class TelegramHelper private constructor() { return chat.type is TdApi.ChatTypeSupergroup || chat.type is TdApi.ChatTypeBasicGroup } - fun getLastUpdatedTime(message: TdApi.Message): Int { - return if (message.editDate != 0) { - message.editDate - } else { - message.date - } - } - + fun getLastUpdatedTime(message: TdApi.Message) = Math.max(message.editDate, message.date) + fun isPrivateChat(chat: TdApi.Chat): Boolean = chat.type is TdApi.ChatTypePrivate private fun isChannel(chat: TdApi.Chat): Boolean { From f99086f668302829229642e67ecc5f8c21cecf18 Mon Sep 17 00:00:00 2001 From: Chumva Date: Thu, 16 Aug 2018 13:41:44 +0300 Subject: [PATCH 10/17] refactor getListItemLiveTimeDescr --- .../osmand/telegram/ui/LiveNowTabFragment.kt | 7 ++--- .../telegram/ui/MyLocationTabFragment.kt | 30 +++++++------------ .../telegram/ui/SetTimeDialogFragment.kt | 4 +-- 3 files changed, 16 insertions(+), 25 deletions(-) diff --git a/OsmAnd-telegram/src/net/osmand/telegram/ui/LiveNowTabFragment.kt b/OsmAnd-telegram/src/net/osmand/telegram/ui/LiveNowTabFragment.kt index 5949984077..4bcbe9d677 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/ui/LiveNowTabFragment.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/ui/LiveNowTabFragment.kt @@ -361,10 +361,9 @@ class LiveNowTabFragment : Fragment(), TelegramListener, TelegramIncomingMessage } } - private fun getListItemLiveTimeDescr(item: ListItem):String { - return getString(R.string.last_response) + - ": ${OsmandFormatter.getFormattedDuration(app, getListItemLiveTime(item))} " + - getString(R.string.time_ago) + private fun getListItemLiveTimeDescr(item: ListItem): String { + val formattedTime = OsmandFormatter.getFormattedDuration(app, getListItemLiveTime(item)) + return getString(R.string.last_response) + ": $formattedTime " + getString(R.string.time_ago) } private fun getListItemLiveTime(item: ListItem): Long = (System.currentTimeMillis() / 1000) - item.lastUpdated diff --git a/OsmAnd-telegram/src/net/osmand/telegram/ui/MyLocationTabFragment.kt b/OsmAnd-telegram/src/net/osmand/telegram/ui/MyLocationTabFragment.kt index 9f128a250f..65d0d497fe 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/ui/MyLocationTabFragment.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/ui/MyLocationTabFragment.kt @@ -577,35 +577,27 @@ class MyLocationTabFragment : Fragment(), TelegramListener { } holder.stopSharingDescr?.apply { - if (expiresIn > 0) { - visibility = View.VISIBLE - text = "${getText(R.string.stop_at)}:" - } else { - visibility = View.INVISIBLE - } + visibility = getStopSharingVisibility(expiresIn) + text = "${getText(R.string.stop_at)}:" } holder.stopSharingFirstPart?.apply { - if (expiresIn > 0) { - visibility = View.VISIBLE - text = OsmandFormatter.getFormattedTime(expiresIn) - } else { - visibility = View.INVISIBLE - } + visibility = getStopSharingVisibility(expiresIn) + text = OsmandFormatter.getFormattedTime(expiresIn) } holder.stopSharingSecondPart?.apply { - if (expiresIn > 0) { - visibility = View.VISIBLE - text = "(${getString(R.string.in_time, - OsmandFormatter.getFormattedDuration(context!!, expiresIn, true))})" - } else { - visibility = View.INVISIBLE - } + visibility = getStopSharingVisibility(expiresIn) + text = "(${getString( + R.string.in_time, + OsmandFormatter.getFormattedDuration(context!!, expiresIn, true) + )})" } } } + private fun getStopSharingVisibility(expiresIn: Long) = if (expiresIn > 0) View.VISIBLE else View.INVISIBLE + private fun removeItem(chat: TdApi.Chat) { chats.remove(chat) if (chats.isEmpty()) { diff --git a/OsmAnd-telegram/src/net/osmand/telegram/ui/SetTimeDialogFragment.kt b/OsmAnd-telegram/src/net/osmand/telegram/ui/SetTimeDialogFragment.kt index 90c5228513..85ee542610 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/ui/SetTimeDialogFragment.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/ui/SetTimeDialogFragment.kt @@ -324,8 +324,8 @@ class SetTimeDialogFragment : DialogFragment(), TelegramLocationListener, Telegr override fun getItemCount() = chats.size private fun getListItemLiveTimeDescr(lastUpdated: Int): String { - return "${OsmandFormatter.getFormattedDuration(app, getListItemLiveTime(lastUpdated))} " + - getString(R.string.time_ago) + val formattedTime = OsmandFormatter.getFormattedDuration(app, getListItemLiveTime(lastUpdated)) + return "$formattedTime " + getString(R.string.time_ago) } private fun getListItemLiveTime(lastUpdated: Int): Long { From 43427f39b828dea30a8a04fbec4eb010f17c6325 Mon Sep 17 00:00:00 2001 From: Chumva Date: Thu, 16 Aug 2018 13:48:39 +0300 Subject: [PATCH 11/17] remove unnecessary changes --- .../src/net/osmand/telegram/ui/MyLocationTabFragment.kt | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/OsmAnd-telegram/src/net/osmand/telegram/ui/MyLocationTabFragment.kt b/OsmAnd-telegram/src/net/osmand/telegram/ui/MyLocationTabFragment.kt index 65d0d497fe..3d9af9f7aa 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/ui/MyLocationTabFragment.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/ui/MyLocationTabFragment.kt @@ -588,10 +588,8 @@ class MyLocationTabFragment : Fragment(), TelegramListener { holder.stopSharingSecondPart?.apply { visibility = getStopSharingVisibility(expiresIn) - text = "(${getString( - R.string.in_time, - OsmandFormatter.getFormattedDuration(context!!, expiresIn, true) - )})" + text = "(${getString(R.string.in_time, + OsmandFormatter.getFormattedDuration(context!!, expiresIn, true))})" } } } From e4380be6f3013639350addf6b555149d39390684 Mon Sep 17 00:00:00 2001 From: Chumva Date: Thu, 16 Aug 2018 14:13:13 +0300 Subject: [PATCH 12/17] fix expired time for removing map points --- .../src/net/osmand/telegram/helpers/ShowLocationHelper.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OsmAnd-telegram/src/net/osmand/telegram/helpers/ShowLocationHelper.kt b/OsmAnd-telegram/src/net/osmand/telegram/helpers/ShowLocationHelper.kt index 7fc019a9d6..74f4ad5c77 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/helpers/ShowLocationHelper.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/helpers/ShowLocationHelper.kt @@ -54,7 +54,7 @@ class ShowLocationHelper(private val app: TelegramApplication) { val messages = telegramHelper.getMessages() for (message in messages) { val date = Math.max(message.date, message.editDate) * 1000L - val expired = System.currentTimeMillis() - date > app.settings.locHistoryTime + val expired = System.currentTimeMillis() - date > app.settings.locHistoryTime * 1000L if (expired) { removeMapPoint(message.chatId, message) } From 04d6e8215748c9cb36cb7b756b942a4416e1b59d Mon Sep 17 00:00:00 2001 From: Alex Sytnyk Date: Thu, 16 Aug 2018 15:15:50 +0300 Subject: [PATCH 13/17] Fix live messages --- .../osmand/telegram/helpers/TelegramHelper.kt | 26 +++++++++++++----- .../telegram/helpers/TelegramUiHelper.kt | 14 +++++----- .../osmand/telegram/ui/LiveNowTabFragment.kt | 27 ++++++++++--------- 3 files changed, 40 insertions(+), 27 deletions(-) diff --git a/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramHelper.kt b/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramHelper.kt index 6aec7619ad..bd09c9ca71 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramHelper.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramHelper.kt @@ -491,7 +491,7 @@ class TelegramHelper private constructor() { } else if (oldContent is TdApi.MessageLocation && (fromBot || viaBot)) { message.content = parseOsmAndBotLocation(message) } - removeOldMessages(message.senderUserId, message.chatId) + removeOldMessages(message, fromBot, viaBot) usersLocationMessages[message.id] = message incomingMessagesListeners.forEach { it.onReceiveChatLocationMessages(message.chatId, message) @@ -499,13 +499,25 @@ class TelegramHelper private constructor() { } } - private fun removeOldMessages(userId: Int, chatId: Long) { - val user = users[userId] - if (user != null && user.username != OSMAND_BOT_USERNAME) { - usersLocationMessages.values.filter { it.senderUserId == userId && it.chatId == chatId } - .forEach { - usersLocationMessages.remove(it.id) + private fun removeOldMessages(newMessage: TdApi.Message, fromBot: Boolean, viaBot: Boolean) { + val iterator = usersLocationMessages.entries.iterator() + while (iterator.hasNext()) { + val message = iterator.next().value + if (newMessage.chatId == message.chatId) { + val sameSender = newMessage.senderUserId == message.senderUserId + val viaSameBot = newMessage.viaBotUserId == message.viaBotUserId + if ((fromBot && sameSender) || (viaBot && viaSameBot)) { + val newCont = newMessage.content + val cont = message.content + if (newCont is MessageOsmAndBotLocation && cont is MessageOsmAndBotLocation) { + if (newCont.name == cont.name) { + iterator.remove() + } + } + } else if (sameSender) { + iterator.remove() } + } } } diff --git a/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramUiHelper.kt b/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramUiHelper.kt index 32ce38243a..2146140780 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramUiHelper.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramUiHelper.kt @@ -52,10 +52,6 @@ object TelegramUiHelper { placeholderId = R.drawable.img_user_picture } val type = chat.type - val message = messages.firstOrNull() - if (message != null) { - res.lastUpdated = helper.getLastUpdatedTime(message) - } if (type is TdApi.ChatTypePrivate || type is TdApi.ChatTypeSecret) { val userId = getUserIdFromChatType(type) val chatWithBot = helper.isBot(userId) @@ -63,9 +59,13 @@ object TelegramUiHelper { res.chatWithBot = chatWithBot if (!chatWithBot) { res.userId = userId - val content = message?.content - if (content is TdApi.MessageLocation) { - res.latLon = LatLon(content.location.latitude, content.location.longitude) + val message = messages.firstOrNull { it.viaBotUserId == 0 } + if (message != null) { + res.lastUpdated = helper.getLastUpdatedTime(message) + val content = message.content + if (content is TdApi.MessageLocation) { + res.latLon = LatLon(content.location.latitude, content.location.longitude) + } } } } else if (type is TdApi.ChatTypeBasicGroup) { diff --git a/OsmAnd-telegram/src/net/osmand/telegram/ui/LiveNowTabFragment.kt b/OsmAnd-telegram/src/net/osmand/telegram/ui/LiveNowTabFragment.kt index 4bcbe9d677..0fc19cafc3 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/ui/LiveNowTabFragment.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/ui/LiveNowTabFragment.kt @@ -221,31 +221,32 @@ class LiveNowTabFragment : Fragment(), TelegramListener, TelegramIncomingMessage for ((id, messages) in telegramHelper.getMessagesByChatIds()) { telegramHelper.getChat(id)?.also { chat -> res.add(TelegramUiHelper.chatToChatItem(telegramHelper, chat, messages)) - if (needLocationItems(chat.type)) { + val type = chat.type + if (type is TdApi.ChatTypeBasicGroup || type is TdApi.ChatTypeSupergroup) { res.addAll(convertToLocationItems(chat, messages)) + } else if (type is TdApi.ChatTypePrivate) { + if (telegramHelper.isOsmAndBot(type.userId)) { + res.addAll(convertToLocationItems(chat, messages)) + } else if (messages.firstOrNull { it.viaBotUserId != 0 } != null) { + res.addAll(convertToLocationItems(chat, messages, true)) + } } } } adapter.items = res } - private fun needLocationItems(type: TdApi.ChatType): Boolean { - return when (type) { - is TdApi.ChatTypeBasicGroup -> true - is TdApi.ChatTypeSupergroup -> true - is TdApi.ChatTypePrivate -> telegramHelper.isOsmAndBot(type.userId) - else -> false - } - } - private fun convertToLocationItems( chat: TdApi.Chat, - messages: List + messages: List, + addOnlyViaBotMessages: Boolean = false ): List { val res = mutableListOf() messages.forEach { message -> - TelegramUiHelper.messageToLocationItem(telegramHelper, chat, message)?.also { - res.add(it) + if (!addOnlyViaBotMessages || message.viaBotUserId != 0) { + TelegramUiHelper.messageToLocationItem(telegramHelper, chat, message)?.also { + res.add(it) + } } } return res From 423bd5d628052a88274fd136fdb030e2273282c4 Mon Sep 17 00:00:00 2001 From: Alex Sytnyk Date: Thu, 16 Aug 2018 15:53:57 +0300 Subject: [PATCH 14/17] Fix TdApi.Message.isAppropriate() --- .../src/net/osmand/telegram/helpers/TelegramHelper.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramHelper.kt b/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramHelper.kt index bd09c9ca71..88ee57c93f 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramHelper.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramHelper.kt @@ -762,7 +762,8 @@ class TelegramHelper private constructor() { val content = content return when (content) { is TdApi.MessageLocation -> true - is TdApi.MessageText -> isOsmAndBot(senderUserId) || isOsmAndBot(viaBotUserId) + is TdApi.MessageText -> (isOsmAndBot(senderUserId) || isOsmAndBot(viaBotUserId)) + && content.text.text.startsWith(DEVICE_PREFIX) else -> false } } From 409bada16cf2d97b4ef2da1539dc7af819a329b5 Mon Sep 17 00:00:00 2001 From: Chumva Date: Thu, 16 Aug 2018 16:05:31 +0300 Subject: [PATCH 15/17] change time for osmand bot --- .../osmand/telegram/helpers/TelegramHelper.kt | 55 ++++++++++++------- .../osmand/telegram/ui/LiveNowTabFragment.kt | 14 ++++- 2 files changed, 46 insertions(+), 23 deletions(-) diff --git a/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramHelper.kt b/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramHelper.kt index bd09c9ca71..f6e599a74f 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramHelper.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramHelper.kt @@ -28,6 +28,7 @@ class TelegramHelper private constructor() { private const val DEVICE_PREFIX = "Device: " private const val LOCATION_PREFIX = "Location: " + private const val LAST_LOCATION_PREFIX = "Last location: " private const val FEW_SECONDS_AGO = "few seconds ago" private const val SECONDS_AGO_SUFFIX = " seconds ago" @@ -789,26 +790,40 @@ class TelegramHelper private constructor() { private fun parseOsmAndBotLocation(text: String): MessageOsmAndBotLocation { val res = MessageOsmAndBotLocation() + var locationNA = false; 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(" ") - val updatedS = locStr.substring(locStr.indexOf("("), locStr.length) - val timeSecs = parseTime(updatedS.removePrefix("(").removeSuffix(")")) - res.lat = latS.dropLast(1).toDouble() - res.lon = lonS.toDouble() - if (timeSecs < messageActiveTimeSec) { - res.lastUpdated = (System.currentTimeMillis() / 1000 - timeSecs).toInt() - } else { - res.lastUpdated = timeSecs + s.startsWith(LOCATION_PREFIX) || s.startsWith(LAST_LOCATION_PREFIX) -> { + var locStr: String; + var parse = true; + if (s.startsWith(LAST_LOCATION_PREFIX)) { + locStr = s.removePrefix(LAST_LOCATION_PREFIX); + if (!locationNA) { + parse = false; + } + } else { + locStr = s.removePrefix(LOCATION_PREFIX); + if (locStr.trim() == "n/a") { + locationNA = true; + parse = false; + } + } + if (parse) { + try { + val (latS, lonS) = locStr.split(" ") + val updatedS = locStr.substring(locStr.indexOf("("), locStr.length) + + res.lastUpdated = + (parseTime(updatedS.removePrefix("(").removeSuffix(")")) / 1000).toInt() + res.lat = latS.dropLast(1).toDouble() + res.lon = lonS.toDouble() + + } catch (e: Exception) { + e.printStackTrace() } - } catch (e: Exception) { - e.printStackTrace() } } } @@ -816,24 +831,24 @@ class TelegramHelper private constructor() { return res } - private fun parseTime(timeS: String): Int { + private fun parseTime(timeS: String): Long { try { when { - timeS.endsWith(FEW_SECONDS_AGO) -> return 5 + timeS.endsWith(FEW_SECONDS_AGO) -> return System.currentTimeMillis() - 5000 timeS.endsWith(SECONDS_AGO_SUFFIX) -> { val locStr = timeS.removeSuffix(SECONDS_AGO_SUFFIX) - return locStr.toInt() + return System.currentTimeMillis() - locStr.toInt() * 1000 } timeS.endsWith(MINUTES_AGO_SUFFIX) -> { val locStr = timeS.removeSuffix(MINUTES_AGO_SUFFIX) val minutes = locStr.toInt() - return minutes * 60 + return System.currentTimeMillis() - minutes * 60 * 1000 } timeS.endsWith(HOURS_AGO_SUFFIX) -> { val locStr = timeS.removeSuffix(HOURS_AGO_SUFFIX) val hours = locStr.toInt() - return hours * 60 * 60 + return (System.currentTimeMillis() - hours * 60 * 60 * 1000) } timeS.endsWith(UTC_FORMAT_SUFFIX) -> { val locStr = timeS.removeSuffix(UTC_FORMAT_SUFFIX) @@ -841,7 +856,7 @@ class TelegramHelper private constructor() { val date = UTC_DATE_FORMAT.parse(latS) val time = UTC_TIME_FORMAT.parse(lonS) val res = date.time + time.time - return res.toInt() + return res } } } catch (e: Exception) { diff --git a/OsmAnd-telegram/src/net/osmand/telegram/ui/LiveNowTabFragment.kt b/OsmAnd-telegram/src/net/osmand/telegram/ui/LiveNowTabFragment.kt index 0fc19cafc3..7bfad10842 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/ui/LiveNowTabFragment.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/ui/LiveNowTabFragment.kt @@ -29,6 +29,7 @@ import net.osmand.telegram.utils.OsmandFormatter import net.osmand.telegram.utils.UiUtils.UpdateLocationViewCache import net.osmand.util.MapUtils import org.drinkless.td.libcore.telegram.TdApi +import java.util.* private const val CHAT_VIEW_TYPE = 0 private const val LOCATION_ITEM_VIEW_TYPE = 1 @@ -320,7 +321,7 @@ class LiveNowTabFragment : Fragment(), TelegramListener, TelegramIncomingMessage } if (location != null && item.latLon != null) { holder.locationViewContainer?.visibility = View.VISIBLE - locationViewCache.outdatedLocation = System.currentTimeMillis() / 1000 - item.lastUpdated > settings.staleLocTime + locationViewCache.outdatedLocation = System.currentTimeMillis() / 1000 - item.lastUpdated > settings.staleLocTime app.uiUtils.updateLocationView( holder.directionIcon, holder.distanceText, @@ -363,11 +364,18 @@ class LiveNowTabFragment : Fragment(), TelegramListener, TelegramIncomingMessage } private fun getListItemLiveTimeDescr(item: ListItem): String { - val formattedTime = OsmandFormatter.getFormattedDuration(app, getListItemLiveTime(item)) + val duration = System.currentTimeMillis() / 1000 - item.lastUpdated + var formattedTime = OsmandFormatter.getFormattedDuration(app, duration) + if(duration > 48 * 60 * 60) { + // TODO make constant + formattedTime = Date(item.lastUpdated * 1000.toLong()).toString(); + } + + return getString(R.string.last_response) + ": $formattedTime " + getString(R.string.time_ago) } - private fun getListItemLiveTime(item: ListItem): Long = (System.currentTimeMillis() / 1000) - item.lastUpdated + private fun showPopupMenu(holder: ChatViewHolder, chatId: Long) { val ctx = holder.itemView.context From 0f1711a63c7e554c5dabd95a66a84c59c429ab06 Mon Sep 17 00:00:00 2001 From: Chumva Date: Thu, 16 Aug 2018 16:17:06 +0300 Subject: [PATCH 16/17] add SimpleDateFormat --- .../osmand/telegram/helpers/TelegramHelper.kt | 22 +++++++++---------- .../osmand/telegram/ui/LiveNowTabFragment.kt | 14 ++++++------ .../telegram/ui/SetTimeDialogFragment.kt | 12 +++++----- 3 files changed, 25 insertions(+), 23 deletions(-) diff --git a/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramHelper.kt b/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramHelper.kt index aca64a9501..8f07cf800a 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramHelper.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/helpers/TelegramHelper.kt @@ -791,25 +791,25 @@ class TelegramHelper private constructor() { private fun parseOsmAndBotLocation(text: String): MessageOsmAndBotLocation { val res = MessageOsmAndBotLocation() - var locationNA = false; + var locationNA = false for (s in text.lines()) { when { s.startsWith(DEVICE_PREFIX) -> { res.name = s.removePrefix(DEVICE_PREFIX) } s.startsWith(LOCATION_PREFIX) || s.startsWith(LAST_LOCATION_PREFIX) -> { - var locStr: String; - var parse = true; + var locStr: String + var parse = true if (s.startsWith(LAST_LOCATION_PREFIX)) { - locStr = s.removePrefix(LAST_LOCATION_PREFIX); + locStr = s.removePrefix(LAST_LOCATION_PREFIX) if (!locationNA) { - parse = false; + parse = false } } else { - locStr = s.removePrefix(LOCATION_PREFIX); + locStr = s.removePrefix(LOCATION_PREFIX) if (locStr.trim() == "n/a") { - locationNA = true; - parse = false; + locationNA = true + parse = false } } if (parse) { @@ -839,16 +839,16 @@ class TelegramHelper private constructor() { timeS.endsWith(SECONDS_AGO_SUFFIX) -> { val locStr = timeS.removeSuffix(SECONDS_AGO_SUFFIX) - return System.currentTimeMillis() - locStr.toInt() * 1000 + return System.currentTimeMillis() - locStr.toLong() * 1000 } timeS.endsWith(MINUTES_AGO_SUFFIX) -> { val locStr = timeS.removeSuffix(MINUTES_AGO_SUFFIX) - val minutes = locStr.toInt() + val minutes = locStr.toLong() return System.currentTimeMillis() - minutes * 60 * 1000 } timeS.endsWith(HOURS_AGO_SUFFIX) -> { val locStr = timeS.removeSuffix(HOURS_AGO_SUFFIX) - val hours = locStr.toInt() + val hours = locStr.toLong() return (System.currentTimeMillis() - hours * 60 * 60 * 1000) } timeS.endsWith(UTC_FORMAT_SUFFIX) -> { diff --git a/OsmAnd-telegram/src/net/osmand/telegram/ui/LiveNowTabFragment.kt b/OsmAnd-telegram/src/net/osmand/telegram/ui/LiveNowTabFragment.kt index 7bfad10842..a2adff4bb7 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/ui/LiveNowTabFragment.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/ui/LiveNowTabFragment.kt @@ -29,6 +29,7 @@ import net.osmand.telegram.utils.OsmandFormatter import net.osmand.telegram.utils.UiUtils.UpdateLocationViewCache import net.osmand.util.MapUtils import org.drinkless.td.libcore.telegram.TdApi +import java.text.SimpleDateFormat import java.util.* private const val CHAT_VIEW_TYPE = 0 @@ -366,17 +367,16 @@ class LiveNowTabFragment : Fragment(), TelegramListener, TelegramIncomingMessage private fun getListItemLiveTimeDescr(item: ListItem): String { val duration = System.currentTimeMillis() / 1000 - item.lastUpdated var formattedTime = OsmandFormatter.getFormattedDuration(app, duration) - if(duration > 48 * 60 * 60) { + return if (duration > 48 * 60 * 60) { // TODO make constant - formattedTime = Date(item.lastUpdated * 1000.toLong()).toString(); + val day = SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.getDefault()) + formattedTime = day.format(Date(item.lastUpdated * 1000.toLong())) + getString(R.string.last_response) + ": $formattedTime" + } else { + getString(R.string.last_response) + ": $formattedTime " + getString(R.string.time_ago) } - - - return getString(R.string.last_response) + ": $formattedTime " + getString(R.string.time_ago) } - - private fun showPopupMenu(holder: ChatViewHolder, chatId: Long) { val ctx = holder.itemView.context diff --git a/OsmAnd-telegram/src/net/osmand/telegram/ui/SetTimeDialogFragment.kt b/OsmAnd-telegram/src/net/osmand/telegram/ui/SetTimeDialogFragment.kt index 85ee542610..e3692b053f 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/ui/SetTimeDialogFragment.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/ui/SetTimeDialogFragment.kt @@ -26,6 +26,7 @@ import net.osmand.telegram.utils.OsmandFormatter import net.osmand.telegram.utils.UiUtils import net.osmand.util.MapUtils import org.drinkless.td.libcore.telegram.TdApi +import java.util.* import java.util.concurrent.TimeUnit class SetTimeDialogFragment : DialogFragment(), TelegramLocationListener, TelegramCompassListener { @@ -324,14 +325,15 @@ class SetTimeDialogFragment : DialogFragment(), TelegramLocationListener, Telegr override fun getItemCount() = chats.size private fun getListItemLiveTimeDescr(lastUpdated: Int): String { - val formattedTime = OsmandFormatter.getFormattedDuration(app, getListItemLiveTime(lastUpdated)) + val duration = System.currentTimeMillis() / 1000 - lastUpdated + var formattedTime = OsmandFormatter.getFormattedDuration(app, duration) + if (duration > 48 * 60 * 60) { + // TODO make constant + formattedTime = Date(lastUpdated * 1000.toLong()).toString(); + } return "$formattedTime " + getString(R.string.time_ago) } - private fun getListItemLiveTime(lastUpdated: Int): Long { - return (System.currentTimeMillis() / 1000) - lastUpdated - } - inner class ChatViewHolder(val view: View) : RecyclerView.ViewHolder(view) { val icon: ImageView? = view.findViewById(R.id.icon) val title: TextView? = view.findViewById(R.id.title) From 28aefa94b53b77d818f3bef157c52a43f39374da Mon Sep 17 00:00:00 2001 From: Dmitriy Prodchenko Date: Thu, 16 Aug 2018 16:19:38 +0300 Subject: [PATCH 17/17] Add icon for stale user location, and change icon for user pic --- OsmAnd/res/drawable-hdpi/img_user_picture.png | Bin 3694 -> 2513 bytes .../map_pin_user_stale_location_day.png | Bin 0 -> 5346 bytes .../map_pin_user_stale_location_night.png | Bin 0 -> 5128 bytes OsmAnd/res/drawable-mdpi/img_user_picture.png | Bin 2607 -> 1969 bytes .../map_pin_user_stale_location_day.png | Bin 0 -> 3515 bytes .../map_pin_user_stale_location_night.png | Bin 0 -> 3513 bytes .../res/drawable-xhdpi/img_user_picture.png | Bin 4807 -> 3084 bytes .../map_pin_user_stale_location_day.png | Bin 0 -> 7513 bytes .../map_pin_user_stale_location_night.png | Bin 0 -> 7084 bytes .../res/drawable-xxhdpi/img_user_picture.png | Bin 7014 -> 4219 bytes .../map_pin_user_stale_location_day.png | Bin 0 -> 11875 bytes .../map_pin_user_stale_location_night.png | Bin 0 -> 11324 bytes 12 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 OsmAnd/res/drawable-hdpi/map_pin_user_stale_location_day.png create mode 100644 OsmAnd/res/drawable-hdpi/map_pin_user_stale_location_night.png create mode 100644 OsmAnd/res/drawable-mdpi/map_pin_user_stale_location_day.png create mode 100644 OsmAnd/res/drawable-mdpi/map_pin_user_stale_location_night.png create mode 100644 OsmAnd/res/drawable-xhdpi/map_pin_user_stale_location_day.png create mode 100644 OsmAnd/res/drawable-xhdpi/map_pin_user_stale_location_night.png create mode 100644 OsmAnd/res/drawable-xxhdpi/map_pin_user_stale_location_day.png create mode 100644 OsmAnd/res/drawable-xxhdpi/map_pin_user_stale_location_night.png diff --git a/OsmAnd/res/drawable-hdpi/img_user_picture.png b/OsmAnd/res/drawable-hdpi/img_user_picture.png index 155805c7c5276f202144c8343e78c926c1782cef..2c15e0e884fe98c0a84debf123a6c9ee3ae89d50 100644 GIT binary patch delta 1679 zcmV;A25|ZA9MKc7UjiR7I5;#zG&ngpHa9UbML0P#H!wmoHbp}1cc<>4U00r+!L_t(|+T@#UPg`Xe$M16}4+C5& zgz{`Ep#ugEGGg?NO8f-+3EUSjjz!}OvScr|y-+iVpFsTr8b83Yy)c?g4Pb%BIl>$z zP*R{+Vu6H?`XH0Z{827g3T@K|`r=xI5!Gfy^=BBnCOjmF_5z~) zE~35X7%*VF02%>stMH((Z3BD)(9diG19k|ozXP^Wcvt}aAE2)TI%*l1lLx>?y$)Ld zJy>kgq7-Yhfc*!s0Z~B$=p8`64(ODrUK*gkR2r=AcYwZ|8kX4IBf5X1qC$nfgJDK0 zrIE@L7~`H`POOLu7R8vUU_%c~lg!+aNMsJnh!@uN7}Z};NYML27|J|3AW*KDfDG| zdD)DLznRjHEjNFNY*wtTt(6RzwrJBvNNSpV{_tRqaN z-rinAXbu|-3k%}l;J`8{|4SXzWduvxX2$>1Y)ZkPo|N6t%SZIQG-ld|LLsdem2GDP zWmMT4pErN}AW~v%Y)pFJi=7oJ$8QLXj^Q&5?q8W1hv(+zwDX@LZAY}VwP{;5EiEk? zJlkJ>s3GL;?yjaIkw_Fhb)b&%@o~dGjFsan^roTm6a8(9ojt*V^d)J@9*!I?gI)cY8I(HB?U~`+}wui4(3 z?VIV#8I;vSa71>oqoc!cZ}*~WOE1tyTWoBaiBu}3o$s>j@9%3BkY8ajT^YTmrY3E( zouz-dx!KmqgMKTo_q=OM7hOyX!?}e@*~;Z+1}gCyV9#ChDi`&xn9W>8q<=%CFI52S z1Qr-e7j5Dd6)HfAgn7fwtFTOCz>Z!7D+R1W#{eBd`O|B#@F~KphVb#3ROQGjhQdAG zl}1g@m>H*COkrL;n}JVn(l_aBu&}Rm3xS0 z?v^;zR`+1@7GD9N50-S;+(n$_8!d3+Q`z;jMbJ2H&=zdY*lG$+PWmx~y@N5E?=QXY z(2H7+(N^yvn$Eqb<<=?(@TXtJyQ05}$4PNb{_?8c`DJ+`fWkHAU-?(@0O`uBcrO

IW{&jG&e#-Lq?N+0v#VT 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 Dd^sZR literal 0 HcmV?d00001 diff --git a/OsmAnd/res/drawable-hdpi/map_pin_user_stale_location_night.png b/OsmAnd/res/drawable-hdpi/map_pin_user_stale_location_night.png new file mode 100644 index 0000000000000000000000000000000000000000..20c38a159252d100767a0d235e2f66b626679def GIT binary patch literal 5128 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 B)^Y#< literal 0 HcmV?d00001 diff --git a/OsmAnd/res/drawable-mdpi/img_user_picture.png b/OsmAnd/res/drawable-mdpi/img_user_picture.png index 5a5f81bd6928f6e4fbe969e149a0563bc38fd2ed..973d09a6b09ec15dcb421a46d8df9c2ebb3b2a7a 100644 GIT binary patch delta 1130 zcmV-w1eN=*6tNGmUjiR7I5;#zG($N!Ha9UbML0P#H!wmoHbp}26%&3_F00YlSL_t(|+RT~VN?Sn?$LE~H?}BKI zEe0V$LTDm*Q4BsuFX~;Np!HQ0+uoPn)zZ=@@YbLdQKPj+F(7J_Nbd04&>XINh6Zj@8xGHR68=ke-9W7QFXRIwTy6V*;|*7LZ{@dn6qej>)kt0g(_3 zod~N{xRE%o43mUQ2{Q}pn=1cNxX1%Cj-=Ub@F3j#*$LeK{=O_PFKbVy;zozN5m-Jp zgc#nNaT?mg!$XEbve~R-K({(%LBh<`0YNyTNG)zwwGy1J4;ARtpyQ!LS2QC7*u z#)jncc^MoWlw>k#=D~kFL%eNe3}uh@q_Lx;qn5aZc4+UueG|Ym0Y6w78y_EUs7i{( z;y=MrpLUGw8vrg5@GTG3W}QNzko5KSX`fNh%I4;#7NTZDOMTj*&@Szp9rSq{q4GL{ zCw_}#p~T~VN=44c_4Rej(3njX>QTQYv}-n}$poE}s(+cYGCqGiJS?$Ttp5G-@={W% z6wfe@;Mi|vWku7g3GLCY>H4QL)pwDzv$HL`+XGg_nM~tt#lXOTjE#-S(9n?d_xB6V z6Iuuhg@RmMTxj<%*Voq#I?-s=Dxqx=<$MGSxZ(#d=}I5?2w<6~C7_S+RoEhfXn#Dt(qwtI;;V0dAAH-k`bJ3T7o7l_t=U-2p^zRrqj0z@bY&6M)86_8vulTmo=E9NliQBNW2Srgp<|477+5oGEgk4*83z&btz1R;ATov$d;{0B>(=x-&~eOaK4?07*qoM6N<$f}+C~1poj5 delta 1773 zcmVIW{&jG&e#-Lq?N+0v#VT zIYK!$MmIM(G&eCZML0o3I5R~>IW{&jG&e#-Lq?Oj0%s#JVq`frVr4BdWMVfhG%zwX zEn+ccFfC?gF*P({I5jgkH)E4T1A>45%pKDJ00vD-L_t(|+Ps*{Z&yVW$ET$)`U2Vl zg+iNg>s3rII6hK&)8urem#bL~bK`X>NEjd7)dQ8y;;nzCpJg(46V8u|#N zwWah4^v$miJfC6aI-SnFzuylVPx8(0mwRW<`Q9^U&YUwjPoF+juOPXCX2E|kL6e|C zP$MWY@8<-=f?mN*!4*N5U^QDqIaw0iBluWwO0YLeTYn3F5?l}rWleDF)~&IFWK5;} zd?olmP@w*sqy*m!z7(622{xmpN)#D*Qhx3WKH30s%IHAXebN0+Cb1MpEKhJz{{AAU zQX4Pmyo?QO#SO}fAy;gOy_tVxVPRoG&CSiJ#l=Onw6vsFS6}Xd+}vE1pP#Raii%W8 zNr~FLd2^DQv&1&ulqH`}8-wO+eixhwX?yYFg?jevnHn1#)5goo%T-xfnI@5!_wsv} zmzOp9nVA_iJw2^IV#kghYRi@_Dkmo=j_4nPw}i*C8-pPao{uAkvB!UpAFFNKwyA>$ z55{_?prAklLe|s6!^5htuTNE1SL=@o$O&WnY^(=O&|VJBo}8T21o!RR7iS=?F#o}W z2YP;GWo6v3_k_zO%gfD!m1eiD+YqCpqbik3sfLCI?HMb?9PtNORvUwxHf_=%1_3b{ znXII(^vmgA$%u1Fs^?MTaGXZfx)@Ag6VNn5txt|Mt7xt3%ZJni}eP=2DY%tM)Kqs z9(>(@%1Pk{E@^)x5GSuJ=t8FzY+*AXO%QAhdC)DtNHZZ}Oj4Pa^xh@NiQ_K2BaJNa zuFz!H-G1y@X>M*#^i|L``a0Rc*bK-B1badR zIfLC8@ne)?lsxzF;lo&RykiVw{TOozO-xM0)s{UF{410msA61Y?h;UP9XN16|L^bb zS9k8*(FFuYnJp%6-@dKiA&hm)G<3NHafU5!J-L}@n(DP%N6tsGJ+5b>&G>l23bhWn&N<*s`aVCs!!97&+jc$E1LPfdQR7j~+c5?J}0auVl!P zjK$;g^Yhv}=|${PMs<-8sIRZrNGEs{9hMwkNB@x{M|^*B%5Yk>PcN8`KN5nLdabjwGdfB5 zdU}b_uFj-jb?2h<+O=!iMqq=a45z4ZA2QbwYx30Y-MjUMX>V_jyoMK8BH}dg)xmtn zSmxM#iY|1b8yf*VKiK;lziH|*ziXNz`UlcPYisM8nDUz@_apFBsAYd4HV+}Hvkig@NBiDa14r0V3%O4=e)yLbyBb7+dxjgz!@J6Ui z!kb)Y(4~ z_G*&kIEn*qA-IQOGsJkzZPGs#`%9sIChZNY**NEt?g$~t3K()<3*L{rWyPDeY-cGGl6lJHxi7@#M7oYJBZAH(&g)N1Q(co~mKiq3 z*Lkrul*!J|nxHe;HvGp;+uC4?4O^1Tnv~3mf|P9{~mc3S)J4Y|ye} P00000NkvXXu0mjf){9p= diff --git a/OsmAnd/res/drawable-mdpi/map_pin_user_stale_location_day.png b/OsmAnd/res/drawable-mdpi/map_pin_user_stale_location_day.png new file mode 100644 index 0000000000000000000000000000000000000000..44f94adaa341f7cc2e2c15b36b38e01558eb7b54 GIT binary patch literal 3515 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 literal 0 HcmV?d00001 diff --git a/OsmAnd/res/drawable-mdpi/map_pin_user_stale_location_night.png b/OsmAnd/res/drawable-mdpi/map_pin_user_stale_location_night.png new file mode 100644 index 0000000000000000000000000000000000000000..ee3b397ca8985fd930e28e34333f66407d8810f2 GIT binary patch literal 3513 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 diff --git a/OsmAnd/res/drawable-xhdpi/map_pin_user_stale_location_day.png b/OsmAnd/res/drawable-xhdpi/map_pin_user_stale_location_day.png new file mode 100644 index 0000000000000000000000000000000000000000..c11db9f38c55edc718ae04fb95e17cf3fbffd803 GIT binary patch literal 7513 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 diff --git a/OsmAnd/res/drawable-xxhdpi/map_pin_user_stale_location_day.png b/OsmAnd/res/drawable-xxhdpi/map_pin_user_stale_location_day.png new file mode 100644 index 0000000000000000000000000000000000000000..a5971c9b8df8a0ff62c697a55a37be732b2f8193 GIT binary patch literal 11875 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 Vv4wuQ`S-`ZmE|?$N@Yxg{|_pix4ZxV literal 0 HcmV?d00001 diff --git a/OsmAnd/res/drawable-xxhdpi/map_pin_user_stale_location_night.png b/OsmAnd/res/drawable-xxhdpi/map_pin_user_stale_location_night.png new file mode 100644 index 0000000000000000000000000000000000000000..4f3bc9fd2596d382c5ee6b698776f23658846b16 GIT binary patch literal 11324 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