/**
* @description:
* @author chenshiqiang E-mail:csqwyyx@163.com
* @date 2014年4月23日 下午9:49:29
* @version 1.0
*/
package com.csq.thesceneryalong.ui.fragments;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.*;
import com.csq.thesceneryalong.R;
import com.csq.thesceneryalong.db.Track;
import com.csq.thesceneryalong.io.db.TrackDb;
import com.csq.thesceneryalong.io.file.SpUtils;
import com.csq.thesceneryalong.logic.manager.TrackManager;
import com.csq.thesceneryalong.models.events.EventCurTrackStatusChanged;
import com.csq.thesceneryalong.models.events.EventTrackNumChanged;
import com.csq.thesceneryalong.models.events.EventTrackUpdated;
import com.csq.thesceneryalong.models.models.TrackListData;
import com.csq.thesceneryalong.ui.activitys.TrackDetailMapActivity;
import com.csq.thesceneryalong.ui.fragments.base.BaseFragment;
import com.csq.thesceneryalong.ui.views.MainFoldingView;
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 com.csq.thesceneryalong.utils.dbmodel.TrackUtil;
import com.nhaarman.supertooltips.ToolTip;
import com.nhaarman.supertooltips.ToolTipRelativeLayout;
import com.nhaarman.supertooltips.ToolTipView;
import com.nhaarman.supertooltips.ToolTipView.OnToolTipViewClickedListener;
import com.ptr.folding.FoldingPaneLayout;
import de.greenrobot.event.EventBus;
import de.keyboardsurfer.android.widget.crouton.Style;
import se.emilsjolander.stickylistheaders.StickyListHeadersAdapter;
import se.emilsjolander.stickylistheaders.StickyListHeadersListView;
import java.lang.reflect.Field;
public class AllTrackListFragment extends BaseFragment {
// ------------------------ Constants ------------------------
// ------------------------- Fields --------------------------
private AllTrackListAdapter adapter;
FoldingPaneLayout vFoldingPaneLayout;
MainFoldingView vLeftMenu;
StickyListHeadersListView lvTracks;
private ToolTipRelativeLayout lyTooltipframe;
private View emptyView;
String strM;
String strKm;
String strRecording;
private ToolTipView mStartTipView;
// ----------------------- Constructors ----------------------
// -------- Methods for/from SuperClass/Interfaces -----------
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_all_track_list, container, false);
vFoldingPaneLayout = (FoldingPaneLayout) view.findViewById(R.id.vFoldingPaneLayout);
vLeftMenu = (MainFoldingView) view.findViewById(R.id.vLeftMenu);
lvTracks = (StickyListHeadersListView) view.findViewById(R.id.lvTracks);
lyTooltipframe = (ToolTipRelativeLayout) view.findViewById(R.id.lyTooltipframe);
emptyView = view.findViewById(R.id.emptyView);
strM = getResources().getString(R.string.strM);
strKm = getResources().getString(R.string.strKm);
strRecording = getResources().getString(R.string.strRecording);
// TODO Use "injected" views...
setupView();
return view;
}
protected void setupView() {
if(!EventBus.getDefault().isRegistered(this)){
EventBus.getDefault().register(this);
}
vFoldingPaneLayout.getFoldingLayout().setBackgroundColor(Color.BLACK);
lvTracks.setEmptyView(emptyView);
adapter = new AllTrackListAdapter(
TrackDb.getInstance().queryAllSelectionDescByBeginTime(searchFilter));
lvTracks.setAdapter(adapter);
lvTracks.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
if(GsfUtil.isGsfInstalled()){
int headers = lvTracks.getHeaderViewsCount();
Track track = (Track)adapter.getItem(i - headers);
TrackDetailMapActivity.launch(getActivity(), track.getId());
}else{
//没有谷歌服务框架
ToastUtil.showToastInfo(getActivity(),
R.string.strErrorNoGsf,
Style.ALERT,
false);
}
}
});
intFastScrollView();
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if(!SpUtils.isStartRecordToastShowed() && !TrackManager.getInstance().isHaveRecordingTrack()){
addStartTipView();
}
}
@Override
public void onStart() {
// TODO Auto-generated method stub
super.onStart();
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
if(EventBus.getDefault().isRegistered(this)){
EventBus.getDefault().unregister(this);
}
}
@Override
protected void releaseResources() {
// TODO Auto-generated method stub
}
// --------------------- Methods public ----------------------
public void onEventMainThread(EventTrackNumChanged event){
adapter.updateDatas(
TrackDb.getInstance().queryAllSelectionDescByBeginTime(searchFilter));
}
public void onEventMainThread(EventTrackUpdated event){
adapter.notifyDataSetChanged();
}
public void onEventMainThread(EventCurTrackStatusChanged event){
removeStartTipView();
}
public void changeFoldingStatus(){
if(vFoldingPaneLayout.isOpen()){
vFoldingPaneLayout.closePane();
}else{
vFoldingPaneLayout.openPane();
}
}
public boolean isFoldOpen(){
return vFoldingPaneLayout.isOpen();
}
private String searchFilter = "";
public void filterSearchText(String filter){
this.searchFilter = filter;
if(adapter != null){
adapter.updateDatas(
TrackDb.getInstance().queryAllSelectionDescByBeginTime(searchFilter));
}
}
// --------------------- Methods private ---------------------
private void addStartTipView() {
String strHelpTipStartRecord = getResources().getString(R.string.strHelpTipStartRecord);
ToolTip toolTip = new ToolTip().withText(strHelpTipStartRecord)
.withColor(getResources().getColor(R.color.green6))
.withTextColor(getResources().getColor(R.color.red))
.withAnimationType(ToolTip.AnimationType.FROM_TOP);
View btnStart = getActivity().findViewById(R.id.btnStart);
if(btnStart != null && lyTooltipframe != null){
mStartTipView = lyTooltipframe.showToolTipForView(toolTip, btnStart);
mStartTipView.setOnToolTipViewClickedListener(new OnToolTipViewClickedListener() {
@Override
public void onToolTipViewClicked(ToolTipView toolTipView) {
// TODO Auto-generated method stub
mStartTipView = null;
}
});
}
}
private void removeStartTipView() {
if(mStartTipView != null){
mStartTipView.remove();
mStartTipView = null;
}
}
/**
* 隐藏默认的section提示
*/
private void intFastScrollView(){
//背景图片
try {
Field f = AbsListView.class.getDeclaredField("mFastScroller");
f.setAccessible(true);
Object o = f.get(lvTracks.getWrappedList());
f = f.getType().getDeclaredField("mOverlayDrawable");
f.setAccessible(true);
Drawable drawable = getActivity().getResources().getDrawable(R.drawable.transparent);
f.set(o, drawable);
} catch (Exception e) {
e.printStackTrace();
}
//提示方形大小
try {
Field f = AbsListView.class.getDeclaredField("mFastScroller");
f.setAccessible(true);
Object o = f.get(lvTracks.getWrappedList());
f = f.getType().getDeclaredField("mOverlaySize");
f.setAccessible(true);
f.set(o, 0);
} catch (Exception e) {
e.printStackTrace();
}
//文字大小
try {
Paint mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setTextAlign(Paint.Align.CENTER);
mPaint.setTextSize(2);
mPaint.setColor(getResources().getColor(R.color.green1));
mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
Field f = AbsListView.class.getDeclaredField("mFastScroller");
f.setAccessible(true);
Object o = f.get(lvTracks.getWrappedList());
f = f.getType().getDeclaredField("mPaint");
f.setAccessible(true);
f.set(o, mPaint);
} catch (Exception e) {
e.printStackTrace();
}
}
// --------------------- Getter & Setter ---------------------
// --------------- Inner and Anonymous Classes ---------------
private class AllTrackListAdapter extends BaseAdapter implements StickyListHeadersAdapter, SectionIndexer {
private final int[] COLORS = new int[] {
R.color.holo_blue_dark,
R.color.holo_yellow_dark,
R.color.holo_green_dark,
R.color.holo_purple_dark,
R.color.holo_red_dark};
private TrackListData tracks;
public AllTrackListAdapter(TrackListData tracks) {
super();
updateDatas(tracks);
}
public void updateDatas(TrackListData tracks){
this.tracks = tracks;
if(tracks == null){
tracks = TrackListData.createEmptyTrackListData();
}
notifyDataSetChanged();
}
@Override
public View getHeaderView(int position, View convertView, ViewGroup parent) {
if(convertView == null){
convertView = LayoutInflater.from(getActivity())
.inflate(R.layout.item_selection_all_tracks, null);
}
//?????不加会报空指针
convertView.setLayoutParams(new StickyListHeadersListView.LayoutParams(
StickyListHeadersListView.LayoutParams.MATCH_PARENT,
StickyListHeadersListView.LayoutParams.WRAP_CONTENT));
convertView.setBackgroundColor(getResources().getColor(COLORS[position%COLORS.length]));
String sl = TrackUtil.getListSelection(tracks.tracks.get(position));
((TextView)convertView).setText(sl);
return convertView;
}
/**
* Remember that these have to be static, postion=1 should always return
* the same Id that is.
*/
@Override
public long getHeaderId(int position) {
int sections = tracks.sectionIndices.size();
for(int i = sections - 1; i >= 0; i--){
int curPos = tracks.sectionIndices.get(i);
if(position >= curPos){
return curPos;
}
}
return position;
}
@Override
public int getCount() {
return tracks.tracks.size();
}
@Override
public Object getItem(int i) {
return tracks.tracks.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int position, View convertView, ViewGroup viewGroup) {
ViewHolder vh = null;
if(convertView == null){
convertView = LayoutInflater.from(getActivity())
.inflate(R.layout.itemview_all_tracks, null);
vh = new ViewHolder(convertView);
convertView.setTag(vh);
}else{
vh = (ViewHolder) convertView.getTag();
}
Track data = (Track) getItem(position);
vh.updateData(data, position);
return convertView;
}
@Override
public Object[] getSections() {
return tracks.headLetters.toArray();
}
@Override
public int getPositionForSection(int section) {
if (section >= tracks.sectionIndices.size()) {
section = tracks.sectionIndices.size() - 1;
} else if (section < 0) {
section = 0;
}
return tracks.sectionIndices.get(section);
}
@Override
public int getSectionForPosition(int position) {
for (int i = 0; i < tracks.sectionIndices.size(); i++) {
if (position < tracks.sectionIndices.get(i)) {
return i - 1;
}
}
return tracks.sectionIndices.size() - 1;
}
}
private class ViewHolder{
private TextView tvName, tvTime, tvDis, tvSceneryNum, tvPointNum;
private View lyLine1, lyLine2, tvRecording;
public ViewHolder(View convertView){
tvName = (TextView) convertView.findViewById(R.id.tvName);
tvTime = (TextView) convertView.findViewById(R.id.tvTime);
tvDis = (TextView) convertView.findViewById(R.id.tvDis);
tvSceneryNum = (TextView) convertView.findViewById(R.id.tvSceneryNum);
tvPointNum = (TextView) convertView.findViewById(R.id.tvPointNum);
lyLine1 = convertView.findViewById(R.id.lyLine1);
lyLine2 = convertView.findViewById(R.id.lyLine2);
tvRecording = convertView.findViewById(R.id.tvRecording);
}
public void updateData(Track track, int position){
tvName.setText(track.getName());
if(position == 0 && TrackManager.getInstance().isTrackRecording(track.getId())){
//是正在记录的轨迹
lyLine1.setVisibility(View.GONE);
lyLine2.setVisibility(View.GONE);
tvRecording.setVisibility(View.VISIBLE);
}else{
lyLine1.setVisibility(View.VISIBLE);
lyLine2.setVisibility(View.VISIBLE);
tvRecording.setVisibility(View.GONE);
//不是正在记录的轨迹
tvTime.setText(TimeUtil.getFormatedTimeHMS(track.getMovingTime()));
tvDis.setText(StringUtils.getFormatDistance(StringUtils.decimalRoundToInt(track.getMovingDistance()),
2,
strM,
strKm));
tvSceneryNum.setText("" + track.getSceneryNum());
tvPointNum.setText("" + track.getPointsNum());
}
}
}
}