/*
* Copyright (C) 2015 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <nativepower/wake_lock.h>
#include <base/logging.h>
#include <binderwrapper/binder_wrapper.h>
#include <nativepower/power_manager_client.h>
#include <powermanager/IPowerManager.h>
#include <powermanager/PowerManager.h>
namespace android {
WakeLock::WakeLock(const std::string& tag,
const std::string& package,
PowerManagerClient* client)
: acquired_lock_(false),
tag_(tag),
package_(package),
client_(client) {
DCHECK(client_);
}
WakeLock::~WakeLock() {
sp<IPowerManager> power_manager = client_->power_manager();
if (acquired_lock_ && power_manager.get()) {
status_t status =
power_manager->releaseWakeLock(lock_binder_, 0 /* flags */);
if (status != OK) {
LOG(ERROR) << "Wake lock release request for \"" << tag_ << "\" failed "
<< "with status " << status;
}
}
}
bool WakeLock::Init() {
sp<IPowerManager> power_manager = client_->power_manager();
if (!power_manager.get()) {
LOG(ERROR) << "Can't acquire wake lock for \"" << tag_ << "\"; no "
<< "connection to power manager";
return false;
}
lock_binder_ = BinderWrapper::Get()->CreateLocalBinder();
status_t status = power_manager->acquireWakeLock(
POWERMANAGER_PARTIAL_WAKE_LOCK,
lock_binder_, String16(tag_.c_str()), String16(package_.c_str()));
if (status != OK) {
LOG(ERROR) << "Wake lock acquire request for \"" << tag_ << "\" failed "
<< "with status " << status;
return false;
}
acquired_lock_ = true;
return true;
}
} // namespace android