public void onAnimationFinished(Animation animation) {
   if (animation == moveAnimation) {
     dataHolder.getGameEngine().moveFinished();
   } else if (animation == explosionAnimation) {
     dataHolder.getGameEngine().selectionExploded();
     startMove();
   }
 }
 public void startMove() {
   if (selectionAnimation.isActive()) {
     selectionAnimation.stop();
   }
   moveAnimation.setSpeed(dataHolder.getConfiguration().isFastAnimation());
   moveAnimation.setStartValues(
       dataHolder.getGameEngine().getGameField().getMaxMoveX(),
       dataHolder.getGameEngine().getGameField().getMaxMoveY());
   moveAnimation.init(SystemClock.elapsedRealtime());
   invalidate();
 }
  private void initBallSkin(Context context) {
    Bitmap ballSkinFull =
        BitmapFactory.decodeResource(
            getResources(),
            dataHolder.getConfiguration() == null
                ? R.drawable.balls
                : dataHolder.getConfiguration().getSkin());

    dataHolder.setBallSkin(ballSkinFull);
    dataHolder.setExploseBallSkin(
        BitmapFactory.decodeResource(getResources(), R.drawable.explosion));
  }
  private void drawBackGroud(Canvas canvas) {
    if (dataHolder.getGameEngine().getGameField().getSizeY() != backGroundImageFieldSizeY
        || dataHolder.getGameEngine().getGameField().getSizeX() != backGroundImageFieldSizeX
        || backgroundImageSaved == null) {

      backgroundImageSaved = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.RGB_565);
      Canvas newCanvas = new Canvas(backgroundImageSaved);
      drawBackGroudImageOnGivenCanvas(newCanvas);
      backGroundImageFieldSizeX = dataHolder.getGameEngine().getGameField().getSizeX();
      backGroundImageFieldSizeY = dataHolder.getGameEngine().getGameField().getSizeY();
    }
    canvas.drawBitmap(backgroundImageSaved, 0, 0, null);
  }
 private void startExplosion() {
   if (selectionAnimation.isActive()) {
     selectionAnimation.stop();
   }
   explosionAnimation.setSpeed(dataHolder.getConfiguration().isFastAnimation());
   explosionAnimation.init(SystemClock.elapsedRealtime());
   invalidate();
 }
  @Override
  public boolean onTouchEvent(MotionEvent event) {
    if (moveAnimation.isActive() || explosionAnimation.isActive()) {
      return true;
    }
    if (event.getAction() != MotionEvent.ACTION_UP) {
      return true; // super.onTouchEvent(event);
    }
    int x = Math.round((event.getX() - dataHolder.getCellSize() / 2) / dataHolder.getCellSize());
    int y = Math.round((event.getY() - dataHolder.getCellSize() / 2) / dataHolder.getCellSize());
    if (x < 0
        || x >= dataHolder.getGameEngine().getGameField().getSizeX()
        || y < 0
        || y >= dataHolder.getGameEngine().getGameField().getSizeY()) {
      return super.onTouchEvent(event);
    } else {
      TouchResult results = dataHolder.getGameEngine().touchAction(x, y);
      switch (results) {
        case explode:
          startExplosion();
          break;

        case selected:
          startSelection();
          break;

        case no_action:
          if (selectionAnimation.isActive()) {
            selectionAnimation.stop();
            invalidate();
          }
          if (moveAnimation.isActive()) {
            moveAnimation.stop();
            invalidate();
          }
          break;
        default:
          break;
      }
    }
    return true;
  }
  private void drawBackGroudImageOnGivenCanvas(Canvas canvas) {
    canvas.drawBitmap(dataHolder.getBackgroundImage(), 0, 0, null);

    dataHolder.getLightPaint().setColor(Color.rgb(0x83, 0x83, 0x83));
    dataHolder.getDarkPaint().setColor(Color.rgb(0x3b, 0x3b, 0x3b));

    final int cellSize = dataHolder.getCellSize();
    final int sizeY = dataHolder.getGameEngine().getGameField().getSizeY();
    final int sizeX = dataHolder.getGameEngine().getGameField().getSizeX();
    for (int i = 1; i < sizeX; i++) {
      canvas.drawLine(
          i * cellSize - 1, 0, i * cellSize - 1, sizeY * cellSize, dataHolder.getLightPaint());
      canvas.drawLine(i * cellSize, 0, i * cellSize, sizeY * cellSize, dataHolder.getDarkPaint());
    }

    for (int i = 1; i < sizeY; i++) {
      canvas.drawLine(0, i * cellSize, sizeX * cellSize, i * cellSize, dataHolder.getDarkPaint());
      canvas.drawLine(
          0, i * cellSize + 1, sizeX * cellSize, i * cellSize + 1, dataHolder.getLightPaint());
    }
  }
 public void setGameEngine(GameEngine gameEngine) {
   dataHolder.setGameEngine(gameEngine);
 }
 private void initBackgroundImage() {
   dataHolder.setBackgroundImage(
       BitmapFactory.decodeResource(getResources(), R.drawable.background));
 }
 public void setCellSize(int value) {
   dataHolder.setCellSize(value);
 }
 public int getCellSize() {
   return dataHolder.getCellSize();
 }
 public void setConfiguration(Configuration configuration) {
   dataHolder.setConfiguration(configuration);
 }