• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2017 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.googlecode.android_scripting.facade;
18 
19 import android.app.Service;
20 import android.content.BroadcastReceiver;
21 import android.content.Context;
22 import android.content.Intent;
23 import android.content.IntentFilter;
24 import android.os.BatteryManager;
25 import android.os.Bundle;
26 
27 import com.googlecode.android_scripting.Log;
28 import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
29 import com.googlecode.android_scripting.rpc.Rpc;
30 import com.googlecode.android_scripting.rpc.RpcStartEvent;
31 import com.googlecode.android_scripting.rpc.RpcStopEvent;
32 
33 import java.lang.reflect.Field;
34 
35 /**
36  * Exposes Batterymanager API. Note that in order to use any of the batteryGet* functions, you need
37  * to batteryStartMonitoring, and then wait for a "battery" event. Sleeping for a second will
38  * usually work just as well.
39  *
40  */
41 public class BatteryManagerFacade extends RpcReceiver {
42 
43   private final Service mService;
44   private final EventFacade mEventFacade;
45   private final int mSdkVersion;
46 
47   private BatteryStateListener mReceiver;
48 
49   private volatile Bundle mBatteryData = null;
50   private volatile Integer mBatteryStatus = null;
51   private volatile Integer mBatteryHealth = null;
52   private volatile Integer mPlugType = null;
53 
54   private volatile Boolean mBatteryPresent = null;
55   private volatile Integer mBatteryLevel = null;
56   private volatile Integer mBatteryMaxLevel = null;
57   private volatile Integer mBatteryVoltage = null;
58   private volatile Integer mBatteryTemperature = null;
59   private volatile String mBatteryTechnology = null;
60 
BatteryManagerFacade(FacadeManager manager)61   public BatteryManagerFacade(FacadeManager manager) {
62     super(manager);
63     mService = manager.getService();
64     mSdkVersion = manager.getSdkLevel();
65     mEventFacade = manager.getReceiver(EventFacade.class);
66     mReceiver = null;
67     mBatteryData = null;
68   }
69 
70   private class BatteryStateListener extends BroadcastReceiver {
71 
72     private final EventFacade mmEventFacade;
73 
BatteryStateListener(EventFacade facade)74     private BatteryStateListener(EventFacade facade) {
75       mmEventFacade = facade;
76     }
77 
78     @Override
onReceive(Context context, Intent intent)79     public void onReceive(Context context, Intent intent) {
80       mBatteryStatus = intent.getIntExtra("status", 1);
81       mBatteryHealth = intent.getIntExtra("health", 1);
82       mPlugType = intent.getIntExtra("plugged", -1);
83       if (mSdkVersion >= 5) {
84         mBatteryPresent =
85             intent.getBooleanExtra(getBatteryManagerFieldValue("EXTRA_PRESENT"), false);
86         mBatteryLevel = intent.getIntExtra(getBatteryManagerFieldValue("EXTRA_LEVEL"), -1);
87         mBatteryMaxLevel = intent.getIntExtra(getBatteryManagerFieldValue("EXTRA_SCALE"), 0);
88         mBatteryVoltage = intent.getIntExtra(getBatteryManagerFieldValue("EXTRA_VOLTAGE"), -1);
89         mBatteryTemperature =
90             intent.getIntExtra(getBatteryManagerFieldValue("EXTRA_TEMPERATURE"), -1);
91         mBatteryTechnology = intent.getStringExtra(getBatteryManagerFieldValue("EXTRA_TECHNOLOGY"));
92       }
93       Bundle data = new Bundle();
94       data.putInt("status", mBatteryStatus);
95       data.putInt("health", mBatteryHealth);
96       data.putInt("plugged", mPlugType);
97       if (mSdkVersion >= 5) {
98         data.putBoolean("battery_present", mBatteryPresent);
99         if (mBatteryMaxLevel == null || mBatteryMaxLevel == 100 || mBatteryMaxLevel == 0) {
100           data.putInt("level", mBatteryLevel);
101         } else {
102           data.putInt("level", (int) (mBatteryLevel * 100.0 / mBatteryMaxLevel));
103         }
104         data.putInt("voltage", mBatteryVoltage);
105         data.putInt("temperature", mBatteryTemperature);
106         data.putString("technology", mBatteryTechnology);
107       }
108       mBatteryData = data;
109       mmEventFacade.postEvent("battery", mBatteryData.clone());
110     }
111   }
112 
getBatteryManagerFieldValue(String name)113   private String getBatteryManagerFieldValue(String name) {
114     try {
115       Field f = BatteryManager.class.getField(name);
116       return f.get(null).toString();
117     } catch (Exception e) {
118       Log.e(e);
119     }
120     return null;
121   }
122 
123   @Rpc(description = "Returns the most recently recorded battery data.")
readBatteryData()124   public Bundle readBatteryData() {
125     return mBatteryData;
126   }
127 
128   /**
129    * throws "battery" events
130    */
131   @Rpc(description = "Starts tracking battery state.")
132   @RpcStartEvent("battery")
batteryStartMonitoring()133   public void batteryStartMonitoring() {
134     if (mReceiver == null) {
135       IntentFilter filter = new IntentFilter();
136       filter.addAction(Intent.ACTION_BATTERY_CHANGED);
137       mReceiver = new BatteryStateListener(mEventFacade);
138       mService.registerReceiver(mReceiver, filter);
139     }
140   }
141 
142   @Rpc(description = "Stops tracking battery state.")
143   @RpcStopEvent("battery")
batteryStopMonitoring()144   public void batteryStopMonitoring() {
145     if (mReceiver != null) {
146       mService.unregisterReceiver(mReceiver);
147       mReceiver = null;
148     }
149     mBatteryData = null;
150   }
151 
152   @Override
shutdown()153   public void shutdown() {
154     batteryStopMonitoring();
155   }
156 
157   @Rpc(description = "Returns  the most recently received battery status data:" + "\n1 - unknown;"
158       + "\n2 - charging;" + "\n3 - discharging;" + "\n4 - not charging;" + "\n5 - full;")
batteryGetStatus()159   public Integer batteryGetStatus() {
160     return mBatteryStatus;
161   }
162 
163   @Rpc(description = "Returns the most recently received battery health data:" + "\n1 - unknown;"
164       + "\n2 - good;" + "\n3 - overheat;" + "\n4 - dead;" + "\n5 - over voltage;"
165       + "\n6 - unspecified failure;")
batteryGetHealth()166   public Integer batteryGetHealth() {
167     return mBatteryHealth;
168   }
169 
170   /** Power source is an AC charger. */
171   public static final int BATTERY_PLUGGED_AC = 1;
172   /** Power source is a USB port. */
173   public static final int BATTERY_PLUGGED_USB = 2;
174 
175   @Rpc(description = "Returns the most recently received plug type data:" + "\n-1 - unknown"
176       + "\n0 - unplugged;" + "\n1 - power source is an AC charger"
177       + "\n2 - power source is a USB port")
batteryGetPlugType()178   public Integer batteryGetPlugType() {
179     return mPlugType;
180   }
181 
182   @Rpc(description = "Returns the most recently received battery presence data.")
batteryCheckPresent()183   public Boolean batteryCheckPresent() {
184     return mBatteryPresent;
185   }
186 
187   @Rpc(description = "Returns the most recently received battery level (percentage).")
batteryGetLevel()188   public Integer batteryGetLevel() {
189     if (mBatteryMaxLevel == null || mBatteryMaxLevel == 100 || mBatteryMaxLevel == 0) {
190       return mBatteryLevel;
191     } else {
192       return (int) (mBatteryLevel * 100.0 / mBatteryMaxLevel);
193     }
194   }
195 
196   @Rpc(description = "Returns the most recently received battery voltage.")
batteryGetVoltage()197   public Integer batteryGetVoltage() {
198     return mBatteryVoltage;
199   }
200 
201   @Rpc(description = "Returns the most recently received battery temperature.")
batteryGetTemperature()202   public Integer batteryGetTemperature() {
203     return mBatteryTemperature;
204   }
205 
206   @Rpc(description = "Returns the most recently received battery technology data.")
batteryGetTechnology()207   public String batteryGetTechnology() {
208     return mBatteryTechnology;
209   }
210 
211 }
212