Loading services/core/java/com/android/server/BatteryService.java +57 −5 Original line number Diff line number Diff line Loading @@ -238,13 +238,16 @@ public final class BatteryService extends SystemService { final SomeArgs args = (SomeArgs) msg.obj; final Context context; final Intent intent; final boolean forceUpdate; try { context = (Context) args.arg1; intent = (Intent) args.arg2; forceUpdate = (Boolean) args.arg3; } finally { args.recycle(); } broadcastBatteryChangedIntent(context, intent, BATTERY_CHANGED_OPTIONS); broadcastBatteryChangedIntent(context, intent, BATTERY_CHANGED_OPTIONS, forceUpdate); return true; } case MSG_BROADCAST_POWER_CONNECTION_CHANGED: { Loading Loading @@ -798,7 +801,7 @@ public final class BatteryService extends SystemService { // We are doing this after sending the above broadcasts, so anything processing // them will get the new sequence number at that point. (See for example how testing // of JobScheduler's BatteryController works.) sendBatteryChangedIntentLocked(); sendBatteryChangedIntentLocked(force); if (mLastBatteryLevel != mHealthInfo.batteryLevel || mLastPlugType != mPlugType) { sendBatteryLevelChangedIntentLocked(); } Loading Loading @@ -829,7 +832,7 @@ public final class BatteryService extends SystemService { } } private void sendBatteryChangedIntentLocked() { private void sendBatteryChangedIntentLocked(boolean forceUpdate) { // Pack up the values and broadcast them to everyone final Intent intent = new Intent(Intent.ACTION_BATTERY_CHANGED); intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY Loading Loading @@ -869,15 +872,17 @@ public final class BatteryService extends SystemService { final SomeArgs args = SomeArgs.obtain(); args.arg1 = mContext; args.arg2 = intent; args.arg3 = forceUpdate; mHandler.obtainMessage(MSG_BROADCAST_BATTERY_CHANGED, args).sendToTarget(); } else { mHandler.post(() -> broadcastBatteryChangedIntent(mContext, intent, BATTERY_CHANGED_OPTIONS)); intent, BATTERY_CHANGED_OPTIONS, forceUpdate)); } } private static void broadcastBatteryChangedIntent(Context context, Intent intent, Bundle options) { Bundle options, boolean forceUpdate) { traceBatteryChangedBroadcastEvent(intent, forceUpdate); // TODO (293959093): It is important that SystemUI receives this broadcast as soon as // possible. Ideally, it should be using binder callbacks but until then, dispatch this // as a foreground broadcast to SystemUI. Loading @@ -895,6 +900,53 @@ public final class BatteryService extends SystemService { AppOpsManager.OP_NONE, options, UserHandle.USER_ALL); } private static void traceBatteryChangedBroadcastEvent(Intent intent, boolean forceUpdate) { if (!com.android.server.flags.Flags.traceBatteryChangedBroadcastEvent()) { return; } if (!Trace.isTagEnabled(Trace.TRACE_TAG_SYSTEM_SERVER)) return; final StringBuilder builder = new StringBuilder(); builder.append("broadcastBatteryChanged; "); builder.append("force="); builder.append(forceUpdate); builder.append(",seq="); builder.append(intent.getIntExtra( BatteryManager.EXTRA_SEQUENCE, -1)); builder.append(",s="); builder.append(intent.getIntExtra( BatteryManager.EXTRA_STATUS, -1)); builder.append(",h="); builder.append(intent.getIntExtra( BatteryManager.EXTRA_HEALTH, -1)); builder.append(",p="); builder.append(intent.getBooleanExtra( BatteryManager.EXTRA_PRESENT, false)); builder.append(",l="); builder.append(intent.getIntExtra( BatteryManager.EXTRA_LEVEL, -1)); builder.append(",bl="); builder.append(intent.getBooleanExtra( BatteryManager.EXTRA_BATTERY_LOW, false)); builder.append(",sc="); builder.append(intent.getIntExtra( BatteryManager.EXTRA_SCALE, -1)); builder.append(",pt="); builder.append(intent.getIntExtra( BatteryManager.EXTRA_PLUGGED, -1)); builder.append(",v="); builder.append(intent.getIntExtra( BatteryManager.EXTRA_VOLTAGE, -1)); builder.append(",t="); builder.append(intent.getIntExtra( BatteryManager.EXTRA_TEMPERATURE, -1)); builder.append(",tech="); builder.append(intent.getStringExtra( BatteryManager.EXTRA_TECHNOLOGY)); builder.append(",invc="); builder.append(intent.getIntExtra( BatteryManager.EXTRA_INVALID_CHARGER, -1)); builder.append(",mcc="); builder.append(intent.getIntExtra( BatteryManager.EXTRA_MAX_CHARGING_CURRENT, -1)); builder.append(",mcv="); builder.append(intent.getIntExtra( BatteryManager.EXTRA_MAX_CHARGING_VOLTAGE, -1)); builder.append(",chc="); builder.append(intent.getIntExtra( BatteryManager.EXTRA_CHARGE_COUNTER, -1)); builder.append(",cc="); builder.append(intent.getIntExtra( BatteryManager.EXTRA_CYCLE_COUNT, -1)); builder.append(",chs="); builder.append(intent.getIntExtra( BatteryManager.EXTRA_CHARGING_STATUS, -1)); Trace.instant(Trace.TRACE_TAG_SYSTEM_SERVER, builder.toString()); } private void sendBatteryLevelChangedIntentLocked() { Bundle event = new Bundle(); long now = SystemClock.elapsedRealtime(); Loading services/core/java/com/android/server/flags/services.aconfig +11 −0 Original line number Diff line number Diff line Loading @@ -56,3 +56,14 @@ flag { purpose: PURPOSE_BUGFIX } } flag { namespace: "backstage_power" name: "trace_battery_changed_broadcast_event" description: "Add tracing to record battery changed broadcast event" bug: "365410144" is_fixed_read_only: true metadata { purpose: PURPOSE_BUGFIX } } Loading
services/core/java/com/android/server/BatteryService.java +57 −5 Original line number Diff line number Diff line Loading @@ -238,13 +238,16 @@ public final class BatteryService extends SystemService { final SomeArgs args = (SomeArgs) msg.obj; final Context context; final Intent intent; final boolean forceUpdate; try { context = (Context) args.arg1; intent = (Intent) args.arg2; forceUpdate = (Boolean) args.arg3; } finally { args.recycle(); } broadcastBatteryChangedIntent(context, intent, BATTERY_CHANGED_OPTIONS); broadcastBatteryChangedIntent(context, intent, BATTERY_CHANGED_OPTIONS, forceUpdate); return true; } case MSG_BROADCAST_POWER_CONNECTION_CHANGED: { Loading Loading @@ -798,7 +801,7 @@ public final class BatteryService extends SystemService { // We are doing this after sending the above broadcasts, so anything processing // them will get the new sequence number at that point. (See for example how testing // of JobScheduler's BatteryController works.) sendBatteryChangedIntentLocked(); sendBatteryChangedIntentLocked(force); if (mLastBatteryLevel != mHealthInfo.batteryLevel || mLastPlugType != mPlugType) { sendBatteryLevelChangedIntentLocked(); } Loading Loading @@ -829,7 +832,7 @@ public final class BatteryService extends SystemService { } } private void sendBatteryChangedIntentLocked() { private void sendBatteryChangedIntentLocked(boolean forceUpdate) { // Pack up the values and broadcast them to everyone final Intent intent = new Intent(Intent.ACTION_BATTERY_CHANGED); intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY Loading Loading @@ -869,15 +872,17 @@ public final class BatteryService extends SystemService { final SomeArgs args = SomeArgs.obtain(); args.arg1 = mContext; args.arg2 = intent; args.arg3 = forceUpdate; mHandler.obtainMessage(MSG_BROADCAST_BATTERY_CHANGED, args).sendToTarget(); } else { mHandler.post(() -> broadcastBatteryChangedIntent(mContext, intent, BATTERY_CHANGED_OPTIONS)); intent, BATTERY_CHANGED_OPTIONS, forceUpdate)); } } private static void broadcastBatteryChangedIntent(Context context, Intent intent, Bundle options) { Bundle options, boolean forceUpdate) { traceBatteryChangedBroadcastEvent(intent, forceUpdate); // TODO (293959093): It is important that SystemUI receives this broadcast as soon as // possible. Ideally, it should be using binder callbacks but until then, dispatch this // as a foreground broadcast to SystemUI. Loading @@ -895,6 +900,53 @@ public final class BatteryService extends SystemService { AppOpsManager.OP_NONE, options, UserHandle.USER_ALL); } private static void traceBatteryChangedBroadcastEvent(Intent intent, boolean forceUpdate) { if (!com.android.server.flags.Flags.traceBatteryChangedBroadcastEvent()) { return; } if (!Trace.isTagEnabled(Trace.TRACE_TAG_SYSTEM_SERVER)) return; final StringBuilder builder = new StringBuilder(); builder.append("broadcastBatteryChanged; "); builder.append("force="); builder.append(forceUpdate); builder.append(",seq="); builder.append(intent.getIntExtra( BatteryManager.EXTRA_SEQUENCE, -1)); builder.append(",s="); builder.append(intent.getIntExtra( BatteryManager.EXTRA_STATUS, -1)); builder.append(",h="); builder.append(intent.getIntExtra( BatteryManager.EXTRA_HEALTH, -1)); builder.append(",p="); builder.append(intent.getBooleanExtra( BatteryManager.EXTRA_PRESENT, false)); builder.append(",l="); builder.append(intent.getIntExtra( BatteryManager.EXTRA_LEVEL, -1)); builder.append(",bl="); builder.append(intent.getBooleanExtra( BatteryManager.EXTRA_BATTERY_LOW, false)); builder.append(",sc="); builder.append(intent.getIntExtra( BatteryManager.EXTRA_SCALE, -1)); builder.append(",pt="); builder.append(intent.getIntExtra( BatteryManager.EXTRA_PLUGGED, -1)); builder.append(",v="); builder.append(intent.getIntExtra( BatteryManager.EXTRA_VOLTAGE, -1)); builder.append(",t="); builder.append(intent.getIntExtra( BatteryManager.EXTRA_TEMPERATURE, -1)); builder.append(",tech="); builder.append(intent.getStringExtra( BatteryManager.EXTRA_TECHNOLOGY)); builder.append(",invc="); builder.append(intent.getIntExtra( BatteryManager.EXTRA_INVALID_CHARGER, -1)); builder.append(",mcc="); builder.append(intent.getIntExtra( BatteryManager.EXTRA_MAX_CHARGING_CURRENT, -1)); builder.append(",mcv="); builder.append(intent.getIntExtra( BatteryManager.EXTRA_MAX_CHARGING_VOLTAGE, -1)); builder.append(",chc="); builder.append(intent.getIntExtra( BatteryManager.EXTRA_CHARGE_COUNTER, -1)); builder.append(",cc="); builder.append(intent.getIntExtra( BatteryManager.EXTRA_CYCLE_COUNT, -1)); builder.append(",chs="); builder.append(intent.getIntExtra( BatteryManager.EXTRA_CHARGING_STATUS, -1)); Trace.instant(Trace.TRACE_TAG_SYSTEM_SERVER, builder.toString()); } private void sendBatteryLevelChangedIntentLocked() { Bundle event = new Bundle(); long now = SystemClock.elapsedRealtime(); Loading
services/core/java/com/android/server/flags/services.aconfig +11 −0 Original line number Diff line number Diff line Loading @@ -56,3 +56,14 @@ flag { purpose: PURPOSE_BUGFIX } } flag { namespace: "backstage_power" name: "trace_battery_changed_broadcast_event" description: "Add tracing to record battery changed broadcast event" bug: "365410144" is_fixed_read_only: true metadata { purpose: PURPOSE_BUGFIX } }