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; 4256f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato SpinThread mThread; 4356f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato 4456f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato @Override 4556f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato public void onCreate(Bundle savedInstanceState) { 4656f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato super.onCreate(savedInstanceState); 4756f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato 4856f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato // Set the layout for this activity. You can find it 4956f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato // in res/layout/hello_activity.xml 5056f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato setContentView(R.layout.battery_waster); 5156f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato 5256f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato findViewById(R.id.checkbox).setOnClickListener(mClickListener); 5356f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato mLog = (TextView)findViewById(R.id.log); 5456f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato 5556f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato mDateFormat = DateFormat.getInstance(); 5656f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato 5756f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato mFilter = new IntentFilter(); 5856f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato mFilter.addAction(Intent.ACTION_BATTERY_CHANGED); 5956f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato mFilter.addAction(Intent.ACTION_BATTERY_LOW); 6056f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato mFilter.addAction(Intent.ACTION_BATTERY_OKAY); 6156f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato mFilter.addAction(Intent.ACTION_POWER_CONNECTED); 6256f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato 6356f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato PowerManager pm = (PowerManager)getSystemService(POWER_SERVICE); 6456f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato mWakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "BatteryWaster"); 6556f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato mWakeLock.setReferenceCounted(false); 6656f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } 6756f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato 6856f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato @Override 6956f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato public void onPause() { 7056f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato stopRunning(); 7156f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } 7256f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato 7356f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato View.OnClickListener mClickListener = new View.OnClickListener() { 7456f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato public void onClick(View v) { 7556f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato CheckBox checkbox = (CheckBox)v; 7656f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato if (checkbox.isChecked()) { 7756f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato startRunning(); 7856f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } else { 7956f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato stopRunning(); 8056f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } 8156f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } 8256f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato }; 8356f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato 8456f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato void startRunning() { 8556f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato log("Start"); 8656f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato registerReceiver(mReceiver, mFilter); 8756f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato mWakeLock.acquire(); 8856f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato if (mThread == null) { 8956f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato mThread = new SpinThread(); 9056f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato mThread.start(); 9156f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } 9256f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } 9356f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato 9456f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato void stopRunning() { 9556f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato log("Stop"); 9656f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato unregisterReceiver(mReceiver); 9756f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato mWakeLock.release(); 9856f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato if (mThread != null) { 9956f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato mThread.quit(); 10056f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato mThread = null; 10156f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } 10256f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } 10356f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato 10456f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato void log(String s) { 10556f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato mLog.setText(mLog.getText() + "\n" + mDateFormat.format(new Date()) + ": " + s); 10656f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } 10756f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato 10856f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato BroadcastReceiver mReceiver = new BroadcastReceiver() { 10956f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato public void onReceive(Context context, Intent intent) { 11056f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato String action = intent.getAction(); 11156f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato String title = action; 11256f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato int index = title.lastIndexOf('.'); 11356f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato if (index >= 0) { 11456f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato title = title.substring(index + 1); 11556f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } 11656f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato if (Intent.ACTION_BATTERY_CHANGED.equals(action)) { 11756f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); 11856f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato log(title + ": level=" + level); 11956f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } else { 12056f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato log(title); 12156f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } 12256f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } 12356f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato }; 12456f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato 12556f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato class SpinThread extends Thread { 12656f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato private boolean mStop; 12756f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato 12856f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato public void quit() { 12956f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato synchronized (this) { 13056f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato mStop = true; 13156f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } 13256f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } 13356f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato 13456f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato public void run() { 13556f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato while (true) { 13656f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato synchronized (this) { 13756f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato if (mStop) { 13856f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato return; 13956f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } 14056f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } 14156f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } 14256f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } 14356f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato } 14456f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato} 14556f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato 14656f880a010fa65cba4aa612e5fbf59918712da68Joe Onorato 147