tracker status widget
This commit is contained in:
parent
4beb3de098
commit
519b2d2073
6 changed files with 67 additions and 12 deletions
|
@ -56,6 +56,7 @@ class TelegramApplication : Application(), OsmandHelperListener {
|
||||||
)
|
)
|
||||||
showLocationHelper.addDirectionContextMenuButton()
|
showLocationHelper.addDirectionContextMenuButton()
|
||||||
showLocationHelper.startShowingLocation()
|
showLocationHelper.startShowingLocation()
|
||||||
|
showLocationHelper.addOrUpdateStatusWidget(-1, false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,6 +20,7 @@ import net.osmand.telegram.utils.AndroidUtils
|
||||||
import org.drinkless.td.libcore.telegram.TdApi
|
import org.drinkless.td.libcore.telegram.TdApi
|
||||||
import java.util.*
|
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_MESSAGES_INTERVAL_MS = 10000L // 10 sec
|
||||||
private const val UPDATE_LIVE_TRACKS_INTERVAL_MS = 30000L // 30 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 updateTracksHandler: Handler? = null
|
||||||
private var tracksHandlerThread = HandlerThread("TracksUpdateServiceThread")
|
private var tracksHandlerThread = HandlerThread("TracksUpdateServiceThread")
|
||||||
|
|
||||||
|
private var updateWidgetHandler: Handler? = null
|
||||||
|
private var updateWidgetThread = HandlerThread("WidgetUpdateServiceThread")
|
||||||
|
|
||||||
var handler: Handler? = null
|
var handler: Handler? = null
|
||||||
private set
|
private set
|
||||||
var usedBy = 0
|
var usedBy = 0
|
||||||
|
@ -58,8 +62,10 @@ class TelegramService : Service(), LocationListener, TelegramIncomingMessagesLis
|
||||||
super.onCreate()
|
super.onCreate()
|
||||||
mHandlerThread.start()
|
mHandlerThread.start()
|
||||||
tracksHandlerThread.start()
|
tracksHandlerThread.start()
|
||||||
|
updateWidgetThread.start()
|
||||||
updateShareInfoHandler = Handler(mHandlerThread.looper)
|
updateShareInfoHandler = Handler(mHandlerThread.looper)
|
||||||
updateTracksHandler = Handler(tracksHandlerThread.looper)
|
updateTracksHandler = Handler(tracksHandlerThread.looper)
|
||||||
|
updateWidgetHandler = Handler(updateWidgetThread.looper)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onBind(intent: Intent): IBinder? {
|
override fun onBind(intent: Intent): IBinder? {
|
||||||
|
@ -106,6 +112,7 @@ class TelegramService : Service(), LocationListener, TelegramIncomingMessagesLis
|
||||||
if (isUsedByMyLocation(usedBy)) {
|
if (isUsedByMyLocation(usedBy)) {
|
||||||
initLocationUpdates()
|
initLocationUpdates()
|
||||||
startShareInfoUpdates()
|
startShareInfoUpdates()
|
||||||
|
startWidgetUpdates()
|
||||||
}
|
}
|
||||||
if (isUsedByUsersLocations(usedBy)) {
|
if (isUsedByUsersLocations(usedBy)) {
|
||||||
app.telegramHelper.startLiveMessagesUpdates(app.settings.sendMyLocInterval)
|
app.telegramHelper.startLiveMessagesUpdates(app.settings.sendMyLocInterval)
|
||||||
|
@ -139,6 +146,8 @@ class TelegramService : Service(), LocationListener, TelegramIncomingMessagesLis
|
||||||
app.telegramService = null
|
app.telegramService = null
|
||||||
tracksHandlerThread.quit()
|
tracksHandlerThread.quit()
|
||||||
mHandlerThread.quit()
|
mHandlerThread.quit()
|
||||||
|
updateWidgetThread.quit()
|
||||||
|
app().showLocationHelper.addOrUpdateStatusWidget(-1, false)
|
||||||
|
|
||||||
usedBy = 0
|
usedBy = 0
|
||||||
|
|
||||||
|
@ -154,7 +163,6 @@ class TelegramService : Service(), LocationListener, TelegramIncomingMessagesLis
|
||||||
if (shouldCleanupResources) {
|
if (shouldCleanupResources) {
|
||||||
app.cleanupResources()
|
app.cleanupResources()
|
||||||
}
|
}
|
||||||
app().showLocationHelper.updateStatusWidget(-1)
|
|
||||||
|
|
||||||
// remove notification
|
// remove notification
|
||||||
stopForeground(java.lang.Boolean.TRUE)
|
stopForeground(java.lang.Boolean.TRUE)
|
||||||
|
@ -195,7 +203,6 @@ class TelegramService : Service(), LocationListener, TelegramIncomingMessagesLis
|
||||||
updateShareInfoHandler?.postDelayed({
|
updateShareInfoHandler?.postDelayed({
|
||||||
if (isUsedByMyLocation(usedBy)) {
|
if (isUsedByMyLocation(usedBy)) {
|
||||||
app().shareLocationHelper.updateSendLiveMessages()
|
app().shareLocationHelper.updateSendLiveMessages()
|
||||||
app().showLocationHelper.updateStatusWidget(app().locationMessages.getBufferedMessagesCount())
|
|
||||||
startShareInfoUpdates()
|
startShareInfoUpdates()
|
||||||
}
|
}
|
||||||
}, UPDATE_LIVE_MESSAGES_INTERVAL_MS)
|
}, UPDATE_LIVE_MESSAGES_INTERVAL_MS)
|
||||||
|
@ -212,6 +219,17 @@ class TelegramService : Service(), LocationListener, TelegramIncomingMessagesLis
|
||||||
}, UPDATE_LIVE_TRACKS_INTERVAL_MS)
|
}, 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")
|
@SuppressLint("MissingPermission")
|
||||||
private fun getFirstTimeRunDefaultLocation(): net.osmand.Location? {
|
private fun getFirstTimeRunDefaultLocation(): net.osmand.Location? {
|
||||||
val app = app()
|
val app = app()
|
||||||
|
|
|
@ -44,9 +44,11 @@ class ShowLocationHelper(private val app: TelegramApplication) {
|
||||||
const val GPX_COLORS_COUNT = 10
|
const val GPX_COLORS_COUNT = 10
|
||||||
|
|
||||||
private const val STATUS_WIDGET_ID = "status_widget"
|
private const val STATUS_WIDGET_ID = "status_widget"
|
||||||
private const val STATUS_WIDGET_MENU_ICON = "ic_action_speed"
|
private const val STATUS_WIDGET_MENU_ICON = "widget_location_sharing_night"
|
||||||
private const val STATUS_WIDGET_DAY_ICON = "widget_speed_day"
|
private const val STATUS_WIDGET_ANIM_ICON_DAY = "anim_widget_location_sharing_day"
|
||||||
private const val STATUS_WIDGET_NIGHT_ICON = "widget_speed_night"
|
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(
|
val GPX_COLORS = arrayOf(
|
||||||
"red", "orange", "lightblue", "blue", "purple",
|
"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 {
|
val text = when {
|
||||||
count > 0 -> count.toString()
|
count >= 0 && isSending -> {
|
||||||
count == 0 -> "ON"
|
iconDay = STATUS_WIDGET_ANIM_ICON_DAY
|
||||||
else -> "OFF"
|
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 {
|
val bufferText = when {
|
||||||
count > 0 -> count.toString()
|
count > 0 -> "($count)"
|
||||||
else -> ""
|
else -> ""
|
||||||
}
|
}
|
||||||
osmandAidlHelper.addMapWidget(
|
osmandAidlHelper.addMapWidget(
|
||||||
STATUS_WIDGET_ID,
|
STATUS_WIDGET_ID,
|
||||||
STATUS_WIDGET_MENU_ICON,
|
STATUS_WIDGET_MENU_ICON,
|
||||||
app.getString(R.string.status_widget_title),
|
app.getString(R.string.status_widget_title),
|
||||||
STATUS_WIDGET_DAY_ICON,
|
iconDay,
|
||||||
STATUS_WIDGET_NIGHT_ICON,
|
iconNight,
|
||||||
text, bufferText, 50, getStatusWidgetIntent())
|
text, bufferText, 50, getStatusWidgetIntent())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
10
OsmAnd/res/drawable/anim_widget_location_sharing_day.xml
Normal file
10
OsmAnd/res/drawable/anim_widget_location_sharing_day.xml
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:oneshot="false">
|
||||||
|
<item
|
||||||
|
android:drawable="@drawable/widget_location_sharing_day"
|
||||||
|
android:duration="500" />
|
||||||
|
<item
|
||||||
|
android:drawable="@drawable/widget_location_sharing_off_day"
|
||||||
|
android:duration="500" />
|
||||||
|
</animation-list>
|
10
OsmAnd/res/drawable/anim_widget_location_sharing_night.xml
Normal file
10
OsmAnd/res/drawable/anim_widget_location_sharing_night.xml
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:oneshot="false">
|
||||||
|
<item
|
||||||
|
android:drawable="@drawable/widget_location_sharing_night"
|
||||||
|
android:duration="500" />
|
||||||
|
<item
|
||||||
|
android:drawable="@drawable/widget_location_sharing_off_night"
|
||||||
|
android:duration="500" />
|
||||||
|
</animation-list>
|
|
@ -3,6 +3,7 @@ package net.osmand.plus.views.mapwidgets;
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.graphics.Paint.Style;
|
import android.graphics.Paint.Style;
|
||||||
import android.graphics.Typeface;
|
import android.graphics.Typeface;
|
||||||
|
import android.graphics.drawable.AnimationDrawable;
|
||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.view.Gravity;
|
import android.view.Gravity;
|
||||||
|
@ -71,6 +72,10 @@ public class TextInfoWidget {
|
||||||
public void setImageDrawable(Drawable imageDrawable, boolean gone) {
|
public void setImageDrawable(Drawable imageDrawable, boolean gone) {
|
||||||
if(imageDrawable != null) {
|
if(imageDrawable != null) {
|
||||||
imageView.setImageDrawable(imageDrawable);
|
imageView.setImageDrawable(imageDrawable);
|
||||||
|
Object anim = imageView.getDrawable();
|
||||||
|
if (anim instanceof AnimationDrawable) {
|
||||||
|
((AnimationDrawable) anim).start();
|
||||||
|
}
|
||||||
imageView.setVisibility(View.VISIBLE);
|
imageView.setVisibility(View.VISIBLE);
|
||||||
} else {
|
} else {
|
||||||
imageView.setVisibility(gone ? View.GONE : View.INVISIBLE);
|
imageView.setVisibility(gone ? View.GONE : View.INVISIBLE);
|
||||||
|
|
Loading…
Reference in a new issue