diff --git a/app/src/main/java/com/nextcloud/talk/adapters/items/MentionAutocompleteItem.kt b/app/src/main/java/com/nextcloud/talk/adapters/items/MentionAutocompleteItem.kt index 7687ff923..20038f735 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/items/MentionAutocompleteItem.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/items/MentionAutocompleteItem.kt @@ -21,13 +21,14 @@ package com.nextcloud.talk.adapters.items import android.annotation.SuppressLint +import android.content.Context import android.view.View import coil.api.load -import coil.transform.CircleCropTransformation import com.nextcloud.talk.R import com.nextcloud.talk.application.NextcloudTalkApplication import com.nextcloud.talk.newarch.local.models.UserNgEntity import com.nextcloud.talk.newarch.local.models.getCredentials +import com.nextcloud.talk.newarch.utils.Images import com.nextcloud.talk.utils.ApiUtils import eu.davidea.flexibleadapter.FlexibleAdapter import eu.davidea.flexibleadapter.items.AbstractFlexibleItem @@ -40,7 +41,8 @@ class MentionAutocompleteItem( val objectId: String?, val displayName: String?, var source: String?, - private val currentUser: UserNgEntity + private val currentUser: UserNgEntity, + val context: Context ) : AbstractFlexibleItem(), IFilterable { override fun equals(other: Any?): Boolean { @@ -94,9 +96,7 @@ class MentionAutocompleteItem( } if (source == "calls") { - holder.avatarImageView!!.load(R.drawable.ic_people_group_white_24px) { - transformations(CircleCropTransformation()) - } + holder.avatarImageView?.load(Images().getImageWithBackground(context, R.drawable.ic_people_group_white_24px)) } else { var avatarId = objectId var avatarUrl = ApiUtils.getUrlForAvatarWithName( @@ -114,7 +114,6 @@ class MentionAutocompleteItem( holder.avatarImageView!!.load(avatarUrl) { addHeader("Authorization", currentUser.getCredentials()) - transformations(CircleCropTransformation()) } } } diff --git a/app/src/main/java/com/nextcloud/talk/adapters/items/UserItem.kt b/app/src/main/java/com/nextcloud/talk/adapters/items/UserItem.kt index b4e4324a7..f28209628 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/items/UserItem.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/items/UserItem.kt @@ -21,18 +21,22 @@ package com.nextcloud.talk.adapters.items import android.content.Context +import android.graphics.drawable.BitmapDrawable +import android.graphics.drawable.Drawable +import android.graphics.drawable.LayerDrawable import android.text.TextUtils import android.view.View import android.widget.ImageView import androidx.emoji.widget.EmojiTextView import androidx.recyclerview.widget.RecyclerView.ViewHolder import coil.api.load -import coil.transform.CircleCropTransformation +import com.google.android.material.imageview.ShapeableImageView import com.nextcloud.talk.R import com.nextcloud.talk.application.NextcloudTalkApplication import com.nextcloud.talk.models.json.converters.EnumParticipantTypeConverter import com.nextcloud.talk.models.json.participants.Participant import com.nextcloud.talk.newarch.local.models.UserNgEntity +import com.nextcloud.talk.newarch.utils.Images import com.nextcloud.talk.utils.ApiUtils import eu.davidea.flexibleadapter.FlexibleAdapter import eu.davidea.flexibleadapter.items.AbstractFlexibleItem @@ -147,24 +151,20 @@ class UserItem( holder.avatarImageView!!.load(ApiUtils.getUrlForAvatarWithNameForGuests( entity.baseUrl, displayName, R.dimen.avatar_size - )) { - transformations(CircleCropTransformation()) - } + )) } else { holder.avatarImageView!!.load(ApiUtils.getUrlForAvatarWithNameForGuests( entity.baseUrl, model.userId, R.dimen.avatar_size - )) { - transformations(CircleCropTransformation()) - } + )) } } else if ("groups" == model.source) { - holder.avatarImageView!!.load(R.drawable.ic_people_group_white_24px) { - transformations(CircleCropTransformation()) - } + holder.avatarImageView?.load(Images().getImageWithBackground(activityContext, R.drawable.ic_people_group_white_24px)) + } else if ("emails" == model.source) { + holder.avatarImageView?.load(Images().getImageWithBackground(activityContext, R.drawable.ic_baseline_email_24)) } val resources = activityContext.resources @@ -264,7 +264,7 @@ class UserItem( ) : FlexibleViewHolder(view, adapter) { var contactDisplayName: EmojiTextView? = null - var avatarImageView: ImageView? = null + var avatarImageView: ShapeableImageView? = null var contactMentionId: EmojiTextView? = null var voiceOrSimpleCallImageView: ImageView? = null var videoCallImageView: ImageView? = null diff --git a/app/src/main/java/com/nextcloud/talk/controllers/CallNotificationController.kt b/app/src/main/java/com/nextcloud/talk/controllers/CallNotificationController.kt index f299d6b20..3facd6c3b 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/CallNotificationController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/CallNotificationController.kt @@ -440,12 +440,12 @@ class CallNotificationController(private val originalBundle: Bundle) : BaseContr } Conversation.ConversationType.GROUP_CONVERSATION -> { - avatarImageView?.load(R.drawable.ic_people_group_white_24px) { + avatarImageView?.load(R.drawable.ic_people_group_white_24px_with_circle) { transformations(CircleCropTransformation()) } } Conversation.ConversationType.PUBLIC_CONVERSATION -> { - avatarImageView?.load(R.drawable.ic_link_white_24px) { + avatarImageView?.load(R.drawable.ic_link_white_24px_with_circle) { transformations(CircleCropTransformation()) } diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt index 0b497a90f..f874992cf 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt @@ -623,22 +623,26 @@ class ChatController(args: Bundle) : BaseController(), MessagesListAdapter } private fun setupMentionAutocomplete() { - val elevation = 6f - val backgroundDrawable = ColorDrawable(resources!!.getColor(R.color.bg_default)) - val presenter = MentionAutocompletePresenter(applicationContext!!, roomToken) - val callback = MentionAutocompleteCallback( - activity, - conversationUser, messageInput - ) + activity?.let { + resources?.let { resources -> + val elevation = 6f + val backgroundDrawable = ColorDrawable(resources.getColor(R.color.bg_default)) + val presenter = MentionAutocompletePresenter(it, roomToken) + val callback = MentionAutocompleteCallback( + activity, + conversationUser, messageInput + ) - if (mentionAutocomplete == null && messageInput != null) { - mentionAutocomplete = Autocomplete.on(messageInput) - .with(elevation) - .with(backgroundDrawable) - .with(MagicCharPolicy('@')) - .with(presenter) - .with(callback) - .build() + if (mentionAutocomplete == null && messageInput != null) { + mentionAutocomplete = Autocomplete.on(messageInput) + .with(elevation) + .with(backgroundDrawable) + .with(MagicCharPolicy('@')) + .with(presenter) + .with(callback) + .build() + } + } } } diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ContactsController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ContactsController.kt index 217b0f774..8fd717467 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ContactsController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ContactsController.kt @@ -100,8 +100,7 @@ import kotlin.String class ContactsController : BaseController, SearchView.OnQueryTextListener, FlexibleAdapter.OnItemClickListener, - FastScroller.OnScrollStateChangeListener, - FlexibleAdapter.EndlessScrollListener { + FastScroller.OnScrollStateChangeListener{ val usersRepository: UsersRepository by inject() val ncApi: NcApi by inject() @@ -144,8 +143,6 @@ class ContactsController : BaseController, private var contactItems: MutableList>? = null private var bottomSheet: BottomSheet? = null private var bottomSheetView: View? = null - private var currentPage: Int = 0 - private var currentSearchPage: Int = 0 private var layoutManager: SmoothScrollLinearLayoutManager? = null @@ -158,8 +155,6 @@ class ContactsController : BaseController, private var userHeaderItems = HashMap() private var alreadyFetching = false - private var canFetchFurther = true - private var canFetchSearchFurther = true private var doneMenuItem: MenuItem? = null @@ -247,8 +242,6 @@ class ContactsController : BaseController, adapter!!.setNotifyChangeOfUnfilteredItems(true) .mode = SelectableAdapter.Mode.MULTI - adapter!!.setEndlessScrollListener(this, ProgressItem()) - adapter!!.addListener(this) } @@ -456,52 +449,31 @@ class ContactsController : BaseController, private fun fetchData(startFromScratch: Boolean) { alreadyFetching = true - val shareeHashSet = HashSet() val autocompleteUsersHashSet = HashSet() userHeaderItems = HashMap() val query = adapter!!.getFilter(String::class.java) - val retrofitBucket: RetrofitBucket - var serverIs14OrUp = false - if (currentUser!!.hasSpreedFeatureCapability("last-room-activity")) { - // a hack to see if we're on 14 or not - retrofitBucket = - ApiUtils.getRetrofitBucketForContactsSearchFor14(currentUser!!.baseUrl, query) - serverIs14OrUp = true - } else { - retrofitBucket = ApiUtils.getRetrofitBucketForContactsSearch(currentUser!!.baseUrl, query) - } - - var page = 1 - if (!startFromScratch) { - if (TextUtils.isEmpty(query)) { - page = currentPage + 1 - } else { - page = currentSearchPage + 1 - } - } - + val retrofitBucket: RetrofitBucket = ApiUtils.getRetrofitBucketForContactsSearchFor14(currentUser!!.baseUrl, query) val modifiedQueryMap = HashMap(retrofitBucket.queryMap) - modifiedQueryMap["page"] = page - modifiedQueryMap["perPage"] = 100 + modifiedQueryMap["limit"] = 100 - var shareTypesList: MutableList? = null + var shareTypesList: MutableList = mutableListOf() + // user + shareTypesList.add("0") + // group + shareTypesList.add("1") + // remote + shareTypesList.add("7"); - if (serverIs14OrUp) { - shareTypesList = ArrayList() - // users - shareTypesList.add("0") - // groups - shareTypesList.add("1") - // mails - //shareTypesList.add("4"); - - modifiedQueryMap["shareTypes[]"] = shareTypesList + if (!isNewConversationView) { + modifiedQueryMap["itemId"] = "difz" + shareTypesList.add("4") } - val finalServerIs14OrUp = serverIs14OrUp + modifiedQueryMap["shareTypes[]"] = shareTypesList + ncApi.getContactsWithSearchParam( credentials, retrofitBucket.url, shareTypesList, modifiedQueryMap @@ -563,16 +535,6 @@ class ContactsController : BaseController, Log.e(TAG, "Parsing response body failed while getting contacts") } - if (TextUtils.isEmpty(modifiedQueryMap["search"] as CharSequence?)) { - canFetchFurther = - !shareeHashSet.isEmpty() || finalServerIs14OrUp && autocompleteUsersHashSet.size == 100 - currentPage = modifiedQueryMap["page"] as Int - } else { - canFetchSearchFurther = - !shareeHashSet.isEmpty() || finalServerIs14OrUp && autocompleteUsersHashSet.size == 100 - currentSearchPage = modifiedQueryMap["page"] as Int - } - userHeaderItems = HashMap() contactItems!!.addAll(newUserItemList) @@ -1007,23 +969,6 @@ class ContactsController : BaseController, } } - override fun noMoreLoad(newItemsSize: Int) {} - - override fun onLoadMore( - lastPosition: Int, - currentPage: Int - ) { - - if (!alreadyFetching && (searchView != null && searchView!!.isIconified && canFetchFurther || !TextUtils.isEmpty( - adapter!!.getFilter(String::class.java) - ) && canFetchSearchFurther) - ) { - fetchData(false) - } else { - adapter!!.onLoadMoreComplete(null) - } - } - companion object { val TAG = "ContactsController" 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 f7568c321..f7526de4c 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 @@ -293,7 +293,7 @@ fun createImageLoader( return ImageLoader(androidApplication) { availableMemoryPercentage(0.5) bitmapPoolPercentage(0.5) - crossfade(true) + crossfade(false) okHttpClient(okHttpClient) componentRegistry { if (SDK_INT >= P) { 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 b0cf24a62..3bb4809bd 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 @@ -21,8 +21,12 @@ package com.nextcloud.talk.newarch.utils import android.content.Context +import android.graphics.Bitmap import android.graphics.drawable.Drawable import android.graphics.drawable.LayerDrawable +import android.graphics.drawable.ScaleDrawable +import android.view.Gravity +import androidx.core.graphics.drawable.toBitmap import androidx.lifecycle.LifecycleOwner import coil.ImageLoader import coil.request.LoadRequest @@ -34,7 +38,6 @@ import com.nextcloud.talk.newarch.local.models.UserNgEntity import com.nextcloud.talk.newarch.local.models.getCredentials import com.nextcloud.talk.utils.DisplayUtils - class Images { fun getRequestForUrl( imageLoader: ImageLoader, @@ -65,15 +68,28 @@ class Images { } } + fun getImageWithBackground(context: Context, drawableId: Int): Bitmap { + val layers = arrayOfNulls(2) + layers[0] = context.getDrawable(R.color.bg_message_list_incoming_bubble) + var scale = 0.25f + if (drawableId == R.drawable.ic_baseline_email_24 || drawableId == R.drawable.ic_link_white_24px) { + scale = 0.5f + } + layers[1] = ScaleDrawable(context.getDrawable(drawableId), Gravity.CENTER, scale, scale) + layers[0]?.level = 0 + layers[1]?.level = 1 + return LayerDrawable(layers).toBitmap() + } + // returns null if it's one-to-one that you need to fetch yourself fun getImageForConversation(context: Context, conversation: Conversation): Drawable? { conversation.objectType?.let { objectType -> when (objectType) { "share:password" -> { - return DisplayUtils.getRoundedDrawable(context.getDrawable(R.drawable.ic_file_password_request)) + return DisplayUtils.getRoundedDrawableFromBitmap(getImageWithBackground(context, R.drawable.ic_file_password_request)) } "file" -> { - return DisplayUtils.getRoundedDrawable(context.getDrawable(R.drawable.ic_file_icon)) + return DisplayUtils.getRoundedDrawableFromBitmap(getImageWithBackground(context, R.drawable.ic_file_icon)) } else -> { } // do nothing @@ -85,10 +101,10 @@ class Images { return null } Conversation.ConversationType.GROUP_CONVERSATION -> { - return DisplayUtils.getRoundedDrawable(context.getDrawable(R.drawable.ic_people_group_white_24px)) + return DisplayUtils.getRoundedDrawableFromBitmap(getImageWithBackground(context, R.drawable.ic_people_group_white_24px)) } Conversation.ConversationType.PUBLIC_CONVERSATION -> { - return DisplayUtils.getRoundedDrawable(context.getDrawable(R.drawable.ic_link_white_24px)) + return DisplayUtils.getRoundedDrawableFromBitmap(getImageWithBackground(context, R.drawable.ic_link_white_24px)) } else -> { // we handle else as Conversation.ConversationType.SYSTEM_CONVERSATION for now diff --git a/app/src/main/java/com/nextcloud/talk/presenters/MentionAutocompletePresenter.kt b/app/src/main/java/com/nextcloud/talk/presenters/MentionAutocompletePresenter.kt index 5d2d9f395..6d639898d 100644 --- a/app/src/main/java/com/nextcloud/talk/presenters/MentionAutocompletePresenter.kt +++ b/app/src/main/java/com/nextcloud/talk/presenters/MentionAutocompletePresenter.kt @@ -96,7 +96,7 @@ class MentionAutocompletePresenter : RecyclerViewPresenter, FlexibleAd internalAbstractFlexibleItemList.add( MentionAutocompleteItem(mention.id, mention.label, mention.source, - currentUser!!)) + currentUser!!, internalContext)) } if (adapter!!.itemCount != 0) { adapter!!.clear() 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 6050b9af4..c576d0047 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/DisplayUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/DisplayUtils.kt @@ -97,6 +97,12 @@ object DisplayUtils { textView.movementMethod = LinkMovementMethod.getInstance() } + fun getRoundedDrawableFromBitmap(bitmap: Bitmap): Drawable { + return runBlocking { + return@runBlocking BitmapDrawable(CircleCropTransformation().transform(BitmapPool(0), bitmap, OriginalSize)) + } + } + fun getRoundedDrawable(drawable: Drawable?): Drawable { val bitmap = getBitmap(drawable!!) val drawable = runBlocking { @@ -225,7 +231,7 @@ object DisplayUtils { target(target) } } else { - Coil.load(context, R.drawable.ic_people_group_white_24px) { + Coil.load(context, R.drawable.ic_people_group_white_24px_with_circle) { transformations(CircleCropTransformation()) target(target) } diff --git a/app/src/main/res/drawable/ic_baseline_email_24.xml b/app/src/main/res/drawable/ic_baseline_email_24.xml new file mode 100644 index 000000000..31817c84e --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_email_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_file_icon.xml b/app/src/main/res/drawable/ic_file_icon.xml index c3d00688e..92940bdc9 100644 --- a/app/src/main/res/drawable/ic_file_icon.xml +++ b/app/src/main/res/drawable/ic_file_icon.xml @@ -21,9 +21,6 @@ - diff --git a/app/src/main/res/drawable/ic_file_password_request.xml b/app/src/main/res/drawable/ic_file_password_request.xml index f809f74f6..8e99d04fc 100644 --- a/app/src/main/res/drawable/ic_file_password_request.xml +++ b/app/src/main/res/drawable/ic_file_password_request.xml @@ -21,9 +21,6 @@ - diff --git a/app/src/main/res/drawable/ic_link_white_24px.xml b/app/src/main/res/drawable/ic_link_white_24px.xml index 44c11a81d..31b2fdd71 100644 --- a/app/src/main/res/drawable/ic_link_white_24px.xml +++ b/app/src/main/res/drawable/ic_link_white_24px.xml @@ -2,7 +2,7 @@ ~ Nextcloud Talk application ~ ~ @author Mario Danic - ~ Copyright (C) 2017-2019 Mario Danic + ~ Copyright (C) 2017-2018 Mario Danic ~ ~ This program is free software: you can redistribute it and/or modify ~ it under the terms of the GNU General Public License as published by @@ -18,15 +18,11 @@ ~ along with this program. If not, see . --> - - - - + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_link_white_24px_with_circle.xml b/app/src/main/res/drawable/ic_link_white_24px_with_circle.xml new file mode 100644 index 000000000..44c11a81d --- /dev/null +++ b/app/src/main/res/drawable/ic_link_white_24px_with_circle.xml @@ -0,0 +1,32 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_people_group_white_24px.xml b/app/src/main/res/drawable/ic_people_group_white_24px.xml index 7b16a39a0..8be1a0bc3 100644 --- a/app/src/main/res/drawable/ic_people_group_white_24px.xml +++ b/app/src/main/res/drawable/ic_people_group_white_24px.xml @@ -2,7 +2,7 @@ ~ Nextcloud Talk application ~ ~ @author Mario Danic - ~ Copyright (C) 2017-2019 Mario Danic + ~ Copyright (C) 2017-2018 Mario Danic ~ ~ This program is free software: you can redistribute it and/or modify ~ it under the terms of the GNU General Public License as published by @@ -22,10 +22,7 @@ android:autoMirrored="true" android:height="24dp" android:viewportHeight="24.0" android:viewportWidth="24.0" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android"> - - diff --git a/app/src/main/res/drawable/ic_people_group_white_24px_with_circle.xml b/app/src/main/res/drawable/ic_people_group_white_24px_with_circle.xml new file mode 100644 index 000000000..7b16a39a0 --- /dev/null +++ b/app/src/main/res/drawable/ic_people_group_white_24px_with_circle.xml @@ -0,0 +1,32 @@ + + + + + + diff --git a/app/src/main/res/layout/rv_item_contact.xml b/app/src/main/res/layout/rv_item_contact.xml index 5ed7c1ddb..dce514409 100644 --- a/app/src/main/res/layout/rv_item_contact.xml +++ b/app/src/main/res/layout/rv_item_contact.xml @@ -48,8 +48,9 @@ android:ellipsize="end" tools:text="Contact item text" /> - - diff --git a/app/src/main/res/layout/rv_item_mention.xml b/app/src/main/res/layout/rv_item_mention.xml index 16534d1ef..414e8da83 100644 --- a/app/src/main/res/layout/rv_item_mention.xml +++ b/app/src/main/res/layout/rv_item_mention.xml @@ -24,6 +24,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="@dimen/item_height" + xmlns:app="http://schemas.android.com/apk/res-auto" android:orientation="vertical"> - diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index b60e19126..044b5bf8b 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -68,4 +68,8 @@ @color/nc_incoming_text_default +