mirror of
https://github.com/KDE/kdeconnect-android
synced 2025-08-28 12:47:43 +00:00
Initialize mostRecentTimestamp in SMSPlugin constructor
This commit is contained in:
parent
c8d940a71e
commit
0289416345
@ -127,6 +127,27 @@ public class SMSHelper {
|
|||||||
return Telephony.MmsSms.TYPE_DISCRIMINATOR_COLUMN;
|
return Telephony.MmsSms.TYPE_DISCRIMINATOR_COLUMN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the timestamp of the newest known message. Will return Integer.MIN_VALUE if there are no messages.
|
||||||
|
*
|
||||||
|
* @param context android.content.Context running the request
|
||||||
|
* @return Timestamp of the oldest known message.
|
||||||
|
*/
|
||||||
|
public static @Nullable long getNewestMessageTimestamp(
|
||||||
|
@NonNull Context context
|
||||||
|
) {
|
||||||
|
long oldestMessageTimestamp = Long.MIN_VALUE;
|
||||||
|
List<SMSHelper.Message> newestMessage = SMSHelper.getMessagesInRange(context, null, Long.MAX_VALUE, 1l, true);
|
||||||
|
// There should only be one, but in case for some reason there are more, take the latest
|
||||||
|
for (SMSHelper.Message message : newestMessage) {
|
||||||
|
if (message != null && message.date > oldestMessageTimestamp) {
|
||||||
|
oldestMessageTimestamp = message.date;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return oldestMessageTimestamp;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get some or all the messages in a requested thread, starting with the most-recent message
|
* Get some or all the messages in a requested thread, starting with the most-recent message
|
||||||
*
|
*
|
||||||
|
@ -15,8 +15,4 @@ object ThreadHelper {
|
|||||||
|
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
fun execute(command: Runnable) = executor.execute(command)
|
fun execute(command: Runnable) = executor.execute(command)
|
||||||
|
|
||||||
@JvmStatic
|
|
||||||
fun <T> executeCallable(callable: Callable<T>): Future<T> = executor.submit(callable)
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -30,6 +30,7 @@ import android.telephony.PhoneNumberUtils;
|
|||||||
import android.telephony.SmsManager;
|
import android.telephony.SmsManager;
|
||||||
import android.telephony.SmsMessage;
|
import android.telephony.SmsMessage;
|
||||||
|
|
||||||
|
import androidx.annotation.WorkerThread;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.core.content.ContextCompat;
|
import androidx.core.content.ContextCompat;
|
||||||
|
|
||||||
@ -222,6 +223,13 @@ public class SMSPlugin extends Plugin {
|
|||||||
// thread, make sure that access is coherent
|
// thread, make sure that access is coherent
|
||||||
private final Lock mostRecentTimestampLock = new ReentrantLock();
|
private final Lock mostRecentTimestampLock = new ReentrantLock();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Keep track of whether we have received any packet which requested messages.
|
||||||
|
*
|
||||||
|
* If not, we will not send updates, since probably the user doesn't care.
|
||||||
|
*/
|
||||||
|
private boolean haveMessagesBeenRequested = false;
|
||||||
|
|
||||||
private class MessageContentObserver extends ContentObserver {
|
private class MessageContentObserver extends ContentObserver {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -266,16 +274,18 @@ public class SMSPlugin extends Plugin {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Helper method to read the latest message from the sms-mms database and sends it to the desktop
|
* Helper method to read the latest message from the sms-mms database and sends it to the desktop
|
||||||
|
*
|
||||||
|
* Should only be called after initializing the mostRecentTimestamp
|
||||||
*/
|
*/
|
||||||
private void sendLatestMessage() {
|
private void sendLatestMessage() {
|
||||||
// Lock so no one uses the mostRecentTimestamp between the moment we read it and the
|
// Lock so no one uses the mostRecentTimestamp between the moment we read it and the
|
||||||
// moment we update it. This is because reading the Messages DB can take long.
|
// moment we update it. This is because reading the Messages DB can take long.
|
||||||
mostRecentTimestampLock.lock();
|
mostRecentTimestampLock.lock();
|
||||||
|
|
||||||
if (mostRecentTimestamp == 0) {
|
if (!haveMessagesBeenRequested) {
|
||||||
// Since the timestamp has not been initialized, we know that nobody else
|
// Since the user has not requested a message, there is most likely nobody listening
|
||||||
// has requested a message. That being the case, there is most likely
|
// for message updates, so just drop them rather than spending battery/time sending
|
||||||
// nobody listening for message updates, so just drop them
|
// updates that don't matter.
|
||||||
mostRecentTimestampLock.unlock();
|
mostRecentTimestampLock.unlock();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -375,6 +385,10 @@ public class SMSPlugin extends Plugin {
|
|||||||
// To see debug messages for Klinker library, uncomment the below line
|
// To see debug messages for Klinker library, uncomment the below line
|
||||||
//Log.setDebug(true);
|
//Log.setDebug(true);
|
||||||
|
|
||||||
|
mostRecentTimestampLock.lock();
|
||||||
|
mostRecentTimestamp = SMSHelper.getNewestMessageTimestamp(context);
|
||||||
|
mostRecentTimestampLock.unlock();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -394,12 +408,15 @@ public class SMSPlugin extends Plugin {
|
|||||||
|
|
||||||
switch (np.getType()) {
|
switch (np.getType()) {
|
||||||
case PACKET_TYPE_SMS_REQUEST_CONVERSATIONS:
|
case PACKET_TYPE_SMS_REQUEST_CONVERSATIONS:
|
||||||
Callable<Boolean> callable = () -> this.handleRequestAllConversations(np);
|
Runnable handleRequestAllConversationsRunnable = () -> this.handleRequestAllConversations(np);
|
||||||
ThreadHelper.executeCallable(callable);
|
ThreadHelper.execute(handleRequestAllConversationsRunnable);
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
case PACKET_TYPE_SMS_REQUEST_CONVERSATION:
|
case PACKET_TYPE_SMS_REQUEST_CONVERSATION:
|
||||||
return this.handleRequestSingleConversation(np);
|
Runnable handleRequestSingleConversationRunnable = () -> this.handleRequestSingleConversation(np);
|
||||||
|
ThreadHelper.execute(handleRequestSingleConversationRunnable);
|
||||||
|
return true;
|
||||||
|
|
||||||
case PACKET_TYPE_SMS_REQUEST:
|
case PACKET_TYPE_SMS_REQUEST:
|
||||||
String textMessage = np.getString("messageBody");
|
String textMessage = np.getString("messageBody");
|
||||||
subID = np.getLong("subID", -1);
|
subID = np.getLong("subID", -1);
|
||||||
@ -491,25 +508,22 @@ public class SMSPlugin extends Plugin {
|
|||||||
* <p>
|
* <p>
|
||||||
* Send one packet of type PACKET_TYPE_SMS_MESSAGE with the first message in all conversations
|
* Send one packet of type PACKET_TYPE_SMS_MESSAGE with the first message in all conversations
|
||||||
*/
|
*/
|
||||||
|
@WorkerThread
|
||||||
private boolean handleRequestAllConversations(NetworkPacket packet) {
|
private boolean handleRequestAllConversations(NetworkPacket packet) {
|
||||||
|
haveMessagesBeenRequested = true;
|
||||||
Iterable<SMSHelper.Message> conversations = SMSHelper.getConversations(this.context);
|
Iterable<SMSHelper.Message> conversations = SMSHelper.getConversations(this.context);
|
||||||
|
|
||||||
// Prepare the mostRecentTimestamp counter based on these messages, since they are the most
|
|
||||||
// recent in every conversation
|
|
||||||
mostRecentTimestampLock.lock();
|
|
||||||
for (SMSHelper.Message message : conversations) {
|
for (SMSHelper.Message message : conversations) {
|
||||||
if (message.date > mostRecentTimestamp) {
|
|
||||||
mostRecentTimestamp = message.date;
|
|
||||||
}
|
|
||||||
NetworkPacket partialReply = constructBulkMessagePacket(Collections.singleton(message));
|
NetworkPacket partialReply = constructBulkMessagePacket(Collections.singleton(message));
|
||||||
device.sendPacket(partialReply);
|
device.sendPacket(partialReply);
|
||||||
}
|
}
|
||||||
mostRecentTimestampLock.unlock();
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@WorkerThread
|
||||||
private boolean handleRequestSingleConversation(NetworkPacket packet) {
|
private boolean handleRequestSingleConversation(NetworkPacket packet) {
|
||||||
|
haveMessagesBeenRequested = true;
|
||||||
SMSHelper.ThreadID threadID = new SMSHelper.ThreadID(packet.getLong("threadID"));
|
SMSHelper.ThreadID threadID = new SMSHelper.ThreadID(packet.getLong("threadID"));
|
||||||
|
|
||||||
long rangeStartTimestamp = packet.getLong("rangeStartTimestamp", -1);
|
long rangeStartTimestamp = packet.getLong("rangeStartTimestamp", -1);
|
||||||
@ -526,17 +540,6 @@ public class SMSPlugin extends Plugin {
|
|||||||
conversation = SMSHelper.getMessagesInRange(this.context, threadID, rangeStartTimestamp, numberToGet, true);
|
conversation = SMSHelper.getMessagesInRange(this.context, threadID, rangeStartTimestamp, numberToGet, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sometimes when desktop app is kept open while android app is restarted for any reason
|
|
||||||
// mostRecentTimeStamp must be updated in that scenario too if a user request for a
|
|
||||||
// single conversation and not the entire conversation list
|
|
||||||
mostRecentTimestampLock.lock();
|
|
||||||
for (SMSHelper.Message message : conversation) {
|
|
||||||
if (message.date > mostRecentTimestamp) {
|
|
||||||
mostRecentTimestamp = message.date;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
mostRecentTimestampLock.unlock();
|
|
||||||
|
|
||||||
NetworkPacket reply = constructBulkMessagePacket(conversation);
|
NetworkPacket reply = constructBulkMessagePacket(conversation);
|
||||||
|
|
||||||
device.sendPacket(reply);
|
device.sendPacket(reply);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user