// Path: app/src/main/java/hu/supercluster/gameoflife/game/cellularautomaton/CellularAutomaton.java
// public interface CellularAutomaton<T extends Cell> extends Parcelable, Paintable {
//     int getSizeX();
//     int getSizeY();
//     int getDefaultCellState();
//     void reset();
//     void randomFill(Fill fill);
//     void step();
//     void step(int count);
//     Grid<T> getCurrentState();
//     void setState(Grid<T> grid);
//     Rule<T> getRule();
//     void setRule(Rule<T> rule);
// }
// 
// Path: app/src/main/java/hu/supercluster/gameoflife/game/cellularautomaton/CellularAutomatonFactory.java
// public interface CellularAutomatonFactory {
//     CellularAutomaton<?> create(int gridSizeX, int gridSizeY);
// }
// 
// Path: app/src/main/java/hu/supercluster/gameoflife/app/view/AutomatonView.java
// public class AutomatonView extends SurfaceView implements SurfaceHolder.Callback {
//     private CellularAutomaton automaton;
//     private GameParams params;
//     private AutomatonThread thread;
// 
//     public AutomatonView(Context context) {
//         super(context);
//     }
// 
//     public AutomatonView(Context context, AttributeSet attrs) {
//         super(context, attrs);
//     }
// 
//     public AutomatonView(Context context, AttributeSet attrs, int defStyle) {
//         super(context, attrs, defStyle);
//     }
// 
//     @DebugLog
//     public void init(CellularAutomaton automaton, GameParams params) {
//         this.automaton = automaton;
//         this.params = params;
// 
//         SurfaceHolder surfaceHolder = getHolder();
//         surfaceHolder.addCallback(this);
//     }
// 
//     @Override
//     @DebugLog
//     public void surfaceCreated(SurfaceHolder holder) {
//         if (thread == null || thread.getState() == Thread.State.TERMINATED) {
//             thread = new AutomatonThread(automaton, holder, params);
//             thread.start();
//         }
//         
//         thread.setRunning(true);
//     }
// 
//     @Override
//     public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
//         //
//     }
// 
//     @Override
//     @DebugLog
//     public void surfaceDestroyed(SurfaceHolder holder) {
//         thread.setRunning(false);
//         waitForThreadToDie();
//     }
// 
//     @DebugLog
//     private void waitForThreadToDie() {
//         while (true) {
//             try {
//                 thread.join();
//                 break;
// 
//             } catch (InterruptedException e) {
//             }
//         }
//     }
// 
//     @Override
//     public boolean onTouchEvent(MotionEvent event) {
//         paint(event);
// 
//         return true;
//     }
// 
//     protected void paint(MotionEvent event) {
//         int x = Math.round(event.getX() / params.getCellSizeInPixels());
//         int y = Math.round(event.getY() / params.getCellSizeInPixels());
// 
//         EventBus.getInstance().post(new PaintWithBrush(x, y));
//     }
// }


import android.os.Bundle;
import hu.supercluster.gameoflife.game.cellularautomaton.CellularAutomaton;
import hu.supercluster.gameoflife.game.cellularautomaton.CellularAutomatonFactory;
import hu.supercluster.gameoflife.app.view.AutomatonView;
package hu.supercluster.gameoflife.game.manager;



public class GameManager {
    public static final String KEY_AUTOMATON = "automaton";
    private final AutomatonView automatonView;
    private CellularAutomaton automaton;
    private GameParams params;

    public GameManager(Bundle savedGameState, AutomatonView automatonView, CellularAutomatonFactory factory, GameParams params) {
        this.automatonView = automatonView;
        this.params = params;

        if (savedGameState != null) {
            restoreGameState(savedGameState);

        } else {
// Path: app/src/main/java/hu/supercluster/gameoflife/game/cellularautomaton/CellularAutomaton.java
// public interface CellularAutomaton<T extends Cell> extends Parcelable, Paintable {
//     int getSizeX();
//     int getSizeY();
//     int getDefaultCellState();
//     void reset();
//     void randomFill(Fill fill);
//     void step();
//     void step(int count);
//     Grid<T> getCurrentState();
//     void setState(Grid<T> grid);
//     Rule<T> getRule();
//     void setRule(Rule<T> rule);
// }
// 
// Path: app/src/main/java/hu/supercluster/gameoflife/game/cellularautomaton/CellularAutomatonFactory.java
// public interface CellularAutomatonFactory {
//     CellularAutomaton<?> create(int gridSizeX, int gridSizeY);
// }
// 
// Path: app/src/main/java/hu/supercluster/gameoflife/app/view/AutomatonView.java
// public class AutomatonView extends SurfaceView implements SurfaceHolder.Callback {
//     private CellularAutomaton automaton;
//     private GameParams params;
//     private AutomatonThread thread;
// 
//     public AutomatonView(Context context) {
//         super(context);
//     }
// 
//     public AutomatonView(Context context, AttributeSet attrs) {
//         super(context, attrs);
//     }
// 
//     public AutomatonView(Context context, AttributeSet attrs, int defStyle) {
//         super(context, attrs, defStyle);
//     }
// 
//     @DebugLog
//     public void init(CellularAutomaton automaton, GameParams params) {
//         this.automaton = automaton;
//         this.params = params;
// 
//         SurfaceHolder surfaceHolder = getHolder();
//         surfaceHolder.addCallback(this);
//     }
// 
//     @Override
//     @DebugLog
//     public void surfaceCreated(SurfaceHolder holder) {
//         if (thread == null || thread.getState() == Thread.State.TERMINATED) {
//             thread = new AutomatonThread(automaton, holder, params);
//             thread.start();
//         }
//         
//         thread.setRunning(true);
//     }
// 
//     @Override
//     public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
//         //
//     }
// 
//     @Override
//     @DebugLog
//     public void surfaceDestroyed(SurfaceHolder holder) {
//         thread.setRunning(false);
//         waitForThreadToDie();
//     }
// 
//     @DebugLog
//     private void waitForThreadToDie() {
//         while (true) {
//             try {
//                 thread.join();
//                 break;
// 
//             } catch (InterruptedException e) {
//             }
//         }
//     }
// 
//     @Override
//     public boolean onTouchEvent(MotionEvent event) {
//         paint(event);
// 
//         return true;
//     }
// 
//     protected void paint(MotionEvent event) {
//         int x = Math.round(event.getX() / params.getCellSizeInPixels());
//         int y = Math.round(event.getY() / params.getCellSizeInPixels());
// 
//         EventBus.getInstance().post(new PaintWithBrush(x, y));
//     }
// }


// Path: app/src/main/java/hu/supercluster/gameoflife/game/manager/GameManager.java
import android.os.Bundle;
import hu.supercluster.gameoflife.game.cellularautomaton.CellularAutomaton;
import hu.supercluster.gameoflife.game.cellularautomaton.CellularAutomatonFactory;
import hu.supercluster.gameoflife.app.view.AutomatonView;

package hu.supercluster.gameoflife.game.manager;



public class GameManager {
    public static final String KEY_AUTOMATON = "automaton";
    private final AutomatonView automatonView;
    private CellularAutomaton automaton;
    private GameParams params;

    public GameManager(Bundle savedGameState, AutomatonView automatonView, CellularAutomatonFactory factory, GameParams params) {
        this.automatonView = automatonView;
        this.params = params;

        if (savedGameState != null) {
            restoreGameState(savedGameState);

        } else {
            this.automaton = createAutomaton(factory, params);