Index: base/android/java/src/org/chromium/base/PowerMonitor.java |
diff --git a/base/android/java/src/org/chromium/base/PowerMonitor.java b/base/android/java/src/org/chromium/base/PowerMonitor.java |
index 334a0b56d367e3e69b8f0979217fa3a712ac931a..bd06d9b77a31077d121b241e27fbef40e90aa67d 100644 |
--- a/base/android/java/src/org/chromium/base/PowerMonitor.java |
+++ b/base/android/java/src/org/chromium/base/PowerMonitor.java |
@@ -4,6 +4,7 @@ |
package org.chromium.base; |
+import android.content.BroadcastReceiver; |
import android.content.Context; |
import android.content.Intent; |
import android.content.IntentFilter; |
@@ -14,7 +15,6 @@ import android.os.Looper; |
import org.chromium.base.annotations.CalledByNative; |
import org.chromium.base.annotations.JNINamespace; |
- |
/** |
* Integrates native PowerMonitor with the java side. |
*/ |
@@ -28,7 +28,7 @@ public class PowerMonitor { |
private boolean mIsBatteryPower; |
private final Handler mHandler = new Handler(Looper.getMainLooper()); |
- public static void createForTests(Context context) { |
+ public static void createForTests() { |
// Applications will create this once the JNI side has been fully wired up both sides. For |
// tests, we just need native -> java, that is, we don't need to notify java -> native on |
// creation. |
@@ -37,28 +37,34 @@ public class PowerMonitor { |
/** |
* Create a PowerMonitor instance if none exists. |
- * @param context The context to register broadcast receivers for. The application context |
- * will be used from this parameter. |
*/ |
- public static void create(Context context) { |
- context = context.getApplicationContext(); |
- if (sInstance == null) { |
- sInstance = LazyHolder.INSTANCE; |
- IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); |
- Intent batteryStatusIntent = context.registerReceiver(null, ifilter); |
- if (batteryStatusIntent != null) onBatteryChargingChanged(batteryStatusIntent); |
- } |
+ public static void create() { |
+ ThreadUtils.assertOnUiThread(); |
+ |
+ if (sInstance != null) return; |
+ |
+ Context context = ContextUtils.getApplicationContext(); |
+ sInstance = LazyHolder.INSTANCE; |
+ IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); |
+ Intent batteryStatusIntent = context.registerReceiver(null, ifilter); |
+ if (batteryStatusIntent != null) onBatteryChargingChanged(batteryStatusIntent); |
+ |
+ IntentFilter powerConnectedFilter = new IntentFilter(); |
+ powerConnectedFilter.addAction(Intent.ACTION_POWER_CONNECTED); |
+ powerConnectedFilter.addAction(Intent.ACTION_POWER_DISCONNECTED); |
+ context.registerReceiver(new BroadcastReceiver() { |
+ @Override |
+ public void onReceive(Context context, Intent intent) { |
+ PowerMonitor.onBatteryChargingChanged(intent); |
+ } |
+ }, powerConnectedFilter); |
} |
private PowerMonitor() { |
} |
- public static void onBatteryChargingChanged(Intent intent) { |
- if (sInstance == null) { |
- // We may be called by the framework intent-filter before being fully initialized. This |
- // is not a problem, since our constructor will check for the state later on. |
- return; |
- } |
+ private static void onBatteryChargingChanged(Intent intent) { |
+ assert sInstance != null; |
int chargePlug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); |
// If we're not plugged, assume we're running on battery power. |
sInstance.mIsBatteryPower = chargePlug != BatteryManager.BATTERY_PLUGGED_USB |
@@ -68,6 +74,11 @@ public class PowerMonitor { |
@CalledByNative |
private static boolean isBatteryPower() { |
+ // Creation of the PowerMonitor can be deferred based on the browser startup path. If the |
+ // battery power is requested prior to the browser triggering the creation, force it to be |
+ // created now. |
+ if (sInstance == null) create(); |
+ |
return sInstance.mIsBatteryPower; |
} |