Use messages cache before getting messages online

This commit is contained in:
Pierre HUBERT 2019-03-02 10:44:25 +01:00
parent 882a949169
commit 4de0b62117
3 changed files with 115 additions and 108 deletions

View File

@ -6,6 +6,7 @@ import android.util.Log;
import org.communiquons.android.comunic.client.data.helpers.ConversationMessagesHelper;
import org.communiquons.android.comunic.client.data.models.ConversationMessage;
import org.communiquons.android.comunic.client.ui.listeners.OnMessagesChangeListener;
import java.util.ArrayList;
@ -21,7 +22,7 @@ public class ConversationRefreshRunnable implements Runnable {
/**
* Debug tag
*/
private String TAG = "ConversationRefreshRunn";
private static final String TAG = ConversationRefreshRunnable.class.getSimpleName();
/**
* The ID of the conversation
@ -36,7 +37,7 @@ public class ConversationRefreshRunnable implements Runnable {
/**
* Conversation message helper
*/
private ConversationMessagesHelper convMessHelper;
private ConversationMessagesHelper conversationMessagesHelper;
/**
* The activity executing the application
@ -46,7 +47,7 @@ public class ConversationRefreshRunnable implements Runnable {
/**
* Messages change listener
*/
private onMessagesChangeListener listener;
private OnMessagesChangeListener listener;
/**
* Set to true to make the thread exit
@ -73,47 +74,14 @@ public class ConversationRefreshRunnable implements Runnable {
int last_message_id,
@NonNull ConversationMessagesHelper conversationMessagesHelper,
Activity activity,
onMessagesChangeListener listener){
OnMessagesChangeListener listener){
this.conversation_id = conversation_id;
this.last_message_id = last_message_id;
this.convMessHelper = conversationMessagesHelper;
this.conversationMessagesHelper = conversationMessagesHelper;
this.mActivity = activity;
this.listener = listener;
}
/**
* onMessagesChangeListener
*
* This interface is used to perform callback actions on the UI Thread to add messages
* to a list for example
*
* This method also changes in the conversations
*/
public interface onMessagesChangeListener {
/**
* Add new messages to a previous list of messages
*
* @param lastID The ID of the latest message downloaded from server
* @param messages The new messagess
*/
void onAddMessage(int lastID, @NonNull ArrayList<ConversationMessage> messages);
/**
* This method is called when there is not any message in the conversation
*
* Warning ! This method may be called several time
*/
void onNoMessage();
/**
* This method is called when an error occur on a request on the database and / or on the
* remote server
*/
void onLoadError();
}
@Override
public void run() {
//Log action
@ -121,77 +89,25 @@ public class ConversationRefreshRunnable implements Runnable {
synchronized (object) {
//Get first messages in the database
checkForMessagesInDatabase();
//Loop that execute indefinitely until the fragment is stopped
while (!quit) {
//Refresh the list of messages from the server
if(!convMessHelper.refresh_conversation(conversation_id)){
if(!conversationMessagesHelper.refresh_conversation(conversation_id)){
//Callback : an error occurred
Log.e(TAG, "Couldn't get the list of new messages !");
mActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
listener.onLoadError();
}
});
continue;
mActivity.runOnUiThread(() -> listener.onLoadError());
}
//Get the ID of the last message available in the local database
final int lastMessageInDb = convMessHelper.getLastIDFromDb(conversation_id);
else
mActivity.runOnUiThread(() -> listener.onGotMessageFromServer());
//If the last message in the database is newer than the last message already read
if (lastMessageInDb > last_message_id) {
//Fetch all the messages available in the database since the last request
final ArrayList<ConversationMessage> newMessages = convMessHelper.getInDb(
conversation_id,
last_message_id + 1,
lastMessageInDb
);
//Check for errors
if(newMessages == null){
//Callback : an error occurred.
Log.e(TAG, "Couldn't get the list of new messages from local database !");
mActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
listener.onLoadError();
}
});
}
else {
//Use the callback to send the messages to the UI thread
mActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
listener.onAddMessage(lastMessageInDb, newMessages);
}
});
//Update the ID of the last message fetched
last_message_id = lastMessageInDb;
}
}
//Check if there isn't any message
if(last_message_id == 0){
mActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
listener.onNoMessage();
}
});
}
//Checkout the database to send any available new message to the client
checkForMessagesInDatabase();
//Make a small break (1 sec 200)
try {
@ -206,6 +122,51 @@ public class ConversationRefreshRunnable implements Runnable {
Log.v(TAG, "Stopped conversation refresh runnable.");
}
/**
* Check if the database contains messages that have not already been sent to the client
*/
private void checkForMessagesInDatabase(){
//Get the ID of the last message available in the local database
final int lastMessageInDb = conversationMessagesHelper.getLastIDFromDb(conversation_id);
//If the last message in the database is newer than the last message already read
if (lastMessageInDb > last_message_id) {
//Fetch all the messages available in the database since the last request
final ArrayList<ConversationMessage> newMessages = conversationMessagesHelper.getInDb(
conversation_id,
last_message_id + 1,
lastMessageInDb
);
//Check for errors
if(newMessages == null){
//Callback : an error occurred.
Log.e(TAG, "Couldn't get the list of new messages from local database !");
mActivity.runOnUiThread(() -> listener.onLoadError());
}
else {
//Use the callback to send the messages to the UI thread
mActivity.runOnUiThread(() ->
listener.onAddMessages(lastMessageInDb, newMessages));
//Update the ID of the last message fetched
last_message_id = lastMessageInDb;
}
}
//Check if there isn't any message
if(last_message_id == 0){
mActivity.runOnUiThread(() -> listener.onNoMessage());
}
}
/**
* Make the thread quit safely (does not interrupt currently running operation)
*/

View File

@ -1,7 +1,6 @@
package org.communiquons.android.comunic.client.ui.fragments;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.AsyncTask;
@ -29,7 +28,6 @@ import org.communiquons.android.comunic.client.data.arrays.ConversationMessagesL
import org.communiquons.android.comunic.client.data.helpers.CallsHelper;
import org.communiquons.android.comunic.client.data.helpers.ConversationMessagesHelper;
import org.communiquons.android.comunic.client.data.helpers.ConversationsListHelper;
import org.communiquons.android.comunic.client.data.helpers.DatabaseHelper;
import org.communiquons.android.comunic.client.data.helpers.GetUsersHelper;
import org.communiquons.android.comunic.client.data.models.ConversationMessage;
import org.communiquons.android.comunic.client.data.models.ConversationInfo;
@ -40,10 +38,10 @@ import org.communiquons.android.comunic.client.data.utils.AccountUtils;
import org.communiquons.android.comunic.client.ui.activities.MainActivity;
import org.communiquons.android.comunic.client.ui.adapters.ConversationMessageAdapter;
import org.communiquons.android.comunic.client.ui.asynctasks.DeleteConversationMessageTask;
import org.communiquons.android.comunic.client.ui.asynctasks.SafeAsyncTask;
import org.communiquons.android.comunic.client.ui.asynctasks.SendConversationMessageTask;
import org.communiquons.android.comunic.client.ui.asynctasks.UpdateConversationMessageContentTask;
import org.communiquons.android.comunic.client.ui.listeners.OnConversationMessageActionsListener;
import org.communiquons.android.comunic.client.ui.listeners.OnMessagesChangeListener;
import org.communiquons.android.comunic.client.ui.listeners.OnOpenCallListener;
import org.communiquons.android.comunic.client.ui.listeners.OnScrollChangeDetectListener;
import org.communiquons.android.comunic.client.ui.utils.BitmapUtils;
@ -68,7 +66,7 @@ import static org.communiquons.android.comunic.client.ui.Constants.IntentRequest
*/
public class ConversationFragment extends Fragment
implements ConversationRefreshRunnable.onMessagesChangeListener,
implements OnMessagesChangeListener,
OnScrollChangeDetectListener, OnConversationMessageActionsListener,
PopupMenu.OnMenuItemClickListener {
@ -387,19 +385,15 @@ public class ConversationFragment extends Fragment
@Override
public void onNoMessage() {
//Hide main progress bar
display_main_progress_bar(false);
//Display no message notice
display_not_msg_notice(true);
}
@Override
public void onAddMessage(int lastID, @NonNull ArrayList<ConversationMessage> newMessages) {
public void onAddMessages(int lastID, @NonNull ArrayList<ConversationMessage> newMessages) {
//Remove main progress bar and no message notice
display_main_progress_bar(false);
display_not_msg_notice(false);
//Add the messages to the the main list of messages
@ -426,6 +420,11 @@ public class ConversationFragment extends Fragment
Toast.LENGTH_SHORT).show();
}
@Override
public void onGotMessageFromServer() {
display_main_progress_bar(false);
}
/**
* Make sure we have got the information about all the users of the conversation
*/

View File

@ -0,0 +1,47 @@
package org.communiquons.android.comunic.client.ui.listeners;
import android.support.annotation.NonNull;
import org.communiquons.android.comunic.client.data.models.ConversationMessage;
import java.util.ArrayList;
/**
* OnMessagesChangeListener
*
* This interface is used to perform callback actions on the UI Thread to add messages
* to a list for example
*
* This method also changes in the conversations
*
* @author Pierre HUBERT
*/
public interface OnMessagesChangeListener {
/**
* Add new messages to a previous list of messages
*
* @param lastID The ID of the latest message downloaded from server
* @param messages The new messages
*/
void onAddMessages(int lastID, @NonNull ArrayList<ConversationMessage> messages);
/**
* This method is called when there is not any message in the conversation
*
* Warning ! This method may be called several time
*/
void onNoMessage();
/**
* This method is called when an error occur on a request on the database and / or on the
* remote server
*/
void onLoadError();
/**
* This method get called once we successfully retrieved new messages from server
*/
void onGotMessageFromServer();
}