From b9503a08691de4d71c48beec0013d6cdc6d11517 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Thu, 2 Jan 2020 18:04:27 +0100 Subject: [PATCH] Better layouts --- app/build.gradle | 3 +- .../talk/adapters/items/ConversationItem.kt | 26 ++--- .../application/NextcloudTalkApplication.kt | 3 + .../talk/newarch/di/module/NetworkModule.kt | 5 +- .../ConversationsListView.kt | 98 +++++++++---------- .../talk/newarch/mvvm/ext/RecyclerView.kt | 2 +- .../com/nextcloud/talk/utils/DisplayUtils.kt | 2 +- .../layout/controller_conversations_rv.xml | 66 +++++-------- 8 files changed, 99 insertions(+), 106 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 933b35a37..d569ddf32 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -107,7 +107,8 @@ android { } release { - minifyEnabled false + minifyEnabled true + shrinkResources true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } diff --git a/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.kt b/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.kt index 6720fe538..0f3e25c52 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.kt @@ -199,18 +199,21 @@ class ConversationItem( holder.dialogLastMessage.setText(R.string.nc_no_messages_yet) } - val conversationDrawable: Drawable? = Images().getImageForConversation(context, model) - if (conversationDrawable != null) { - holder.dialogAvatar.load(conversationDrawable) - } else { - holder.dialogAvatar.load( - ApiUtils.getUrlForAvatarWithName( + holder.dialogAvatar.apply { + val conversationDrawable: Drawable? = Images().getImageForConversation(context, model) + + if (conversationDrawable != null) { + load(conversationDrawable) + } else { + if (model.name?.contains("marco") == false) { + load(ApiUtils.getUrlForAvatarWithName( user.baseUrl, - model.name, R.dimen.avatar_size - ) - ) { - addHeader("Authorization", user.getCredentials()) - transformations(CircleCropTransformation()) + model.name, R.dimen.avatar_size)) + { + addHeader("Authorization", user.getCredentials()) + transformations(CircleCropTransformation()) + } + } } } } @@ -227,6 +230,7 @@ class ConversationItem( view: View, adapter: FlexibleAdapter<*> ) : FlexibleViewHolder(view, adapter), LayoutContainer { + override val containerView: View? get() = itemView } diff --git a/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.kt b/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.kt index dd1403c86..660eb76fd 100644 --- a/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.kt +++ b/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.kt @@ -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() 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 05719669d..1a3fffa6f 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 @@ -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 { 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 a84992c89..774ae2280 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 @@ -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) { diff --git a/app/src/main/java/com/nextcloud/talk/newarch/mvvm/ext/RecyclerView.kt b/app/src/main/java/com/nextcloud/talk/newarch/mvvm/ext/RecyclerView.kt index cd38fc82f..dcfa311f0 100644 --- a/app/src/main/java/com/nextcloud/talk/newarch/mvvm/ext/RecyclerView.kt +++ b/app/src/main/java/com/nextcloud/talk/newarch/mvvm/ext/RecyclerView.kt @@ -27,7 +27,7 @@ fun RecyclerView.initRecyclerView( adapter: RecyclerView.Adapter, hasFixedSize: Boolean = true ) { - this.layoutManager = layoutManager this.adapter = adapter + this.layoutManager = layoutManager setHasFixedSize(hasFixedSize) } \ No newline at end of file diff --git a/app/src/main/java/com/nextcloud/talk/utils/DisplayUtils.kt b/app/src/main/java/com/nextcloud/talk/utils/DisplayUtils.kt index d1da10466..6050b9af4 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/DisplayUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/DisplayUtils.kt @@ -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 diff --git a/app/src/main/res/layout/controller_conversations_rv.xml b/app/src/main/res/layout/controller_conversations_rv.xml index edfacf3c1..0db8ed335 100644 --- a/app/src/main/res/layout/controller_conversations_rv.xml +++ b/app/src/main/res/layout/controller_conversations_rv.xml @@ -24,53 +24,41 @@ android:id="@+id/generic_rv_layout" android:layout_width="match_parent" android:layout_height="match_parent" - android:animateLayoutChanges="true" - > + android:animateLayoutChanges="true"> - + - - - + android:visibility="visible" + app:layout_behavior="com.nextcloud.talk.utils.FABAwareScrollingViewBehavior"> - - + - - + - + + +