Search code examples
javaandroidfirebase-realtime-databaseandroid-recyclerviewfirebase-authentication

I have a problem in my MainActivity.java , OnStart() method wont call CheckUserExistence() when i put FirebaseRecycler Adapter in OnStart()r


i have a problem in my MainActivity.java code, where i display all users posts, the problem is in my onStart() method, when i put FirebaseRecyclerAdapter in my onStart() method, onStart() won't call CheckUserExistence() method which is in the OnStart() method, which leads user to SetUpActivity.java, and as soon as i remove FirebaseRecyclerAdapter it works fine, means it calls CheckUserExistence() method and goes to SetupActivity perfectly, what is wrong, i can't figure out, please help -

Here's the specific part of code in MainActivity.java where i have problem -



    protected void onStart() {
        super.onStart();

        FirebaseUser currentUser = mAuth.getCurrentUser();
        if (currentUser == null) {
            SendUserToLoginActivity();
        } else {
            CheckUserExistence();
        }

        Query SortPostsInDescendingOrder = PostsRef.orderByChild("counter");

        FirebaseRecyclerOptions<Posts> options = new FirebaseRecyclerOptions.Builder<Posts>().setQuery(SortPostsInDescendingOrder, Posts.class).build();

        FirebaseRecyclerAdapter<Posts, PostsViewHolder> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<Posts, PostsViewHolder>
                (options) {
            @Override
            protected void onBindViewHolder(@NonNull PostsViewHolder postsViewHolder, int i, @NonNull Posts posts) {

             final String PostKey = getRef(i).getKey();

                postsViewHolder.username.setText(posts.getFullname());
                postsViewHolder.PostTime.setText(posts.getTime());
                postsViewHolder.PostDate.setText(posts.getDate());
                postsViewHolder.PostDescription.setText(posts.getDescription());
                Picasso.get().load(posts.getProfileimage()).into(postsViewHolder.image);
                Picasso.get().load(posts.getPostimage()).into(postsViewHolder.Postimage);

                postsViewHolder.setLikeButtonStatus(PostKey);

                postsViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {

                        Intent clickPostIntent = new Intent(MainActivity.this, ClickPostActivity.class);
                        clickPostIntent.putExtra("PostKey", PostKey);
                        startActivity(clickPostIntent);



                    }
                });



                postsViewHolder.LikePostButton.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        LikeChecker = true;

                        LikesRef.addValueEventListener(new ValueEventListener() {
                            @Override
                            public void onDataChange(@NonNull DataSnapshot snapshot) {

                              if(LikeChecker.equals(true))
                              {
                                  if(snapshot.child(PostKey).hasChild(currentUserID))
                                  {
                                      LikesRef.child(PostKey).child(currentUserID).removeValue();
                                      LikeChecker = false;
                                  }
                                  else
                                  {
                                      LikesRef.child(PostKey).child(currentUserID).setValue(true);
                                      LikeChecker = false;
                                  }

                              }

                            }

                            @Override
                            public void onCancelled(@NonNull DatabaseError error) {

                            }
                        });
                    }
                });


            }

            @NonNull
            @Override
            public PostsViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
                View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.all_posts_layout, parent, false);
                PostsViewHolder viewHolder = new PostsViewHolder(view);
                return viewHolder;
            }
        };






      postList.setAdapter(firebaseRecyclerAdapter);
      firebaseRecyclerAdapter.startListening();

      updateUserStatus("online");

    }








    private void CheckUserExistence() {

            final String current_user_id = mAuth.getCurrentUser().getUid();


            UsersRef.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot snapshot) {

                    if (!snapshot.hasChild(current_user_id)) {
                        SendUserToSetupActivity();
                    }
                }

                @Override
                public void onCancelled(@NonNull DatabaseError error) {

                }
            });
        }



    private void SendUserToSetupActivity() {
        Intent setupIntent = new Intent(MainActivity.this, SetupActivity.class);
        setupIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        startActivity(setupIntent);
        finish();

    }

  













I removed FirebaseRecyclerAdapter from my onStart() method and it was working fine, which means it was leading users to SetupActivity.java, as intended code, i also tried extending MainActivity. java and made another activity just to display posts so that onStart won't conflict but that was completely wrong as my app wasn't even starting up.

When i remove FirebaseRecyclerAdapter from my onStart method, onStart() method works fine, which means it leads user to SetupActivity.java as intended code -

 protected void onStart() {
        super.onStart();

        FirebaseUser currentUser = mAuth.getCurrentUser();

        if (currentUser == null) {
            SendUserToLoginActivity();
        } else {
            CheckUserExistence();
        }
    }



    private void CheckUserExistence() {
        final String current_user_id = mAuth.getCurrentUser().getUid();

        UsersRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                if (!dataSnapshot.hasChild(current_user_id)) {
                    SendUserToSetupActivity();
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
    }


But when i add FirebaseRecyclerAdapter in my onStart() method it doesn't work as intended means it doesn't got to SetupActivity.java -

 protected void onStart() {
        super.onStart();

        FirebaseUser currentUser = mAuth.getCurrentUser();
        if (currentUser == null) {
            SendUserToLoginActivity();
        } else {
            CheckUserExistence();
        }

        Query SortPostsInDescendingOrder = PostsRef.orderByChild("counter");

        FirebaseRecyclerOptions<Posts> options = new FirebaseRecyclerOptions.Builder<Posts>().setQuery(SortPostsInDescendingOrder, Posts.class).build();

        FirebaseRecyclerAdapter<Posts, PostsViewHolder> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<Posts, PostsViewHolder>
                (options) {
            @Override
            protected void onBindViewHolder(@NonNull PostsViewHolder postsViewHolder, int i, @NonNull Posts posts) {

             final String PostKey = getRef(i).getKey();

                postsViewHolder.username.setText(posts.getFullname());
                postsViewHolder.PostTime.setText(posts.getTime());
                postsViewHolder.PostDate.setText(posts.getDate());
                postsViewHolder.PostDescription.setText(posts.getDescription());
                Picasso.get().load(posts.getProfileimage()).into(postsViewHolder.image);
                Picasso.get().load(posts.getPostimage()).into(postsViewHolder.Postimage);

                postsViewHolder.setLikeButtonStatus(PostKey);

                postsViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {

                        Intent clickPostIntent = new Intent(MainActivity.this, ClickPostActivity.class);
                        clickPostIntent.putExtra("PostKey", PostKey);
                        startActivity(clickPostIntent);



                    }
                });



                postsViewHolder.LikePostButton.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        LikeChecker = true;

                        LikesRef.addValueEventListener(new ValueEventListener() {
                            @Override
                            public void onDataChange(@NonNull DataSnapshot snapshot) {

                              if(LikeChecker.equals(true))
                              {
                                  if(snapshot.child(PostKey).hasChild(currentUserID))
                                  {
                                      LikesRef.child(PostKey).child(currentUserID).removeValue();
                                      LikeChecker = false;
                                  }
                                  else
                                  {
                                      LikesRef.child(PostKey).child(currentUserID).setValue(true);
                                      LikeChecker = false;
                                  }

                              }

                            }

                            @Override
                            public void onCancelled(@NonNull DatabaseError error) {

                            }
                        });
                    }
                });


            }

            @NonNull
            @Override
            public PostsViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
                View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.all_posts_layout, parent, false);
                PostsViewHolder viewHolder = new PostsViewHolder(view);
                return viewHolder;
            }
        };






      postList.setAdapter(firebaseRecyclerAdapter);
      firebaseRecyclerAdapter.startListening();

      updateUserStatus("online");

    }


private void CheckUserExistence() {

            final String current_user_id = mAuth.getCurrentUser().getUid();


            UsersRef.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot snapshot) {

                    if (!snapshot.hasChild(current_user_id)) {
                        SendUserToSetupActivity();
                    }
                }

                @Override
                public void onCancelled(@NonNull DatabaseError error) {

                }
            });
        }

















Please Help. Please tell me in detail where i am going wrong with my code with appropriate code improvements and implementation in details.


Solution

  • I’ve solved the error, what I was looking for to send user to SetupActivity from Mainactivity, but then i decided I can send users directly from LoginActivity to SetupActivity, No need to use sophisticated practices where common sense can be used.