diff --git a/lineage/lib/main/java/org/lineageos/platform/internal/health/ChargingControlController.java b/lineage/lib/main/java/org/lineageos/platform/internal/health/ChargingControlController.java index 5164b2d1..349eefb9 100644 --- a/lineage/lib/main/java/org/lineageos/platform/internal/health/ChargingControlController.java +++ b/lineage/lib/main/java/org/lineageos/platform/internal/health/ChargingControlController.java @@ -45,6 +45,7 @@ public class ChargingControlController extends LineageHealthFeature { private ChargingControlNotification mChargingNotification; private LineageHealthBatteryBroadcastReceiver mBattReceiver; private BroadcastReceiver mAlarmBroadcastReceiver; + private boolean mIsEnabled = false; // Defaults private boolean mDefaultEnabled = false; @@ -234,6 +235,43 @@ public class ChargingControlController extends LineageHealthFeature { && setStartTime(mDefaultStartTime) && setTargetTime(mDefaultTargetTime); } + private void updateBatteryInfo(Intent intent) { + int battStatus = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1); + int battPlugged = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0); + + if (battStatus == BatteryManager.BATTERY_STATUS_FULL) { + mIsControlCancelledOnce = false; + } + + if (mCurrentProvider.requiresBatteryLevelMonitoring()) { + mIsPowerConnected = true; + } else { + mIsPowerConnected = + battPlugged != 0 || (battStatus != BatteryManager.BATTERY_STATUS_DISCHARGING && + battStatus != BatteryManager.BATTERY_STATUS_UNKNOWN); + } + + int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); + int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1); + if (level == -1 || scale == -1) { + return; + } + + mBatteryPct = level * 100 / (float) scale; + + Log.i(TAG, "mIsPowerConnected: " + mIsPowerConnected + ", mBatteryPct: " + mBatteryPct); + } + + private void updateBatteryInfo() { + IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); + Intent batteryStatus = mContext.registerReceiver(null, ifilter); + if (batteryStatus == null) { + Log.e(TAG, "batteryStatus is NULL!"); + return; + } + updateBatteryInfo(batteryStatus); + } + @Override public void onStart() { if (mChargingControl == null) { @@ -243,46 +281,6 @@ public class ChargingControlController extends LineageHealthFeature { // Register setting observer registerSettings(MODE_URI, LIMIT_URI, ENABLED_URI, START_TIME_URI, TARGET_TIME_URI); - // For devices that do not support bypass, we can only always listen to battery change - // because we can't distinguish between "unplugged" and "plugged in but not charging". - if (mCurrentProvider.requiresBatteryLevelMonitoring()) { - mIsPowerConnected = true; - onPowerStatus(true); - handleSettingChange(); - return; - } - - // Start monitor battery status when power connected - IntentFilter connectedFilter = new IntentFilter(Intent.ACTION_POWER_CONNECTED); - mContext.registerReceiver(new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - Log.i(TAG, "Power connected, start monitoring battery"); - mIsPowerConnected = true; - onPowerStatus(true); - } - }, connectedFilter); - - // Stop monitor battery status when power disconnected - IntentFilter disconnectedFilter = new IntentFilter(Intent.ACTION_POWER_DISCONNECTED); - mContext.registerReceiver(new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - Log.i(TAG, "Power disconnected, stop monitoring battery"); - mIsPowerConnected = false; - onPowerStatus(false); - } - }, disconnectedFilter); - - // Initial monitor - IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); - Intent batteryStatus = mContext.registerReceiver(null, ifilter); - mIsPowerConnected = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1) != 0; - if (mIsPowerConnected) { - onPowerConnected(); - } - - // Restore settings handleSettingChange(); } @@ -476,6 +474,27 @@ public class ChargingControlController extends LineageHealthFeature { private void handleSettingChange() { int mode = getMode(); + if (mIsEnabled != isEnabled()) { + mIsEnabled = isEnabled(); + + if (mIsEnabled) { + if (mBattReceiver == null) { + mBattReceiver = new LineageHealthBatteryBroadcastReceiver(); + } else { + mContext.unregisterReceiver(mBattReceiver); + } + IntentFilter battFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); + mContext.registerReceiver(mBattReceiver, battFilter); + Log.i(TAG, "Enabled charging control, start monitoring battery"); + } else { + if (mBattReceiver != null) { + mContext.unregisterReceiver(mBattReceiver); + mBattReceiver = null; + } + Log.i(TAG, "Disabled charging control, stop monitoring battery"); + } + } + if (!isProvideSupportCCMode(mode)) { Log.e(TAG, "Current provider does not support mode: " + mode + ", setting to default mode"); @@ -485,6 +504,9 @@ public class ChargingControlController extends LineageHealthFeature { // Reset internal states resetInternalState(); + // Update battery info + updateBatteryInfo(); + // Update based on those values updateChargeControl(); } @@ -505,6 +527,7 @@ public class ChargingControlController extends LineageHealthFeature { pw.println(" TargetTime: " + getTargetTime()); pw.println(); pw.println("ChargingControlController State:"); + pw.println(" mIsEnabled: " + mIsEnabled); pw.println(" mBatteryPct: " + mBatteryPct); pw.println(" mIsPowerConnected: " + mIsPowerConnected); pw.println(" mIsNotificationPosted: " + mChargingNotification.isPosted()); @@ -518,13 +541,7 @@ public class ChargingControlController extends LineageHealthFeature { private class LineageHealthBatteryBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { - int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); - int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1); - if (level == -1 || scale == -1) { - return; - } - - mBatteryPct = level * 100 / (float) scale; + updateBatteryInfo(intent); updateChargeControl(); } }