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