From eb832fb26a3409a19384c5056479e151e0ff0afc Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Sun, 16 Feb 2020 11:33:12 +0100 Subject: [PATCH] Fix conversations list Signed-off-by: Mario Danic --- .../nextcloud/talk/activities/BaseActivity.kt | 2 - .../models/properties/NCEncrypted.java | 10 +- .../models/properties/NCPreview.java | 10 +- .../models/properties/OCFavorite.java | 10 +- .../filebrowser/models/properties/OCId.java | 10 +- .../filebrowser/models/properties/OCSize.java | 10 +- .../talk/jobs/MessageNotificationWorker.kt | 4 +- .../talk/models/json/chat/ChatMessage.kt | 18 ++-- .../newarch/data/source/remote/ApiService.kt | 3 +- .../talk/newarch/di/module/NetworkModule.kt | 2 +- .../domain/di/module/UseCasesModule.kt | 4 +- .../ContactsFlowOperationState.kt | 1 + .../contactsflow/ParticipantElement.kt | 2 - .../contactsflow/contacts/ContactPresenter.kt | 6 ++ .../contactsflow/contacts/ContactsView.kt | 17 +++- .../contacts/ContactsViewFooterSource.kt | 1 - .../contacts/ContactsViewHeaderSource.kt | 42 ++++----- .../contacts/ContactsViewModel.kt | 8 +- .../contacts/ContactsViewSource.kt | 10 +- .../ConversationPresenter.kt | 1 + .../ConversationsListView.kt | 4 +- .../nextcloud/talk/newarch/utils/Images.kt | 6 +- .../nextcloud/talk/utils/NotificationUtils.kt | 6 +- .../res/drawable/ic_baseline_person_24.xml | 27 ++++++ .../drawable/ic_undraw_server_down_s4lk.xml | 93 +++++++++++++++++++ app/src/main/res/layout/message_state.xml | 2 +- app/src/main/res/layout/search_layout.xml | 2 +- app/src/main/res/values/strings.xml | 2 +- 28 files changed, 225 insertions(+), 88 deletions(-) create mode 100644 app/src/main/res/drawable/ic_baseline_person_24.xml create mode 100644 app/src/main/res/drawable/ic_undraw_server_down_s4lk.xml diff --git a/app/src/main/java/com/nextcloud/talk/activities/BaseActivity.kt b/app/src/main/java/com/nextcloud/talk/activities/BaseActivity.kt index a370b1994..01347075b 100644 --- a/app/src/main/java/com/nextcloud/talk/activities/BaseActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/activities/BaseActivity.kt @@ -23,12 +23,10 @@ package com.nextcloud.talk.activities import android.annotation.SuppressLint import android.content.Context import android.os.Build -import android.os.Bundle import android.util.Log import android.view.WindowManager import android.webkit.SslErrorHandler import androidx.appcompat.app.AppCompatActivity -import androidx.appcompat.app.AppCompatDelegate import com.nextcloud.talk.R import com.nextcloud.talk.events.CertificateEvent import com.nextcloud.talk.utils.SecurityUtils diff --git a/app/src/main/java/com/nextcloud/talk/components/filebrowser/models/properties/NCEncrypted.java b/app/src/main/java/com/nextcloud/talk/components/filebrowser/models/properties/NCEncrypted.java index b0a71d29e..03b05fd59 100644 --- a/app/src/main/java/com/nextcloud/talk/components/filebrowser/models/properties/NCEncrypted.java +++ b/app/src/main/java/com/nextcloud/talk/components/filebrowser/models/properties/NCEncrypted.java @@ -34,8 +34,6 @@ import java.io.IOException; import at.bitfire.dav4jvm.Property; import at.bitfire.dav4jvm.PropertyFactory; import at.bitfire.dav4jvm.XmlUtils; -import lombok.Getter; -import lombok.Setter; public class NCEncrypted implements Property { public static final Name NAME = @@ -43,14 +41,14 @@ public class NCEncrypted implements Property { private boolean ncEncrypted; - public boolean isNcEncrypted() { - return ncEncrypted; - } - private NCEncrypted(boolean isEncrypted) { ncEncrypted = isEncrypted; } + public boolean isNcEncrypted() { + return ncEncrypted; + } + public static class Factory implements PropertyFactory { @Nullable diff --git a/app/src/main/java/com/nextcloud/talk/components/filebrowser/models/properties/NCPreview.java b/app/src/main/java/com/nextcloud/talk/components/filebrowser/models/properties/NCPreview.java index 3849376b8..59f1d1a8a 100644 --- a/app/src/main/java/com/nextcloud/talk/components/filebrowser/models/properties/NCPreview.java +++ b/app/src/main/java/com/nextcloud/talk/components/filebrowser/models/properties/NCPreview.java @@ -34,8 +34,6 @@ import java.io.IOException; import at.bitfire.dav4jvm.Property; import at.bitfire.dav4jvm.PropertyFactory; import at.bitfire.dav4jvm.XmlUtils; -import lombok.Getter; -import lombok.Setter; public class NCPreview implements Property { public static final Property.Name NAME = @@ -43,14 +41,14 @@ public class NCPreview implements Property { private boolean ncPreview; - public boolean isNcPreview() { - return ncPreview; - } - private NCPreview(boolean hasPreview) { ncPreview = hasPreview; } + public boolean isNcPreview() { + return ncPreview; + } + public static class Factory implements PropertyFactory { @Nullable diff --git a/app/src/main/java/com/nextcloud/talk/components/filebrowser/models/properties/OCFavorite.java b/app/src/main/java/com/nextcloud/talk/components/filebrowser/models/properties/OCFavorite.java index 6cad99070..3750bca7a 100644 --- a/app/src/main/java/com/nextcloud/talk/components/filebrowser/models/properties/OCFavorite.java +++ b/app/src/main/java/com/nextcloud/talk/components/filebrowser/models/properties/OCFavorite.java @@ -34,8 +34,6 @@ import java.io.IOException; import at.bitfire.dav4jvm.Property; import at.bitfire.dav4jvm.PropertyFactory; import at.bitfire.dav4jvm.XmlUtils; -import lombok.Getter; -import lombok.Setter; public class OCFavorite implements Property { public static final Property.Name NAME = @@ -43,14 +41,14 @@ public class OCFavorite implements Property { private boolean ocFavorite; - public boolean isOcFavorite() { - return ocFavorite; - } - OCFavorite(boolean isFavorite) { ocFavorite = isFavorite; } + public boolean isOcFavorite() { + return ocFavorite; + } + public static class Factory implements PropertyFactory { @Nullable diff --git a/app/src/main/java/com/nextcloud/talk/components/filebrowser/models/properties/OCId.java b/app/src/main/java/com/nextcloud/talk/components/filebrowser/models/properties/OCId.java index 1db044a17..cfed4cabe 100644 --- a/app/src/main/java/com/nextcloud/talk/components/filebrowser/models/properties/OCId.java +++ b/app/src/main/java/com/nextcloud/talk/components/filebrowser/models/properties/OCId.java @@ -34,8 +34,6 @@ import java.io.IOException; import at.bitfire.dav4jvm.Property; import at.bitfire.dav4jvm.PropertyFactory; import at.bitfire.dav4jvm.XmlUtils; -import lombok.Getter; -import lombok.Setter; public class OCId implements Property { public static final Name NAME = @@ -43,14 +41,14 @@ public class OCId implements Property { private String ocId; - public String getOcId() { - return ocId; - } - private OCId(String id) { ocId = id; } + public String getOcId() { + return ocId; + } + public static class Factory implements PropertyFactory { @Nullable diff --git a/app/src/main/java/com/nextcloud/talk/components/filebrowser/models/properties/OCSize.java b/app/src/main/java/com/nextcloud/talk/components/filebrowser/models/properties/OCSize.java index 6d4b8ff34..8e57bf166 100644 --- a/app/src/main/java/com/nextcloud/talk/components/filebrowser/models/properties/OCSize.java +++ b/app/src/main/java/com/nextcloud/talk/components/filebrowser/models/properties/OCSize.java @@ -34,8 +34,6 @@ import java.io.IOException; import at.bitfire.dav4jvm.Property; import at.bitfire.dav4jvm.PropertyFactory; import at.bitfire.dav4jvm.XmlUtils; -import lombok.Getter; -import lombok.Setter; public class OCSize implements Property { public static final Property.Name NAME = @@ -43,14 +41,14 @@ public class OCSize implements Property { private long ocSize; - public long getOcSize() { - return ocSize; - } - private OCSize(long size) { ocSize = size; } + public long getOcSize() { + return ocSize; + } + public static class Factory implements PropertyFactory { @Nullable diff --git a/app/src/main/java/com/nextcloud/talk/jobs/MessageNotificationWorker.kt b/app/src/main/java/com/nextcloud/talk/jobs/MessageNotificationWorker.kt index 0d7178e89..77fceea9e 100644 --- a/app/src/main/java/com/nextcloud/talk/jobs/MessageNotificationWorker.kt +++ b/app/src/main/java/com/nextcloud/talk/jobs/MessageNotificationWorker.kt @@ -116,7 +116,8 @@ class MessageNotificationWorker( } } - val adjustedConversationType = conversationType ?: Conversation.ConversationType.ONE_TO_ONE_CONVERSATION + val adjustedConversationType = conversationType + ?: Conversation.ConversationType.ONE_TO_ONE_CONVERSATION val pendingIntent: PendingIntent? = PendingIntent.getActivity(applicationContext, 0, intent, 0) @@ -222,6 +223,7 @@ class MessageNotificationWorker( NotificationManagerCompat.from(applicationContext).notify(notificationId, notificationBuilder.build()) } } + private fun getStyle( decryptedPushMessage: DecryptedPushMessage, conversationType: Conversation.ConversationType, diff --git a/app/src/main/java/com/nextcloud/talk/models/json/chat/ChatMessage.kt b/app/src/main/java/com/nextcloud/talk/models/json/chat/ChatMessage.kt index fc1265af0..7bc679922 100644 --- a/app/src/main/java/com/nextcloud/talk/models/json/chat/ChatMessage.kt +++ b/app/src/main/java/com/nextcloud/talk/models/json/chat/ChatMessage.kt @@ -211,15 +211,15 @@ class ChatMessage : IMessage, MessageContentType, MessageContentType.Image { if (!TextUtils.isEmpty(actorDisplayName)) actorDisplayName else sharedApplication !!.getString(R.string.nc_guest)) } - /*} else if (messageType == MessageType.SINGLE_LINK_MESSAGE) { - return if (actorId.equals(activeUser!!.userId)) { - sharedApplication!!.resources.getString(R.string.nc_sent_a_link_you) - } else { - String.format(sharedApplication - !!.resources - .getString(R.string.nc_sent_a_link), - if (!TextUtils.isEmpty(actorDisplayName)) actorDisplayName else sharedApplication!!.getString(R.string.nc_guest)) - }*/ + /*} else if (messageType == MessageType.SINGLE_LINK_MESSAGE) { + return if (actorId.equals(activeUser!!.userId)) { + sharedApplication!!.resources.getString(R.string.nc_sent_a_link_you) + } else { + String.format(sharedApplication + !!.resources + .getString(R.string.nc_sent_a_link), + if (!TextUtils.isEmpty(actorDisplayName)) actorDisplayName else sharedApplication!!.getString(R.string.nc_guest)) + }*/ } else if (messageType == MessageType.SINGLE_LINK_AUDIO_MESSAGE) { return if (actorId.equals(activeUser!!.userId)) { sharedApplication!!.resources.getString(R.string.nc_sent_an_audio_you) diff --git a/app/src/main/java/com/nextcloud/talk/newarch/data/source/remote/ApiService.kt b/app/src/main/java/com/nextcloud/talk/newarch/data/source/remote/ApiService.kt index b7af3ed6e..65ac4470a 100644 --- a/app/src/main/java/com/nextcloud/talk/newarch/data/source/remote/ApiService.kt +++ b/app/src/main/java/com/nextcloud/talk/newarch/data/source/remote/ApiService.kt @@ -33,7 +33,6 @@ import com.nextcloud.talk.models.json.participants.ParticipantsOverall import com.nextcloud.talk.models.json.push.PushRegistrationOverall import com.nextcloud.talk.models.json.signaling.settings.SignalingSettingsOverall import com.nextcloud.talk.models.json.userprofile.UserProfileOverall -import io.reactivex.Observable import retrofit2.http.* interface ApiService { @@ -43,7 +42,7 @@ interface ApiService { @GET suspend fun getNotification(@Header("Authorization") authorization: String, - @Url url: String): NotificationOverall + @Url url: String): NotificationOverall @FormUrlEncoded @PUT diff --git a/app/src/main/java/com/nextcloud/talk/newarch/di/module/NetworkModule.kt b/app/src/main/java/com/nextcloud/talk/newarch/di/module/NetworkModule.kt index 1d05c5757..5a8457f47 100644 --- a/app/src/main/java/com/nextcloud/talk/newarch/di/module/NetworkModule.kt +++ b/app/src/main/java/com/nextcloud/talk/newarch/di/module/NetworkModule.kt @@ -88,7 +88,7 @@ val NetworkModule = module { single { createOkHttpClient(androidContext(), get(), get(), get(), get(), get(), get(), get()) } factory { createApiErrorHandler() } single { createNextcloudTalkRepository(get()) } - single { createNexcloudRepositoryWithNoCookies(get(), get())} + single { createNexcloudRepositoryWithNoCookies(get(), get()) } single { createImageLoader(androidApplication(), get()) } } diff --git a/app/src/main/java/com/nextcloud/talk/newarch/domain/di/module/UseCasesModule.kt b/app/src/main/java/com/nextcloud/talk/newarch/domain/di/module/UseCasesModule.kt index 06382e032..9f6fcf6a7 100644 --- a/app/src/main/java/com/nextcloud/talk/newarch/domain/di/module/UseCasesModule.kt +++ b/app/src/main/java/com/nextcloud/talk/newarch/domain/di/module/UseCasesModule.kt @@ -57,12 +57,12 @@ val UseCasesModule = module { } fun getNotificationUseCase(nextcloudTalkRepository: NextcloudTalkRepository, - apiErrorHandler: ApiErrorHandler): GetNotificationUseCase { + apiErrorHandler: ApiErrorHandler): GetNotificationUseCase { return GetNotificationUseCase(nextcloudTalkRepository, apiErrorHandler) } fun getPeersForCallUseCase(nextcloudTalkRepository: NextcloudTalkRepository, - apiErrorHandler: ApiErrorHandler): GetPeersForCallUseCase { + apiErrorHandler: ApiErrorHandler): GetPeersForCallUseCase { return GetPeersForCallUseCase(nextcloudTalkRepository, apiErrorHandler) } diff --git a/app/src/main/java/com/nextcloud/talk/newarch/features/contactsflow/ContactsFlowOperationState.kt b/app/src/main/java/com/nextcloud/talk/newarch/features/contactsflow/ContactsFlowOperationState.kt index 207692aa0..89b73bec6 100644 --- a/app/src/main/java/com/nextcloud/talk/newarch/features/contactsflow/ContactsFlowOperationState.kt +++ b/app/src/main/java/com/nextcloud/talk/newarch/features/contactsflow/ContactsFlowOperationState.kt @@ -28,6 +28,7 @@ enum class ContactsViewOperationState { WAITING, PROCESSING, OK, + LOADING_FAILED, CONVERSATION_CREATION_FAILED, CONVERSATION_CREATED_WITH_MISSING_TOKEN, CONVERSATION_PASSWORD_NOT_SET diff --git a/app/src/main/java/com/nextcloud/talk/newarch/features/contactsflow/ParticipantElement.kt b/app/src/main/java/com/nextcloud/talk/newarch/features/contactsflow/ParticipantElement.kt index fde654f5e..0320dfa80 100644 --- a/app/src/main/java/com/nextcloud/talk/newarch/features/contactsflow/ParticipantElement.kt +++ b/app/src/main/java/com/nextcloud/talk/newarch/features/contactsflow/ParticipantElement.kt @@ -22,8 +22,6 @@ package com.nextcloud.talk.newarch.features.contactsflow -import com.nextcloud.talk.models.json.participants.Participant - data class ParticipantElement( val data: Any, val elementType: Int diff --git a/app/src/main/java/com/nextcloud/talk/newarch/features/contactsflow/contacts/ContactPresenter.kt b/app/src/main/java/com/nextcloud/talk/newarch/features/contactsflow/contacts/ContactPresenter.kt index f09cc222e..8cbf2fa00 100644 --- a/app/src/main/java/com/nextcloud/talk/newarch/features/contactsflow/contacts/ContactPresenter.kt +++ b/app/src/main/java/com/nextcloud/talk/newarch/features/contactsflow/contacts/ContactPresenter.kt @@ -27,6 +27,7 @@ import android.view.ViewGroup import androidx.core.view.isVisible import coil.api.load import com.nextcloud.talk.R +import com.nextcloud.talk.models.json.conversations.Conversation import com.nextcloud.talk.models.json.participants.Participant import com.nextcloud.talk.newarch.features.contactsflow.ParticipantElement import com.nextcloud.talk.newarch.local.models.getCredentials @@ -101,15 +102,20 @@ open class ContactPresenter(context: Context, onElementClick: ((Page, H when (participant.source) { "users" -> { + val conversation = Conversation() + conversation.type = Conversation.ConversationType.ONE_TO_ONE_CONVERSATION + when (participant.type) { Participant.ParticipantType.GUEST, Participant.ParticipantType.GUEST_AS_MODERATOR, Participant.ParticipantType.USER_FOLLOWING_LINK -> { holder.itemView.avatarImageView.load(ApiUtils.getUrlForAvatarWithNameForGuests(user?.baseUrl, participant.userId, R.dimen.avatar_size)) { user?.getCredentials()?.let { addHeader("Authorization", it) } + fallback(Images().getImageForConversation(context, conversation, true)) } } else -> { holder.itemView.avatarImageView.load(ApiUtils.getUrlForAvatarWithName(user?.baseUrl, participant.userId, R.dimen.avatar_size)) { user?.getCredentials()?.let { addHeader("Authorization", it) } + fallback(Images().getImageForConversation(context, conversation, true)) } } } diff --git a/app/src/main/java/com/nextcloud/talk/newarch/features/contactsflow/contacts/ContactsView.kt b/app/src/main/java/com/nextcloud/talk/newarch/features/contactsflow/contacts/ContactsView.kt index a621e687e..58cfd61eb 100644 --- a/app/src/main/java/com/nextcloud/talk/newarch/features/contactsflow/contacts/ContactsView.kt +++ b/app/src/main/java/com/nextcloud/talk/newarch/features/contactsflow/contacts/ContactsView.kt @@ -47,7 +47,6 @@ import com.nextcloud.talk.newarch.features.search.DebouncingTextWatcher import com.nextcloud.talk.newarch.mvvm.BaseView import com.nextcloud.talk.newarch.mvvm.ext.initRecyclerView import com.nextcloud.talk.newarch.utils.ElementPayload -import com.nextcloud.talk.newarch.utils.dp import com.nextcloud.talk.newarch.utils.px import com.nextcloud.talk.utils.bundle.BundleKeys import com.otaliastudios.elements.Adapter @@ -61,6 +60,7 @@ import kotlinx.android.synthetic.main.message_state.view.* import kotlinx.android.synthetic.main.search_layout.* import kotlinx.android.synthetic.main.search_layout.view.* import org.koin.android.ext.android.inject + class ContactsView(private val bundle: Bundle? = null) : BaseView() { override val scopeProvider: LifecycleScopeProvider<*> = ControllerScopeProvider.from(this) @@ -86,8 +86,9 @@ class ContactsView(private val bundle: Bundle? = null) : BaseView() { viewModel = viewModelProvider(factory).get(ContactsViewModel::class.java) val view = super.onCreateView(inflater, container) + val contactsViewSource = ContactsViewSource(data = viewModel.contactsLiveData) val participantsAdapterBuilder = Adapter.builder(this) - .addSource(ContactsViewSource(data = viewModel.contactsLiveData)) + .addSource(contactsViewSource) .addSource(ContactsHeaderSource(activity as Context, ParticipantElementType.PARTICIPANT_HEADER.ordinal)) .addSource(ContactsViewFooterSource(activity as Context, ParticipantElementType.PARTICIPANT_FOOTER.ordinal)) .addPresenter(ContactPresenter(activity as Context, ::onElementClick)) @@ -102,9 +103,13 @@ class ContactsView(private val bundle: Bundle? = null) : BaseView() { view.messageStateImageView.imageTintList = null }) .addPresenter(Presenter.forErrorIndicator(activity as Context, R.layout.message_state) { view, throwable -> + val layoutParams = view.messageStateImageView.layoutParams as RelativeLayout.LayoutParams + layoutParams.height = 128.px + layoutParams.width = 128.px + view.messageStateImageView.layoutParams = layoutParams view.messageStateTextView.setText(R.string.nc_oops) - view.messageStateImageView.load((activity as Context).getDrawable(R.drawable.ic_announcement_white_24dp)) - view.messageStateImageView.imageTintList = resources?.getColor(R.color.colorPrimary)?.let { ColorStateList.valueOf(it) } + view.messageStateImageView.load((activity as Context).getDrawable(R.drawable.ic_undraw_server_down_s4lk)) + view.messageStateImageView.imageTintList = null }) .setAutoScrollMode(Adapter.AUTOSCROLL_POSITION_0, true) @@ -191,6 +196,10 @@ class ContactsView(private val bundle: Bundle? = null) : BaseView() { // dunno what to do yet, an error message somewhere searchLayout?.searchProgressBar?.isVisible = false } + ContactsViewOperationState.LOADING_FAILED -> { + searchLayout?.searchProgressBar?.isVisible = false + contactsViewSource.postError(Exception(operationState.errorMessage)) + } else -> { // do nothing, we're waiting } diff --git a/app/src/main/java/com/nextcloud/talk/newarch/features/contactsflow/contacts/ContactsViewFooterSource.kt b/app/src/main/java/com/nextcloud/talk/newarch/features/contactsflow/contacts/ContactsViewFooterSource.kt index 111c1bcf6..f4a6d917d 100644 --- a/app/src/main/java/com/nextcloud/talk/newarch/features/contactsflow/contacts/ContactsViewFooterSource.kt +++ b/app/src/main/java/com/nextcloud/talk/newarch/features/contactsflow/contacts/ContactsViewFooterSource.kt @@ -24,7 +24,6 @@ package com.nextcloud.talk.newarch.features.contactsflow.contacts import android.content.Context import com.nextcloud.talk.R -import com.nextcloud.talk.models.json.participants.Participant import com.nextcloud.talk.newarch.features.contactsflow.ParticipantElement import com.otaliastudios.elements.Page import com.otaliastudios.elements.Source diff --git a/app/src/main/java/com/nextcloud/talk/newarch/features/contactsflow/contacts/ContactsViewHeaderSource.kt b/app/src/main/java/com/nextcloud/talk/newarch/features/contactsflow/contacts/ContactsViewHeaderSource.kt index d97078491..139fcb891 100644 --- a/app/src/main/java/com/nextcloud/talk/newarch/features/contactsflow/contacts/ContactsViewHeaderSource.kt +++ b/app/src/main/java/com/nextcloud/talk/newarch/features/contactsflow/contacts/ContactsViewHeaderSource.kt @@ -42,31 +42,31 @@ class ContactsHeaderSource(private val context: Context, private val elementType headersAlreadyAdded = mutableListOf() for (participantElement in list) { if (participantElement.data is Participant) { - val participant = participantElement.data - val header = when (participant.source) { - "users" -> { - context.getString(R.string.nc_contacts) - } - "groups" -> { - context.getString(R.string.nc_groups) - } - "emails" -> { - context.getString(R.string.nc_emails) - } - "circles" -> { - context.getString(R.string.nc_circles) - } - else -> { - context.getString(R.string.nc_others) - - } + val participant = participantElement.data + val header = when (participant.source) { + "users" -> { + context.getString(R.string.nc_contacts) } + "groups" -> { + context.getString(R.string.nc_groups) + } + "emails" -> { + context.getString(R.string.nc_emails) + } + "circles" -> { + context.getString(R.string.nc_circles) + } + else -> { + context.getString(R.string.nc_others) - if (!headersAlreadyAdded.contains(header)) { - results.add(Data(participantElement, header)) - headersAlreadyAdded.add(header) } } + + if (!headersAlreadyAdded.contains(header)) { + results.add(Data(participantElement, header)) + headersAlreadyAdded.add(header) + } + } } return results diff --git a/app/src/main/java/com/nextcloud/talk/newarch/features/contactsflow/contacts/ContactsViewModel.kt b/app/src/main/java/com/nextcloud/talk/newarch/features/contactsflow/contacts/ContactsViewModel.kt index 5dd7f70e2..c097c902b 100644 --- a/app/src/main/java/com/nextcloud/talk/newarch/features/contactsflow/contacts/ContactsViewModel.kt +++ b/app/src/main/java/com/nextcloud/talk/newarch/features/contactsflow/contacts/ContactsViewModel.kt @@ -23,7 +23,10 @@ package com.nextcloud.talk.newarch.features.contactsflow.contacts import android.app.Application -import androidx.lifecycle.* +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.distinctUntilChanged +import androidx.lifecycle.viewModelScope import com.nextcloud.talk.R import com.nextcloud.talk.models.json.conversations.Conversation import com.nextcloud.talk.models.json.conversations.ConversationOverall @@ -167,7 +170,8 @@ class ContactsViewModel constructor( } override suspend fun onError(errorModel: ErrorModel?) { - // handle errors here + _operationState.postValue(ContactsViewOperationStateWrapper(ContactsViewOperationState.LOADING_FAILED, errorModel?.getErrorMessage(), conversationToken)) + } }) } diff --git a/app/src/main/java/com/nextcloud/talk/newarch/features/contactsflow/contacts/ContactsViewSource.kt b/app/src/main/java/com/nextcloud/talk/newarch/features/contactsflow/contacts/ContactsViewSource.kt index aeb76bad0..eb0992ae2 100644 --- a/app/src/main/java/com/nextcloud/talk/newarch/features/contactsflow/contacts/ContactsViewSource.kt +++ b/app/src/main/java/com/nextcloud/talk/newarch/features/contactsflow/contacts/ContactsViewSource.kt @@ -29,16 +29,24 @@ import com.otaliastudios.elements.Element import com.otaliastudios.elements.Page import com.otaliastudios.elements.Source import com.otaliastudios.elements.extensions.MainSource +import java.lang.Exception class ContactsViewSource(private val data: LiveData>, loadingIndicatorsEnabled: Boolean = true, errorIndicatorEnabled: Boolean = true, emptyIndicatorEnabled: Boolean = true) : MainSource(loadingIndicatorsEnabled, errorIndicatorEnabled, emptyIndicatorEnabled) { - + private var currentPage: Page? = null override fun onPageOpened(page: Page, dependencies: List>) { super.onPageOpened(page, dependencies) if (page.previous() == null) { + currentPage = page postResult(page, data) } } + fun postError(exception: Exception){ + currentPage?.let { page -> + postResult(page, exception) + } + } + override fun getElementType(data: T): Int { return data.elementType } diff --git a/app/src/main/java/com/nextcloud/talk/newarch/features/conversationsList/ConversationPresenter.kt b/app/src/main/java/com/nextcloud/talk/newarch/features/conversationsList/ConversationPresenter.kt index 94493da4b..bcdeb7807 100644 --- a/app/src/main/java/com/nextcloud/talk/newarch/features/conversationsList/ConversationPresenter.kt +++ b/app/src/main/java/com/nextcloud/talk/newarch/features/conversationsList/ConversationPresenter.kt @@ -154,6 +154,7 @@ open class ConversationPresenter(context: Context, onElementClick: ((Page, Holde { addHeader("Authorization", user.getCredentials()) transformations(CircleCropTransformation()) + fallback(Images().getImageForConversation(context, conversation, true)) } } } diff --git a/app/src/main/java/com/nextcloud/talk/newarch/features/conversationsList/ConversationsListView.kt b/app/src/main/java/com/nextcloud/talk/newarch/features/conversationsList/ConversationsListView.kt index d9ea0f98c..42b92db3e 100644 --- a/app/src/main/java/com/nextcloud/talk/newarch/features/conversationsList/ConversationsListView.kt +++ b/app/src/main/java/com/nextcloud/talk/newarch/features/conversationsList/ConversationsListView.kt @@ -34,8 +34,6 @@ import androidx.recyclerview.widget.LinearLayoutManager import com.afollestad.materialdialogs.LayoutMode import com.afollestad.materialdialogs.MaterialDialog import com.afollestad.materialdialogs.bottomsheets.BottomSheet -import com.bluelinelabs.conductor.ControllerChangeHandler -import com.bluelinelabs.conductor.ControllerChangeType import com.bluelinelabs.conductor.RouterTransaction import com.bluelinelabs.conductor.autodispose.ControllerScopeProvider import com.bluelinelabs.conductor.changehandler.HorizontalChangeHandler @@ -52,7 +50,6 @@ import com.nextcloud.talk.newarch.features.contactsflow.contacts.ContactsView import com.nextcloud.talk.newarch.features.search.DebouncingTextWatcher import com.nextcloud.talk.newarch.mvvm.BaseView import com.nextcloud.talk.newarch.mvvm.ext.initRecyclerView -import com.nextcloud.talk.newarch.utils.px import com.nextcloud.talk.utils.ConductorRemapping import com.nextcloud.talk.utils.DisplayUtils import com.nextcloud.talk.utils.animations.SharedElementTransition @@ -148,6 +145,7 @@ class ConversationsListView : BaseView() { override fun onAttach(view: View) { super.onAttach(view) floatingActionButton?.isVisible = true + appBar?.isVisible = true } private fun setSearchQuery(query: CharSequence?) { diff --git a/app/src/main/java/com/nextcloud/talk/newarch/utils/Images.kt b/app/src/main/java/com/nextcloud/talk/newarch/utils/Images.kt index b143371d6..da1f22d28 100644 --- a/app/src/main/java/com/nextcloud/talk/newarch/utils/Images.kt +++ b/app/src/main/java/com/nextcloud/talk/newarch/utils/Images.kt @@ -88,7 +88,7 @@ class Images { } // returns null if it's one-to-one that you need to fetch yourself - fun getImageForConversation(context: Context, conversation: Conversation): Drawable? { + fun getImageForConversation(context: Context, conversation: Conversation, fallback: Boolean = false): Drawable? { conversation.objectType?.let { objectType -> when (objectType) { "share:password" -> { @@ -104,6 +104,10 @@ class Images { when (conversation.type) { Conversation.ConversationType.ONE_TO_ONE_CONVERSATION -> { + if (fallback) { + return DisplayUtils.getRoundedDrawableFromBitmap(getImageWithBackground(context, R.drawable.ic_baseline_person_24)) + } + return null } Conversation.ConversationType.GROUP_CONVERSATION -> { diff --git a/app/src/main/java/com/nextcloud/talk/utils/NotificationUtils.kt b/app/src/main/java/com/nextcloud/talk/utils/NotificationUtils.kt index 8be2d7890..229af4e89 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/NotificationUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/NotificationUtils.kt @@ -31,7 +31,6 @@ import android.net.Uri import android.os.Build import android.service.notification.StatusBarNotification import android.text.TextUtils -import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat import com.bluelinelabs.logansquare.LoganSquare import com.nextcloud.talk.R @@ -58,7 +57,7 @@ object NotificationUtils { } } - fun getCallSoundUri(context: Context, appPreferences: AppPreferences) : Uri? { + fun getCallSoundUri(context: Context, appPreferences: AppPreferences): Uri? { val ringtonePreferencesString: String? = appPreferences.callRingtoneUri return if (TextUtils.isEmpty(ringtonePreferencesString)) { @@ -74,7 +73,7 @@ object NotificationUtils { } } - fun getMessageSoundUri(context: Context, appPreferences: AppPreferences) : Uri? { + fun getMessageSoundUri(context: Context, appPreferences: AppPreferences): Uri? { val ringtonePreferencesString: String? = appPreferences.messageRingtoneUri return if (TextUtils.isEmpty(ringtonePreferencesString)) { @@ -131,6 +130,7 @@ object NotificationUtils { notificationManagerCompat.createNotificationChannel(channel) } } + @TargetApi(Build.VERSION_CODES.O) fun createNotificationChannelGroup( context: Context, diff --git a/app/src/main/res/drawable/ic_baseline_person_24.xml b/app/src/main/res/drawable/ic_baseline_person_24.xml new file mode 100644 index 000000000..32adc0004 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_person_24.xml @@ -0,0 +1,27 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_undraw_server_down_s4lk.xml b/app/src/main/res/drawable/ic_undraw_server_down_s4lk.xml new file mode 100644 index 000000000..2d508dc1f --- /dev/null +++ b/app/src/main/res/drawable/ic_undraw_server_down_s4lk.xml @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/message_state.xml b/app/src/main/res/layout/message_state.xml index e8319a648..a7ad87a88 100644 --- a/app/src/main/res/layout/message_state.xml +++ b/app/src/main/res/layout/message_state.xml @@ -42,7 +42,7 @@ android:layout_margin="8dp" android:textAlignment="center" android:text="@string/nc_conversations_empty" - android:textSize="20sp" + android:textSize="16sp" /> \ No newline at end of file diff --git a/app/src/main/res/layout/search_layout.xml b/app/src/main/res/layout/search_layout.xml index 92ce147c6..f970e3766 100644 --- a/app/src/main/res/layout/search_layout.xml +++ b/app/src/main/res/layout/search_layout.xml @@ -47,7 +47,7 @@ android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_alignParentStart="true" - android:minWidth="48dp" + android:minWidth="8dp" android:layout_centerVertical="true"> Unknown error Unauthorized - Ooops, something went wrong. + Ooops, something went wrong! General Allow guests