/* HostBatteryManager.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.battery; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.BatteryManager; import org.deviceconnect.android.deviceplugin.host.HostDeviceService; /** * バッテリー関連の値の処理と保持. */ public class HostBatteryManager { /** バッテリーの状態. */ private int mStatusBattery; /** プラグの状態. */ private int mStatusPlugged; /** バッテリーのレベル. */ private int mValueLevel; /** バッテリーのスケール. */ private int mValueScale; /** チャージフラグ. */ private boolean mChargingFlag; /** バッテリーの状態 不明. */ public static final int BATTERY_STATUS_UNKNOWN = 1; /** バッテリーの状態 充電中. */ public static final int BATTERY_STATUS_CHARGING = 2; /** バッテリーの状態 放電中. */ public static final int BATTERY_STATUS_DISCHARGING = 3; /** バッテリーの状態 非充電中. */ public static final int BATTERY_STATUS_NOT_CHARGING = 4; /** バッテリーの状態 満杯. */ public static final int BATTERY_STATUS_FULL = 5; /** 充電中 AC. */ public static final int BATTERY_PLUGGED_AC = 1; /** 充電中 USB. */ public static final int BATTERY_PLUGGED_USB = 2; /** Intent filter for battery charge event. */ private IntentFilter mIfBatteryCharge; /** Intent filter for battery connect event. */ private IntentFilter mIfBatteryConnect; /** * Context. */ private HostDeviceService mHostDeviceService; private BatteryChargingEventListener mBatteryChargingEventListener; private BatteryStatusEventListener mBatteryStatusEventListener; public HostBatteryManager(final HostDeviceService service) { mHostDeviceService = service; mIfBatteryCharge = new IntentFilter(); mIfBatteryCharge.addAction(Intent.ACTION_BATTERY_CHANGED); mIfBatteryCharge.addAction(Intent.ACTION_BATTERY_LOW); mIfBatteryCharge.addAction(Intent.ACTION_BATTERY_OKAY); mIfBatteryConnect = new IntentFilter(); mIfBatteryConnect.addAction(Intent.ACTION_POWER_CONNECTED); mIfBatteryConnect.addAction(Intent.ACTION_POWER_DISCONNECTED); } private Context getContext() { return mHostDeviceService; } public void clear() { unregisterBatteryChargeBroadcastReceiver(); unregisterBatteryConnectBroadcastReceiver(); } /** * バッテリーのIntentから情報を取得. */ public void getBatteryInfo() { IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); Intent batteryStatus; int i = 0; do { batteryStatus = getContext().registerReceiver(null, filter); } while (i++ < 3 && batteryStatus == null); if (batteryStatus == null) { mStatusBattery = HostBatteryManager.BATTERY_STATUS_UNKNOWN; mValueLevel = 0; mValueScale = 0; return; } // バッテリーの変化を取得 int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1); switch (status) { case BatteryManager.BATTERY_STATUS_UNKNOWN: mStatusBattery = HostBatteryManager.BATTERY_STATUS_UNKNOWN; break; case BatteryManager.BATTERY_STATUS_CHARGING: mStatusBattery = HostBatteryManager.BATTERY_STATUS_CHARGING; break; case BatteryManager.BATTERY_STATUS_DISCHARGING: mStatusBattery = HostBatteryManager.BATTERY_STATUS_DISCHARGING; break; case BatteryManager.BATTERY_STATUS_NOT_CHARGING: mStatusBattery = HostBatteryManager.BATTERY_STATUS_NOT_CHARGING; break; case BatteryManager.BATTERY_STATUS_FULL: mStatusBattery = HostBatteryManager.BATTERY_STATUS_FULL; break; default: mStatusBattery = HostBatteryManager.BATTERY_STATUS_UNKNOWN; break; } // プラグの状態を取得 int plugged = batteryStatus.getIntExtra("plugged", 0); switch (plugged) { case BatteryManager.BATTERY_PLUGGED_AC: mStatusPlugged = BATTERY_PLUGGED_AC; break; case BatteryManager.BATTERY_PLUGGED_USB: mStatusPlugged = BATTERY_PLUGGED_USB; break; default: break; } // チャージングフラグ mChargingFlag = (plugged != 0); // バッテリー残量 mValueLevel = batteryStatus.getIntExtra("level", 0); mValueScale = batteryStatus.getIntExtra("scale", 0); } /** * バッテリーのIntentを設定. * * @param intent Batteryの変化で取得できたIntent */ private void setBatteryRequest(final Intent intent) { String mAction = intent.getAction(); if (Intent.ACTION_BATTERY_CHANGED.equals(mAction) || Intent.ACTION_BATTERY_LOW.equals(mAction) || Intent.ACTION_BATTERY_OKAY.equals(mAction)) { // バッテリーの変化を取得 int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1); switch (status) { case BatteryManager.BATTERY_STATUS_UNKNOWN: mStatusBattery = HostBatteryManager.BATTERY_STATUS_UNKNOWN; break; case BatteryManager.BATTERY_STATUS_CHARGING: mStatusBattery = HostBatteryManager.BATTERY_STATUS_CHARGING; break; case BatteryManager.BATTERY_STATUS_DISCHARGING: mStatusBattery = HostBatteryManager.BATTERY_STATUS_DISCHARGING; break; case BatteryManager.BATTERY_STATUS_NOT_CHARGING: mStatusBattery = HostBatteryManager.BATTERY_STATUS_NOT_CHARGING; break; case BatteryManager.BATTERY_STATUS_FULL: mStatusBattery = HostBatteryManager.BATTERY_STATUS_FULL; break; default: mStatusBattery = HostBatteryManager.BATTERY_STATUS_UNKNOWN; break; } mValueLevel = intent.getIntExtra("level", 0); mValueScale = intent.getIntExtra("scale", 0); } else if (Intent.ACTION_POWER_CONNECTED.equals(mAction) || Intent.ACTION_POWER_DISCONNECTED.equals(mAction)) { mChargingFlag = Intent.ACTION_POWER_CONNECTED.equals(mAction); // プラグの状態を取得 int plugged = intent.getIntExtra("plugged", 0); switch (plugged) { case BatteryManager.BATTERY_PLUGGED_AC: mStatusPlugged = BATTERY_PLUGGED_AC; break; case BatteryManager.BATTERY_PLUGGED_USB: mStatusPlugged = BATTERY_PLUGGED_USB; break; default: break; } } } /** * バッテリーの状態を取得. * * @return statusBattery バッテリーの状態 */ public int getBatteryStatus() { return mStatusBattery; } /** * プラグの状態を取得. * * @return statusPlugged プラグの状態 */ public int getStatusPlugged() { return mStatusPlugged; } /** * バッテリーレベルの取得. * * @return valueLevel バッテリーレベル */ public int getBatteryLevel() { return mValueLevel; } /** * スケールの取得. * * @return batteryStatus バッテリーの状態 */ public int getBatteryScale() { return mValueScale; } /** * バッテリーチャージ状態を取得. * @return batteryCharging バッテリーチャージ状態 */ public boolean isChargingFlag() { return mChargingFlag; } /** * Register broadcast receiver for battery charge event. */ public void registerBatteryChargeBroadcastReceiver() { getContext().registerReceiver(mBatteryChargeBR, mIfBatteryCharge); } /** * Unregister broadcast receiver for battery charge event. */ public void unregisterBatteryChargeBroadcastReceiver() { try { getContext().unregisterReceiver(mBatteryChargeBR); } catch (Exception e) { // Nop } } /** * Register broadcast receiver for battery connect event. */ public void registerBatteryConnectBroadcastReceiver() { getContext().registerReceiver(mBatteryConnectBR, mIfBatteryConnect); } /** * Unregister broadcast receiver for battery connect event. */ public void unregisterBatteryConnectBroadcastReceiver() { try { getContext().unregisterReceiver(mBatteryConnectBR); } catch (Exception e) { // Nop } } public void setBatteryChargingEventListener(final BatteryChargingEventListener listener) { mBatteryChargingEventListener = listener; } public void setBatteryStatusEventListener(final BatteryStatusEventListener listener) { mBatteryStatusEventListener = listener; } public interface BatteryChargingEventListener { void onChangeCharging(); } public interface BatteryStatusEventListener { void onChangeStatus(); } /** * Broadcast receiver for battery charge event. */ private BroadcastReceiver mBatteryChargeBR = new BroadcastReceiver() { @Override public void onReceive(final Context context, final Intent intent) { String action = intent.getAction(); if (Intent.ACTION_BATTERY_CHANGED.equals(action) || Intent.ACTION_BATTERY_LOW.equals(action) || Intent.ACTION_BATTERY_OKAY.equals(action)) { setBatteryRequest(intent); if (mBatteryChargingEventListener != null) { mBatteryChargingEventListener.onChangeCharging(); } } } }; /** * Broadcast receiver for battery connect event. */ private BroadcastReceiver mBatteryConnectBR = new BroadcastReceiver() { @Override public void onReceive(final Context context, final Intent intent) { String action = intent.getAction(); if (Intent.ACTION_POWER_CONNECTED.equals(action) || Intent.ACTION_POWER_DISCONNECTED.equals(action)) { setBatteryRequest(intent); if (mBatteryStatusEventListener != null) { mBatteryStatusEventListener.onChangeStatus(); } } } }; }