package cn.com.iresearch.mvideotracker;
import cn.com.iresearch.mvideotracker.db.FinalDb;
import android.content.Context;
import java.util.List;
public class IRVideo {
private static final String TAG = "IRVideo";
private Context context;
private static IRVideo irVideo;
private VideoPlayInfo videoPlayInfo;
private FinalDb vvtracker_db;
private static final String DBNAME = "vvtracker.db";
private String uaid = "";
private static final String INIT = "init";
private static final String PLAY = "play";
private static final String PAUSE = "pause";
private static final String END = "end";
private static final String UAID = "vv_uaid";
//发送数据条数限制
private static final int SEND_LIMIT = 10;
private int pauseCount = 0;
private long playTime = 0;
private int heartTimes = 0;
private long lastActionTime = 0;
private IRVideo(Context context){
this.context = context;
vvtracker_db = FinalDb.create(context, DBNAME, false);
}
public static IRVideo getInstance(Context context){
if (irVideo == null) {
synchronized (IRVideo.class) {
irVideo = new IRVideo(context);
}
}
return irVideo;
}
public void init(String uaid){
VVUtil.vv_Logd(TAG, "初始化开始");
this.uaid = uaid;
VVUtil.saveSharedPreferences(context, UAID, uaid);
VVUtil.vv_Logd(TAG, "初始化结束");
}
/**
* 创建一条视频信息
* @param videoID
* @param videoLength
* @param isPlay
*/
public void newVideoPlay(String videoID, long videoLength, Boolean isPlay){
try {
if("".equals(getUaid())){
VVUtil.vv_Loge(TAG, "未初始化!");
return;
}
VVUtil.vv_Logd(TAG, "创建视频数据start");
pauseCount = 0;
playTime = 0;
lastActionTime = 0;
videoPlayInfo = new VideoPlayInfo();
videoPlayInfo.setVideoID(videoID);
videoPlayInfo.setPauseCount(pauseCount);
videoPlayInfo.setPlayTime(playTime);
videoPlayInfo.setLastActionTime(lastActionTime);
videoPlayInfo.setHeartTime(heartTimes);
videoPlayInfo.setVideoLength(videoLength);
videoPlayInfo.setAction(INIT);
sendHistoryInfo();
saveVideoPlayInfo(videoPlayInfo);
if(isPlay){
videoPlay();
}
VVUtil.vv_Logd(TAG, "创建视频数据end");
} catch (Exception e) {
VVUtil.vv_Loge(TAG, "创建视频数据异常" + e.toString());
e.printStackTrace();
}
}
/**
* 视频播放,A点发送数据
*/
public void videoPlay(){
try {
if(videoPlayInfo == null){
return;
}
String action = videoPlayInfo.getAction();
lastActionTime = VVUtil.getUnixTimeStamp();
videoPlayInfo.setAction(PLAY);
videoPlayInfo.setLastActionTime(lastActionTime);
updateVideoPlayInfo(videoPlayInfo);
if(INIT.equals(action)){
sendAVideoInfo(videoPlayInfo);
}
} catch (Exception e) {
VVUtil.vv_Loge(TAG, "存放视频A点数据到数据库异常" + e.toString());
e.printStackTrace();
}
}
/**
* 视频暂停
*/
public void videoPause(){
try {
if (videoPlayInfo == null) {
return;
}
if(!"play".equals(videoPlayInfo.getAction())){
return;
}
if(lastActionTime == 0){
deleteVideoPlayInfoByWhere(videoPlayInfo);;
return;
}
playTime += VVUtil.getUnixTimeStamp() - lastActionTime;
lastActionTime = VVUtil.getUnixTimeStamp();
pauseCount ++;
videoPlayInfo.setAction(PAUSE);
videoPlayInfo.setLastActionTime(lastActionTime);
videoPlayInfo.setPlayTime(playTime);
videoPlayInfo.setPauseCount(pauseCount);
updateVideoPlayInfo(videoPlayInfo);
} catch (Exception e) {
VVUtil.vv_Loge(TAG, "更新视频暂停数据异常" + e.toString());
e.printStackTrace();
}
}
/**
* 视频结束,B点发送数据
*/
public void videoEnd(){
try {
if (videoPlayInfo == null) {
return;
}
if(lastActionTime == 0){
deleteVideoPlayInfoByWhere(videoPlayInfo);;
return;
}
playTime += VVUtil.getUnixTimeStamp() - lastActionTime;
lastActionTime = VVUtil.getUnixTimeStamp();
videoPlayInfo.setPlayTime(playTime);
videoPlayInfo.setLastActionTime(lastActionTime);
videoPlayInfo.setAction(END);
updateVideoPlayInfo(videoPlayInfo);
sendBVideoInfo(videoPlayInfo);
} catch (Exception e) {
VVUtil.vv_Loge(TAG, "更新视频B点数据异常" + e.toString());
e.printStackTrace();
}
}
//将当前视频对象置为空
private void setVideoInfoNull(){
videoPlayInfo = null;
}
/**
* 第一次进入发送历史遗留数据(C点数据)
*/
private void sendHistoryInfo() {
new Thread(new Runnable() {
@Override
public void run() {
try {
if (!VVUtil.isNetworkAvailable(context)) {
VVUtil.vv_Loge(TAG, "网络不畅通!");
return;
}
List<VideoPlayInfo> videoPlayInfos = vvtracker_db.findAll(VideoPlayInfo.class);
VVUtil.vv_Logd(TAG, "遗留数据数目:" + videoPlayInfos.size());
for (VideoPlayInfo info : videoPlayInfos) {
if ("end".equals(info.getAction())) {
int status = VVUtil.urlGet(context, VVUtil.getUrl(context, info,VVUtil.IWT_P1_C));
if (status == 1) {
deleteVideoPlayInfo(info);
}
}
}
} catch (Exception e) {
VVUtil.vv_Loge(TAG, "发送遗留数据发送异常!");
e.printStackTrace();
}
}
}).start();
}
/**
* A点发送数据
*/
private void sendAVideoInfo(final VideoPlayInfo videoPlayInfo) {
new Thread(new Runnable() {
@Override
public void run() {
try {
String urlString = VVUtil.getUrl(context, videoPlayInfo,VVUtil.IWT_P1_A);
// TODO 发送URL
int status = VVUtil.urlGet(context,urlString);
if (status == 0) {
VVUtil.vv_Loge(TAG, "A点数据发送失败!");
} else {
VVUtil.vv_Loge(TAG, "A点数据发送成功!");
}
} catch (Exception e) {
VVUtil.vv_Loge(TAG, "A点数据发送异常!");
e.printStackTrace();
}
}
}).start();
}
/**
* B点发送数据
* @param videoPlayInfo
*/
private void sendBVideoInfo(final VideoPlayInfo videoPlayInfo) {
new Thread(new Runnable() {
@Override
public void run() {
try {
String urlString = VVUtil.getUrl(context, videoPlayInfo,VVUtil.IWT_P1_B);
// TODO 发送URL
int status = VVUtil.urlGet(context,urlString);
if (status == 0) {
VVUtil.vv_Loge(TAG, "B点数据发送失败!");
} else {
deleteVideoPlayInfoByWhere(videoPlayInfo);
VVUtil.vv_Loge(TAG, "B点数据发送成功!");
}
setVideoInfoNull();
} catch (Exception e) {
VVUtil.vv_Loge(TAG, "B点数据发送异常!");
e.printStackTrace();
}
}
}).start();
}
/**
* 保存一条数据
* @param videoPlayInfo
*/
private void saveVideoPlayInfo(final VideoPlayInfo videoPlayInfo){
new Thread(new Runnable() {
@Override
public void run() {
try {
//若数据库中数据条目多于限制条数则将数据库中多余数据删除
List<VideoPlayInfo> videoPlayInfos = vvtracker_db.findAll(VideoPlayInfo.class);
boolean isHave = false;
for(VideoPlayInfo info : videoPlayInfos){
if(videoPlayInfo.getVideoID().equals(info.getVideoID())){
isHave = true;
}
}
if(!isHave){
if(videoPlayInfos.size() > SEND_LIMIT){
videoPlayInfos = videoPlayInfos.subList(SEND_LIMIT, videoPlayInfos.size());
VVUtil.vv_Logd(TAG, "数据库中数据太多移除多余数据数目:" + videoPlayInfos.size());
for(VideoPlayInfo info : videoPlayInfos){
deleteVideoPlayInfo(info);
}
}
VVUtil.vv_Loge(TAG, videoPlayInfo.toString());
videoPlayInfo.setUid(DataProvider.getDesU(context));
vvtracker_db.save(videoPlayInfo);
}else{
updateVideoPlayInfo(videoPlayInfo);
}
} catch (Exception e) {
VVUtil.vv_Loge(TAG, "保存视频数据到数据库异常" + e.toString());
e.printStackTrace();
}
}
}).start();
}
/**
* 更新一条数据
* @param videoPlayInfo
*/
private void updateVideoPlayInfo(final VideoPlayInfo videoPlayInfo){
new Thread(new Runnable() {
@Override
public void run() {
try {
if(videoPlayInfo == null){
return;
}
List<VideoPlayInfo> videoPlayInfos = vvtracker_db.findAll(VideoPlayInfo.class);
if(videoPlayInfos.size() >0){
vvtracker_db.update(videoPlayInfo, "videoID=" + "'" + videoPlayInfo.getVideoID() + "'");
VVUtil.vv_Loge(TAG, videoPlayInfo.toString());
}
} catch (Exception e) {
VVUtil.vv_Loge(TAG, "更新视频数据异常" + e.toString());
e.printStackTrace();
}
}
}).start();
}
/**
* 删除一条数据
* @param videoPlayInfo
*/
private void deleteVideoPlayInfo(final VideoPlayInfo videoPlayInfo){
new Thread(new Runnable() {
@Override
public void run() {
try {
vvtracker_db.delete(videoPlayInfo);
} catch (Exception e) {
VVUtil.vv_Loge(TAG, "保存视频数据到数据库异常" + e.toString());
e.printStackTrace();
}
}
}).start();
}
/**
* 删除当前数据
* @param videoPlayInfo
*/
private void deleteVideoPlayInfoByWhere(final VideoPlayInfo videoPlayInfo){
new Thread(new Runnable() {
@Override
public void run() {
try {
List<VideoPlayInfo> videoPlayInfos = vvtracker_db.findAll(VideoPlayInfo.class);
for(VideoPlayInfo info : videoPlayInfos){
if(videoPlayInfo.getVideoID().equals(info.getVideoID())){
vvtracker_db.delete(info);
}
}
} catch (Exception e) {
VVUtil.vv_Loge(TAG, "保存视频数据到数据库异常" + e.toString());
e.printStackTrace();
}
}
}).start();
}
/**
* 清空数据表
*/
public void clearVideoPlayInfo(){
new Thread(new Runnable() {
@Override
public void run() {
try {
vvtracker_db.deleteByWhere(VideoPlayInfo.class, null);
} catch (Exception e) {
VVUtil.vv_Loge(TAG, "清理数据库中视频数据异常" + e.toString());
e.printStackTrace();
}
}
}).start();
}
public String getUaid(){
if(!"".equals(uaid)){
return uaid;
}else{
return VVUtil.getSharedPreferences(context, UAID);
}
}
public String getUid() {
return DataProvider.getDesU(context);
}
}