/* * 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(); } }