19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.commands.svc;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19783f9e6615db5c90c184397cf1ee271e302c398bGuang Zhuimport android.content.Context;
20783f9e6615db5c90c184397cf1ee271e302c398bGuang Zhuimport android.os.BatteryManager;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IPowerManager;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException;
23783f9e6615db5c90c184397cf1ee271e302c398bGuang Zhuimport android.os.ServiceManager;
24783f9e6615db5c90c184397cf1ee271e302c398bGuang Zhuimport android.os.SystemClock;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class PowerCommand extends Svc.Command {
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public PowerCommand() {
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super("power");
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String shortHelp() {
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return "Control the power manager";
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String longHelp() {
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return shortHelp() + "\n"
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + "\n"
3837a37f445cbcd64376af153dd79ea2a123d9405dBrian Muramatsu                + "usage: svc power stayon [true|false|usb|ac|wireless]\n"
3962aad7f66fcd673831029eb96dd49c95f76b17bdGuang Zhu                + "         Set the 'keep awake while plugged in' setting.\n"
4062aad7f66fcd673831029eb96dd49c95f76b17bdGuang Zhu                + "       svc power reboot [reason]\n"
4162aad7f66fcd673831029eb96dd49c95f76b17bdGuang Zhu                + "         Perform a runtime shutdown and reboot device with specified reason.\n"
4262aad7f66fcd673831029eb96dd49c95f76b17bdGuang Zhu                + "       svc power shutdown\n"
4362aad7f66fcd673831029eb96dd49c95f76b17bdGuang Zhu                + "         Perform a runtime shutdown and power off the device.\n";
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void run(String[] args) {
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        fail: {
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (args.length >= 2) {
4962aad7f66fcd673831029eb96dd49c95f76b17bdGuang Zhu                IPowerManager pm = IPowerManager.Stub.asInterface(
5062aad7f66fcd673831029eb96dd49c95f76b17bdGuang Zhu                        ServiceManager.getService(Context.POWER_SERVICE));
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ("stayon".equals(args[1]) && args.length == 3) {
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int val;
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if ("true".equals(args[2])) {
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = BatteryManager.BATTERY_PLUGGED_AC |
5537a37f445cbcd64376af153dd79ea2a123d9405dBrian Muramatsu                                BatteryManager.BATTERY_PLUGGED_USB |
5637a37f445cbcd64376af153dd79ea2a123d9405dBrian Muramatsu                                BatteryManager.BATTERY_PLUGGED_WIRELESS;
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    else if ("false".equals(args[2])) {
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = 0;
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else if ("usb".equals(args[2])) {
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = BatteryManager.BATTERY_PLUGGED_USB;
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else if ("ac".equals(args[2])) {
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = BatteryManager.BATTERY_PLUGGED_AC;
6437a37f445cbcd64376af153dd79ea2a123d9405dBrian Muramatsu                    } else if ("wireless".equals(args[2])) {
6537a37f445cbcd64376af153dd79ea2a123d9405dBrian Muramatsu                        val = BatteryManager.BATTERY_PLUGGED_WIRELESS;
6637a37f445cbcd64376af153dd79ea2a123d9405dBrian Muramatsu                    } else {
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break fail;
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
70783f9e6615db5c90c184397cf1ee271e302c398bGuang Zhu                        if (val != 0) {
71783f9e6615db5c90c184397cf1ee271e302c398bGuang Zhu                            // if the request is not to set it to false, wake up the screen so that
72783f9e6615db5c90c184397cf1ee271e302c398bGuang Zhu                            // it can stay on as requested
73280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn                            pm.wakeUp(SystemClock.uptimeMillis(), "PowerCommand", null);
74783f9e6615db5c90c184397cf1ee271e302c398bGuang Zhu                        }
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        pm.setStayOnSetting(val);
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    catch (RemoteException e) {
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        System.err.println("Faild to set setting: " + e);
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return;
8162aad7f66fcd673831029eb96dd49c95f76b17bdGuang Zhu                } else if ("reboot".equals(args[1])) {
8262aad7f66fcd673831029eb96dd49c95f76b17bdGuang Zhu                    String mode = null;
8362aad7f66fcd673831029eb96dd49c95f76b17bdGuang Zhu                    if (args.length == 3) {
8462aad7f66fcd673831029eb96dd49c95f76b17bdGuang Zhu                        mode = args[2];
8562aad7f66fcd673831029eb96dd49c95f76b17bdGuang Zhu                    }
8662aad7f66fcd673831029eb96dd49c95f76b17bdGuang Zhu                    try {
8762aad7f66fcd673831029eb96dd49c95f76b17bdGuang Zhu                        // no confirm, wait till device is rebooted
8862aad7f66fcd673831029eb96dd49c95f76b17bdGuang Zhu                        pm.reboot(false, mode, true);
8962aad7f66fcd673831029eb96dd49c95f76b17bdGuang Zhu                    } catch (RemoteException e) {
9062aad7f66fcd673831029eb96dd49c95f76b17bdGuang Zhu                        System.err.println("Failed to reboot.");
9162aad7f66fcd673831029eb96dd49c95f76b17bdGuang Zhu                    }
9262aad7f66fcd673831029eb96dd49c95f76b17bdGuang Zhu                    return;
9362aad7f66fcd673831029eb96dd49c95f76b17bdGuang Zhu                } else if ("shutdown".equals(args[1])) {
9462aad7f66fcd673831029eb96dd49c95f76b17bdGuang Zhu                    try {
9562aad7f66fcd673831029eb96dd49c95f76b17bdGuang Zhu                        // no confirm, wait till device is off
9662aad7f66fcd673831029eb96dd49c95f76b17bdGuang Zhu                        pm.shutdown(false, true);
9762aad7f66fcd673831029eb96dd49c95f76b17bdGuang Zhu                    } catch (RemoteException e) {
9862aad7f66fcd673831029eb96dd49c95f76b17bdGuang Zhu                        System.err.println("Failed to shutdown.");
9962aad7f66fcd673831029eb96dd49c95f76b17bdGuang Zhu                    }
10062aad7f66fcd673831029eb96dd49c95f76b17bdGuang Zhu                    return;
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        System.err.println(longHelp());
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
107