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 showAccountsColor: Boolean = false
|
||||||
override var useStarsForLikes: Boolean = false
|
override var useStarsForLikes: Boolean = false
|
||||||
override var simpleLayout: Boolean = false
|
override var simpleLayout: Boolean = false
|
||||||
|
override var showFollow: Boolean = true
|
||||||
|
|
||||||
private var showCardActions: Boolean = false
|
private var showCardActions: Boolean = false
|
||||||
private var showingActionCardPosition = RecyclerView.NO_POSITION
|
private var showingActionCardPosition = RecyclerView.NO_POSITION
|
||||||
|
|
|
@ -46,6 +46,7 @@ class ParcelableUsersAdapter(
|
||||||
override var requestClickListener: IUsersAdapter.RequestClickListener? = null
|
override var requestClickListener: IUsersAdapter.RequestClickListener? = null
|
||||||
override var friendshipClickListener: IUsersAdapter.FriendshipClickListener? = null
|
override var friendshipClickListener: IUsersAdapter.FriendshipClickListener? = null
|
||||||
override var simpleLayout: Boolean = false
|
override var simpleLayout: Boolean = false
|
||||||
|
override var showFollow: Boolean = false
|
||||||
|
|
||||||
fun getData(): List<ParcelableUser>? {
|
fun getData(): List<ParcelableUser>? {
|
||||||
return data
|
return data
|
||||||
|
@ -167,7 +168,7 @@ class ParcelableUsersAdapter(
|
||||||
|
|
||||||
fun createUserViewHolder(adapter: IUsersAdapter<*>, inflater: LayoutInflater, parent: ViewGroup): UserViewHolder {
|
fun createUserViewHolder(adapter: IUsersAdapter<*>, inflater: LayoutInflater, parent: ViewGroup): UserViewHolder {
|
||||||
val view = inflater.inflate(R.layout.list_item_user, parent, false)
|
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.setOnClickListeners()
|
||||||
holder.setupViewOptions()
|
holder.setupViewOptions()
|
||||||
return holder
|
return holder
|
||||||
|
|
|
@ -39,6 +39,8 @@ interface IUsersAdapter<in Data> : IContentAdapter {
|
||||||
|
|
||||||
val simpleLayout: Boolean
|
val simpleLayout: Boolean
|
||||||
|
|
||||||
|
val showFollow: Boolean
|
||||||
|
|
||||||
fun setData(data: Data?): Boolean
|
fun setData(data: Data?): Boolean
|
||||||
|
|
||||||
fun getUser(position: Int): ParcelableUser?
|
fun getUser(position: Int): ParcelableUser?
|
||||||
|
|
|
@ -34,6 +34,7 @@ import org.mariotaku.twidere.util.Utils
|
||||||
import org.mariotaku.twidere.view.holder.UserViewHolder
|
import org.mariotaku.twidere.view.holder.UserViewHolder
|
||||||
|
|
||||||
class IncomingFriendshipsFragment : CursorUsersListFragment(), IUsersAdapter.RequestClickListener {
|
class IncomingFriendshipsFragment : CursorUsersListFragment(), IUsersAdapter.RequestClickListener {
|
||||||
|
override val showFollow: Boolean = false
|
||||||
|
|
||||||
override fun onCreateUsersLoader(context: Context, args: Bundle,
|
override fun onCreateUsersLoader(context: Context, args: Bundle,
|
||||||
fromUser: Boolean): CursorSupportUsersLoader {
|
fromUser: Boolean): CursorSupportUsersLoader {
|
||||||
|
|
|
@ -174,9 +174,12 @@ abstract class ParcelableUsersFragment : AbsContentListRecyclerViewFragment<Parc
|
||||||
@Referral
|
@Referral
|
||||||
get() = null
|
get() = null
|
||||||
|
|
||||||
protected val simpleLayout: Boolean
|
protected open val simpleLayout: Boolean
|
||||||
get() = arguments.getBoolean(EXTRA_SIMPLE_LAYOUT)
|
get() = arguments.getBoolean(EXTRA_SIMPLE_LAYOUT)
|
||||||
|
|
||||||
|
protected open val showFollow: Boolean
|
||||||
|
get() = true
|
||||||
|
|
||||||
override fun onUserLongClick(holder: UserViewHolder, position: Int): Boolean {
|
override fun onUserLongClick(holder: UserViewHolder, position: Int): Boolean {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
|
@ -85,9 +85,6 @@ class MediaTimelineLoader(
|
||||||
val result = ResponseList<Status>()
|
val result = ResponseList<Status>()
|
||||||
microBlog.search(query).filterTo(result) { status ->
|
microBlog.search(query).filterTo(result) { status ->
|
||||||
val user = status.user
|
val user = status.user
|
||||||
if (status.mediaEntities.isNullOrEmpty()) {
|
|
||||||
return@filterTo false
|
|
||||||
}
|
|
||||||
return@filterTo user.id == userKey?.id
|
return@filterTo user.id == userKey?.id
|
||||||
|| user.screenName.equals(this.screenName, ignoreCase = true)
|
|| user.screenName.equals(this.screenName, ignoreCase = true)
|
||||||
}
|
}
|
||||||
|
@ -110,6 +107,7 @@ class MediaTimelineLoader(
|
||||||
|
|
||||||
@WorkerThread
|
@WorkerThread
|
||||||
override fun shouldFilterStatus(database: SQLiteDatabase, status: ParcelableStatus): Boolean {
|
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
|
val retweetUserId = if (status.is_retweet) status.user_key else null
|
||||||
return !isMyTimeline && InternalTwitterContentUtils.isFiltered(database, retweetUserId,
|
return !isMyTimeline && InternalTwitterContentUtils.isFiltered(database, retweetUserId,
|
||||||
status.text_plain, status.quoted_text_plain, status.spans, status.quoted_spans,
|
status.text_plain, status.quoted_text_plain, status.spans, status.quoted_spans,
|
||||||
|
|
|
@ -115,19 +115,20 @@ object ParcelableMediaUtils {
|
||||||
mediaEntities: Array<MediaEntity>?, extendedMediaEntities: Array<MediaEntity>?,
|
mediaEntities: Array<MediaEntity>?, extendedMediaEntities: Array<MediaEntity>?,
|
||||||
accountKey: UserKey, accountType: String): Array<ParcelableMedia> {
|
accountKey: UserKey, accountType: String): Array<ParcelableMedia> {
|
||||||
if (card == null) return emptyArray()
|
if (card == null) return emptyArray()
|
||||||
val name = card.name
|
when (card.name) {
|
||||||
if ("animated_gif" == name || "player" == name) {
|
"animated_gif", "player" -> {
|
||||||
val media = ParcelableMedia()
|
val media = ParcelableMedia()
|
||||||
val playerStreamUrl = card.getBindingValue("player_stream_url")
|
val playerStreamUrl = card.getBindingValue("player_stream_url")
|
||||||
media.card = card.toParcelable(accountKey, accountType)
|
media.card = card.toParcelable(accountKey, accountType)
|
||||||
val appUrlResolved = card.getBindingValue("app_url_resolved") as CardEntity.StringValue
|
val appUrlResolved = card.getBindingValue("app_url_resolved") as? CardEntity.StringValue
|
||||||
media.url = if (checkUrl(appUrlResolved)) appUrlResolved.value else card.url
|
media.url = appUrlResolved?.takeIf { it.checkUrl() }?.value ?: card.url
|
||||||
if ("animated_gif" == name) {
|
if (playerStreamUrl is CardEntity.StringValue) {
|
||||||
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.media_url = playerStreamUrl.value
|
||||||
|
if ("animated_gif" == card.name) {
|
||||||
|
media.type = ParcelableMedia.Type.CARD_ANIMATED_GIF
|
||||||
|
} else {
|
||||||
media.type = ParcelableMedia.Type.VIDEO
|
media.type = ParcelableMedia.Type.VIDEO
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
val playerUrl = card.getBindingValue("player_url") as? CardEntity.StringValue
|
val playerUrl = card.getBindingValue("player_url") as? CardEntity.StringValue
|
||||||
if (playerUrl != null) {
|
if (playerUrl != null) {
|
||||||
|
@ -149,7 +150,8 @@ object ParcelableMediaUtils {
|
||||||
}
|
}
|
||||||
writeLinkInfo(media, urlEntities, mediaEntities, extendedMediaEntities)
|
writeLinkInfo(media, urlEntities, mediaEntities, extendedMediaEntities)
|
||||||
return arrayOf(media)
|
return arrayOf(media)
|
||||||
} else if ("summary_large_image" == name) {
|
}
|
||||||
|
"summary_large_image" -> {
|
||||||
val photoImageFullSize = card.getBindingValue("photo_image_full_size") as? CardEntity.ImageValue ?: return emptyArray()
|
val photoImageFullSize = card.getBindingValue("photo_image_full_size") as? CardEntity.ImageValue ?: return emptyArray()
|
||||||
|
|
||||||
val media = ParcelableMedia()
|
val media = ParcelableMedia()
|
||||||
|
@ -166,7 +168,8 @@ object ParcelableMediaUtils {
|
||||||
}
|
}
|
||||||
return arrayOf(media)
|
return arrayOf(media)
|
||||||
}
|
}
|
||||||
return emptyArray()
|
else -> return emptyArray()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun writeLinkInfo(media: ParcelableMedia, vararg entities: Array<out UrlEntity>?) {
|
private fun writeLinkInfo(media: ParcelableMedia, vararg entities: Array<out UrlEntity>?) {
|
||||||
|
@ -184,10 +187,10 @@ object ParcelableMediaUtils {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun checkUrl(value: CardEntity.StringValue?): Boolean {
|
@JvmStatic
|
||||||
if (value == null) return false
|
private fun CardEntity.StringValue.checkUrl(): Boolean {
|
||||||
val valueString = value.value
|
val value = this.value ?: return false
|
||||||
return valueString != null && (valueString.startsWith("http://") || valueString.startsWith("https://"))
|
return value != null && (value.startsWith("http://") || value.startsWith("https://"))
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getTypeInt(type: String): Int {
|
fun getTypeInt(type: String): Int {
|
||||||
|
|
|
@ -57,9 +57,7 @@ class MediaStatusViewHolder(private val adapter: IStatusesAdapter<*>, itemView:
|
||||||
|
|
||||||
override fun displayStatus(status: ParcelableStatus, displayInReplyTo: Boolean,
|
override fun displayStatus(status: ParcelableStatus, displayInReplyTo: Boolean,
|
||||||
displayPinned: Boolean) {
|
displayPinned: Boolean) {
|
||||||
val media = status.media ?: return
|
val context = itemView.context
|
||||||
if (media.isEmpty()) return
|
|
||||||
val firstMedia = media[0]
|
|
||||||
|
|
||||||
var displayEnd = -1
|
var displayEnd = -1
|
||||||
if (status.extras.display_text_range != null) {
|
if (status.extras.display_text_range != null) {
|
||||||
|
@ -71,16 +69,18 @@ class MediaStatusViewHolder(private val adapter: IStatusesAdapter<*>, itemView:
|
||||||
} else {
|
} else {
|
||||||
mediaTextView.text = status.text_unescaped
|
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)
|
aspectRatioSource.setSize(firstMedia.width, firstMedia.height)
|
||||||
mediaImageContainer.tag = firstMedia
|
mediaImageContainer.tag = firstMedia
|
||||||
mediaImageContainer.requestLayout()
|
mediaImageContainer.requestLayout()
|
||||||
|
|
||||||
mediaImageView.setHasPlayIcon(ParcelableMediaUtils.hasPlayIcon(firstMedia.type))
|
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
|
// TODO image loaded event and credentials
|
||||||
adapter.requestManager.load(firstMedia.preview_url).into(mediaImageView)
|
adapter.requestManager.load(firstMedia.preview_url).into(mediaImageView)
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,7 +24,7 @@ import android.text.TextUtils
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.View.OnClickListener
|
import android.view.View.OnClickListener
|
||||||
import android.view.View.OnLongClickListener
|
import android.view.View.OnLongClickListener
|
||||||
import android.widget.*
|
import android.widget.RelativeLayout
|
||||||
import kotlinx.android.synthetic.main.list_item_user.view.*
|
import kotlinx.android.synthetic.main.list_item_user.view.*
|
||||||
import org.mariotaku.twidere.R
|
import org.mariotaku.twidere.R
|
||||||
import org.mariotaku.twidere.adapter.iface.IUsersAdapter
|
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.model.util.UserKeyUtils
|
||||||
import org.mariotaku.twidere.util.Utils
|
import org.mariotaku.twidere.util.Utils
|
||||||
import org.mariotaku.twidere.util.Utils.getUserTypeIconRes
|
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.*
|
import java.util.*
|
||||||
|
|
||||||
class UserViewHolder(
|
class UserViewHolder(
|
||||||
itemView: View,
|
itemView: View,
|
||||||
private val adapter: IUsersAdapter<*>,
|
private val adapter: IUsersAdapter<*>,
|
||||||
private val simple: Boolean = false
|
private val simple: Boolean = false,
|
||||||
|
private val showFollow: Boolean = false
|
||||||
) : ViewHolder(itemView), OnClickListener, OnLongClickListener {
|
) : ViewHolder(itemView), OnClickListener, OnLongClickListener {
|
||||||
|
|
||||||
private val itemContent: IColorLabelView
|
private val itemContent = itemView.itemContent
|
||||||
val profileImageView: ProfileImageView
|
private val profileImageView = itemView.profileImage
|
||||||
val profileTypeView: ImageView
|
private val profileTypeView = itemView.profileType
|
||||||
private val nameView: NameView
|
private val nameView = itemView.name
|
||||||
private val externalIndicator: TextView
|
private val externalIndicator = itemView.externalIndicator
|
||||||
private val descriptionView: TextView
|
private val descriptionView = itemView.description
|
||||||
private val locationView: TextView
|
private val locationView = itemView.location
|
||||||
private val urlView: TextView
|
private val urlView = itemView.url
|
||||||
private val statusesCountView: TextView
|
private val statusesCountView = itemView.statusesCount
|
||||||
private val followersCountView: TextView
|
private val followersCountView = itemView.followersCount
|
||||||
private val friendsCountView: TextView
|
private val friendsCountView = itemView.friendsCount
|
||||||
|
|
||||||
private val acceptRequestButton: ImageButton
|
private val acceptRequestButton = itemView.acceptRequest
|
||||||
private val denyRequestButton: ImageButton
|
private val denyRequestButton = itemView.denyRequest
|
||||||
private val unblockButton: ImageButton
|
private val unblockButton = itemView.unblock
|
||||||
private val unmuteButton: ImageButton
|
private val unmuteButton = itemView.unmute
|
||||||
private val followButton: ImageButton
|
private val followButton = itemView.follow
|
||||||
private val actionsProgressContainer: View
|
private val actionsProgressContainer = itemView.actionsProgressContainer
|
||||||
private val actionsContainer: View
|
private val actionsContainer = itemView.actionsContainer
|
||||||
private val processingRequestProgress: View
|
private val processingRequestProgress = itemView.processingRequest
|
||||||
private val countsContainer: LinearLayout
|
private val countsContainer = itemView.countsContainer
|
||||||
|
|
||||||
private var userClickListener: UserClickListener? = null
|
private var userClickListener: UserClickListener? = null
|
||||||
private var requestClickListener: RequestClickListener? = null
|
private var requestClickListener: RequestClickListener? = null
|
||||||
|
@ -73,27 +71,6 @@ class UserViewHolder(
|
||||||
private var friendshipClickListener: FriendshipClickListener? = null
|
private var friendshipClickListener: FriendshipClickListener? = null
|
||||||
|
|
||||||
init {
|
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) {
|
if (simple) {
|
||||||
externalIndicator.visibility = View.GONE
|
externalIndicator.visibility = View.GONE
|
||||||
descriptionView.visibility = View.GONE
|
descriptionView.visibility = View.GONE
|
||||||
|
@ -169,12 +146,12 @@ class UserViewHolder(
|
||||||
denyRequestButton.visibility = View.GONE
|
denyRequestButton.visibility = View.GONE
|
||||||
}
|
}
|
||||||
if (friendshipClickListener != null && !isMySelf) {
|
if (friendshipClickListener != null && !isMySelf) {
|
||||||
if (user.extras?.blocking ?: false) {
|
if (showFollow && !(user.extras?.blocking ?: false)) {
|
||||||
followButton.visibility = View.GONE
|
|
||||||
unblockButton.visibility = View.VISIBLE
|
|
||||||
} else {
|
|
||||||
followButton.visibility = View.VISIBLE
|
followButton.visibility = View.VISIBLE
|
||||||
unblockButton.visibility = View.GONE
|
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
|
unmuteButton.visibility = if (user.extras?.muting ?: false) View.VISIBLE else View.GONE
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in New Issue