mirror of
https://github.com/nextcloud/talk-android
synced 2025-07-10 14:24:05 +01:00
Better layouts
This commit is contained in:
parent
436bdeb49f
commit
b9503a0869
@ -107,7 +107,8 @@ android {
|
||||
}
|
||||
|
||||
release {
|
||||
minifyEnabled false
|
||||
minifyEnabled true
|
||||
shrinkResources true
|
||||
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
||||
}
|
||||
}
|
||||
|
@ -199,21 +199,24 @@ class ConversationItem(
|
||||
holder.dialogLastMessage.setText(R.string.nc_no_messages_yet)
|
||||
}
|
||||
|
||||
holder.dialogAvatar.apply {
|
||||
val conversationDrawable: Drawable? = Images().getImageForConversation(context, model)
|
||||
|
||||
if (conversationDrawable != null) {
|
||||
holder.dialogAvatar.load(conversationDrawable)
|
||||
load(conversationDrawable)
|
||||
} else {
|
||||
holder.dialogAvatar.load(
|
||||
ApiUtils.getUrlForAvatarWithName(
|
||||
if (model.name?.contains("marco") == false) {
|
||||
load(ApiUtils.getUrlForAvatarWithName(
|
||||
user.baseUrl,
|
||||
model.name, R.dimen.avatar_size
|
||||
)
|
||||
) {
|
||||
model.name, R.dimen.avatar_size))
|
||||
{
|
||||
addHeader("Authorization", user.getCredentials())
|
||||
transformations(CircleCropTransformation())
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun filter(constraint: String): Boolean {
|
||||
return model.displayName != null && Pattern.compile(
|
||||
@ -227,6 +230,7 @@ class ConversationItem(
|
||||
view: View,
|
||||
adapter: FlexibleAdapter<*>
|
||||
) : FlexibleViewHolder(view, adapter), LayoutContainer {
|
||||
|
||||
override val containerView: View?
|
||||
get() = itemView
|
||||
}
|
||||
|
@ -35,6 +35,7 @@ import androidx.work.PeriodicWorkRequest
|
||||
import androidx.work.WorkManager
|
||||
import coil.Coil
|
||||
import coil.ImageLoader
|
||||
import coil.util.CoilLogger
|
||||
import com.bluelinelabs.logansquare.LoganSquare
|
||||
import com.nextcloud.talk.BuildConfig
|
||||
import com.nextcloud.talk.components.filebrowser.webdav.DavUtils
|
||||
@ -127,6 +128,8 @@ class NextcloudTalkApplication : Application(), LifecycleObserver {
|
||||
startKoin()
|
||||
DavUtils.registerCustomFactories()
|
||||
|
||||
CoilLogger.setLevel(Log.DEBUG)
|
||||
CoilLogger.setEnabled(true)// Enable logging to the standard Android log.
|
||||
Coil.setDefaultImageLoader(imageLoader)
|
||||
migrateUsers()
|
||||
|
||||
|
@ -120,7 +120,7 @@ fun createOkHttpClient(
|
||||
httpClient.retryOnConnectionFailure(true)
|
||||
httpClient.hostnameVerifier(magicTrustManager.getHostnameVerifier(OkHostnameVerifier.INSTANCE))
|
||||
|
||||
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.N) {
|
||||
if (SDK_INT == Build.VERSION_CODES.N) {
|
||||
val suites = sslSocketFactory.defaultCipherSuites
|
||||
val tlsSpec = ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS).cipherSuites(*suites).build()
|
||||
httpClient.connectionSpecs(listOf(tlsSpec, ConnectionSpec.CLEARTEXT))
|
||||
@ -145,7 +145,7 @@ fun createOkHttpClient(
|
||||
}
|
||||
}
|
||||
|
||||
httpClient.addNetworkInterceptor { chain ->
|
||||
httpClient.addInterceptor { chain ->
|
||||
var response = chain.proceed(chain.request())
|
||||
|
||||
if (response.request().url().encodedPath().contains("/avatar/")) {
|
||||
@ -291,7 +291,6 @@ fun createImageLoader(
|
||||
): ImageLoader {
|
||||
return ImageLoader(androidApplication) {
|
||||
availableMemoryPercentage(0.5)
|
||||
bitmapPoolPercentage(0.5)
|
||||
crossfade(true)
|
||||
okHttpClient(okHttpClient)
|
||||
componentRegistry {
|
||||
|
@ -76,7 +76,7 @@ class ConversationsListView : BaseView(), OnQueryTextListener,
|
||||
private lateinit var viewModel: ConversationsListViewModel
|
||||
val factory: ConversationListViewModelFactory by inject()
|
||||
|
||||
private val recyclerViewAdapter = FlexibleAdapter(mutableListOf(), null, false)
|
||||
private val recyclerViewAdapter = FlexibleAdapter(mutableListOf(), this, false)
|
||||
|
||||
private var searchItem: MenuItem? = null
|
||||
private var settingsItem: MenuItem? = null
|
||||
@ -164,6 +164,30 @@ class ConversationsListView : BaseView(), OnQueryTextListener,
|
||||
actionBar?.show()
|
||||
|
||||
viewModel = viewModelProvider(factory).get(ConversationsListViewModel::class.java)
|
||||
|
||||
val view = super.onCreateView(inflater, container)
|
||||
|
||||
view.apply {
|
||||
recyclerView.initRecyclerView(
|
||||
SmoothScrollLinearLayoutManager(activity), recyclerViewAdapter, false)
|
||||
recyclerViewAdapter.fastScroller = fast_scroller
|
||||
swipeRefreshLayoutView.setOnRefreshListener {
|
||||
view.swipeRefreshLayoutView.isRefreshing = false
|
||||
viewModel.loadConversations()
|
||||
}
|
||||
swipeRefreshLayoutView.setColorSchemeResources(R.color.colorPrimary)
|
||||
fast_scroller.setBubbleTextCreator { position ->
|
||||
var displayName =
|
||||
(recyclerViewAdapter.getItem(position) as ConversationItem).model.displayName
|
||||
|
||||
if (displayName!!.length > 8) {
|
||||
displayName = displayName.substring(0, 4) + "..."
|
||||
}
|
||||
|
||||
displayName
|
||||
}
|
||||
}
|
||||
|
||||
viewModel.apply {
|
||||
currentUserAvatar.observe(this@ConversationsListView, Observer { value ->
|
||||
settingsItem?.icon = value
|
||||
@ -173,15 +197,15 @@ class ConversationsListView : BaseView(), OnQueryTextListener,
|
||||
val isListEmpty = it.isNullOrEmpty()
|
||||
|
||||
if (isListEmpty) {
|
||||
view?.stateWithMessageView?.errorStateTextView?.text =
|
||||
view.stateWithMessageView?.errorStateTextView?.text =
|
||||
resources?.getText(R.string.nc_conversations_empty)
|
||||
view?.stateWithMessageView?.errorStateImageView?.setImageResource(drawable.ic_logo)
|
||||
view.stateWithMessageView?.errorStateImageView?.setImageResource(drawable.ic_logo)
|
||||
}
|
||||
|
||||
view?.stateWithMessageView?.visibility = if (isListEmpty && networkStateLiveData.value != LOADING) View.VISIBLE else View.GONE
|
||||
view.stateWithMessageView?.visibility = if (isListEmpty && networkStateLiveData.value != LOADING) View.VISIBLE else View.GONE
|
||||
|
||||
if (view?.floatingActionButton?.isShown == false) {
|
||||
view?.floatingActionButton?.show()
|
||||
if (view.floatingActionButton?.isShown == false) {
|
||||
view.floatingActionButton?.show()
|
||||
}
|
||||
|
||||
searchItem?.isVisible = !isListEmpty
|
||||
@ -206,34 +230,34 @@ class ConversationsListView : BaseView(), OnQueryTextListener,
|
||||
networkStateLiveData.observe(this@ConversationsListView, Observer { value ->
|
||||
when (value) {
|
||||
LOADING -> {
|
||||
view?.post {
|
||||
view?.loadingStateView?.visibility = View.VISIBLE
|
||||
view?.dataStateView?.visibility = View.GONE
|
||||
view?.stateWithMessageView?.visibility = View.GONE
|
||||
view?.floatingActionButton?.visibility = View.GONE
|
||||
view.post {
|
||||
view.loadingStateView?.visibility = View.VISIBLE
|
||||
view.recyclerView?.visibility = View.GONE
|
||||
view.stateWithMessageView?.visibility = View.GONE
|
||||
view.floatingActionButton?.visibility = View.GONE
|
||||
}
|
||||
searchItem?.isVisible = false
|
||||
}
|
||||
LOADED -> {
|
||||
// awesome, but we delegate the magic stuff to the data handler
|
||||
view?.post {
|
||||
view?.loadingStateView?.visibility = View.GONE
|
||||
view?.dataStateView?.visibility = View.VISIBLE
|
||||
view?.stateWithMessageView?.visibility = if (recyclerViewAdapter.isEmpty) View.VISIBLE else View.GONE
|
||||
view?.floatingActionButton?.visibility = View.VISIBLE
|
||||
if (view?.floatingActionButton?.isShown == false) {
|
||||
view?.floatingActionButton?.show()
|
||||
view.post {
|
||||
view.loadingStateView?.visibility = View.GONE
|
||||
view.recyclerView?.visibility = View.VISIBLE
|
||||
view.stateWithMessageView?.visibility = if (recyclerViewAdapter.isEmpty) View.VISIBLE else View.GONE
|
||||
view.floatingActionButton?.visibility = View.VISIBLE
|
||||
if (view.floatingActionButton?.isShown == false) {
|
||||
view.floatingActionButton?.show()
|
||||
}
|
||||
}
|
||||
searchItem?.isVisible = !recyclerViewAdapter.isEmpty
|
||||
}
|
||||
FAILED -> {
|
||||
// probably offline, so what? :)
|
||||
view?.post {
|
||||
view?.loadingStateView?.visibility = View.GONE
|
||||
view?.dataStateView?.visibility = View.VISIBLE
|
||||
view?.floatingActionButton?.visibility = View.GONE
|
||||
view?.stateWithMessageView?.visibility = if (recyclerViewAdapter.isEmpty) View.VISIBLE else View.GONE
|
||||
view.post {
|
||||
view.loadingStateView?.visibility = View.GONE
|
||||
view.recyclerView?.visibility = View.VISIBLE
|
||||
view.floatingActionButton?.visibility = View.GONE
|
||||
view.stateWithMessageView?.visibility = if (recyclerViewAdapter.isEmpty) View.VISIBLE else View.GONE
|
||||
}
|
||||
searchItem?.isVisible = !recyclerViewAdapter.isEmpty
|
||||
}
|
||||
@ -249,9 +273,7 @@ class ConversationsListView : BaseView(), OnQueryTextListener,
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
|
||||
return super.onCreateView(inflater, container)
|
||||
return view
|
||||
}
|
||||
|
||||
override fun getLayoutId(): Int {
|
||||
@ -366,30 +388,6 @@ class ConversationsListView : BaseView(), OnQueryTextListener,
|
||||
|
||||
override fun onAttach(view: View) {
|
||||
super.onAttach(view)
|
||||
view.recyclerView.initRecyclerView(
|
||||
SmoothScrollLinearLayoutManager(view.context), recyclerViewAdapter, false
|
||||
)
|
||||
|
||||
recyclerViewAdapter.fastScroller = view.fast_scroller
|
||||
recyclerViewAdapter.mItemClickListener = this
|
||||
recyclerViewAdapter.mItemLongClickListener = this
|
||||
|
||||
view.swipeRefreshLayoutView.setOnRefreshListener {
|
||||
view.swipeRefreshLayoutView.isRefreshing = false
|
||||
viewModel.loadConversations()
|
||||
}
|
||||
view.swipeRefreshLayoutView.setColorSchemeResources(R.color.colorPrimary)
|
||||
|
||||
view.fast_scroller.setBubbleTextCreator { position ->
|
||||
var displayName =
|
||||
(recyclerViewAdapter.getItem(position) as ConversationItem).model.displayName
|
||||
|
||||
if (displayName!!.length > 8) {
|
||||
displayName = displayName.substring(0, 4) + "..."
|
||||
}
|
||||
|
||||
displayName
|
||||
}
|
||||
}
|
||||
|
||||
override fun onItemLongClick(position: Int) {
|
||||
|
@ -27,7 +27,7 @@ fun RecyclerView.initRecyclerView(
|
||||
adapter: RecyclerView.Adapter<out RecyclerView.ViewHolder>,
|
||||
hasFixedSize: Boolean = true
|
||||
) {
|
||||
this.layoutManager = layoutManager
|
||||
this.adapter = adapter
|
||||
this.layoutManager = layoutManager
|
||||
setHasFixedSize(hasFixedSize)
|
||||
}
|
@ -100,7 +100,7 @@ object DisplayUtils {
|
||||
fun getRoundedDrawable(drawable: Drawable?): Drawable {
|
||||
val bitmap = getBitmap(drawable!!)
|
||||
val drawable = runBlocking {
|
||||
return@runBlocking BitmapDrawable(CircleCropTransformation().transform(BitmapPool(10000), bitmap, OriginalSize))
|
||||
return@runBlocking BitmapDrawable(CircleCropTransformation().transform(BitmapPool(0), bitmap, OriginalSize))
|
||||
}
|
||||
|
||||
return drawable
|
||||
|
@ -24,38 +24,27 @@
|
||||
android:id="@+id/generic_rv_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:animateLayoutChanges="true"
|
||||
>
|
||||
android:animateLayoutChanges="true">
|
||||
|
||||
<include
|
||||
layout="@layout/view_states"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
/>
|
||||
android:layout_height="match_parent" />
|
||||
|
||||
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
|
||||
android:id="@+id/swipeRefreshLayoutView"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:visibility="visible"
|
||||
app:layout_behavior="com.nextcloud.talk.utils.FABAwareScrollingViewBehavior"
|
||||
>
|
||||
app:layout_behavior="com.nextcloud.talk.utils.FABAwareScrollingViewBehavior">
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/dataStateView"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:visibility="invisible"
|
||||
>
|
||||
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
android:id="@+id/recyclerView"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:listitem="@layout/rv_item_conversation_with_last_message"
|
||||
/>
|
||||
tools:listitem="@layout/rv_item_conversation_with_last_message" />
|
||||
|
||||
</FrameLayout>
|
||||
|
||||
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
|
||||
|
||||
@ -66,10 +55,9 @@
|
||||
android:layout_gravity="bottom|end"
|
||||
android:layout_margin="16dp"
|
||||
android:visibility="gone"
|
||||
app:srcCompat="@drawable/ic_add_white_24px"
|
||||
app:tint="@color/white"
|
||||
app:backgroundTint="@color/colorPrimary"
|
||||
/>
|
||||
app:srcCompat="@drawable/ic_add_white_24px"
|
||||
app:tint="@color/white" />
|
||||
|
||||
<include layout="@layout/fast_scroller" />
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user