i try to run my app and i get this
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.intskot, PID: 12203
com.google.firebase.database.DatabaseException: Found setter with invalid case-sensitive name: setPostId
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper$BeanMapper.<init>(CustomClassMapper.java:506)
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.loadOrCreateBeanMapperForClass(CustomClassMapper.java:330)
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertBean(CustomClassMapper.java:431)
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToClass(CustomClassMapper.java:232)
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertToCustomClass(CustomClassMapper.java:80)
at com.google.firebase.database.DataSnapshot.getValue(DataSnapshot.java:203)
at com.example.intskot.fragments.NotificationsFragment$readNotifications$1.onDataChange(NotificationsFragment.kt:65)
at com.google.firebase.database.core.ValueEventRegistration.fireEvent(ValueEventRegistration.java:75)
at com.google.firebase.database.core.view.DataEvent.fire(DataEvent.java:63)
at com.google.firebase.database.core.view.EventRaiser$1.run(EventRaiser.java:55)
at android.os.Handler.handleCallback(Handler.java:907)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7478)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:549)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:941)
my notificationFragment is:
package com.example.intskot.fragments
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.example.intskot.Model.Notification
import com.example.intskot.R
import com.example.intskot.adapter.NotificationAdapter
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.database.DataSnapshot
import com.google.firebase.database.DatabaseError
import com.google.firebase.database.FirebaseDatabase
import com.google.firebase.database.ValueEventListener
import java.util.*
import kotlin.collections.ArrayList
class NotificationsFragment : Fragment()
{
private var notificationList: List<Notification>? = null
private var notificationAdapter: NotificationAdapter? = null
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val view = inflater.inflate(R.layout.fragment_notifications, container, false)
val recyclerView: RecyclerView
recyclerView = view.findViewById(R.id.recycler_view_notifications)
recyclerView?.setHasFixedSize(true)
recyclerView?.layoutManager = LinearLayoutManager(context)
notificationList = ArrayList()
notificationAdapter = NotificationAdapter(this.requireContext(), notificationList as ArrayList<Notification>)
recyclerView.adapter = notificationAdapter
readNotifications()
return view
}
private fun readNotifications()
{
val notiRef = FirebaseDatabase.getInstance()
.reference.child("Notifications")
.child(FirebaseAuth.getInstance().currentUser!!.uid)
notiRef.addValueEventListener(object : ValueEventListener
{
override fun onDataChange(dataSnapshot: DataSnapshot)
{
if (dataSnapshot.exists())
{
(notificationList as ArrayList<Notification>).clear()
for (snapshot in dataSnapshot.children)
{
val notification = snapshot.getValue(Notification::class.java)
(notificationList as ArrayList<Notification>).add(notification!!)
}
Collections.reverse(notificationList!!)
notificationAdapter!!.notifyDataSetChanged()
}
}
override fun onCancelled(error: DatabaseError) {
}
})
}
}
my notification.kt model is:
package com.example.intskot.model
class Notification
{
private var userid: String = ""
private var text: String = ""
private var postid: String = ""
private var ispost = false
constructor()
constructor(userid: String, text: String, postid: String, ispost: Boolean) {
this.userid = userid
this.text = text
this.postid = postid
this.ispost = ispost
}
fun getUserid(): String {
return userid
}
fun getText(): String {
return text
}
fun getPostid(): String {
return postid
}
fun isIsPost(): Boolean {
return ispost
}
fun setUserId(userid: String)
{
this.userid = userid
}
fun setTextId(text: String)
{
this.text = text
}
fun setPostId(postid: String)
{
this.postid = postid
}
fun setIsPost(ispost: Boolean)
{
this.ispost = ispost
}
}
postadapter is:
package com.example.intskot.adapter
import android.content.Context
import android.content.Intent
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.annotation.NonNull
import androidx.recyclerview.widget.RecyclerView
import com.example.intskot.CommentsActivity
import com.example.intskot.MainActivity
import com.example.intskot.R
import com.example.intskot.ShowUsersActivity
import com.example.intskot.model.Post
import com.example.intskot.model.User
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.auth.FirebaseUser
import com.google.firebase.database.DataSnapshot
import com.google.firebase.database.DatabaseError
import com.google.firebase.database.FirebaseDatabase
import com.google.firebase.database.ValueEventListener
import com.squareup.picasso.Picasso
import de.hdodenhof.circleimageview.CircleImageView
class PostAdapter
(private val mContext: Context,
private val mPost: List<Post>) : RecyclerView.Adapter<PostAdapter.ViewHolder>()
{
private var firebaseUser:FirebaseUser? = null
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder
{
val view = LayoutInflater.from(mContext).inflate(R.layout.posts_layout, parent, false)
return ViewHolder(view)
}
override fun getItemCount(): Int
{
return mPost.size
}
override fun onBindViewHolder(holder: ViewHolder, position: Int)
{
firebaseUser = FirebaseAuth.getInstance().currentUser
val post = mPost[position]
Picasso.get().load(post.getPostimage()).into(holder.postImage)
if (post.getDescription() == "")
{
holder.description.visibility = View.GONE
}
else
{
holder.description.visibility = View.VISIBLE
holder.description.text = post.getDescription()
}
publisherInfo(holder.profileImage, holder.userName, holder.publisher, post.getPublisher())
isLikes(post.getPostid(), holder.likeButton)
numberOfLikes(holder.likes, post.getPostid())
getTotalComments(holder.comments, post.getPostid())
checkSavedStatus(post.getPostid(), holder.saveButton)
holder.likeButton.setOnClickListener{
if (holder.likeButton.tag == "Like")
{
FirebaseDatabase.getInstance().reference
.child("Likes")
.child(post.getPostid())
.child(firebaseUser!!.uid)
.setValue(true)
addNotification(post.getPublisher(), post.getPostid())
}
else
{
FirebaseDatabase.getInstance().reference
.child("Likes")
.child(post.getPostid())
.child(firebaseUser!!.uid)
.removeValue()
val intent = Intent(mContext, MainActivity::class.java)
mContext.startActivity(intent)
}
}
holder.likes.setOnClickListener {
val intent = Intent(mContext, ShowUsersActivity::class.java)
intent.putExtra("id",post.getPostid())
intent.putExtra("title", "likes")
mContext.startActivity(intent)
}
holder.commentButton.setOnClickListener {
val intentComment = Intent(mContext, CommentsActivity::class.java)
intentComment.putExtra("postId", post.getPostid())
intentComment.putExtra("publisherId", post.getPublisher())
mContext.startActivity(intentComment)
}
holder.comments.setOnClickListener{
val intentComment = Intent(mContext, CommentsActivity::class.java)
intentComment.putExtra("postId", post.getPostid())
intentComment.putExtra("publisherId", post.getPublisher())
mContext.startActivity(intentComment)
}
holder.saveButton.setOnClickListener {
if (holder.saveButton.tag == "Save")
{
FirebaseDatabase.getInstance().reference
.child("Saves")
.child(firebaseUser!!.uid)
.child(post.getPostid())
.setValue(true)
}
else
{
FirebaseDatabase.getInstance().reference
.child("Saves")
.child(firebaseUser!!.uid)
.child(post.getPostid())
.removeValue()
}
}
}
private fun numberOfLikes(likes: TextView, postid: String)
{
val likesRef = FirebaseDatabase.getInstance().reference
.child("Likes").child(postid)
likesRef.addValueEventListener(object : ValueEventListener
{
override fun onDataChange(p0: DataSnapshot) {
if (p0.exists())
{
likes.text = p0.childrenCount.toString() + " likes"
}
}
override fun onCancelled(p0: DatabaseError) {
}
})
}
private fun getTotalComments(comments: TextView, postid: String)
{
val commentsRef = FirebaseDatabase.getInstance().reference
.child("Comments").child(postid)
commentsRef.addValueEventListener(object : ValueEventListener
{
override fun onDataChange(p0: DataSnapshot)
{
if (p0.exists())
{
comments.text = "view all" + p0.childrenCount.toString() + " comments"
}
}
override fun onCancelled(p0: DatabaseError) {
}
})
}
private fun isLikes(postid: String, likeButton: ImageView)
{
val firebaseUser = FirebaseAuth.getInstance().currentUser
val likesRef = FirebaseDatabase.getInstance().reference
.child("Likes").child(postid)
likesRef.addValueEventListener(object : ValueEventListener
{
override fun onDataChange(p0: DataSnapshot)
{
if (p0.child(firebaseUser!!.uid).exists())
{
likeButton.setImageResource(R.drawable.heart_clicked)
likeButton.tag = "liked"
}
else
{
likeButton.setImageResource(R.drawable.heart_not_clicked)
likeButton.tag = "Like"
}
}
override fun onCancelled(p0: DatabaseError) {
}
})
}
inner class ViewHolder(@NonNull itemView: View) : RecyclerView.ViewHolder(itemView)
{
var profileImage: CircleImageView = itemView.findViewById(R.id.user_profile_image_post)
var postImage: ImageView = itemView.findViewById(R.id.post_image_home)
var likeButton: ImageView = itemView.findViewById(R.id.post_image_like_btn)
var commentButton: ImageView = itemView.findViewById(R.id.post_image_comment_btn)
var saveButton: ImageView = itemView.findViewById(R.id.post_save_comment_btn)
var userName: TextView = itemView.findViewById(R.id.user_name_post)
var likes: TextView = itemView.findViewById(R.id.likes)
var publisher: TextView = itemView.findViewById(R.id.publisher)
var description: TextView = itemView.findViewById(R.id.description)
var comments: TextView = itemView.findViewById(R.id.comments)
}
private fun publisherInfo(profileImage: CircleImageView, userName: TextView, publisher: TextView, publisherID: String)
{
val usersRef = FirebaseDatabase.getInstance().reference.child("Users").child(publisherID)
usersRef.addValueEventListener(object : ValueEventListener
{
override fun onDataChange(p0: DataSnapshot)
{
if (p0.exists())
{
val user = p0.getValue<User>(User::class.java)
Picasso.get().load(user!!.getImage()).placeholder(R.drawable.profile).into(profileImage)
userName.text = user!!.getUsername()
publisher.text = user!!.getFullname()
}
}
override fun onCancelled(p0: DatabaseError) {
}
})
}
private fun checkSavedStatus(postid: String, imageView: ImageView)
{
val savesRef = FirebaseDatabase.getInstance().reference
.child("Saves")
.child(firebaseUser!!.uid)
savesRef.addValueEventListener(object : ValueEventListener
{
override fun onDataChange(p0: DataSnapshot){
if (p0.child(postid).exists())
{
imageView.setImageResource(R.drawable.save_large_icon)
imageView.tag = "Saved"
}
else
{
imageView.setImageResource(R.drawable.save_unfilled_large_icon)
imageView.tag = "Save"
}
}
override fun onCancelled(p0: DatabaseError) {
}
})
}
private fun addNotification(userId: String, postId: String)
{
val notiRef = FirebaseDatabase.getInstance()
.reference.child("Notifications")
.child(userId)
val notiMap = HashMap<String, Any>()
notiMap["userid"] = firebaseUser!!.uid
notiMap["text"] = "liked your post"
notiMap["postid"] = postId
notiMap["ispost"] = true
notiRef.push().setValue(notiMap)
}
}
user adapter:
package com.example.intskot.adapter
import android.content.Context
import android.content.Intent
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.TextView
import androidx.annotation.NonNull
import androidx.fragment.app.FragmentActivity
import androidx.recyclerview.widget.RecyclerView
import com.example.intskot.MainActivity
import com.example.intskot.R
import com.example.intskot.fragments.ProfileFragment
import com.example.intskot.model.User
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.auth.FirebaseUser
import com.google.firebase.database.DataSnapshot
import com.google.firebase.database.DatabaseError
import com.google.firebase.database.FirebaseDatabase
import com.google.firebase.database.ValueEventListener
import com.squareup.picasso.Picasso
import de.hdodenhof.circleimageview.CircleImageView
class UserAdapter (private var mContext: Context,
private var mUser: List<User>,
private var isFragment: Boolean = false) : RecyclerView.Adapter<UserAdapter.ViewHolder>()
{
private var firebaseUser: FirebaseUser? = FirebaseAuth.getInstance().currentUser
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): UserAdapter.ViewHolder {
val view = LayoutInflater.from(mContext).inflate(R.layout.user_item_layout, parent, false)
return UserAdapter.ViewHolder(view)
}
override fun onBindViewHolder(holder: UserAdapter.ViewHolder, position: Int) {
val user = mUser[position]
holder.userNameTextView.text = user.getUsername()
holder.userFullNameTextView.text = user.getFullname()
Picasso.get().load(user.getImage()).placeholder(R.drawable.profile).into(holder.userProfileImage)
checkFollowingStatus(user.getUID(), holder.followButton)
holder.itemView.setOnClickListener ( View.OnClickListener {
if (isFragment)
{
val pref = mContext.getSharedPreferences("PREFS", Context.MODE_PRIVATE).edit()
pref.putString("profileId", user.getUID())
pref.apply()
(mContext as FragmentActivity).supportFragmentManager.beginTransaction()
.replace(R.id.fragment_container, ProfileFragment()).commit()
}
else
{
val intent = Intent(mContext, MainActivity::class.java)
intent.putExtra("publisherId", user.getUID())
mContext.startActivity(intent)
}
} )
holder.followButton.setOnClickListener {
if (holder.followButton.text.toString() == "Follow")
{
firebaseUser?.uid.let { it1 ->
FirebaseDatabase.getInstance().reference
.child("Follow").child(it1.toString())
.child("Following").child(user.getUID())
.setValue(true).addOnCompleteListener { task ->
if (task.isSuccessful) {
firebaseUser?.uid.let { it1 ->
FirebaseDatabase.getInstance().reference
.child("Follow").child(user.getUID())
.child("Followers").child(it1.toString())
.setValue(true).addOnCompleteListener { task ->
if (task.isSuccessful) {
}
}
}
}
}
}
addNotification(user.getUID())
}
else
{
firebaseUser?.uid.let { it1 ->
FirebaseDatabase.getInstance().reference
.child("Follow").child(it1.toString())
.child("Following").child(user.getUID())
.removeValue().addOnCompleteListener { task ->
if (task.isSuccessful) {
firebaseUser?.uid.let { it1 ->
FirebaseDatabase.getInstance().reference
.child("Follow").child(user.getUID())
.child("Followers").child(it1.toString())
.removeValue().addOnCompleteListener { task ->
if (task.isSuccessful) {
}
}
}
}
}
}
}
}
}
override fun getItemCount(): Int {
return mUser.size
}
class ViewHolder(@NonNull itemView: View) : RecyclerView.ViewHolder(itemView){
var userNameTextView: TextView = itemView.findViewById(R.id.user_name_search)
var userFullNameTextView: TextView = itemView.findViewById(R.id.user_full_name_search)
var userProfileImage: CircleImageView = itemView.findViewById(R.id.user_profile_image_search)
var followButton: Button = itemView.findViewById(R.id.follow_btn_search)
}
private fun checkFollowingStatus(uid: String, followButton: Button)
{
val followingRef = firebaseUser?.uid.let { it1 ->
FirebaseDatabase.getInstance().reference
.child("Follow").child(it1.toString())
.child("Following")
}
followingRef.addValueEventListener(object : ValueEventListener{
override fun onDataChange(datasnapshot: DataSnapshot)
{
if (datasnapshot.child(uid).exists())
{
followButton.text = "Following"
}
else
{
followButton.text = "Follow"
}
}
override fun onCancelled(error: DatabaseError) {
}
})
}
private fun addNotification(userId: String)
{
val notiRef = FirebaseDatabase.getInstance()
.reference.child("Notifications")
.child(userId)
val notiMap = HashMap<String, Any>()
notiMap["userid"] = firebaseUser!!.uid
notiMap["text"] = "started following you"
notiMap["postid"] = ""
notiMap["ispost"] = false
notiRef.push().setValue(notiMap)
}
}
What I have tried:
any help on that? any suggestions ?