0

I am working on a DrawerLayout, and when I click one of the items to go to a Profile page, it logs me out (I can notice this because I get a NullPointer error for the UserAuth [even though I was authed before clicking this]

Note: I didn't notice this until I tried to modularize my code by adding "initialize" methods and such.

This is the code for the items in the drawerlayout:

private void setupDrawerLayout() {
        drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        navigationView = (NavigationView) findViewById(R.id.navigation_view);
        navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
            @Override public boolean onNavigationItemSelected(MenuItem menuItem) {
                //If Clicked...then get item and go to associated page
                switch(menuItem.getTitle().toString())
                {
                    case "Profile":
                        Log.i("Profile", menuItem.getTitle().toString());
                        startActivity(new Intent(HomeActivity.this, ProfileActivity.class));
                    /*case "Share":
                        startActivity(new Intent(HomeActivity.this, ProfileActivity.class));
                    case "Settings":
                        startActivity(new Intent(HomeActivity.this, ProfileActivity.class)); */
                    case "Logout":
                        Log.i("Logout", menuItem.getTitle().toString());
                        FirebaseAuth.getInstance().signOut();
                        //startActivity(new Intent(HomeActivity.this, LoginActivity.class));
                }
                menuItem.setChecked(true);
                drawerLayout.closeDrawers();
                return true;
                }
        });
    }

For some reason even though I'm clicking the "Profile" item, it goes to both the Case for that, AND for "Logout" as can be seen by the Log statements:

I/Profile: Profile
I/Logout: Profile

And then this leads to the Error:

E/UncaughtException: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.netgalaxystudios.timeclock/com.netgalaxystudios.timeclock.Activities.ProfileActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.google.firebase.auth.FirebaseUser.getUid()' on a null object reference

  Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.google.firebase.auth.FirebaseUser.getUid()' on a null object reference
                         at com.netgalaxystudios.timeclock.Activities.ProfileActivity.onCreate(ProfileActivity.java:70)

ProfileActivity.java (is the activity I am trying to get to by clicking on the ITEM in the menu). It refers to this line, but really the error is coming from HomeActivity as I understand it... ) :

 currentUserString = currentUser.getUid().toString();

HomeActivity.java:

public class HomeActivity extends AppCompatActivity {

    private DrawerLayout drawerLayout;
    private NavigationView navigationView;
    ImageView menu, closeDrawer;
    RelativeLayout navHeader;

    //Profile Stuff
    DatabaseReference employeesRefPhoto, employeesRefFname, employeesRefLname;
    FirebaseDatabase database;
    String photoUrl;
    ImageView profilePhoto;
    FirebaseUser currentUser;
    String currentUserString;
    TextView nameTV, lnameTV;
    TextView businessesTV;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.drawer_layout);

        /////////////////////////
        //METHODS
        //initViews();
        //setupDrawerLayout();
        //footerOnClick();
        //////////////////////////

        menu = (ImageView) findViewById(R.id.menu);
        menu.setOnClickListener(new View.OnClickListener() {
                                    @Override
                                    public void onClick(final View view) {
                                            drawerLayout.openDrawer(Gravity.LEFT);
                                    }
                                });

        currentUser = FirebaseAuth.getInstance().getCurrentUser();
        currentUserString = currentUser.getUid().toString();

        setupDrawerLayout();

        //https://stackoverflow.com/questions/37163579/null-pointer-exception-on-navigation-header-initialized-variables
        navHeader=(RelativeLayout) LayoutInflater.from(this).inflate(R.layout.drawer_header, null);
        navigationView.addHeaderView(navHeader); //This seems to add a SECOND "X" image

        nameTV = (TextView) navHeader.findViewById(R.id.employeeFname);
        lnameTV = (TextView) navHeader.findViewById(R.id.employeeLname);

        closeDrawer = (ImageView) navHeader.findViewById(R.id.closedrawer);
        profilePhoto = (ImageView) navHeader.findViewById(R.id.profilephoto);
        businessesTV = (TextView) findViewById(R.id.businesses);

         closeDrawer.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(final View view) {
                drawerLayout.closeDrawer(Gravity.LEFT);
            }
        });

        ///////////////////////////////////////////////////////////////////////////
        //INFORMATION FOR MENU/////////////////////
        //PROFILE PHOTO
        //currentUser = FirebaseAuth.getInstance().getCurrentUser();
        //currentUserString = currentUser.getUid().toString();

        setupDrawerLayout();

        database = FirebaseDatabase.getInstance();
        employeesRefPhoto = database.getReference("Employees").child(currentUserString).child("photoDownloadUrl");
        employeesRefPhoto.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                Log.i("onDataChange","Inside");

                try {
                    photoUrl = dataSnapshot.getValue().toString();
                    Log.i("photoUrl", photoUrl);
                    Glide.with(getApplicationContext()).load(photoUrl).into(profilePhoto);
                    profilePhoto.setScaleType(ImageView.ScaleType.CENTER_CROP);
                }
                catch (NullPointerException e) {
                    Log.i("Null", e.toString());
                }

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
                Log.d("Cancelled",databaseError.toString());
            }
        });

        //////////////////////////////////////////////
        //GET NAME//////////////////////////////////
        //FIRST NAME
        employeesRefFname = database.getReference("Employees").child(currentUserString).child("firstName");
        employeesRefFname.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                try {
                    Log.i("firstname", dataSnapshot.getValue().toString());
                    nameTV.setText(dataSnapshot.getValue().toString());
                }
                catch (Exception e) {  Log.i("FNull?", e.toString());     }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {   Log.d("Cancelled",databaseError.toString());     }
        });

        //LAST NAME
        employeesRefLname = database.getReference("Employees").child(currentUserString).child("lastName");
        employeesRefLname.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                try {
                    Log.i("lastname", dataSnapshot.getValue().toString());

                    lnameTV.setText(dataSnapshot.getValue().toString());
                }
                catch (Exception e) {  Log.i("LNull?", e.toString());     }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {   Log.d("Cancelled",databaseError.toString());     }
        });

        //footerOnClick();
        footerOnClick();



    } //END OF ONCREATE

    /////////////////////////////////////////////////////////////////////////////////



    //INITIALIZE VIEWS
    private void initViews(){
        navHeader=(RelativeLayout) LayoutInflater.from(this).inflate(R.layout.drawer_header, null);

        nameTV = (TextView) navHeader.findViewById(R.id.employeeFname);
        lnameTV = (TextView) navHeader.findViewById(R.id.employeeLname);

        menu = (ImageView) findViewById(R.id.menu);
        closeDrawer = (ImageView) navHeader.findViewById(R.id.closedrawer);
        profilePhoto = (ImageView) navHeader.findViewById(R.id.profilephoto);
        businessesTV = (TextView) findViewById(R.id.businesses);
    }

    //INTENTS FOR THE FOOTER OF THE SCREEN
    private void footerOnClick() {

        businessesTV.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(final View view) {
                startActivity(new Intent(HomeActivity.this, BusinessesActivity.class));
            }
        });

        //EMPLOYEES
        //PAYROLL REPORT
    }

    //MENU / DRAWER
    //https://antonioleiva.com/navigation-view/
    private void setupDrawerLayout() {
        drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);

        navigationView = (NavigationView) findViewById(R.id.navigation_view);
        navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
            @Override public boolean onNavigationItemSelected(MenuItem menuItem) {
                //If Clicked...then get item and go to associated page
                switch(menuItem.getTitle().toString())
                {
                    case "Profile":
                        Log.i("Profile", menuItem.getTitle().toString());
                        startActivity(new Intent(HomeActivity.this, ProfileActivity.class));
                    /*case "Share":
                        startActivity(new Intent(HomeActivity.this, ProfileActivity.class));
                    case "Settings":
                        startActivity(new Intent(HomeActivity.this, ProfileActivity.class)); */
                    case "Logout":
                        Log.i("Logout", menuItem.getTitle().toString());
                        FirebaseAuth.getInstance().signOut();
                        //startActivity(new Intent(HomeActivity.this, LoginActivity.class));
                }

                menuItem.setChecked(true);
                drawerLayout.closeDrawers();
                return true;
            }
        });
    }

    //??????????????????????????????????????
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                drawerLayout.openDrawer(GravityCompat.START);
                return true;
        }

        return super.onOptionsItemSelected(item);
    }


} //END OF CLASS
ImTheNun
  • 167
  • 1
  • 10

1 Answers1

3

Inside setupDrawerLayout() under onNavigationItemSelected() you have a switch statement. In each case of the switch statement use break else all the following switch conditions may execute. Since the last case is to logout, the user might be getting signed out each time the switch statement executes.

  • kindly mark the answer as correct if it has led to the solution. – Koushik Shom Choudhury Feb 15 '18 at 14:34
  • Interesting, it works. I would have thought since I had Intents that I wouldn't need a break but apparently I do. – ImTheNun Feb 15 '18 at 15:20
  • 1
    This is because starting an activity does not finish the current activity on which the switch statement was running, so although there is a new activity which has started, the previous activity would continue to finish the ongoing statement unless it is destroyed. – Koushik Shom Choudhury Feb 15 '18 at 15:24