package com.kaon.crashsurfaceflinger;

import java.util.Random;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.Window;
import android.view.WindowManager;
 
public class CrashSurfaceFlinger extends Activity {
  
 MySurfaceView mySurfaceView;
 int width, height;
 int[] pixels;
  
   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       mySurfaceView = new MySurfaceView(this);
       setContentView(mySurfaceView);
       
       Window w = getWindow();
       WindowManager mWMgr =
       	(WindowManager)getSystemService(WINDOW_SERVICE);
       width = mWMgr.getDefaultDisplay().getWidth();
       height = mWMgr.getDefaultDisplay().getHeight();
       pixels = new int[width*height];
   }
   
   @Override
 protected void onResume() {
  super.onResume();
  mySurfaceView.onResumeMySurfaceView();
 }
 
 @Override
 protected void onPause() {
  super.onPause();
  mySurfaceView.onPauseMySurfaceView();
 }
 
 class MySurfaceView extends SurfaceView implements Runnable{
     
    Thread thread = null;
    SurfaceHolder surfaceHolder;
    volatile boolean running = false;
    private int frameCount, lastFrameCount;
    private long second;
     
    Random random;
 
  public MySurfaceView(Context context) {
   super(context);
   // TODO Auto-generated constructor stub
   surfaceHolder = getHolder();
   random = new Random();
  }
   
  public void onResumeMySurfaceView(){
   running = true;
   thread = new Thread(this);
   thread.start();
  }
   
  public void onPauseMySurfaceView(){
   boolean retry = true;
   running = false;
   while(retry){
    try {
     thread.join();
     retry = false;
    } catch (InterruptedException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
   }
  }

  @Override
  public void run() {
	  Paint whitePaint = new Paint();
      whitePaint.setColor(0xFFFFFFFF);
      whitePaint.setTextSize(40);
	  Paint blackPaint = new Paint();
      blackPaint.setColor(0xFF000000);
  	  Rect toDraw = new Rect();
      
	  
   // TODO Auto-generated method stub
   while(running){
    if(surfaceHolder.getSurface().isValid()){
     Canvas canvas = surfaceHolder.lockCanvas(null);
     //... actual drawing on canvas

     int x0 = random.nextInt(width-1);
     int y0 = random.nextInt(height-1)+50;
     int r = random.nextInt(255);
     int g = random.nextInt(255);
     int b = random.nextInt(255);
     int w = random.nextInt(200);
     int h = random.nextInt(200);
     if ( x0+w>=width ) w = width-x0-1;
     if ( y0+h>=height ) h = height-y0-1;
     if ( w>=1 && h>=1 )
     {
	     int color = 0xff000000 + (r << 16) + (g << 8) + b;
	     for( int y=y0; y<y0+h; y++)
	         for( int x=x0; x<x0+w; x++)
	       		 pixels[ y*width+x ] = color;
    	toDraw.union( x0, y0, x0+w, y0+h);
	     
		canvas.drawBitmap (pixels, 0, width, 0, 0, width, height, false, null);
//		canvas.drawBitmap (pixels,toDraw.top*width+toDraw.left, width, toDraw.left, toDraw.top, toDraw.right-toDraw.left, toDraw.bottom-toDraw.top, false, whitePaint);
		toDraw.left = x0;
		toDraw.top = y0;
		toDraw.right = x0+w;
		toDraw.bottom = y0+h;
		
//		canvas.drawBitmap (pixels, 0, width, 0, 0, width, height, false, null);
     }
	frameCount++;
	long s = System.currentTimeMillis()/1000;
	if ( s!=second )
	{
		lastFrameCount = frameCount;
		frameCount = 0;
		second = s;
	}
//	canvas.drawBitmap (pixels,0, width, 0, 0, width, 50, false, null);
	canvas.drawText(lastFrameCount+"  FPS", 50, 50, whitePaint ); // After adding drawText crashed!!! Check this up!!!
     surfaceHolder.unlockCanvasAndPost(canvas);
    }
   }
  }
     
   }
}
