/*
* Copyright (C) 2011-2015 asksven
*
* 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
*et
* 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 com.asksven.betterbatterystats;
/**
* Shows alarms in a list
* @author sven
*/
import java.util.ArrayList;
import android.app.ProgressDialog;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.SystemClock;
import android.preference.PreferenceManager;
import android.support.design.widget.Snackbar;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import com.asksven.android.common.privateapiproxies.BatteryInfoUnavailableException;
import com.asksven.android.common.privateapiproxies.BatteryStatsProxy;
import com.asksven.android.common.privateapiproxies.StatElement;
import com.asksven.android.common.utils.DateUtils;
import com.asksven.betterbatterystats.R;
import com.asksven.betterbatterystats.adapters.StatsAdapter;
import com.asksven.betterbatterystats.data.StatsProvider;
public class RawStatsActivity extends ActionBarListActivity implements AdapterView.OnItemSelectedListener
{
/**
* The logging TAG
*/
private static final String TAG = "KernelWakelocksActivity";
/**
* The Stat to be displayed
*/
private int m_iStat = 0;
/**
* a progess dialog to be used for long running tasks
*/
ProgressDialog m_progressDialog;
/**
* The ArrayAdpater for rendering the ListView
*/
private StatsAdapter m_listViewAdapter;
/**
* @see android.app.Activity#onCreate(Bundle@SuppressWarnings("rawtypes")
*/
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.raw_stats);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.setTitle(getString(R.string.label_raw_stats));
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayUseLogoEnabled(false);
// Spinner for selecting the stat
Spinner spinnerStat = (Spinner) findViewById(R.id.spinnerStat);
ArrayAdapter spinnerStatAdapter = ArrayAdapter.createFromResource(
this, R.array.stats, R.layout.bbs_spinner_layout);
spinnerStatAdapter.setDropDownViewResource(R.layout.bbs_spinner_dropdown_item);
spinnerStat.setAdapter(spinnerStatAdapter);
// setSelection MUST be called after setAdapter
spinnerStat.setSelection(m_iStat);
spinnerStat.setOnItemSelectedListener(this);
TextView tvSince = (TextView) findViewById(R.id.TextViewSince);
long sinceMs = SystemClock.elapsedRealtime();
if (sinceMs != -1)
{
String sinceText = DateUtils.formatDuration(sinceMs);
tvSince.setText(sinceText);
Log.i(TAG, "Since " + sinceText);
}
else
{
tvSince.setText("n/a ");
Log.i(TAG, "Since: n/a ");
}
}
/* Request updates at startup */
@Override
protected void onResume()
{
super.onResume();
new LoadStatData().execute(this);
}
/**
* Add menu items
*
* @see android.app.Activity#onCreateOptionsMenu(android.view.Menu)
*/
public boolean onCreateOptionsMenu(Menu menu)
{
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.kernelwakelocks_menu, menu);
return true;
}
/**
* Define menu action
*
* @see android.app.Activity#onOptionsItemSelected(android.view.MenuItem)
*/
public boolean onOptionsItemSelected(MenuItem item)
{
switch (item.getItemId())
{
case R.id.refresh:
// Refresh
doRefresh();
break;
}
return false;
}
private void doRefresh()
{
BatteryStatsProxy.getInstance(this).invalidate();
new LoadStatData().execute(this);
if (m_listViewAdapter != null)
{
m_listViewAdapter.notifyDataSetChanged();
}
}
/**
* Take the change of selection from the spinners into account and refresh the ListView
* with the right data
*/
public void onItemSelected(AdapterView<?> parent, View v, int position, long id)
{
// this method is fired even if nothing has changed so we nee to find that out
SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);
boolean bChanged = false;
// id is in the order of the spinners, 0 is stat, 1 is stat_type
if (parent == (Spinner) findViewById(R.id.spinnerStat))
{
int iNewStat = position;
if ( m_iStat != iNewStat )
{
m_iStat = iNewStat;
bChanged = true;
}
else
{
return;
}
}
else
{
Log.e(TAG, "RawStatsActivity.onItemSelected error. ID could not be resolved");
Toast.makeText(this, getString(R.string.info_unknown_state), Toast.LENGTH_SHORT).show();
}
if (bChanged)
{
doRefresh();
}
}
public void onNothingSelected(AdapterView<?> parent)
{
// do nothing
}
// @see http://code.google.com/p/makemachine/source/browse/trunk/android/examples/async_task/src/makemachine/android/examples/async/AsyncTaskExample.java
// for more details
private class LoadStatData extends AsyncTask<Object, Integer, StatsAdapter>
{
private Exception m_exception = null;
@Override
protected StatsAdapter doInBackground(Object... refresh)
{
m_listViewAdapter = null;
try
{
Log.i(TAG, "LoadStatData: refreshing display for raw stats");
ArrayList<StatElement> stats = null;
StatsProvider provider = StatsProvider.getInstance(RawStatsActivity.this);
// constants are related to arrays.xml string-array name="stats"
switch (m_iStat)
{
case 0:
stats = provider.getCurrentOtherUsageStatList(true, false, false);
break;
case 1:
stats = provider.getCurrentKernelWakelockStatList(false, 0, 0);
break;
case 2:
stats = provider.getCurrentWakelockStatList(false, 0, 0);
break;
case 3:
stats = provider.getCurrentAlarmsStatList(false);
break;
case 4:
stats = provider.getCurrentNetworkUsageStatList(false);
break;
case 5:
stats = provider.getCurrentCpuStateList(false);
break;
case 6:
stats = provider.getCurrentProcessStatList(false, 0);
break;
case 7:
stats = provider.getCurrentSensorStatList(false);
break;
}
m_listViewAdapter = new StatsAdapter(RawStatsActivity.this, stats, RawStatsActivity.this);
}
catch (BatteryInfoUnavailableException e)
{
//Log.e(TAG, e.getMessage(), e.fillInStackTrace());
Log.e(TAG, "Exception: "+Log.getStackTraceString(e));
m_exception = e;
}
catch (Exception e)
{
//Log.e(TAG, e.getMessage(), e.fillInStackTrace());
Log.e(TAG, "Exception: "+Log.getStackTraceString(e));
m_exception = e;
}
//StatsActivity.this.setListAdapter(m_listViewAdapter);
// getStatList();
return m_listViewAdapter;
}
// @Override
protected void onPostExecute(StatsAdapter o)
{
// super.onPostExecute(o);
// update hourglass
try
{
if (m_progressDialog != null)
{
m_progressDialog.dismiss(); //hide();
m_progressDialog = null;
}
}
catch (Exception e)
{
// nop
}
finally
{
m_progressDialog = null;
}
if (m_exception != null)
{
if (m_exception instanceof BatteryInfoUnavailableException)
{
Snackbar
.make(findViewById(android.R.id.content), R.string.info_service_connection_error, Snackbar.LENGTH_LONG)
.show();
// Toast.makeText(RawStatsActivity.this,
// getString(R.string.info_service_connection_error),
// Toast.LENGTH_LONG).show();
}
else
{
Snackbar
.make(findViewById(android.R.id.content), R.string.info_unknown_stat_error, Snackbar.LENGTH_LONG)
.show();
//
// Toast.makeText(RawStatsActivity.this,
// getString(R.string.info_unknown_stat_error),
// Toast.LENGTH_LONG).show();
}
}
if (o != null)
{
o.setTotalTime(SystemClock.elapsedRealtime());
}
RawStatsActivity.this.setListAdapter(o);
}
// @Override
protected void onPreExecute()
{
// update hourglass
// @todo this code is only there because onItemSelected is called twice
if (m_progressDialog == null)
{
try
{
m_progressDialog = new ProgressDialog(RawStatsActivity.this);
m_progressDialog.setMessage(getString(R.string.message_computing));
m_progressDialog.setIndeterminate(true);
m_progressDialog.setCancelable(false);
m_progressDialog.show();
}
catch (Exception e)
{
m_progressDialog = null;
}
}
}
}
}