/* * Copyright (C) 2006 The Android Open Source Project * * 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 com.android.settings; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.BatteryManager; import android.os.Bundle; import android.os.Handler; import android.os.IPowerManager; import android.os.Message; import android.os.ServiceManager; import android.os.SystemClock; import android.text.format.DateUtils; import android.widget.TextView; import com.android.internal.app.IBatteryStats; public class BatteryInfo extends Activity { private TextView mStatus; private TextView mPower; private TextView mLevel; private TextView mScale; private TextView mHealth; private TextView mVoltage; private TextView mTemperature; private TextView mTechnology; private TextView mUptime; private IBatteryStats mBatteryStats; private IPowerManager mScreenStats; private static final int EVENT_TICK = 1; private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case EVENT_TICK: updateBatteryStats(); sendEmptyMessageDelayed(EVENT_TICK, 1000); break; } } }; /** * Format a number of tenths-units as a decimal string without using a * conversion to float. E.g. 347 -> "34.7", -99 -> "-9.9" */ private final String tenthsToFixedString(int x) { int tens = x / 10; // use Math.abs to avoid "-9.-9" about -99 return Integer.toString(tens) + "." + Math.abs(x - 10 * tens); } /** *Listens for intent broadcasts */ private IntentFilter mIntentFilter; private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (action.equals(Intent.ACTION_BATTERY_CHANGED)) { int plugType = intent.getIntExtra("plugged", 0); mLevel.setText("" + intent.getIntExtra("level", 0)); mScale.setText("" + intent.getIntExtra("scale", 0)); mVoltage.setText("" + intent.getIntExtra("voltage", 0) + " " + getString(R.string.battery_info_voltage_units)); mTemperature.setText("" + tenthsToFixedString(intent.getIntExtra("temperature", 0)) + getString(R.string.battery_info_temperature_units)); mTechnology.setText("" + intent.getStringExtra("technology")); mStatus.setText(Utils.getBatteryStatus(getResources(), intent)); switch (plugType) { case 0: mPower.setText(getString(R.string.battery_info_power_unplugged)); break; case BatteryManager.BATTERY_PLUGGED_AC: mPower.setText(getString(R.string.battery_info_power_ac)); break; case BatteryManager.BATTERY_PLUGGED_USB: mPower.setText(getString(R.string.battery_info_power_usb)); break; case BatteryManager.BATTERY_PLUGGED_WIRELESS: mPower.setText(getString(R.string.battery_info_power_wireless)); break; case (BatteryManager.BATTERY_PLUGGED_AC|BatteryManager.BATTERY_PLUGGED_USB): mPower.setText(getString(R.string.battery_info_power_ac_usb)); break; default: mPower.setText(getString(R.string.battery_info_power_unknown)); break; } int health = intent.getIntExtra("health", BatteryManager.BATTERY_HEALTH_UNKNOWN); String healthString; if (health == BatteryManager.BATTERY_HEALTH_GOOD) { healthString = getString(R.string.battery_info_health_good); } else if (health == BatteryManager.BATTERY_HEALTH_OVERHEAT) { healthString = getString(R.string.battery_info_health_overheat); } else if (health == BatteryManager.BATTERY_HEALTH_DEAD) { healthString = getString(R.string.battery_info_health_dead); } else if (health == BatteryManager.BATTERY_HEALTH_OVER_VOLTAGE) { healthString = getString(R.string.battery_info_health_over_voltage); } else if (health == BatteryManager.BATTERY_HEALTH_UNSPECIFIED_FAILURE) { healthString = getString(R.string.battery_info_health_unspecified_failure); } else if (health == BatteryManager.BATTERY_HEALTH_COLD) { healthString = getString(R.string.battery_info_health_cold); } else { healthString = getString(R.string.battery_info_health_unknown); } mHealth.setText(healthString); } } }; @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.battery_info); // create the IntentFilter that will be used to listen // to battery status broadcasts mIntentFilter = new IntentFilter(); mIntentFilter.addAction(Intent.ACTION_BATTERY_CHANGED); } @Override public void onResume() { super.onResume(); mStatus = (TextView)findViewById(R.id.status); mPower = (TextView)findViewById(R.id.power); mLevel = (TextView)findViewById(R.id.level); mScale = (TextView)findViewById(R.id.scale); mHealth = (TextView)findViewById(R.id.health); mTechnology = (TextView)findViewById(R.id.technology); mVoltage = (TextView)findViewById(R.id.voltage); mTemperature = (TextView)findViewById(R.id.temperature); mUptime = (TextView) findViewById(R.id.uptime); // Get awake time plugged in and on battery mBatteryStats = IBatteryStats.Stub.asInterface(ServiceManager.getService("batteryinfo")); mScreenStats = IPowerManager.Stub.asInterface(ServiceManager.getService(POWER_SERVICE)); mHandler.sendEmptyMessageDelayed(EVENT_TICK, 1000); registerReceiver(mIntentReceiver, mIntentFilter); } @Override public void onPause() { super.onPause(); mHandler.removeMessages(EVENT_TICK); // we are no longer on the screen stop the observers unregisterReceiver(mIntentReceiver); } private void updateBatteryStats() { long uptime = SystemClock.elapsedRealtime(); mUptime.setText(DateUtils.formatElapsedTime(uptime / 1000)); } }