package com.roboo.like.google.fragments;
import java.io.DataOutputStream;
import java.util.LinkedList;
import android.annotation.SuppressLint;
import android.os.Bundle;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.Loader;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.TextView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import com.roboo.like.google.BusLineActivity;
import com.roboo.like.google.BusStationActivity;
import com.roboo.like.google.R;
import com.roboo.like.google.adapters.BusLineAdapter;
import com.roboo.like.google.async.BusLineAsyncTaskLoader;
import com.roboo.like.google.models.BusLineItem;
@SuppressLint("NewApi")
public class BusLineFragment extends BaseWithProgressFragment implements LoaderCallbacks<LinkedList<BusLineItem>>
{
private ListView mListView;
public static final String ARG_BUS_LINE = "bus_line";
public static final String ARG_BUS_NAME = "bus_name";
private LinkedList<BusLineItem> mData;
private View mHeaderView;
private BusLineAdapter mAdapter;
private int mListViewFirstPosition = 0;
private TextView mTvBusName;
private String mBusName;
public static BusLineFragment newInstance(String busLineUrl,String busName)
{
BusLineFragment fragment = new BusLineFragment();
Bundle bundle = new Bundle();
bundle.putString(ARG_BUS_LINE, busLineUrl);
bundle.putString(ARG_BUS_NAME, 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_line, null);// TODO
mListView = (ListView) view.findViewById(R.id.dlv_list);
}
mHeaderView = createHeaderView();
mListView.addHeaderView(mHeaderView);
init();
return view;
}
@Override
public void onActivityCreated(Bundle savedInstanceState)
{
super.onActivityCreated(savedInstanceState);
doLoadData();
setListener();
}
private void init()
{
mBusName = getArguments().getString(ARG_BUS_NAME);
if(TextUtils.isEmpty(mBusName))
{
mTvBusName.setVisibility(View.GONE);
}
mTvBusName.setText(mBusName);
}
private void doLoadData()
{
getActivity().getSupportLoaderManager().restartLoader(0, null, this);
mProgressBar.setVisibility(View.VISIBLE);
}
/***
* 为ListView通过代码创建一个HeaderView
*
* @return
*/
private View createHeaderView()
{
mHeaderView = LayoutInflater.from(getActivity()).inflate(R.layout.listview_bus_line_header_view, null);// TODO ListView的HeaderView布局文件
mTvBusName = (TextView) mHeaderView.findViewById(R.id.tv_bus_name);
return mHeaderView;
}
@Override
public void onPrepareOptionsMenu(Menu menu)
{
super.onPrepareOptionsMenu(menu);
menu.findItem(R.id.menu_invert).setVisible(!TextUtils.isEmpty(mBusName));
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater)
{
inflater.inflate(R.menu.activity_bus_line, menu);
}
@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_other://水平展示
other();
break;
}
return super.onOptionsItemSelected(item);
}
private void other()
{
getActivity().getSupportFragmentManager().beginTransaction()
.replace(R.id.frame_container, BusLineFragment2.newInstance(getArguments().getString(ARG_BUS_LINE), mBusName), "2").addToBackStack("1").commit();
}
private void invert()
{
BusLineActivity busLineActivity = (BusLineActivity) getActivity();
busLineActivity.invert();
}
private void onRefresh()
{
mHeaderView.setVisibility(View.GONE);
mData = new LinkedList<BusLineItem>();
mAdapter = new BusLineAdapter(getActivity(), mData);
mListView.setAdapter(mAdapter);
doLoadData();
}
public void setListener()
{
mListView.setOnItemClickListener(getOnItemClickListener());
mListView.setOnScrollListener(new OnScrollListener()
{
@Override
public void onScrollStateChanged(AbsListView view, int scrollState)
{
if(scrollState == OnScrollListener.SCROLL_STATE_IDLE)
{
mListViewFirstPosition = view.getFirstVisiblePosition();
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount)
{
}
});
}
private OnItemClickListener getOnItemClickListener()
{
return new OnItemClickListener()
{
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
{
BusLineItem item = (BusLineItem) parent.getAdapter().getItem(position);
BusStationActivity.actionBusStation(getActivity(), item);
}
};
}
@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);
if (data != null)
{
mData = data;
mAdapter = new BusLineAdapter(getActivity(), mData);
mListView.setAdapter(mAdapter);
mHeaderView.setVisibility(View.VISIBLE);
if(mListViewFirstPosition > 0)
{
mListView.setSelection(mListViewFirstPosition);
}
}
}
@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;
}
}