mirror of
https://github.com/TwidereProject/Twidere-Android
synced 2025-02-08 07:48:45 +01:00
fixed media timeline
This commit is contained in:
parent
d2521f9732
commit
f41b3ec549
@ -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
|
||||
|
@ -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<ParcelableUser>? {
|
||||
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
|
||||
|
@ -39,6 +39,8 @@ interface IUsersAdapter<in Data> : IContentAdapter {
|
||||
|
||||
val simpleLayout: Boolean
|
||||
|
||||
val showFollow: Boolean
|
||||
|
||||
fun setData(data: Data?): Boolean
|
||||
|
||||
fun getUser(position: Int): ParcelableUser?
|
||||
|
@ -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<UserKey>(EXTRA_ACCOUNT_KEY)
|
||||
val loader = IncomingFriendshipsLoader(context, accountKey, adapter.getData(), fromUser)
|
||||
loader.cursor = nextCursor
|
||||
|
@ -174,9 +174,12 @@ abstract class ParcelableUsersFragment : AbsContentListRecyclerViewFragment<Parc
|
||||
@Referral
|
||||
get() = null
|
||||
|
||||
protected val simpleLayout: Boolean
|
||||
protected open val simpleLayout: Boolean
|
||||
get() = arguments.getBoolean(EXTRA_SIMPLE_LAYOUT)
|
||||
|
||||
protected open val showFollow: Boolean
|
||||
get() = true
|
||||
|
||||
override fun onUserLongClick(holder: UserViewHolder, position: Int): Boolean {
|
||||
return true
|
||||
}
|
||||
|
@ -85,9 +85,6 @@ class MediaTimelineLoader(
|
||||
val result = ResponseList<Status>()
|
||||
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,
|
||||
|
@ -115,58 +115,61 @@ object ParcelableMediaUtils {
|
||||
mediaEntities: Array<MediaEntity>?, extendedMediaEntities: Array<MediaEntity>?,
|
||||
accountKey: UserKey, accountType: String): Array<ParcelableMedia> {
|
||||
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<out UrlEntity>?) {
|
||||
@ -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 {
|
||||
|
@ -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)
|
||||
}
|
||||
|
@ -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 {
|
||||
|
Loading…
x
Reference in New Issue
Block a user