package com.liyu.fakeweather.ui.bus;
import android.content.Context;
import android.content.Intent;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.MenuItemCompat;
import android.support.v4.view.ViewPager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.SearchView;
import android.support.v7.widget.Toolbar;
import android.text.TextUtils;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.WindowManager;
import android.widget.LinearLayout;
import android.widget.PopupWindow;
import android.widget.TextView;
import com.andremion.counterfab.CounterFab;
import com.jakewharton.rxbinding.support.v7.widget.RxSearchView;
import com.liyu.fakeweather.R;
import com.liyu.fakeweather.http.ApiFactory;
import com.liyu.fakeweather.http.BaseBusResponse;
import com.liyu.fakeweather.model.BusLineSearch;
import com.liyu.fakeweather.model.BusNotice;
import com.liyu.fakeweather.ui.MainActivity;
import com.liyu.fakeweather.ui.base.BaseFragment;
import com.liyu.fakeweather.ui.bus.adapter.LineSearchAdapter;
import com.liyu.fakeweather.utils.SimpleSubscriber;
import com.liyu.fakeweather.utils.WebUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import rx.Observable;
import rx.Observer;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Func1;
import rx.schedulers.Schedulers;
/**
* Created by liyu on 2016/10/31.
*/
public class BusFragment extends BaseFragment {
private Toolbar mToolbar;
private MenuItem search;
private SearchView searchView;
private PopupWindow popupWindow;
private RecyclerView recyclerView;
private LineSearchAdapter searchAdapter;
@Override
protected int getLayoutId() {
return R.layout.fragment_tab_viewpager;
}
@Override
protected void initViews() {
mToolbar = findView(R.id.toolbar);
mToolbar.setTitle("公交");
((MainActivity) getActivity()).initDrawer(mToolbar);
initTabLayout();
inflateMenu();
initSearchView();
}
@Override
protected void lazyFetchData() {
ApiFactory
.getBusController()
.getBusNotices()
.subscribeOn(Schedulers.io())
.map(new Func1<BusNotice, String>() {
@Override
public String call(BusNotice busNotice) {
try {
Document doc = Jsoup.connect(busNotice.getData().getItems().getUrl()).timeout(10000).get();
Element element = doc.select("div#container").first();
Elements imgs = element.getElementsByTag("img");
for (Element img : imgs) {
img.attr("style", "max-width:100%;height:auto;");
}
return element.html();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<String>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(final String msg) {
if (!TextUtils.isEmpty(msg)) {
final CounterFab counterFab = findView(R.id.fab_msg);
counterFab.setVisibility(View.VISIBLE);
counterFab.postDelayed(new Runnable() {
@Override
public void run() {
counterFab.increase();
}
}, 500);
counterFab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
WebUtils.load(getContext(), "<head>\n" +
" <title>交通公告</title>\n" +
" </head><base href=\"http://news.wisesz.cc/\" />" + msg);
}
});
}
}
});
}
private void initSearchView() {
search = mToolbar.getMenu()
.findItem(R.id.menu_search);
searchView = (SearchView) search.getActionView();
searchView.setQueryHint("输入公交线路...");
RxSearchView
.queryTextChanges(searchView)
.debounce(400, TimeUnit.MILLISECONDS)
.subscribeOn(AndroidSchedulers.mainThread())
.filter(new Func1<CharSequence, Boolean>() {
@Override
public Boolean call(CharSequence charSequence) {
return charSequence.toString().trim().length() > 0;
}
})
.switchMap(new Func1<CharSequence, Observable<BaseBusResponse<BusLineSearch>>>() {
@Override
public Observable<BaseBusResponse<BusLineSearch>> call(CharSequence charSequence) {
return ApiFactory.getBusController().searchLine(charSequence.toString()).subscribeOn(Schedulers.io());
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new SimpleSubscriber<BaseBusResponse<BusLineSearch>>() {
@Override
public void onNext(BaseBusResponse<BusLineSearch> listBaseBusResponse) {
searchAdapter.setNewData(listBaseBusResponse.data.getList());
popupWindow.showAsDropDown(searchView);
}
});
MenuItemCompat.setOnActionExpandListener(search, new MenuItemCompat.OnActionExpandListener() {
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
popupWindow.showAsDropDown(mToolbar);
return true;
}
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
popupWindow.dismiss();
return true;
}
});
LayoutInflater inflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View contentView = inflater.inflate(R.layout.fragment_line_search, null);
TextView tvBusAll = (TextView) contentView.findViewById(R.id.tv_bus_all);
tvBusAll.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(getActivity(), AllLineActivity.class));
}
});
recyclerView = (RecyclerView) contentView.findViewById(R.id.rv_line_search);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
searchAdapter = new LineSearchAdapter(R.layout.item_bus_line_search, null);
recyclerView.setAdapter(searchAdapter);
popupWindow = new PopupWindow(contentView, LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT);
popupWindow.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED);
popupWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
}
private void inflateMenu() {
mToolbar.inflateMenu(R.menu.menu_bus);
mToolbar.getMenu()
.findItem(R.id.menu_subway).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
WebUtils.openInternal(getContext(), "http://api.caoliyu.cn/szsubway/index.html");
return false;
}
});
}
private void initTabLayout() {
TabLayout tabLayout = findView(R.id.tabs);
ViewPager viewPager = findView(R.id.viewPager);
setupViewPager(viewPager);
viewPager.setOffscreenPageLimit(viewPager.getAdapter().getCount());
tabLayout.setupWithViewPager(viewPager);
tabLayout.setTabMode(TabLayout.MODE_FIXED);
}
private void setupViewPager(ViewPager viewPager) {
ViewPagerAdapter adapter = new ViewPagerAdapter(getChildFragmentManager());
Fragment fragment = new NearbyLineFragment();
adapter.addFrag(fragment, getString(R.string.bus_nearby_line));
fragment = new NearbyStationFragment();
adapter.addFrag(fragment, getString(R.string.bus_nearby_station));
fragment = new FavoritesFragment();
adapter.addFrag(fragment, getString(R.string.bus_favorites));
viewPager.setAdapter(adapter);
}
class ViewPagerAdapter extends FragmentPagerAdapter {
private final List<Fragment> mFragmentList = new ArrayList<>();
private final List<String> mFragmentTitleList = new ArrayList<>();
public ViewPagerAdapter(FragmentManager manager) {
super(manager);
}
@Override
public Fragment getItem(int position) {
return mFragmentList.get(position);
}
@Override
public int getCount() {
return mFragmentList.size();
}
public void addFrag(Fragment fragment, String title) {
mFragmentList.add(fragment);
mFragmentTitleList.add(title);
}
@Override
public CharSequence getPageTitle(int position) {
return mFragmentTitleList.get(position);
}
}
@Override
public void onResume() {
super.onResume();
getFocus();
}
private void getFocus() {
getView().setFocusableInTouchMode(true);
getView().requestFocus();
getView().setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) {
if (MenuItemCompat.isActionViewExpanded(search)) {
MenuItemCompat.collapseActionView(search);
return true;
} else
return false;
}
return false;
}
});
}
}