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 29f6dbc6d4b830c57c0155a607d0d8a2cb6b1e0040Yabin Cui#include <healthd/healthd.h> 30752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor 317b27f27d3de9e39d0de86c6e592d49bd4cc89158Todd Poynornamespace android { 32752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor 33e55356486fb16aa74f3b85242ec281ee7dec3facTodd Poynorvoid BatteryPropertiesRegistrar::publish( 34e55356486fb16aa74f3b85242ec281ee7dec3facTodd Poynor const sp<BatteryPropertiesRegistrar>& service) { 35e55356486fb16aa74f3b85242ec281ee7dec3facTodd Poynor defaultServiceManager()->addService(String16("batteryproperties"), service); 36752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor} 37752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor 38752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynorvoid BatteryPropertiesRegistrar::notifyListeners(struct BatteryProperties props) { 39752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor Mutex::Autolock _l(mRegistrationLock); 40752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor for (size_t i = 0; i < mListeners.size(); i++) { 41752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor mListeners[i]->batteryPropertiesChanged(props); 42752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor } 43752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor} 44752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor 45752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynorvoid BatteryPropertiesRegistrar::registerListener(const sp<IBatteryPropertiesListener>& listener) { 46752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor { 473e6d3319b2b131ebdeb831f248dbb8dc72e68c83Natalie Silvanovich if (listener == NULL) 483e6d3319b2b131ebdeb831f248dbb8dc72e68c83Natalie Silvanovich return; 49752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor Mutex::Autolock _l(mRegistrationLock); 50752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor // check whether this is a duplicate 51752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor for (size_t i = 0; i < mListeners.size(); i++) { 5226279a9ef164e658c8c583facc65abc51ed54e22Marco Nelissen if (IInterface::asBinder(mListeners[i]) == IInterface::asBinder(listener)) { 53752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor return; 54752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor } 55752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor } 56752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor 57752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor mListeners.add(listener); 5826279a9ef164e658c8c583facc65abc51ed54e22Marco Nelissen IInterface::asBinder(listener)->linkToDeath(this); 59752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor } 607b27f27d3de9e39d0de86c6e592d49bd4cc89158Todd Poynor healthd_battery_update(); 61752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor} 62752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor 63752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynorvoid BatteryPropertiesRegistrar::unregisterListener(const sp<IBatteryPropertiesListener>& listener) { 643e6d3319b2b131ebdeb831f248dbb8dc72e68c83Natalie Silvanovich if (listener == NULL) 653e6d3319b2b131ebdeb831f248dbb8dc72e68c83Natalie Silvanovich return; 66752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor Mutex::Autolock _l(mRegistrationLock); 67752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor for (size_t i = 0; i < mListeners.size(); i++) { 6826279a9ef164e658c8c583facc65abc51ed54e22Marco Nelissen if (IInterface::asBinder(mListeners[i]) == IInterface::asBinder(listener)) { 6926279a9ef164e658c8c583facc65abc51ed54e22Marco Nelissen IInterface::asBinder(mListeners[i])->unlinkToDeath(this); 70752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor mListeners.removeAt(i); 71752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor break; 72752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor } 73752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor } 74752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor} 75752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor 76c133b7198a02c8738aeef86d6cfd921a626adce7Todd Poynorstatus_t BatteryPropertiesRegistrar::getProperty(int id, struct BatteryProperty *val) { 777b27f27d3de9e39d0de86c6e592d49bd4cc89158Todd Poynor return healthd_get_property(id, val); 78c133b7198a02c8738aeef86d6cfd921a626adce7Todd Poynor} 79c133b7198a02c8738aeef86d6cfd921a626adce7Todd Poynor 806f5b47f9144960412b0fb6bc417f0c41bf53438aMark Salyzynstatus_t BatteryPropertiesRegistrar::dump(int fd, const Vector<String16>& /*args*/) { 81020369d8724eff2b87350e54e157a609846166e4Todd Poynor IPCThreadState* self = IPCThreadState::self(); 82020369d8724eff2b87350e54e157a609846166e4Todd Poynor const int pid = self->getCallingPid(); 83020369d8724eff2b87350e54e157a609846166e4Todd Poynor const int uid = self->getCallingUid(); 84020369d8724eff2b87350e54e157a609846166e4Todd Poynor if ((uid != AID_SHELL) && 85020369d8724eff2b87350e54e157a609846166e4Todd Poynor !PermissionCache::checkPermission( 86020369d8724eff2b87350e54e157a609846166e4Todd Poynor String16("android.permission.DUMP"), pid, uid)) 87020369d8724eff2b87350e54e157a609846166e4Todd Poynor return PERMISSION_DENIED; 88020369d8724eff2b87350e54e157a609846166e4Todd Poynor 89020369d8724eff2b87350e54e157a609846166e4Todd Poynor healthd_dump_battery_state(fd); 90020369d8724eff2b87350e54e157a609846166e4Todd Poynor return OK; 91020369d8724eff2b87350e54e157a609846166e4Todd Poynor} 92020369d8724eff2b87350e54e157a609846166e4Todd Poynor 93752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynorvoid BatteryPropertiesRegistrar::binderDied(const wp<IBinder>& who) { 94752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor Mutex::Autolock _l(mRegistrationLock); 95752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor 96752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor for (size_t i = 0; i < mListeners.size(); i++) { 9726279a9ef164e658c8c583facc65abc51ed54e22Marco Nelissen if (IInterface::asBinder(mListeners[i]) == who) { 98752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor mListeners.removeAt(i); 99752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor break; 100752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor } 101752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor } 102752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor} 103752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor 104752faf2c18407fd79127fb3f3773910b4ddf669dTodd Poynor} // namespace android 105