gyrodraw/GyroDraw

View on GitHub
app/src/main/java/ch/epfl/sweng/GyroDraw/game/drawing/DrawingOnlineActivity.java

Summary

Maintainability
A
2 hrs
Test Coverage
package ch.epfl.sweng.GyroDraw.game.drawing;

import android.content.Intent;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting;
import android.util.Log;
import android.widget.TextView;

import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.ValueEventListener;
import com.google.firebase.storage.StorageTask;
import com.google.firebase.storage.UploadTask.TaskSnapshot;

import ch.epfl.sweng.GyroDraw.R;
import ch.epfl.sweng.GyroDraw.auth.Account;
import ch.epfl.sweng.GyroDraw.firebase.FbDatabase;
import ch.epfl.sweng.GyroDraw.firebase.OnSuccessValueEventListener;
import ch.epfl.sweng.GyroDraw.game.VotingPageActivity;
import ch.epfl.sweng.GyroDraw.localDatabase.LocalDbForImages;
import ch.epfl.sweng.GyroDraw.localDatabase.LocalDbHandlerForImages;
import ch.epfl.sweng.GyroDraw.matchmaking.GameStates;
import ch.epfl.sweng.GyroDraw.utils.network.ConnectivityWrapper;

import static ch.epfl.sweng.GyroDraw.firebase.RoomAttributes.STATE;
import static ch.epfl.sweng.GyroDraw.firebase.RoomAttributes.TIMER;
import static ch.epfl.sweng.GyroDraw.firebase.RoomAttributes.UPLOAD_DRAWING;
import static ch.epfl.sweng.GyroDraw.game.LoadingScreenActivity.ROOM_ID;
import static ch.epfl.sweng.GyroDraw.game.WaitingPageActivity.WINNING_WORD;
import static ch.epfl.sweng.GyroDraw.game.drawing.FeedbackTextView.timeIsUpTextFeedback;

/**
 * Class representing the drawing phase of an online game in normal mode.
 */
public class DrawingOnlineActivity extends GyroDrawingActivity {

    private static final String TAG = "DrawingOnlineActivity";

    private String winningWord;

    private String roomId;

    protected final ValueEventListener listenerTimer = new OnSuccessValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            Integer value = dataSnapshot.getValue(Integer.class);

            if (value != null) {
                ((TextView) findViewById(R.id.timeRemaining)).setText(String.valueOf(value));
            }
        }
    };

    protected final ValueEventListener listenerState = new OnSuccessValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            Integer state = dataSnapshot.getValue(Integer.class);
            if (state != null) {
                GameStates stateEnum = GameStates.convertValueIntoState(state);
                switch (stateEnum) {
                    case WAITING_UPLOAD:
                        DrawingOnlineActivity.this.runOnUiThread(new Runnable() {
                            public void run() {
                                paintViewHolder
                                        .addView(timeIsUpTextFeedback(DrawingOnlineActivity.this));
                            }
                        });
                        uploadDrawing().addOnCompleteListener(
                                new OnCompleteListener<TaskSnapshot>() {
                                    @Override
                                    public void onComplete(@NonNull Task<TaskSnapshot> task) {
                                        FbDatabase.setValueToUserInRoomAttribute(roomId,
                                                Account.getInstance(getApplicationContext())
                                                        .getUsername(), UPLOAD_DRAWING, 1);
                                        Log.d(TAG, "Upload completed");

                                        Log.d(TAG, winningWord);
                                        FbDatabase.removeListenerFromRoomAttribute(roomId,
                                                TIMER, listenerTimer);

                                        Intent intent = new Intent(getApplicationContext(),
                                                VotingPageActivity.class);
                                        intent.putExtra(ROOM_ID, roomId);
                                        startActivity(intent);
                                    }
                                });
                        break;
                    default:
                }
            }
        }
    };

    @VisibleForTesting
    @Override
    public int getLayoutId() {
        return R.layout.activity_drawing_online;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ConnectivityWrapper.registerNetworkReceiver(this);

        Intent intent = getIntent();

        roomId = intent.getStringExtra(ROOM_ID);
        winningWord = intent.getStringExtra(WINNING_WORD);

        TextView wordView = findViewById(R.id.winningWord);
        wordView.setText(winningWord);
        wordView.setTypeface(typeMuro);

        ((TextView) findViewById(R.id.timeRemaining)).setTypeface(typeMuro);

        FbDatabase.setListenerToRoomAttribute(roomId, TIMER, listenerTimer);
        FbDatabase.setListenerToRoomAttribute(roomId, STATE, listenerState);

        ConnectivityWrapper.setOnlineStatusInGame(roomId, Account.getInstance(this).getUsername());
    }

    @Override
    protected void onPause() {
        super.onPause();
        ConnectivityWrapper.unregisterNetworkReceiver(this);

        removeAllListeners();
        finish();
    }

    private void removeAllListeners() {
        FbDatabase.removeListenerFromRoomAttribute(roomId, TIMER, listenerTimer);
        FbDatabase.removeListenerFromRoomAttribute(roomId, STATE, listenerState);
    }

    /**
     * Saves drawing in the local database and uploads it to Firebase Storage.
     *
     * @return the {@link StorageTask} in charge of the upload
     */
    private StorageTask<TaskSnapshot> uploadDrawing() {
        LocalDbForImages localDbHandler = new LocalDbHandlerForImages(this, null, 1);
        paintView.saveCanvasInDb(localDbHandler);
        return paintView.saveCanvasInStorage();
    }

    /**
     * Method that calls {@code listenerTimer.onDataChange()} on the UI thread.
     *
     * @param dataSnapshot Snapshot of the database (mock snapshot in our case).
     */
    @VisibleForTesting(otherwise = VisibleForTesting.NONE)
    public void callOnDataChangeTimer(final DataSnapshot dataSnapshot) {
        this.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                listenerTimer.onDataChange(dataSnapshot);
            }
        });
    }
}