package com.classic.car.ui.activity; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.support.annotation.NonNull; import android.view.View; import android.view.WindowManager; import android.widget.FrameLayout; import android.widget.ImageButton; import com.classic.android.base.BaseActivity; import com.classic.car.R; import com.classic.car.app.CarApplication; import com.classic.car.consts.Consts; import com.classic.car.db.dao.ConsumerDao; import com.classic.car.entity.ChartType; import com.classic.car.entity.ConsumerDetail; import com.classic.car.ui.chart.BarChartDisplayImpl; import com.classic.car.ui.chart.IChartDisplay; import com.classic.car.ui.chart.LineChartDisplayImpl; import com.classic.car.ui.chart.PieChartDisplayImpl; import com.classic.car.utils.RxUtil; import com.classic.car.utils.ToastUtil; import com.classic.car.utils.Util; import com.github.mikephil.charting.charts.BarChart; import com.github.mikephil.charting.charts.Chart; import com.github.mikephil.charting.charts.LineChart; import com.github.mikephil.charting.charts.PieChart; import java.util.List; import javax.inject.Inject; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; import rx.Observable; import rx.Subscriber; import rx.Subscription; import rx.functions.Action1; import rx.functions.Func1; import rx.subscriptions.CompositeSubscription; /** * 应用名称: CarAssistant * 包 名 称: com.classic.car.ui.activity * * 文件描述: TODO * 创 建 人: 续写经典 * 创建时间: 2017/3/25 10:53 */ @SuppressWarnings("unchecked") public class ChartActivity extends BaseActivity { private static final String PARAMS_CHART_TYPE = "chartType"; private static final String PARAMS_START_TIME = "startTime"; private static final String PARAMS_END_TIME = "endTime"; private static final int ANIMATE_DURATION = 400; @Inject ConsumerDao mConsumerDao; @BindView(R.id.chart_download) ImageButton mDownloadBtn; private Context mAppContext; private IChartDisplay mChartDisplay; private Integer mDataType; private int mChartType; private long mStartTime; private long mEndTime; private Chart mChart; private boolean isAsc; private CompositeSubscription mCompositeSubscription; @BindView(R.id.chart_layout) FrameLayout mChartLayout; public static void start(@NonNull Activity activity, @ChartType int chartType, long startTime, long endTime) { Intent intent = new Intent(activity, ChartActivity.class); intent.putExtra(PARAMS_CHART_TYPE, chartType); intent.putExtra(PARAMS_START_TIME, startTime); intent.putExtra(PARAMS_END_TIME, endTime); activity.startActivity(intent); } @Override public int getLayoutResId() { return R.layout.activity_chart; } @Override public void initView(Bundle savedInstanceState) { getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); super.initView(savedInstanceState); ((CarApplication) mActivity.getApplicationContext()).getAppComponent().inject(this); ButterKnife.bind(this); mAppContext = getApplicationContext(); mCompositeSubscription = new CompositeSubscription(); getParams(); createChart(mChartType); } @Override protected void onStart() { super.onStart(); loadData(); } @Override protected void onStop() { super.onStop(); if (null != mCompositeSubscription) { mCompositeSubscription.clear(); } } private void getParams() { if (!getIntent().hasExtra(PARAMS_CHART_TYPE)) { finish(); return; } mChartType = getIntent().getIntExtra(PARAMS_CHART_TYPE, ChartType.BAR_CHART); mStartTime = getIntent().getLongExtra(PARAMS_START_TIME, 0); mEndTime = getIntent().getLongExtra(PARAMS_END_TIME, 0); if (mChartType == ChartType.LINE_CHART) { mDataType = Consts.TYPE_FUEL; isAsc = true; } } private Subscription loadData() { return mConsumerDao.query(mDataType, mStartTime, mEndTime, false, isAsc) .compose(RxUtil.<List<ConsumerDetail>>applySchedulers(RxUtil.IO_ON_UI_TRANSFORMER)) .map(new Func1<List<ConsumerDetail>, Object>() { @Override public Object call(List<ConsumerDetail> list) { return mChartDisplay.convert(list); } }) .subscribe(new Action1<Object>() { @Override public void call(Object data) { mDownloadBtn.setVisibility(null == data ? View.GONE : View.VISIBLE); mChartDisplay.animationDisplay(mChart, data, ANIMATE_DURATION); } }, RxUtil.ERROR_ACTION); } @SuppressWarnings("unused") @OnClick(R.id.chart_back) void onBack(View view) { finish(); } @SuppressWarnings("unused") @OnClick(R.id.chart_download) void download(View view) { if (null == mChart) { return; } mCompositeSubscription.add(Observable.unsafeCreate(new Observable.OnSubscribe<Boolean>() { @Override public void call(Subscriber<? super Boolean> subscriber) { if (!subscriber.isUnsubscribed()) { subscriber.onNext(mChart.saveToGallery(Util.createImageName(), IChartDisplay.QUALITY)); subscriber.onCompleted(); } } }) .compose(RxUtil.<Boolean>applySchedulers(RxUtil.IO_ON_UI_TRANSFORMER)) .subscribe(new Action1<Boolean>() { @Override public void call(Boolean result) { ToastUtil.showToast(mAppContext, result ? R.string.chart_save_success : R.string.chart_save_fail); } }, new Action1<Throwable>() { @Override public void call(Throwable throwable) { ToastUtil.showToast(mAppContext, R.string.chart_save_fail); } })); } private void createChart(int chartType) { FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT); final int margin = Util.dp2px(mAppContext, 16); params.setMargins(margin, margin, margin, margin); switch (chartType) { case ChartType.BAR_CHART: mChart = new BarChart(mChartLayout.getContext()); mChart.setLayoutParams(params); mChartDisplay = new BarChartDisplayImpl(); break; case ChartType.PIE_CHART: mChart = new PieChart(mChartLayout.getContext()); mChart.setLayoutParams(params); mChartDisplay = new PieChartDisplayImpl(); break; case ChartType.LINE_CHART: mChart = new LineChart(mChartLayout.getContext()); mChart.setLayoutParams(params); mChartDisplay = new LineChartDisplayImpl(); break; } mChartDisplay.init(mChart, true); if (null != mChart) { mChartLayout.addView(mChart, 0); } } }