Updater: Improve battery check

* Lower default value by 10%
* Decrease the level by another 10% if charging
* Always allow installation in case device doesn't have a battery
* Show the requirements in the alert dialog

Change-Id: Iebb10220612006fbd096eb474cf3034ef52144b3
diff --git a/res/values/integers.xml b/res/values/integers.xml
index 5b68147..9cb9e2d 100644
--- a/res/values/integers.xml
+++ b/res/values/integers.xml
@@ -1,4 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <resources>
-    <integer name="battery_ok_percentage">40</integer>
+    <integer name="battery_ok_percentage_charging">20</integer>
+    <integer name="battery_ok_percentage_discharging">30</integer>
 </resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 74cd18a..1d92448 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -57,7 +57,7 @@
     <string name="preparing_ota_first_boot">Preparing for first boot</string>
     <string name="dialog_prepare_zip_message">Preliminary update preparation</string>
     <string name="dialog_battery_low_title">Low battery</string>
-    <string name="dialog_battery_low_message">The battery level is too low, please charge your device to continue.</string>
+    <string name="dialog_battery_low_message_pct">The battery level is too low, you need at least <xliff:g id="percent_discharging">%1$d</xliff:g>%% of the battery to continue, <xliff:g id="percent_charging">%2$d</xliff:g>%% if charging.</string>
 
     <string name="reboot">Reboot</string>
 
diff --git a/src/org/lineageos/updater/UpdatesListAdapter.java b/src/org/lineageos/updater/UpdatesListAdapter.java
index 5766a35..7b317d3 100644
--- a/src/org/lineageos/updater/UpdatesListAdapter.java
+++ b/src/org/lineageos/updater/UpdatesListAdapter.java
@@ -16,7 +16,9 @@
 package org.lineageos.updater;
 
 import android.content.Intent;
+import android.content.IntentFilter;
 import android.content.SharedPreferences;
+import android.content.res.Resources;
 import android.os.BatteryManager;
 import android.preference.PreferenceManager;
 import android.support.design.widget.Snackbar;
@@ -424,9 +426,13 @@
 
     private AlertDialog.Builder getInstallDialog(final String downloadId) {
         if (!isBatteryLevelOk()) {
+            Resources resources = mActivity.getResources();
+            String message = resources.getString(R.string.dialog_battery_low_message_pct,
+                    resources.getInteger(R.integer.battery_ok_percentage_discharging),
+                    resources.getInteger(R.integer.battery_ok_percentage_charging));
             return new AlertDialog.Builder(mActivity)
                     .setTitle(R.string.dialog_battery_low_title)
-                    .setMessage(R.string.dialog_battery_low_message)
+                    .setMessage(message)
                     .setPositiveButton(android.R.string.ok, null);
         }
         UpdateInfo update = mUpdaterController.getUpdate(downloadId);
@@ -538,8 +544,16 @@
     }
 
     private boolean isBatteryLevelOk() {
-        BatteryManager bm = mActivity.getSystemService(BatteryManager.class);
-        int percent = bm.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY);
-        return percent >= mActivity.getResources().getInteger(R.integer.battery_ok_percentage);
+        Intent intent = mActivity.registerReceiver(null,
+                new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
+        if (!intent.getBooleanExtra(BatteryManager.EXTRA_PRESENT, false)) {
+            return true;
+        }
+        int percent = Math.round(100.f * intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 100) /
+                intent.getIntExtra(BatteryManager.EXTRA_SCALE, 100));
+        int required = intent.getBooleanExtra(BatteryManager.EXTRA_PLUGGED, false) ?
+                mActivity.getResources().getInteger(R.integer.battery_ok_percentage_charging) :
+                mActivity.getResources().getInteger(R.integer.battery_ok_percentage_discharging);
+        return percent >= required;
     }
 }