Search in sources :

Example 56 with Event

use of org.matrix.androidsdk.rest.model.Event in project matrix-android-sdk by matrix-org.

the class MatrixMessageListFragment method resend.

/**
 * Resend an event.
 *
 * @param event the event to resend.
 */
protected void resend(final Event event) {
    // should never happen but got it in a GA issue
    if (null == event.eventId) {
        Log.e(LOG_TAG, "resend : got an event with a null eventId");
        return;
    }
    // check if the call is done in the right thread
    if (Looper.getMainLooper().getThread() != Thread.currentThread()) {
        Handler handler = new Handler(Looper.getMainLooper());
        handler.post(new Runnable() {

            @Override
            public void run() {
                resend(event);
            }
        });
        return;
    }
    // update the timestamp
    event.originServerTs = System.currentTimeMillis();
    // remove the event
    getSession().getDataHandler().deleteRoomEvent(event);
    mAdapter.removeEventById(event.eventId);
    mPendingRelaunchTimersByEventId.remove(event.eventId);
    // send it again
    final Message message = JsonUtils.toMessage(event.getContent());
    final RoomMediaMessage roomMediaMessage = new RoomMediaMessage(new Event(message, mSession.getMyUserId(), mRoom.getRoomId()));
    if (message instanceof MediaMessage) {
        sendMediaMessage(roomMediaMessage);
    } else {
        // default case : text / emote
        // skip the upload progress
        mRoom.sendMediaMessage(roomMediaMessage, getMaxThumbnailWidth(), getMaxThumbnailHeight(), mEventCreationListener);
    }
}
Also used : RoomMediaMessage(org.matrix.androidsdk.data.RoomMediaMessage) MediaMessage(org.matrix.androidsdk.rest.model.message.MediaMessage) RoomMediaMessage(org.matrix.androidsdk.data.RoomMediaMessage) Message(org.matrix.androidsdk.rest.model.message.Message) MediaMessage(org.matrix.androidsdk.rest.model.message.MediaMessage) Handler(android.os.Handler) MotionEvent(android.view.MotionEvent) Event(org.matrix.androidsdk.rest.model.Event) RoomMediaMessage(org.matrix.androidsdk.data.RoomMediaMessage)

Example 57 with Event

use of org.matrix.androidsdk.rest.model.Event in project matrix-android-sdk by matrix-org.

the class MatrixMessageListFragment method add.

/**
 * Add a media item in the room.
 */
private void add(final RoomMediaMessage roomMediaMessage) {
    MessageRow messageRow = addMessageRow(roomMediaMessage);
    // add sanity check
    if (null == messageRow) {
        return;
    }
    final Event event = messageRow.getEvent();
    if (!event.isUndeliverable()) {
        ApiCallback<Void> callback = new ApiCallback<Void>() {

            @Override
            public void onSuccess(Void info) {
                getUiHandler().post(new Runnable() {

                    @Override
                    public void run() {
                        onMessageSendingSucceeded(event);
                    }
                });
            }

            private void commonFailure(final Event event) {
                getUiHandler().post(new Runnable() {

                    @Override
                    public void run() {
                        Activity activity = getActivity();
                        if (null != activity) {
                            // display the error message only if the message cannot be resent
                            if ((null != event.unsentException) && (event.isUndeliverable())) {
                                if ((event.unsentException instanceof RetrofitError) && ((RetrofitError) event.unsentException).isNetworkError()) {
                                    Toast.makeText(activity, activity.getString(R.string.unable_to_send_message) + " : " + getActivity().getString(R.string.network_error), Toast.LENGTH_LONG).show();
                                } else {
                                    Toast.makeText(activity, activity.getString(R.string.unable_to_send_message) + " : " + event.unsentException.getLocalizedMessage(), Toast.LENGTH_LONG).show();
                                }
                            } else if (null != event.unsentMatrixError) {
                                String localised = (event.unsentMatrixError instanceof MXCryptoError) ? ((MXCryptoError) event.unsentMatrixError).getDetailedErrorDescription() : event.unsentMatrixError.getLocalizedMessage();
                                Toast.makeText(activity, activity.getString(R.string.unable_to_send_message) + " : " + localised, Toast.LENGTH_LONG).show();
                            }
                            mAdapter.notifyDataSetChanged();
                            onMessageSendingFailed(event);
                        }
                    }
                });
            }

            @Override
            public void onNetworkError(final Exception e) {
                commonFailure(event);
            }

            @Override
            public void onMatrixError(final MatrixError e) {
                // do not display toast if the sending failed because of unknown deviced (e2e issue)
                if (event.mSentState == Event.SentState.FAILED_UNKNOWN_DEVICES) {
                    getUiHandler().post(new Runnable() {

                        @Override
                        public void run() {
                            mAdapter.notifyDataSetChanged();
                            onUnknownDevices(event, (MXCryptoError) e);
                        }
                    });
                } else {
                    commonFailure(event);
                }
            }

            @Override
            public void onUnexpectedError(final Exception e) {
                commonFailure(event);
            }
        };
        roomMediaMessage.setEventSendingCallback(callback);
    }
}
Also used : ApiCallback(org.matrix.androidsdk.rest.callback.ApiCallback) SimpleApiCallback(org.matrix.androidsdk.rest.callback.SimpleApiCallback) Activity(android.app.Activity) MessageRow(org.matrix.androidsdk.adapters.MessageRow) MotionEvent(android.view.MotionEvent) Event(org.matrix.androidsdk.rest.model.Event) MatrixError(org.matrix.androidsdk.rest.model.MatrixError) RetrofitError(retrofit.RetrofitError) MXCryptoError(org.matrix.androidsdk.crypto.MXCryptoError)

Example 58 with Event

use of org.matrix.androidsdk.rest.model.Event in project matrix-android-sdk by matrix-org.

the class MatrixMessageListFragment method onEvent.

// ==============================================================================================================
// MatrixMessagesFragment methods
// ==============================================================================================================
@Override
public void onEvent(final Event event, final EventTimeline.Direction direction, final RoomState roomState) {
    if (null == event) {
        Log.e(LOG_TAG, "## onEvent() : null event");
        return;
    }
    if (TextUtils.equals(event.eventId, mEventId)) {
        // Save timestamp in case this event will not be added in adapter
        mEventOriginServerTs = event.getOriginServerTs();
    }
    if (direction == EventTimeline.Direction.FORWARDS) {
        if (Event.EVENT_TYPE_REDACTION.equals(event.getType())) {
            MessageRow messageRow = mAdapter.getMessageRow(event.getRedacts());
            if (null != messageRow) {
                Event prunedEvent = mSession.getDataHandler().getStore().getEvent(event.getRedacts(), event.roomId);
                if (null == prunedEvent) {
                    mAdapter.removeEventById(event.getRedacts());
                } else {
                    messageRow.updateEvent(prunedEvent);
                    JsonObject content = messageRow.getEvent().getContentAsJsonObject();
                    boolean hasToRemoved = (null == content) || (null == content.entrySet()) || (0 == content.entrySet().size());
                    // GA issue : the activity can be null
                    if (!hasToRemoved && (null != getActivity())) {
                        EventDisplay eventDisplay = new EventDisplay(getActivity(), prunedEvent, roomState);
                        hasToRemoved = TextUtils.isEmpty(eventDisplay.getTextualDisplay());
                    }
                    // event is removed if it has no more content.
                    if (hasToRemoved) {
                        mAdapter.removeEventById(prunedEvent.eventId);
                    }
                }
                mAdapter.notifyDataSetChanged();
            }
        } else {
            if (canAddEvent(event)) {
                // refresh the listView only when it is a live timeline or a search
                MessageRow newMessageRow = new MessageRow(event, roomState);
                mAdapter.add(newMessageRow, (null == mEventTimeLine) || mEventTimeLine.isLiveTimeline());
                // Move read marker if necessary
                if (isResumed() && mEventTimeLine != null && mEventTimeLine.isLiveTimeline()) {
                    MessageRow currentReadMarkerRow = getReadMarkerMessageRow(newMessageRow);
                    if (canUpdateReadMarker(newMessageRow, currentReadMarkerRow)) {
                        if (0 == mMessageListView.getChildCount()) {
                            mMessageListView.post(new Runnable() {

                                @Override
                                public void run() {
                                    // check if the previous one was displayed
                                    View childView = mMessageListView.getChildAt(mMessageListView.getChildCount() - 2);
                                    // Previous message was the last read
                                    if ((null != childView) && (childView.getTop() >= 0)) {
                                        // Move read marker to the newly sent message
                                        mRoom.setReadMakerEventId(event.eventId);
                                        mAdapter.resetReadMarker();
                                    }
                                }
                            });
                        } else {
                            View childView = mMessageListView.getChildAt(mMessageListView.getChildCount() - 1);
                            // Previous message was the last read
                            if ((null != childView) && (childView.getTop() >= 0)) {
                                // Move read marker to the newly sent message
                                mRoom.setReadMakerEventId(event.eventId);
                                mAdapter.resetReadMarker();
                            }
                        }
                    }
                }
            }
        }
    } else {
        if (canAddEvent(event)) {
            mAdapter.addToFront(new MessageRow(event, roomState));
        }
    }
}
Also used : MessageRow(org.matrix.androidsdk.adapters.MessageRow) MotionEvent(android.view.MotionEvent) Event(org.matrix.androidsdk.rest.model.Event) JsonObject(com.google.gson.JsonObject) EventDisplay(org.matrix.androidsdk.util.EventDisplay) View(android.view.View) AbsListView(android.widget.AbsListView) AutoScrollDownListView(org.matrix.androidsdk.view.AutoScrollDownListView)

Example 59 with Event

use of org.matrix.androidsdk.rest.model.Event in project matrix-android-sdk by matrix-org.

the class MatrixMessageListFragment method deleteUnsentEvents.

// ==============================================================================================================
// Unsent messages management
// ==============================================================================================================
/**
 * Delete the unsent (undeliverable messages).
 */
public void deleteUnsentEvents() {
    List<Event> unsent = mRoom.getUnsentEvents();
    mRoom.deleteEvents(unsent);
    for (Event event : unsent) {
        mAdapter.removeEventById(event.eventId);
    }
    mAdapter.notifyDataSetChanged();
}
Also used : MotionEvent(android.view.MotionEvent) Event(org.matrix.androidsdk.rest.model.Event)

Example 60 with Event

use of org.matrix.androidsdk.rest.model.Event in project matrix-android-sdk by matrix-org.

the class MatrixMessageListFragment method getReadMarkerMessageRow.

/**
 * Provides the read "marked row".
 * The closest row is provided if it is not displayed
 *
 * @return the currentReadMarkerRow
 */
private MessageRow getReadMarkerMessageRow(MessageRow newMessageRow) {
    final String currentReadMarkerEventId = mRoom.getReadMarkerEventId();
    MessageRow currentReadMarkerRow = mAdapter.getMessageRow(currentReadMarkerEventId);
    if (null == currentReadMarkerRow) {
        // crash reported by GA
        try {
            Event readMarkedEvent = mSession.getDataHandler().getStore().getEvent(currentReadMarkerEventId, mRoom.getRoomId());
            // the read marked event might be a non displayable event
            if ((null != readMarkedEvent) && !canAddEvent(readMarkedEvent)) {
                // retrieve the previous displayed event
                currentReadMarkerRow = mAdapter.getClosestRowFromTs(readMarkedEvent.eventId, readMarkedEvent.getOriginServerTs());
                // or it is the last known event
                if ((null != currentReadMarkerRow) && !canUpdateReadMarker(newMessageRow, currentReadMarkerRow)) {
                    currentReadMarkerRow = null;
                }
                // use the next one
                if (null == currentReadMarkerRow) {
                    currentReadMarkerRow = mAdapter.getClosestRowBeforeTs(readMarkedEvent.eventId, readMarkedEvent.getOriginServerTs());
                }
            }
        } catch (Exception e) {
            Log.e(LOG_TAG, "## getReadMarkerMessageRow() failed : " + e.getMessage());
        }
    }
    return currentReadMarkerRow;
}
Also used : MessageRow(org.matrix.androidsdk.adapters.MessageRow) MotionEvent(android.view.MotionEvent) Event(org.matrix.androidsdk.rest.model.Event)

Aggregations

Event (org.matrix.androidsdk.rest.model.Event)73 ArrayList (java.util.ArrayList)31 JsonObject (com.google.gson.JsonObject)28 Room (org.matrix.androidsdk.data.Room)27 MatrixError (org.matrix.androidsdk.rest.model.MatrixError)27 HashMap (java.util.HashMap)23 CountDownLatch (java.util.concurrent.CountDownLatch)22 RoomState (org.matrix.androidsdk.data.RoomState)21 Test (org.junit.Test)20 MXEventListener (org.matrix.androidsdk.listeners.MXEventListener)19 Context (android.content.Context)14 MotionEvent (android.view.MotionEvent)9 EventTimeline (org.matrix.androidsdk.data.EventTimeline)9 IMXStore (org.matrix.androidsdk.data.store.IMXStore)7 ReceiptData (org.matrix.androidsdk.rest.model.ReceiptData)6 RoomMember (org.matrix.androidsdk.rest.model.RoomMember)6 Credentials (org.matrix.androidsdk.rest.model.login.Credentials)6 Uri (android.net.Uri)5 File (java.io.File)4 MessageRow (org.matrix.androidsdk.adapters.MessageRow)4