Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Blog details page created #81

Merged
merged 3 commits into from
Jan 6, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,8 @@ object Constants {
const val Email = "email"
const val About = "about"

/**
* Other useful constants
*/
val months = listOf("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December")
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package org.openlake.sampoorna.data.sources.entities

data class Comment(
var authorUid: String = "",
var authorUsername: String = "",
var content: String = "",
var timestamp: Long = System.currentTimeMillis(),
var anonymous: Boolean = false
)
Original file line number Diff line number Diff line change
Expand Up @@ -6,19 +6,20 @@ import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.core.os.bundleOf
import androidx.navigation.findNavController
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.google.android.flexbox.FlexDirection
import com.google.android.flexbox.FlexWrap
import com.google.android.flexbox.FlexboxLayoutManager
import org.openlake.sampoorna.R
import org.openlake.sampoorna.data.constants.Constants
import org.openlake.sampoorna.data.sources.entities.Blog
import java.util.Date
import java.util.*

class BlogAdapter(val context: Context) : RecyclerView.Adapter<BlogAdapter.BlogViewHolder>() {

var blogList: MutableList<Blog> = mutableListOf()
private val months = listOf("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December")

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BlogViewHolder {
val view = LayoutInflater.from(context).inflate(R.layout.blog_item, parent, false)
Expand All @@ -42,8 +43,12 @@ class BlogAdapter(val context: Context) : RecyclerView.Adapter<BlogAdapter.BlogV
val hours = blogDate.hours
val mins = blogDate.minutes
val time = "${if(hours > 9) "" else "0"}${hours}:${if(mins > 9) "" else "0"}${mins}"
val date = "${blogDate.date} ${months[blogDate.month]} ${blogDate.year + 1900}"
val date = "${blogDate.date} ${Constants.months[blogDate.month]} ${blogDate.year + 1900}"
holder.blogTime.text = "$time, $date"

holder.itemView.setOnClickListener {
it.findNavController().navigate(R.id.blogDetailFragment, bundleOf("blogId" to blog.blogId))
}
}


Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
package org.openlake.sampoorna.presentation.features.blogs

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.widget.NestedScrollView
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider
import androidx.navigation.fragment.navArgs
import com.google.android.flexbox.FlexDirection
import com.google.android.flexbox.FlexWrap
import com.google.android.flexbox.FlexboxLayoutManager
import org.openlake.sampoorna.data.constants.Constants
import org.openlake.sampoorna.databinding.FragmentBlogDetailBinding
import org.openlake.sampoorna.presentation.features.blogs.comments.CommentBottomSheetFragment
import java.util.*

class BlogDetailFragment : Fragment() {

private var _binding: FragmentBlogDetailBinding? = null
private val binding: FragmentBlogDetailBinding get() = _binding!!
private val args: BlogDetailFragmentArgs by navArgs()
private lateinit var blogViewModel: BlogViewModel

override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = FragmentBlogDetailBinding.inflate(inflater, container, false)

blogViewModel = ViewModelProvider(this)[BlogViewModel::class.java]
blogViewModel.getBlog(args.blogId)

blogViewModel.blog.observe(viewLifecycleOwner) {blog ->
binding.loadingAnim.visibility = View.GONE
binding.blogContentLayout.visibility = View.VISIBLE

binding.blogTitle.text = blog.title
binding.blogContent.text = blog.content
binding.blogTags.layoutManager = FlexboxLayoutManager(context, FlexDirection.ROW, FlexWrap.WRAP)

val tagAdapter = BlogTagAdapter(requireContext())
tagAdapter.tagList = blog.tags.toMutableList()
binding.blogTags.adapter = tagAdapter
binding.blogAuthor.text = "By ${if(blog.anonymous) "Anonymous" else blog.authorUsername}"

val blogDate = Date(blog.timestamp)

val hours = blogDate.hours
val mins = blogDate.minutes
val time = "${if(hours > 9) "" else "0"}${hours}:${if(mins > 9) "" else "0"}${mins}"
val date = "${blogDate.date} ${Constants.months[blogDate.month]} ${blogDate.year + 1900}"
binding.blogTime.text = "$time, $date"
}

binding.blogContentLayout.setOnScrollChangeListener(NestedScrollView.OnScrollChangeListener { v, scrollX, scrollY, oldScrollX, oldScrollY ->
if(scrollY>oldScrollY) {
binding.commentFab.shrink()
} else {
binding.commentFab.extend()
}
})

binding.commentFab.setOnClickListener {
val commentFragment = CommentBottomSheetFragment(blogViewModel)
commentFragment.show(parentFragmentManager, null)
}

return binding.root
}

override fun onDestroyView() {
_binding = null
super.onDestroyView()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,20 @@ import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import com.google.android.gms.tasks.Task
import com.google.firebase.firestore.FirebaseFirestore
import com.google.firebase.firestore.ktx.toObjects
import org.openlake.sampoorna.data.constants.Constants
import org.openlake.sampoorna.data.sources.entities.Blog

class BlogViewModel: ViewModel() {

private val db = FirebaseFirestore.getInstance()
val blogList: MutableLiveData<MutableList<Blog>> = MutableLiveData(mutableListOf())

val searchResults: MutableLiveData<MutableList<Blog>> = MutableLiveData(mutableListOf())
val searchQuery: MutableLiveData<String> = MutableLiveData("")
val filterTags: MutableLiveData<MutableList<String>> = MutableLiveData(mutableListOf())

val blog: MutableLiveData<Blog> = MutableLiveData()

fun addBlog(blog: Blog, onComplete: (Task<Void>) -> Unit) {
db.collection(Constants.Blogs)
.add(blog)
Expand All @@ -34,16 +36,28 @@ class BlogViewModel: ViewModel() {

fun getBlogs() {
db.collection(Constants.Blogs)
.get()
.addOnCompleteListener {
if(it.isSuccessful) {
blogList.postValue(it.result.toObjects(Blog::class.java))
.addSnapshotListener { value, error ->
if(value != null) {
blogList.postValue(value.toObjects(Blog::class.java))
if(searchQuery.value.isNullOrEmpty()) {
searchResults.postValue(it.result.toObjects(Blog::class.java))
searchResults.postValue(value.toObjects(Blog::class.java))
}
}
else {
it.exception?.printStackTrace()
error?.printStackTrace()
}
}
}

fun getBlog(blogId: String) {
db.collection(Constants.Blogs)
.document(blogId)
.addSnapshotListener { value, error ->
if(value != null) {
blog.postValue(value.toObject(Blog::class.java))
}
else {
error?.printStackTrace()
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package org.openlake.sampoorna.presentation.features.blogs.comments

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import org.openlake.sampoorna.databinding.FragmentCommentBottomSheetBinding
import org.openlake.sampoorna.presentation.features.blogs.BlogViewModel

class CommentBottomSheetFragment(blogViewModel: BlogViewModel, reply: Boolean = false): BottomSheetDialogFragment() {

private var _binding: FragmentCommentBottomSheetBinding? = null
private val binding: FragmentCommentBottomSheetBinding get() = _binding!!

override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = FragmentCommentBottomSheetBinding.inflate(inflater, container, false)

return binding.root
}

override fun onDestroyView() {
_binding = null
super.onDestroyView()
}

}
5 changes: 5 additions & 0 deletions app/src/main/res/drawable/ic_comment.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:tint="#000000" android:viewportHeight="24"
android:viewportWidth="24" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M21.99,4c0,-1.1 -0.89,-2 -1.99,-2L4,2c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h14l4,4 -0.01,-18zM18,14L6,14v-2h12v2zM18,11L6,11L6,9h12v2zM18,8L6,8L6,6h12v2z"/>
</vector>
17 changes: 17 additions & 0 deletions app/src/main/res/layout/blog_item.xml
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,12 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
app:cardElevation="@dimen/_10sdp"
app:cardCornerRadius="@dimen/_20sdp">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<TextView
android:layout_width="match_parent"
android:textStyle="bold"
Expand All @@ -22,6 +24,7 @@
android:layout_height="wrap_content"
tools:text="Work on your health or something"
android:id="@+id/blog_title"/>

<androidx.recyclerview.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="wrap_content"
Expand All @@ -37,6 +40,7 @@
android:layout_gravity="start"
tools:visibility="gone"
tools:listitem="@layout/tag_card" />

<TextView
android:layout_gravity="center"
android:id="@+id/blog_content"
Expand All @@ -50,20 +54,24 @@
android:fontFamily="@font/dongle"
android:layout_width="match_parent"
android:layout_height="@dimen/_40sdp"/>

<Space
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />

<com.google.android.material.card.MaterialCardView
android:layout_width="match_parent"
android:layout_height="@dimen/_30sdp"
app:cardElevation="@dimen/_10sdp">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:paddingHorizontal="@dimen/_10sdp"
android:paddingVertical="@dimen/_5sdp">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
Expand All @@ -72,23 +80,28 @@
android:fontFamily="@font/dongle"
android:textSize="@dimen/_15ssp"
android:id="@+id/blog_author" />

<com.google.android.material.card.MaterialCardView
android:layout_width="@dimen/_22sdp"
android:layout_height="@dimen/_22sdp"
app:cardCornerRadius="@dimen/_11sdp"
android:layout_marginStart="@dimen/_2sdp"
android:layout_gravity="center">

<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"
android:id="@+id/blog_author_img"
android:src="@drawable/womenlogo"/>

</com.google.android.material.card.MaterialCardView>

<Space
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
Expand All @@ -97,7 +110,11 @@
android:fontFamily="@font/dongle"
android:textSize="@dimen/_15ssp"
android:id="@+id/blog_time" />

</LinearLayout>

</com.google.android.material.card.MaterialCardView>

</LinearLayout>

</androidx.cardview.widget.CardView>