DeviceIdle ignores charging state if no battery.

The behaviour we want if mBatteryPresent = false is exactly the same as
what we already have when mBatteryCharging = false, so we can just do
the same thing instead of introducing more complexity with separate
flags for battery charging vs. plugged.

This might want to change in future if we detect that, for example, the
device is plugged into a charger that does not provide enough power to
charge (eg. a high-powered laptop plugged into an old mobile charger.)

Bug: 111443261
Test: atest com.android.server.DeviceIdleControllerTest
Test: atest BatterySaverPolicyTest
Change-Id: I66004f156352484e183736897d3a2f484415f63a
diff --git a/services/core/java/com/android/server/DeviceIdleController.java b/services/core/java/com/android/server/DeviceIdleController.java
index 45c13ec..08cb7a2 100644
--- a/services/core/java/com/android/server/DeviceIdleController.java
+++ b/services/core/java/com/android/server/DeviceIdleController.java
@@ -43,6 +43,7 @@
 import android.net.INetworkPolicyManager;
 import android.net.NetworkInfo;
 import android.net.Uri;
+import android.os.BatteryManager;
 import android.os.BatteryStats;
 import android.os.Binder;
 import android.os.Bundle;
@@ -521,9 +522,10 @@
                     updateConnectivityState(intent);
                 } break;
                 case Intent.ACTION_BATTERY_CHANGED: {
+                    boolean present = intent.getBooleanExtra(BatteryManager.EXTRA_PRESENT, true);
+                    boolean plugged = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0) != 0;
                     synchronized (DeviceIdleController.this) {
-                        int plugged = intent.getIntExtra("plugged", 0);
-                        updateChargingLocked(plugged != 0);
+                        updateChargingLocked(present && plugged);
                     }
                 } break;
                 case Intent.ACTION_PACKAGE_REMOVED: {