diff options
-rw-r--r-- | api/Android.bp | 5 | ||||
-rw-r--r-- | api/StubLibraries.bp | 73 | ||||
-rw-r--r-- | core/api/current.txt | 8 | ||||
-rw-r--r-- | core/java/android/os/BatteryManager.java | 71 | ||||
-rw-r--r-- | services/core/java/com/android/server/BatteryService.java | 8 | ||||
-rw-r--r-- | services/core/java/com/android/server/am/ActivityManagerService.java | 25 |
6 files changed, 177 insertions, 13 deletions
diff --git a/api/Android.bp b/api/Android.bp index 533f9f66434b..3f2316f005bd 100644 --- a/api/Android.bp +++ b/api/Android.bp @@ -102,6 +102,11 @@ combined_apis { "framework-crashrecovery", ], default: [], + }) + select(release_flag("RELEASE_RANGING_STACK"), { + true: [ + "framework-ranging", + ], + default: [], }), system_server_classpath: [ "service-art", diff --git a/api/StubLibraries.bp b/api/StubLibraries.bp index b3a674fbd70e..d1aa23c8ea5f 100644 --- a/api/StubLibraries.bp +++ b/api/StubLibraries.bp @@ -466,6 +466,32 @@ java_library { } java_library { + name: "android-non-updatable.stubs.system_server", + defaults: ["android-non-updatable_defaults"], + static_libs: [ + "android-non-updatable.stubs.system_server.from-source", + ], + product_variables: { + build_from_text_stub: { + static_libs: [ + "android-non-updatable.stubs.system_server.from-text", + ], + exclude_static_libs: [ + "android-non-updatable.stubs.system_server.from-source", + ], + }, + }, +} + +java_library { + name: "android-non-updatable.stubs.exportable.system_server", + defaults: ["android-non-updatable_defaults"], + static_libs: [ + "android-non-updatable.stubs.exportable.system_server.from-source", + ], +} + +java_library { name: "android-non-updatable.stubs.from-source", defaults: [ "android-non-updatable_defaults", @@ -561,6 +587,30 @@ java_library { }, } +java_library { + name: "android-non-updatable.stubs.system_server.from-source", + defaults: [ + "android-non-updatable_defaults", + "android-non-updatable_from_source_defaults", + ], + srcs: [":services-non-updatable-stubs"], + libs: non_updatable_api_deps_on_modules, +} + +java_library { + name: "android-non-updatable.stubs.exportable.system_server.from-source", + defaults: [ + "android-non-updatable_defaults", + "android-non-updatable_from_source_defaults", + "android-non-updatable_exportable_from_source_defaults", + ], + srcs: [":services-non-updatable-stubs{.exportable}"], + libs: non_updatable_api_deps_on_modules, + dist: { + dir: "apistubs/android/system-server", + }, +} + java_defaults { name: "android-non-updatable_from_text_defaults", defaults: ["android-non-updatable-stubs-libs-defaults"], @@ -662,6 +712,25 @@ java_api_library { libs: ["all-modules-system-stubs"], } +java_api_library { + name: "android-non-updatable.stubs.system_server.from-text", + api_surface: "system_server", + api_contributions: [ + "api-stubs-docs-non-updatable.api.contribution", + "system-api-stubs-docs-non-updatable.api.contribution", + "module-lib-api-stubs-docs-non-updatable.api.contribution", + "services-non-updatable-stubs.api.contribution", + ], + defaults: [ + "module-classpath-java-defaults", + "android-non-updatable_everything_from_text_defaults", + ], + + // Use full Android API not just the non-updatable API as the latter is incomplete + // and can result in incorrect behavior. + previous_api: ":android.api.combined.system-server.latest", +} + java_defaults { name: "android_stubs_dists_default", dist: { @@ -813,9 +882,9 @@ java_library { defaults: [ "android.jar_defaults", ], - srcs: [":services-non-updatable-stubs"], installable: false, static_libs: [ + "android-non-updatable.stubs.system_server", "android_module_lib_stubs_current", ], visibility: ["//frameworks/base/services"], @@ -827,9 +896,9 @@ java_library { "android.jar_defaults", "android_stubs_dists_default", ], - srcs: [":services-non-updatable-stubs{.exportable}"], installable: false, static_libs: [ + "android-non-updatable.stubs.exportable.system_server", "android_module_lib_stubs_current_exportable", ], dist: { diff --git a/core/api/current.txt b/core/api/current.txt index 3d42a044ce5d..9881a90ff003 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -32570,6 +32570,13 @@ package android.os { method public boolean isCharging(); field public static final String ACTION_CHARGING = "android.os.action.CHARGING"; field public static final String ACTION_DISCHARGING = "android.os.action.DISCHARGING"; + field @FlaggedApi("android.os.battery_part_status_api") public static final int BATTERY_CAPACITY_LEVEL_CRITICAL = 1; // 0x1 + field @FlaggedApi("android.os.battery_part_status_api") public static final int BATTERY_CAPACITY_LEVEL_FULL = 5; // 0x5 + field @FlaggedApi("android.os.battery_part_status_api") public static final int BATTERY_CAPACITY_LEVEL_HIGH = 4; // 0x4 + field @FlaggedApi("android.os.battery_part_status_api") public static final int BATTERY_CAPACITY_LEVEL_LOW = 2; // 0x2 + field @FlaggedApi("android.os.battery_part_status_api") public static final int BATTERY_CAPACITY_LEVEL_NORMAL = 3; // 0x3 + field @FlaggedApi("android.os.battery_part_status_api") public static final int BATTERY_CAPACITY_LEVEL_UNKNOWN = 0; // 0x0 + field @FlaggedApi("android.os.battery_part_status_api") public static final int BATTERY_CAPACITY_LEVEL_UNSUPPORTED = -1; // 0xffffffff field public static final int BATTERY_HEALTH_COLD = 7; // 0x7 field public static final int BATTERY_HEALTH_DEAD = 4; // 0x4 field public static final int BATTERY_HEALTH_GOOD = 2; // 0x2 @@ -32594,6 +32601,7 @@ package android.os { field public static final int BATTERY_STATUS_NOT_CHARGING = 4; // 0x4 field public static final int BATTERY_STATUS_UNKNOWN = 1; // 0x1 field public static final String EXTRA_BATTERY_LOW = "battery_low"; + field @FlaggedApi("android.os.battery_part_status_api") public static final String EXTRA_CAPACITY_LEVEL = "android.os.extra.CAPACITY_LEVEL"; field public static final String EXTRA_CHARGING_STATUS = "android.os.extra.CHARGING_STATUS"; field public static final String EXTRA_CYCLE_COUNT = "android.os.extra.CYCLE_COUNT"; field public static final String EXTRA_HEALTH = "health"; diff --git a/core/java/android/os/BatteryManager.java b/core/java/android/os/BatteryManager.java index f3efd89d4bc3..8b267bf28c7e 100644 --- a/core/java/android/os/BatteryManager.java +++ b/core/java/android/os/BatteryManager.java @@ -141,6 +141,7 @@ public class BatteryManager { /** * Extra for {@link android.content.Intent#ACTION_BATTERY_CHANGED}: * integer containing the charge counter present in the battery. + * It shows the available battery power in µAh * {@hide} */ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) @@ -166,6 +167,76 @@ public class BatteryManager { public static final String EXTRA_CHARGING_STATUS = "android.os.extra.CHARGING_STATUS"; /** + * Extra for {@link android.content.Intent#ACTION_BATTERY_CHANGED}: + * Int value representing the battery's capacity level. These constants are key indicators of + * battery status and system capabilities, guiding power management decisions for both the + * system and apps: + * {@link #BATTERY_CAPACITY_LEVEL_UNSUPPORTED}: Feature not supported on this device. + * {@link #BATTERY_CAPACITY_LEVEL_UNKNOWN}: Battery status is unavailable or uninitialized. + * {@link #BATTERY_CAPACITY_LEVEL_CRITICAL}: Battery is critically low and the Android + * framework has been notified to schedule a shutdown by this value + * {@link #BATTERY_CAPACITY_LEVEL_LOW}: Android framework must limit background jobs to + * avoid impacting charging speed + * {@link #BATTERY_CAPACITY_LEVEL_NORMAL}: Battery level and charging rates are normal, + * battery temperature is within normal range and adapter power is enough to charge the + * battery at an acceptable rate. Android framework can run light background tasks without + * affecting charging performance severely. + * {@link #BATTERY_CAPACITY_LEVEL_HIGH}: Battery level is high, battery temperature is + * within normal range and adapter power is enough to charge the battery at an acceptable + * rate while running background loads. Android framework can run background tasks without + * affecting charging or battery performance. + * {@link #BATTERY_CAPACITY_LEVEL_FULL}: The battery is full, battery temperature is + * within normal range and adapter power is enough to sustain running background loads. + * Android framework can run background tasks without affecting the battery level or + * battery performance. + */ + + @FlaggedApi(FLAG_BATTERY_PART_STATUS_API) + public static final String EXTRA_CAPACITY_LEVEL = "android.os.extra.CAPACITY_LEVEL"; + + /** + * Battery capacity level is unsupported. @see EXTRA_CAPACITY_LEVEL + */ + @FlaggedApi(FLAG_BATTERY_PART_STATUS_API) + public static final int BATTERY_CAPACITY_LEVEL_UNSUPPORTED = -1; + + /** + * Battery capacity level is unknown. @see EXTRA_CAPACITY_LEVEL + */ + @FlaggedApi(FLAG_BATTERY_PART_STATUS_API) + public static final int BATTERY_CAPACITY_LEVEL_UNKNOWN = 0; + + /** + * Battery capacity level is critical. @see EXTRA_CAPACITY_LEVEL + */ + @FlaggedApi(FLAG_BATTERY_PART_STATUS_API) + public static final int BATTERY_CAPACITY_LEVEL_CRITICAL = 1; + + /** + * Battery capacity level is low. @see EXTRA_CAPACITY_LEVEL + */ + @FlaggedApi(FLAG_BATTERY_PART_STATUS_API) + public static final int BATTERY_CAPACITY_LEVEL_LOW = 2; + + /** + * Battery capacity level is normal. @see EXTRA_CAPACITY_LEVEL + */ + @FlaggedApi(FLAG_BATTERY_PART_STATUS_API) + public static final int BATTERY_CAPACITY_LEVEL_NORMAL = 3; + + /** + * Battery capacity level is high. @see EXTRA_CAPACITY_LEVEL + */ + @FlaggedApi(FLAG_BATTERY_PART_STATUS_API) + public static final int BATTERY_CAPACITY_LEVEL_HIGH = 4; + + /** + * Battery capacity level is full. @see EXTRA_CAPACITY_LEVEL + */ + @FlaggedApi(FLAG_BATTERY_PART_STATUS_API) + public static final int BATTERY_CAPACITY_LEVEL_FULL = 5; + + /** * Extra for {@link android.content.Intent#ACTION_BATTERY_LEVEL_CHANGED}: * Contains list of Bundles representing battery events * @hide diff --git a/services/core/java/com/android/server/BatteryService.java b/services/core/java/com/android/server/BatteryService.java index 2de44820ec05..8891d8eedfa6 100644 --- a/services/core/java/com/android/server/BatteryService.java +++ b/services/core/java/com/android/server/BatteryService.java @@ -158,6 +158,7 @@ public final class BatteryService extends SystemService { private int mLastChargeCounter; private int mLastBatteryCycleCount; private int mLastChargingState; + private int mLastBatteryCapacityLevel; /** * The last seen charging policy. This requires the * {@link android.Manifest.permission#BATTERY_STATS} permission and should therefore not be @@ -555,7 +556,8 @@ public final class BatteryService extends SystemService { || mHealthInfo.batteryChargeCounterUah != mLastChargeCounter || mInvalidCharger != mLastInvalidCharger || mHealthInfo.batteryCycleCount != mLastBatteryCycleCount - || mHealthInfo.chargingState != mLastChargingState)) { + || mHealthInfo.chargingState != mLastChargingState + || mHealthInfo.batteryCapacityLevel != mLastBatteryCapacityLevel)) { if (mPlugType != mLastPlugType) { if (mLastPlugType == BATTERY_PLUGGED_NONE) { @@ -739,6 +741,7 @@ public final class BatteryService extends SystemService { mLastInvalidCharger = mInvalidCharger; mLastBatteryCycleCount = mHealthInfo.batteryCycleCount; mLastChargingState = mHealthInfo.chargingState; + mLastBatteryCapacityLevel = mHealthInfo.batteryCapacityLevel; } } @@ -772,6 +775,7 @@ public final class BatteryService extends SystemService { intent.putExtra(BatteryManager.EXTRA_CHARGE_COUNTER, mHealthInfo.batteryChargeCounterUah); intent.putExtra(BatteryManager.EXTRA_CYCLE_COUNT, mHealthInfo.batteryCycleCount); intent.putExtra(BatteryManager.EXTRA_CHARGING_STATUS, mHealthInfo.chargingState); + intent.putExtra(BatteryManager.EXTRA_CAPACITY_LEVEL, mHealthInfo.batteryCapacityLevel); if (DEBUG) { Slog.d(TAG, "Sending ACTION_BATTERY_CHANGED. scale:" + BATTERY_SCALE + ", info:" + mHealthInfo.toString()); @@ -817,6 +821,7 @@ public final class BatteryService extends SystemService { event.putLong(BatteryManager.EXTRA_EVENT_TIMESTAMP, now); event.putInt(BatteryManager.EXTRA_CYCLE_COUNT, mHealthInfo.batteryCycleCount); event.putInt(BatteryManager.EXTRA_CHARGING_STATUS, mHealthInfo.chargingState); + event.putInt(BatteryManager.EXTRA_CAPACITY_LEVEL, mHealthInfo.batteryCapacityLevel); boolean queueWasEmpty = mBatteryLevelsEventQueue.isEmpty(); mBatteryLevelsEventQueue.add(event); @@ -1254,6 +1259,7 @@ public final class BatteryService extends SystemService { pw.println(" technology: " + mHealthInfo.batteryTechnology); pw.println(" Charging state: " + mHealthInfo.chargingState); pw.println(" Charging policy: " + mHealthInfo.chargingPolicy); + pw.println(" Capacity level: " + mHealthInfo.batteryCapacityLevel); } else { Shell shell = new Shell(); shell.exec(mBinderService, null, fd, null, args, null, new ResultReceiver(null)); diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 995c17635a0a..e0db1f6e1f51 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -749,12 +749,14 @@ public class ActivityManagerService extends IActivityManager.Stub /** * Map userId to its companion app uids. */ + @GuardedBy("mCompanionAppUidsMap") private final Map<Integer, Set<Integer>> mCompanionAppUidsMap = new ArrayMap<>(); /** * The profile owner UIDs. */ - private ArraySet<Integer> mProfileOwnerUids = null; + @GuardedBy("mProfileOwnerUids") + private final ArraySet<Integer> mProfileOwnerUids = new ArraySet<>(); final UserController mUserController; @VisibleForTesting @@ -19604,32 +19606,35 @@ public class ActivityManagerService extends IActivityManager.Stub @Override public void setProfileOwnerUid(ArraySet<Integer> profileOwnerUids) { - synchronized (ActivityManagerService.this) { - mProfileOwnerUids = profileOwnerUids; + synchronized (mProfileOwnerUids) { + mProfileOwnerUids.clear(); + mProfileOwnerUids.addAll(profileOwnerUids); } } @Override public boolean isProfileOwner(int uid) { - synchronized (ActivityManagerService.this) { - return mProfileOwnerUids != null && mProfileOwnerUids.indexOf(uid) >= 0; + synchronized (mProfileOwnerUids) { + return mProfileOwnerUids.indexOf(uid) >= 0; } } @Override public void setCompanionAppUids(int userId, Set<Integer> companionAppUids) { - synchronized (ActivityManagerService.this) { + synchronized (mCompanionAppUidsMap) { mCompanionAppUidsMap.put(userId, companionAppUids); } } @Override public boolean isAssociatedCompanionApp(int userId, int uid) { - final Set<Integer> allUids = mCompanionAppUidsMap.get(userId); - if (allUids == null) { - return false; + synchronized (mCompanionAppUidsMap) { + final Set<Integer> allUids = mCompanionAppUidsMap.get(userId); + if (allUids == null) { + return false; + } + return allUids.contains(uid); } - return allUids.contains(uid); } @Override |