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