package com.liyu.fakeweather.ui.bus; import android.content.ContentValues; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.support.design.widget.FloatingActionButton; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.View; import android.widget.TextView; import com.liyu.fakeweather.R; import com.liyu.fakeweather.event.BusFavoritesEvent; import com.liyu.fakeweather.http.ApiFactory; import com.liyu.fakeweather.http.BaseBusResponse; import com.liyu.fakeweather.http.api.BusController; import com.liyu.fakeweather.model.BusLineDetail; import com.liyu.fakeweather.model.FavoritesBusBean; import com.liyu.fakeweather.model.StandInfoBean; import com.liyu.fakeweather.ui.base.BaseActivity; import com.liyu.fakeweather.ui.bus.adapter.LineDetailAdapter; import com.liyu.fakeweather.utils.RxDataBase; import com.liyu.fakeweather.utils.SettingsUtil; import com.liyu.fakeweather.utils.ThemeUtil; import org.greenrobot.eventbus.EventBus; import org.litepal.crud.DataSupport; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; import rx.Observable; import rx.Observer; import rx.Subscription; import rx.android.schedulers.AndroidSchedulers; import rx.functions.Action1; import rx.functions.Func1; import rx.schedulers.Schedulers; /** * Created by liyu on 2016/11/1. */ public class LineDetailActivity extends BaseActivity { public static final String KEY_EXTRA_GUID = "GUID"; public static final String KEY_EXTRA_NAME = "NAME"; public static final String KEY_EXTRA_DESC = "DESC"; private RecyclerView recyclerView; private LineDetailAdapter adapter; private TextView tvLineInfoName; private TextView tvLineInfodirection; private TextView tvLineInfoSTime; private TextView tvLineInfoETime; private TextView tvLineInfoTotal; private FloatingActionButton fabLike; private FloatingActionButton fabRefresh; private SwipeRefreshLayout refreshLayout; private boolean isFavorite = false; private String guid; private String name; private String desc; private boolean isAutoRefresh = false; private Observable<Long> autoRefreshObservable; private Subscription subscription; public static void start(Context context, String guid, String name, String desc) { Intent intent = new Intent(context, LineDetailActivity.class); intent.putExtra(KEY_EXTRA_GUID, guid); intent.putExtra(KEY_EXTRA_NAME, name); intent.putExtra(KEY_EXTRA_DESC, desc); context.startActivity(intent); } @Override protected int getLayoutId() { return R.layout.activity_line_detail; } @Override protected int getMenuId() { return 0; } @Override protected void initViews(Bundle savedInstanceState) { setDisplayHomeAsUpEnabled(true); guid = getIntent().getStringExtra(KEY_EXTRA_GUID); name = getIntent().getStringExtra(KEY_EXTRA_NAME); desc = getIntent().getStringExtra(KEY_EXTRA_DESC); getSupportActionBar().setTitle(name); getSupportActionBar().setSubtitle(desc); refreshLayout = (SwipeRefreshLayout) findViewById(R.id.refeshLayout); refreshLayout.setColorSchemeResources(ThemeUtil.getCurrentColorPrimary(this)); refreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { loadData(); } }); fabLike = (FloatingActionButton) findViewById(R.id.fab); fabRefresh = (FloatingActionButton) findViewById(R.id.fab_refesh); tvLineInfoName = (TextView) findViewById(R.id.tv_info_name); tvLineInfodirection = (TextView) findViewById(R.id.tv_info_direction); tvLineInfoSTime = (TextView) findViewById(R.id.tv_info_stime); tvLineInfoETime = (TextView) findViewById(R.id.tv_info_etime); tvLineInfoTotal = (TextView) findViewById(R.id.tv_info_total); recyclerView = (RecyclerView) findViewById(R.id.rv_line_search); recyclerView.setLayoutManager(new LinearLayoutManager(this)); adapter = new LineDetailAdapter(R.layout.item_bus_line_detail, null); recyclerView.setAdapter(adapter); fabLike.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { isFavorite = !isFavorite; ContentValues values = new ContentValues(); values.put("isFavorite", isFavorite); DataSupport.updateAll(BusLineDetail.class, values, "LGUID = ?", guid); showFabStatus(isFavorite); FavoritesBusBean favoritesBusBean = new FavoritesBusBean(); favoritesBusBean.setLGUID(guid); favoritesBusBean.setLName(name); favoritesBusBean.setLDirection(desc); BusFavoritesEvent event = new BusFavoritesEvent(favoritesBusBean); event.setFavorite(isFavorite); EventBus.getDefault().post(event); } }); fabRefresh.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { loadData(); } }); final int autoFreq = SettingsUtil.getBusRefreshFreq(); autoRefreshObservable = Observable.interval(autoFreq, TimeUnit.SECONDS) .observeOn(AndroidSchedulers.mainThread()); fabRefresh.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View view) { if (isAutoRefresh) { fabRefresh.setImageResource(R.drawable.ic_refresh); if (!subscription.isUnsubscribed()) subscription.unsubscribe(); } else { showAutoRefreshFabStatus(autoFreq); subscription = autoRefreshObservable.subscribe(new Action1<Long>() { @Override public void call(Long aLong) { loadData(); } }); } isAutoRefresh = !isAutoRefresh; return true; } }); } @Override protected void loadData() { showRefreshing(true); tvLineInfoName.setText(name); tvLineInfodirection.setText(desc); RxDataBase.getFirst(BusLineDetail.class, "LGUID = ?", guid) .observeOn(AndroidSchedulers.mainThread()) .doOnNext(new Action1<BusLineDetail>() { @Override public void call(BusLineDetail busLineDetail) { if (busLineDetail != null) { showFabStatus(busLineDetail.isFavorite()); tvLineInfoSTime.setText("首班车: " + busLineDetail.getLFStdFTime()); tvLineInfoETime.setText("末班车: " + busLineDetail.getLFStdETime()); int stations = busLineDetail.getStandInfo() == null ? 0 : busLineDetail.getStandInfo().size(); tvLineInfoTotal.setText("总计: " + stations + " 站"); adapter.setNewData(busLineDetail.getStandInfo()); } else { tvLineInfoSTime.setText("首班车: --"); tvLineInfoETime.setText("末班车: --"); tvLineInfoTotal.setText("总计: -- 站"); } } }) .flatMap(new Func1<BusLineDetail, Observable<BaseBusResponse<BusLineDetail>>>() { @Override public Observable<BaseBusResponse<BusLineDetail>> call(BusLineDetail busLineDetail) { Map<String, String> options = new HashMap<>(); options.put("Guid", guid); options.put("uid", BusController.uid); options.put("DeviceID", BusController.deviceID); options.put("sign", BusController.sign); return ApiFactory.getBusController().getLineInfo(options).subscribeOn(Schedulers.io()); } }) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<BaseBusResponse<BusLineDetail>>() { @Override public void onCompleted() { showRefreshing(false); } @Override public void onError(Throwable e) { showRefreshing(false); } @Override public void onNext(BaseBusResponse<BusLineDetail> response) { tvLineInfoSTime.setText("首班车: " + response.data.getLFStdFTime()); tvLineInfoETime.setText("末班车: " + response.data.getLFStdETime()); tvLineInfoTotal.setText("总计: " + response.data.getStandInfo().size() + " 站"); adapter.setNewData(response.data.getStandInfo()); List<StandInfoBean> stations = response.data.getStandInfo(); DataSupport.saveAll(stations); BusLineDetail line = response.data; line.setStandInfo(stations); line.setFavorite(isFavorite); RxDataBase.deleteThenSave(line, "LGUID = ?", response.data.getLGUID()); } }); } private void showFabStatus(boolean isFavorite) { this.isFavorite = isFavorite; if (isFavorite) { fabLike.setImageResource(R.drawable.ic_favorite); } else { fabLike.setImageResource(R.drawable.ic_favorite_not); } } private void showAutoRefreshFabStatus(int freq) { if (freq == 5) { fabRefresh.setImageResource(R.drawable.ic_refresh_5); } else if (freq == 10) { fabRefresh.setImageResource(R.drawable.ic_refresh_10); } else if (freq == 30) { fabRefresh.setImageResource(R.drawable.ic_refresh_30); } } private void showRefreshing(final boolean refresh) { refreshLayout.post(new Runnable() { @Override public void run() { refreshLayout.setRefreshing(refresh); } }); } @Override protected void onDestroy() { super.onDestroy(); if (subscription != null && !subscription.isUnsubscribed()) subscription.unsubscribe(); } }