mirror of
				https://github.com/pierre42100/ComunicAndroid
				synced 2025-11-04 03:24:04 +00:00 
			
		
		
		
	Use messages cache before getting messages online
This commit is contained in:
		@@ -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)
 | 
			
		||||
     */
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
     */
 | 
			
		||||
 
 | 
			
		||||
@@ -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();
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user