fixed media timeline

This commit is contained in:
Mariotaku Lee 2017-04-07 14:09:00 +08:00
parent d2521f9732
commit f41b3ec549
No known key found for this signature in database
GPG Key ID: 15C10F89D7C33535
9 changed files with 100 additions and 114 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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