Grid vs feed done
This commit is contained in:
parent
35948439e9
commit
ab959db5f1
|
@ -32,6 +32,7 @@ import org.pixeldroid.app.R
|
||||||
import org.pixeldroid.app.databinding.ActivityProfileBinding
|
import org.pixeldroid.app.databinding.ActivityProfileBinding
|
||||||
import org.pixeldroid.app.databinding.FragmentProfilePostsBinding
|
import org.pixeldroid.app.databinding.FragmentProfilePostsBinding
|
||||||
import org.pixeldroid.app.posts.PostActivity
|
import org.pixeldroid.app.posts.PostActivity
|
||||||
|
import org.pixeldroid.app.posts.StatusViewHolder
|
||||||
import org.pixeldroid.app.posts.feeds.initAdapter
|
import org.pixeldroid.app.posts.feeds.initAdapter
|
||||||
import org.pixeldroid.app.posts.feeds.launch
|
import org.pixeldroid.app.posts.feeds.launch
|
||||||
import org.pixeldroid.app.posts.feeds.uncachedFeeds.FeedViewModel
|
import org.pixeldroid.app.posts.feeds.uncachedFeeds.FeedViewModel
|
||||||
|
@ -73,16 +74,6 @@ class ProfileActivity : BaseThemedWithBarActivity() {
|
||||||
val account = intent.getSerializableExtra(Account.ACCOUNT_TAG) as Account?
|
val account = intent.getSerializableExtra(Account.ACCOUNT_TAG) as Account?
|
||||||
accountId = account?.id ?: user!!.user_id
|
accountId = account?.id ?: user!!.user_id
|
||||||
|
|
||||||
// get the view model
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
viewModel = ViewModelProvider(this, ProfileViewModelFactory(
|
|
||||||
ProfileContentRepository(
|
|
||||||
apiHolder.setToCurrentUser(),
|
|
||||||
accountId
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)[FeedViewModel::class.java] as FeedViewModel<Status>
|
|
||||||
|
|
||||||
val tabs = createSearchTabs(account)
|
val tabs = createSearchTabs(account)
|
||||||
setupTabs(tabs)
|
setupTabs(tabs)
|
||||||
setContent(account)
|
setContent(account)
|
||||||
|
@ -93,11 +84,15 @@ class ProfileActivity : BaseThemedWithBarActivity() {
|
||||||
val profileGridFragment = ProfileFeedFragment()
|
val profileGridFragment = ProfileFeedFragment()
|
||||||
val profileFeedFragment = ProfileFeedFragment()
|
val profileFeedFragment = ProfileFeedFragment()
|
||||||
val profileBookmarksFragment = ProfileFeedFragment() // TODO: bookmark fragment
|
val profileBookmarksFragment = ProfileFeedFragment() // TODO: bookmark fragment
|
||||||
val arguments = Bundle()
|
val argumentsGrid = Bundle()
|
||||||
arguments.putSerializable(Account.ACCOUNT_TAG, account)
|
val argumentsFeed = Bundle()
|
||||||
profileGridFragment.arguments = arguments
|
argumentsGrid.putSerializable(Account.ACCOUNT_TAG, account)
|
||||||
profileFeedFragment.arguments = arguments
|
argumentsFeed.putSerializable(Account.ACCOUNT_TAG, account)
|
||||||
profileBookmarksFragment.arguments = arguments
|
argumentsGrid.putSerializable(ProfileFeedFragment.PROFILE_GRID, true)
|
||||||
|
argumentsFeed.putSerializable(ProfileFeedFragment.PROFILE_GRID, false)
|
||||||
|
profileGridFragment.arguments = argumentsGrid
|
||||||
|
profileFeedFragment.arguments = argumentsFeed
|
||||||
|
profileBookmarksFragment.arguments = argumentsGrid
|
||||||
return arrayOf(
|
return arrayOf(
|
||||||
profileGridFragment,
|
profileGridFragment,
|
||||||
profileFeedFragment,
|
profileFeedFragment,
|
||||||
|
@ -363,20 +358,6 @@ class ProfileActivity : BaseThemedWithBarActivity() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
class ProfileViewModelFactory @ExperimentalPagingApi constructor(
|
|
||||||
private val searchContentRepository: UncachedContentRepository<Status>
|
|
||||||
) : ViewModelProvider.Factory {
|
|
||||||
|
|
||||||
override fun <T : ViewModel> create(modelClass: Class<T>): T {
|
|
||||||
if (modelClass.isAssignableFrom(FeedViewModel::class.java)) {
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
return FeedViewModel(searchContentRepository) as T
|
|
||||||
}
|
|
||||||
throw IllegalArgumentException("Unknown ViewModel class")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
class ProfilePostsViewHolder(binding: FragmentProfilePostsBinding) : RecyclerView.ViewHolder(binding.root) {
|
class ProfilePostsViewHolder(binding: FragmentProfilePostsBinding) : RecyclerView.ViewHolder(binding.root) {
|
||||||
private val postPreview: ImageView = binding.postPreview
|
private val postPreview: ImageView = binding.postPreview
|
||||||
private val albumIcon: ImageView = binding.albumIcon
|
private val albumIcon: ImageView = binding.albumIcon
|
||||||
|
@ -435,33 +416,3 @@ class ProfilePostsViewHolder(binding: FragmentProfilePostsBinding) : RecyclerVie
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
class ProfilePostsAdapter : PagingDataAdapter<Status, RecyclerView.ViewHolder>(
|
|
||||||
UIMODEL_COMPARATOR
|
|
||||||
) {
|
|
||||||
|
|
||||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
|
|
||||||
return ProfilePostsViewHolder.create(parent)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
|
|
||||||
val post = getItem(position)
|
|
||||||
|
|
||||||
post?.let {
|
|
||||||
(holder as ProfilePostsViewHolder).bind(it)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
companion object {
|
|
||||||
private val UIMODEL_COMPARATOR = object : DiffUtil.ItemCallback<Status>() {
|
|
||||||
override fun areItemsTheSame(oldItem: Status, newItem: Status): Boolean {
|
|
||||||
return oldItem.id == newItem.id
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun areContentsTheSame(oldItem: Status, newItem: Status): Boolean =
|
|
||||||
oldItem.content == newItem.content
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -4,26 +4,40 @@ import android.os.Bundle
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
|
import androidx.lifecycle.ViewModel
|
||||||
import androidx.lifecycle.ViewModelProvider
|
import androidx.lifecycle.ViewModelProvider
|
||||||
|
import androidx.lifecycle.lifecycleScope
|
||||||
import androidx.paging.ExperimentalPagingApi
|
import androidx.paging.ExperimentalPagingApi
|
||||||
|
import androidx.paging.PagingDataAdapter
|
||||||
|
import androidx.recyclerview.widget.DiffUtil
|
||||||
|
import androidx.recyclerview.widget.GridLayoutManager
|
||||||
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
|
import org.pixeldroid.app.posts.StatusViewHolder
|
||||||
import org.pixeldroid.app.posts.feeds.uncachedFeeds.*
|
import org.pixeldroid.app.posts.feeds.uncachedFeeds.*
|
||||||
import org.pixeldroid.app.posts.feeds.uncachedFeeds.profile.ProfileContentRepository
|
import org.pixeldroid.app.posts.feeds.uncachedFeeds.profile.ProfileContentRepository
|
||||||
import org.pixeldroid.app.utils.api.objects.Account
|
import org.pixeldroid.app.utils.api.objects.Account
|
||||||
import org.pixeldroid.app.utils.api.objects.Status
|
import org.pixeldroid.app.utils.api.objects.Status
|
||||||
import org.pixeldroid.app.utils.db.entities.UserDatabaseEntity
|
import org.pixeldroid.app.utils.db.entities.UserDatabaseEntity
|
||||||
|
import org.pixeldroid.app.utils.displayDimensionsInPx
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fragment to show a list of [Account]s, as a result of a search.
|
* Fragment to show a list of [Account]s, as a result of a search.
|
||||||
*/
|
*/
|
||||||
class ProfileFeedFragment : UncachedFeedFragment<Status>() {
|
class ProfileFeedFragment : UncachedFeedFragment<Status>() {
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
const val PROFILE_GRID = "ProfileGrid"
|
||||||
|
}
|
||||||
|
|
||||||
private lateinit var accountId : String
|
private lateinit var accountId : String
|
||||||
private var user: UserDatabaseEntity? = null
|
private var user: UserDatabaseEntity? = null
|
||||||
|
private var grid: Boolean = false
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
|
|
||||||
adapter = ProfilePostsAdapter()
|
grid = arguments?.getSerializable(PROFILE_GRID) as Boolean
|
||||||
|
adapter = ProfilePostsAdapter(grid)
|
||||||
|
|
||||||
//get the currently active user
|
//get the currently active user
|
||||||
user = db.userDao().getActiveUser()
|
user = db.userDao().getActiveUser()
|
||||||
|
@ -40,6 +54,10 @@ class ProfileFeedFragment : UncachedFeedFragment<Status>() {
|
||||||
|
|
||||||
val view = super.onCreateView(inflater, container, savedInstanceState)
|
val view = super.onCreateView(inflater, container, savedInstanceState)
|
||||||
|
|
||||||
|
if(grid) {
|
||||||
|
binding.list.layoutManager = GridLayoutManager(context, 3)
|
||||||
|
}
|
||||||
|
|
||||||
// Get the view model
|
// Get the view model
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
viewModel = ViewModelProvider(requireActivity(), ProfileViewModelFactory(
|
viewModel = ViewModelProvider(requireActivity(), ProfileViewModelFactory(
|
||||||
|
@ -55,4 +73,55 @@ class ProfileFeedFragment : UncachedFeedFragment<Status>() {
|
||||||
|
|
||||||
return view
|
return view
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private val UIMODEL_COMPARATOR = object : DiffUtil.ItemCallback<Status>() {
|
||||||
|
override fun areItemsTheSame(oldItem: Status, newItem: Status): Boolean {
|
||||||
|
return oldItem.id == newItem.id
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun areContentsTheSame(oldItem: Status, newItem: Status): Boolean =
|
||||||
|
oldItem.content == newItem.content
|
||||||
|
}
|
||||||
|
|
||||||
|
inner class ProfilePostsAdapter(
|
||||||
|
private val grid: Boolean
|
||||||
|
) : PagingDataAdapter<Status, RecyclerView.ViewHolder>(
|
||||||
|
UIMODEL_COMPARATOR
|
||||||
|
) {
|
||||||
|
|
||||||
|
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
|
||||||
|
return if(grid) {
|
||||||
|
ProfilePostsViewHolder.create(parent)
|
||||||
|
} else {
|
||||||
|
StatusViewHolder.create(parent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
|
||||||
|
val post = getItem(position)
|
||||||
|
|
||||||
|
post?.let {
|
||||||
|
if(grid) {
|
||||||
|
(holder as ProfilePostsViewHolder).bind(it)
|
||||||
|
} else {
|
||||||
|
(holder as StatusViewHolder).bind(it, apiHolder, db,
|
||||||
|
lifecycleScope, requireContext().displayDimensionsInPx())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class ProfileViewModelFactory @ExperimentalPagingApi constructor(
|
||||||
|
private val searchContentRepository: UncachedContentRepository<Status>
|
||||||
|
) : ViewModelProvider.Factory {
|
||||||
|
|
||||||
|
override fun <T : ViewModel> create(modelClass: Class<T>): T {
|
||||||
|
if (modelClass.isAssignableFrom(FeedViewModel::class.java)) {
|
||||||
|
@Suppress("UNCHECKED_CAST")
|
||||||
|
return FeedViewModel(searchContentRepository) as T
|
||||||
|
}
|
||||||
|
throw IllegalArgumentException("Unknown ViewModel class")
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -1,48 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent">
|
|
||||||
|
|
||||||
<ProgressBar
|
|
||||||
android:id="@+id/profileProgressBar"
|
|
||||||
style="?android:attr/progressBarStyle"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_gravity="center"
|
|
||||||
android:layout_marginTop="16dp" />
|
|
||||||
|
|
||||||
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
|
|
||||||
android:id="@+id/profileRefreshLayout"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
app:layout_behavior="@string/appbar_scrolling_view_behavior">
|
|
||||||
|
|
||||||
<androidx.constraintlayout.motion.widget.MotionLayout
|
|
||||||
android:id="@+id/motionLayout"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:layout_marginTop="8dp"
|
|
||||||
android:visibility="visible"
|
|
||||||
app:layoutDescription="@xml/error_layout_xml_error_scene">
|
|
||||||
|
|
||||||
<include
|
|
||||||
android:id="@+id/errorLayout"
|
|
||||||
layout="@layout/error_layout"
|
|
||||||
tools:layout_editor_absoluteX="50dp" />
|
|
||||||
|
|
||||||
<androidx.recyclerview.widget.RecyclerView
|
|
||||||
android:id="@+id/profilePostsRecyclerView"
|
|
||||||
android:visibility="visible"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
app:layoutManager="LinearLayoutManager"
|
|
||||||
app:layout_constraintTop_toBottomOf="@id/errorLayout"
|
|
||||||
tools:listitem="@layout/fragment_profile_posts" />
|
|
||||||
|
|
||||||
</androidx.constraintlayout.motion.widget.MotionLayout>
|
|
||||||
|
|
||||||
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
|
|
||||||
|
|
||||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
|
Loading…
Reference in New Issue