Merge pull request #6445 from osmandapp/TelegramImprovements
Add scan messages history
This commit is contained in:
commit
bf5ad027e4
2 changed files with 62 additions and 11 deletions
|
@ -113,7 +113,7 @@ public class SavingTracksDbHelper extends SQLiteOpenHelper {
|
||||||
public void saveAsyncUserDataToGpx(LiveNowTabFragment fragment, File dir, int userId, long interval) {
|
public void saveAsyncUserDataToGpx(LiveNowTabFragment fragment, File dir, int userId, long interval) {
|
||||||
GPXFile gpxFile = app.getSavingTracksDbHelper().collectRecordedDataForUser(userId, interval);
|
GPXFile gpxFile = app.getSavingTracksDbHelper().collectRecordedDataForUser(userId, interval);
|
||||||
if (gpxFile != null && !gpxFile.isEmpty()) {
|
if (gpxFile != null && !gpxFile.isEmpty()) {
|
||||||
LiveUpdatesPurchaseTask task = new LiveUpdatesPurchaseTask(fragment, gpxFile, dir, userId);
|
SaveGPXTrackToFileTask task = new SaveGPXTrackToFileTask(fragment, gpxFile, dir, userId);
|
||||||
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
|
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -244,7 +244,7 @@ public class SavingTracksDbHelper extends SQLiteOpenHelper {
|
||||||
return gpxFile;
|
return gpxFile;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class LiveUpdatesPurchaseTask extends AsyncTask<Void, Void, List<String>> {
|
private static class SaveGPXTrackToFileTask extends AsyncTask<Void, Void, List<String>> {
|
||||||
|
|
||||||
private TelegramApplication app;
|
private TelegramApplication app;
|
||||||
private WeakReference<LiveNowTabFragment> fragmentRef;
|
private WeakReference<LiveNowTabFragment> fragmentRef;
|
||||||
|
@ -253,7 +253,7 @@ public class SavingTracksDbHelper extends SQLiteOpenHelper {
|
||||||
private File dir;
|
private File dir;
|
||||||
private int userId;
|
private int userId;
|
||||||
|
|
||||||
LiveUpdatesPurchaseTask(LiveNowTabFragment fragment, GPXFile gpxFile, File dir, int userId) {
|
SaveGPXTrackToFileTask(LiveNowTabFragment fragment, GPXFile gpxFile, File dir, int userId) {
|
||||||
this.gpxFile = gpxFile;
|
this.gpxFile = gpxFile;
|
||||||
this.fragmentRef = new WeakReference<>(fragment);
|
this.fragmentRef = new WeakReference<>(fragment);
|
||||||
this.app = (TelegramApplication) fragment.getActivity().getApplication();
|
this.app = (TelegramApplication) fragment.getActivity().getApplication();
|
||||||
|
|
|
@ -66,6 +66,8 @@ class TelegramHelper private constructor() {
|
||||||
const val MIN_LOCATION_MESSAGE_LIVE_PERIOD_SEC = 61
|
const val MIN_LOCATION_MESSAGE_LIVE_PERIOD_SEC = 61
|
||||||
const val MAX_LOCATION_MESSAGE_LIVE_PERIOD_SEC = 60 * 60 * 24 - 1 // one day
|
const val MAX_LOCATION_MESSAGE_LIVE_PERIOD_SEC = 60 * 60 * 24 - 1 // one day
|
||||||
|
|
||||||
|
const val MAX_LOCATION_MESSAGE_HISTORY_SCAN_SEC = 60 * 60 * 24 // one day
|
||||||
|
|
||||||
const val SEND_NEW_MESSAGE_INTERVAL_SEC = 10 * 60 // 10 minutes
|
const val SEND_NEW_MESSAGE_INTERVAL_SEC = 10 * 60 // 10 minutes
|
||||||
|
|
||||||
private var helper: TelegramHelper? = null
|
private var helper: TelegramHelper? = null
|
||||||
|
@ -450,7 +452,7 @@ class TelegramHelper private constructor() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun requestChats(reload: Boolean = false) {
|
private fun requestChats(reload: Boolean = false, onComplete: (() -> Unit)?) {
|
||||||
synchronized(chatList) {
|
synchronized(chatList) {
|
||||||
if (reload) {
|
if (reload) {
|
||||||
chatList.clear()
|
chatList.clear()
|
||||||
|
@ -481,7 +483,8 @@ class TelegramHelper private constructor() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// chats had already been received through updates, let's retry request
|
// chats had already been received through updates, let's retry request
|
||||||
requestChats()
|
requestChats(false, this@TelegramHelper::scanChatsHistory)
|
||||||
|
onComplete?.invoke()
|
||||||
}
|
}
|
||||||
else -> listener?.onTelegramError(-1, "Receive wrong response from TDLib: $obj")
|
else -> listener?.onTelegramError(-1, "Receive wrong response from TDLib: $obj")
|
||||||
}
|
}
|
||||||
|
@ -615,6 +618,49 @@ class TelegramHelper private constructor() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun scanChatsHistory() {
|
||||||
|
log.debug("scanChatsHistory: chatList: ${chatList.size}")
|
||||||
|
chatList.forEach {
|
||||||
|
scanChatHistory(it.chatId, 0, 0, 100)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun scanChatHistory(
|
||||||
|
chatId: Long,
|
||||||
|
fromMessageId: Long,
|
||||||
|
offset: Int,
|
||||||
|
limit: Int,
|
||||||
|
onlyLocal: Boolean = false
|
||||||
|
) {
|
||||||
|
client?.send(TdApi.GetChatHistory(chatId, fromMessageId, offset, limit, onlyLocal)) { 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.Messages.CONSTRUCTOR -> {
|
||||||
|
val messages = (obj as TdApi.Messages).messages
|
||||||
|
log.debug("scanChatHistory: chatId: $chatId fromMessageId: $fromMessageId size: ${messages.size}")
|
||||||
|
if (messages.isNotEmpty()) {
|
||||||
|
messages.forEach {
|
||||||
|
addNewMessage(it)
|
||||||
|
}
|
||||||
|
val lastMessage = messages.last()
|
||||||
|
val currentTime = System.currentTimeMillis() / 1000
|
||||||
|
if (currentTime-Math.max(lastMessage.date, lastMessage.editDate) < MAX_LOCATION_MESSAGE_HISTORY_SCAN_SEC) {
|
||||||
|
scanChatHistory(chatId, lastMessage.id, 0, 100)
|
||||||
|
log.debug("scanChatHistory searchMessageId: ${lastMessage.id}")
|
||||||
|
} else {
|
||||||
|
log.debug("scanChatHistory finishForChat: $chatId")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private fun requestUser(id: Int) {
|
private fun requestUser(id: Int) {
|
||||||
client?.send(TdApi.GetUser(id)) { obj ->
|
client?.send(TdApi.GetUser(id)) { obj ->
|
||||||
when (obj.constructor) {
|
when (obj.constructor) {
|
||||||
|
@ -671,8 +717,9 @@ class TelegramHelper private constructor() {
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun addNewMessage(message: TdApi.Message) {
|
private fun addNewMessage(message: TdApi.Message) {
|
||||||
lastTelegramUpdateTime = Math.max(message.date, message.editDate)
|
lastTelegramUpdateTime = Math.max(lastTelegramUpdateTime, Math.max(message.date, message.editDate))
|
||||||
if (message.isAppropriate()) {
|
if (message.isAppropriate()) {
|
||||||
|
log.debug("addNewMessage: $message")
|
||||||
val fromBot = isOsmAndBot(message.senderUserId)
|
val fromBot = isOsmAndBot(message.senderUserId)
|
||||||
val viaBot = isOsmAndBot(message.viaBotUserId)
|
val viaBot = isOsmAndBot(message.viaBotUserId)
|
||||||
val oldContent = message.content
|
val oldContent = message.content
|
||||||
|
@ -691,9 +738,12 @@ class TelegramHelper private constructor() {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
removeOldMessages(message, fromBot, viaBot)
|
removeOldMessages(message, fromBot, viaBot)
|
||||||
usersLocationMessages[message.id] = message
|
val oldMessage = usersLocationMessages.values.firstOrNull { it.senderUserId == message.senderUserId && !fromBot && !viaBot }
|
||||||
incomingMessagesListeners.forEach {
|
if (oldMessage == null || (Math.max(message.editDate, message.date) > Math.max(oldMessage.editDate, oldMessage.date))) {
|
||||||
it.onReceiveChatLocationMessages(message.chatId, message)
|
usersLocationMessages[message.id] = message
|
||||||
|
incomingMessagesListeners.forEach {
|
||||||
|
it.onReceiveChatLocationMessages(message.chatId, message)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -716,7 +766,8 @@ class TelegramHelper private constructor() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (sameSender && isUserLocationMessage(message) && isUserLocationMessage(newMessage)) {
|
} else if (sameSender && isUserLocationMessage(message) && isUserLocationMessage(newMessage)
|
||||||
|
&& Math.max(newMessage.editDate, newMessage.date) > Math.max(message.editDate, message.date)) {
|
||||||
iterator.remove()
|
iterator.remove()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1138,7 +1189,7 @@ class TelegramHelper private constructor() {
|
||||||
if (wasAuthorized != haveAuthorization) {
|
if (wasAuthorized != haveAuthorization) {
|
||||||
needRefreshActiveLiveLocationMessages = true
|
needRefreshActiveLiveLocationMessages = true
|
||||||
if (haveAuthorization) {
|
if (haveAuthorization) {
|
||||||
requestChats(true)
|
requestChats(true, null)
|
||||||
requestCurrentUser()
|
requestCurrentUser()
|
||||||
requestContacts()
|
requestContacts()
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue