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.helpers.ConversationMessagesHelper;
import org.communiquons.android.comunic.client.data.models.ConversationMessage; import org.communiquons.android.comunic.client.data.models.ConversationMessage;
import org.communiquons.android.comunic.client.ui.listeners.OnMessagesChangeListener;
import java.util.ArrayList; import java.util.ArrayList;
@ -21,7 +22,7 @@ public class ConversationRefreshRunnable implements Runnable {
/** /**
* Debug tag * Debug tag
*/ */
private String TAG = "ConversationRefreshRunn"; private static final String TAG = ConversationRefreshRunnable.class.getSimpleName();
/** /**
* The ID of the conversation * The ID of the conversation
@ -36,7 +37,7 @@ public class ConversationRefreshRunnable implements Runnable {
/** /**
* Conversation message helper * Conversation message helper
*/ */
private ConversationMessagesHelper convMessHelper; private ConversationMessagesHelper conversationMessagesHelper;
/** /**
* The activity executing the application * The activity executing the application
@ -46,7 +47,7 @@ public class ConversationRefreshRunnable implements Runnable {
/** /**
* Messages change listener * Messages change listener
*/ */
private onMessagesChangeListener listener; private OnMessagesChangeListener listener;
/** /**
* Set to true to make the thread exit * Set to true to make the thread exit
@ -73,47 +74,14 @@ public class ConversationRefreshRunnable implements Runnable {
int last_message_id, int last_message_id,
@NonNull ConversationMessagesHelper conversationMessagesHelper, @NonNull ConversationMessagesHelper conversationMessagesHelper,
Activity activity, Activity activity,
onMessagesChangeListener listener){ OnMessagesChangeListener listener){
this.conversation_id = conversation_id; this.conversation_id = conversation_id;
this.last_message_id = last_message_id; this.last_message_id = last_message_id;
this.convMessHelper = conversationMessagesHelper; this.conversationMessagesHelper = conversationMessagesHelper;
this.mActivity = activity; this.mActivity = activity;
this.listener = listener; 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 @Override
public void run() { public void run() {
//Log action //Log action
@ -121,77 +89,25 @@ public class ConversationRefreshRunnable implements Runnable {
synchronized (object) { synchronized (object) {
//Get first messages in the database
checkForMessagesInDatabase();
//Loop that execute indefinitely until the fragment is stopped //Loop that execute indefinitely until the fragment is stopped
while (!quit) { while (!quit) {
//Refresh the list of messages from the server //Refresh the list of messages from the server
if(!convMessHelper.refresh_conversation(conversation_id)){ if(!conversationMessagesHelper.refresh_conversation(conversation_id)){
//Callback : an error occurred //Callback : an error occurred
Log.e(TAG, "Couldn't get the list of new messages !"); Log.e(TAG, "Couldn't get the list of new messages !");
mActivity.runOnUiThread(new Runnable() { mActivity.runOnUiThread(() -> listener.onLoadError());
@Override
public void run() {
listener.onLoadError();
}
});
continue;
} }
//Get the ID of the last message available in the local database else
final int lastMessageInDb = convMessHelper.getLastIDFromDb(conversation_id); mActivity.runOnUiThread(() -> listener.onGotMessageFromServer());
//If the last message in the database is newer than the last message already read //Checkout the database to send any available new message to the client
if (lastMessageInDb > last_message_id) { checkForMessagesInDatabase();
//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();
}
});
}
//Make a small break (1 sec 200) //Make a small break (1 sec 200)
try { try {
@ -206,6 +122,51 @@ public class ConversationRefreshRunnable implements Runnable {
Log.v(TAG, "Stopped conversation refresh 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) * 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; package org.communiquons.android.comunic.client.ui.fragments;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.os.AsyncTask; 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.CallsHelper;
import org.communiquons.android.comunic.client.data.helpers.ConversationMessagesHelper; 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.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.helpers.GetUsersHelper;
import org.communiquons.android.comunic.client.data.models.ConversationMessage; import org.communiquons.android.comunic.client.data.models.ConversationMessage;
import org.communiquons.android.comunic.client.data.models.ConversationInfo; 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.activities.MainActivity;
import org.communiquons.android.comunic.client.ui.adapters.ConversationMessageAdapter; 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.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.SendConversationMessageTask;
import org.communiquons.android.comunic.client.ui.asynctasks.UpdateConversationMessageContentTask; 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.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.OnOpenCallListener;
import org.communiquons.android.comunic.client.ui.listeners.OnScrollChangeDetectListener; import org.communiquons.android.comunic.client.ui.listeners.OnScrollChangeDetectListener;
import org.communiquons.android.comunic.client.ui.utils.BitmapUtils; 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 public class ConversationFragment extends Fragment
implements ConversationRefreshRunnable.onMessagesChangeListener, implements OnMessagesChangeListener,
OnScrollChangeDetectListener, OnConversationMessageActionsListener, OnScrollChangeDetectListener, OnConversationMessageActionsListener,
PopupMenu.OnMenuItemClickListener { PopupMenu.OnMenuItemClickListener {
@ -387,19 +385,15 @@ public class ConversationFragment extends Fragment
@Override @Override
public void onNoMessage() { public void onNoMessage() {
//Hide main progress bar
display_main_progress_bar(false);
//Display no message notice //Display no message notice
display_not_msg_notice(true); display_not_msg_notice(true);
} }
@Override @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 //Remove main progress bar and no message notice
display_main_progress_bar(false);
display_not_msg_notice(false); display_not_msg_notice(false);
//Add the messages to the the main list of messages //Add the messages to the the main list of messages
@ -426,6 +420,11 @@ public class ConversationFragment extends Fragment
Toast.LENGTH_SHORT).show(); 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 * 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();
}