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