diff --git a/include/batteryservice/BatteryService.h b/include/batteryservice/BatteryService.h index 829061a34..6bc3f0773 100644 --- a/include/batteryservice/BatteryService.h +++ b/include/batteryservice/BatteryService.h @@ -43,6 +43,12 @@ enum { BATTERY_HEALTH_COLD = 7, // equals BatteryManager.BATTERY_HEALTH_COLD constant }; +// must be kept in sync with definitions in BatteryProperty.java +enum { + BATTERY_PROP_CHARGE_COUNTER = 1, // equals BatteryProperty.BATTERY_PROP_CHARGE_COUNTER constant + BATTERY_PROP_CURRENT_NOW = 2, // equals BatteryProperty.BATTERY_PROP_CURRENT_NOW constant +}; + struct BatteryProperties { bool chargerAcOnline; bool chargerUsbOnline; @@ -61,6 +67,13 @@ struct BatteryProperties { status_t readFromParcel(Parcel* parcel); }; +struct BatteryProperty { + int valueInt; + + status_t writeToParcel(Parcel* parcel) const; + status_t readFromParcel(Parcel* parcel); +}; + }; // namespace android #endif // ANDROID_BATTERYSERVICE_H diff --git a/include/batteryservice/IBatteryPropertiesRegistrar.h b/include/batteryservice/IBatteryPropertiesRegistrar.h index 8d28b1d35..eca075d7e 100644 --- a/include/batteryservice/IBatteryPropertiesRegistrar.h +++ b/include/batteryservice/IBatteryPropertiesRegistrar.h @@ -26,6 +26,7 @@ namespace android { enum { REGISTER_LISTENER = IBinder::FIRST_CALL_TRANSACTION, UNREGISTER_LISTENER, + GET_PROPERTY, }; class IBatteryPropertiesRegistrar : public IInterface { @@ -34,6 +35,7 @@ public: virtual void registerListener(const sp& listener) = 0; virtual void unregisterListener(const sp& listener) = 0; + virtual status_t getProperty(int id, struct BatteryProperty *val) = 0; }; class BnBatteryPropertiesRegistrar : public BnInterface { diff --git a/services/batteryservice/Android.mk b/services/batteryservice/Android.mk index 0a29c36d5..9354b99ae 100644 --- a/services/batteryservice/Android.mk +++ b/services/batteryservice/Android.mk @@ -3,6 +3,7 @@ include $(CLEAR_VARS) LOCAL_SRC_FILES:= \ BatteryProperties.cpp \ + BatteryProperty.cpp \ IBatteryPropertiesListener.cpp \ IBatteryPropertiesRegistrar.cpp diff --git a/services/batteryservice/BatteryProperty.cpp b/services/batteryservice/BatteryProperty.cpp new file mode 100644 index 000000000..6cbc896d4 --- /dev/null +++ b/services/batteryservice/BatteryProperty.cpp @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2013 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 +#include +#include +#include +#include + +namespace android { + +/* + * Parcel read/write code must be kept in sync with + * frameworks/base/core/java/android/os/BatteryProperty.java + */ + +status_t BatteryProperty::readFromParcel(Parcel* p) { + valueInt = p->readInt32(); + return OK; +} + +status_t BatteryProperty::writeToParcel(Parcel* p) const { + p->writeInt32(valueInt); + return OK; +} + +}; // namespace android diff --git a/services/batteryservice/IBatteryPropertiesRegistrar.cpp b/services/batteryservice/IBatteryPropertiesRegistrar.cpp index 6c2d2a5bc..6647122d1 100644 --- a/services/batteryservice/IBatteryPropertiesRegistrar.cpp +++ b/services/batteryservice/IBatteryPropertiesRegistrar.cpp @@ -44,6 +44,18 @@ public: data.writeStrongBinder(listener->asBinder()); remote()->transact(UNREGISTER_LISTENER, data, NULL); } + + status_t getProperty(int id, struct BatteryProperty *val) { + Parcel data, reply; + data.writeInterfaceToken(IBatteryPropertiesRegistrar::getInterfaceDescriptor()); + data.writeInt32(id); + remote()->transact(GET_PROPERTY, data, &reply); + status_t ret = reply.readInt32(); + int parcelpresent = reply.readInt32(); + if (parcelpresent) + val->readFromParcel(&reply); + return ret; + } }; IMPLEMENT_META_INTERFACE(BatteryPropertiesRegistrar, "android.os.IBatteryPropertiesRegistrar"); @@ -69,6 +81,18 @@ status_t BnBatteryPropertiesRegistrar::onTransact(uint32_t code, unregisterListener(listener); return OK; } + + case GET_PROPERTY: { + CHECK_INTERFACE(IBatteryPropertiesRegistrar, data, reply); + int id = data.readInt32(); + struct BatteryProperty val; + status_t result = getProperty(id, &val); + reply->writeNoException(); + reply->writeInt32(result); + reply->writeInt32(1); + val.writeToParcel(reply); + return OK; + } } return BBinder::onTransact(code, data, reply, flags); };