mirror of
https://github.com/nextcloud/talk-android
synced 2025-06-21 12:39:58 +01:00
Update empty view for contacts
Signed-off-by: Mario Danic <mario@lovelyhq.com>
This commit is contained in:
parent
2558b5e190
commit
5c27d58dfa
@ -23,10 +23,12 @@ 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
|
||||
|
@ -23,15 +23,17 @@
|
||||
package com.nextcloud.talk.newarch.data.presenters
|
||||
|
||||
import android.content.Context
|
||||
import android.view.View
|
||||
import com.otaliastudios.elements.Element
|
||||
import com.otaliastudios.elements.Page
|
||||
import com.otaliastudios.elements.extensions.EmptyPresenter
|
||||
|
||||
class AdvancedEmptyPresenter(context: Context, layout: Int, private val onViewClick: (() -> Unit)? = null) : EmptyPresenter(context, layout) {
|
||||
class AdvancedEmptyPresenter(context: Context, layout: Int, private val onViewClick: (() -> Unit)? = null, private val bind: ((View) -> Unit)? = null) : EmptyPresenter(context, layout) {
|
||||
override fun onBind(page: Page, holder: Holder, element: Element<Void>, payloads: List<Any>) {
|
||||
super.onBind(page, holder, element, payloads)
|
||||
holder.itemView.setOnClickListener {
|
||||
onViewClick?.invoke()
|
||||
}
|
||||
bind?.invoke(holder.itemView)
|
||||
}
|
||||
}
|
@ -23,26 +23,32 @@
|
||||
package com.nextcloud.talk.newarch.features.contactsflow.contacts
|
||||
|
||||
import android.content.Context
|
||||
import android.content.res.ColorStateList
|
||||
import android.os.Bundle
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.widget.RelativeLayout
|
||||
import androidx.core.view.isVisible
|
||||
import androidx.lifecycle.observe
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import coil.api.load
|
||||
import com.bluelinelabs.conductor.RouterTransaction
|
||||
import com.bluelinelabs.conductor.autodispose.ControllerScopeProvider
|
||||
import com.bluelinelabs.conductor.changehandler.HorizontalChangeHandler
|
||||
import com.nextcloud.talk.R
|
||||
import com.nextcloud.talk.controllers.ChatController
|
||||
import com.nextcloud.talk.models.json.participants.Participant
|
||||
import com.nextcloud.talk.newarch.data.presenters.AdvancedEmptyPresenter
|
||||
import com.nextcloud.talk.newarch.features.contactsflow.ContactsViewOperationState
|
||||
import com.nextcloud.talk.newarch.features.contactsflow.groupconversation.GroupConversationView
|
||||
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
|
||||
import com.otaliastudios.elements.Element
|
||||
@ -55,7 +61,6 @@ 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)
|
||||
|
||||
@ -81,17 +86,25 @@ class ContactsView(private val bundle: Bundle? = null) : BaseView() {
|
||||
viewModel = viewModelProvider(factory).get(ContactsViewModel::class.java)
|
||||
val view = super.onCreateView(inflater, container)
|
||||
|
||||
// todo - change empty state magic
|
||||
val participantsAdapterBuilder = Adapter.builder(this)
|
||||
.addSource(ContactsViewSource(data = viewModel.contactsLiveData))
|
||||
.addSource(ContactsHeaderSource(activity as Context, ParticipantElementType.PARTICIPANT_HEADER.ordinal))
|
||||
.addSource(ContactsViewFooterSource(activity as Context, ParticipantElementType.PARTICIPANT_FOOTER.ordinal))
|
||||
.addPresenter(ContactPresenter(activity as Context, ::onElementClick))
|
||||
.addPresenter(Presenter.forLoadingIndicator(activity as Context, R.layout.loading_state))
|
||||
.addPresenter(Presenter.forEmptyIndicator(activity as Context, R.layout.message_state))
|
||||
.addPresenter(AdvancedEmptyPresenter(activity as Context, R.layout.message_state, null) { view ->
|
||||
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_search_empty_contacts)
|
||||
view.messageStateImageView.load(context.getDrawable(R.drawable.ic_undraw_not_found_60pq))
|
||||
view.messageStateImageView.imageTintList = null
|
||||
})
|
||||
.addPresenter(Presenter.forErrorIndicator(activity as Context, R.layout.message_state) { view, throwable ->
|
||||
view.messageStateTextView.setText(R.string.nc_oops)
|
||||
view.messageStateImageView.setImageDrawable((activity as Context).getDrawable(R.drawable.ic_announcement_white_24dp))
|
||||
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) }
|
||||
})
|
||||
.setAutoScrollMode(Adapter.AUTOSCROLL_POSITION_0, true)
|
||||
|
||||
|
@ -134,10 +134,11 @@ class ContactsViewModel constructor(
|
||||
}
|
||||
|
||||
private fun loadContacts() {
|
||||
getContactsUseCase.invoke(viewModelScope, parametersOf(globalService.currentUserLiveData.value, groupConversation, filterLiveData.value, conversationToken), object :
|
||||
val searchQuery: String = if (filterLiveData.value.isNullOrBlank()) "" else filterLiveData.value.toString()
|
||||
getContactsUseCase.invoke(viewModelScope, parametersOf(globalService.currentUserLiveData.value, groupConversation, searchQuery, conversationToken), object :
|
||||
UseCaseResponse<List<Participant>> {
|
||||
override suspend fun onSuccess(result: List<Participant>) {
|
||||
val sortPriority = mapOf("users" to 0, "groups" to 1, "emails" to 2, "circles" to 0)
|
||||
val sortPriority = mapOf("users" to 0, "groups" to 1, "emails" to 2, "circles" to 3)
|
||||
|
||||
val sortedList = result.sortedWith(compareBy({
|
||||
sortPriority[it.source]
|
||||
|
@ -23,6 +23,7 @@
|
||||
package com.nextcloud.talk.newarch.features.conversationslist
|
||||
|
||||
import android.content.Context
|
||||
import android.content.res.ColorStateList
|
||||
import android.os.Bundle
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
@ -51,6 +52,7 @@ 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
|
||||
@ -86,10 +88,13 @@ class ConversationsListView : BaseView() {
|
||||
.addSource(ConversationsListSource(viewModel.conversationsLiveData))
|
||||
.addPresenter(ConversationPresenter(activity as Context, ::onElementClick, ::onElementLongClick))
|
||||
.addPresenter(Presenter.forLoadingIndicator(activity as Context, R.layout.loading_state))
|
||||
.addPresenter(AdvancedEmptyPresenter(activity as Context, R.layout.message_state, ::openNewConversationScreen))
|
||||
.addPresenter(AdvancedEmptyPresenter(activity as Context, R.layout.message_state, ::openNewConversationScreen) { view ->
|
||||
view.messageStateImageView.imageTintList = resources?.getColor(R.color.colorPrimary)?.let { ColorStateList.valueOf(it) }
|
||||
})
|
||||
.addPresenter(Presenter.forErrorIndicator(activity as Context, R.layout.message_state) { view, throwable ->
|
||||
view.messageStateTextView.setText(R.string.nc_oops)
|
||||
view.messageStateImageView.setImageDrawable((activity as Context).getDrawable(drawable.ic_announcement_white_24dp))
|
||||
view.messageStateImageView.imageTintList = resources?.getColor(R.color.colorPrimary)?.let { ColorStateList.valueOf(it) }
|
||||
})
|
||||
.setAutoScrollMode(Adapter.AUTOSCROLL_POSITION_0, true)
|
||||
.into(view.recyclerView)
|
||||
|
@ -22,6 +22,7 @@
|
||||
|
||||
package com.nextcloud.talk.newarch.utils
|
||||
|
||||
import android.content.res.Resources
|
||||
import com.nextcloud.talk.models.database.UserEntity
|
||||
import com.nextcloud.talk.utils.ApiUtils
|
||||
import java.security.MessageDigest
|
||||
@ -32,3 +33,9 @@ fun String.hashWithAlgorithm(algorithm: String): String {
|
||||
val bytes = digest.digest(this.toByteArray(Charsets.UTF_8))
|
||||
return bytes.fold("", { str, it -> str + "%02x".format(it) })
|
||||
}
|
||||
|
||||
val Int.dp: Int
|
||||
get() = (this / Resources.getSystem().displayMetrics.density).toInt()
|
||||
|
||||
val Int.px: Int
|
||||
get() = (this * Resources.getSystem().displayMetrics.density).toInt()
|
37
app/src/main/res/drawable/ic_undraw_not_found_60pq.xml
Normal file
37
app/src/main/res/drawable/ic_undraw_not_found_60pq.xml
Normal file
@ -0,0 +1,37 @@
|
||||
<vector android:autoMirrored="true" android:height="777.91583dp"
|
||||
android:viewportHeight="777.91583" android:viewportWidth="1120.5923"
|
||||
android:width="1120.5923dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<path android:fillColor="#ff6584" android:pathData="M212.59,103m-64,0a64,64 0,1 1,128 0a64,64 0,1 1,-128 0"/>
|
||||
<path android:fillColor="#f2f2f2" android:pathData="M523.98,343.12c0,151.01 -89.77,203.74 -200.52,203.74S122.95,494.13 122.95,343.12 323.46,0 323.46,0 523.98,192.11 523.98,343.12Z"/>
|
||||
<path android:fillColor="#3f3d56" android:pathData="M316.16,523.76l2.05,-126.38l85.46,-156.35l-85.14,136.53l0.92,-56.83l58.9,-113.12l-58.66,98.08l0,0l1.66,-102.21l63.07,-90.06l-62.81,73.99l1.04,-187.41l-6.52,248.1l0.54,-10.24l-64.13,-98.16l63.1,117.8l-5.98,114.15l-0.18,-3.03l-73.93,-103.3l73.7,114l-0.75,14.27l-0.13,0.21l0.06,1.17l-15.16,289.6l20.25,0l2.43,-149.58l73.52,-113.72l-73.34,102.48z"/>
|
||||
<path android:fillColor="#f2f2f2" android:pathData="M1120.59,404.97c0,123.61 -73.48,166.77 -164.13,166.77s-164.13,-43.16 -164.13,-166.77S956.46,124.11 956.46,124.11 1120.59,281.36 1120.59,404.97Z"/>
|
||||
<path android:fillColor="#3f3d56" android:pathData="M950.48,552.83l1.68,-103.45l69.96,-127.98l-69.69,111.75l0.76,-46.51l48.21,-92.6l-48.01,80.29l0,0l1.36,-83.66l51.63,-73.72l-51.42,60.56l0.85,-153.4l-5.34,203.08l0.44,-8.38l-52.49,-80.35l51.65,96.43l-4.89,93.43l-0.15,-2.48l-60.51,-84.55l60.33,93.31l-0.61,11.68l-0.11,0.18l0.05,0.96l-12.41,237.05l16.58,0l1.99,-122.44l60.18,-93.08l-60.03,83.88z"/>
|
||||
<path android:fillColor="#3f3d56" android:pathData="M0,680.48a554.59,28.03 0,1 0,1109.18 0a554.59,28.03 0,1 0,-1109.18 0z"/>
|
||||
<path android:fillColor="#3f3d56" android:pathData="M797.46,726.8a94.99,4.8 0,1 0,189.98 0a94.99,4.8 0,1 0,-189.98 0z"/>
|
||||
<path android:fillColor="#3f3d56" android:pathData="M453.73,773.11a94.99,4.8 0,1 0,189.98 0a94.99,4.8 0,1 0,-189.98 0z"/>
|
||||
<path android:fillColor="#3f3d56" android:pathData="M70.93,734.28a217.01,10.97 0,1 0,434.03 0a217.01,10.97 0,1 0,-434.03 0z"/>
|
||||
<path android:fillColor="#2f2e41" android:pathData="M97.08,566.27m-79,0a79,79 0,1 1,158 0a79,79 0,1 1,-158 0"/>
|
||||
<path android:fillColor="#2f2e41" android:pathData="M60.36,627.84l24,0.28l-0.51,43l-24,-0.28z"/>
|
||||
<path android:fillColor="#2f2e41" android:pathData="M108.35,628.41l24,0.28l-0.51,43l-24,-0.28z"/>
|
||||
<path android:fillColor="#2f2e41" android:pathData="M79.75,679.07a7.5,20 90.68,1 0,0.18 -15a7.5,20 90.68,1 0,-0.18 15z"/>
|
||||
<path android:fillColor="#2f2e41" android:pathData="M127.76,678.64a7.5,20 90.68,1 0,0.18 -15a7.5,20 90.68,1 0,-0.18 15z"/>
|
||||
<path android:fillColor="#fff" android:pathData="M99.32,546.29m-27,0a27,27 0,1 1,54 0a27,27 0,1 1,-54 0"/>
|
||||
<path android:fillColor="#3f3d56" android:pathData="M99.32,546.29m-9,0a9,9 0,1 1,18 0a9,9 0,1 1,-18 0"/>
|
||||
<path android:fillColor="@color/colorPrimary" android:pathData="M21.32,491.9c-6.04,-28.64 14.69,-57.26 46.3,-63.93s62.14,11.14 68.18,39.78 -14.98,38.93 -46.59,45.6S27.36,520.55 21.32,491.9Z"/>
|
||||
<path android:fillColor="@color/colorPrimary" android:pathData="M217.59,610.34c0,55.08 -32.74,74.31 -73.13,74.31q-1.4,0 -2.8,-0.03c-1.87,-0.04 -3.72,-0.13 -5.56,-0.25 -36.45,-2.58 -64.77,-22.8 -64.77,-74.02 0,-53.01 67.74,-119.9 72.83,-124.85l0.01,-0.01c0.2,-0.19 0.29,-0.29 0.29,-0.29S217.59,555.27 217.59,610.34Z"/>
|
||||
<path android:fillColor="#3f3d56" android:pathData="M141.8,676.22l26.75,-37.37 -26.81,41.48 -0.07,4.29c-1.87,-0.04 -3.72,-0.13 -5.56,-0.25l2.88,-55.1 -0.02,-0.43 0.05,-0.08 0.27,-5.2 -26.88,-41.58 26.97,37.68 0.06,1.11 2.18,-41.63 -23.01,-42.97 23.29,35.66 2.27,-86.31 0.01,-0.29v0.29l-0.38,68.06 22.91,-26.98 -23,32.85 -0.61,37.28L164.48,560.92l-21.48,41.26 -0.34,20.72 31.06,-49.79 -31.17,57.02Z"/>
|
||||
<path android:fillColor="#2f2e41" android:pathData="M712.49,565.42m-79,0a79,79 0,1 1,158 0a79,79 0,1 1,-158 0"/>
|
||||
<path android:fillColor="#2f2e41" android:pathData="M696.29,635.26l22.94,-7.05l12.63,41.1l-22.94,7.05z"/>
|
||||
<path android:fillColor="#2f2e41" android:pathData="M742.17,621.16l22.94,-7.05l12.63,41.1l-22.94,7.05z"/>
|
||||
<path android:fillColor="#2f2e41" android:pathData="M709.07,676.84a7.5,20 72.92,1 0,38.24 -11.75a7.5,20 72.92,1 0,-38.24 11.75z"/>
|
||||
<path android:fillColor="#2f2e41" android:pathData="M754.65,661.78a7.5,20 72.92,1 0,38.24 -11.75a7.5,20 72.92,1 0,-38.24 11.75z"/>
|
||||
<path android:fillColor="#fff" android:pathData="M708.52,545.71m-27,0a27,27 0,1 1,54 0a27,27 0,1 1,-54 0"/>
|
||||
<path android:fillColor="#3f3d56" android:pathData="M708.52,545.71m-9,0a9,9 0,1 1,18 0a9,9 0,1 1,-18 0"/>
|
||||
<path android:fillColor="@color/colorPrimary" android:pathData="M617.65,517.7c-14.49,-25.43 -3.48,-59.02 24.59,-75.01s62.58,-8.34 77.07,17.09 -2.39,41.64 -30.46,57.64S632.14,543.13 617.65,517.7Z"/>
|
||||
<path android:fillColor="@color/colorPrimary" android:pathData="M571.59,600.26c0,50.56 -30.05,68.21 -67.13,68.21q-1.29,0 -2.57,-0.03c-1.72,-0.04 -3.42,-0.12 -5.1,-0.23 -33.46,-2.37 -59.46,-20.93 -59.46,-67.95 0,-48.66 62.18,-110.06 66.85,-114.6l0.01,-0.01c0.18,-0.18 0.27,-0.26 0.27,-0.26S571.59,549.7 571.59,600.26Z"/>
|
||||
<path android:fillColor="#3f3d56" android:pathData="M502.02,660.73l24.55,-34.31 -24.61,38.07 -0.07,3.94c-1.72,-0.04 -3.42,-0.12 -5.1,-0.23l2.65,-50.58 -0.02,-0.39 0.05,-0.07 0.25,-4.78 -24.68,-38.17 24.75,34.59 0.06,1.01 2,-38.22 -21.13,-39.44L502.1,564.89l2.08,-79.23 0.01,-0.27v0.26l-0.35,62.48 21.03,-24.77 -21.12,30.15 -0.56,34.22 19.64,-32.84 -19.72,37.87 -0.31,19.02 28.51,-45.71 -28.61,52.34Z"/>
|
||||
<path android:fillColor="@color/colorPrimary" android:pathData="M835.59,621.34c0,55.08 -32.74,74.31 -73.13,74.31q-1.4,0 -2.8,-0.03c-1.87,-0.04 -3.72,-0.13 -5.56,-0.25 -36.45,-2.58 -64.77,-22.8 -64.77,-74.02 0,-53.01 67.74,-119.9 72.83,-124.85l0.01,-0.01c0.2,-0.19 0.29,-0.29 0.29,-0.29S835.59,566.27 835.59,621.34Z"/>
|
||||
<path android:fillColor="#3f3d56" android:pathData="M759.8,687.22l26.75,-37.37 -26.81,41.48 -0.07,4.29c-1.87,-0.04 -3.72,-0.13 -5.56,-0.25l2.88,-55.1 -0.02,-0.43 0.05,-0.08 0.27,-5.2L730.4,592.97l26.97,37.68 0.06,1.11 2.18,-41.63 -23.01,-42.97 23.29,35.66 2.27,-86.31 0.01,-0.29v0.29l-0.38,68.06 22.91,-26.98 -23,32.85 -0.61,37.28L782.48,571.92l-21.48,41.26 -0.34,20.72 31.06,-49.79 -31.17,57.02Z"/>
|
||||
<path android:fillColor="#2f2e41" android:pathData="M676.5,606.98a12.4,39.5 115.37,1 0,10.63 -22.41a12.4,39.5 115.37,1 0,-10.63 22.41z"/>
|
||||
<path android:fillColor="#2f2e41" android:pathData="M68.2,602.29a12.4,39.5 111.84,1 0,9.23 -23.02a12.4,39.5 111.84,1 0,-9.23 23.02z"/>
|
||||
</vector>
|
@ -26,12 +26,12 @@
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/messageStateImageView"
|
||||
android:layout_width="@dimen/item_height"
|
||||
android:layout_height="@dimen/item_height"
|
||||
android:layout_width="64dp"
|
||||
android:layout_height="64dp"
|
||||
android:adjustViewBounds="true"
|
||||
android:layout_above="@id/messageStateTextView"
|
||||
android:layout_centerHorizontal="true"
|
||||
android:src="@drawable/ic_logo"
|
||||
android:tint="@color/colorPrimary"
|
||||
/>
|
||||
|
||||
<TextView
|
||||
|
@ -343,4 +343,5 @@
|
||||
tools:override="true">M3.27,4.27L19.74,20.74</string>
|
||||
<string name="nc_search_for_more">Search for more participants</string>
|
||||
<string name="nc_new_group">New group</string>
|
||||
<string name="nc_search_empty_contacts">Where did they all hide?</string>
|
||||
</resources>
|
||||
|
Loading…
Reference in New Issue
Block a user