1752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor/* 2752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor * Copyright (C) 2013 The Android Open Source Project 3752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor * 4752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor * Licensed under the Apache License, Version 2.0 (the "License"); 5752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor * you may not use this file except in compliance with the License. 6752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor * You may obtain a copy of the License at 7752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor * 8752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor * http://www.apache.org/licenses/LICENSE-2.0 9752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor * 10752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor * Unless required by applicable law or agreed to in writing, software 11752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor * distributed under the License is distributed on an "AS IS" BASIS, 12752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor * See the License for the specific language governing permissions and 14752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor * limitations under the License. 15752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor */ 16752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor 17752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor#include "BatteryPropertiesRegistrar.h" 18752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor#include <batteryservice/BatteryService.h> 19752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor#include <batteryservice/IBatteryPropertiesListener.h> 20752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor#include <batteryservice/IBatteryPropertiesRegistrar.h> 21020369d8724eff2b87350e54e157a609846166e4Todd Poynor#include <binder/IPCThreadState.h> 22752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor#include <binder/IServiceManager.h> 23020369d8724eff2b87350e54e157a609846166e4Todd Poynor#include <binder/PermissionCache.h> 24020369d8724eff2b87350e54e157a609846166e4Todd Poynor#include <private/android_filesystem_config.h> 25752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor#include <utils/Errors.h> 26752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor#include <utils/Mutex.h> 27752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor#include <utils/String16.h> 28752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor 297b27f27d3de9e39d0de86c6e592d49bd4cc89158Todd Poynor#include "healthd.h" 30752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor 317b27f27d3de9e39d0de86c6e592d49bd4cc89158Todd Poynornamespace android { 32752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor 33752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynorvoid BatteryPropertiesRegistrar::publish() { 34f0e2ac26424da01f1a48eed1c343dfdafd338553Todd Poynor defaultServiceManager()->addService(String16("batteryproperties"), this); 35752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor} 36752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor 37752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynorvoid BatteryPropertiesRegistrar::notifyListeners(struct BatteryProperties props) { 38752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor Mutex::Autolock _l(mRegistrationLock); 39752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor for (size_t i = 0; i < mListeners.size(); i++) { 40752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor mListeners[i]->batteryPropertiesChanged(props); 41752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor } 42752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor} 43752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor 44752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynorvoid BatteryPropertiesRegistrar::registerListener(const sp<IBatteryPropertiesListener>& listener) { 45752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor { 463e6d3319b2b131ebdeb831f248dbb8dc72e68c83Natalie Silvanovich if (listener == NULL) 473e6d3319b2b131ebdeb831f248dbb8dc72e68c83Natalie Silvanovich return; 48752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor Mutex::Autolock _l(mRegistrationLock); 49752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor // check whether this is a duplicate 50752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor for (size_t i = 0; i < mListeners.size(); i++) { 51752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor if (mListeners[i]->asBinder() == listener->asBinder()) { 52752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor return; 53752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor } 54752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor } 55752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor 56752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor mListeners.add(listener); 57752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor listener->asBinder()->linkToDeath(this); 58752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor } 597b27f27d3de9e39d0de86c6e592d49bd4cc89158Todd Poynor healthd_battery_update(); 60752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor} 61752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor 62752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynorvoid BatteryPropertiesRegistrar::unregisterListener(const sp<IBatteryPropertiesListener>& listener) { 633e6d3319b2b131ebdeb831f248dbb8dc72e68c83Natalie Silvanovich if (listener == NULL) 643e6d3319b2b131ebdeb831f248dbb8dc72e68c83Natalie Silvanovich return; 65752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor Mutex::Autolock _l(mRegistrationLock); 66752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor for (size_t i = 0; i < mListeners.size(); i++) { 67752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor if (mListeners[i]->asBinder() == listener->asBinder()) { 68752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor mListeners[i]->asBinder()->unlinkToDeath(this); 69752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor mListeners.removeAt(i); 70752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor break; 71752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor } 72752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor } 73752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor} 74752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor 75c133b7198a02c8738aeef86d6cfd921a626adce7Todd Poynorstatus_t BatteryPropertiesRegistrar::getProperty(int id, struct BatteryProperty *val) { 767b27f27d3de9e39d0de86c6e592d49bd4cc89158Todd Poynor return healthd_get_property(id, val); 77c133b7198a02c8738aeef86d6cfd921a626adce7Todd Poynor} 78c133b7198a02c8738aeef86d6cfd921a626adce7Todd Poynor 796f5b47f9144960412b0fb6bc417f0c41bf53438aMark Salyzynstatus_t BatteryPropertiesRegistrar::dump(int fd, const Vector<String16>& /*args*/) { 80020369d8724eff2b87350e54e157a609846166e4Todd Poynor IPCThreadState* self = IPCThreadState::self(); 81020369d8724eff2b87350e54e157a609846166e4Todd Poynor const int pid = self->getCallingPid(); 82020369d8724eff2b87350e54e157a609846166e4Todd Poynor const int uid = self->getCallingUid(); 83020369d8724eff2b87350e54e157a609846166e4Todd Poynor if ((uid != AID_SHELL) && 84020369d8724eff2b87350e54e157a609846166e4Todd Poynor !PermissionCache::checkPermission( 85020369d8724eff2b87350e54e157a609846166e4Todd Poynor String16("android.permission.DUMP"), pid, uid)) 86020369d8724eff2b87350e54e157a609846166e4Todd Poynor return PERMISSION_DENIED; 87020369d8724eff2b87350e54e157a609846166e4Todd Poynor 88020369d8724eff2b87350e54e157a609846166e4Todd Poynor healthd_dump_battery_state(fd); 89020369d8724eff2b87350e54e157a609846166e4Todd Poynor return OK; 90020369d8724eff2b87350e54e157a609846166e4Todd Poynor} 91020369d8724eff2b87350e54e157a609846166e4Todd Poynor 92752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynorvoid BatteryPropertiesRegistrar::binderDied(const wp<IBinder>& who) { 93752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor Mutex::Autolock _l(mRegistrationLock); 94752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor 95752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor for (size_t i = 0; i < mListeners.size(); i++) { 96752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor if (mListeners[i]->asBinder() == who) { 97752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor mListeners.removeAt(i); 98752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor break; 99752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor } 100752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor } 101752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor} 102752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor 103752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor} // namespace android 104