From 4de0b621179bdf582477962b61d1e3d6195f1cc2 Mon Sep 17 00:00:00 2001 From: Pierre HUBERT Date: Sat, 2 Mar 2019 10:44:25 +0100 Subject: [PATCH] Use messages cache before getting messages online --- .../ConversationRefreshRunnable.java | 159 +++++++----------- .../ui/fragments/ConversationFragment.java | 17 +- .../listeners/OnMessagesChangeListener.java | 47 ++++++ 3 files changed, 115 insertions(+), 108 deletions(-) create mode 100644 app/src/main/java/org/communiquons/android/comunic/client/ui/listeners/OnMessagesChangeListener.java diff --git a/app/src/main/java/org/communiquons/android/comunic/client/data/runnables/ConversationRefreshRunnable.java b/app/src/main/java/org/communiquons/android/comunic/client/data/runnables/ConversationRefreshRunnable.java index 1acae36..9d38d4d 100644 --- a/app/src/main/java/org/communiquons/android/comunic/client/data/runnables/ConversationRefreshRunnable.java +++ b/app/src/main/java/org/communiquons/android/comunic/client/data/runnables/ConversationRefreshRunnable.java @@ -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 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 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 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) */ diff --git a/app/src/main/java/org/communiquons/android/comunic/client/ui/fragments/ConversationFragment.java b/app/src/main/java/org/communiquons/android/comunic/client/ui/fragments/ConversationFragment.java index c7b44ab..64344fe 100644 --- a/app/src/main/java/org/communiquons/android/comunic/client/ui/fragments/ConversationFragment.java +++ b/app/src/main/java/org/communiquons/android/comunic/client/ui/fragments/ConversationFragment.java @@ -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 newMessages) { + public void onAddMessages(int lastID, @NonNull ArrayList 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 */ diff --git a/app/src/main/java/org/communiquons/android/comunic/client/ui/listeners/OnMessagesChangeListener.java b/app/src/main/java/org/communiquons/android/comunic/client/ui/listeners/OnMessagesChangeListener.java new file mode 100644 index 0000000..4f70664 --- /dev/null +++ b/app/src/main/java/org/communiquons/android/comunic/client/ui/listeners/OnMessagesChangeListener.java @@ -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 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(); + +}