diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/adapter/DummyItemAdapter.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/adapter/DummyItemAdapter.kt index d2a707415..389521702 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/adapter/DummyItemAdapter.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/adapter/DummyItemAdapter.kt @@ -58,6 +58,7 @@ class DummyItemAdapter( override var showAccountsColor: Boolean = false override var useStarsForLikes: Boolean = false override var simpleLayout: Boolean = false + override var showFollow: Boolean = true private var showCardActions: Boolean = false private var showingActionCardPosition = RecyclerView.NO_POSITION diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/adapter/ParcelableUsersAdapter.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/adapter/ParcelableUsersAdapter.kt index 198dd63dd..948550d67 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/adapter/ParcelableUsersAdapter.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/adapter/ParcelableUsersAdapter.kt @@ -46,6 +46,7 @@ class ParcelableUsersAdapter( override var requestClickListener: IUsersAdapter.RequestClickListener? = null override var friendshipClickListener: IUsersAdapter.FriendshipClickListener? = null override var simpleLayout: Boolean = false + override var showFollow: Boolean = false fun getData(): List? { return data @@ -167,7 +168,7 @@ class ParcelableUsersAdapter( fun createUserViewHolder(adapter: IUsersAdapter<*>, inflater: LayoutInflater, parent: ViewGroup): UserViewHolder { val view = inflater.inflate(R.layout.list_item_user, parent, false) - val holder = UserViewHolder(view, adapter, adapter.simpleLayout) + val holder = UserViewHolder(view, adapter, adapter.simpleLayout, adapter.showFollow) holder.setOnClickListeners() holder.setupViewOptions() return holder diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/adapter/iface/IUsersAdapter.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/adapter/iface/IUsersAdapter.kt index e73adeed5..55744ed3d 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/adapter/iface/IUsersAdapter.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/adapter/iface/IUsersAdapter.kt @@ -39,6 +39,8 @@ interface IUsersAdapter : IContentAdapter { val simpleLayout: Boolean + val showFollow: Boolean + fun setData(data: Data?): Boolean fun getUser(position: Int): ParcelableUser? diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/IncomingFriendshipsFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/IncomingFriendshipsFragment.kt index a7d9c1830..fb8af60f2 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/IncomingFriendshipsFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/IncomingFriendshipsFragment.kt @@ -34,9 +34,10 @@ import org.mariotaku.twidere.util.Utils import org.mariotaku.twidere.view.holder.UserViewHolder class IncomingFriendshipsFragment : CursorUsersListFragment(), IUsersAdapter.RequestClickListener { + override val showFollow: Boolean = false override fun onCreateUsersLoader(context: Context, args: Bundle, - fromUser: Boolean): CursorSupportUsersLoader { + fromUser: Boolean): CursorSupportUsersLoader { val accountKey = args.getParcelable(EXTRA_ACCOUNT_KEY) val loader = IncomingFriendshipsLoader(context, accountKey, adapter.getData(), fromUser) loader.cursor = nextCursor diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/ParcelableUsersFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/ParcelableUsersFragment.kt index 8c6a440aa..1f7bed416 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/ParcelableUsersFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/ParcelableUsersFragment.kt @@ -174,9 +174,12 @@ abstract class ParcelableUsersFragment : AbsContentListRecyclerViewFragment() microBlog.search(query).filterTo(result) { status -> val user = status.user - if (status.mediaEntities.isNullOrEmpty()) { - return@filterTo false - } return@filterTo user.id == userKey?.id || user.screenName.equals(this.screenName, ignoreCase = true) } @@ -110,6 +107,7 @@ class MediaTimelineLoader( @WorkerThread override fun shouldFilterStatus(database: SQLiteDatabase, status: ParcelableStatus): Boolean { + if (status.media.isNullOrEmpty()) return false val retweetUserId = if (status.is_retweet) status.user_key else null return !isMyTimeline && InternalTwitterContentUtils.isFiltered(database, retweetUserId, status.text_plain, status.quoted_text_plain, status.spans, status.quoted_spans, diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/model/util/ParcelableMediaUtils.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/model/util/ParcelableMediaUtils.kt index 56a214f0f..f24f9d0af 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/model/util/ParcelableMediaUtils.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/model/util/ParcelableMediaUtils.kt @@ -115,58 +115,61 @@ object ParcelableMediaUtils { mediaEntities: Array?, extendedMediaEntities: Array?, accountKey: UserKey, accountType: String): Array { if (card == null) return emptyArray() - val name = card.name - if ("animated_gif" == name || "player" == name) { - val media = ParcelableMedia() - val playerStreamUrl = card.getBindingValue("player_stream_url") - media.card = card.toParcelable(accountKey, accountType) - val appUrlResolved = card.getBindingValue("app_url_resolved") as CardEntity.StringValue - media.url = if (checkUrl(appUrlResolved)) appUrlResolved.value else card.url - if ("animated_gif" == name) { - media.media_url = (playerStreamUrl as CardEntity.StringValue).value - media.type = ParcelableMedia.Type.CARD_ANIMATED_GIF - } else if (playerStreamUrl is CardEntity.StringValue) { - media.media_url = playerStreamUrl.value - media.type = ParcelableMedia.Type.VIDEO - } else { - val playerUrl = card.getBindingValue("player_url") as? CardEntity.StringValue - if (playerUrl != null) { - media.media_url = playerUrl.value + when (card.name) { + "animated_gif", "player" -> { + val media = ParcelableMedia() + val playerStreamUrl = card.getBindingValue("player_stream_url") + media.card = card.toParcelable(accountKey, accountType) + val appUrlResolved = card.getBindingValue("app_url_resolved") as? CardEntity.StringValue + media.url = appUrlResolved?.takeIf { it.checkUrl() }?.value ?: card.url + if (playerStreamUrl is CardEntity.StringValue) { + media.media_url = playerStreamUrl.value + if ("animated_gif" == card.name) { + media.type = ParcelableMedia.Type.CARD_ANIMATED_GIF + } else { + media.type = ParcelableMedia.Type.VIDEO + } + } else { + val playerUrl = card.getBindingValue("player_url") as? CardEntity.StringValue + if (playerUrl != null) { + media.media_url = playerUrl.value + } + media.type = ParcelableMedia.Type.EXTERNAL_PLAYER } - media.type = ParcelableMedia.Type.EXTERNAL_PLAYER + val playerImage = card.getBindingValue("player_image") + if (playerImage is CardEntity.ImageValue) { + media.preview_url = playerImage.url + media.width = playerImage.width + media.height = playerImage.height + } + val playerWidth = card.getBindingValue("player_width") + val playerHeight = card.getBindingValue("player_height") + if (playerWidth is CardEntity.StringValue && playerHeight is CardEntity.StringValue) { + media.width = playerWidth.value.toIntOr(-1) + media.height = playerHeight.value.toIntOr(-1) + } + writeLinkInfo(media, urlEntities, mediaEntities, extendedMediaEntities) + return arrayOf(media) } - val playerImage = card.getBindingValue("player_image") - if (playerImage is CardEntity.ImageValue) { - media.preview_url = playerImage.url - media.width = playerImage.width - media.height = playerImage.height - } - val playerWidth = card.getBindingValue("player_width") - val playerHeight = card.getBindingValue("player_height") - if (playerWidth is CardEntity.StringValue && playerHeight is CardEntity.StringValue) { - media.width = playerWidth.value.toIntOr(-1) - media.height = playerHeight.value.toIntOr(-1) - } - writeLinkInfo(media, urlEntities, mediaEntities, extendedMediaEntities) - return arrayOf(media) - } else if ("summary_large_image" == name) { - val photoImageFullSize = card.getBindingValue("photo_image_full_size") as? CardEntity.ImageValue ?: return emptyArray() + "summary_large_image" -> { + val photoImageFullSize = card.getBindingValue("photo_image_full_size") as? CardEntity.ImageValue ?: return emptyArray() - val media = ParcelableMedia() - media.url = card.url - media.card = card.toParcelable(accountKey, accountType) - media.type = ParcelableMedia.Type.IMAGE - media.media_url = photoImageFullSize.url - media.width = photoImageFullSize.width - media.height = photoImageFullSize.height - media.open_browser = true - val summaryPhotoImage = card.getBindingValue("summary_photo_image") - if (summaryPhotoImage is CardEntity.ImageValue) { - media.preview_url = summaryPhotoImage.url + val media = ParcelableMedia() + media.url = card.url + media.card = card.toParcelable(accountKey, accountType) + media.type = ParcelableMedia.Type.IMAGE + media.media_url = photoImageFullSize.url + media.width = photoImageFullSize.width + media.height = photoImageFullSize.height + media.open_browser = true + val summaryPhotoImage = card.getBindingValue("summary_photo_image") + if (summaryPhotoImage is CardEntity.ImageValue) { + media.preview_url = summaryPhotoImage.url + } + return arrayOf(media) } - return arrayOf(media) + else -> return emptyArray() } - return emptyArray() } private fun writeLinkInfo(media: ParcelableMedia, vararg entities: Array?) { @@ -184,10 +187,10 @@ object ParcelableMediaUtils { } } - private fun checkUrl(value: CardEntity.StringValue?): Boolean { - if (value == null) return false - val valueString = value.value - return valueString != null && (valueString.startsWith("http://") || valueString.startsWith("https://")) + @JvmStatic + private fun CardEntity.StringValue.checkUrl(): Boolean { + val value = this.value ?: return false + return value != null && (value.startsWith("http://") || value.startsWith("https://")) } fun getTypeInt(type: String): Int { diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/view/holder/MediaStatusViewHolder.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/view/holder/MediaStatusViewHolder.kt index 9f40aac79..cff3eda15 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/view/holder/MediaStatusViewHolder.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/view/holder/MediaStatusViewHolder.kt @@ -57,9 +57,7 @@ class MediaStatusViewHolder(private val adapter: IStatusesAdapter<*>, itemView: override fun displayStatus(status: ParcelableStatus, displayInReplyTo: Boolean, displayPinned: Boolean) { - val media = status.media ?: return - if (media.isEmpty()) return - val firstMedia = media[0] + val context = itemView.context var displayEnd = -1 if (status.extras.display_text_range != null) { @@ -71,16 +69,18 @@ class MediaStatusViewHolder(private val adapter: IStatusesAdapter<*>, itemView: } else { mediaTextView.text = status.text_unescaped } + adapter.requestManager.loadProfileImage(context, status, + adapter.profileImageStyle, profileImageView.cornerRadius, + profileImageView.cornerRadiusRatio).into(profileImageView) + + val firstMedia = status.media?.firstOrNull() ?: return aspectRatioSource.setSize(firstMedia.width, firstMedia.height) mediaImageContainer.tag = firstMedia mediaImageContainer.requestLayout() mediaImageView.setHasPlayIcon(ParcelableMediaUtils.hasPlayIcon(firstMedia.type)) - val context = itemView.context - adapter.requestManager.loadProfileImage(context, status, - adapter.profileImageStyle, profileImageView.cornerRadius, - profileImageView.cornerRadiusRatio).into(profileImageView) + // TODO image loaded event and credentials adapter.requestManager.load(firstMedia.preview_url).into(mediaImageView) } diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/view/holder/UserViewHolder.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/view/holder/UserViewHolder.kt index 1cae0527c..2fe6a15ea 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/view/holder/UserViewHolder.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/view/holder/UserViewHolder.kt @@ -24,7 +24,7 @@ import android.text.TextUtils import android.view.View import android.view.View.OnClickListener import android.view.View.OnLongClickListener -import android.widget.* +import android.widget.RelativeLayout import kotlinx.android.synthetic.main.list_item_user.view.* import org.mariotaku.twidere.R import org.mariotaku.twidere.adapter.iface.IUsersAdapter @@ -34,38 +34,36 @@ import org.mariotaku.twidere.model.ParcelableUser import org.mariotaku.twidere.model.util.UserKeyUtils import org.mariotaku.twidere.util.Utils import org.mariotaku.twidere.util.Utils.getUserTypeIconRes -import org.mariotaku.twidere.view.NameView -import org.mariotaku.twidere.view.ProfileImageView -import org.mariotaku.twidere.view.iface.IColorLabelView import java.util.* class UserViewHolder( itemView: View, private val adapter: IUsersAdapter<*>, - private val simple: Boolean = false + private val simple: Boolean = false, + private val showFollow: Boolean = false ) : ViewHolder(itemView), OnClickListener, OnLongClickListener { - private val itemContent: IColorLabelView - val profileImageView: ProfileImageView - val profileTypeView: ImageView - private val nameView: NameView - private val externalIndicator: TextView - private val descriptionView: TextView - private val locationView: TextView - private val urlView: TextView - private val statusesCountView: TextView - private val followersCountView: TextView - private val friendsCountView: TextView + private val itemContent = itemView.itemContent + private val profileImageView = itemView.profileImage + private val profileTypeView = itemView.profileType + private val nameView = itemView.name + private val externalIndicator = itemView.externalIndicator + private val descriptionView = itemView.description + private val locationView = itemView.location + private val urlView = itemView.url + private val statusesCountView = itemView.statusesCount + private val followersCountView = itemView.followersCount + private val friendsCountView = itemView.friendsCount - private val acceptRequestButton: ImageButton - private val denyRequestButton: ImageButton - private val unblockButton: ImageButton - private val unmuteButton: ImageButton - private val followButton: ImageButton - private val actionsProgressContainer: View - private val actionsContainer: View - private val processingRequestProgress: View - private val countsContainer: LinearLayout + private val acceptRequestButton = itemView.acceptRequest + private val denyRequestButton = itemView.denyRequest + private val unblockButton = itemView.unblock + private val unmuteButton = itemView.unmute + private val followButton = itemView.follow + private val actionsProgressContainer = itemView.actionsProgressContainer + private val actionsContainer = itemView.actionsContainer + private val processingRequestProgress = itemView.processingRequest + private val countsContainer = itemView.countsContainer private var userClickListener: UserClickListener? = null private var requestClickListener: RequestClickListener? = null @@ -73,27 +71,6 @@ class UserViewHolder( private var friendshipClickListener: FriendshipClickListener? = null init { - itemContent = itemView.itemContent - profileImageView = itemView.profileImage - profileTypeView = itemView.profileType - nameView = itemView.name - externalIndicator = itemView.externalIndicator - descriptionView = itemView.description - locationView = itemView.location - urlView = itemView.url - statusesCountView = itemView.statusesCount - followersCountView = itemView.followersCount - friendsCountView = itemView.friendsCount - actionsProgressContainer = itemView.actionsProgressContainer - actionsContainer = itemView.actionsContainer - acceptRequestButton = itemView.acceptRequest - denyRequestButton = itemView.denyRequest - unblockButton = itemView.unblock - unmuteButton = itemView.unmute - followButton = itemView.follow - countsContainer = itemView.countsContainer - processingRequestProgress = itemView.findViewById(R.id.processingRequest) - if (simple) { externalIndicator.visibility = View.GONE descriptionView.visibility = View.GONE @@ -169,12 +146,12 @@ class UserViewHolder( denyRequestButton.visibility = View.GONE } if (friendshipClickListener != null && !isMySelf) { - if (user.extras?.blocking ?: false) { - followButton.visibility = View.GONE - unblockButton.visibility = View.VISIBLE - } else { + if (showFollow && !(user.extras?.blocking ?: false)) { followButton.visibility = View.VISIBLE unblockButton.visibility = View.GONE + } else { + followButton.visibility = View.GONE + unblockButton.visibility = View.VISIBLE } unmuteButton.visibility = if (user.extras?.muting ?: false) View.VISIBLE else View.GONE } else {