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 5a531f5c7..e4bcbfd67 100644 --- a/app/src/main/java/com/nextcloud/talk/api/NcApi.java +++ b/app/src/main/java/com/nextcloud/talk/api/NcApi.java @@ -550,4 +550,10 @@ public interface NcApi { @DELETE Observable closePoll(@Header("Authorization") String authorization, @Url String url); + + @FormUrlEncoded + @POST + Observable setMessageExpiration(@Header("Authorization") String authorization, + @Url String url, + @Field("seconds") Integer seconds); } 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 ae05049f5..8ea577f05 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt @@ -2217,7 +2217,7 @@ class ChatController(args: Bundle) : Log.i(TAG, "UI destroyed - view binding already gone") } - deleteExpiredMessages() + processExpiredMessages() } override fun onError(e: Throwable) { @@ -2259,7 +2259,7 @@ class ChatController(args: Bundle) : Log.i(TAG, "UI destroyed - view binding already gone", e) } - deleteExpiredMessages() + processExpiredMessages() } override fun onError(e: Throwable) { @@ -2274,8 +2274,8 @@ class ChatController(args: Bundle) : } } - private fun deleteExpiredMessages() { - if (CapabilitiesUtilNew.hasSpreedFeatureCapability(conversationUser, "message-expiration")) { + private fun processExpiredMessages() { + fun deleteExpiredMessages() { val messagesToDelete: ArrayList = ArrayList() val systemTime = System.currentTimeMillis() / ONE_SECOND_IN_MILLIS @@ -2290,6 +2290,10 @@ class ChatController(args: Bundle) : adapter!!.delete(messagesToDelete) adapter!!.notifyDataSetChanged() } + + if (CapabilitiesUtilNew.hasSpreedFeatureCapability(conversationUser, "message-expiration")) { + deleteExpiredMessages() + } } private fun processMessages(response: Response<*>, isFromTheFuture: Boolean, timeout: Int) { diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ConversationInfoController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ConversationInfoController.kt index d1db00a1c..5e86e27d3 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ConversationInfoController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ConversationInfoController.kt @@ -677,6 +677,7 @@ class ConversationInfoController(args: Bundle) : loadConversationAvatar() adjustNotificationLevelUI() + initExpiringMessageOption() binding.notificationSettingsView.notificationSettings.visibility = View.VISIBLE } @@ -697,6 +698,18 @@ class ConversationInfoController(args: Bundle) : }) } + private fun initExpiringMessageOption() { + if (conversation!!.isParticipantOwnerOrModerator && + CapabilitiesUtilNew.hasSpreedFeatureCapability(conversationUser, "message-expiration") + ) { + databaseStorageModule?.setMessageExpiration(conversation!!.messageExpiration) + binding.conversationInfoExpireMessages.setStorageModule(databaseStorageModule) + binding.conversationInfoExpireMessages.visibility = View.VISIBLE + } else { + binding.categoryConversationSettings.visibility = View.GONE + } + } + private fun adjustNotificationLevelUI() { if (conversation != null) { if ( 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 ff28cf031..c79e3185c 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.java +++ b/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.java @@ -147,7 +147,7 @@ public class ApiUtils { return version; } if (version == APIv1 && - user.hasSpreedFeatureCapability( "mention-flag") && + user.hasSpreedFeatureCapability("mention-flag") && !user.hasSpreedFeatureCapability("conversation-v4")) { return version; } @@ -479,4 +479,8 @@ public class ApiUtils { return baseUrl + ocsApiVersion + spreedApiVersion + "/poll/" + roomToken; } + public static String getUrlForMessageExpiration(int version, String baseUrl, String token) { + return getUrlForRoom(version, baseUrl, token) + "/message-expiration"; + } + } diff --git a/app/src/main/java/com/nextcloud/talk/utils/preferences/preferencestorage/DatabaseStorageModule.java b/app/src/main/java/com/nextcloud/talk/utils/preferences/preferencestorage/DatabaseStorageModule.java index 38ec20d5c..b38ee30c7 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/preferences/preferencestorage/DatabaseStorageModule.java +++ b/app/src/main/java/com/nextcloud/talk/utils/preferences/preferencestorage/DatabaseStorageModule.java @@ -60,6 +60,7 @@ public class DatabaseStorageModule implements StorageModule { @Inject NcApi ncApi; + private int messageExpiration; private final User conversationUser; private final String conversationToken; private final long accountIdentifier; @@ -78,7 +79,7 @@ public class DatabaseStorageModule implements StorageModule { @Override public void saveBoolean(String key, boolean value) { - if(key.equals("call_notifications")) { + if (key.equals("call_notifications")) { int apiVersion = ApiUtils.getConversationApiVersion(conversationUser, new int[]{4}); ncApi.notificationCalls(ApiUtils.getCredentials(conversationUser.getUsername(), conversationUser.getToken()), @@ -89,27 +90,27 @@ public class DatabaseStorageModule implements StorageModule { .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer() { - @Override - public void onSubscribe(@NotNull Disposable d) { - // unused atm - } + @Override + public void onSubscribe(@NotNull Disposable d) { + // unused atm + } - @Override - public void onNext(@NotNull GenericOverall genericOverall) { - Log.d(TAG, "Toggled notification calls"); - } + @Override + public void onNext(@NotNull GenericOverall genericOverall) { + Log.d(TAG, "Toggled notification calls"); + } - @Override - public void onError(@NotNull Throwable e) { - Log.e(TAG, "Error when trying to toggle notification calls", e); - } + @Override + public void onError(@NotNull Throwable e) { + Log.e(TAG, "Error when trying to toggle notification calls", e); + } - @Override - public void onComplete() { - // unused atm - } - } - ); + @Override + public void onComplete() { + // unused atm + } + } + ); } if (!key.equals("conversation_lobby")) { @@ -124,9 +125,46 @@ public class DatabaseStorageModule implements StorageModule { @Override public void saveString(String key, String value) { - if (!key.equals("message_notification_level")) { - arbitraryStorageManager.storeStorageSetting(accountIdentifier, key, value, conversationToken); - } else { + if (key.equals("message_expire_key")) { + int apiVersion = ApiUtils.getConversationApiVersion(conversationUser, new int[]{4}); + + String trimmedValue = value.replace("expire_", ""); + int valueInt = Integer.parseInt(trimmedValue); + + ncApi.setMessageExpiration( + ApiUtils.getCredentials( + conversationUser.getUsername(), + conversationUser.getToken()), + ApiUtils.getUrlForMessageExpiration( + apiVersion, + conversationUser.getBaseUrl(), + conversationToken), + valueInt) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Observer() { + @Override + public void onSubscribe(@NotNull Disposable d) { + // unused atm + } + + @Override + public void onNext(@NotNull GenericOverall genericOverall) { + messageExpiration = valueInt; + } + + @Override + public void onError(@NotNull Throwable e) { + Log.e(TAG, "Error when trying to set message expiration", e); + } + + @Override + public void onComplete() { + // unused atm + } + }); + + } else if (key.equals("message_notification_level")) { if (CapabilitiesUtilNew.hasSpreedFeatureCapability(conversationUser, "notification-levels")) { if (!TextUtils.isEmpty(messageNotificationLevel) && !messageNotificationLevel.equals(value)) { int intValue; @@ -144,40 +182,42 @@ public class DatabaseStorageModule implements StorageModule { intValue = 0; } - int apiVersion = ApiUtils.getConversationApiVersion(conversationUser, new int[] {ApiUtils.APIv4, 1}); + int apiVersion = ApiUtils.getConversationApiVersion(conversationUser, new int[]{ApiUtils.APIv4, 1}); ncApi.setNotificationLevel(ApiUtils.getCredentials(conversationUser.getUsername(), conversationUser.getToken()), - ApiUtils.getUrlForRoomNotificationLevel(apiVersion, - conversationUser.getBaseUrl(), - conversationToken), - intValue) - .subscribeOn(Schedulers.io()) - .subscribe(new Observer() { - @Override - public void onSubscribe(Disposable d) { - // unused atm - } + ApiUtils.getUrlForRoomNotificationLevel(apiVersion, + conversationUser.getBaseUrl(), + conversationToken), + intValue) + .subscribeOn(Schedulers.io()) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + // unused atm + } - @Override - public void onNext(GenericOverall genericOverall) { - messageNotificationLevel = value; - } + @Override + public void onNext(GenericOverall genericOverall) { + messageNotificationLevel = value; + } - @Override - public void onError(Throwable e) { - // unused atm - } + @Override + public void onError(Throwable e) { + // unused atm + } - @Override - public void onComplete() { - // unused atm - } - }); + @Override + public void onComplete() { + // unused atm + } + }); } else { messageNotificationLevel = value; } } + } else { + arbitraryStorageManager.storeStorageSetting(accountIdentifier, key, value, conversationToken); } } @@ -205,7 +245,22 @@ public class DatabaseStorageModule implements StorageModule { @Override public String getString(String key, String defaultVal) { - if (key.equals("message_notification_level")) { + if (key.equals("message_expire_key")) { + switch (messageExpiration) { + case 2419200: + return "expire_2419200"; + case 604800: + return "expire_604800"; + case 86400: + return "expire_86400"; + case 28800: + return "expire_28800"; + case 3600: + return "expire_3600"; + default: + return "expire_0"; + } + } else if (key.equals("message_notification_level")) { return messageNotificationLevel; } else { return arbitraryStorageManager @@ -243,4 +298,8 @@ public class DatabaseStorageModule implements StorageModule { public void onRestoreInstanceState(Bundle savedState) { // unused atm } + + public void setMessageExpiration(int messageExpiration) { + this.messageExpiration = messageExpiration; + } } diff --git a/app/src/main/res/layout/controller_conversation_info.xml b/app/src/main/res/layout/controller_conversation_info.xml index 42944cdd3..3f924d4ba 100644 --- a/app/src/main/res/layout/controller_conversation_info.xml +++ b/app/src/main/res/layout/controller_conversation_info.xml @@ -3,6 +3,8 @@ ~ ~ @author Mario Danic ~ @author Andy Scherzinger + ~ @author Marcel Hibbe + ~ Copyright (C) 2022 Marcel Hibbe ~ Copyright (C) 2021 Andy Scherzinger ~ Copyright (C) 2017-2018 Mario Danic ~ @@ -45,9 +47,10 @@ android:layout_width="match_parent" android:layout_height="wrap_content"> - + android:layout_height="wrap_content" + android:orientation="vertical"> + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - + diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 39bd83373..914ed67e3 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -3,6 +3,8 @@ ~ Nextcloud Talk application ~ ~ @author Mario Danic + ~ @author Marcel Hibbe + ~ Copyright (C) 2022 Marcel Hibbe ~ Copyright (C) 2017 Mario Danic ~ ~ This program is free software: you can redistribute it and/or modify @@ -39,6 +41,24 @@ always + + @string/nc_expire_message_off + @string/nc_expire_message_four_weeks + @string/nc_expire_message_one_week + @string/nc_expire_message_one_day + @string/nc_expire_message_eight_hours + @string/nc_expire_message_one_hour + + + + expire_0 + expire_2419200 + expire_604800 + expire_86400 + expire_28800 + expire_3600 + + @string/nc_screen_lock_timeout_30 @string/nc_screen_lock_timeout_60 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1322cb462..2c8f1fc79 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -3,6 +3,8 @@ ~ ~ @author Mario Danic ~ @author Andy Scherzinger + ~ @author Marcel Hibbe + ~ Copyright (C) 2022 Marcel Hibbe ~ Copyright (C) 2021 Andy Scherzinger ~ Copyright (C) 2017-2018 Mario Danic ~ @@ -564,4 +566,16 @@ Call without notification Set avatar from camera + Conversation settings + + + Expire chat messages + Off + 4 weeks + 1 week + 1 day + 8 hours + 1 hour + +