package com.roboo.like.google.fragments; import java.io.DataOutputStream; import java.util.Calendar; import java.util.LinkedList; import android.annotation.SuppressLint; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.v4.app.LoaderManager.LoaderCallbacks; import android.support.v4.content.Loader; import android.text.Spannable; import android.text.SpannableStringBuilder; import android.text.TextUtils; import android.text.style.ForegroundColorSpan; import android.view.Gravity; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.widget.FrameLayout; import android.widget.HorizontalScrollView; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.Toast; import com.roboo.like.google.BusLineActivity; import com.roboo.like.google.BusStationActivity; import com.roboo.like.google.R; import com.roboo.like.google.adapters.BusStationAdapter2; import com.roboo.like.google.async.BusLineAsyncTaskLoader; import com.roboo.like.google.models.BusLineItem; import com.roboo.like.google.models.BusStationItem; import com.roboo.like.google.utils.BusUtils; import com.roboo.like.google.views.BusSiteView; @SuppressLint("NewApi") public class BusLineFragment2 extends BaseWithProgressFragment implements LoaderCallbacks<LinkedList<BusLineItem>> { private static final String NO_CAR = "前方暂无到达车辆"; private static final String IN_CAR = "进站"; private static final String ZERO = "0"; private static final long NEXT_QUERY_DELAY_TIME = 12000L; private static final long ONE_MINUTE_IN_MM = 60 * 1000L; public static final String ARG_BUS_LINE = "bus_line"; public static final String ARG_BUS_NO = "bus_no"; private LinkedList<BusLineItem> mData; /**是否自动刷新*/ private boolean mIsAutoRefresh = true; private LinkedList<BusStationItem> mBusStationItems = null; private int mClickPosition = -1; private int mPreviousClickPosition = -1; private HorizontalScrollView mHorizontalScrollView; private BusLineItem mClickedBusLineItem; private BusLineActivity mHostActivity; private Handler mHandler = new Handler() { public void handleMessage(Message msg) { mBusStationItems = (LinkedList<BusStationItem>) msg.obj; if (null != mBusStationItems && mBusStationItems.size() > 0) { BusStationItem busStationItem = null; for(int i = 0;i < mBusStationItems.size();i++) { BusStationItem tmp = mBusStationItems.get(i); if(tmp.busNo.equals(getArguments().getString(ARG_BUS_NO))) { busStationItem = tmp; break; } } if(null != busStationItem) { mBusStationItems.remove(busStationItem); mBusStationItems.addFirst(busStationItem); } BusStationAdapter2 adapter = new BusStationAdapter2( mHostActivity, mBusStationItems,getArguments().getString(ARG_BUS_NO)); mHostActivity.showNavActionBar(adapter); } }; }; private Runnable mQueryRunnable = new Runnable() { @Override public void run() { if (mIsAutoRefresh && mProgressBar.getVisibility() == View.GONE) { doLoadData(); } } }; private Runnable mGetBusStationRunnable = new Runnable() { public void run() { LinkedList<BusStationItem> data = BusUtils .getBusStation(mClickedBusLineItem.stationUrl); Message message = mHandler.obtainMessage(); message.obj = data; mHandler.sendMessage(message); } }; public static BusLineFragment2 newInstance(String busLineUrl, String busName) { BusLineFragment2 fragment = new BusLineFragment2(); Bundle bundle = new Bundle(); bundle.putString(ARG_BUS_LINE, busLineUrl); bundle.putString(ARG_BUS_NO, busName); fragment.setArguments(bundle); return fragment; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = null; if (savedInstanceState == null) { view = inflater.inflate(R.layout.fragment_bus_line2, null);// TODO mHorizontalScrollView = (HorizontalScrollView) view .findViewById(R.id.hsv_scrollview); } return view; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); mHostActivity = (BusLineActivity) getActivity(); doLoadData(); } @Override public void onPause() { super.onPause(); mProgressBar.setVisibility(View.GONE); mHandler.removeCallbacks(mQueryRunnable); } @Override public void onResume() { super.onResume(); if (mData != null) { mHandler.postDelayed(mQueryRunnable, NEXT_QUERY_DELAY_TIME); } } private void doLoadBusStationData() { new Thread(mGetBusStationRunnable).start(); } private void doLoadData() { getActivity().getSupportLoaderManager().restartLoader(0, null, this); mProgressBar.setVisibility(View.VISIBLE); if (null != mBusStationItems)// 前面点击过 { doLoadBusStationData(); } } @Override public void onPrepareOptionsMenu(Menu menu) { super.onPrepareOptionsMenu(menu); menu.findItem(R.id.menu_other).setVisible(false); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.activity_bus_line, menu); menu.findItem(R.id.menu_other).setVisible(false); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.menu_refresh:// 重试 onRefresh(); break; case R.id.menu_invert:// 换方向 invert(); break; case R.id.menu_auto_refresh:// 自动刷新 mIsAutoRefresh = !item.isChecked(); item.setChecked(mIsAutoRefresh); if (mIsAutoRefresh) { mHandler.post(mQueryRunnable); } break; } return super.onOptionsItemSelected(item); } private void invert() { BusLineActivity busLineActivity = (BusLineActivity) getActivity(); busLineActivity.invert(); } private void onRefresh() { mData = new LinkedList<BusLineItem>(); doLoadData(); } @Override public Loader<LinkedList<BusLineItem>> onCreateLoader(int id, Bundle args) { return new BusLineAsyncTaskLoader(getActivity(), getArguments() .getString(ARG_BUS_LINE, null)); } @Override public void onLoadFinished(Loader<LinkedList<BusLineItem>> loader, LinkedList<BusLineItem> data) { mProgressBar.setVisibility(View.GONE); mHandler.postDelayed(mQueryRunnable, NEXT_QUERY_DELAY_TIME); if (data != null) { mData = data; onGetDataSuccess(); } } private void onGetDataSuccess() { mHorizontalScrollView.removeAllViews(); int dp_48 = (int) (48 * getResources().getDisplayMetrics().density); final FrameLayout frameLayout = new FrameLayout(getActivity()); FrameLayout.LayoutParams frameLayoutParams = new FrameLayout.LayoutParams( LayoutParams.MATCH_PARENT, 5 * dp_48); frameLayoutParams.gravity = Gravity.CENTER_VERTICAL; mHorizontalScrollView.addView(frameLayout, frameLayoutParams); final LinearLayout linearLayout = new LinearLayout(getActivity()); frameLayout.addView(linearLayout, new FrameLayout.LayoutParams( LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); LayoutParams params = new LinearLayout.LayoutParams(dp_48, LayoutParams.MATCH_PARENT); if (TextUtils.isEmpty(mHostActivity.getStationMark())) { mClickPosition = mData.size() / 2; mHostActivity.setStationMark(mData.get(mClickPosition).stationMark); } else { mClickPosition = getDefaultPosition(); } for (int i = 0; i < mData.size(); i++) { final BusLineItem item = mData.get(i); final BusSiteView busItemView = new BusSiteView(getActivity()); busItemView.setPosition(i + 1); busItemView.setText(item.stationName); busItemView.setIsEnd(i == mData.size() - 1); busItemView.setIsStart(i == 0); if (item.stationMark.equals(mHostActivity.getStationMark())) { busItemView.getVerticalTextView().setTextColor( busItemView.getClickTextColor()); } if (!TextUtils.isEmpty(item.incomingBusNo)) { ImageView imageView = new ImageView(getActivity()); int imageViewWH = dp_48 * 2 / 3; FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams( imageViewWH, imageViewWH); layoutParams.topMargin = 0; int paddingLTRB = dp_48 / 12; layoutParams.gravity = Gravity.TOP; if (isArrived(item)) { layoutParams.leftMargin = dp_48 * i + imageViewWH / 4; imageView.setImageResource(R.drawable.ic_bus_arrive); } else if (i < mData.size() - 1) { layoutParams.leftMargin = dp_48 * (1 + i) - imageViewWH / 2; imageView.setImageResource(R.drawable.ic_bus_ontheway); } frameLayout.addView(imageView, layoutParams); imageView.setPadding(paddingLTRB, paddingLTRB, paddingLTRB, paddingLTRB); imageView.setOnClickListener(new OnClickListener() { public void onClick(View v) { SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder( "到达" + item.stationName + "时间是" + item.incomingBusTime); spannableStringBuilder.setSpan(new ForegroundColorSpan( 0xFFFF0000), 2, 2 + item.stationName.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE); Toast.makeText(getActivity(), spannableStringBuilder, Toast.LENGTH_SHORT).show(); } }); } busItemView.getVerticalTextView().setOnClickListener( new OnClickListener() { public void onClick(View v) { mClickedBusLineItem = item; mHostActivity.setStationMark(item.stationMark); mPreviousClickPosition = mClickPosition; View childView = linearLayout .getChildAt(mPreviousClickPosition); if (childView instanceof BusSiteView) { ((BusSiteView) childView).getVerticalTextView() .setTextColor(busItemView.getTextColor()); // System.out.println("mPreviousClickPosition =" // + mPreviousClickPosition); } onTextViewClick(item, busItemView); doLoadBusStationData(); } private void onTextViewClick(final BusLineItem item, final BusSiteView busItemView) { mClickPosition = getClickPosition(); busItemView.getVerticalTextView().setTextColor( busItemView.getClickTextColor()); String busStopSpacing = getNearestCar(); if (isArrived(item)) { SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder( "正在进站"); spannableStringBuilder.setSpan( new ForegroundColorSpan(0xFFFF0000), 0, 4, Spannable.SPAN_INCLUSIVE_INCLUSIVE); Toast.makeText(getActivity(), spannableStringBuilder, Toast.LENGTH_SHORT) .show(); } else if (NO_CAR.equals(busStopSpacing)) { Toast.makeText(getActivity(), NO_CAR, Toast.LENGTH_SHORT).show(); } else if (ZERO.equals(busStopSpacing)) { SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder( "即将到达" + item.stationName); spannableStringBuilder.setSpan( new ForegroundColorSpan(0xFFFF0000), 4, 4 + item.stationName.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE); Toast.makeText(getActivity(), spannableStringBuilder, Toast.LENGTH_SHORT) .show(); } else { SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder( "还有" + busStopSpacing + "站到达" + item.stationName); spannableStringBuilder.setSpan( new ForegroundColorSpan(0xFFFF0000), 2, 2 + busStopSpacing.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE); Toast.makeText(getActivity(), spannableStringBuilder, Toast.LENGTH_SHORT) .show(); } } private String getNearestCar() { String busStopSpacing = "-1"; // System.out.println("position = " + position); for (int i = mClickPosition; i >= 0; i--) { BusLineItem tmp = mData.get(i); if (!TextUtils.isEmpty(tmp.incomingBusTime)) { busStopSpacing = mClickPosition - (i + 1) + ""; break; } } if ("-1".equals(busStopSpacing)) { busStopSpacing = NO_CAR; } if (IN_CAR.equals(busStopSpacing)) { busStopSpacing = "0"; } return busStopSpacing; } private int getClickPosition() { for (int ii = 0; ii < mData.size(); ii++) { if (mData.get(ii).stationMark .equals(item.stationMark)) { return ii; } } return 0; } }); busItemView.setOnClickListener(new OnClickListener() { public void onClick(View v) { BusStationActivity.actionBusStation(getActivity(), item); } }); linearLayout.addView(busItemView, params); } } private int getDefaultPosition() { for(int i = 0; i< mData.size();i++) { if(mData.get(i).stationMark.equals(mHostActivity.getStationMark())) { return i ; } } return mData.size()/2; } private boolean isArrived(BusLineItem item) { Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); int year = calendar.get(Calendar.YEAR); int month = calendar.get(Calendar.MONTH); int day = calendar.get(Calendar.DAY_OF_MONTH); int hourOfDay = 0, minute = 0, second = 0; if (!TextUtils.isEmpty(item.incomingBusTime) && item.incomingBusTime.contains(":")) { String[] tmp = item.incomingBusTime.split(":"); hourOfDay = Integer.parseInt(tmp[0]); minute = Integer.parseInt(tmp[1]); second = Integer.parseInt(tmp[2]); } // System.out.println("year = " + year + " month = " + month + " day = " // + day); Calendar busCalendar = Calendar.getInstance(); busCalendar.set(year, month, day, hourOfDay, minute, second); // System.out.println(calendar.getTimeInMillis() + "\n" // + busCalendar.getTimeInMillis()); return calendar.getTimeInMillis() - busCalendar.getTimeInMillis() < ONE_MINUTE_IN_MM; } @Override public void onLoaderReset(Loader<LinkedList<BusLineItem>> loader) { } /*** * 执行Root 命令 * * @param command * 要执行的命令[chmod 777 /data/misc/wifi/wpa_supplicant.conf] * @return true 命令成功执行 或者 false 命令执行失败 */ public static boolean runRootCommand(String command) { Process process = null; DataOutputStream os = null; try { process = Runtime.getRuntime().exec("su"); os = new DataOutputStream(process.getOutputStream()); os.writeBytes(command + "\n"); os.writeBytes("exit\n"); os.flush(); process.waitFor(); } catch (Exception e) { return false; } finally { try { if (os != null) { os.close(); } process.destroy(); } catch (Exception e) {} } return true; } }