diff --git a/OsmAnd-telegram/src/net/osmand/telegram/InitAppBroadcastReceiver.kt b/OsmAnd-telegram/src/net/osmand/telegram/InitAppBroadcastReceiver.kt index 362bc028a4..02a89618af 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/InitAppBroadcastReceiver.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/InitAppBroadcastReceiver.kt @@ -7,6 +7,11 @@ import android.content.Intent class InitAppBroadcastReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { - // do nothing, TelegramApplication already initialized + // check if aidl connection was lost + val app = context.applicationContext as TelegramApplication + val aidlHelper = app.osmandAidlHelper + if (aidlHelper.isOsmandBound() && !aidlHelper.isOsmandConnected()) { + aidlHelper.connectOsmand() + } } -} +} \ No newline at end of file diff --git a/OsmAnd-telegram/src/net/osmand/telegram/TelegramApplication.kt b/OsmAnd-telegram/src/net/osmand/telegram/TelegramApplication.kt index 1eda69b2dd..ee6bbb29d4 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/TelegramApplication.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/TelegramApplication.kt @@ -42,7 +42,7 @@ class TelegramApplication : Application() { telegramHelper.messageActiveTimeSec = settings.locHistoryTime uiUtils = UiUtils(this) osmandAidlHelper = OsmandAidlHelper(this) - osmandAidlHelper.listener = object : OsmandHelperListener { + osmandAidlHelper.addConnectionListener(object : OsmandHelperListener { override fun onOsmandConnectionStateChanged(connected: Boolean) { if (connected) { osmandAidlHelper.clearNavDrawerItems("net.osmand.telegram") @@ -60,7 +60,7 @@ class TelegramApplication : Application() { showLocationHelper.addOrUpdateStatusWidget(-1, false) } } - } + }) osmandAidlHelper.setUpdatesListener(object : UpdatesListener { override fun update() { if (settings.hasAnyChatToShowOnMap()) { diff --git a/OsmAnd-telegram/src/net/osmand/telegram/helpers/OsmandAidlHelper.kt b/OsmAnd-telegram/src/net/osmand/telegram/helpers/OsmandAidlHelper.kt index 6ff7d5fe80..dd93c294db 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/helpers/OsmandAidlHelper.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/helpers/OsmandAidlHelper.kt @@ -58,6 +58,8 @@ class OsmandAidlHelper(private val app: TelegramApplication) { const val OSMAND_NIGHTLY_PACKAGE_NAME = "net.osmand.dev" const val UPDATE_TIME_MS = 5000L + + private const val CALLBACK_INVALID_ID = -1L } private var mIOsmAndAidlInterface: IOsmAndAidlInterface? = null @@ -68,7 +70,7 @@ class OsmandAidlHelper(private val app: TelegramApplication) { private var osmandUpdatesCallbackId: Long = -1 private var osmandContextMenuCallbackId: Long = -1 - var listener: OsmandHelperListener? = null + private val connectionListeners = HashSet() interface OsmandHelperListener { fun onOsmandConnectionStateChanged(connected: Boolean) @@ -133,6 +135,14 @@ class OsmandAidlHelper(private val app: TelegramApplication) { } } + fun addConnectionListener(listener: OsmandHelperListener) { + connectionListeners.add(listener) + } + + fun removeConnectionListener(listener: OsmandHelperListener) { + connectionListeners.remove(listener) + } + fun setSearchCompleteListener(mSearchCompleteListener: SearchCompleteListener) { this.mSearchCompleteListener = mSearchCompleteListener } @@ -155,7 +165,7 @@ class OsmandAidlHelper(private val app: TelegramApplication) { this.mUpdatesListener = mUpdatesListener } - fun updatesCallbackRegistered() = osmandUpdatesCallbackId > 0 + fun updatesCallbackRegistered() = osmandUpdatesCallbackId > CALLBACK_INVALID_ID /** * Class for interacting with the main interface of the service. */ @@ -169,16 +179,18 @@ class OsmandAidlHelper(private val app: TelegramApplication) { // representation of that from the raw service object. mIOsmAndAidlInterface = IOsmAndAidlInterface.Stub.asInterface(service) initialized = true - //Toast.makeText(app, "OsmAnd connected", Toast.LENGTH_SHORT).show() - listener?.onOsmandConnectionStateChanged(true) + connectionListeners.forEach { + it.onOsmandConnectionStateChanged(true) + } } override fun onServiceDisconnected(className: ComponentName) { // This is called when the connection with the service has been // unexpectedly disconnected -- that is, its process crashed. mIOsmAndAidlInterface = null - //Toast.makeText(app, "OsmAnd disconnected", Toast.LENGTH_SHORT).show() - listener?.onOsmandConnectionStateChanged(false) + connectionListeners.forEach { + it.onOsmandConnectionStateChanged(false) + } } } @@ -193,7 +205,7 @@ class OsmandAidlHelper(private val app: TelegramApplication) { fun isOsmandConnected(): Boolean { return mIOsmAndAidlInterface != null } - + /** * Get list of active GPX files. * @@ -1162,20 +1174,20 @@ class OsmandAidlHelper(private val app: TelegramApplication) { if (mIOsmAndAidlInterface != null) { try { osmandUpdatesCallbackId = mIOsmAndAidlInterface!!.registerForUpdates(UPDATE_TIME_MS, mIOsmAndAidlCallback) - return osmandUpdatesCallbackId > 0 + return osmandUpdatesCallbackId > CALLBACK_INVALID_ID } catch (e: RemoteException) { e.printStackTrace() } } return false } - + fun unregisterFromUpdates(): Boolean { if (mIOsmAndAidlInterface != null) { try { val unregistered = mIOsmAndAidlInterface!!.unregisterFromUpdates(osmandUpdatesCallbackId) if (unregistered) { - osmandUpdatesCallbackId = 0 + osmandUpdatesCallbackId = CALLBACK_INVALID_ID } return unregistered } catch (e: RemoteException) { @@ -1222,7 +1234,7 @@ class OsmandAidlHelper(private val app: TelegramApplication) { val params = RemoveContextMenuButtonsParams(paramsId, osmandContextMenuCallbackId) val removed = mIOsmAndAidlInterface!!.removeContextMenuButtons(params) if (removed) { - osmandContextMenuCallbackId = -1 + osmandContextMenuCallbackId = CALLBACK_INVALID_ID } return removed } catch (e: RemoteException) { diff --git a/OsmAnd-telegram/src/net/osmand/telegram/helpers/ShowLocationHelper.kt b/OsmAnd-telegram/src/net/osmand/telegram/helpers/ShowLocationHelper.kt index fbe168c62a..adf59d90c9 100644 --- a/OsmAnd-telegram/src/net/osmand/telegram/helpers/ShowLocationHelper.kt +++ b/OsmAnd-telegram/src/net/osmand/telegram/helpers/ShowLocationHelper.kt @@ -77,6 +77,15 @@ class ShowLocationHelper(private val app: TelegramApplication) { private var forcedStop: Boolean = false init { + app.osmandAidlHelper.addConnectionListener(object : OsmandAidlHelper.OsmandHelperListener { + override fun onOsmandConnectionStateChanged(connected: Boolean) { + if (!connected && showingLocation && !app.settings.monitoringEnabled) { + if (isUseOsmandCallback() && app.osmandAidlHelper.updatesCallbackRegistered()) { + showingLocation = false + } + } + } + }) app.osmandAidlHelper.setContextMenuButtonsListener(object : ContextMenuButtonsListener { override fun onContextMenuButtonClicked(buttonId: Int, pointId: String, layerId: String) { @@ -137,7 +146,7 @@ class ShowLocationHelper(private val app: TelegramApplication) { osmandAidlHelper.showMapPoint(MAP_LAYER_ID, pointId, name, name, item.chatTitle, Color.WHITE, aLatLon, details, params) } } - + fun updateLocationsOnMap() { osmandAidlHelper.execOsmandApi { val messages = telegramHelper.getMessages() @@ -427,7 +436,7 @@ class ShowLocationHelper(private val app: TelegramApplication) { forcedStop = force if (showingLocation) { showingLocation = false - if (isUseOsmandCallback() && app.osmandAidlHelper.updatesCallbackRegistered()) { + if (isUseOsmandCallback() && osmandAidlHelper.updatesCallbackRegistered()) { osmandAidlHelper.unregisterFromUpdates() } else if (!app.settings.monitoringEnabled) { app.stopUserLocationService()