Commit 265d6c5a authored by Tiago Cunha's avatar Tiago Cunha

Rough edit

parent 8b3ed8b1
...@@ -364,12 +364,18 @@ public class MethodCallHelper { ...@@ -364,12 +364,18 @@ public class MethodCallHelper {
/** /**
* send message. * send message.
*/ */
public Task<Void> sendMessage(String messageId, String roomId, String msg) { public Task<Void> sendMessage(String messageId, String roomId, String msg, long editedAt) {
try { try {
return sendMessage(new JSONObject() JSONObject messageJson = new JSONObject()
.put("_id", messageId) .put("_id", messageId)
.put("rid", roomId) .put("rid", roomId)
.put("msg", msg)); .put("msg", msg);
if (editedAt == 0) {
return sendMessage(messageJson);
} else {
return updateMessage(messageJson);
}
} catch (JSONException exception) { } catch (JSONException exception) {
return Task.forError(exception); return Task.forError(exception);
} }
...@@ -383,6 +389,11 @@ public class MethodCallHelper { ...@@ -383,6 +389,11 @@ public class MethodCallHelper {
.onSuccessTask(task -> Task.forResult(null)); .onSuccessTask(task -> Task.forResult(null));
} }
private Task<Void> updateMessage(final JSONObject messageJson) {
return call("updateMessage", TIMEOUT_MS, () -> new JSONArray().put(messageJson))
.onSuccessTask(task -> Task.forResult(null));
}
/** /**
* mark all messages are read in the room. * mark all messages are read in the room.
*/ */
......
...@@ -42,6 +42,8 @@ public interface RoomContract { ...@@ -42,6 +42,8 @@ public interface RoomContract {
void resendMessage(Message message); void resendMessage(Message message);
void updateMessage(Message message, String content);
void deleteMessage(Message message); void deleteMessage(Message message);
void onUnreadCount(); void onUnreadCount();
......
...@@ -120,6 +120,8 @@ public class RoomFragment extends AbstractChatRoomFragment ...@@ -120,6 +120,8 @@ public class RoomFragment extends AbstractChatRoomFragment
private MethodCallHelper methodCallHelper; private MethodCallHelper methodCallHelper;
private AbsoluteUrlHelper absoluteUrlHelper; private AbsoluteUrlHelper absoluteUrlHelper;
private Message edittingMessage = null;
public RoomFragment() { public RoomFragment() {
} }
...@@ -459,6 +461,11 @@ public class RoomFragment extends AbstractChatRoomFragment ...@@ -459,6 +461,11 @@ public class RoomFragment extends AbstractChatRoomFragment
@Override @Override
public boolean onBackPressed() { public boolean onBackPressed() {
if (edittingMessage != null) {
edittingMessage = null;
messageFormManager.clearComposingText();
return true;
}
return closeSideMenuIfNeeded(); return closeSideMenuIfNeeded();
} }
...@@ -513,7 +520,11 @@ public class RoomFragment extends AbstractChatRoomFragment ...@@ -513,7 +520,11 @@ public class RoomFragment extends AbstractChatRoomFragment
} }
private void sendMessage(String messageText) { private void sendMessage(String messageText) {
presenter.sendMessage(messageText); if (edittingMessage == null) {
presenter.sendMessage(messageText);
} else {
presenter.updateMessage(edittingMessage, messageText);
}
} }
@Override @Override
...@@ -560,6 +571,7 @@ public class RoomFragment extends AbstractChatRoomFragment ...@@ -560,6 +571,7 @@ public class RoomFragment extends AbstractChatRoomFragment
public void onMessageSendSuccessfully() { public void onMessageSendSuccessfully() {
scrollToLatestMessage(); scrollToLatestMessage();
messageFormManager.onMessageSend(); messageFormManager.onMessageSend();
edittingMessage = null;
} }
@Override @Override
...@@ -597,5 +609,7 @@ public class RoomFragment extends AbstractChatRoomFragment ...@@ -597,5 +609,7 @@ public class RoomFragment extends AbstractChatRoomFragment
} }
private void onEditMessage(Message message) { private void onEditMessage(Message message) {
edittingMessage = message;
messageFormManager.setEditMessage(message.getMessage());
} }
} }
...@@ -141,6 +141,24 @@ public class RoomPresenter extends BasePresenter<RoomContract.View> ...@@ -141,6 +141,24 @@ public class RoomPresenter extends BasePresenter<RoomContract.View>
addSubscription(subscription); addSubscription(subscription);
} }
@Override
public void updateMessage(Message message, String content) {
final Disposable subscription = getCurrentUser()
.flatMap(user -> messageInteractor.update(message, user, content))
.subscribeOn(AndroidSchedulers.from(BackgroundLooper.get()))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
success -> {
if (success) {
view.onMessageSendSuccessfully();
}
},
Logger::report
);
addSubscription(subscription);
}
@Override @Override
public void deleteMessage(Message message) { public void deleteMessage(Message message) {
final Disposable subscription = messageInteractor.delete(message) final Disposable subscription = messageInteractor.delete(message)
......
...@@ -119,6 +119,8 @@ public class MessageOptionsDialogFragment extends BottomSheetDialogFragment { ...@@ -119,6 +119,8 @@ public class MessageOptionsDialogFragment extends BottomSheetDialogFragment {
.subscribe( .subscribe(
pair -> { pair -> {
if (pair.second) { if (pair.second) {
bottomSheetDialog.findViewById(R.id.message_options_info)
.setVisibility(View.GONE);
View editView = bottomSheetDialog.findViewById(R.id.message_options_edit_action); View editView = bottomSheetDialog.findViewById(R.id.message_options_edit_action);
editView.setVisibility(View.VISIBLE); editView.setVisibility(View.VISIBLE);
editView.setOnClickListener(view -> internalListener.onEdit(pair.first)); editView.setOnClickListener(view -> internalListener.onEdit(pair.first));
......
...@@ -33,6 +33,11 @@ public class MessageFormManager { ...@@ -33,6 +33,11 @@ public class MessageFormManager {
messageFormLayout.setEnabled(true); messageFormLayout.setEnabled(true);
} }
public void setEditMessage(String message) {
clearComposingText();
messageFormLayout.setText(message);
}
private void sendMessage(String message) { private void sendMessage(String message) {
if (sendMessageCallback == null) { if (sendMessageCallback == null) {
return; return;
......
...@@ -57,13 +57,14 @@ public class NewMessageObserver extends AbstractModelObserver<RealmMessage> { ...@@ -57,13 +57,14 @@ public class NewMessageObserver extends AbstractModelObserver<RealmMessage> {
final String messageId = message.getId(); final String messageId = message.getId();
final String roomId = message.getRoomId(); final String roomId = message.getRoomId();
final String msg = message.getMessage(); final String msg = message.getMessage();
final long editedAt = message.getEditedAt();
realmHelper.executeTransaction(realm -> realmHelper.executeTransaction(realm ->
realm.createOrUpdateObjectFromJson(RealmMessage.class, new JSONObject() realm.createOrUpdateObjectFromJson(RealmMessage.class, new JSONObject()
.put(RealmMessage.ID, messageId) .put(RealmMessage.ID, messageId)
.put(RealmMessage.SYNC_STATE, SyncState.SYNCING) .put(RealmMessage.SYNC_STATE, SyncState.SYNCING)
) )
).onSuccessTask(task -> methodCall.sendMessage(messageId, roomId, msg) ).onSuccessTask(task -> methodCall.sendMessage(messageId, roomId, msg, editedAt)
).continueWith(task -> { ).continueWith(task -> {
if (task.isFaulted()) { if (task.isFaulted()) {
RCLog.w(task.getError()); RCLog.w(task.getError());
......
...@@ -6,6 +6,7 @@ import io.realm.RealmMigration; ...@@ -6,6 +6,7 @@ import io.realm.RealmMigration;
import io.realm.RealmObjectSchema; import io.realm.RealmObjectSchema;
import io.realm.RealmSchema; import io.realm.RealmSchema;
import chat.rocket.persistence.realm.models.ddp.RealmMessage;
import chat.rocket.persistence.realm.models.ddp.RealmPermission; import chat.rocket.persistence.realm.models.ddp.RealmPermission;
import chat.rocket.persistence.realm.models.ddp.RealmRole; import chat.rocket.persistence.realm.models.ddp.RealmRole;
import chat.rocket.persistence.realm.models.ddp.RealmRoomRole; import chat.rocket.persistence.realm.models.ddp.RealmRoomRole;
...@@ -60,6 +61,13 @@ public class Migration implements RealmMigration { ...@@ -60,6 +61,13 @@ public class Migration implements RealmMigration {
.addField(RealmRoomRole.Columns.ROOM_ID, String.class) .addField(RealmRoomRole.Columns.ROOM_ID, String.class)
.addRealmObjectField(RealmRoomRole.Columns.USER, schema.get("RealmUser")) .addRealmObjectField(RealmRoomRole.Columns.USER, schema.get("RealmUser"))
.addRealmListField(RealmRoomRole.Columns.ROLES, schema.get("RealmRole")); .addRealmListField(RealmRoomRole.Columns.ROLES, schema.get("RealmRole"));
oldVersion++;
}
if (oldVersion == 4) {
RealmObjectSchema messageSchema = schema.get("RealmMessage");
messageSchema.addField(RealmMessage.EDITED_AT, long.class);
} }
} }
} }
...@@ -15,7 +15,7 @@ public class RealmStore { ...@@ -15,7 +15,7 @@ public class RealmStore {
.name(name + ".realm") .name(name + ".realm")
.modules(new RocketChatLibraryModule()) .modules(new RocketChatLibraryModule())
.migration(new Migration()) .migration(new Migration())
.schemaVersion(4) .schemaVersion(5)
.build(); .build();
} }
......
...@@ -43,6 +43,7 @@ public class RealmMessage extends RealmObject { ...@@ -43,6 +43,7 @@ public class RealmMessage extends RealmObject {
public static final String GROUPABLE = "groupable"; public static final String GROUPABLE = "groupable";
public static final String ATTACHMENTS = "attachments"; public static final String ATTACHMENTS = "attachments";
public static final String URLS = "urls"; public static final String URLS = "urls";
public static final String EDITED_AT = "editedAt";
@PrimaryKey private String _id; @PrimaryKey private String _id;
private String t; //type: private String t; //type:
...@@ -56,6 +57,7 @@ public class RealmMessage extends RealmObject { ...@@ -56,6 +57,7 @@ public class RealmMessage extends RealmObject {
private String avatar; private String avatar;
private String attachments; //JSONArray. private String attachments; //JSONArray.
private String urls; //JSONArray. private String urls; //JSONArray.
private long editedAt;
public static JSONObject customizeJson(JSONObject messageJson) throws JSONException { public static JSONObject customizeJson(JSONObject messageJson) throws JSONException {
long ts = messageJson.getJSONObject(TIMESTAMP).getLong(JsonConstants.DATE); long ts = messageJson.getJSONObject(TIMESTAMP).getLong(JsonConstants.DATE);
...@@ -66,6 +68,15 @@ public class RealmMessage extends RealmObject { ...@@ -66,6 +68,15 @@ public class RealmMessage extends RealmObject {
messageJson.put(GROUPABLE, true); messageJson.put(GROUPABLE, true);
} }
long editedAt = 0L;
JSONObject editedAtObj = messageJson.optJSONObject(EDITED_AT);
if (editedAtObj != null) {
editedAt = editedAtObj.optLong(JsonConstants.DATE);
}
messageJson.remove(EDITED_AT);
messageJson.put(EDITED_AT, editedAt);
return messageJson; return messageJson;
} }
...@@ -165,6 +176,14 @@ public class RealmMessage extends RealmObject { ...@@ -165,6 +176,14 @@ public class RealmMessage extends RealmObject {
this.avatar = avatar; this.avatar = avatar;
} }
public long getEditedAt() {
return editedAt;
}
public void setEditedAt(long editedAt) {
this.editedAt = editedAt;
}
public Message asMessage() { public Message asMessage() {
return Message.builder() return Message.builder()
.setId(_id) .setId(_id)
...@@ -177,6 +196,7 @@ public class RealmMessage extends RealmObject { ...@@ -177,6 +196,7 @@ public class RealmMessage extends RealmObject {
.setGroupable(groupable) .setGroupable(groupable)
.setAlias(alias) .setAlias(alias)
.setAvatar(avatar) .setAvatar(avatar)
.setEditedAt(editedAt)
.setAttachments(getCoreAttachments()) .setAttachments(getCoreAttachments())
.setWebContents(getWebContents()) .setWebContents(getWebContents())
.build(); .build();
......
...@@ -71,6 +71,7 @@ public class RealmMessageRepository extends RealmRepository implements MessageRe ...@@ -71,6 +71,7 @@ public class RealmMessageRepository extends RealmRepository implements MessageRe
realmMessage.setTimestamp(message.getTimestamp()); realmMessage.setTimestamp(message.getTimestamp());
realmMessage.setRoomId(message.getRoomId()); realmMessage.setRoomId(message.getRoomId());
realmMessage.setMessage(message.getMessage()); realmMessage.setMessage(message.getMessage());
realmMessage.setEditedAt(message.getEditedAt());
RealmUser realmUser = realmMessage.getUser(); RealmUser realmUser = realmMessage.getUser();
if (realmUser == null) { if (realmUser == null) {
......
...@@ -12,6 +12,7 @@ import android.util.AttributeSet; ...@@ -12,6 +12,7 @@ import android.util.AttributeSet;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText; import android.widget.EditText;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
...@@ -135,8 +136,8 @@ public class MessageFormLayout extends LinearLayout { ...@@ -135,8 +136,8 @@ public class MessageFormLayout extends LinearLayout {
} }
} }
private TextView getEditor() { private EditText getEditor() {
return (TextView) composer.findViewById(R.id.editor); return (EditText) composer.findViewById(R.id.editor);
} }
public final String getText() { public final String getText() {
...@@ -144,11 +145,19 @@ public class MessageFormLayout extends LinearLayout { ...@@ -144,11 +145,19 @@ public class MessageFormLayout extends LinearLayout {
} }
public final void setText(final CharSequence text) { public final void setText(final CharSequence text) {
final TextView editor = getEditor(); final EditText editor = getEditor();
editor.post(new Runnable() { editor.post(new Runnable() {
@Override @Override
public void run() { public void run() {
editor.setText(text); editor.setText(text);
if (text.length() > 0) {
editor.setSelection(text.length());
InputMethodManager inputMethodManager = (InputMethodManager) editor.getContext()
.getSystemService(Context.INPUT_METHOD_SERVICE);
editor.requestFocus();
inputMethodManager.showSoftInput(editor, 0);
}
} }
}); });
} }
......
...@@ -56,6 +56,7 @@ class MessageInteractor(private val messageRepository: MessageRepository, ...@@ -56,6 +56,7 @@ class MessageInteractor(private val messageRepository: MessageRepository,
.setMessage(messageText) .setMessage(messageText)
.setGroupable(false) .setGroupable(false)
.setUser(sender) .setUser(sender)
.setEditedAt(0)
.build() .build()
return messageRepository.save(message) return messageRepository.save(message)
...@@ -66,6 +67,14 @@ class MessageInteractor(private val messageRepository: MessageRepository, ...@@ -66,6 +67,14 @@ class MessageInteractor(private val messageRepository: MessageRepository,
message.withSyncState(SyncState.NOT_SYNCED).withUser(sender)) message.withSyncState(SyncState.NOT_SYNCED).withUser(sender))
} }
fun update(message: Message, sender: User, content: String): Single<Boolean> {
return messageRepository.save(
message.withSyncState(SyncState.NOT_SYNCED)
.withUser(sender)
.withMessage(content)
.withEditedAt(message.editedAt + 1))
}
fun delete(message: Message): Single<Boolean> { fun delete(message: Message): Single<Boolean> {
return messageRepository.delete(message) return messageRepository.delete(message)
} }
......
...@@ -38,10 +38,16 @@ public abstract class Message { ...@@ -38,10 +38,16 @@ public abstract class Message {
@Nullable @Nullable
public abstract String getAvatar(); public abstract String getAvatar();
public abstract long getEditedAt();
public abstract Message withSyncState(int syncState); public abstract Message withSyncState(int syncState);
public abstract Message withUser(User user); public abstract Message withUser(User user);
public abstract Message withMessage(String message);
public abstract Message withEditedAt(long editedAt);
public static Builder builder() { public static Builder builder() {
return new AutoValue_Message.Builder(); return new AutoValue_Message.Builder();
} }
...@@ -59,7 +65,7 @@ public abstract class Message { ...@@ -59,7 +65,7 @@ public abstract class Message {
public abstract Builder setTimestamp(long timestamp); public abstract Builder setTimestamp(long timestamp);
public abstract Builder setMessage(String msg); public abstract Builder setMessage(String message);
public abstract Builder setUser(User user); public abstract Builder setUser(User user);
...@@ -73,6 +79,8 @@ public abstract class Message { ...@@ -73,6 +79,8 @@ public abstract class Message {
public abstract Builder setAvatar(String avatar); public abstract Builder setAvatar(String avatar);
public abstract Builder setEditedAt(long editedAt);
public abstract Message build(); public abstract Message build();
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment