diff --git a/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.java b/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.java index f63b1f3cf..bf171f4d2 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.java +++ b/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.java @@ -46,6 +46,8 @@ import com.nextcloud.talk.models.database.CapabilitiesUtil; import com.nextcloud.talk.models.database.UserEntity; import com.nextcloud.talk.models.json.chat.ChatMessage; import com.nextcloud.talk.models.json.conversations.Conversation; +import com.nextcloud.talk.models.json.status.Status; +import com.nextcloud.talk.models.json.status.StatusType; import com.nextcloud.talk.utils.ApiUtils; import com.nextcloud.talk.utils.DisplayUtils; @@ -66,26 +68,29 @@ import eu.davidea.flexibleadapter.utils.FlexibleUtils; import eu.davidea.viewholders.FlexibleViewHolder; public class ConversationItem extends AbstractFlexibleItem implements ISectionable, - IFilterable { + IFilterable { private Conversation conversation; private UserEntity userEntity; private Context context; private GenericTextHeaderItem header; + private Status status; - public ConversationItem(Conversation conversation, UserEntity userEntity, Context activityContext) { + public ConversationItem(Conversation conversation, UserEntity userEntity, Context activityContext, Status status) { this.conversation = conversation; this.userEntity = userEntity; this.context = activityContext; + this.status = status; } public ConversationItem(Conversation conversation, UserEntity userEntity, - Context activityContext, GenericTextHeaderItem genericTextHeaderItem) { + Context activityContext, GenericTextHeaderItem genericTextHeaderItem, Status status) { this.conversation = conversation; this.userEntity = userEntity; this.context = activityContext; this.header = genericTextHeaderItem; + this.status = status; } @Override @@ -120,7 +125,7 @@ public class ConversationItem extends AbstractFlexibleItem adapter, ConversationItemViewHolder holder, int position, List payloads) { Context appContext = - NextcloudTalkApplication.Companion.getSharedApplication().getApplicationContext(); + NextcloudTalkApplication.Companion.getSharedApplication().getApplicationContext(); holder.dialogAvatar.setController(null); holder.dialogName.setTextColor(ResourcesCompat.getColor(context.getResources(), @@ -129,8 +134,8 @@ public class ConversationItem extends AbstractFlexibleItem setStatusType(@Header("Authorization") String authorization, @Url String url, @Field("statusType") String statusType); + + @GET + Observable getUserStatuses(@Header("Authorization") String authorization, @Url String url); + } diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java b/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java index 19a1808cf..c45430bed 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java @@ -81,6 +81,8 @@ import com.nextcloud.talk.jobs.UploadAndShareFilesWorker; import com.nextcloud.talk.models.database.CapabilitiesUtil; import com.nextcloud.talk.models.database.UserEntity; import com.nextcloud.talk.models.json.conversations.Conversation; +import com.nextcloud.talk.models.json.status.Status; +import com.nextcloud.talk.models.json.statuses.StatusesOverall; import com.nextcloud.talk.ui.dialog.ChooseAccountDialogFragment; import com.nextcloud.talk.ui.dialog.ConversationsListBottomDialog; import com.nextcloud.talk.utils.ApiUtils; @@ -128,6 +130,7 @@ import butterknife.BindView; import eu.davidea.flexibleadapter.FlexibleAdapter; import eu.davidea.flexibleadapter.common.SmoothScrollLinearLayoutManager; import eu.davidea.flexibleadapter.items.AbstractFlexibleItem; +import io.reactivex.Observer; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.Disposable; import io.reactivex.schedulers.Schedulers; @@ -214,6 +217,8 @@ public class ConversationsListController extends BaseController implements Searc private ConversationsListBottomDialog conversationsListBottomDialog; + private HashMap userStatuses = new HashMap<>(); + public ConversationsListController(Bundle bundle) { super(); setHasOptionsMenu(true); @@ -467,6 +472,37 @@ public class ConversationsListController extends BaseController implements Searc @SuppressLint("LongLogTag") public void fetchData() { + fetchUserStatuses(); + } + + private void fetchUserStatuses() { + ncApi.getUserStatuses(credentials, ApiUtils.getUrlForUserStatuses(currentUser.getBaseUrl())) + .subscribe(new Observer() { + @Override + public void onSubscribe(@io.reactivex.annotations.NonNull Disposable d) { + } + + @Override + public void onNext(@NonNull StatusesOverall statusesOverall) { + for (Status status : statusesOverall.getOcs().getData()) { + userStatuses.put(status.getUserId(), status); + } + fetchRooms(); + } + + @Override + public void onError(@io.reactivex.annotations.NonNull Throwable e) { + Log.e(TAG, "failed to fetch user statuses", e); + } + + @Override + public void onComplete() { + } + }); + + } + + private void fetchRooms() { dispose(null); isRefreshing = true; @@ -525,14 +561,16 @@ public class ConversationsListController extends BaseController implements Searc ConversationItem conversationItem = new ConversationItem( conversation, currentUser, - getActivity()); + getActivity(), + userStatuses.get(conversation.name)); conversationItems.add(conversationItem); ConversationItem conversationItemWithHeader = new ConversationItem( conversation, currentUser, getActivity(), - callHeaderItems.get(headerTitle)); + callHeaderItems.get(headerTitle), + userStatuses.get(conversation.name)); conversationItemsWithHeader.add(conversationItemWithHeader); } } @@ -604,7 +642,8 @@ public class ConversationsListController extends BaseController implements Searc conversation, currentUser, getActivity(), - callHeaderItems.get(headerTitle)); + callHeaderItems.get(headerTitle), + userStatuses.get(conversation.name)); openConversationItems.add(conversationItem); } diff --git a/app/src/main/java/com/nextcloud/talk/models/json/statuses/StatusesOCS.java b/app/src/main/java/com/nextcloud/talk/models/json/statuses/StatusesOCS.java new file mode 100644 index 000000000..31ad65e56 --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/models/json/statuses/StatusesOCS.java @@ -0,0 +1,71 @@ +/* + * + * 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.statuses; + +import com.bluelinelabs.logansquare.annotation.JsonField; +import com.bluelinelabs.logansquare.annotation.JsonObject; +import com.nextcloud.talk.models.json.generic.GenericOCS; +import com.nextcloud.talk.models.json.status.Status; + +import java.util.List; +import java.util.Objects; + +@JsonObject +public class StatusesOCS extends GenericOCS { + @JsonField(name = "data") + public 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; + } + StatusesOCS that = (StatusesOCS) o; + return Objects.equals(data, that.data); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), data); + } + + @Override + public String toString() { + return "StatusesOCS{" + + "data=" + data + + '}'; + } + +} diff --git a/app/src/main/java/com/nextcloud/talk/models/json/statuses/StatusesOverall.java b/app/src/main/java/com/nextcloud/talk/models/json/statuses/StatusesOverall.java new file mode 100644 index 000000000..b3a547ecb --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/models/json/statuses/StatusesOverall.java @@ -0,0 +1,64 @@ +/* + * + * 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.statuses; + +import com.bluelinelabs.logansquare.annotation.JsonField; +import com.bluelinelabs.logansquare.annotation.JsonObject; + +import java.util.Objects; + +@JsonObject +public class StatusesOverall { + @JsonField(name = "ocs") + public StatusesOCS ocs; + + public StatusesOCS getOcs() { + return this.ocs; + } + + public void setOcs(StatusesOCS ocs) { + this.ocs = ocs; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + StatusesOverall that = (StatusesOverall) o; + return Objects.equals(ocs, that.ocs); + } + + @Override + public int hashCode() { + return Objects.hash(ocs); + } + + @Override + public String toString() { + return "StatusesOverall{" + + "ocs=" + ocs + + '}'; + } +} 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 713a52e5d..89ed1f667 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.java +++ b/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.java @@ -440,4 +440,8 @@ public class ApiUtils { public static String getUrlForSetCustomStatus(String baseUrl) { return baseUrl + ocsApiVersion + "/apps/user_status/api/v1/user_status/message/custom"; } + + public static String getUrlForUserStatuses(String baseUrl) { + return baseUrl + ocsApiVersion + "/apps/user_status/api/v1/statuses"; + } } diff --git a/app/src/main/res/drawable/ic_user_status_away_with_border.xml b/app/src/main/res/drawable/ic_user_status_away_with_border.xml new file mode 100644 index 000000000..6de7c7bf7 --- /dev/null +++ b/app/src/main/res/drawable/ic_user_status_away_with_border.xml @@ -0,0 +1,43 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_user_status_dnd_with_border.xml b/app/src/main/res/drawable/ic_user_status_dnd_with_border.xml new file mode 100644 index 000000000..69f952f05 --- /dev/null +++ b/app/src/main/res/drawable/ic_user_status_dnd_with_border.xml @@ -0,0 +1,41 @@ + + + + + + diff --git a/app/src/main/res/drawable/online_status_with_border.xml b/app/src/main/res/drawable/online_status_with_border.xml new file mode 100644 index 000000000..2b6fc8dcb --- /dev/null +++ b/app/src/main/res/drawable/online_status_with_border.xml @@ -0,0 +1,26 @@ + + + + + + diff --git a/app/src/main/res/layout/rv_item_conversation_with_last_message.xml b/app/src/main/res/layout/rv_item_conversation_with_last_message.xml index 21d47f39b..7a3c05001 100644 --- a/app/src/main/res/layout/rv_item_conversation_with_last_message.xml +++ b/app/src/main/res/layout/rv_item_conversation_with_last_message.xml @@ -56,6 +56,24 @@ app:tint="@color/favorite_icon_tint" app:tintMode="src_in" /> + + + Account not found Favorite + Status Encrypted Password protected