1afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/* 2afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 3afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * 4afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * you may not use this file except in compliance with the License. 6afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * You may obtain a copy of the License at 7afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * 8afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * 10afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * See the License for the specific language governing permissions and 14afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * limitations under the License. 15afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 16afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 17afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectpackage com.android.settings; 18afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 19afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.Activity; 20afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.BroadcastReceiver; 21afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Context; 22afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Intent; 23afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.IntentFilter; 24afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.BatteryManager; 25b05bc1454a675cb3ffc1cac019e92bc3146daa55Dianne Hackbornimport android.os.BatteryStats; 26afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle; 27afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Handler; 28afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.IPowerManager; 29afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Message; 30afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.ServiceManager; 31afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.SystemClock; 32afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.text.format.DateUtils; 33afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.TextView; 34afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 35afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport com.android.internal.app.IBatteryStats; 36afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 37afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectpublic class BatteryInfo extends Activity { 38afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private TextView mStatus; 399281c929d6e4abf0ddf77d614b2eb57f7528397aDianne Hackborn private TextView mPower; 40afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private TextView mLevel; 41afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private TextView mScale; 42afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private TextView mHealth; 43afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private TextView mVoltage; 44afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private TextView mTemperature; 45afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private TextView mTechnology; 46afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private TextView mUptime; 47afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private IBatteryStats mBatteryStats; 48afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private IPowerManager mScreenStats; 49afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 50afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int EVENT_TICK = 1; 51afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 52afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private Handler mHandler = new Handler() { 53afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 54afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void handleMessage(Message msg) { 55afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project switch (msg.what) { 56afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project case EVENT_TICK: 57afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project updateBatteryStats(); 58afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project sendEmptyMessageDelayed(EVENT_TICK, 1000); 595990cc129c1dfa52bf51bca49f214e3ea9078128Evan Millar 60afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 61afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 62afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 63afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project }; 64afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 65afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /** 66afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Format a number of tenths-units as a decimal string without using a 67475b99cba2487873465613c238dd2a31d226f76fikbae.kim * conversion to float. E.g. 347 -> "34.7", -99 -> "-9.9" 68afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 69afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private final String tenthsToFixedString(int x) { 70afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project int tens = x / 10; 71475b99cba2487873465613c238dd2a31d226f76fikbae.kim // use Math.abs to avoid "-9.-9" about -99 72475b99cba2487873465613c238dd2a31d226f76fikbae.kim return Integer.toString(tens) + "." + Math.abs(x - 10 * tens); 73afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 74afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 75afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /** 76afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *Listens for intent broadcasts 77afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 78afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private IntentFilter mIntentFilter; 79afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 80afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() { 81afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 82afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onReceive(Context context, Intent intent) { 83afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project String action = intent.getAction(); 84afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (action.equals(Intent.ACTION_BATTERY_CHANGED)) { 85afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project int plugType = intent.getIntExtra("plugged", 0); 86afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 87afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mLevel.setText("" + intent.getIntExtra("level", 0)); 88afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mScale.setText("" + intent.getIntExtra("scale", 0)); 89afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mVoltage.setText("" + intent.getIntExtra("voltage", 0) + " " 90afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project + getString(R.string.battery_info_voltage_units)); 91afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mTemperature.setText("" + tenthsToFixedString(intent.getIntExtra("temperature", 0)) 92afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project + getString(R.string.battery_info_temperature_units)); 93afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mTechnology.setText("" + intent.getStringExtra("technology")); 94afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 95a4379d6b38e568fcb60831d6f2fa349ba20f9b82Amith Yamasani mStatus.setText(Utils.getBatteryStatus(getResources(), intent)); 96afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 979281c929d6e4abf0ddf77d614b2eb57f7528397aDianne Hackborn switch (plugType) { 989281c929d6e4abf0ddf77d614b2eb57f7528397aDianne Hackborn case 0: 999281c929d6e4abf0ddf77d614b2eb57f7528397aDianne Hackborn mPower.setText(getString(R.string.battery_info_power_unplugged)); 1009281c929d6e4abf0ddf77d614b2eb57f7528397aDianne Hackborn break; 1019281c929d6e4abf0ddf77d614b2eb57f7528397aDianne Hackborn case BatteryManager.BATTERY_PLUGGED_AC: 1029281c929d6e4abf0ddf77d614b2eb57f7528397aDianne Hackborn mPower.setText(getString(R.string.battery_info_power_ac)); 1039281c929d6e4abf0ddf77d614b2eb57f7528397aDianne Hackborn break; 1049281c929d6e4abf0ddf77d614b2eb57f7528397aDianne Hackborn case BatteryManager.BATTERY_PLUGGED_USB: 1059281c929d6e4abf0ddf77d614b2eb57f7528397aDianne Hackborn mPower.setText(getString(R.string.battery_info_power_usb)); 1069281c929d6e4abf0ddf77d614b2eb57f7528397aDianne Hackborn break; 1070bd54a65d62d726dbdccab21bea96bf5eac83c0aBrian Muramatsu case BatteryManager.BATTERY_PLUGGED_WIRELESS: 1080bd54a65d62d726dbdccab21bea96bf5eac83c0aBrian Muramatsu mPower.setText(getString(R.string.battery_info_power_wireless)); 1090bd54a65d62d726dbdccab21bea96bf5eac83c0aBrian Muramatsu break; 1109281c929d6e4abf0ddf77d614b2eb57f7528397aDianne Hackborn case (BatteryManager.BATTERY_PLUGGED_AC|BatteryManager.BATTERY_PLUGGED_USB): 1119281c929d6e4abf0ddf77d614b2eb57f7528397aDianne Hackborn mPower.setText(getString(R.string.battery_info_power_ac_usb)); 1129281c929d6e4abf0ddf77d614b2eb57f7528397aDianne Hackborn break; 1139281c929d6e4abf0ddf77d614b2eb57f7528397aDianne Hackborn default: 1149281c929d6e4abf0ddf77d614b2eb57f7528397aDianne Hackborn mPower.setText(getString(R.string.battery_info_power_unknown)); 1159281c929d6e4abf0ddf77d614b2eb57f7528397aDianne Hackborn break; 1169281c929d6e4abf0ddf77d614b2eb57f7528397aDianne Hackborn } 1179281c929d6e4abf0ddf77d614b2eb57f7528397aDianne Hackborn 118afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project int health = intent.getIntExtra("health", BatteryManager.BATTERY_HEALTH_UNKNOWN); 119afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project String healthString; 120afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (health == BatteryManager.BATTERY_HEALTH_GOOD) { 121afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project healthString = getString(R.string.battery_info_health_good); 122afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else if (health == BatteryManager.BATTERY_HEALTH_OVERHEAT) { 123afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project healthString = getString(R.string.battery_info_health_overheat); 124afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else if (health == BatteryManager.BATTERY_HEALTH_DEAD) { 125afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project healthString = getString(R.string.battery_info_health_dead); 126afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else if (health == BatteryManager.BATTERY_HEALTH_OVER_VOLTAGE) { 127afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project healthString = getString(R.string.battery_info_health_over_voltage); 128afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else if (health == BatteryManager.BATTERY_HEALTH_UNSPECIFIED_FAILURE) { 129afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project healthString = getString(R.string.battery_info_health_unspecified_failure); 130524146698f6b4652ac1057082d47184659477543Imre Sunyi } else if (health == BatteryManager.BATTERY_HEALTH_COLD) { 131524146698f6b4652ac1057082d47184659477543Imre Sunyi healthString = getString(R.string.battery_info_health_cold); 132afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 133afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project healthString = getString(R.string.battery_info_health_unknown); 134afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 135afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mHealth.setText(healthString); 136afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 137afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 138afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project }; 139afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 140afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 141afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onCreate(Bundle icicle) { 142afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onCreate(icicle); 143afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 144afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project setContentView(R.layout.battery_info); 145afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 146afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // create the IntentFilter that will be used to listen 147afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // to battery status broadcasts 148afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mIntentFilter = new IntentFilter(); 149afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mIntentFilter.addAction(Intent.ACTION_BATTERY_CHANGED); 150afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 151afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 152afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 153afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onResume() { 154afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onResume(); 155afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 156afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mStatus = (TextView)findViewById(R.id.status); 1579281c929d6e4abf0ddf77d614b2eb57f7528397aDianne Hackborn mPower = (TextView)findViewById(R.id.power); 158afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mLevel = (TextView)findViewById(R.id.level); 159afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mScale = (TextView)findViewById(R.id.scale); 160afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mHealth = (TextView)findViewById(R.id.health); 161afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mTechnology = (TextView)findViewById(R.id.technology); 162afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mVoltage = (TextView)findViewById(R.id.voltage); 163afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mTemperature = (TextView)findViewById(R.id.temperature); 164afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mUptime = (TextView) findViewById(R.id.uptime); 165afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 166afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Get awake time plugged in and on battery 167b05bc1454a675cb3ffc1cac019e92bc3146daa55Dianne Hackborn mBatteryStats = IBatteryStats.Stub.asInterface(ServiceManager.getService( 168b05bc1454a675cb3ffc1cac019e92bc3146daa55Dianne Hackborn BatteryStats.SERVICE_NAME)); 169afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mScreenStats = IPowerManager.Stub.asInterface(ServiceManager.getService(POWER_SERVICE)); 170afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mHandler.sendEmptyMessageDelayed(EVENT_TICK, 1000); 171afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 172afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project registerReceiver(mIntentReceiver, mIntentFilter); 173afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 174afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 175afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 176afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onPause() { 177afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onPause(); 178afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mHandler.removeMessages(EVENT_TICK); 179afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 180afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // we are no longer on the screen stop the observers 181afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project unregisterReceiver(mIntentReceiver); 182afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 183afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 184afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void updateBatteryStats() { 185afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project long uptime = SystemClock.elapsedRealtime(); 186afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mUptime.setText(DateUtils.formatElapsedTime(uptime / 1000)); 187afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 188afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 189afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project} 190