Better layouts

This commit is contained in:
Mario Danic 2020-01-02 18:04:27 +01:00
parent 436bdeb49f
commit b9503a0869
No known key found for this signature in database
GPG Key ID: CDE0BBD2738C4CC0
8 changed files with 99 additions and 106 deletions

View File

@ -107,7 +107,8 @@ android {
}
release {
minifyEnabled false
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}

View File

@ -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
}

View File

@ -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()

View File

@ -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 {

View File

@ -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) {

View File

@ -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)
}

View File

@ -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

View File

@ -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" />