/*
 * Tencent is pleased to support the open source community by making
 * Tencent GT (Version 2.4 and subsequent versions) available.
 *
 * Notwithstanding anything to the contrary herein, any previous version
 * of Tencent GT shall not be subject to the license hereunder.
 * All right, title, and interest, including all intellectual property rights,
 * in and to the previous version of Tencent GT (including any and all copies thereof)
 * shall be owned and retained by Tencent and subject to the license under the
 * Tencent GT End User License Agreement (http://gt.qq.com/wp-content/EULA_EN.html).
 * 
 * Copyright (C) 2015 THL A29 Limited, a Tencent company. All rights reserved.
 * 
 * Licensed under the MIT License (the "License"); you may not use this file
 * except in compliance with the License. You may obtain a copy of the License at
 * 
 * http://opensource.org/licenses/MIT
 * 
 * Unless required by applicable law or agreed to in writing, software distributed
 * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
 * CONDITIONS OF ANY KIND, either express or implied. See the License for the
 * specific language governing permissions and limitations under the License.
 */
package com.tencent.wstt.gt.datasource.engine;

import com.tencent.wstt.gt.datasource.util.FrameUtils;

import java.io.IOException;
import java.util.TimerTask;

/**
 * Andorid4.0以上版本，使用此FPS获取的实现，要比原有方案简单稳定
 */
public class FPSTimerTask extends TimerTask {
	private long startTime = 0L;
	private int lastFrameNum = 0;
	private long testCount = 0;

	private boolean hasSu = true;

	private DataRefreshListener<Long> dataRefreshListener;

	/**
	 * 构造方法
	 * @param dataRefreshListener FPS数据监听者
	 * @param hasSu 可以指定是否root,事实上想要采集FPS数据是必须root
	 */
	public FPSTimerTask(DataRefreshListener<Long> dataRefreshListener, boolean hasSu)
	{
		this.dataRefreshListener = dataRefreshListener;
		this.hasSu = hasSu;
	}

	public boolean isHasSu() {
		return hasSu;
	}

	public void setHasSu(boolean hasSu) {
		this.hasSu = hasSu;
	}

	/*
	 * 主循环，和2.3方案不同的是，本主循环1s执行一次，2.3方案是0.5s执行一次
	 * @see java.util.TimerTask#run()
	 */
	public void run() {
		/*
		 * Timer的启动无法避免，所以这里加root保护
		 * 若未root，直接返回，减少空消耗
		 */
		if (! hasSu)
		{
			return;
		}

		long end = 0L;
		float realCostTime = 0.0F;
		end = System.nanoTime();
		if (testCount != 0) {
			realCostTime = (float) (end - startTime) / 1000000.0F;
		}

		startTime = System.nanoTime();
		if (testCount == 0) {
			try {
				lastFrameNum = FrameUtils.getFrameNum();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		int currentFrameNum = 0;
		try {
			currentFrameNum = FrameUtils.getFrameNum();
		} catch (IOException e) {
			e.printStackTrace();
		}
		int FPS = currentFrameNum - lastFrameNum;
		if (realCostTime > 0.0F) {
			int fpsResult = (int) (FPS * 1000 / realCostTime);
			// 根据值变化的监听
			dataRefreshListener.onRefresh(System.currentTimeMillis(), Long.valueOf(fpsResult));
		}
		lastFrameNum = currentFrameNum;

		testCount += 1;
	}

	public synchronized void stop()
	{
		FrameUtils.destory();
	}
}