Firebase Social Media App Complete Android Tutorials

Firebase Social Media App using Android Studio and Firebase

āœ“Registration using Email/Password
āœ“Login using Email/Password, Google, Phone 
āœ“Recover password in case you forgot 
āœ“Profile [Name, Email, Profile Pic, Phone, etc] 
āœ“Update 
āœ“Add Posts [Publisher name, email; Title, Image Description, Date & Time etc] 
āœ“All Posts, User Specific Posts 
āœ“Like Post 
āœ“Comment Post 
āœ“Delete, Edit your post

Firebase Social Media App Complete Android Tutorials
Firebase Social Media App Complete Android Tutorials


Complete Videos Playlist



When presses like button, refreshes whole list - Fixed
package com.blogspot.atifsoftwares.firebaseapp.fragments;


import android.content.Intent;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.core.view.MenuItemCompat;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.appcompat.widget.SearchView;
import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

import com.blogspot.atifsoftwares.firebaseapp.AddPostActivity;
import com.blogspot.atifsoftwares.firebaseapp.MainActivity;
import com.blogspot.atifsoftwares.firebaseapp.R;
import com.blogspot.atifsoftwares.firebaseapp.SettingsActivity;
import com.blogspot.atifsoftwares.firebaseapp.adapters.AdapterPosts;
import com.blogspot.atifsoftwares.firebaseapp.models.ModelPost;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.ChildEventListener;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

import java.util.ArrayList;
import java.util.List;


/**
 * A simple {@link Fragment} subclass.
 */
public class HomeFragment extends Fragment {

    //firebase auth
    FirebaseAuth firebaseAuth;

    RecyclerView recyclerView;
    List<ModelPost> postList;
    AdapterPosts adapterPosts;

    public HomeFragment() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view =  inflater.inflate(R.layout.fragment_home, container, false);

        //init
        firebaseAuth = FirebaseAuth.getInstance();

        //recycler view and its properties
        recyclerView = view.findViewById(R.id.postsRecyclerview);
        LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
        //show newest post first, for this load from last
        layoutManager.setStackFromEnd(true);
        layoutManager.setReverseLayout(true);
        //set layout to recyclerview
        recyclerView.setLayoutManager(layoutManager);

        //init post list
        postList = new ArrayList<>();

        loadPosts();

        return view;
    }

    private void loadPosts() {
        postList = new ArrayList<>();
        postList.clear();

        adapterPosts = new AdapterPosts(getActivity(), postList);
        recyclerView.setAdapter(adapterPosts);

        //path of all posts
        DatabaseReference ref = FirebaseDatabase.getInstance().getReference("Posts");
        //get all data from this ref
        ref.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String previousChildName) {
                ModelPost modelPost = dataSnapshot.getValue(ModelPost.class);
                postList.add(modelPost);
                adapterPosts.notifyItemInserted(postList.size() - 1);
            }

            @Override
            public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String previousChildName) {
                Log.i("mytag", "child changed");
                ModelPost modelPost = dataSnapshot.getValue(ModelPost.class);
                for (int i = 0; i < postList.size(); i++) {
                    if (postList.get(i).getUid().equals(modelPost.getUid())) {
                        postList.set(i, modelPost);
                        Log.i("mytag", "changed child found at position: " + i);
                        adapterPosts.notifyItemChanged(i);
                        break;
                    }
                }
            }

            @Override
            public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
                Log.i("mytag", "child removed");
                ModelPost modelPost = dataSnapshot.getValue(ModelPost.class);
                for (int i = 0; i < postList.size(); i++) {
                    if (postList.get(i).getUid().equals(modelPost.getUid())) {
                        postList.remove(i);
                        Log.i("mytag", "removed child found at position: " + i);
                        adapterPosts.notifyItemRemoved(i);
                        break;
                    }
                }
            }

            @Override
            public void onChildMoved(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {

            }

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

            }
        });
    }

    private void searchPosts(final String searchQuery){
        postList = new ArrayList<>();
        postList.clear();

        adapterPosts = new AdapterPosts(getActivity(), postList);
        recyclerView.setAdapter(adapterPosts);

        //path of all posts
        DatabaseReference ref = FirebaseDatabase.getInstance().getReference("Posts");
        //get all data from this ref
        ref.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String previousChildName) {
                ModelPost modelPost = dataSnapshot.getValue(ModelPost.class);

                if (modelPost.getpTitle().toLowerCase().contains(searchQuery.toLowerCase()) ||
                        modelPost.getpDescr().toLowerCase().contains(searchQuery.toLowerCase())){
                    postList.add(modelPost);
                    adapterPosts.notifyItemInserted(postList.size() - 1);
                }
            }

            @Override
            public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String previousChildName) {
                Log.i("mytag", "child changed");
                ModelPost modelPost = dataSnapshot.getValue(ModelPost.class);
                for (int i = 0; i < postList.size(); i++) {
                    if (postList.get(i).getUid().equals(modelPost.getUid())) {
                        postList.set(i, modelPost);
                        Log.i("mytag", "changed child found at position: " + i);
                        adapterPosts.notifyItemChanged(i);
                        break;
                    }
                }
            }

            @Override
            public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
                Log.i("mytag", "child removed");
                ModelPost modelPost = dataSnapshot.getValue(ModelPost.class);
                for (int i = 0; i < postList.size(); i++) {
                    if (postList.get(i).getUid().equals(modelPost.getUid())) {
                        postList.remove(i);
                        Log.i("mytag", "removed child found at position: " + i);
                        adapterPosts.notifyItemRemoved(i);
                        break;
                    }
                }
            }

            @Override
            public void onChildMoved(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {

            }

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

            }
        });


    }


    private void checkUserStatus(){
        //get current user
        FirebaseUser user = firebaseAuth.getCurrentUser();
        if (user != null){
            //user is signed in stay here
            //set email of logged in user
            //mProfileTv.setText(user.getEmail());
        }
        else {
            //user not signed in, go to main acitivity
            startActivity(new Intent(getActivity(), MainActivity.class));
            getActivity().finish();
        }
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        setHasOptionsMenu(true);//to show menu option in fragment
        super.onCreate(savedInstanceState);
    }

    /*inflate options menu*/
    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        //inflating menu
        inflater.inflate(R.menu.menu_main, menu);

        //hide some options
        menu.findItem(R.id.action_create_group).setVisible(false);
        menu.findItem(R.id.action_add_participant).setVisible(false);
        menu.findItem(R.id.action_groupinfo).setVisible(false);

        //searchview to search posts by post title/description
        MenuItem item = menu.findItem(R.id.action_search);
        SearchView searchView = (SearchView)MenuItemCompat.getActionView(item);

        //search listener
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String s) {
                //called when user press search button
                if (!TextUtils.isEmpty(s)){
                    searchPosts(s);
                }
                else {
                    loadPosts();
                }
                return false;
            }

            @Override
            public boolean onQueryTextChange(String s) {
                //called as and when user press any letter
                if (!TextUtils.isEmpty(s)){
                    searchPosts(s);
                }
                else {
                    loadPosts();
                }
                return false;
            }
        });

        super.onCreateOptionsMenu(menu, inflater);
    }

    /*handle menu item clicks*/
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        //get item id
        int id = item.getItemId();
        if (id == R.id.action_logout){
            firebaseAuth.signOut();
            checkUserStatus();
        }
        else if (id == R.id.action_add_post){
            startActivity(new Intent(getActivity(), AddPostActivity.class));
        }
        else if (id==R.id.action_settings){
            //go to settings activity
            startActivity(new Intent(getActivity(), SettingsActivity.class));
        }

        return super.onOptionsItemSelected(item);
    }

}

Comments

  1. Can You Please Provide me the AdapterPost, ModelPost Home fragments and Chat Fragment code of this project please i am stuck on these pages some errors are occuring infinitely i solve one another starts. Its making a loop in these 4 pages of java class.
    It will be very Helpful for me as i am still a noob debloper

    ReplyDelete

Post a Comment

Popular posts from this blog

Picture In Picture | Android Studio | Kotlin

Manage External Storage Permission | Android Studio | Kotlin

How to add AIDL folder | Android Studio