1cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat/* 2cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat * Copyright (C) 2015 The Android Open Source Project 3cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat * 4cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat * Licensed under the Apache License, Version 2.0 (the "License"); 5cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat * you may not use this file except in compliance with the License. 6cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat * You may obtain a copy of the License at 7cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat * 8cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat * http://www.apache.org/licenses/LICENSE-2.0 9cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat * 10cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat * Unless required by applicable law or agreed to in writing, software 11cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat * distributed under the License is distributed on an "AS IS" BASIS, 12cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat * See the License for the specific language governing permissions and 14cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat * limitations under the License. 15cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat */ 16cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat 17cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat#include <unistd.h> 18cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat 19cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat#include <memory> 20cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat 21cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat#include <base/at_exit.h> 22cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat#include <base/logging.h> 23cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat#include <base/message_loop/message_loop.h> 24e4d4a81d6b56d66970f0332c6db2b898f60510c8Daniel Erat#include <base/sys_info.h> 25e4d4a81d6b56d66970f0332c6db2b898f60510c8Daniel Erat#include <base/time/time.h> 26cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat#include <binderwrapper/binder_wrapper.h> 2778132a0e300173bf3b738c9caf30f3941ff31cd2Alex Vakulenko#include <brillo/flag_helper.h> 28c2a4b05a931fbf3ecbf1915049b549b33dae8ba5Daniel Erat#include <nativepower/power_manager_client.h> 29cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat#include <nativepower/wake_lock.h> 30cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat 31c2a4b05a931fbf3ecbf1915049b549b33dae8ba5Daniel Eratnamespace { 32c2a4b05a931fbf3ecbf1915049b549b33dae8ba5Daniel Erat 33c2a4b05a931fbf3ecbf1915049b549b33dae8ba5Daniel Erat// Seconds to sleep after acquiring a wake lock. 34c2a4b05a931fbf3ecbf1915049b549b33dae8ba5Daniel Eratconst int kWakeLockSleepSec = 5; 35c2a4b05a931fbf3ecbf1915049b549b33dae8ba5Daniel Erat 36c2a4b05a931fbf3ecbf1915049b549b33dae8ba5Daniel Erat} // namespace 37cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat 38cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Eratint main(int argc, char *argv[]) { 39c2a4b05a931fbf3ecbf1915049b549b33dae8ba5Daniel Erat DEFINE_string(action, "", 40e4d4a81d6b56d66970f0332c6db2b898f60510c8Daniel Erat "Action to perform (\"reboot\", \"shut_down\", \"suspend\", " 41e4d4a81d6b56d66970f0332c6db2b898f60510c8Daniel Erat "\"wake_lock\")"); 42cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat 4378132a0e300173bf3b738c9caf30f3941ff31cd2Alex Vakulenko brillo::FlagHelper::Init(argc, argv, "Example power-management client."); 44cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat logging::InitLogging(logging::LoggingSettings()); 45cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat base::AtExitManager at_exit; 46cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat base::MessageLoopForIO loop; 47c2a4b05a931fbf3ecbf1915049b549b33dae8ba5Daniel Erat android::BinderWrapper::Create(); 48cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat 49c2a4b05a931fbf3ecbf1915049b549b33dae8ba5Daniel Erat android::PowerManagerClient client; 50c2a4b05a931fbf3ecbf1915049b549b33dae8ba5Daniel Erat CHECK(client.Init()); 51cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat 52c2a4b05a931fbf3ecbf1915049b549b33dae8ba5Daniel Erat if (FLAGS_action == "reboot") { 53c2a4b05a931fbf3ecbf1915049b549b33dae8ba5Daniel Erat LOG(INFO) << "Requesting reboot"; 54c2a4b05a931fbf3ecbf1915049b549b33dae8ba5Daniel Erat CHECK(client.Reboot(android::RebootReason::DEFAULT)); 55c2a4b05a931fbf3ecbf1915049b549b33dae8ba5Daniel Erat } else if (FLAGS_action == "shut_down") { 56c2a4b05a931fbf3ecbf1915049b549b33dae8ba5Daniel Erat LOG(INFO) << "Requesting shutdown"; 57c2a4b05a931fbf3ecbf1915049b549b33dae8ba5Daniel Erat CHECK(client.ShutDown(android::ShutdownReason::DEFAULT)); 58e4d4a81d6b56d66970f0332c6db2b898f60510c8Daniel Erat } else if (FLAGS_action == "suspend") { 59e4d4a81d6b56d66970f0332c6db2b898f60510c8Daniel Erat LOG(INFO) << "Requesting suspend"; 606df89a05e0ff87b7d51be58b6e39407034f9e6f5Alex Vakulenko CHECK(client.Suspend(base::SysInfo::Uptime(), 616df89a05e0ff87b7d51be58b6e39407034f9e6f5Alex Vakulenko android::SuspendReason::APPLICATION, 0 /* flags */)); 62c2a4b05a931fbf3ecbf1915049b549b33dae8ba5Daniel Erat } else if (FLAGS_action == "wake_lock") { 63c2a4b05a931fbf3ecbf1915049b549b33dae8ba5Daniel Erat LOG(INFO) << "Creating wake lock"; 64c2a4b05a931fbf3ecbf1915049b549b33dae8ba5Daniel Erat std::unique_ptr<android::WakeLock> lock( 65c2a4b05a931fbf3ecbf1915049b549b33dae8ba5Daniel Erat client.CreateWakeLock("power_example", "power")); 66c2a4b05a931fbf3ecbf1915049b549b33dae8ba5Daniel Erat CHECK(lock) << "Lock not created"; 67c2a4b05a931fbf3ecbf1915049b549b33dae8ba5Daniel Erat LOG(INFO) << "Sleeping for " << kWakeLockSleepSec << " seconds"; 68c2a4b05a931fbf3ecbf1915049b549b33dae8ba5Daniel Erat sleep(kWakeLockSleepSec); 69c2a4b05a931fbf3ecbf1915049b549b33dae8ba5Daniel Erat } else { 70c2a4b05a931fbf3ecbf1915049b549b33dae8ba5Daniel Erat LOG(FATAL) << "Unknown action \"" << FLAGS_action << "\""; 71c2a4b05a931fbf3ecbf1915049b549b33dae8ba5Daniel Erat } 72cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat 73cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat LOG(INFO) << "Exiting"; 74cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat return 0; 75cb57344ce792f41e58bc476840a82eba14b0fde9Daniel Erat} 76