diff --git a/app/src/main/java/com/nextcloud/talk/api/NcApi.java b/app/src/main/java/com/nextcloud/talk/api/NcApi.java index 79b25739b..b568dd210 100644 --- a/app/src/main/java/com/nextcloud/talk/api/NcApi.java +++ b/app/src/main/java/com/nextcloud/talk/api/NcApi.java @@ -429,4 +429,11 @@ public interface NcApi { @GET Observable hoverCard(@Header("Authorization") String authorization, @Url String url); + + // Url is: /api/{apiVersion}/chat/{token}/read + @FormUrlEncoded + @POST + Observable setChatReadMarker(@Header("Authorization") String authorization, + @Url String url, + @Field("lastReadMessage") int lastReadMessage); } diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt index 55295ca6a..996da875c 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt @@ -2319,6 +2319,38 @@ class ChatController(args: Bundle) : clipboardManager.setPrimaryClip(clipData) true } + R.id.action_mark_as_unread -> { + val chatMessage = message as ChatMessage? + ncApi!!.setChatReadMarker( + credentials, + ApiUtils.getUrlForSetChatReadMarker( + 1, + conversationUser?.baseUrl, + roomToken + ), + chatMessage!!.jsonMessageId.minus(1) + ) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(object : Observer { + override fun onSubscribe(d: Disposable) { + // unused atm + } + + override fun onNext(t: GenericOverall) { + // unused atm + } + + override fun onError(e: Throwable) { + Log.e(TAG, e.message, e) + } + + override fun onComplete() { + // unused atm + } + }) + true + } R.id.action_forward_message -> { val bundle = Bundle() bundle.putBoolean(BundleKeys.KEY_FORWARD_MSG_FLAG, true) diff --git a/app/src/main/java/com/nextcloud/talk/controllers/bottomsheet/CallMenuController.java b/app/src/main/java/com/nextcloud/talk/controllers/bottomsheet/CallMenuController.java index 42b367b67..a958de538 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/bottomsheet/CallMenuController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/bottomsheet/CallMenuController.java @@ -74,6 +74,7 @@ import eu.davidea.flexibleadapter.items.AbstractFlexibleItem; @AutoInjector(NextcloudTalkApplication.class) public class CallMenuController extends BaseController implements FlexibleAdapter.OnItemClickListener { + public static final int ALL_MESSAGES_READ = 0; @BindView(R.id.recycler_view) RecyclerView recyclerView; @@ -170,6 +171,12 @@ public class CallMenuController extends BaseController implements FlexibleAdapte R.color.grey_600))); } + if(conversation.unreadMessages > ALL_MESSAGES_READ && CapabilitiesUtil.canSetChatReadMarker(currentUser)) { + menuItems.add(new MenuItem(getResources().getString(R.string.nc_mark_as_read), + 96, + ContextCompat.getDrawable(context, R.drawable.ic_eye))); + } + if (conversation.isNameEditable(currentUser)) { menuItems.add(new MenuItem(getResources().getString(R.string.nc_rename), 2, @@ -340,7 +347,6 @@ public class CallMenuController extends BaseController implements FlexibleAdapte } return null; - } @Parcel diff --git a/app/src/main/java/com/nextcloud/talk/controllers/bottomsheet/OperationsMenuController.java b/app/src/main/java/com/nextcloud/talk/controllers/bottomsheet/OperationsMenuController.java index d084ee654..d08363354 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/bottomsheet/OperationsMenuController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/bottomsheet/OperationsMenuController.java @@ -33,6 +33,7 @@ import android.widget.Button; import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.TextView; +import android.widget.Toast; import com.bluelinelabs.conductor.RouterTransaction; import com.bluelinelabs.conductor.changehandler.HorizontalChangeHandler; @@ -74,6 +75,7 @@ import io.reactivex.Observer; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.Disposable; import io.reactivex.schedulers.Schedulers; +import okhttp3.ResponseBody; import retrofit2.HttpException; import retrofit2.Response; @@ -480,6 +482,17 @@ public class OperationsMenuController extends BaseController { }); break; + case 96: + // TODO: why does it break with v4? + ncApi.setChatReadMarker(credentials, + ApiUtils.getUrlForSetChatReadMarker(1, + currentUser.getBaseUrl(), + conversation.getToken()), + conversation.lastMessage.jsonMessageId) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .retry(1) + .subscribe(genericOperationsObserver); case 97: case 98: if (operationCode == 97) { diff --git a/app/src/main/java/com/nextcloud/talk/models/database/CapabilitiesUtil.java b/app/src/main/java/com/nextcloud/talk/models/database/CapabilitiesUtil.java index bd4fe3952..b5ba0a04b 100644 --- a/app/src/main/java/com/nextcloud/talk/models/database/CapabilitiesUtil.java +++ b/app/src/main/java/com/nextcloud/talk/models/database/CapabilitiesUtil.java @@ -75,6 +75,10 @@ public abstract class CapabilitiesUtil { return !hasSpreedFeatureCapability(user, "chat-replies"); } + public static boolean canSetChatReadMarker(@Nullable UserEntity user) { + return hasSpreedFeatureCapability(user, "chat-read-marker"); + } + public static boolean hasSpreedFeatureCapability(@Nullable UserEntity user, String capabilityName) { if (user != null && user.getCapabilities() != null) { try { diff --git a/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.java b/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.java index 413c8c72a..9d8921dbf 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.java +++ b/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.java @@ -406,4 +406,8 @@ public class ApiUtils { public static String getUrlForHoverCard(String baseUrl, String userId) { return baseUrl + ocsApiVersion + "/hovercard/v1/" + userId; } + + public static String getUrlForSetChatReadMarker(int version, String baseUrl, String roomToken) { + return getUrlForChat(version, baseUrl, roomToken) + "/read"; + } } diff --git a/app/src/main/res/drawable/ic_eye.xml b/app/src/main/res/drawable/ic_eye.xml new file mode 100644 index 000000000..b34a2006a --- /dev/null +++ b/app/src/main/res/drawable/ic_eye.xml @@ -0,0 +1,25 @@ + + + + diff --git a/app/src/main/res/drawable/ic_eye_off.xml b/app/src/main/res/drawable/ic_eye_off.xml new file mode 100644 index 000000000..f5e96aba4 --- /dev/null +++ b/app/src/main/res/drawable/ic_eye_off.xml @@ -0,0 +1,26 @@ + + + + diff --git a/app/src/main/res/menu/chat_message_menu.xml b/app/src/main/res/menu/chat_message_menu.xml index 17fe7420c..3f4cdad81 100644 --- a/app/src/main/res/menu/chat_message_menu.xml +++ b/app/src/main/res/menu/chat_message_menu.xml @@ -8,6 +8,12 @@ android:title="@string/nc_copy_message" app:showAsAction="always" /> + + New conversation Join with a link Join via web + Mark as read + Mark as unread Add to favorites Remove from favorites