mini-reddit / app / src / main / java / edu / cs371m / reddit / ui / HomeFragment.kt
HomeFragment.kt
Raw
package edu.cs371m.reddit.ui

import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
import androidx.recyclerview.widget.StaggeredGridLayoutManager
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import edu.cs371m.reddit.MainActivity
import edu.cs371m.reddit.databinding.FragmentRvBinding

// XXX Write most of this file
class HomeFragment: Fragment() {
    // XXX initialize viewModel
    private val viewModel: MainViewModel by activityViewModels()
    private var _binding: FragmentRvBinding? = null
    // This property is only valid between onCreateView and onDestroyView.
    private val binding get() = _binding!!

    companion object {
        fun newInstance(): HomeFragment {
            return HomeFragment()
        }
    }

    // Set up the adapter
    private fun initAdapter(binding: FragmentRvBinding) : PostRowAdapter {
        val layoutManager = StaggeredGridLayoutManager(1, StaggeredGridLayoutManager.VERTICAL)
        binding.recyclerView.layoutManager = layoutManager
        val adapter = PostRowAdapter(viewModel)
        binding.recyclerView.adapter = adapter
        binding.recyclerView.itemAnimator = null
        return adapter
        //adapter.submitList(viewModel.observeSearchPosts().value)
        //adapter.notifyDataSetChanged()
    }

    private fun notifyWhenFragmentForegrounded(postRowAdapter: PostRowAdapter) {
        // When we return to our fragment, notifyDataSetChanged
        // to pick up modifications to the favorites list.  Maybe do more.
        postRowAdapter.notifyDataSetChanged()
    }

    private fun initSwipeLayout(swipe : SwipeRefreshLayout) {
        swipe.setOnRefreshListener {
            swipe.isRefreshing = false
            viewModel.refreshPosts()
        }
    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        _binding = FragmentRvBinding.inflate(inflater, container, false)
        return binding.root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        Log.d(javaClass.simpleName, "Main Frag created")
        // XXX Write me
        val adapter = initAdapter(_binding!!)
        initSwipeLayout(binding.swipeRefreshLayout)
        viewModel.refreshPosts()
        viewModel.refreshSubReddits()

        viewModel.observeSearchPosts().observe(viewLifecycleOwner) {
            val newFetchPost = viewModel.observeSearchPosts().value
            adapter.submitList(newFetchPost)
            adapter.notifyDataSetChanged()
        }

        // This part of the code works on mainFragment when we comes back "home"
        // a.k.a backStackEntryCount == 0
        (requireActivity() as MainActivity)
            .supportFragmentManager.addOnBackStackChangedListener {
                if ((requireActivity() as MainActivity)
                        .supportFragmentManager.backStackEntryCount == 0) {
                    viewModel.setTitleToSubreddit()
                    notifyWhenFragmentForegrounded(adapter)
                    (requireActivity() as MainActivity).supportActionBar?.setDisplayHomeAsUpEnabled(false)
                }
        }
    }

}