BatteryWaster.java revision 1ebccf531d1049853b3b0630035434619682c016
156f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato/* 256f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato * Copyright (C) 2009 The Android Open Source Project 356f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato * 456f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato * Licensed under the Apache License, Version 2.0 (the "License"); 556f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato * you may not use this file except in compliance with the License. 656f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato * You may obtain a copy of the License at 756f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato * 856f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato * http://www.apache.org/licenses/LICENSE-2.0 956f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato * 1056f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato * Unless required by applicable law or agreed to in writing, software 1156f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato * distributed under the License is distributed on an "AS IS" BASIS, 1256f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1356f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato * See the License for the specific language governing permissions and 1456f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato * limitations under the License. 1556f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato */ 1656f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato 1756f880a010fa65cba4aa612e5fbf59918712da68Joe Onoratopackage com.android.batterywaster; 1856f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato 1956f880a010fa65cba4aa612e5fbf59918712da68Joe Onoratoimport android.app.Activity; 2056f880a010fa65cba4aa612e5fbf59918712da68Joe Onoratoimport android.content.BroadcastReceiver; 2156f880a010fa65cba4aa612e5fbf59918712da68Joe Onoratoimport android.content.Context; 2256f880a010fa65cba4aa612e5fbf59918712da68Joe Onoratoimport android.content.Intent; 2356f880a010fa65cba4aa612e5fbf59918712da68Joe Onoratoimport android.content.IntentFilter; 2456f880a010fa65cba4aa612e5fbf59918712da68Joe Onoratoimport android.os.BatteryManager; 2556f880a010fa65cba4aa612e5fbf59918712da68Joe Onoratoimport android.os.Bundle; 2656f880a010fa65cba4aa612e5fbf59918712da68Joe Onoratoimport android.os.PowerManager; 2756f880a010fa65cba4aa612e5fbf59918712da68Joe Onoratoimport android.view.View; 2856f880a010fa65cba4aa612e5fbf59918712da68Joe Onoratoimport android.widget.CheckBox; 2956f880a010fa65cba4aa612e5fbf59918712da68Joe Onoratoimport android.widget.TextView; 3056f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato 3156f880a010fa65cba4aa612e5fbf59918712da68Joe Onoratoimport java.text.DateFormat; 3256f880a010fa65cba4aa612e5fbf59918712da68Joe Onoratoimport java.util.Date; 3356f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato 3456f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato/** 3556f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato * So you thought sync used up your battery life. 3656f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato */ 3756f880a010fa65cba4aa612e5fbf59918712da68Joe Onoratopublic class BatteryWaster extends Activity { 3856f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato TextView mLog; 3956f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato DateFormat mDateFormat; 4056f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato IntentFilter mFilter; 4156f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato PowerManager.WakeLock mWakeLock; 421ebccf531d1049853b3b0630035434619682c016Dianne Hackborn PowerManager.WakeLock mPartialWakeLock; 4356f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato SpinThread mThread; 4456f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato 459adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn boolean mWasting, mWaking; 469adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 4756f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato @Override 4856f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato public void onCreate(Bundle savedInstanceState) { 4956f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato super.onCreate(savedInstanceState); 5056f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato 5156f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato // Set the layout for this activity. You can find it 5256f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato // in res/layout/hello_activity.xml 5356f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato setContentView(R.layout.battery_waster); 5456f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato 5556f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato findViewById(R.id.checkbox).setOnClickListener(mClickListener); 569adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn findViewById(R.id.checkbox_wake).setOnClickListener(mWakeClickListener); 5756f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato mLog = (TextView)findViewById(R.id.log); 5856f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato 5956f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato mDateFormat = DateFormat.getInstance(); 6056f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato 6156f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato mFilter = new IntentFilter(); 6256f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato mFilter.addAction(Intent.ACTION_BATTERY_CHANGED); 6356f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato mFilter.addAction(Intent.ACTION_BATTERY_LOW); 6456f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato mFilter.addAction(Intent.ACTION_BATTERY_OKAY); 6556f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato mFilter.addAction(Intent.ACTION_POWER_CONNECTED); 6656f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato 6756f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato PowerManager pm = (PowerManager)getSystemService(POWER_SERVICE); 6856f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato mWakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "BatteryWaster"); 6956f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato mWakeLock.setReferenceCounted(false); 701ebccf531d1049853b3b0630035434619682c016Dianne Hackborn mPartialWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "BatteryWaster"); 711ebccf531d1049853b3b0630035434619682c016Dianne Hackborn mPartialWakeLock.setReferenceCounted(false); 7256f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } 7356f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato 7456f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato @Override 7556f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato public void onPause() { 769adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn super.onPause(); 7756f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato stopRunning(); 7856f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } 7956f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato 809adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn @Override 819adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn public void onDestroy() { 829adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn super.onDestroy(); 839adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (mWakeLock.isHeld()) { 849adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mWakeLock.release(); 859adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 861ebccf531d1049853b3b0630035434619682c016Dianne Hackborn if (mPartialWakeLock.isHeld()) { 871ebccf531d1049853b3b0630035434619682c016Dianne Hackborn mPartialWakeLock.release(); 881ebccf531d1049853b3b0630035434619682c016Dianne Hackborn } 899adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 909adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 9156f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato View.OnClickListener mClickListener = new View.OnClickListener() { 9256f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato public void onClick(View v) { 9356f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato CheckBox checkbox = (CheckBox)v; 9456f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato if (checkbox.isChecked()) { 9556f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato startRunning(); 9656f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } else { 9756f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato stopRunning(); 9856f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } 9956f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } 10056f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato }; 10156f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato 1029adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn View.OnClickListener mWakeClickListener = new View.OnClickListener() { 1039adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn public void onClick(View v) { 1049adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn CheckBox checkbox = (CheckBox)v; 1059adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (checkbox.isChecked()) { 1069adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mWaking = true; 1079adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn updateWakeLock(); 1089adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } else { 1099adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mWaking = false; 1109adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn updateWakeLock(); 1119adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 1129adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 1139adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn }; 1149adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 11556f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato void startRunning() { 1169adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (!mWasting) { 1179adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn log("Start"); 1189adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn registerReceiver(mReceiver, mFilter); 1199adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mWasting = true; 1209adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn updateWakeLock(); 1219adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (mThread == null) { 1229adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mThread = new SpinThread(); 1239adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mThread.start(); 1249adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 12556f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } 12656f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } 12756f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato 12856f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato void stopRunning() { 1299adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (mWasting) { 1309adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn log("Stop"); 1319adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn unregisterReceiver(mReceiver); 1329adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mWasting = false; 1339adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn updateWakeLock(); 1349adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (mThread != null) { 1359adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mThread.quit(); 1369adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mThread = null; 1379adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 1389adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 1399adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 1409adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 1419adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn void updateWakeLock() { 1421ebccf531d1049853b3b0630035434619682c016Dianne Hackborn if (mWasting) { 1439adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (!mWakeLock.isHeld()) { 1449adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mWakeLock.acquire(); 1459adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 1469adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } else { 1479adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (mWakeLock.isHeld()) { 1489adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mWakeLock.release(); 1499adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 15056f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } 1511ebccf531d1049853b3b0630035434619682c016Dianne Hackborn if (mWaking) { 1521ebccf531d1049853b3b0630035434619682c016Dianne Hackborn if (!mPartialWakeLock.isHeld()) { 1531ebccf531d1049853b3b0630035434619682c016Dianne Hackborn mPartialWakeLock.acquire(); 1541ebccf531d1049853b3b0630035434619682c016Dianne Hackborn } 1551ebccf531d1049853b3b0630035434619682c016Dianne Hackborn } else { 1561ebccf531d1049853b3b0630035434619682c016Dianne Hackborn if (mPartialWakeLock.isHeld()) { 1571ebccf531d1049853b3b0630035434619682c016Dianne Hackborn mPartialWakeLock.release(); 1581ebccf531d1049853b3b0630035434619682c016Dianne Hackborn } 1591ebccf531d1049853b3b0630035434619682c016Dianne Hackborn } 16056f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } 16156f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato 16256f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato void log(String s) { 16356f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato mLog.setText(mLog.getText() + "\n" + mDateFormat.format(new Date()) + ": " + s); 16456f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } 16556f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato 16656f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato BroadcastReceiver mReceiver = new BroadcastReceiver() { 16756f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato public void onReceive(Context context, Intent intent) { 16856f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato String action = intent.getAction(); 16956f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato String title = action; 17056f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato int index = title.lastIndexOf('.'); 17156f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato if (index >= 0) { 17256f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato title = title.substring(index + 1); 17356f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } 17456f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato if (Intent.ACTION_BATTERY_CHANGED.equals(action)) { 17556f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); 17656f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato log(title + ": level=" + level); 17756f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } else { 17856f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato log(title); 17956f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } 18056f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } 18156f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato }; 18256f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato 18356f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato class SpinThread extends Thread { 18456f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato private boolean mStop; 18556f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato 18656f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato public void quit() { 18756f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato synchronized (this) { 18856f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato mStop = true; 18956f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } 19056f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } 19156f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato 19256f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato public void run() { 19356f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato while (true) { 19456f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato synchronized (this) { 19556f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato if (mStop) { 19656f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato return; 19756f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } 19856f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } 19956f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } 20056f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } 20156f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } 20256f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato} 20356f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato 20456f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato 205