/* HostBatteryProfile.java Copyright (c) 2014 NTT DOCOMO,INC. Released under the MIT license http://opensource.org/licenses/mit-license.php */ package org.deviceconnect.android.deviceplugin.host.profile; import android.content.Intent; import android.os.Bundle; import org.deviceconnect.android.deviceplugin.host.HostDeviceService; import org.deviceconnect.android.deviceplugin.host.battery.HostBatteryManager; import org.deviceconnect.android.event.Event; import org.deviceconnect.android.event.EventError; import org.deviceconnect.android.event.EventManager; import org.deviceconnect.android.message.MessageUtils; import org.deviceconnect.android.profile.BatteryProfile; import org.deviceconnect.android.profile.api.DConnectApi; import org.deviceconnect.android.profile.api.DeleteApi; import org.deviceconnect.android.profile.api.GetApi; import org.deviceconnect.android.profile.api.PutApi; import org.deviceconnect.message.DConnectMessage; import org.deviceconnect.message.intent.message.IntentDConnectMessage; import java.util.List; /** * Battery Profile. * * @author NTT DOCOMO, INC. */ public class HostBatteryProfile extends BatteryProfile { private final DConnectApi mBatteryLevelApi = new GetApi() { @Override public String getAttribute() { return ATTRIBUTE_LEVEL; } @Override public boolean onRequest(final Intent request, final Intent response) { getBatteryManager().getBatteryInfo(); int mLevel = getBatteryManager().getBatteryLevel(); int mScale = getBatteryManager().getBatteryScale(); if (mScale <= 0) { MessageUtils.setUnknownError(response, "Scale of battery level is unknown."); } else if (mLevel < 0) { MessageUtils.setUnknownError(response, "Battery level is unknown."); } else { setResult(response, IntentDConnectMessage.RESULT_OK); setLevel(response, mLevel / (float) mScale); } return true; } }; private final DConnectApi mBatteryChargingApi = new GetApi() { @Override public String getAttribute() { return ATTRIBUTE_CHARGING; } @Override public boolean onRequest(final Intent request, final Intent response) { getBatteryManager().getBatteryInfo(); setResult(response, IntentDConnectMessage.RESULT_OK); setCharging(response, getBatteryManager().isChargingFlag()); return true; } }; private final DConnectApi mBatteryAllApi = new GetApi() { @Override public boolean onRequest(final Intent request, final Intent response) { getBatteryManager().getBatteryInfo(); int mLevel = getBatteryManager().getBatteryLevel(); int mScale = getBatteryManager().getBatteryScale(); if (mScale <= 0) { MessageUtils.setUnknownError(response, "Scale of battery level is unknown."); } else if (mLevel < 0) { MessageUtils.setUnknownError(response, "Battery level is unknown."); } else { setLevel(response, mLevel / (float) mScale); setCharging(response, getBatteryManager().isChargingFlag()); setResult(response, IntentDConnectMessage.RESULT_OK); } return true; } }; private final DConnectApi mPutOnChargingChangeApi = new PutApi() { @Override public String getAttribute() { return ATTRIBUTE_ON_CHARGING_CHANGE; } @Override public boolean onRequest(final Intent request, final Intent response) { EventError error = EventManager.INSTANCE.addEvent(request); if (error == EventError.NONE) { getBatteryManager().registerBatteryConnectBroadcastReceiver(); setResult(response, DConnectMessage.RESULT_OK); } else { setResult(response, DConnectMessage.RESULT_ERROR); } return true; } }; private final DConnectApi mDeleteOnChargingChangeApi = new DeleteApi() { @Override public String getAttribute() { return ATTRIBUTE_ON_CHARGING_CHANGE; } @Override public boolean onRequest(final Intent request, final Intent response) { getBatteryManager().unregisterBatteryConnectBroadcastReceiver(); EventError error = EventManager.INSTANCE.removeEvent(request); if (error == EventError.NONE) { setResult(response, DConnectMessage.RESULT_OK); } else { MessageUtils.setUnknownError(response, "Can not unregister event."); } return true; } }; private final DConnectApi mPutOnBatteryChangeApi = new PutApi() { @Override public String getAttribute() { return ATTRIBUTE_ON_BATTERY_CHANGE; } @Override public boolean onRequest(final Intent request, final Intent response) { EventError error = EventManager.INSTANCE.addEvent(request); if (error == EventError.NONE) { getBatteryManager().registerBatteryChargeBroadcastReceiver(); setResult(response, DConnectMessage.RESULT_OK); } else { setResult(response, DConnectMessage.RESULT_ERROR); } return true; } }; private final DConnectApi mDeleteOnBatteryChangeApi = new DeleteApi() { @Override public String getAttribute() { return ATTRIBUTE_ON_BATTERY_CHANGE; } @Override public boolean onRequest(final Intent request, final Intent response) { getBatteryManager().unregisterBatteryChargeBroadcastReceiver(); EventError error = EventManager.INSTANCE.removeEvent(request); if (error == EventError.NONE) { setResult(response, DConnectMessage.RESULT_OK); } else { MessageUtils.setUnknownError(response, "Can not unregister event."); } return true; } }; private HostBatteryManager mHostBatteryManager; public HostBatteryProfile(final HostBatteryManager manager) { mHostBatteryManager = manager; mHostBatteryManager.setBatteryChargingEventListener(mBatteryChargingEventListener); mHostBatteryManager.setBatteryStatusEventListener(mBatteryStatusEventListener); addApi(mBatteryLevelApi); addApi(mBatteryChargingApi); addApi(mBatteryAllApi); addApi(mPutOnChargingChangeApi); addApi(mDeleteOnChargingChangeApi); addApi(mPutOnBatteryChangeApi); addApi(mDeleteOnBatteryChangeApi); } private HostBatteryManager getBatteryManager() { return mHostBatteryManager; } private double getLevel() { return ((double) (getBatteryManager().getBatteryLevel())) / ((double) getBatteryManager().getBatteryScale()); } private final HostBatteryManager.BatteryChargingEventListener mBatteryChargingEventListener = new HostBatteryManager.BatteryChargingEventListener() { @Override public void onChangeCharging() { List<Event> events = EventManager.INSTANCE.getEventList(HostDeviceService.SERVICE_ID, HostBatteryProfile.PROFILE_NAME, null, HostBatteryProfile.ATTRIBUTE_ON_BATTERY_CHANGE); for (int i = 0; i < events.size(); i++) { Event event = events.get(i); Intent intent = EventManager.createEventMessage(event); Bundle battery = new Bundle(); HostBatteryProfile.setLevel(battery, getLevel()); HostBatteryProfile.setBattery(intent, battery); sendEvent(intent, event.getAccessToken()); } } }; private final HostBatteryManager.BatteryStatusEventListener mBatteryStatusEventListener = new HostBatteryManager.BatteryStatusEventListener() { @Override public void onChangeStatus() { List<Event> events = EventManager.INSTANCE.getEventList(HostDeviceService.SERVICE_ID, HostBatteryProfile.PROFILE_NAME, null, HostBatteryProfile.ATTRIBUTE_ON_CHARGING_CHANGE); for (int i = 0; i < events.size(); i++) { Event event = events.get(i); Intent intent = EventManager.createEventMessage(event); Bundle charging = new Bundle(); HostBatteryProfile.setCharging(charging, getBatteryManager().isChargingFlag()); HostBatteryProfile.setBattery(intent, charging); sendEvent(intent, event.getAccessToken()); } } }; }