Search code examples
javaandroidfirebaseandroid-intentandroid-activity

Activity keeps opening itself after each click


I'm making a multiplayer game using firebase. In the FindOpponentActivity below. The app checks if a lobby already exists and if it doesn't, creates one. If one already exists, the player joins the lobby and both players go to the GameActivity and the game starts. Now the player who created the lobby, the host if you will, has this problem that when the GameActivity launches it starts up multiple times on top of itself. Also, whenever a button is clicked (so onDataChange is called), the host opens up another GameActivty. The player 2 doesn"t do this. What am i doing wrong?

This is my FindOpponentActivity:

package com.example.android.pitjesbak;

import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

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.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

public class FindOpponentActivity extends AppCompatActivity {

    private FirebaseDatabase db;
    private DatabaseReference lobbies;
    private DatabaseReference users;
    private DatabaseReference lobby;

    private String lobbyKey;

    FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();

    TextView status, findingOpponent;

    TextView cancel;

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


        db = FirebaseDatabase.getInstance();
        lobbies = db.getReference("lobbies");
        users = db.getReference("users");


        final Handler handler = new Handler();

        final Runnable findOpponent = new Runnable() {
            public void run() {
                OpponentExists();
            }
        };

        handler.postDelayed(findOpponent, 5000);

        cancel = findViewById(R.id.cancel);
        cancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                lobbies.addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                        if(dataSnapshot.child(user.getUid()).exists()){
                            lobbies.child(user.getUid()).removeValue();
                        }else{
                            handler.removeCallbacks(findOpponent);
                        }
                        Intent intent = new Intent(getApplicationContext(), MainActivity.class);
                        startActivity(intent);

                    }

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

                    }
                });
            }
        });











    }






    public void OpponentExists(){

        lobbies.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                if(dataSnapshot.exists()){
                    joinOpponent();
                }else{
                    createLobby();
                }
            }

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

            }
        });
    };

    public void joinOpponent(){
        lobbies.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for(DataSnapshot child: dataSnapshot.getChildren()){
                    if(!child.child("player2").exists()){
                        lobbyKey = child.getKey();
                        break;
                    }
                }
                if(lobbyKey == null){
                    createLobby();
                }else{
                    lobbies.child(lobbyKey).child("player2").setValue(user.getEmail());
                    Intent startGame = new Intent(getApplicationContext(), GameActivity.class);
                    startGame.putExtra("lobbyKey", lobbyKey);
                    startGame.putExtra("player", 2);
                    startActivity(startGame);
                    FindOpponentActivity.this.finish();
                }


            }

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

            }
        });
    }

    public void createLobby(){
        lobbies.child(user.getUid()).child("dice1").setValue(0);
        lobbies.child(user.getUid()).child("dice2").setValue(0);
        lobbies.child(user.getUid()).child("dice3").setValue(0);
        lobbies.child(user.getUid()).child("lives_p1").setValue(7);
        lobbies.child(user.getUid()).child("lives_p2").setValue(7);
        lobbies.child(user.getUid()).child("turn").setValue(1);
        lobbies.child(user.getUid()).child("has_stoeft").setValue(0);
        lobbies.child(user.getUid()).child("total_score_p1").setValue(0);
        lobbies.child(user.getUid()).child("total_score_p2").setValue(0);
        lobbies.child(user.getUid()).child("current_score_p1").setValue("0 points");
        lobbies.child(user.getUid()).child("current_score_p2").setValue("0 points");
        lobbies.child(user.getUid()).child("rolls_left").setValue(3);

        lobbies.child(user.getUid()).child("player1").setValue(user.getEmail());
        lobbyKey = user.getUid();

        lobby = lobbies.child(lobbyKey);


        lobby.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                if(dataSnapshot.child("player2").exists()){
                    Intent startGame = new Intent(getApplicationContext(), GameActivity.class);
                    startGame.putExtra("lobbyKey", lobbyKey);
                    startGame.putExtra("player", 1);
                    startActivity(startGame);
                    FindOpponentActivity.this.finish();
                }
            }

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

            }
        });

    };

}

And this is my GameActivity:

package com.example.android.pitjesbak;

import android.content.Intent;
import android.os.Bundle;
import android.os.PersistableBundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.LinearLayout;
import android.widget.PopupWindow;
import android.widget.TextView;
import android.widget.Toast;

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.Random;

import static android.view.View.INVISIBLE;
import static android.view.View.VISIBLE;

public class GameActivity extends AppCompatActivity {

    Button roll, stop;

    TextView dice1, dice2, dice3, stoefen, player, other, current_score_player, current_score_other, lives_player, lives_other;

    CheckBox[] checks = new CheckBox[3];

    private int[] dice = new int[3];

    int min = 1;
    int max = 6;

    private int[] dice_scores = new int[3];
    String dice_total;

    boolean sn_4, sn_5, sn_6;

    boolean has_stoeft = false;

    int rolls_left;

    int turn = 1;

    int playing;

    String popup;


    String lobbyKey;

    FirebaseDatabase db;
    DatabaseReference lobby;

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

        lobbyKey= getIntent().getStringExtra("lobbyKey");

        db = FirebaseDatabase.getInstance();
        lobby = db.getReference("lobbies").child(lobbyKey);

        roll = findViewById(R.id.roll);
        stop = findViewById((R.id.stop));
        roll.setEnabled(false);

        stoefen = findViewById(R.id.stoefen);
        stoefen.setVisibility(INVISIBLE);

        roll.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                roll();
            }
        });
        stop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                stop();
            }
        });


        dice1 = findViewById(R.id.dice1);
        dice2 = findViewById(R.id.dice2);
        dice3 = findViewById(R.id.dice3);

        checks[0] = (CheckBox) findViewById(R.id.check1);
        checks[1] = (CheckBox) findViewById(R.id.check2);
        checks[2] = (CheckBox) findViewById(R.id.check3);

        player = findViewById(R.id.player);
        current_score_player = findViewById(R.id.current_score_player);
        lives_player = findViewById(R.id.lives_player);

        other = findViewById(R.id.other);
        current_score_other = findViewById(R.id.current_score_other);
        lives_other = findViewById(R.id.lives_other);




            lobby.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull final DataSnapshot dataSnapshot) {
                    int playerCheck = getIntent().getIntExtra("player", 1);
                    if(playerCheck == 1) {
                        player.setText(dataSnapshot.child("player1").getValue(String.class));
                        current_score_player.setText(dataSnapshot.child("current_score_p1").getValue(String.class));
                        lives_player.setText(dataSnapshot.child("lives_p1").getValue(Long.class).toString());

                        other.setText(dataSnapshot.child("player2").getValue(String.class));
                        current_score_other.setText(dataSnapshot.child("current_score_p2").getValue(String.class));
                        lives_other.setText(dataSnapshot.child("lives_p2").getValue(Long.class).toString());
                    }else{
                        player.setText(dataSnapshot.child("player2").getValue(String.class));
                        current_score_player.setText(dataSnapshot.child("current_score_p2").getValue(String.class));
                        lives_player.setText(dataSnapshot.child("lives_p2").getValue(Long.class).toString());

                        other.setText(dataSnapshot.child("player1").getValue(String.class));
                        current_score_other.setText(dataSnapshot.child("current_score_p1").getValue(String.class));
                        lives_other.setText(dataSnapshot.child("lives_p1").getValue(Long.class).toString());
                    }

                    turn = dataSnapshot.child("turn").getValue(int.class);
                    if(turn%2 == 0){
                        playing = 2;
                    }else{
                        playing = 1;
                    }

                    if(playing == playerCheck){
                        roll.setEnabled(true);
                    }else{
                        roll.setEnabled(false);
                        stop.setEnabled(false);
                    }


                    dice1.setText(dataSnapshot.child("dice1").getValue(Long.class).toString());
                    dice2.setText(dataSnapshot.child("dice2").getValue(Long.class).toString());
                    dice3.setText(dataSnapshot.child("dice3").getValue(Long.class).toString());

                    rolls_left = dataSnapshot.child("rolls_left").getValue(int.class);


                    if(rolls_left == 3){
                        for (int i = 0; i < 3; i++) {
                            checks[i].setEnabled(false);
                        }
                        stop.setEnabled(false);
                    }
                    if (rolls_left < 3) {

                        if (rolls_left == 2) {
                            stoefen.setVisibility(VISIBLE);
                        } else {
                            stoefen.setVisibility(INVISIBLE);
                        }

                        if(rolls_left == 0){
                            roll.setEnabled(false);
                        }

                        stop.setEnabled(true);
                        for (int i = 0; i < 3; i++) {
                            checks[i].setEnabled(true);
                        }
                    }



                    if(dataSnapshot.child("round_winner").exists()) {
                        if (dataSnapshot.child("winner").exists()) {
                            Intent intent = new Intent(getApplicationContext(), FinishActivity.class);
                            intent.putExtra("lobbyKey", lobbyKey);
                            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                            startActivity(intent);
                            GameActivity.this.finish();
                        } else {
                            lobby.child("current_score_p1").setValue("0 points");
                            lobby.child("current_score_p2").setValue("0 points");
                            lobby.child("round_winner").removeValue();
                            lobby.child("has_stoeft").setValue(false);
                            lobby.child("rolls_left").setValue(3);
                            lobby.child("turn").setValue(1);
                            lobby.child("readyup").removeValue();
                            Intent intent = new Intent(getApplicationContext(), GameActivity.class);
                            intent.putExtra("player", playerCheck);
                            intent.putExtra("lobbyKey", lobbyKey);
                            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                            startActivity(intent);
                            GameActivity.this.finish();
                        }
                    }




                }

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

                }
            });


    }




    public void roll(){
        if (rolls_left > 0) {
            Toast.makeText(GameActivity.this, rolls_left + " rolls left", Toast.LENGTH_SHORT).show();
        } else if (rolls_left == 0) {
            Toast.makeText(GameActivity.this, "no rolls left", Toast.LENGTH_SHORT).show();
            roll.setEnabled(false);
        }


        sn_4 = false;
        sn_5 = false;
        sn_6 = false;

        // generate numbers
        for (int i = 0; i < 3; i++) {
            if (checks[i].isChecked() == false) {
                Random r = new Random();
                int random = r.nextInt(((max - min) + 1)) + min;
                dice[i] = random;
            }else{
                if(i == 0){
                    dice[0] = Integer.parseInt(dice1.getText().toString());
                }else if(i == 1){
                    dice[1] = Integer.parseInt(dice2.getText().toString());
                }else if(i == 2){
                    dice[2] = Integer.parseInt(dice3.getText().toString());
                }
            }
        }

        lobby.child("dice1").setValue(dice[0]);
        lobby.child("dice2").setValue(dice[1]);
        lobby.child("dice3").setValue(dice[2]);



        // Set scores
        for (int i = 0; i < 3; i++) {
            if (dice[i] == 4) {
                sn_4 = true;
            }

            if (dice[i] == 5) {
                sn_5 = true;
            }

            if (dice[i] == 6) {
                sn_6 = true;
            }
        }

        if (dice[0] == dice[1] && dice[1] == dice[2]) {
            if (dice[0] == 1) {
                dice_total = "3 azen";
            } else {
                dice_total = "zand";
            }
        } else if (sn_4 == true && sn_5 == true && sn_6 == true) {
            dice_total = "soixante-neuf";
        } else {
            for (int i = 0; i < 3; i++) {
                if (dice[i] == 1) {
                    dice_scores[i] = 100;
                } else if (dice[i] == 6) {
                    dice_scores[i] = 60;
                } else {
                    dice_scores[i] = dice[i];
                }
            }

            dice_total = (dice_scores[0] + dice_scores[1] + dice_scores[2]) + " points";

        }
        if(playing == 1){
            lobby.child("current_score_p1").setValue(dice_total);
        }else{
            lobby.child("current_score_p2").setValue(dice_total);
        }

        if(rolls_left > 0){
            rolls_left -= 1;
        }else{
            roll.setEnabled(false);
        }
        lobby.child("rolls_left").setValue(rolls_left);

    };

    public void stop(){
        if(stoefen.getVisibility() == VISIBLE){
            has_stoeft = true;
            lobby.child("has_stoeft").setValue(true);
        }

        if(turn == 1){
            lobby.child("turn").setValue(2);
            lobby.child("rolls_left").setValue(3);
        }else if(turn == 2){
            int winner = 0;
            int worth = 0;
            switch (current_score_player.getText().toString()) {
                case "3 azen":
                    if (current_score_other.getText().toString().equals("3 azen")) {
                        winner = 0;
                        worth = 0;
                    } else {
                        winner = 2;
                        worth = Integer.parseInt(lives_player.getText().toString());
                    }
                    break;
                case "soixante-neuf":
                    if (current_score_other.getText().toString().equals("3 azen")) {
                        winner = 1;
                        worth = Integer.parseInt(lives_other.getText().toString());
                    } else if (current_score_other.getText().toString().equals("soixante-neuf")) {
                        winner = 0;
                        worth = 0;
                    } else {
                        winner = 2;
                        worth = 3;
                    }
                    break;
                case "zand":
                    if (current_score_other.getText().toString().equals("3 azen") || current_score_other.getText().toString().equals("soixante-neuf")) {
                        winner = 1;
                        if(current_score_other.getText().toString().equals("3 azen")){
                            worth = Integer.parseInt(lives_other.getText().toString());
                        }else{
                            worth = 3;
                        }
                    } else if (current_score_other.getText().toString().equals("zand")) {
                        winner = 0;
                        worth = 0;
                    } else {
                        winner = 2;
                        worth = 2;
                    }
                    break;
                default:
                    if (current_score_other.getText().toString().equals("3 azen") || current_score_other.getText().toString().equals("soixante-neuf") || current_score_other.getText().toString().equals("zand")) {
                        winner = 1;
                        if(current_score_other.getText().toString().equals("3 azen")){
                            worth = Integer.parseInt(lives_other.getText().toString());
                        }else if(current_score_other.getText().toString().equals("soixante-neuf")){
                            worth = 3;
                        }else if(current_score_other.getText().toString().equals("zand")){
                            worth = 2;
                        }
                    } else {
                        String[] p2_parts = current_score_player.getText().toString().split(" ");
                        int score_p2 = Integer.parseInt(p2_parts[0]);
                        String[] p1_parts = current_score_other.getText().toString().split(" ");
                        int score_p1 = Integer.parseInt(p1_parts[0]);
                        if (score_p1 > score_p2) {
                            winner = 1;
                            worth = 1;
                        } else if (score_p1 < score_p2) {
                            winner = 2;
                            worth = 1;
                        } else {
                            winner = 0;
                            worth = 0;
                        }
                    }
            }



            int lives_p1 = Integer.parseInt(lives_other.getText().toString());
            int lives_p2 = Integer.parseInt(lives_player.getText().toString());

             if( winner == 1){
                lives_p1 -= worth;
                if(has_stoeft){
                    lives_p1 --;
                }
                lobby.child("lives_p1").setValue(lives_p1);
            }else if(winner == 2){
                lives_p2 -= worth;
                if(has_stoeft){
                    lives_p1 += 2;
                }
                lobby.child("lives_p2").setValue(lives_p2);
                lobby.child("lives_p1").setValue(lives_p1);
            }

            if(lives_p1 <= 0){
                lobby.child("winner").setValue(1);
            }
            if(lives_p2 <= 0){
                lobby.child("winner").setValue(2);
            }

            lobby.child("round_winner").setValue(winner);




        }
    }
}

Solution

  • Have you tried removing the event listener you add/attach in FindOpponentsActivity after the event is received or during activity teardown (onStop/onDestroy)? My guess is it still attached and receiving events.