Twidere-App-Android-Twitter.../twidere/src/main/kotlin/org/mariotaku/twidere/fragment/ItemsListFragment.kt

197 lines
8.6 KiB
Kotlin
Raw Normal View History

2016-06-29 15:47:52 +02:00
package org.mariotaku.twidere.fragment
import android.content.Context
import android.content.Intent
import android.os.Bundle
2020-01-26 08:35:15 +01:00
import androidx.loader.app.LoaderManager.LoaderCallbacks
import androidx.loader.content.FixedAsyncTaskLoader
import androidx.loader.content.Loader
import androidx.recyclerview.widget.RecyclerView
2016-06-29 15:47:52 +02:00
import android.view.ContextMenu
import android.view.MenuInflater
import android.view.MenuItem
import android.view.View
import androidx.loader.app.LoaderManager
import com.bumptech.glide.RequestManager
2016-06-29 15:47:52 +02:00
import kotlinx.android.synthetic.main.fragment_content_recyclerview.*
2017-01-20 15:08:42 +01:00
import org.mariotaku.kpreferences.get
2016-06-29 15:47:52 +02:00
import org.mariotaku.twidere.R
import org.mariotaku.twidere.adapter.VariousItemsAdapter
import org.mariotaku.twidere.adapter.iface.IUsersAdapter
import org.mariotaku.twidere.constant.IntentConstants.EXTRA_ACCOUNT_KEY
2016-06-29 15:47:52 +02:00
import org.mariotaku.twidere.constant.IntentConstants.EXTRA_ITEMS
2017-01-20 15:08:42 +01:00
import org.mariotaku.twidere.constant.displaySensitiveContentsKey
import org.mariotaku.twidere.constant.newDocumentApiKey
import org.mariotaku.twidere.extension.model.prefixedHashtag
2017-02-13 17:44:56 +01:00
import org.mariotaku.twidere.fragment.AbsStatusesFragment.Companion.handleActionClick
import org.mariotaku.twidere.model.ParcelableHashtag
2016-06-29 15:47:52 +02:00
import org.mariotaku.twidere.model.ParcelableMedia
import org.mariotaku.twidere.model.UserKey
2016-06-29 15:47:52 +02:00
import org.mariotaku.twidere.util.IntentUtils
import org.mariotaku.twidere.util.MenuUtils
import org.mariotaku.twidere.util.Utils
import org.mariotaku.twidere.view.ExtendedRecyclerView
import org.mariotaku.twidere.view.holder.StatusViewHolder
import org.mariotaku.twidere.view.holder.UserViewHolder
import org.mariotaku.twidere.view.holder.iface.IStatusViewHolder
/**
* Created by mariotaku on 16/3/20.
*/
open class ItemsListFragment : AbsContentListRecyclerViewFragment<VariousItemsAdapter>(),
LoaderCallbacks<List<Any>?> {
protected val accountKey: UserKey?
2020-01-26 08:35:15 +01:00
get() = arguments?.getParcelable<UserKey?>(EXTRA_ACCOUNT_KEY)
2016-06-29 15:47:52 +02:00
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
registerForContextMenu(recyclerView)
LoaderManager.getInstance(this).initLoader(0, null, this)
2016-07-03 08:42:28 +02:00
refreshEnabled = false
showProgress()
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
when (requestCode) {
AbsStatusesFragment.REQUEST_FAVORITE_SELECT_ACCOUNT,
AbsStatusesFragment.REQUEST_RETWEET_SELECT_ACCOUNT -> {
AbsStatusesFragment.handleActionActivityResult(this, requestCode, resultCode, data)
}
}
2016-06-29 15:47:52 +02:00
}
override fun onCreateAdapter(context: Context, requestManager: RequestManager): VariousItemsAdapter {
val adapter = VariousItemsAdapter(context, requestManager)
2016-06-29 15:47:52 +02:00
val dummyItemAdapter = adapter.dummyAdapter
2017-01-17 18:59:44 +01:00
dummyItemAdapter.statusClickListener = object : IStatusViewHolder.StatusClickListener {
2016-06-29 15:47:52 +02:00
override fun onStatusClick(holder: IStatusViewHolder, position: Int) {
val status = dummyItemAdapter.getStatus(position)
2020-01-26 08:35:15 +01:00
getContext()?.let {
IntentUtils.openStatus(it, status, null)
}
2016-06-29 15:47:52 +02:00
}
2017-01-17 18:59:44 +01:00
override fun onQuotedStatusClick(holder: IStatusViewHolder, position: Int) {
val status = dummyItemAdapter.getStatus(position)
2020-01-26 08:35:15 +01:00
getContext()?.let { IntentUtils.openStatus(it, status.account_key, status.quoted_id) }
2017-01-17 18:59:44 +01:00
}
2016-06-29 15:47:52 +02:00
override fun onItemActionClick(holder: RecyclerView.ViewHolder, id: Int, position: Int) {
val status = dummyItemAdapter.getStatus(position)
2017-04-12 10:17:20 +02:00
handleActionClick(this@ItemsListFragment, id, status, holder as StatusViewHolder)
2016-06-29 15:47:52 +02:00
}
override fun onItemActionLongClick(holder: RecyclerView.ViewHolder, id: Int, position: Int): Boolean {
val status = dummyItemAdapter.getStatus(position)
return AbsStatusesFragment.handleActionLongClick(this@ItemsListFragment, status,
adapter.getItemId(position), id)
}
2016-06-29 15:47:52 +02:00
override fun onItemMenuClick(holder: RecyclerView.ViewHolder, menuView: View, position: Int) {
if (activity == null) return
val view = layoutManager.findViewByPosition(position) ?: return
2016-06-29 15:47:52 +02:00
recyclerView.showContextMenuForChild(view)
}
2017-02-28 03:37:03 +01:00
override fun onMediaClick(holder: IStatusViewHolder, view: View, current: ParcelableMedia, statusPosition: Int) {
val status = dummyItemAdapter.getStatus(statusPosition)
2020-01-26 08:35:15 +01:00
activity?.let {
IntentUtils.openMedia(it, status, current, preferences[newDocumentApiKey], preferences[displaySensitiveContentsKey],
null)
}
2016-06-29 15:47:52 +02:00
}
override fun onUserProfileClick(holder: IStatusViewHolder, position: Int) {
val activity = activity
val status = dummyItemAdapter.getStatus(position)
2020-01-26 08:35:15 +01:00
if (activity != null) {
IntentUtils.openUserProfile(activity, status.account_key, status.user_key,
status.user_screen_name, status.extras?.user_statusnet_profile_url,
preferences[newDocumentApiKey])
}
2016-06-29 15:47:52 +02:00
}
}
dummyItemAdapter.userClickListener = object : IUsersAdapter.SimpleUserClickListener() {
override fun onUserClick(holder: UserViewHolder, position: Int) {
val user = dummyItemAdapter.getUser(position) ?: return
IntentUtils.openUserProfile(context, user, preferences[newDocumentApiKey],
2017-08-28 06:31:19 +02:00
null)
2016-06-29 15:47:52 +02:00
}
}
adapter.hashtagClickListener = { position ->
val hashtag = adapter.getItem(position) as ParcelableHashtag
IntentUtils.openTweetSearch(context, accountKey, hashtag.prefixedHashtag)
}
return adapter
}
override fun onCreateLoader(id: Int, args: Bundle?): Loader<List<Any>?> {
return ItemsLoader(requireContext(), requireArguments())
2016-06-29 15:47:52 +02:00
}
2019-10-24 17:52:11 +02:00
final override fun onLoadFinished(loader: Loader<List<Any>?>, data: List<Any>?) {
adapter.setData(data)
showContent()
2016-06-29 15:47:52 +02:00
}
override fun onLoaderReset(loader: Loader<List<Any>?>) {
adapter.setData(null)
2016-06-29 15:47:52 +02:00
}
2016-07-03 08:42:28 +02:00
override var refreshing: Boolean
2016-06-29 15:47:52 +02:00
get() = false
2016-07-03 08:42:28 +02:00
set(value) {
}
2016-06-29 15:47:52 +02:00
override fun onCreateContextMenu(menu: ContextMenu, v: View, menuInfo: ContextMenu.ContextMenuInfo?) {
if (!userVisibleHint || menuInfo == null) return
val inflater = MenuInflater(context)
val contextMenuInfo = menuInfo as ExtendedRecyclerView.ContextMenuInfo?
val position = contextMenuInfo!!.position
when (adapter.getItemViewType(position)) {
2016-06-29 15:47:52 +02:00
VariousItemsAdapter.VIEW_TYPE_STATUS -> {
val dummyAdapter = adapter.dummyAdapter
val status = dummyAdapter.getStatus(contextMenuInfo.position)
2016-06-29 15:47:52 +02:00
inflater.inflate(R.menu.action_status, menu)
2020-01-26 08:35:15 +01:00
context?.let {
MenuUtils.setupForStatus(it, menu, preferences, twitterWrapper,
userColorNameManager, status)
}
2016-06-29 15:47:52 +02:00
}
}
}
2017-04-12 10:17:20 +02:00
override fun onContextItemSelected(item: MenuItem): Boolean {
2016-06-29 15:47:52 +02:00
if (!userVisibleHint) return false
2017-04-12 10:17:20 +02:00
val contextMenuInfo = item.menuInfo as ExtendedRecyclerView.ContextMenuInfo
2016-06-29 15:47:52 +02:00
val position = contextMenuInfo.position
when (adapter.getItemViewType(position)) {
2016-06-29 15:47:52 +02:00
VariousItemsAdapter.VIEW_TYPE_STATUS -> {
val dummyAdapter = adapter.dummyAdapter
val status = dummyAdapter.getStatus(position)
2016-06-29 15:47:52 +02:00
if (item.itemId == R.id.share) {
2020-01-26 08:35:15 +01:00
val shareIntent = activity?.let { Utils.createStatusShareIntent(it, status) }
2016-06-29 15:47:52 +02:00
val chooser = Intent.createChooser(shareIntent, getString(R.string.share_status))
startActivity(chooser)
return true
}
return MenuUtils.handleStatusClick(requireActivity(), this, parentFragmentManager,
2017-04-12 10:17:20 +02:00
preferences, userColorNameManager, twitterWrapper, status, item)
2016-06-29 15:47:52 +02:00
}
}
return false
}
class ItemsLoader(context: Context, private val arguments: Bundle) : FixedAsyncTaskLoader<List<Any>>(context) {
2016-06-29 15:47:52 +02:00
override fun loadInBackground(): List<Any> {
2019-11-20 07:10:24 +01:00
return arguments.getParcelableArrayList(EXTRA_ITEMS)!!
2016-06-29 15:47:52 +02:00
}
override fun onStartLoading() {
forceLoad()
}
}
}