/**
* @description:
* @author chenshiqiang E-mail:csqwyyx@163.com
* @date 2014年4月30日 下午4:37:19
* @version 1.0
*/
package com.csq.thesceneryalong.ui.views;
import android.app.Activity;
import android.content.Context;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.style.ForegroundColorSpan;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.RelativeLayout;
import android.widget.TextView;
import at.markushi.ui.CircleButton;
import com.csq.thesceneryalong.R;
import com.csq.thesceneryalong.app.App;
import com.csq.thesceneryalong.db.Track;
import com.csq.thesceneryalong.logic.manager.TrackManager;
import com.csq.thesceneryalong.models.events.EventCurTrackStatusChanged;
import com.csq.thesceneryalong.models.events.EventNewTrackPoint;
import com.csq.thesceneryalong.models.events.EventRecordTimeChanged;
import com.csq.thesceneryalong.models.models.RecordStatus;
import com.csq.thesceneryalong.ui.activitys.TrackDetailMapActivity;
import com.csq.thesceneryalong.ui.activitys.base.BaseActionBarActivity;
import com.csq.thesceneryalong.utils.GsfUtil;
import com.csq.thesceneryalong.utils.StringUtils;
import com.csq.thesceneryalong.utils.TimeUtil;
import com.csq.thesceneryalong.utils.ToastUtil;
import de.greenrobot.event.EventBus;
import de.keyboardsurfer.android.widget.crouton.Style;
import eu.inmite.android.lib.dialogs.SimpleDialogFragment;
public class TrackCtrlView extends RelativeLayout implements OnClickListener{
// ------------------------ Constants ------------------------
public final int color_start = App.getResources().getColor(R.color.green10);
public final int color_pause = App.getResources().getColor(R.color.yellow10);
public final int color_stop_nor = App.getResources().getColor(R.color.red10);
public final int color_stop_unable = App.getResources().getColor(android.R.color.darker_gray);
public static final int requestCodeStopTrack = 44;
// ------------------------- Fields --------------------------
CircleButton btnStart;
CircleButton btnStop;
TextView tvMid1;
TextView tvMid2;
protected String strTrackCtrlDefaultLeft;
protected String strTrackCtrlDefaultRight;
protected String strTrackCtrlTotalTime;
protected String strTrackCtrlTotalDis;
protected String strKm;
protected String strM;
protected String strTrackStopConfirmTitle;
protected String strTrackStopConfirmMsg;
protected int yellow8;
// ----------------------- Constructors ----------------------
public TrackCtrlView(Context context) {
super(context);
// TODO Auto-generated constructor stub
initView(context);
}
public TrackCtrlView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
initView(context);
}
private void initView(Context context) {
View v = LayoutInflater.from(context).inflate(R.layout.view_track_ctrl,
this,
true);
btnStart = (CircleButton) v.findViewById(R.id.btnStart);
btnStop = (CircleButton) v.findViewById(R.id.btnStop);
tvMid1 = (TextView) v.findViewById(R.id.tvMid1);
tvMid2 = (TextView) v.findViewById(R.id.tvMid2);
btnStart.setOnClickListener(this);
btnStop.setOnClickListener(this);
strTrackCtrlDefaultLeft = getResources().getString(R.string.strTrackCtrlDefaultLeft);
strTrackCtrlDefaultRight = getResources().getString(R.string.strTrackCtrlDefaultRight);
strTrackCtrlTotalTime = getResources().getString(R.string.strTrackCtrlTotalTime);
strTrackCtrlTotalDis = getResources().getString(R.string.strTrackCtrlTotalDis);
strKm = getResources().getString(R.string.strKm);
strM = getResources().getString(R.string.strM);
strTrackStopConfirmTitle = getResources().getString(R.string.strTrackStopConfirmTitle);
strTrackStopConfirmMsg = getResources().getString(R.string.strTrackStopConfirmMsg);
yellow8= getResources().getColor(R.color.yellow8);
}
// -------- Methods for/from SuperClass/Interfaces -----------
@Override
protected void onAttachedToWindow() {
// TODO Auto-generated method stub
super.onAttachedToWindow();
if(!EventBus.getDefault().isRegistered(this)){
EventBus.getDefault().register(this);
}
Track track = TrackManager.getInstance().getCurTrack();
if(track != null){
updateStatus(track.getRecordStatus());
}else{
updateStatus(RecordStatus.finished.getValue());
}
}
@Override
protected void onDetachedFromWindow() {
// TODO Auto-generated method stub
super.onDetachedFromWindow();
if(EventBus.getDefault().isRegistered(this)){
EventBus.getDefault().unregister(this);
}
}
// --------------------- Methods public ----------------------
private boolean isStartLaunchMap = false;
public void stopTrack(){
btnStop.setEnabled(false);
Track track = TrackManager.getInstance().getCurTrack();
if(track != null){
TrackManager.getInstance().stopTrackAsyc();
}
}
// --------------------- Methods private ---------------------
/**
* @description: 轨迹记录状态改变
* @author: chenshiqiang E-mail:csqwyyx@163.com
*/
public void onEventMainThread(EventCurTrackStatusChanged event){
updateStatus(event.track.getRecordStatus());
}
/**
* @description: 新轨迹点
* @author: chenshiqiang E-mail:csqwyyx@163.com
* @param event
*/
public void onEventMainThread(EventNewTrackPoint event){
updateTotalDistance();
}
/**
* @description: 计时改变
* @author: chenshiqiang E-mail:csqwyyx@163.com
* @param event
*/
public void onEventMainThread(EventRecordTimeChanged event){
updateSimulatorTime(event.time);
}
private int curStatus = -1;
private void updateStatus(int status){
if(curStatus != status){
if(status == RecordStatus.recording.getValue()){
//正在记录
btnStart.setColor(color_pause);
btnStart.setImageResource(R.drawable.ic_track_pause);
btnStop.setColor(color_stop_nor);
btnStop.setEnabled(true);
updateSimulatorTime(TrackManager.getInstance().getSimulatorTime());
updateTotalDistance();
if(isStartLaunchMap && GsfUtil.isGsfInstalled()){
//第一次开始,启动地图界面
TrackDetailMapActivity.launch(getContext(),
TrackManager.getInstance().getCurTrack().getId());
isStartLaunchMap = false;
}
}else if(status == RecordStatus.paused.getValue()){
//暂停了
btnStart.setColor(color_start);
btnStart.setImageResource(R.drawable.ic_track_start);
btnStop.setColor(color_stop_nor);
btnStop.setEnabled(true);
updateSimulatorTime(TrackManager.getInstance().getSimulatorTime());
updateTotalDistance();
}else{
//停止了
btnStart.setColor(color_start);
btnStart.setImageResource(R.drawable.ic_track_start);
btnStop.setColor(color_stop_unable);
btnStop.setEnabled(false);
tvMid1.setText(strTrackCtrlDefaultLeft);
tvMid2.setText(strTrackCtrlDefaultRight);
}
curStatus = status;
}
btnStart.setEnabled(true);
}
private void updateSimulatorTime(long time){
String strTime = strTrackCtrlTotalTime + TimeUtil.getFormatedTimeHMS(time);
SpannableString span = new SpannableString(strTime);
span.setSpan(new ForegroundColorSpan(yellow8),
0,
strTrackCtrlTotalDis.length(),
Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
tvMid1.setText(span);
}
private void updateTotalDistance(){
int dis = 0;
Track curTrack = TrackManager.getInstance().getCurTrack();
if(curTrack != null){
double s = curTrack.getMovingDistance();
dis = (int) s;
}
String strDis = strTrackCtrlTotalDis
+ StringUtils.getFormatDistance(dis, 2, strM, strKm);
SpannableString span = new SpannableString(strDis);
span.setSpan(new ForegroundColorSpan(yellow8),
0,
strTrackCtrlTotalDis.length(),
Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
tvMid2.setText(span);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.btnStart:
if(!GsfUtil.isGsfInstalled()){
//没有谷歌服务框架
ToastUtil.showToastInfo((Activity)getContext(),
R.string.strErrorNoGsf,
Style.ALERT,
false);
return;
}
btnStart.setEnabled(false);
Track track = TrackManager.getInstance().getCurTrack();
if(track != null){
if(track.getRecordStatus() == RecordStatus.recording.getValue()){
TrackManager.getInstance().pauseTrackAsyc();
}else if(track.getRecordStatus() == RecordStatus.paused.getValue()){
TrackManager.getInstance().resumeTrackAsyc();;
}else{
TrackManager.getInstance().startTrackAsyc();
}
}else{
isStartLaunchMap = true;
TrackManager.getInstance().startTrackAsyc();
}
break;
case R.id.btnStop:
Activity act = (Activity) getContext();
if(act instanceof BaseActionBarActivity){
SimpleDialogFragment.createBuilder(act, ((BaseActionBarActivity)act).getSupportFragmentManager())
.setTitle(strTrackStopConfirmTitle)
.setMessage(strTrackStopConfirmMsg)
.setPositiveButtonText(R.string.yes)
.setNegativeButtonText(R.string.no)
.setRequestCode(requestCodeStopTrack)
.show();
}else{
stopTrack();
}
break;
default:
break;
}
}
// --------------------- Getter & Setter ---------------------
// --------------- Inner and Anonymous Classes ---------------
}