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; 28287952c35e148811c106bc0f5036eabf20f71562Dianne Hackbornimport android.view.WindowManager; 2956f880a010fa65cba4aa612e5fbf59918712da68Joe Onoratoimport android.widget.CheckBox; 3056f880a010fa65cba4aa612e5fbf59918712da68Joe Onoratoimport android.widget.TextView; 3156f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato 3256f880a010fa65cba4aa612e5fbf59918712da68Joe Onoratoimport java.text.DateFormat; 3356f880a010fa65cba4aa612e5fbf59918712da68Joe Onoratoimport java.util.Date; 3456f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato 3556f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato/** 3656f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato * So you thought sync used up your battery life. 3756f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato */ 3856f880a010fa65cba4aa612e5fbf59918712da68Joe Onoratopublic class BatteryWaster extends Activity { 3956f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato TextView mLog; 4056f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato DateFormat mDateFormat; 4156f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato IntentFilter mFilter; 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); 681ebccf531d1049853b3b0630035434619682c016Dianne Hackborn mPartialWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "BatteryWaster"); 691ebccf531d1049853b3b0630035434619682c016Dianne Hackborn mPartialWakeLock.setReferenceCounted(false); 7056f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } 7156f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato 7256f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato @Override 73287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn public void onResume() { 74287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn super.onResume(); 75287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (((CheckBox)findViewById(R.id.checkbox)).isChecked()) { 76287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn startRunning(); 77287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 78287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (((CheckBox)findViewById(R.id.checkbox_wake)).isChecked()) { 79287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mWaking = true; 80287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn updateWakeLock(); 81287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 8256f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } 8356f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato 849adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn @Override 859adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn public void onDestroy() { 869adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn super.onDestroy(); 87287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn stopRunning(); 881ebccf531d1049853b3b0630035434619682c016Dianne Hackborn if (mPartialWakeLock.isHeld()) { 891ebccf531d1049853b3b0630035434619682c016Dianne Hackborn mPartialWakeLock.release(); 901ebccf531d1049853b3b0630035434619682c016Dianne Hackborn } 919adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 929adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 9356f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato View.OnClickListener mClickListener = new View.OnClickListener() { 9456f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato public void onClick(View v) { 9556f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato CheckBox checkbox = (CheckBox)v; 9656f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato if (checkbox.isChecked()) { 9756f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato startRunning(); 9856f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } else { 9956f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato stopRunning(); 10056f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } 10156f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } 10256f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato }; 10356f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato 1049adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn View.OnClickListener mWakeClickListener = new View.OnClickListener() { 1059adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn public void onClick(View v) { 1069adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn CheckBox checkbox = (CheckBox)v; 1079adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (checkbox.isChecked()) { 1089adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mWaking = true; 1099adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn updateWakeLock(); 1109adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } else { 1119adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mWaking = false; 1129adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn updateWakeLock(); 1139adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 1149adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 1159adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn }; 1169adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 11756f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato void startRunning() { 1189adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (!mWasting) { 1199adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn log("Start"); 1209adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn registerReceiver(mReceiver, mFilter); 1219adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mWasting = true; 1229adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn updateWakeLock(); 1239adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (mThread == null) { 1249adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mThread = new SpinThread(); 1259adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mThread.start(); 1269adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 12756f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } 12856f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } 12956f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato 13056f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato void stopRunning() { 1319adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (mWasting) { 1329adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn log("Stop"); 1339adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn unregisterReceiver(mReceiver); 1349adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mWasting = false; 1359adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn updateWakeLock(); 1369adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (mThread != null) { 1379adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mThread.quit(); 1389adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mThread = null; 1399adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 1409adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 1419adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } 1429adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn 1439adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn void updateWakeLock() { 1441ebccf531d1049853b3b0630035434619682c016Dianne Hackborn if (mWasting) { 145287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 1469adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn } else { 147287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 14856f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } 1491ebccf531d1049853b3b0630035434619682c016Dianne Hackborn if (mWaking) { 1501ebccf531d1049853b3b0630035434619682c016Dianne Hackborn if (!mPartialWakeLock.isHeld()) { 1511ebccf531d1049853b3b0630035434619682c016Dianne Hackborn mPartialWakeLock.acquire(); 1521ebccf531d1049853b3b0630035434619682c016Dianne Hackborn } 1531ebccf531d1049853b3b0630035434619682c016Dianne Hackborn } else { 1541ebccf531d1049853b3b0630035434619682c016Dianne Hackborn if (mPartialWakeLock.isHeld()) { 1551ebccf531d1049853b3b0630035434619682c016Dianne Hackborn mPartialWakeLock.release(); 1561ebccf531d1049853b3b0630035434619682c016Dianne Hackborn } 1571ebccf531d1049853b3b0630035434619682c016Dianne Hackborn } 15856f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } 15956f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato 16056f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato void log(String s) { 16156f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato mLog.setText(mLog.getText() + "\n" + mDateFormat.format(new Date()) + ": " + s); 16256f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } 16356f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato 16456f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato BroadcastReceiver mReceiver = new BroadcastReceiver() { 16556f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato public void onReceive(Context context, Intent intent) { 16656f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato String action = intent.getAction(); 16756f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato String title = action; 16856f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato int index = title.lastIndexOf('.'); 16956f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato if (index >= 0) { 17056f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato title = title.substring(index + 1); 17156f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } 17256f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato if (Intent.ACTION_BATTERY_CHANGED.equals(action)) { 17356f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); 17456f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato log(title + ": level=" + level); 17556f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } else { 17656f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato log(title); 17756f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } 17856f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } 17956f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato }; 18056f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato 18156f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato class SpinThread extends Thread { 18256f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato private boolean mStop; 18356f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato 18456f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato public void quit() { 18556f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato synchronized (this) { 18656f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato mStop = true; 18756f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } 18856f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } 18956f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato 19056f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato public void run() { 19156f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato while (true) { 19256f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato synchronized (this) { 19356f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato if (mStop) { 19456f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato return; 19556f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } 19656f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } 19756f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } 19856f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } 19956f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } 20056f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato} 20156f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato 20256f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato 203