From 658988901cd2bf9de47b93f1569c7df1ecbc4167 Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Mon, 28 Oct 2024 19:30:55 +0100 Subject: [PATCH 01/21] add backupStatus endpoint Signed-off-by: sowjanyakch --- app/src/main/java/com/nextcloud/talk/api/NcApi.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) 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 a1603d356b..08092693b2 100644 --- a/app/src/main/java/com/nextcloud/talk/api/NcApi.java +++ b/app/src/main/java/com/nextcloud/talk/api/NcApi.java @@ -552,13 +552,12 @@ Observable setChatReadMarker(@Header("Authorization") String aut @GET Observable getOpenConversations(@Header("Authorization") String authorization, @Url String url); - - /* - * OCS Status API - */ @GET Observable status(@Header("Authorization") String authorization, @Url String url); + @GET + Observable backupStatus(@Header("Authorization") String authorization, @Url String url); + @GET Observable getPredefinedStatuses(@Header("Authorization") String authorization, @Url String url); From 8cd8c5ca01f83e988c9eb68a2ab48675c2f2607c Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Mon, 28 Oct 2024 19:33:04 +0100 Subject: [PATCH 02/21] create url for backup status Signed-off-by: sowjanyakch --- app/src/main/java/com/nextcloud/talk/utils/ApiUtils.kt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.kt b/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.kt index 04ee69e5de..f9baa086ce 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.kt @@ -482,6 +482,11 @@ object ApiUtils { return "$baseUrl$OCS_API_VERSION/apps/user_status/api/v1/user_status" } + @JvmStatic + fun getUrlForBackupStatus(baseUrl:String, userId:String):String{ + return "$baseUrl$OCS_API_VERSION/apps/user_status/api/v1/user_status/_$userId" + } + fun getUrlForSetStatusType(baseUrl: String): String { return getUrlForStatus(baseUrl) + "/status" } From 2aac51d8bb90d93875e92699ca6c3b81502f013b Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Mon, 28 Oct 2024 20:46:40 +0100 Subject: [PATCH 03/21] modify predefined_status.xml Signed-off-by: sowjanyakch --- app/src/main/res/layout/predefined_status.xml | 51 ++++++++++--------- 1 file changed, 27 insertions(+), 24 deletions(-) diff --git a/app/src/main/res/layout/predefined_status.xml b/app/src/main/res/layout/predefined_status.xml index 0285d3b5c0..11d474a035 100644 --- a/app/src/main/res/layout/predefined_status.xml +++ b/app/src/main/res/layout/predefined_status.xml @@ -9,7 +9,8 @@ + android:layout_height="wrap_content" + android:orientation="horizontal"> - + android:orientation="vertical" + android:layout_weight="1" + android:paddingStart="8dp" + android:paddingEnd="8dp" + android:paddingTop="8dp" + android:paddingBottom="4dp"> - + + + + - From 9f7c899368f17269f37c38c41d7a33c38221ea2f Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Mon, 28 Oct 2024 21:05:43 +0100 Subject: [PATCH 04/21] add reset button Signed-off-by: sowjanyakch --- app/src/main/res/layout/predefined_status.xml | 15 ++++++++++++++- app/src/main/res/values/strings.xml | 1 + 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/layout/predefined_status.xml b/app/src/main/res/layout/predefined_status.xml index 11d474a035..a3166227cd 100644 --- a/app/src/main/res/layout/predefined_status.xml +++ b/app/src/main/res/layout/predefined_status.xml @@ -22,7 +22,7 @@ + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ff1bef5b67..4cd1a86fba 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -381,6 +381,7 @@ How to translate with transifex: 4 hours This week seconds ago + Reset status Unread mentions From 6a9211e292c260bc882950ed873f53137946c25a Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Mon, 28 Oct 2024 21:22:42 +0100 Subject: [PATCH 05/21] show reset button on first item of recycler view Signed-off-by: sowjanyakch --- .../com/nextcloud/talk/adapters/PredefinedStatusViewHolder.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/java/com/nextcloud/talk/adapters/PredefinedStatusViewHolder.kt b/app/src/main/java/com/nextcloud/talk/adapters/PredefinedStatusViewHolder.kt index 500e452972..1ccdd5abf1 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/PredefinedStatusViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/PredefinedStatusViewHolder.kt @@ -8,6 +8,7 @@ package com.nextcloud.talk.adapters import android.content.Context +import android.view.View import androidx.recyclerview.widget.RecyclerView import com.nextcloud.talk.R import com.nextcloud.talk.databinding.PredefinedStatusBinding @@ -23,6 +24,8 @@ class PredefinedStatusViewHolder(private val binding: PredefinedStatusBinding) : binding.icon.text = status.icon binding.name.text = status.message + binding.resetStatusButton.visibility = if(position == 0) View.VISIBLE else View.GONE + if (status.clearAt == null) { binding.clearAt.text = context.getString(R.string.dontClear) } else { From 5fe5931bc4a0dcaa25eebd1247d8a90f09ce9bd5 Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Mon, 28 Oct 2024 22:05:05 +0100 Subject: [PATCH 06/21] add capability for restore Signed-off-by: sowjanyakch --- .../talk/models/json/capabilities/UserStatusCapability.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/nextcloud/talk/models/json/capabilities/UserStatusCapability.kt b/app/src/main/java/com/nextcloud/talk/models/json/capabilities/UserStatusCapability.kt index d8f6ee111f..1eda9036b4 100644 --- a/app/src/main/java/com/nextcloud/talk/models/json/capabilities/UserStatusCapability.kt +++ b/app/src/main/java/com/nextcloud/talk/models/json/capabilities/UserStatusCapability.kt @@ -19,9 +19,11 @@ import kotlinx.serialization.Serializable data class UserStatusCapability( @JsonField(name = ["enabled"]) var enabled: Boolean, + @JsonField(name = ["restore"]) + var restore: Boolean, @JsonField(name = ["supports_emoji"]) var supportsEmoji: Boolean ) : Parcelable { // This constructor is added to work with the 'com.bluelinelabs.logansquare.annotation.JsonObject' - constructor() : this(false, false) + constructor() : this(false, false,false) } From 27aafda59fcf1d5e051f5a754d8e66e1f0bd999f Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Wed, 30 Oct 2024 12:22:17 +0100 Subject: [PATCH 07/21] test backupStatus endpoint Signed-off-by: sowjanyakch --- .../talk/ui/dialog/SetStatusDialogFragment.kt | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt b/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt index 3392dfda91..7d35023938 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt @@ -39,6 +39,7 @@ import com.nextcloud.talk.databinding.DialogSetStatusBinding import com.nextcloud.talk.models.json.generic.GenericOverall import com.nextcloud.talk.models.json.status.ClearAt import com.nextcloud.talk.models.json.status.Status +import com.nextcloud.talk.models.json.status.StatusOverall import com.nextcloud.talk.models.json.status.StatusType import com.nextcloud.talk.models.json.status.predefined.PredefinedStatus import com.nextcloud.talk.models.json.status.predefined.PredefinedStatusOverall @@ -150,6 +151,37 @@ class SetStatusDialogFragment : } }) } + + + + + } + + fun backupStatus(){ + ncApi.backupStatus(credentials, ApiUtils.getUrlForBackupStatus(currentUser?.baseUrl!!,currentUser?.userId!!)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(object : Observer { + + override fun onSubscribe(d: Disposable) { + + } + + override fun onNext(statusOverall:StatusOverall) { + val status = statusOverall + Log.d("TAG","$status") + } + + + override fun onError(e: Throwable) { + Log.e(TAG, "Error while fetching predefined statuses", e) + } + + override fun onComplete() { + // unused atm + } + }) + } @SuppressLint("InflateParams") @@ -402,6 +434,10 @@ class SetStatusDialogFragment : }) } + private fun getBackupStatus(){ + + } + private fun visualizeStatus(statusType: String) { StatusType.values().firstOrNull { it.name == statusType.uppercase(Locale.ROOT) }?.let { visualizeStatus(it) } } From d08b4f51b80ff66af645a3856d4b6e50ac107b1e Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Mon, 4 Nov 2024 23:20:50 +0100 Subject: [PATCH 08/21] add backup message in the predefined status list Signed-off-by: sowjanyakch --- .../adapters/PredefinedStatusViewHolder.kt | 2 +- .../json/capabilities/UserStatusCapability.kt | 2 +- .../status/predefined/PredefinedStatus.kt | 2 +- .../talk/ui/dialog/SetStatusDialogFragment.kt | 91 +++++++++---------- .../java/com/nextcloud/talk/utils/ApiUtils.kt | 4 +- 5 files changed, 48 insertions(+), 53 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/adapters/PredefinedStatusViewHolder.kt b/app/src/main/java/com/nextcloud/talk/adapters/PredefinedStatusViewHolder.kt index 1ccdd5abf1..4c6bb4e659 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/PredefinedStatusViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/PredefinedStatusViewHolder.kt @@ -24,7 +24,7 @@ class PredefinedStatusViewHolder(private val binding: PredefinedStatusBinding) : binding.icon.text = status.icon binding.name.text = status.message - binding.resetStatusButton.visibility = if(position == 0) View.VISIBLE else View.GONE + binding.resetStatusButton.visibility = if (position == 0) View.VISIBLE else View.GONE if (status.clearAt == null) { binding.clearAt.text = context.getString(R.string.dontClear) diff --git a/app/src/main/java/com/nextcloud/talk/models/json/capabilities/UserStatusCapability.kt b/app/src/main/java/com/nextcloud/talk/models/json/capabilities/UserStatusCapability.kt index 1eda9036b4..1ccc07fc85 100644 --- a/app/src/main/java/com/nextcloud/talk/models/json/capabilities/UserStatusCapability.kt +++ b/app/src/main/java/com/nextcloud/talk/models/json/capabilities/UserStatusCapability.kt @@ -25,5 +25,5 @@ data class UserStatusCapability( var supportsEmoji: Boolean ) : Parcelable { // This constructor is added to work with the 'com.bluelinelabs.logansquare.annotation.JsonObject' - constructor() : this(false, false,false) + constructor() : this(false, false, false) } diff --git a/app/src/main/java/com/nextcloud/talk/models/json/status/predefined/PredefinedStatus.kt b/app/src/main/java/com/nextcloud/talk/models/json/status/predefined/PredefinedStatus.kt index 87b061c043..19dd1b0ac4 100644 --- a/app/src/main/java/com/nextcloud/talk/models/json/status/predefined/PredefinedStatus.kt +++ b/app/src/main/java/com/nextcloud/talk/models/json/status/predefined/PredefinedStatus.kt @@ -18,7 +18,7 @@ data class PredefinedStatus( @JsonField(name = ["id"]) var id: String, @JsonField(name = ["icon"]) - var icon: String, + var icon: String?, @JsonField(name = ["message"]) var message: String, @JsonField(name = ["clearAt"]) diff --git a/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt b/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt index 7d35023938..be5c2e1f23 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt @@ -115,73 +115,72 @@ class SetStatusDialogFragment : currentStatus = it.getParcelable(ARG_CURRENT_STATUS_PARAM) credentials = ApiUtils.getCredentials(currentUser?.username, currentUser?.token)!! - ncApi.getPredefinedStatuses(credentials, ApiUtils.getUrlForPredefinedStatuses(currentUser?.baseUrl!!)) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(object : Observer { - - override fun onSubscribe(d: Disposable) { - // unused atm - } - - override fun onNext(responseBody: ResponseBody) { - val predefinedStatusOverall: PredefinedStatusOverall = LoganSquare.parse( - responseBody - .string(), - PredefinedStatusOverall::class.java - ) - predefinedStatusOverall.ocs?.data?.let { it1 -> predefinedStatusesList.addAll(it1) } - - if (currentStatus?.messageIsPredefined == true && - currentStatus?.messageId?.isNotEmpty() == true - ) { - val messageId = currentStatus!!.messageId - selectedPredefinedStatus = predefinedStatusesList.firstOrNull { ps -> messageId == ps.id } - } - - adapter.notifyDataSetChanged() - } - - override fun onError(e: Throwable) { - Log.e(TAG, "Error while fetching predefined statuses", e) - } - - override fun onComplete() { - // unused atm - } - }) + checkBackupStatus() + fetchPredefinedStatuses() } + } + private fun fetchPredefinedStatuses() { + ncApi.getPredefinedStatuses(credentials, ApiUtils.getUrlForPredefinedStatuses(currentUser?.baseUrl!!)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(object : Observer { + override fun onSubscribe(d: Disposable) {} + + override fun onNext(responseBody: ResponseBody) { + val predefinedStatusOverall: PredefinedStatusOverall = LoganSquare.parse( + responseBody.string(), + PredefinedStatusOverall::class.java + ) + predefinedStatusOverall.ocs?.data?.let { predefinedStatusesList.addAll(it) } + + if (currentStatus?.messageIsPredefined == true && currentStatus?.messageId?.isNotEmpty() == true) { + val messageId = currentStatus!!.messageId + selectedPredefinedStatus = predefinedStatusesList.firstOrNull { ps -> messageId == ps.id } + } + adapter.notifyDataSetChanged() + } + override fun onError(e: Throwable) { + Log.e(TAG, "Error while fetching predefined statuses", e) + } + override fun onComplete() {} + }) } - fun backupStatus(){ - ncApi.backupStatus(credentials, ApiUtils.getUrlForBackupStatus(currentUser?.baseUrl!!,currentUser?.userId!!)) + private fun checkBackupStatus() { + ncApi.backupStatus(credentials, ApiUtils.getUrlForBackupStatus(currentUser?.baseUrl!!, currentUser?.userId!!)) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(object : Observer { override fun onSubscribe(d: Disposable) { - } - override fun onNext(statusOverall:StatusOverall) { - val status = statusOverall - Log.d("TAG","$status") + override fun onNext(statusOverall: StatusOverall) { + if (statusOverall.ocs?.meta?.statusCode == 200) { + val status = statusOverall.ocs?.data + if (status?.messageIsPredefined == false) { + val backupPredefinedStatus = PredefinedStatus( + status?.userId!!, + status.icon, + status.message!!, + ClearAt(type = "period", time = status.clearAt.toString()) + ) + predefinedStatusesList.add(0, backupPredefinedStatus) + } + } } - override fun onError(e: Throwable) { Log.e(TAG, "Error while fetching predefined statuses", e) } override fun onComplete() { - // unused atm } }) - } @SuppressLint("InflateParams") @@ -434,10 +433,6 @@ class SetStatusDialogFragment : }) } - private fun getBackupStatus(){ - - } - private fun visualizeStatus(statusType: String) { StatusType.values().firstOrNull { it.name == statusType.uppercase(Locale.ROOT) }?.let { visualizeStatus(it) } } diff --git a/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.kt b/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.kt index f9baa086ce..f03a8787f0 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.kt @@ -483,8 +483,8 @@ object ApiUtils { } @JvmStatic - fun getUrlForBackupStatus(baseUrl:String, userId:String):String{ - return "$baseUrl$OCS_API_VERSION/apps/user_status/api/v1/user_status/_$userId" + fun getUrlForBackupStatus(baseUrl: String, userId: String): String { + return "$baseUrl$OCS_API_VERSION/apps/user_status/api/v1/statuses/_$userId" } fun getUrlForSetStatusType(baseUrl: String): String { From 974da71e52ecbbf286cb492f3cfded89d5756397 Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Tue, 5 Nov 2024 13:46:28 +0100 Subject: [PATCH 09/21] get backup status only if restore capability is available Signed-off-by: sowjanyakch --- .../com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt | 5 ++++- .../main/java/com/nextcloud/talk/utils/CapabilitiesUtil.kt | 4 ++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt b/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt index be5c2e1f23..4a460ef10e 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt @@ -45,6 +45,7 @@ import com.nextcloud.talk.models.json.status.predefined.PredefinedStatus import com.nextcloud.talk.models.json.status.predefined.PredefinedStatusOverall import com.nextcloud.talk.ui.theme.ViewThemeUtils import com.nextcloud.talk.utils.ApiUtils +import com.nextcloud.talk.utils.CapabilitiesUtil.isRestoreStatusAvailable import com.nextcloud.talk.utils.DisplayUtils import com.nextcloud.talk.utils.database.user.CurrentUserProviderNew import com.vanniktech.emoji.EmojiPopup @@ -115,7 +116,9 @@ class SetStatusDialogFragment : currentStatus = it.getParcelable(ARG_CURRENT_STATUS_PARAM) credentials = ApiUtils.getCredentials(currentUser?.username, currentUser?.token)!! - checkBackupStatus() + if (isRestoreStatusAvailable(currentUser!!)) { + checkBackupStatus() + } fetchPredefinedStatuses() } } diff --git a/app/src/main/java/com/nextcloud/talk/utils/CapabilitiesUtil.kt b/app/src/main/java/com/nextcloud/talk/utils/CapabilitiesUtil.kt index 1b9d672968..3b24bce8da 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/CapabilitiesUtil.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/CapabilitiesUtil.kt @@ -274,6 +274,10 @@ object CapabilitiesUtil { user.capabilities?.userStatusCapability?.enabled == true && user.capabilities?.userStatusCapability?.supportsEmoji == true + fun isRestoreStatusAvailable(user: User): Boolean { + return user.capabilities?.userStatusCapability?.restore == true + } + // endregion private val TAG = CapabilitiesUtil::class.java.simpleName From ec01a049c86b0f3c6885faf7f71849965c9c083b Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Tue, 5 Nov 2024 22:04:51 +0100 Subject: [PATCH 10/21] add elements to predefinedStatusesList correctly Signed-off-by: sowjanyakch --- .../adapters/PredefinedStatusListAdapter.kt | 5 ++-- .../adapters/PredefinedStatusViewHolder.kt | 16 ++++++++++--- .../talk/ui/dialog/SetStatusDialogFragment.kt | 24 +++++++++++-------- .../nextcloud/talk/utils/CapabilitiesUtil.kt | 2 +- app/src/main/res/layout/predefined_status.xml | 4 +++- app/src/main/res/values/strings.xml | 1 + 6 files changed, 35 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/adapters/PredefinedStatusListAdapter.kt b/app/src/main/java/com/nextcloud/talk/adapters/PredefinedStatusListAdapter.kt index 9b44310d82..418ca32303 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/PredefinedStatusListAdapter.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/PredefinedStatusListAdapter.kt @@ -16,7 +16,8 @@ import com.nextcloud.talk.models.json.status.predefined.PredefinedStatus class PredefinedStatusListAdapter( private val clickListener: PredefinedStatusClickListener, - val context: Context + val context: Context, + var isBackupStatusAvailable: Boolean ) : RecyclerView.Adapter() { internal var list: List = emptyList() @@ -26,7 +27,7 @@ class PredefinedStatusListAdapter( } override fun onBindViewHolder(holder: PredefinedStatusViewHolder, position: Int) { - holder.bind(list[position], clickListener, context) + holder.bind(list[position], clickListener, context, isBackupStatusAvailable) } override fun getItemCount(): Int { diff --git a/app/src/main/java/com/nextcloud/talk/adapters/PredefinedStatusViewHolder.kt b/app/src/main/java/com/nextcloud/talk/adapters/PredefinedStatusViewHolder.kt index 4c6bb4e659..4fbcd45b9f 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/PredefinedStatusViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/PredefinedStatusViewHolder.kt @@ -17,15 +17,19 @@ import com.nextcloud.talk.utils.DisplayUtils private const val ONE_SECOND_IN_MILLIS = 1000 +@Suppress("DEPRECATION") class PredefinedStatusViewHolder(private val binding: PredefinedStatusBinding) : RecyclerView.ViewHolder(binding.root) { - fun bind(status: PredefinedStatus, clickListener: PredefinedStatusClickListener, context: Context) { + fun bind( + status: PredefinedStatus, + clickListener: PredefinedStatusClickListener, + context: Context, + isBackupStatusAvailable: Boolean + ) { binding.root.setOnClickListener { clickListener.onClick(status) } binding.icon.text = status.icon binding.name.text = status.message - binding.resetStatusButton.visibility = if (position == 0) View.VISIBLE else View.GONE - if (status.clearAt == null) { binding.clearAt.text = context.getString(R.string.dontClear) } else { @@ -43,5 +47,11 @@ class PredefinedStatusViewHolder(private val binding: PredefinedStatusBinding) : } } } + if (isBackupStatusAvailable) { + binding.resetStatusButton.visibility = if (position == 0) View.VISIBLE else View.GONE + if (position == 0) { + binding.clearAt.text = context.getString(R.string.previously_set) + } + } } } diff --git a/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt b/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt index 4a460ef10e..bdec2f12c0 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt @@ -94,6 +94,7 @@ class SetStatusDialogFragment : private lateinit var adapter: PredefinedStatusListAdapter private var clearAt: Long? = null private lateinit var popup: EmojiPopup + private var isBackupStatusAvailable = false @Inject lateinit var ncApi: NcApi @@ -130,6 +131,7 @@ class SetStatusDialogFragment : .subscribe(object : Observer { override fun onSubscribe(d: Disposable) {} + @SuppressLint("NotifyDataSetChanged") override fun onNext(responseBody: ResponseBody) { val predefinedStatusOverall: PredefinedStatusOverall = LoganSquare.parse( responseBody.string(), @@ -162,18 +164,20 @@ class SetStatusDialogFragment : override fun onSubscribe(d: Disposable) { } + @SuppressLint("NotifyDataSetChanged") override fun onNext(statusOverall: StatusOverall) { if (statusOverall.ocs?.meta?.statusCode == 200) { val status = statusOverall.ocs?.data - if (status?.messageIsPredefined == false) { - val backupPredefinedStatus = PredefinedStatus( - status?.userId!!, - status.icon, - status.message!!, - ClearAt(type = "period", time = status.clearAt.toString()) - ) - predefinedStatusesList.add(0, backupPredefinedStatus) - } + isBackupStatusAvailable = true + val backupPredefinedStatus = PredefinedStatus( + status?.userId!!, + status.icon, + status.message!!, + ClearAt(type = "period", time = status.clearAt.toString()) + ) + adapter.isBackupStatusAvailable = true + predefinedStatusesList.add(0, backupPredefinedStatus) + adapter.notifyDataSetChanged() } } @@ -202,7 +206,7 @@ class SetStatusDialogFragment : setupCurrentStatus() - adapter = PredefinedStatusListAdapter(this, requireContext()) + adapter = PredefinedStatusListAdapter(this, requireContext(), isBackupStatusAvailable) adapter.list = predefinedStatusesList binding.predefinedStatusList.adapter = adapter diff --git a/app/src/main/java/com/nextcloud/talk/utils/CapabilitiesUtil.kt b/app/src/main/java/com/nextcloud/talk/utils/CapabilitiesUtil.kt index 3b24bce8da..a6fe48e012 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/CapabilitiesUtil.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/CapabilitiesUtil.kt @@ -274,7 +274,7 @@ object CapabilitiesUtil { user.capabilities?.userStatusCapability?.enabled == true && user.capabilities?.userStatusCapability?.supportsEmoji == true - fun isRestoreStatusAvailable(user: User): Boolean { + fun isRestoreStatusAvailable(user: User): Boolean { return user.capabilities?.userStatusCapability?.restore == true } diff --git a/app/src/main/res/layout/predefined_status.xml b/app/src/main/res/layout/predefined_status.xml index a3166227cd..63a8ad22b1 100644 --- a/app/src/main/res/layout/predefined_status.xml +++ b/app/src/main/res/layout/predefined_status.xml @@ -59,6 +59,8 @@ android:textColor="@android:color/holo_red_light" android:text= "@string/reset_status" android:textSize="14sp" - android:padding="8dp"/> + android:padding="8dp" + android:visibility="gone" + tools:visibility="visible"/> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4cd1a86fba..1f8adeb183 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -827,5 +827,6 @@ How to translate with transifex: Archived Once a conversation is archived, it will be hidden by default. Select the filter \'Archived\' to view archived conversations. Direct mentions will still be received. Once a conversation is unarchived, it will be shown by default again. + Previously set Failed to set conversation Read-only From 9fbb3886ab848a99379cba88b96665a19260e7c3 Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Wed, 6 Nov 2024 15:12:34 +0100 Subject: [PATCH 11/21] handle reset status button Signed-off-by: sowjanyakch --- .../adapters/PredefinedStatusClickListener.kt | 1 + .../adapters/PredefinedStatusViewHolder.kt | 3 ++ .../java/com/nextcloud/talk/api/NcApi.java | 3 ++ .../talk/ui/dialog/SetStatusDialogFragment.kt | 50 ++++++++++++++++--- .../java/com/nextcloud/talk/utils/ApiUtils.kt | 4 ++ app/src/main/res/values/strings.xml | 1 + 6 files changed, 56 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/adapters/PredefinedStatusClickListener.kt b/app/src/main/java/com/nextcloud/talk/adapters/PredefinedStatusClickListener.kt index 63a81b9c1a..c6a543195b 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/PredefinedStatusClickListener.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/PredefinedStatusClickListener.kt @@ -10,4 +10,5 @@ import com.nextcloud.talk.models.json.status.predefined.PredefinedStatus interface PredefinedStatusClickListener { fun onClick(predefinedStatus: PredefinedStatus) + fun revertStatus() } diff --git a/app/src/main/java/com/nextcloud/talk/adapters/PredefinedStatusViewHolder.kt b/app/src/main/java/com/nextcloud/talk/adapters/PredefinedStatusViewHolder.kt index 4fbcd45b9f..6301b6cc08 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/PredefinedStatusViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/PredefinedStatusViewHolder.kt @@ -52,6 +52,9 @@ class PredefinedStatusViewHolder(private val binding: PredefinedStatusBinding) : if (position == 0) { binding.clearAt.text = context.getString(R.string.previously_set) } + binding.resetStatusButton.setOnClickListener{ + clickListener.revertStatus() + } } } } 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 08092693b2..e4811c780f 100644 --- a/app/src/main/java/com/nextcloud/talk/api/NcApi.java +++ b/app/src/main/java/com/nextcloud/talk/api/NcApi.java @@ -286,6 +286,9 @@ Observable pullSignalingMessages(@Nullable @Header("Authorizat @GET Observable getUserData(@Header("Authorization") String authorization, @Url String url); + @DELETE + Observable revertStatus(@Header("Authentication") String authorization, @Url String url); + @FormUrlEncoded @PUT Observable setUserData(@Header("Authorization") String authorization, diff --git a/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt b/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt index bdec2f12c0..ee8c293de6 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt @@ -28,6 +28,7 @@ import autodagger.AutoInjector import com.bluelinelabs.logansquare.LoganSquare import com.google.android.material.card.MaterialCardView import com.google.android.material.dialog.MaterialAlertDialogBuilder +import com.google.android.material.snackbar.Snackbar import com.nextcloud.android.common.ui.theme.utils.ColorRole import com.nextcloud.talk.R import com.nextcloud.talk.adapters.PredefinedStatusClickListener @@ -88,6 +89,7 @@ class SetStatusDialogFragment : private var currentUser: User? = null private var currentStatus: Status? = null + private lateinit var backupStatus: Status val predefinedStatusesList = ArrayList() @@ -96,6 +98,7 @@ class SetStatusDialogFragment : private lateinit var popup: EmojiPopup private var isBackupStatusAvailable = false + @Inject lateinit var ncApi: NcApi @@ -167,13 +170,13 @@ class SetStatusDialogFragment : @SuppressLint("NotifyDataSetChanged") override fun onNext(statusOverall: StatusOverall) { if (statusOverall.ocs?.meta?.statusCode == 200) { - val status = statusOverall.ocs?.data + backupStatus = statusOverall.ocs?.data!! isBackupStatusAvailable = true val backupPredefinedStatus = PredefinedStatus( - status?.userId!!, - status.icon, - status.message!!, - ClearAt(type = "period", time = status.clearAt.toString()) + backupStatus?.userId!!, + backupStatus.icon, + backupStatus.message!!, + ClearAt(type = "period", time = backupStatus.clearAt.toString()) ) adapter.isBackupStatusAvailable = true predefinedStatusesList.add(0, backupPredefinedStatus) @@ -221,7 +224,6 @@ class SetStatusDialogFragment : binding.clearStatus.setOnClickListener { clearStatus() } binding.setStatus.setOnClickListener { setStatusMessage() } binding.emoji.setOnClickListener { openEmojiPopup() } - popup = EmojiPopup( rootView = view, editText = binding.emoji, @@ -282,6 +284,42 @@ class SetStatusDialogFragment : } } + override fun revertStatus(){ + ncApi.revertStatus(credentials, ApiUtils.getUrlForRevertStatus(currentUser?.baseUrl!!, currentStatus?.messageId)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(object : Observer { + + override fun onSubscribe(d: Disposable) { + } + + @SuppressLint("NotifyDataSetChanged") + override fun onNext(genericOverall:GenericOverall) { + Log.d(TAG,"$genericOverall") + if(genericOverall.ocs?.meta?.statusCode == 200){ + Snackbar.make( + binding.root, + R.string.status_reverted, + Snackbar.LENGTH_LONG + ).show() + adapter.isBackupStatusAvailable = false + predefinedStatusesList.removeAt(0) + adapter.notifyDataSetChanged() + currentStatus = backupStatus + setupCurrentStatus() + } + } + override fun onError(e: Throwable) { + Log.e(TAG, "Error while fetching predefined statuses", e) + } + + override fun onComplete() { + } + }) + + + } + private fun setupGeneralStatusOptions() { binding.onlineStatus.setOnClickListener { setStatus(StatusType.ONLINE) } binding.dndStatus.setOnClickListener { setStatus(StatusType.DND) } diff --git a/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.kt b/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.kt index f03a8787f0..8692954691 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.kt @@ -487,6 +487,10 @@ object ApiUtils { return "$baseUrl$OCS_API_VERSION/apps/user_status/api/v1/statuses/_$userId" } + fun getUrlForRevertStatus(baseUrl:String, messageId:String?):String{ + return "$baseUrl$OCS_API_VERSION/apps/user_status/api/v1/user_status/revert/$messageId" + } + fun getUrlForSetStatusType(baseUrl: String): String { return getUrlForStatus(baseUrl) + "/status" } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1f8adeb183..81db0c17df 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -829,4 +829,5 @@ How to translate with transifex: Once a conversation is unarchived, it will be shown by default again. Previously set Failed to set conversation Read-only + Status Reverted From 7a63a645feec19c251898048143d74f24ecb5bae Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Wed, 6 Nov 2024 15:13:56 +0100 Subject: [PATCH 12/21] format Signed-off-by: sowjanyakch --- .../talk/adapters/PredefinedStatusViewHolder.kt | 2 +- .../talk/ui/dialog/SetStatusDialogFragment.kt | 16 ++++++++-------- .../java/com/nextcloud/talk/utils/ApiUtils.kt | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/adapters/PredefinedStatusViewHolder.kt b/app/src/main/java/com/nextcloud/talk/adapters/PredefinedStatusViewHolder.kt index 6301b6cc08..cad4327bdf 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/PredefinedStatusViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/PredefinedStatusViewHolder.kt @@ -52,7 +52,7 @@ class PredefinedStatusViewHolder(private val binding: PredefinedStatusBinding) : if (position == 0) { binding.clearAt.text = context.getString(R.string.previously_set) } - binding.resetStatusButton.setOnClickListener{ + binding.resetStatusButton.setOnClickListener { clickListener.revertStatus() } } diff --git a/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt b/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt index ee8c293de6..7640293660 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt @@ -98,7 +98,6 @@ class SetStatusDialogFragment : private lateinit var popup: EmojiPopup private var isBackupStatusAvailable = false - @Inject lateinit var ncApi: NcApi @@ -284,8 +283,11 @@ class SetStatusDialogFragment : } } - override fun revertStatus(){ - ncApi.revertStatus(credentials, ApiUtils.getUrlForRevertStatus(currentUser?.baseUrl!!, currentStatus?.messageId)) + override fun revertStatus() { + ncApi.revertStatus( + credentials, + ApiUtils.getUrlForRevertStatus(currentUser?.baseUrl!!, currentStatus?.messageId) + ) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(object : Observer { @@ -294,9 +296,9 @@ class SetStatusDialogFragment : } @SuppressLint("NotifyDataSetChanged") - override fun onNext(genericOverall:GenericOverall) { - Log.d(TAG,"$genericOverall") - if(genericOverall.ocs?.meta?.statusCode == 200){ + override fun onNext(genericOverall: GenericOverall) { + Log.d(TAG, "$genericOverall") + if (genericOverall.ocs?.meta?.statusCode == 200) { Snackbar.make( binding.root, R.string.status_reverted, @@ -316,8 +318,6 @@ class SetStatusDialogFragment : override fun onComplete() { } }) - - } private fun setupGeneralStatusOptions() { diff --git a/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.kt b/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.kt index 8692954691..aa4023a796 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.kt @@ -487,7 +487,7 @@ object ApiUtils { return "$baseUrl$OCS_API_VERSION/apps/user_status/api/v1/statuses/_$userId" } - fun getUrlForRevertStatus(baseUrl:String, messageId:String?):String{ + fun getUrlForRevertStatus(baseUrl: String, messageId: String?): String { return "$baseUrl$OCS_API_VERSION/apps/user_status/api/v1/user_status/revert/$messageId" } From c4f4c857d349bb3ab56353cf7e66f3e97a9f821d Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Wed, 6 Nov 2024 18:27:03 +0100 Subject: [PATCH 13/21] check for capability before reverting status Signed-off-by: sowjanyakch --- .../talk/ui/dialog/SetStatusDialogFragment.kt | 64 ++++++++++--------- .../java/com/nextcloud/talk/utils/ApiUtils.kt | 2 +- 2 files changed, 34 insertions(+), 32 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt b/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt index 7640293660..77cab2606a 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt @@ -283,41 +283,43 @@ class SetStatusDialogFragment : } } - override fun revertStatus() { - ncApi.revertStatus( - credentials, - ApiUtils.getUrlForRevertStatus(currentUser?.baseUrl!!, currentStatus?.messageId) - ) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(object : Observer { + override fun revertStatus() { + if (isRestoreStatusAvailable(currentUser!!)) { + ncApi.revertStatus( + credentials, + ApiUtils.getUrlForRevertStatus(currentUser?.baseUrl!!, currentStatus?.messageId) + ) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(object : Observer { - override fun onSubscribe(d: Disposable) { - } + override fun onSubscribe(d: Disposable) { + } - @SuppressLint("NotifyDataSetChanged") - override fun onNext(genericOverall: GenericOverall) { - Log.d(TAG, "$genericOverall") - if (genericOverall.ocs?.meta?.statusCode == 200) { - Snackbar.make( - binding.root, - R.string.status_reverted, - Snackbar.LENGTH_LONG - ).show() - adapter.isBackupStatusAvailable = false - predefinedStatusesList.removeAt(0) - adapter.notifyDataSetChanged() - currentStatus = backupStatus - setupCurrentStatus() + @SuppressLint("NotifyDataSetChanged") + override fun onNext(genericOverall: GenericOverall) { + Log.d(TAG, "$genericOverall") + if (genericOverall.ocs?.meta?.statusCode == 200) { + Snackbar.make( + binding.root, + R.string.status_reverted, + Snackbar.LENGTH_LONG + ).show() + adapter.isBackupStatusAvailable = false + predefinedStatusesList.removeAt(0) + adapter.notifyDataSetChanged() + currentStatus = backupStatus + setupCurrentStatus() + } + } + override fun onError(e: Throwable) { + Log.e(TAG, "Error while fetching predefined statuses", e) } - } - override fun onError(e: Throwable) { - Log.e(TAG, "Error while fetching predefined statuses", e) - } - override fun onComplete() { - } - }) + override fun onComplete() { + } + }) + } } private fun setupGeneralStatusOptions() { diff --git a/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.kt b/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.kt index aa4023a796..5440e6bb1c 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.kt @@ -487,7 +487,7 @@ object ApiUtils { return "$baseUrl$OCS_API_VERSION/apps/user_status/api/v1/statuses/_$userId" } - fun getUrlForRevertStatus(baseUrl: String, messageId: String?): String { + fun getUrlForRevertStatus(baseUrl: String, messageId: String?): String { return "$baseUrl$OCS_API_VERSION/apps/user_status/api/v1/user_status/revert/$messageId" } From 13208e85f9627e58bcfb9429296926201ad46e52 Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Wed, 6 Nov 2024 18:28:54 +0100 Subject: [PATCH 14/21] remove redundant null check Signed-off-by: sowjanyakch --- .../com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt b/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt index 77cab2606a..321a6ef5bd 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt @@ -172,7 +172,7 @@ class SetStatusDialogFragment : backupStatus = statusOverall.ocs?.data!! isBackupStatusAvailable = true val backupPredefinedStatus = PredefinedStatus( - backupStatus?.userId!!, + backupStatus.userId!!, backupStatus.icon, backupStatus.message!!, ClearAt(type = "period", time = backupStatus.clearAt.toString()) From 3f74a440d57e923eb95c7223f6d4aa9070d36934 Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Wed, 6 Nov 2024 21:35:33 +0100 Subject: [PATCH 15/21] add hint - your status was set automatically Signed-off-by: sowjanyakch --- .../talk/ui/dialog/SetStatusDialogFragment.kt | 2 ++ app/src/main/res/layout/dialog_set_status.xml | 10 ++++++++++ app/src/main/res/values/strings.xml | 1 + 3 files changed, 13 insertions(+) diff --git a/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt b/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt index 321a6ef5bd..4e9e05b90f 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt @@ -177,6 +177,7 @@ class SetStatusDialogFragment : backupStatus.message!!, ClearAt(type = "period", time = backupStatus.clearAt.toString()) ) + binding.automaticStatus.visibility = View.VISIBLE adapter.isBackupStatusAvailable = true predefinedStatusesList.add(0, backupPredefinedStatus) adapter.notifyDataSetChanged() @@ -305,6 +306,7 @@ class SetStatusDialogFragment : R.string.status_reverted, Snackbar.LENGTH_LONG ).show() + binding.automaticStatus.visibility = View.GONE adapter.isBackupStatusAvailable = false predefinedStatusesList.removeAt(0) adapter.notifyDataSetChanged() diff --git a/app/src/main/res/layout/dialog_set_status.xml b/app/src/main/res/layout/dialog_set_status.xml index 5fdcb4ff59..fc03b9ed59 100644 --- a/app/src/main/res/layout/dialog_set_status.xml +++ b/app/src/main/res/layout/dialog_set_status.xml @@ -386,6 +386,16 @@ + + + Previously set Failed to set conversation Read-only Status Reverted + Your status was set automatically From fbecfaf95d24605a9ee9fba56f5e4b7d3d53fbfa Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Thu, 7 Nov 2024 16:02:22 +0100 Subject: [PATCH 16/21] reset status and hide the dialog Signed-off-by: sowjanyakch --- .../java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt b/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt index 4e9e05b90f..93c690030b 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt @@ -312,6 +312,7 @@ class SetStatusDialogFragment : adapter.notifyDataSetChanged() currentStatus = backupStatus setupCurrentStatus() + dismiss() } } override fun onError(e: Throwable) { From 05ca7f52a584a473fac091c8833f7eddd34caefc Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Thu, 7 Nov 2024 16:55:23 +0100 Subject: [PATCH 17/21] remove Snackbar Signed-off-by: sowjanyakch --- .../com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt | 6 ------ app/src/main/res/layout/predefined_status.xml | 4 ++-- app/src/main/res/values/colors.xml | 1 + 3 files changed, 3 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt b/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt index 93c690030b..ec9dec32ea 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt @@ -28,7 +28,6 @@ import autodagger.AutoInjector import com.bluelinelabs.logansquare.LoganSquare import com.google.android.material.card.MaterialCardView import com.google.android.material.dialog.MaterialAlertDialogBuilder -import com.google.android.material.snackbar.Snackbar import com.nextcloud.android.common.ui.theme.utils.ColorRole import com.nextcloud.talk.R import com.nextcloud.talk.adapters.PredefinedStatusClickListener @@ -301,11 +300,6 @@ class SetStatusDialogFragment : override fun onNext(genericOverall: GenericOverall) { Log.d(TAG, "$genericOverall") if (genericOverall.ocs?.meta?.statusCode == 200) { - Snackbar.make( - binding.root, - R.string.status_reverted, - Snackbar.LENGTH_LONG - ).show() binding.automaticStatus.visibility = View.GONE adapter.isBackupStatusAvailable = false predefinedStatusesList.removeAt(0) diff --git a/app/src/main/res/layout/predefined_status.xml b/app/src/main/res/layout/predefined_status.xml index 63a8ad22b1..3cf01dad70 100644 --- a/app/src/main/res/layout/predefined_status.xml +++ b/app/src/main/res/layout/predefined_status.xml @@ -55,8 +55,8 @@ android:minWidth="48dp" android:minHeight="48dp" android:layout_gravity="center" - android:backgroundTint="@android:color/darker_gray" - android:textColor="@android:color/holo_red_light" + android:backgroundTint="@color/secondary_button_background" + android:textColor="@android:color/black" android:text= "@string/reset_status" android:textSize="14sp" android:padding="8dp" diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 2ab51b10c8..a49e2de29f 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -91,5 +91,6 @@ #99000000 #EF3B02 + #DBE2E9 From dba30346dc0a70f390c9aab304d91fcd43750866 Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Fri, 8 Nov 2024 20:04:41 +0100 Subject: [PATCH 18/21] use const val HTTP_STATUS_CODE_OK Signed-off-by: sowjanyakch --- .../com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt b/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt index ec9dec32ea..55c3b47a39 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt @@ -167,7 +167,7 @@ class SetStatusDialogFragment : @SuppressLint("NotifyDataSetChanged") override fun onNext(statusOverall: StatusOverall) { - if (statusOverall.ocs?.meta?.statusCode == 200) { + if (statusOverall.ocs?.meta?.statusCode == HTTP_STATUS_CODE_OK) { backupStatus = statusOverall.ocs?.data!! isBackupStatusAvailable = true val backupPredefinedStatus = PredefinedStatus( @@ -299,7 +299,7 @@ class SetStatusDialogFragment : @SuppressLint("NotifyDataSetChanged") override fun onNext(genericOverall: GenericOverall) { Log.d(TAG, "$genericOverall") - if (genericOverall.ocs?.meta?.statusCode == 200) { + if (genericOverall.ocs?.meta?.statusCode == HTTP_STATUS_CODE_OK) { binding.automaticStatus.visibility = View.GONE adapter.isBackupStatusAvailable = false predefinedStatusesList.removeAt(0) @@ -624,6 +624,7 @@ class SetStatusDialogFragment : */ companion object { private val TAG = SetStatusDialogFragment::class.simpleName + private const val HTTP_STATUS_CODE_OK = 200 @JvmStatic fun newInstance(status: Status): SetStatusDialogFragment { From 2c6daedb2b3e427521a7ace5a907a07caec511b5 Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Mon, 11 Nov 2024 15:23:01 +0100 Subject: [PATCH 19/21] handle disposable properly Signed-off-by: sowjanyakch --- .../talk/ui/dialog/SetStatusDialogFragment.kt | 38 ++++++++++++++++--- 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt b/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt index 55c3b47a39..9615c4334b 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt @@ -92,6 +92,8 @@ class SetStatusDialogFragment : val predefinedStatusesList = ArrayList() + private val disposables: MutableList = ArrayList() + private lateinit var adapter: PredefinedStatusListAdapter private var clearAt: Long? = null private lateinit var popup: EmojiPopup @@ -130,7 +132,9 @@ class SetStatusDialogFragment : .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(object : Observer { - override fun onSubscribe(d: Disposable) {} + override fun onSubscribe(d: Disposable) { + disposables.add(d) + } @SuppressLint("NotifyDataSetChanged") override fun onNext(responseBody: ResponseBody) { @@ -152,7 +156,9 @@ class SetStatusDialogFragment : Log.e(TAG, "Error while fetching predefined statuses", e) } - override fun onComplete() {} + override fun onComplete() { + // unused atm + } }) } @@ -163,6 +169,7 @@ class SetStatusDialogFragment : .subscribe(object : Observer { override fun onSubscribe(d: Disposable) { + disposables.add(d) } @SuppressLint("NotifyDataSetChanged") @@ -188,6 +195,7 @@ class SetStatusDialogFragment : } override fun onComplete() { + // unused atm } }) } @@ -294,6 +302,7 @@ class SetStatusDialogFragment : .subscribe(object : Observer { override fun onSubscribe(d: Disposable) { + disposables.add(d) } @SuppressLint("NotifyDataSetChanged") @@ -314,6 +323,7 @@ class SetStatusDialogFragment : } override fun onComplete() { + // unused atm } }) } @@ -432,7 +442,7 @@ class SetStatusDialogFragment : .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()).subscribe(object : Observer { override fun onSubscribe(d: Disposable) { - // unused atm + disposables.add(d) } override fun onNext(statusOverall: GenericOverall) { @@ -459,7 +469,7 @@ class SetStatusDialogFragment : ) .observeOn(AndroidSchedulers.mainThread()).subscribe(object : Observer { override fun onSubscribe(d: Disposable) { - // unused atm + disposables.add(d) } override fun onNext(statusOverall: GenericOverall) { @@ -562,7 +572,9 @@ class SetStatusDialogFragment : ) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread())?.subscribe(object : Observer { - override fun onSubscribe(d: Disposable) = Unit + override fun onSubscribe(d: Disposable) { + disposables.add(d) + } override fun onNext(t: GenericOverall) { Log.d(TAG, "PredefinedStatusMessage successfully set") @@ -573,7 +585,8 @@ class SetStatusDialogFragment : Log.e(TAG, "failed to set PredefinedStatusMessage", e) } - override fun onComplete() = Unit + override fun onComplete() { + } }) } } @@ -619,6 +632,19 @@ class SetStatusDialogFragment : } } + private fun dispose() { + for (i in disposables.indices) { + if (!disposables[i].isDisposed) { + disposables[i].dispose() + } + } + } + + override fun onDestroy() { + dispose() + super.onDestroy() + } + /** * Fragment creator */ From 92caa215b031a342d0ae630a955da24881382c0e Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Mon, 11 Nov 2024 15:46:05 +0100 Subject: [PATCH 20/21] error handling Signed-off-by: sowjanyakch --- .../talk/ui/dialog/SetStatusDialogFragment.kt | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt b/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt index 9615c4334b..ddcdd534fb 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt @@ -56,6 +56,7 @@ import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.Disposable import io.reactivex.schedulers.Schedulers import okhttp3.ResponseBody +import retrofit2.HttpException import java.util.Calendar import java.util.Locale import javax.inject.Inject @@ -191,7 +192,11 @@ class SetStatusDialogFragment : } override fun onError(e: Throwable) { - Log.e(TAG, "Error while fetching predefined statuses", e) + if (e is HttpException && e.code() == HTTP_STATUS_CODE_NOT_FOUND) { + Log.d(TAG, "User does not have a backup status set") + } else { + Log.e(TAG, "Error while getting user backup status", e) + } } override fun onComplete() { @@ -319,7 +324,7 @@ class SetStatusDialogFragment : } } override fun onError(e: Throwable) { - Log.e(TAG, "Error while fetching predefined statuses", e) + Log.e(TAG, "Failed to revert user status", e) } override fun onComplete() { @@ -585,7 +590,8 @@ class SetStatusDialogFragment : Log.e(TAG, "failed to set PredefinedStatusMessage", e) } - override fun onComplete() { + override fun onComplete() { + //unused atm } }) } @@ -651,6 +657,7 @@ class SetStatusDialogFragment : companion object { private val TAG = SetStatusDialogFragment::class.simpleName private const val HTTP_STATUS_CODE_OK = 200 + private const val HTTP_STATUS_CODE_NOT_FOUND = 404 @JvmStatic fun newInstance(status: Status): SetStatusDialogFragment { From b558a71ede7328a150f9235784134a4b8e0860b3 Mon Sep 17 00:00:00 2001 From: sowjanyakch Date: Mon, 11 Nov 2024 15:51:00 +0100 Subject: [PATCH 21/21] ktlintFormat Signed-off-by: sowjanyakch --- .../com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt b/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt index ddcdd534fb..567c16af3c 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/dialog/SetStatusDialogFragment.kt @@ -591,7 +591,7 @@ class SetStatusDialogFragment : } override fun onComplete() { - //unused atm + // unused atm } }) }