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);
}
}
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);
}
}
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));
}
}
}
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();
}
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;
}
Aggregations