// Path: app/src/main/java/com/lsjwzh/test/FpsCalculator.java
// public class FpsCalculator {
// 
// 	private final static String TAG = "FpsCalculator";
// 	
//     private long mFrameIntervalNanos;
//     
//     private boolean mRunning = false;
//     
//     private static FpsCalculator instance;
// 
// 	private AtomicInteger atom = new AtomicInteger(0);
// 	private Thread syncCheckThread = null;
//     
//     static {
//     	instance = new FpsCalculator();
//     }
//     
//     public static FpsCalculator instance() {
//     	return instance;
//     }
// 	
// 	private int totalFps;
// 	private int fpsCalculateCount;
// 	private boolean isCalculatingFPS;
// 	
// 	// calculate the average fps
// 	
// 	public void startCalculate() {
// 		totalFps = 0;
// 		fpsCalculateCount = 0;
// 		isCalculatingFPS = true;
// 	}
// 	
// 	public int stopGetAvgFPS() {
// 		isCalculatingFPS = false;
// 		int avgFPS = totalFps / fpsCalculateCount;
// 		totalFps = 0;
// 		fpsCalculateCount = 0;
// 		return avgFPS;
// 	}
// 
// 	private void syncCheckThread(){
// 		if(!mRunning){
// 			return;
// 		}
// 		int val = atom.getAndSet(0);
// 		if (isCalculatingFPS) {
// 			totalFps += val;
// 			fpsCalculateCount++;
// 		}
// 		android.util.Log.i(TAG, "FPS: " + val);
// 		try {
// 			Thread.sleep(1000);
// 		} catch (InterruptedException e) {
// 			e.printStackTrace();
// 		}
// 	}
// 	    
// 	private FrameCallback frameCallback = new FrameCallback() {
// 
// 		@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
// 		@Override
// 		public void doFrame(long frameTimeNanos) {
// 			
// 			if (!mRunning) {
// 				return;
// 			}
//             
//             Choreographer.getInstance().postFrameCallback(frameCallback);
// 
// 			atom.incrementAndGet();
// 		}};
// 	
// 	@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
// 	public void start() {
// 		Log.d(TAG, "start vsync detect");
// 		if (mRunning) {
// 			return;
// 		}
// 		
// 		mRunning = true;
// 
// 		syncCheckThread = new Thread(new Runnable() {
// 			@Override
// 			public void run() {
// 				for (;;) {
// 					if (!mRunning) {
// 						break;
// 					}
// 					syncCheckThread();
// 				}
// 			}
// 		});
// 		syncCheckThread.start();
// 		
// 		Choreographer chor = Choreographer.getInstance();
// 		Field field;
// 		try {
// 			field = chor.getClass().getDeclaredField("mFrameIntervalNanos");
// 			field.setAccessible(true);
// 			mFrameIntervalNanos = field.getLong(chor);
// 			Log.d(TAG, "mFrameIntervalNanos " + mFrameIntervalNanos);
// 		} catch (Exception e) {
// 			Log.e(TAG, "error: " + e.getMessage());
// 		}
// 		chor.postFrameCallback(frameCallback);
// 
// 	}
// 	
// 	public void stop() {
// 		mRunning = false;
// 		if (syncCheckThread != null) {
// 			try {
// 				syncCheckThread.join();
// 			} catch (InterruptedException e) {
// 				e.printStackTrace();
// 			}
// 		}
// 	}
// }
// 
// Path: app/src/main/java/com/lsjwzh/test/GhostThread.java
// public class GhostThread  {
//     private static final String TAG = "GhostThread";
//     
//     private static boolean isStart = false;
//     
//     private static Thread[] threads = new Thread[0];
// 
//     private static Random random = new Random();
//     private static Runnable runnable = new Runnable() {
//         @Override
//         public void run() {
//             for (; ;) {
//                 if (!isStart) {
//                     break;
//                 }
//                 double c = Math.PI * Math.PI * Math.PI * random.nextFloat();
// //                Log.e("test", "v:" + c);
//             }
//         }
//     };
// 
//     public static void start() {
//         if (isStart) {
//             return;
//         }
//         isStart = true;
//         for (int i = 0; i < threads.length; i++) {
//             Thread thread = new Thread(runnable);
//             thread.setPriority(Thread.NORM_PRIORITY);
//             thread.start();
//             threads[i] = thread;
//         }
//     }
//     
//     public static void stop() {
//         isStart = false;
//         for (Thread thread : threads) {
//             try {
//                 thread.join();
//             } catch (InterruptedException e) {
//                 e.printStackTrace();
//             }
//         }
//     }
// }


import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v4.app.FragmentActivity;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import com.lsjwzh.test.FpsCalculator;
import com.lsjwzh.test.GhostThread;
  @Override
  public void onBackPressed() {
    super.onBackPressed();
  }

  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
  }

  @Override
  public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
      return true;
    }

    return super.onOptionsItemSelected(item);
  }

  @Override
  protected void onDestroy() {
    super.onDestroy();
// Path: app/src/main/java/com/lsjwzh/test/FpsCalculator.java
// public class FpsCalculator {
// 
// 	private final static String TAG = "FpsCalculator";
// 	
//     private long mFrameIntervalNanos;
//     
//     private boolean mRunning = false;
//     
//     private static FpsCalculator instance;
// 
// 	private AtomicInteger atom = new AtomicInteger(0);
// 	private Thread syncCheckThread = null;
//     
//     static {
//     	instance = new FpsCalculator();
//     }
//     
//     public static FpsCalculator instance() {
//     	return instance;
//     }
// 	
// 	private int totalFps;
// 	private int fpsCalculateCount;
// 	private boolean isCalculatingFPS;
// 	
// 	// calculate the average fps
// 	
// 	public void startCalculate() {
// 		totalFps = 0;
// 		fpsCalculateCount = 0;
// 		isCalculatingFPS = true;
// 	}
// 	
// 	public int stopGetAvgFPS() {
// 		isCalculatingFPS = false;
// 		int avgFPS = totalFps / fpsCalculateCount;
// 		totalFps = 0;
// 		fpsCalculateCount = 0;
// 		return avgFPS;
// 	}
// 
// 	private void syncCheckThread(){
// 		if(!mRunning){
// 			return;
// 		}
// 		int val = atom.getAndSet(0);
// 		if (isCalculatingFPS) {
// 			totalFps += val;
// 			fpsCalculateCount++;
// 		}
// 		android.util.Log.i(TAG, "FPS: " + val);
// 		try {
// 			Thread.sleep(1000);
// 		} catch (InterruptedException e) {
// 			e.printStackTrace();
// 		}
// 	}
// 	    
// 	private FrameCallback frameCallback = new FrameCallback() {
// 
// 		@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
// 		@Override
// 		public void doFrame(long frameTimeNanos) {
// 			
// 			if (!mRunning) {
// 				return;
// 			}
//             
//             Choreographer.getInstance().postFrameCallback(frameCallback);
// 
// 			atom.incrementAndGet();
// 		}};
// 	
// 	@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
// 	public void start() {
// 		Log.d(TAG, "start vsync detect");
// 		if (mRunning) {
// 			return;
// 		}
// 		
// 		mRunning = true;
// 
// 		syncCheckThread = new Thread(new Runnable() {
// 			@Override
// 			public void run() {
// 				for (;;) {
// 					if (!mRunning) {
// 						break;
// 					}
// 					syncCheckThread();
// 				}
// 			}
// 		});
// 		syncCheckThread.start();
// 		
// 		Choreographer chor = Choreographer.getInstance();
// 		Field field;
// 		try {
// 			field = chor.getClass().getDeclaredField("mFrameIntervalNanos");
// 			field.setAccessible(true);
// 			mFrameIntervalNanos = field.getLong(chor);
// 			Log.d(TAG, "mFrameIntervalNanos " + mFrameIntervalNanos);
// 		} catch (Exception e) {
// 			Log.e(TAG, "error: " + e.getMessage());
// 		}
// 		chor.postFrameCallback(frameCallback);
// 
// 	}
// 	
// 	public void stop() {
// 		mRunning = false;
// 		if (syncCheckThread != null) {
// 			try {
// 				syncCheckThread.join();
// 			} catch (InterruptedException e) {
// 				e.printStackTrace();
// 			}
// 		}
// 	}
// }
// 
// Path: app/src/main/java/com/lsjwzh/test/GhostThread.java
// public class GhostThread  {
//     private static final String TAG = "GhostThread";
//     
//     private static boolean isStart = false;
//     
//     private static Thread[] threads = new Thread[0];
// 
//     private static Random random = new Random();
//     private static Runnable runnable = new Runnable() {
//         @Override
//         public void run() {
//             for (; ;) {
//                 if (!isStart) {
//                     break;
//                 }
//                 double c = Math.PI * Math.PI * Math.PI * random.nextFloat();
// //                Log.e("test", "v:" + c);
//             }
//         }
//     };
// 
//     public static void start() {
//         if (isStart) {
//             return;
//         }
//         isStart = true;
//         for (int i = 0; i < threads.length; i++) {
//             Thread thread = new Thread(runnable);
//             thread.setPriority(Thread.NORM_PRIORITY);
//             thread.start();
//             threads[i] = thread;
//         }
//     }
//     
//     public static void stop() {
//         isStart = false;
//         for (Thread thread : threads) {
//             try {
//                 thread.join();
//             } catch (InterruptedException e) {
//                 e.printStackTrace();
//             }
//         }
//     }
// }


// Path: app/src/main/java/com/wechat/testdemo/MainActivity.java
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v4.app.FragmentActivity;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import com.lsjwzh.test.FpsCalculator;
import com.lsjwzh.test.GhostThread;

  @Override
  public void onBackPressed() {
    super.onBackPressed();
  }

  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
  }

  @Override
  public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
      return true;
    }

    return super.onOptionsItemSelected(item);
  }

  @Override
  protected void onDestroy() {
    super.onDestroy();
    FpsCalculator.instance().stop();