diff --git a/CheckBattery.cpp b/CheckBattery.cpp
index 8a674d0..f689bb4 100644
--- a/CheckBattery.cpp
+++ b/CheckBattery.cpp
@@ -26,6 +26,13 @@
 {
     // How often to check battery in seconds
     const int CHECK_PERIOD = 30;
+
+    // How charged should the battery be (percent) to start encrypting
+    const int START_THRESHOLD = 10;
+
+    // How charged should the battery be (percent) to continue encrypting
+    const int CONTINUE_THRESHOLD = 5;
+
     const String16 serviceName("batteryproperties");
 
     sp<IBinder> bs;
@@ -33,43 +40,59 @@
 
     bool singletonInitialized = false;
     time_t last_checked = {0};
-    int battery_ok = 1;
+    int last_result = 100;
+
+    int is_battery_ok(int threshold)
+    {
+        time_t now = time(NULL);
+        if (now == -1 || difftime(now, last_checked) < 5) {
+            goto finish;
+        }
+        last_checked = now;
+
+        if (!singletonInitialized) {
+            bs = defaultServiceManager()->checkService(serviceName);
+            if (bs == NULL) {
+                SLOGE("No batteryproperties service!");
+                goto finish;
+            }
+
+            interface = interface_cast<IBatteryPropertiesRegistrar>(bs);
+            if (interface == NULL) {
+                SLOGE("No IBatteryPropertiesRegistrar interface");
+                goto finish;
+            }
+
+            singletonInitialized = true;
+        }
+
+        {
+            BatteryProperty val;
+            status_t status = interface
+                ->getProperty(android::BATTERY_PROP_CAPACITY, &val);
+            if (status == NO_ERROR) {
+                SLOGD("Capacity is %d", (int)val.valueInt64);
+                last_result = val.valueInt64;
+            } else {
+                SLOGE("Failed to get battery charge");
+                last_result = 100;
+            }
+        }
+
+    finish:
+        return last_result >= threshold;
+    }
 }
 
-extern "C" int is_battery_ok()
+extern "C"
 {
-    time_t now = time(NULL);
-    if (now == -1 || difftime(now, last_checked) < 5) {
-        return battery_ok;
-    }
-    last_checked = now;
-
-    if (!singletonInitialized) {
-        bs = defaultServiceManager()->checkService(serviceName);
-        if (bs == NULL) {
-            SLOGE("No batteryproperties service!");
-            return 1;
-        }
-
-        interface = interface_cast<IBatteryPropertiesRegistrar>(bs);
-        if (interface == NULL) {
-            SLOGE("No IBatteryPropertiesRegistrar interface");
-            return 1;
-        }
-
-        singletonInitialized = true;
+    int is_battery_ok_to_start()
+    {
+        return is_battery_ok(START_THRESHOLD);
     }
 
-    BatteryProperty val;
-    status_t status = interface->getProperty(android::BATTERY_PROP_CAPACITY,
-                                             &val);
-    if (status == NO_ERROR) {
-        SLOGD("Capacity is %d", (int)val.valueInt64);
-        battery_ok = val.valueInt64 > 5 ? 1 : 0;
-    } else {
-        SLOGE("Failed to get battery charge");
-        battery_ok = 1;
+    int is_battery_ok_to_continue()
+    {
+        return is_battery_ok(CONTINUE_THRESHOLD);
     }
-
-    return battery_ok;
 }
