/** * @description: * @author chenshiqiang E-mail:csqwyyx@163.com * @date 2014年5月1日 下午3:15:21 * @version 1.0 */ package com.csq.thesceneryalong.logic.manager; import java.util.List; import java.util.Timer; import java.util.TimerTask; import com.csq.thesceneryalong.app.App; import com.csq.thesceneryalong.db.Track; import com.csq.thesceneryalong.db.TrackPoint; import com.csq.thesceneryalong.io.db.SceneryDb; import com.csq.thesceneryalong.io.db.TrackDb; import com.csq.thesceneryalong.io.db.TrackPointDb; import com.csq.thesceneryalong.models.events.EventCurTrackStatusChanged; import com.csq.thesceneryalong.models.events.EventRecordTimeChanged; import com.csq.thesceneryalong.models.events.EventTrackStopedAndDelete; import com.csq.thesceneryalong.models.models.RecordStatus; import com.csq.thesceneryalong.models.models.TrackPointStatus; import com.csq.thesceneryalong.utils.dbmodel.TrackUtil; import com.csq.thesceneryalong.utils.tasks.CsqBackgroundTask; import de.greenrobot.event.EventBus; public class TrackManager { // ------------------------ Constants ------------------------ // ------------------------- Fields -------------------------- private static volatile TrackManager instance; public static TrackManager getInstance(){ if(instance == null){ synchronized (TrackManager.class) { instance = new TrackManager(); } } return instance; } /** * 当前记录的轨迹 */ private volatile Track curTrack; private Timer timer = null; // ----------------------- Constructors ---------------------- private TrackManager(){ } // -------- Methods for/from SuperClass/Interfaces ----------- // --------------------- Methods public ---------------------- /** * @description: 如果有正在记录的轨迹,恢复记录 * @author: chenshiqiang E-mail:csqwyyx@163.com */ public synchronized void resumeIfHaveRecordingTrack(){ curTrack = TrackDb.getInstance().queryUnFinished(); if(curTrack != null){ //开始轨迹点缓存 TrackPointDb.getInstance().trackRecordStartOrResume(curTrack); //开始风景点缓存 SceneryDb.getInstance().trackRecordStartOrResume(curTrack); //如果正在记录轨迹点,前台服务 if(curTrack.getRecordStatus() == RecordStatus.recording.getValue()){ TrackPoint lastPoint = TrackPointDb.getInstance().getLastRecordedPoint(); if(lastPoint != null && lastPoint.getPointStatus() == TrackPointStatus.normal.getValue() && System.currentTimeMillis() - lastPoint.getTime() > 30 * 60 * 1000) { //如果距离上一次正常点间隔大于30分钟,就当作另一段轨迹,添加一个 TrackPointDb.getInstance().addTrackPointToCurTrack(TrackPointStatus.paused); TrackPointDb.getInstance().addTrackPointToCurTrack(TrackPointStatus.resumed); } App.app.startForeground(); startCountTime(); } //通知状态 EventBus.getDefault().post(new EventCurTrackStatusChanged(curTrack)); } } /** * @description: 开始记录轨迹 * @author: chenshiqiang E-mail:csqwyyx@163.com */ public synchronized void startTrack(){ TrackDb.getInstance().stopAllTracks(); Track newTrack = TrackUtil.newRecordingTrack(); curTrack = TrackDb.getInstance().queryById(TrackDb.getInstance().add(newTrack)); if(curTrack != null){ //开始轨迹点缓存 TrackPointDb.getInstance().trackRecordStartOrResume(curTrack); //开始风景点缓存 SceneryDb.getInstance().trackRecordStartOrResume(curTrack); //前台服务 App.app.startForeground(); //通知状态 EventBus.getDefault().post(new EventCurTrackStatusChanged(curTrack)); //只添加轨迹开始后位置变动的位置 /*TrackPointDb.getInstance().addTrackPointToCurTrack(TrackPointStatus.normal);*/ startCountTime(); } } public void startTrackAsyc(){ new CsqBackgroundTask<Boolean>(){ @Override protected Boolean onRun() { // TODO Auto-generated method stub startTrack(); return true; } @Override protected void onResult(Boolean result) { } }.start(); } /** * @description: 暂停记录轨迹 * @author: chenshiqiang E-mail:csqwyyx@163.com */ public synchronized void pauseTrack(){ if(curTrack == null){ return; } //更新状态 curTrack.setRecordStatus(RecordStatus.paused.getValue()); //更新数据库 TrackDb.getInstance().update(curTrack, false); //前台服务 App.app.stopForeground(); //添加一个暂停轨迹点 TrackPointDb.getInstance().addTrackPointToCurTrack(TrackPointStatus.paused); //通知状态 EventBus.getDefault().post(new EventCurTrackStatusChanged(curTrack)); stopCountTime(); } public void pauseTrackAsyc(){ new CsqBackgroundTask<Boolean>(){ @Override protected Boolean onRun() { // TODO Auto-generated method stub pauseTrack(); return true; } @Override protected void onResult(Boolean result) { } }.start(); } /** * @description: 恢复记录轨迹 * @author: chenshiqiang E-mail:csqwyyx@163.com */ public synchronized void resumeTrack(){ if(curTrack == null){ return; } //更新状态 curTrack.setRecordStatus(RecordStatus.recording.getValue()); //更新数据库 TrackDb.getInstance().update(curTrack, false); //前台服务 App.app.startForeground(); //添加一个恢复轨迹点 TrackPointDb.getInstance().addTrackPointToCurTrack(TrackPointStatus.resumed); //通知状态 EventBus.getDefault().post(new EventCurTrackStatusChanged(curTrack)); startCountTime(); } public void resumeTrackAsyc(){ new CsqBackgroundTask<Boolean>(){ @Override protected Boolean onRun() { // TODO Auto-generated method stub resumeTrack(); return true; } @Override protected void onResult(Boolean result) { } }.start(); } /** * @description: 停止记录轨迹 * @author: chenshiqiang E-mail:csqwyyx@163.com */ public synchronized void stopTrack(){ if(curTrack == null){ return; } if(curTrack.getSceneryNum() < 1 && curTrack.getMovingDistance() < 100){ //没有记录到风景,且移动距离小于100,直接删除 TrackDb.getInstance().delete(curTrack.getId()); curTrack.setRecordStatus(RecordStatus.finished.getValue()); EventBus.getDefault().post(new EventTrackStopedAndDelete()); }else{ //更新数据库 TrackDb.getInstance().stopAllTracks(); } //前台服务 App.app.stopForeground(); //停止轨迹点缓存 TrackPointDb.getInstance().trackStoped(); SceneryDb.getInstance().trackStoped(); //通知状态 EventBus.getDefault().post(new EventCurTrackStatusChanged(curTrack)); curTrack = null; stopCountTime(); } public void stopTrackAsyc(){ new CsqBackgroundTask<Boolean>(){ @Override protected Boolean onRun() { // TODO Auto-generated method stub stopTrack(); return true; } @Override protected void onResult(Boolean result) { } }.start(); } /** * @description: 是否有正在记录的轨迹,轨迹可能是暂停的 * @author: chenshiqiang E-mail:csqwyyx@163.com * @return */ public synchronized boolean isHaveRecordingTrack(){ return curTrack != null; } /** * @description: 是否有正在记录的轨迹,且轨迹不能是暂停的 * @author: chenshiqiang E-mail:csqwyyx@163.com * @return */ public synchronized boolean isTrackRecording(){ return curTrack != null && curTrack.getRecordStatus() == RecordStatus.recording.getValue(); } /** * @description: 是否是正在记录的轨迹 * @author: chenshiqiang E-mail:csqwyyx@163.com * @param trackId * @return */ public synchronized boolean isTrackRecording(long trackId){ if(curTrack != null && curTrack.getId() == trackId){ return true; } return false; } /** * @description: 获得当前记录的轨迹 * @author: chenshiqiang E-mail:csqwyyx@163.com * @return */ public Track getCurTrack() { return curTrack; } /** * @description: 增加模拟时间 * @author: chenshiqiang E-mail:csqwyyx@163.com * @param addTime */ public void addSimulateTime(int addTime) { if(curTrack != null){ synchronized (curTrack) { long sTime = 0; if(curTrack.getSimulateTime() != null){ sTime = curTrack.getSimulateTime(); } curTrack.setSimulateTime(sTime + addTime); } } } /** * @description: 重新从数据库查询轨迹点 * @author: chenshiqiang E-mail:csqwyyx@163.com * @return */ public List<TrackPoint> refreshAndGetCurTrackPoints(){ if(curTrack != null){ List<TrackPoint> tps = curTrack.getTrackPoints(); curTrack.resetTrackPoints(); return tps; } return null; } // --------------------- Methods private --------------------- public long getSimulatorTime(){ long time = 0; if(curTrack != null && curTrack.getSimulateTime() != null){ time = curTrack.getSimulateTime(); } return time; } private void startCountTime(){ stopCountTime(); timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { // TODO Auto-generated method stub addSimulateTime(1000); long time = getSimulatorTime(); EventBus.getDefault().post(new EventRecordTimeChanged(time)); } }, 0, 1000); } private void stopCountTime(){ if(timer != null){ timer.cancel(); } } // --------------------- Getter & Setter --------------------- // --------------- Inner and Anonymous Classes --------------- }