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