From 57a408ac9738f2138a1787e0902819a806ebb7f1 Mon Sep 17 00:00:00 2001 From: Marcel Hibbe Date: Wed, 2 Feb 2022 19:46:07 +0100 Subject: [PATCH] add predefined statuses Signed-off-by: Marcel Hibbe --- .../adapters/PredefinedStatusClickListener.kt | 2 +- .../adapters/PredefinedStatusListAdapter.kt | 2 +- .../adapters/PredefinedStatusViewHolder.kt | 2 +- .../java/com/nextcloud/talk/api/NcApi.java | 3 + .../talk/models/json/status/ClearAt.kt | 16 +++- .../models/json/status/PredefinedStatus.kt | 3 - .../status/predefined/PredefinedStatus.kt | 53 +++++++++++++ .../predefined/PredefinedStatusOCS.java | 74 +++++++++++++++++++ .../predefined/PredefinedStatusOverall.java | 65 ++++++++++++++++ .../dialog/ChooseAccountDialogFragment.java | 2 - .../talk/ui/dialog/SetStatusDialogFragment.kt | 50 +++++++++---- .../com/nextcloud/talk/utils/ApiUtils.java | 6 ++ 12 files changed, 256 insertions(+), 22 deletions(-) delete mode 100644 app/src/main/java/com/nextcloud/talk/models/json/status/PredefinedStatus.kt create mode 100644 app/src/main/java/com/nextcloud/talk/models/json/status/predefined/PredefinedStatus.kt create mode 100644 app/src/main/java/com/nextcloud/talk/models/json/status/predefined/PredefinedStatusOCS.java create mode 100644 app/src/main/java/com/nextcloud/talk/models/json/status/predefined/PredefinedStatusOverall.java 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 fa2485dcd..cb07e5943 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/PredefinedStatusClickListener.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/PredefinedStatusClickListener.kt @@ -22,7 +22,7 @@ package com.nextcloud.talk.adapters -import com.nextcloud.talk.models.json.status.PredefinedStatus +import com.nextcloud.talk.models.json.status.predefined.PredefinedStatus interface PredefinedStatusClickListener { fun onClick(predefinedStatus: PredefinedStatus) 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 253304af6..59a8c50c0 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/PredefinedStatusListAdapter.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/PredefinedStatusListAdapter.kt @@ -27,7 +27,7 @@ import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import com.nextcloud.talk.databinding.PredefinedStatusBinding -import com.nextcloud.talk.models.json.status.PredefinedStatus +import com.nextcloud.talk.models.json.status.predefined.PredefinedStatus class PredefinedStatusListAdapter( private val clickListener: PredefinedStatusClickListener, 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 2671896c5..c8e094bf4 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/PredefinedStatusViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/PredefinedStatusViewHolder.kt @@ -26,7 +26,7 @@ import android.content.Context import androidx.recyclerview.widget.RecyclerView import com.nextcloud.talk.R import com.nextcloud.talk.databinding.PredefinedStatusBinding -import com.nextcloud.talk.models.json.status.PredefinedStatus +import com.nextcloud.talk.models.json.status.predefined.PredefinedStatus import com.nextcloud.talk.utils.DisplayUtils private const val ONE_SECOND_IN_MILLIS = 1000 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 e693731f3..f247fe9ac 100644 --- a/app/src/main/java/com/nextcloud/talk/api/NcApi.java +++ b/app/src/main/java/com/nextcloud/talk/api/NcApi.java @@ -451,6 +451,9 @@ public interface NcApi { @GET Observable status(@Header("Authorization") String authorization, @Url String url); + @GET + Observable getPredefinedStatuses(@Header("Authorization") String authorization, @Url String url); + @DELETE Observable statusDeleteMessage(@Header("Authorization") String authorization, @Url String url); diff --git a/app/src/main/java/com/nextcloud/talk/models/json/status/ClearAt.kt b/app/src/main/java/com/nextcloud/talk/models/json/status/ClearAt.kt index aa6107447..b5a4fbe13 100644 --- a/app/src/main/java/com/nextcloud/talk/models/json/status/ClearAt.kt +++ b/app/src/main/java/com/nextcloud/talk/models/json/status/ClearAt.kt @@ -1,4 +1,18 @@ package com.nextcloud.talk.models.json.status +import android.os.Parcelable +import com.bluelinelabs.logansquare.annotation.JsonField +import com.bluelinelabs.logansquare.annotation.JsonObject +import kotlinx.android.parcel.Parcelize -class ClearAt(val type: String, val time: String) \ No newline at end of file +@Parcelize +@JsonObject +data class ClearAt( + @JsonField(name = ["type"]) + var type: String, + @JsonField(name = ["time"]) + var time: String + ) : Parcelable{ + // This constructor is added to work with the 'com.bluelinelabs.logansquare.annotation.JsonObject' + constructor() : this("type", "time") +} diff --git a/app/src/main/java/com/nextcloud/talk/models/json/status/PredefinedStatus.kt b/app/src/main/java/com/nextcloud/talk/models/json/status/PredefinedStatus.kt deleted file mode 100644 index 0f689df2f..000000000 --- a/app/src/main/java/com/nextcloud/talk/models/json/status/PredefinedStatus.kt +++ /dev/null @@ -1,3 +0,0 @@ -package com.nextcloud.talk.models.json.status - -class PredefinedStatus(val id: String, val icon: String, val message: String, val clearAt: ClearAt?) \ No newline at end of file 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 new file mode 100644 index 000000000..6cbf4597d --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/models/json/status/predefined/PredefinedStatus.kt @@ -0,0 +1,53 @@ +package com.nextcloud.talk.models.json.status.predefined + +import android.os.Parcelable +import com.bluelinelabs.logansquare.annotation.JsonField +import com.bluelinelabs.logansquare.annotation.JsonObject +import com.nextcloud.talk.models.json.status.ClearAt +import kotlinx.android.parcel.Parcelize + +@Parcelize +@JsonObject +data class PredefinedStatus( + @JsonField(name = ["id"]) + var id: String, + @JsonField(name = ["icon"]) + var icon: String, + @JsonField(name = ["message"]) + var message: String, + @JsonField(name = ["clearAt"]) + var clearAt: ClearAt? + ) : Parcelable { + // This constructor is added to work with the 'com.bluelinelabs.logansquare.annotation.JsonObject' + constructor() : this("id", "icon", "message", null) +} + + + + + +// @Parcelize +// @JsonObject +// data class Status( +// @JsonField(name = ["userId"]) +// var userId: String?, +// @JsonField(name = ["message"]) +// var message: String?, +// /* TODO: Change to enum */ +// @JsonField(name = ["messageId"]) +// var messageId: String?, +// @JsonField(name = ["messageIsPredefined"]) +// var messageIsPredefined: Boolean, +// @JsonField(name = ["icon"]) +// var icon: String?, +// @JsonField(name = ["clearAt"]) +// var clearAt: Long = 0, +// /* TODO: Change to enum */ +// @JsonField(name = ["status"]) +// var status: String = "offline", +// @JsonField(name = ["statusIsUserDefined"]) +// var statusIsUserDefined: Boolean +// ) : Parcelable { +// // This constructor is added to work with the 'com.bluelinelabs.logansquare.annotation.JsonObject' +// constructor() : this(null, null, null, false, null, 0, "offline", false) +// } \ No newline at end of file diff --git a/app/src/main/java/com/nextcloud/talk/models/json/status/predefined/PredefinedStatusOCS.java b/app/src/main/java/com/nextcloud/talk/models/json/status/predefined/PredefinedStatusOCS.java new file mode 100644 index 000000000..e3447b013 --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/models/json/status/predefined/PredefinedStatusOCS.java @@ -0,0 +1,74 @@ +/* + * + * Nextcloud Talk application + * + * @author Tim Krüger + * Copyright (C) 2021 Tim Krüger + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.nextcloud.talk.models.json.status.predefined; + +import com.bluelinelabs.logansquare.annotation.JsonField; +import com.bluelinelabs.logansquare.annotation.JsonObject; +import com.nextcloud.talk.models.json.autocomplete.AutocompleteUser; +import com.nextcloud.talk.models.json.generic.GenericOCS; +import com.nextcloud.talk.models.json.status.Status; + +import java.util.List; +import java.util.Objects; + +import kotlin.jvm.JvmSuppressWildcards; + +@JsonObject +public class PredefinedStatusOCS extends GenericOCS { + @JsonField(name = "data") + List data; + + public List getData() { + return this.data; + } + + public void setData(List data) { + this.data = data; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + if (!super.equals(o)) { + return false; + } + PredefinedStatusOCS that = (PredefinedStatusOCS) o; + return Objects.equals(data, that.data); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), data); + } + + @Override + public String toString() { + return "PredefinedStatusOCS{" + + "data=" + data + + '}'; + } + +} diff --git a/app/src/main/java/com/nextcloud/talk/models/json/status/predefined/PredefinedStatusOverall.java b/app/src/main/java/com/nextcloud/talk/models/json/status/predefined/PredefinedStatusOverall.java new file mode 100644 index 000000000..a9ccf8089 --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/models/json/status/predefined/PredefinedStatusOverall.java @@ -0,0 +1,65 @@ +/* + * + * Nextcloud Talk application + * + * @author Tim Krüger + * Copyright (C) 2021 Tim Krüger + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.nextcloud.talk.models.json.status.predefined; + +import com.bluelinelabs.logansquare.annotation.JsonField; +import com.bluelinelabs.logansquare.annotation.JsonObject; +import com.nextcloud.talk.models.json.status.StatusOCS; + +import java.util.Objects; + +@JsonObject +public class PredefinedStatusOverall { + @JsonField(name = "ocs") + public PredefinedStatusOCS ocs; + + public PredefinedStatusOCS getOcs() { + return this.ocs; + } + + public void setOcs(PredefinedStatusOCS ocs) { + this.ocs = ocs; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + PredefinedStatusOverall that = (PredefinedStatusOverall) o; + return Objects.equals(ocs, that.ocs); + } + + @Override + public int hashCode() { + return Objects.hash(ocs); + } + + @Override + public String toString() { + return "PredefinedStatusOverall{" + + "ocs=" + ocs + + '}'; + } +} diff --git a/app/src/main/java/com/nextcloud/talk/ui/dialog/ChooseAccountDialogFragment.java b/app/src/main/java/com/nextcloud/talk/ui/dialog/ChooseAccountDialogFragment.java index bdca62698..793bc029c 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/dialog/ChooseAccountDialogFragment.java +++ b/app/src/main/java/com/nextcloud/talk/ui/dialog/ChooseAccountDialogFragment.java @@ -56,7 +56,6 @@ import com.nextcloud.talk.utils.database.user.UserUtils; import java.net.CookieManager; import java.util.ArrayList; import java.util.List; -import java.util.Objects; import javax.inject.Inject; @@ -66,7 +65,6 @@ import androidx.recyclerview.widget.LinearLayoutManager; import autodagger.AutoInjector; import eu.davidea.flexibleadapter.FlexibleAdapter; import eu.davidea.flexibleadapter.common.SmoothScrollLinearLayoutManager; -import io.reactivex.Observable; import io.reactivex.Observer; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.Disposable; 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 94ee5aaf0..aacfea605 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 @@ -36,6 +36,7 @@ import androidx.appcompat.app.AlertDialog import androidx.fragment.app.DialogFragment import androidx.recyclerview.widget.LinearLayoutManager import autodagger.AutoInjector +import com.bluelinelabs.logansquare.LoganSquare import com.nextcloud.talk.R import com.nextcloud.talk.adapters.PredefinedStatusClickListener import com.nextcloud.talk.adapters.PredefinedStatusListAdapter @@ -45,9 +46,10 @@ import com.nextcloud.talk.databinding.DialogSetStatusBinding import com.nextcloud.talk.models.database.User import com.nextcloud.talk.models.json.generic.GenericOverall import com.nextcloud.talk.models.json.status.ClearAt -import com.nextcloud.talk.models.json.status.PredefinedStatus import com.nextcloud.talk.models.json.status.Status 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 import com.nextcloud.talk.utils.ApiUtils import com.nextcloud.talk.utils.DisplayUtils import com.vanniktech.emoji.EmojiPopup @@ -55,6 +57,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 java.util.Calendar import java.util.Locale import javax.inject.Inject @@ -88,13 +91,16 @@ class SetStatusDialogFragment : private var currentUser: User? = null private var currentStatus: Status? = null + // private lateinit var accountManager: UserAccountManager - private lateinit var predefinedStatus: ArrayList + // private lateinit var predefinedStatus: ArrayList + val predefinedStatusesList = ArrayList() + private lateinit var adapter: PredefinedStatusListAdapter private var selectedPredefinedMessageId: String? = null private var clearAt: Long? = -1 private lateinit var popup: EmojiPopup - // + // @Inject // lateinit var arbitraryDataProvider: ArbitraryDataProvider // @@ -109,20 +115,37 @@ class SetStatusDialogFragment : override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + + NextcloudTalkApplication.sharedApplication!!.componentApplication.inject(this) + arguments?.let { currentUser = it.getParcelable(ARG_CURRENT_USER_PARAM) currentStatus = it.getParcelable(ARG_CURRENT_STATUS_PARAM) - // val json = arbitraryDataProvider.getValue(currentUser, ArbitraryDataProvider.PREDEFINED_STATUS) + val credentials = ApiUtils.getCredentials(currentUser?.username, currentUser?.token) + ncApi.getPredefinedStatuses(credentials, ApiUtils.getUrlForPredefinedStatuses(currentUser?.baseUrl)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(object : Observer { - // if (json.isNotEmpty()) { - // val myType = object : TypeToken>() {}.type - // predefinedStatus = Gson().fromJson(json, myType) - // } + override fun onSubscribe(d: Disposable) { + } + + override fun onNext(responseBody: ResponseBody) { + val predefinedStatusOverall : PredefinedStatusOverall = LoganSquare.parse(responseBody + .string(), + PredefinedStatusOverall::class.java) + predefinedStatusesList.addAll(predefinedStatusOverall.getOcs().data) + } + + override fun onError(e: Throwable) { + } + + override fun onComplete() {} + + }) } - - // EmojiManager.install(GoogleEmojiProvider()) } @@ -166,9 +189,10 @@ class SetStatusDialogFragment : } adapter = PredefinedStatusListAdapter(this, requireContext()) - if (this::predefinedStatus.isInitialized) { - adapter.list = predefinedStatus - } + + adapter.list = predefinedStatusesList + + binding.predefinedStatusList.adapter = adapter binding.predefinedStatusList.layoutManager = LinearLayoutManager(context) 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 227f25425..8bea73596 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.java +++ b/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.java @@ -425,7 +425,13 @@ public class ApiUtils { return baseUrl + ocsApiVersion + "/apps/user_status/api/v1/user_status"; } + public static String getUrlForPredefinedStatuses(String baseUrl) { + return baseUrl + ocsApiVersion + "/apps/user_status/api/v1/predefined_statuses"; + } + public static String getUrlForStatusMessage(String baseUrl) { return getUrlForStatus(baseUrl) + "/message"; } + + }