diff --git a/OsmAnd-telegram/src/net/osmand/telegram/TelegramApplication.kt b/OsmAnd-telegram/src/net/osmand/telegram/TelegramApplication.kt
index 7cd50a96c0..4dc883bed3 100644
--- a/OsmAnd-telegram/src/net/osmand/telegram/TelegramApplication.kt
+++ b/OsmAnd-telegram/src/net/osmand/telegram/TelegramApplication.kt
@@ -56,6 +56,7 @@ class TelegramApplication : Application(), OsmandHelperListener {
)
showLocationHelper.addDirectionContextMenuButton()
showLocationHelper.startShowingLocation()
+ showLocationHelper.addOrUpdateStatusWidget(-1, false)
}
}
}
diff --git a/OsmAnd-telegram/src/net/osmand/telegram/TelegramService.kt b/OsmAnd-telegram/src/net/osmand/telegram/TelegramService.kt
index ba38c0f10f..cc1e7819ea 100644
--- a/OsmAnd-telegram/src/net/osmand/telegram/TelegramService.kt
+++ b/OsmAnd-telegram/src/net/osmand/telegram/TelegramService.kt
@@ -20,6 +20,7 @@ import net.osmand.telegram.utils.AndroidUtils
import org.drinkless.td.libcore.telegram.TdApi
import java.util.*
+private const val UPDATE_WIDGET_INTERVAL_MS = 1000L // 1 sec
private const val UPDATE_LIVE_MESSAGES_INTERVAL_MS = 10000L // 10 sec
private const val UPDATE_LIVE_TRACKS_INTERVAL_MS = 30000L // 30 sec
@@ -36,6 +37,9 @@ class TelegramService : Service(), LocationListener, TelegramIncomingMessagesLis
private var updateTracksHandler: Handler? = null
private var tracksHandlerThread = HandlerThread("TracksUpdateServiceThread")
+ private var updateWidgetHandler: Handler? = null
+ private var updateWidgetThread = HandlerThread("WidgetUpdateServiceThread")
+
var handler: Handler? = null
private set
var usedBy = 0
@@ -58,8 +62,10 @@ class TelegramService : Service(), LocationListener, TelegramIncomingMessagesLis
super.onCreate()
mHandlerThread.start()
tracksHandlerThread.start()
+ updateWidgetThread.start()
updateShareInfoHandler = Handler(mHandlerThread.looper)
updateTracksHandler = Handler(tracksHandlerThread.looper)
+ updateWidgetHandler = Handler(updateWidgetThread.looper)
}
override fun onBind(intent: Intent): IBinder? {
@@ -106,6 +112,7 @@ class TelegramService : Service(), LocationListener, TelegramIncomingMessagesLis
if (isUsedByMyLocation(usedBy)) {
initLocationUpdates()
startShareInfoUpdates()
+ startWidgetUpdates()
}
if (isUsedByUsersLocations(usedBy)) {
app.telegramHelper.startLiveMessagesUpdates(app.settings.sendMyLocInterval)
@@ -139,6 +146,8 @@ class TelegramService : Service(), LocationListener, TelegramIncomingMessagesLis
app.telegramService = null
tracksHandlerThread.quit()
mHandlerThread.quit()
+ updateWidgetThread.quit()
+ app().showLocationHelper.addOrUpdateStatusWidget(-1, false)
usedBy = 0
@@ -154,7 +163,6 @@ class TelegramService : Service(), LocationListener, TelegramIncomingMessagesLis
if (shouldCleanupResources) {
app.cleanupResources()
}
- app().showLocationHelper.updateStatusWidget(-1)
// remove notification
stopForeground(java.lang.Boolean.TRUE)
@@ -195,7 +203,6 @@ class TelegramService : Service(), LocationListener, TelegramIncomingMessagesLis
updateShareInfoHandler?.postDelayed({
if (isUsedByMyLocation(usedBy)) {
app().shareLocationHelper.updateSendLiveMessages()
- app().showLocationHelper.updateStatusWidget(app().locationMessages.getBufferedMessagesCount())
startShareInfoUpdates()
}
}, UPDATE_LIVE_MESSAGES_INTERVAL_MS)
@@ -211,6 +218,17 @@ class TelegramService : Service(), LocationListener, TelegramIncomingMessagesLis
}
}, UPDATE_LIVE_TRACKS_INTERVAL_MS)
}
+
+ private fun startWidgetUpdates() {
+ updateWidgetHandler?.postDelayed({
+ if (isUsedByMyLocation(usedBy)) {
+ val sharingStatus = app().settings.sharingStatusChanges.last()
+ val isSending = !((sharingStatus.statusType == TelegramSettings.SharingStatusType.NO_GPS) || (sharingStatus.statusType == TelegramSettings.SharingStatusType.INITIALIZING))
+ app().showLocationHelper.addOrUpdateStatusWidget(app().locationMessages.getBufferedMessagesCount(), isSending)
+ }
+ startWidgetUpdates()
+ }, UPDATE_WIDGET_INTERVAL_MS)
+ }
@SuppressLint("MissingPermission")
private fun getFirstTimeRunDefaultLocation(): net.osmand.Location? {
diff --git a/OsmAnd-telegram/src/net/osmand/telegram/helpers/ShowLocationHelper.kt b/OsmAnd-telegram/src/net/osmand/telegram/helpers/ShowLocationHelper.kt
index c56545b72e..9ffd426714 100644
--- a/OsmAnd-telegram/src/net/osmand/telegram/helpers/ShowLocationHelper.kt
+++ b/OsmAnd-telegram/src/net/osmand/telegram/helpers/ShowLocationHelper.kt
@@ -44,9 +44,11 @@ class ShowLocationHelper(private val app: TelegramApplication) {
const val GPX_COLORS_COUNT = 10
private const val STATUS_WIDGET_ID = "status_widget"
- private const val STATUS_WIDGET_MENU_ICON = "ic_action_speed"
- private const val STATUS_WIDGET_DAY_ICON = "widget_speed_day"
- private const val STATUS_WIDGET_NIGHT_ICON = "widget_speed_night"
+ private const val STATUS_WIDGET_MENU_ICON = "widget_location_sharing_night"
+ private const val STATUS_WIDGET_ANIM_ICON_DAY = "anim_widget_location_sharing_day"
+ private const val STATUS_WIDGET_ANIM_ICON_NIGHT = "anim_widget_location_sharing_night"
+ private const val STATUS_WIDGET_OFF_ICON_DAY = "widget_location_sharing_off_day"
+ private const val STATUS_WIDGET_OFF_ICON_NIGHT = "widget_location_sharing_off_night"
val GPX_COLORS = arrayOf(
"red", "orange", "lightblue", "blue", "purple",
@@ -203,22 +205,31 @@ class ShowLocationHelper(private val app: TelegramApplication) {
}
}
- fun updateStatusWidget(count: Int) {
+ fun addOrUpdateStatusWidget(count: Int, isSending: Boolean) {
+ val iconDay: String
+ val iconNight: String
val text = when {
- count > 0 -> count.toString()
- count == 0 -> "ON"
- else -> "OFF"
+ count >= 0 && isSending -> {
+ iconDay = STATUS_WIDGET_ANIM_ICON_DAY
+ iconNight = STATUS_WIDGET_ANIM_ICON_NIGHT
+ app.getString(R.string.shared_string_ok)
+ }
+ else -> {
+ iconDay = STATUS_WIDGET_OFF_ICON_DAY
+ iconNight = STATUS_WIDGET_OFF_ICON_NIGHT
+ app.getString(R.string.shared_string_off)
+ }
}
val bufferText = when {
- count > 0 -> count.toString()
+ count > 0 -> "($count)"
else -> ""
}
osmandAidlHelper.addMapWidget(
STATUS_WIDGET_ID,
STATUS_WIDGET_MENU_ICON,
app.getString(R.string.status_widget_title),
- STATUS_WIDGET_DAY_ICON,
- STATUS_WIDGET_NIGHT_ICON,
+ iconDay,
+ iconNight,
text, bufferText, 50, getStatusWidgetIntent())
}
diff --git a/OsmAnd/res/drawable/anim_widget_location_sharing_day.xml b/OsmAnd/res/drawable/anim_widget_location_sharing_day.xml
new file mode 100644
index 0000000000..d7f847dc50
--- /dev/null
+++ b/OsmAnd/res/drawable/anim_widget_location_sharing_day.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/OsmAnd/res/drawable/anim_widget_location_sharing_night.xml b/OsmAnd/res/drawable/anim_widget_location_sharing_night.xml
new file mode 100644
index 0000000000..8d5ade60f0
--- /dev/null
+++ b/OsmAnd/res/drawable/anim_widget_location_sharing_night.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/OsmAnd/src/net/osmand/plus/views/mapwidgets/TextInfoWidget.java b/OsmAnd/src/net/osmand/plus/views/mapwidgets/TextInfoWidget.java
index ec29bca7ea..d32166e041 100644
--- a/OsmAnd/src/net/osmand/plus/views/mapwidgets/TextInfoWidget.java
+++ b/OsmAnd/src/net/osmand/plus/views/mapwidgets/TextInfoWidget.java
@@ -3,6 +3,7 @@ package net.osmand.plus.views.mapwidgets;
import android.app.Activity;
import android.graphics.Paint.Style;
import android.graphics.Typeface;
+import android.graphics.drawable.AnimationDrawable;
import android.graphics.drawable.Drawable;
import android.text.TextUtils;
import android.view.Gravity;
@@ -71,6 +72,10 @@ public class TextInfoWidget {
public void setImageDrawable(Drawable imageDrawable, boolean gone) {
if(imageDrawable != null) {
imageView.setImageDrawable(imageDrawable);
+ Object anim = imageView.getDrawable();
+ if (anim instanceof AnimationDrawable) {
+ ((AnimationDrawable) anim).start();
+ }
imageView.setVisibility(View.VISIBLE);
} else {
imageView.setVisibility(gone ? View.GONE : View.INVISIBLE);