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