/* * Copyright (C) 2017 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. */ package com.googlecode.android_scripting.facade; import android.app.Service; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.BatteryManager; import android.os.Bundle; import com.googlecode.android_scripting.Log; import com.googlecode.android_scripting.jsonrpc.RpcReceiver; import com.googlecode.android_scripting.rpc.Rpc; import com.googlecode.android_scripting.rpc.RpcStartEvent; import com.googlecode.android_scripting.rpc.RpcStopEvent; import java.lang.reflect.Field; /** * Exposes Batterymanager API. Note that in order to use any of the batteryGet* functions, you need * to batteryStartMonitoring, and then wait for a "battery" event. Sleeping for a second will * usually work just as well. * */ public class BatteryManagerFacade extends RpcReceiver { private final Service mService; private final EventFacade mEventFacade; private final int mSdkVersion; private BatteryStateListener mReceiver; private volatile Bundle mBatteryData = null; private volatile Integer mBatteryStatus = null; private volatile Integer mBatteryHealth = null; private volatile Integer mPlugType = null; private volatile Boolean mBatteryPresent = null; private volatile Integer mBatteryLevel = null; private volatile Integer mBatteryMaxLevel = null; private volatile Integer mBatteryVoltage = null; private volatile Integer mBatteryTemperature = null; private volatile String mBatteryTechnology = null; public BatteryManagerFacade(FacadeManager manager) { super(manager); mService = manager.getService(); mSdkVersion = manager.getSdkLevel(); mEventFacade = manager.getReceiver(EventFacade.class); mReceiver = null; mBatteryData = null; } private class BatteryStateListener extends BroadcastReceiver { private final EventFacade mmEventFacade; private BatteryStateListener(EventFacade facade) { mmEventFacade = facade; } @Override public void onReceive(Context context, Intent intent) { mBatteryStatus = intent.getIntExtra("status", 1); mBatteryHealth = intent.getIntExtra("health", 1); mPlugType = intent.getIntExtra("plugged", -1); if (mSdkVersion >= 5) { mBatteryPresent = intent.getBooleanExtra(getBatteryManagerFieldValue("EXTRA_PRESENT"), false); mBatteryLevel = intent.getIntExtra(getBatteryManagerFieldValue("EXTRA_LEVEL"), -1); mBatteryMaxLevel = intent.getIntExtra(getBatteryManagerFieldValue("EXTRA_SCALE"), 0); mBatteryVoltage = intent.getIntExtra(getBatteryManagerFieldValue("EXTRA_VOLTAGE"), -1); mBatteryTemperature = intent.getIntExtra(getBatteryManagerFieldValue("EXTRA_TEMPERATURE"), -1); mBatteryTechnology = intent.getStringExtra(getBatteryManagerFieldValue("EXTRA_TECHNOLOGY")); } Bundle data = new Bundle(); data.putInt("status", mBatteryStatus); data.putInt("health", mBatteryHealth); data.putInt("plugged", mPlugType); if (mSdkVersion >= 5) { data.putBoolean("battery_present", mBatteryPresent); if (mBatteryMaxLevel == null || mBatteryMaxLevel == 100 || mBatteryMaxLevel == 0) { data.putInt("level", mBatteryLevel); } else { data.putInt("level", (int) (mBatteryLevel * 100.0 / mBatteryMaxLevel)); } data.putInt("voltage", mBatteryVoltage); data.putInt("temperature", mBatteryTemperature); data.putString("technology", mBatteryTechnology); } mBatteryData = data; mmEventFacade.postEvent("battery", mBatteryData.clone()); } } private String getBatteryManagerFieldValue(String name) { try { Field f = BatteryManager.class.getField(name); return f.get(null).toString(); } catch (Exception e) { Log.e(e); } return null; } @Rpc(description = "Returns the most recently recorded battery data.") public Bundle readBatteryData() { return mBatteryData; } /** * throws "battery" events */ @Rpc(description = "Starts tracking battery state.") @RpcStartEvent("battery") public void batteryStartMonitoring() { if (mReceiver == null) { IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_BATTERY_CHANGED); mReceiver = new BatteryStateListener(mEventFacade); mService.registerReceiver(mReceiver, filter); } } @Rpc(description = "Stops tracking battery state.") @RpcStopEvent("battery") public void batteryStopMonitoring() { if (mReceiver != null) { mService.unregisterReceiver(mReceiver); mReceiver = null; } mBatteryData = null; } @Override public void shutdown() { batteryStopMonitoring(); } @Rpc(description = "Returns the most recently received battery status data:" + "\n1 - unknown;" + "\n2 - charging;" + "\n3 - discharging;" + "\n4 - not charging;" + "\n5 - full;") public Integer batteryGetStatus() { return mBatteryStatus; } @Rpc(description = "Returns the most recently received battery health data:" + "\n1 - unknown;" + "\n2 - good;" + "\n3 - overheat;" + "\n4 - dead;" + "\n5 - over voltage;" + "\n6 - unspecified failure;") public Integer batteryGetHealth() { return mBatteryHealth; } /** Power source is an AC charger. */ public static final int BATTERY_PLUGGED_AC = 1; /** Power source is a USB port. */ public static final int BATTERY_PLUGGED_USB = 2; @Rpc(description = "Returns the most recently received plug type data:" + "\n-1 - unknown" + "\n0 - unplugged;" + "\n1 - power source is an AC charger" + "\n2 - power source is a USB port") public Integer batteryGetPlugType() { return mPlugType; } @Rpc(description = "Returns the most recently received battery presence data.") public Boolean batteryCheckPresent() { return mBatteryPresent; } @Rpc(description = "Returns the most recently received battery level (percentage).") public Integer batteryGetLevel() { if (mBatteryMaxLevel == null || mBatteryMaxLevel == 100 || mBatteryMaxLevel == 0) { return mBatteryLevel; } else { return (int) (mBatteryLevel * 100.0 / mBatteryMaxLevel); } } @Rpc(description = "Returns the most recently received battery voltage.") public Integer batteryGetVoltage() { return mBatteryVoltage; } @Rpc(description = "Returns the most recently received battery temperature.") public Integer batteryGetTemperature() { return mBatteryTemperature; } @Rpc(description = "Returns the most recently received battery technology data.") public String batteryGetTechnology() { return mBatteryTechnology; } }