org.flexlabs.widgets.dualbattery.app.BatteryHistoryActivity.java Source code

Java tutorial

Introduction

Here is the source code for org.flexlabs.widgets.dualbattery.app.BatteryHistoryActivity.java

Source

/*
 * Copyright 2012 Artiom Chilaru (http://flexlabs.org)
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.flexlabs.widgets.dualbattery.app;

import android.content.Intent;
import android.database.Cursor;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.FragmentTransaction;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.app.ActionBar.Tab;
import com.actionbarsherlock.app.SherlockActivity;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;
import org.achartengine.ChartFactory;
import org.achartengine.GraphicalView;
import org.achartengine.model.XYMultipleSeriesDataset;
import org.achartengine.model.XYSeries;
import org.achartengine.renderer.XYMultipleSeriesRenderer;
import org.achartengine.renderer.XYSeriesRenderer;
import org.flexlabs.widgets.dualbattery.BatteryLevel;
import org.flexlabs.widgets.dualbattery.R;
import org.flexlabs.widgets.dualbattery.service.MonitorService;
import org.flexlabs.widgets.dualbattery.storage.BatteryLevelAdapter;

public class BatteryHistoryActivity extends SherlockActivity implements ActionBar.TabListener {
    private XYSeries mMainSeries, mDockSeries;
    private GraphicalView mChartView;
    private LinearLayout mChartContainer;
    private int days = 3, defaultDays;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        startService(new Intent(this, MonitorService.class));

        setContentView(R.layout.battery_history);
        if (mChartContainer != null)
            mChartContainer.removeAllViews();
        mChartContainer = (LinearLayout) findViewById(R.id.chart);

        defaultDays = new SettingsContainer(this).getDefaultDaysTab();
        initChart();
        getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        addTab(3, R.string.sett_defaultDaysTab_3);
        addTab(7, R.string.sett_defaultDaysTab_7);
        addTab(30, R.string.sett_defaultDaysTab_30);
    }

    private ActionBar.Tab addTab(int days, int label) {
        ActionBar.Tab tab = getSupportActionBar().newTab();
        tab.setText(label);
        tab.setTag(days);
        tab.setTabListener(this);
        getSupportActionBar().addTab(tab);

        if (days == defaultDays)
            getSupportActionBar().selectTab(tab);
        return tab;
    }

    @Override
    protected void onResume() {
        super.onResume();
        buildChart();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getSupportMenuInflater().inflate(R.menu.main, menu);
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onMenuItemSelected(int featureId, MenuItem item) {
        if (item.getItemId() == R.id.settings) {
            startActivity(new Intent(this, SettingsActivity.class));
            return true;
        }
        return super.onMenuItemSelected(featureId, item);
    }

    @Override
    public void onTabReselected(Tab tab, FragmentTransaction transaction) {
    }

    @Override
    public void onTabSelected(Tab tab, FragmentTransaction transaction) {
        int newDays = (Integer) tab.getTag();
        if (newDays != days) {
            days = newDays;
            mMainSeries.clear();
            if (mDockSeries != null)
                mDockSeries.clear();
            chartPopulated = false;
        }

        repopulateChart();
    }

    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction transaction) {
    }

    public void initChart() {
        if (mChartView == null) {
            XYMultipleSeriesRenderer mRenderer = new XYMultipleSeriesRenderer();
            mRenderer.setAxisTitleTextSize(16);
            mRenderer.setChartTitleTextSize(20);
            mRenderer.setLabelsTextSize(15);
            mRenderer.setLegendTextSize(15);
            mRenderer.setMargins(new int[] { 20, 30, 15, 0 });
            mRenderer.setYAxisMin(0);
            mRenderer.setYAxisMax(100);
            mRenderer.setPanEnabled(true, false);
            mRenderer.setZoomEnabled(true, false);
            mRenderer.setShowGrid(true);
            mRenderer.setZoomButtonsVisible(false);

            XYMultipleSeriesDataset mDataSet = new XYMultipleSeriesDataset();
            mMainSeries = new XYSeries(getString(R.string.battery_main));
            mDataSet.addSeries(mMainSeries);
            XYSeriesRenderer mMainRenderer = new XYSeriesRenderer();
            mMainRenderer.setColor(Color.GREEN);
            mRenderer.addSeriesRenderer(mMainRenderer);

            if (BatteryLevel.getCurrent().is_dockFriendly()) {
                mDockSeries = new XYSeries(getString(R.string.battery_dock));
                mDataSet.addSeries(mDockSeries);
                XYSeriesRenderer mDockRenderer = new XYSeriesRenderer();
                mDockRenderer.setColor(Color.CYAN);
                mRenderer.addSeriesRenderer(mDockRenderer);
            }

            mChartView = ChartFactory.getTimeChartView(this, mDataSet, mRenderer, null);
        }
    }

    private boolean chartPopulated = false;

    public void buildChart() {
        initChart();
        if (mChartContainer.getChildCount() == 0) {
            mChartContainer.addView(mChartView, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
                    ViewGroup.LayoutParams.FILL_PARENT));
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
                mChartContainer.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
        }

        if (chartPopulated) {
            mChartView.repaint();
        } else {
            repopulateChart();
        }
    }

    public void repopulateChart() {
        // populate chart
        chartPopulated = true;
        // TODO: fix this, seriously
        //new Thread(new Runnable() {
        //    @Override
        //    public void run() {
        BatteryLevelAdapter adapter = new BatteryLevelAdapter(BatteryHistoryActivity.this);
        adapter.openRead();
        Cursor c = adapter.getRecentEntries(days);
        int oldLevel = -1, oldDockLevel = -1;
        boolean dockSupported = BatteryLevel.getCurrent().is_dockFriendly();

        long time = System.currentTimeMillis();
        boolean mainSkipped = false, dockSkipped = false;
        if (c.moveToFirst())
            do {
                time = c.getLong(BatteryLevelAdapter.ORD_TIME);
                int level = c.getInt(BatteryLevelAdapter.ORD_LEVEL);
                int dock_status = c.getInt(BatteryLevelAdapter.ORD_DOCK_STATUS);
                int dock_level = c.getInt(BatteryLevelAdapter.ORD_DOCK_LEVEL);

                mainSkipped = level == oldLevel;
                if (!mainSkipped) {
                    mMainSeries.add(time, level);
                    oldLevel = level;
                }
                if (dockSupported && dock_status > 1) {
                    dockSkipped = dock_level == oldDockLevel;
                    if (!dockSkipped) {
                        mDockSeries.add(time, dock_level);
                        oldDockLevel = dock_level;
                    }
                }
            } while (c.moveToNext());
        c.close();
        adapter.close();
        if (mainSkipped)
            mMainSeries.add(time, oldLevel);
        if (dockSkipped)
            mDockSeries.add(time, oldDockLevel);

        mChartView.repaint();
        //    }
        //}).start();
    }
}