Loading Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -225,6 +225,7 @@ java_library { "apex_aidl_interface-java", "framework-protos", "updatable-driver-protos", "ota_metadata_proto_java", "android.hidl.base-V1.0-java", "android.hardware.cas-V1.0-java", "android.hardware.cas-V1.1-java", Loading apex/jobscheduler/framework/java/com/android/server/AppStateTracker.java +18 −8 Original line number Diff line number Diff line Loading @@ -25,19 +25,29 @@ public interface AppStateTracker { String TAG = "AppStateTracker"; /** * Register a {@link ServiceStateListener} to listen for forced-app-standby changes that should * affect services. * Register a {@link ForcedAppStandbyListener} to listen for forced-app-standby changes that * should affect services etc. */ void addServiceStateListener(@NonNull ServiceStateListener listener); void addForcedAppStandbyListener(@NonNull ForcedAppStandbyListener listener); /** * A listener to listen to forced-app-standby changes that should affect services. * @return {code true} if the given UID/package has been in forced app standby mode. */ interface ServiceStateListener { boolean isAppInForcedAppStandby(int uid, @NonNull String packageName); /** * A listener to listen to forced-app-standby changes that should affect services etc. */ interface ForcedAppStandbyListener { /** * Called when an app goes in/out of forced app standby. */ void updateForceAppStandbyForUidPackage(int uid, String packageName, boolean standby); /** * Called when an app goes into forced app standby and its foreground * services need to be removed from that state. * Called when all apps' forced-app-standby states need to be re-evaluated, due to * enable/disable certain feature flags. */ void stopForegroundServicesForUidPackage(int uid, String packageName); void updateForcedAppStandbyForAllApps(); } } apex/jobscheduler/service/java/com/android/server/AppStateTrackerImpl.java +85 −10 Original line number Diff line number Diff line Loading @@ -60,8 +60,10 @@ import com.android.server.usage.AppStandbyInternal.AppIdleStateChangeListener; import java.io.PrintWriter; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Objects; import java.util.Set; /** * Class to keep track of the information related to "force app standby", which includes: Loading Loading @@ -160,16 +162,46 @@ public class AppStateTrackerImpl implements AppStateTracker { @GuardedBy("mLock") boolean mForcedAppStandbyEnabled; /** * A lock-free set of (uid, packageName) pairs in forced app standby mode. * * <p> * It's bascially shadowing the {@link #mRunAnyRestrictedPackages} together with * the {@link #mForcedAppStandbyEnabled} and the {@link #mForceAllAppsStandby} - mutations on * them would result in copy-on-write. * * Note: when {@link #mForcedAppStandbyEnabled} is {@code false}, it'll be set to an empty set. * when {@link #mForceAllAppsStandby} is {@code true}, it'll be set to null; * </p> */ volatile Set<Pair<Integer, String>> mForcedAppStandbyUidPackages = Collections.emptySet(); @Override public void addServiceStateListener(@NonNull ServiceStateListener listener) { public void addForcedAppStandbyListener(@NonNull ForcedAppStandbyListener listener) { addListener(new Listener() { @Override public void stopForegroundServicesForUidPackage(int uid, String packageName) { listener.stopForegroundServicesForUidPackage(uid, packageName); public void updateForceAppStandbyForUidPackage(int uid, String packageName, boolean standby) { listener.updateForceAppStandbyForUidPackage(uid, packageName, standby); } @Override public void updateForcedAppStandbyForAllApps() { listener.updateForcedAppStandbyForAllApps(); } }); } @Override public boolean isAppInForcedAppStandby(int uid, @NonNull String packageName) { final Set<Pair<Integer, String>> fasUidPkgs = mForcedAppStandbyUidPackages; if (fasUidPkgs == null) { // Meaning the mForceAllAppsStandby is true. return true; } return fasUidPkgs.contains(Pair.create(uid, packageName)); } interface Stats { int UID_FG_STATE_CHANGED = 0; int UID_ACTIVE_STATE_CHANGED = 1; Loading Loading @@ -233,6 +265,7 @@ public class AppStateTrackerImpl implements AppStateTracker { return; } mForcedAppStandbyEnabled = enabled; updateForcedAppStandbyUidPackagesLocked(); if (DEBUG) { Slog.d(TAG, "Forced app standby feature flag changed: " + mForcedAppStandbyEnabled); Loading Loading @@ -277,7 +310,11 @@ public class AppStateTrackerImpl implements AppStateTracker { if (!sender.isRunAnyInBackgroundAppOpsAllowed(uid, packageName)) { Slog.v(TAG, "Package " + packageName + "/" + uid + " toggled into fg service restriction"); stopForegroundServicesForUidPackage(uid, packageName); updateForceAppStandbyForUidPackage(uid, packageName, true); } else { Slog.v(TAG, "Package " + packageName + "/" + uid + " toggled out of fg service restriction"); updateForceAppStandbyForUidPackage(uid, packageName, false); } } Loading Loading @@ -342,6 +379,7 @@ public class AppStateTrackerImpl implements AppStateTracker { private void onForceAllAppsStandbyChanged(AppStateTrackerImpl sender) { updateAllJobs(); updateAllAlarms(); updateForcedAppStandbyForAllApps(); } /** Loading @@ -366,10 +404,17 @@ public class AppStateTrackerImpl implements AppStateTracker { } /** * Called when an app goes into forced app standby and its foreground * services need to be removed from that state. * Called when an app goes in/out of forced app standby. */ public void stopForegroundServicesForUidPackage(int uid, String packageName) { public void updateForceAppStandbyForUidPackage(int uid, String packageName, boolean standby) { } /** * Called when all apps' forced-app-standby states need to be re-evaluated due to changes of * feature flags such as {@link #mForcedAppStandbyEnabled} or {@link #mForceAllAppsStandby}. */ public void updateForcedAppStandbyForAllApps() { } /** Loading Loading @@ -438,10 +483,13 @@ public class AppStateTrackerImpl implements AppStateTracker { final int uid = intent.getIntExtra(Intent.EXTRA_UID, -1); // No need to notify for state change as all the alarms and jobs should be // removed too. synchronized (mLock) { mExemptedBucketPackages.remove(userId, pkgName); mRunAnyRestrictedPackages.remove(Pair.create(uid, pkgName)); updateForcedAppStandbyUidPackagesLocked(); mActiveUids.delete(uid); } } break; } } Loading Loading @@ -580,6 +628,29 @@ public class AppStateTrackerImpl implements AppStateTracker { } } } updateForcedAppStandbyUidPackagesLocked(); } /** * Update the {@link #mForcedAppStandbyUidPackages} upon mutations on * {@link #mRunAnyRestrictedPackages}, {@link #mForcedAppStandbyEnabled} or * {@link #mForceAllAppsStandby}. */ @GuardedBy("mLock") private void updateForcedAppStandbyUidPackagesLocked() { if (!mForcedAppStandbyEnabled) { mForcedAppStandbyUidPackages = Collections.emptySet(); return; } if (mForceAllAppsStandby) { mForcedAppStandbyUidPackages = null; return; } Set<Pair<Integer, String>> fasUidPkgs = new ArraySet<>(); for (int i = 0, size = mRunAnyRestrictedPackages.size(); i < size; i++) { fasUidPkgs.add(mRunAnyRestrictedPackages.valueAt(i)); } mForcedAppStandbyUidPackages = Collections.unmodifiableSet(fasUidPkgs); } private void updateForceAllAppStandbyState() { Loading @@ -601,6 +672,7 @@ public class AppStateTrackerImpl implements AppStateTracker { return; } mForceAllAppsStandby = enable; updateForcedAppStandbyUidPackagesLocked(); mHandler.notifyForceAllAppsStandbyChanged(); } Loading Loading @@ -645,6 +717,7 @@ public class AppStateTrackerImpl implements AppStateTracker { } else { mRunAnyRestrictedPackages.removeAt(index); } updateForcedAppStandbyUidPackagesLocked(); return true; } Loading Loading @@ -896,6 +969,7 @@ public class AppStateTrackerImpl implements AppStateTracker { if (unblockAlarms) { l.unblockAllUnrestrictedAlarms(); } l.updateForcedAppStandbyForAllApps(); } mStatLogger.logDurationStat( Stats.FORCE_APP_STANDBY_FEATURE_FLAG_CHANGED, start); Loading Loading @@ -966,6 +1040,7 @@ public class AppStateTrackerImpl implements AppStateTracker { mRunAnyRestrictedPackages.removeAt(i); } } updateForcedAppStandbyUidPackagesLocked(); cleanUpArrayForUser(mActiveUids, removedUserId); mExemptedBucketPackages.remove(removedUserId); } Loading apex/jobscheduler/service/java/com/android/server/job/JobStore.java +8 −8 Original line number Diff line number Diff line Loading @@ -554,7 +554,7 @@ public final class JobStore { out.attribute(null, "net-capabilities", Long.toString( BitUtils.packBits(network.getCapabilities()))); out.attribute(null, "net-unwanted-capabilities", Long.toString( BitUtils.packBits(network.getUnwantedCapabilities()))); BitUtils.packBits(network.getForbiddenCapabilities()))); out.attribute(null, "net-transport-types", Long.toString( BitUtils.packBits(network.getTransportTypes()))); Loading Loading @@ -977,22 +977,22 @@ public final class JobStore { String val; final String netCapabilities = parser.getAttributeValue(null, "net-capabilities"); final String netUnwantedCapabilities = parser.getAttributeValue( final String netforbiddenCapabilities = parser.getAttributeValue( null, "net-unwanted-capabilities"); final String netTransportTypes = parser.getAttributeValue(null, "net-transport-types"); if (netCapabilities != null && netTransportTypes != null) { final NetworkRequest.Builder builder = new NetworkRequest.Builder() .clearCapabilities(); final long unwantedCapabilities = netUnwantedCapabilities != null ? Long.parseLong(netUnwantedCapabilities) : BitUtils.packBits(builder.build().getUnwantedCapabilities()); final long forbiddenCapabilities = netforbiddenCapabilities != null ? Long.parseLong(netforbiddenCapabilities) : BitUtils.packBits(builder.build().getForbiddenCapabilities()); // We're okay throwing NFE here; caught by caller for (int capability : BitUtils.unpackBits(Long.parseLong(netCapabilities))) { builder.addCapability(capability); } for (int unwantedCapability : BitUtils.unpackBits( Long.parseLong(netUnwantedCapabilities))) { builder.addUnwantedCapability(unwantedCapability); for (int forbiddenCapability : BitUtils.unpackBits( Long.parseLong(netforbiddenCapabilities))) { builder.addForbiddenCapability(forbiddenCapability); } for (int transport : BitUtils.unpackBits(Long.parseLong(netTransportTypes))) { builder.addTransportType(transport); Loading core/api/system-current.txt +4 −1 Original line number Diff line number Diff line Loading @@ -1528,6 +1528,9 @@ package android.app.search { method public boolean shouldHide(); method public void writeToParcel(@NonNull android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator<android.app.search.SearchTarget> CREATOR; field public static final String LAYOUT_TYPE_ICON = "icon"; field public static final String LAYOUT_TYPE_ICON_ROW = "icon_row"; field public static final String LAYOUT_TYPE_SHORT_ICON_ROW = "short_icon_row"; field public static final int RESULT_TYPE_APPLICATION = 1; // 0x1 field public static final int RESULT_TYPE_SHORTCUT = 2; // 0x2 field public static final int RESULT_TYPE_SLICE = 4; // 0x4 Loading @@ -1541,7 +1544,7 @@ package android.app.search { method @NonNull public android.app.search.SearchTarget.Builder setExtras(@NonNull android.os.Bundle); method @NonNull public android.app.search.SearchTarget.Builder setPackageName(@NonNull String); method @NonNull public android.app.search.SearchTarget.Builder setParentId(@NonNull String); method @NonNull public android.app.search.SearchTarget.Builder setScore(float); method @NonNull public android.app.search.SearchTarget.Builder setScore(@FloatRange(from=0.0f, to=1.0f) float); method @NonNull public android.app.search.SearchTarget.Builder setSearchAction(@Nullable android.app.search.SearchAction); method @NonNull public android.app.search.SearchTarget.Builder setShortcutInfo(@NonNull android.content.pm.ShortcutInfo); method @NonNull public android.app.search.SearchTarget.Builder setShouldHide(boolean); Loading
Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -225,6 +225,7 @@ java_library { "apex_aidl_interface-java", "framework-protos", "updatable-driver-protos", "ota_metadata_proto_java", "android.hidl.base-V1.0-java", "android.hardware.cas-V1.0-java", "android.hardware.cas-V1.1-java", Loading
apex/jobscheduler/framework/java/com/android/server/AppStateTracker.java +18 −8 Original line number Diff line number Diff line Loading @@ -25,19 +25,29 @@ public interface AppStateTracker { String TAG = "AppStateTracker"; /** * Register a {@link ServiceStateListener} to listen for forced-app-standby changes that should * affect services. * Register a {@link ForcedAppStandbyListener} to listen for forced-app-standby changes that * should affect services etc. */ void addServiceStateListener(@NonNull ServiceStateListener listener); void addForcedAppStandbyListener(@NonNull ForcedAppStandbyListener listener); /** * A listener to listen to forced-app-standby changes that should affect services. * @return {code true} if the given UID/package has been in forced app standby mode. */ interface ServiceStateListener { boolean isAppInForcedAppStandby(int uid, @NonNull String packageName); /** * A listener to listen to forced-app-standby changes that should affect services etc. */ interface ForcedAppStandbyListener { /** * Called when an app goes in/out of forced app standby. */ void updateForceAppStandbyForUidPackage(int uid, String packageName, boolean standby); /** * Called when an app goes into forced app standby and its foreground * services need to be removed from that state. * Called when all apps' forced-app-standby states need to be re-evaluated, due to * enable/disable certain feature flags. */ void stopForegroundServicesForUidPackage(int uid, String packageName); void updateForcedAppStandbyForAllApps(); } }
apex/jobscheduler/service/java/com/android/server/AppStateTrackerImpl.java +85 −10 Original line number Diff line number Diff line Loading @@ -60,8 +60,10 @@ import com.android.server.usage.AppStandbyInternal.AppIdleStateChangeListener; import java.io.PrintWriter; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Objects; import java.util.Set; /** * Class to keep track of the information related to "force app standby", which includes: Loading Loading @@ -160,16 +162,46 @@ public class AppStateTrackerImpl implements AppStateTracker { @GuardedBy("mLock") boolean mForcedAppStandbyEnabled; /** * A lock-free set of (uid, packageName) pairs in forced app standby mode. * * <p> * It's bascially shadowing the {@link #mRunAnyRestrictedPackages} together with * the {@link #mForcedAppStandbyEnabled} and the {@link #mForceAllAppsStandby} - mutations on * them would result in copy-on-write. * * Note: when {@link #mForcedAppStandbyEnabled} is {@code false}, it'll be set to an empty set. * when {@link #mForceAllAppsStandby} is {@code true}, it'll be set to null; * </p> */ volatile Set<Pair<Integer, String>> mForcedAppStandbyUidPackages = Collections.emptySet(); @Override public void addServiceStateListener(@NonNull ServiceStateListener listener) { public void addForcedAppStandbyListener(@NonNull ForcedAppStandbyListener listener) { addListener(new Listener() { @Override public void stopForegroundServicesForUidPackage(int uid, String packageName) { listener.stopForegroundServicesForUidPackage(uid, packageName); public void updateForceAppStandbyForUidPackage(int uid, String packageName, boolean standby) { listener.updateForceAppStandbyForUidPackage(uid, packageName, standby); } @Override public void updateForcedAppStandbyForAllApps() { listener.updateForcedAppStandbyForAllApps(); } }); } @Override public boolean isAppInForcedAppStandby(int uid, @NonNull String packageName) { final Set<Pair<Integer, String>> fasUidPkgs = mForcedAppStandbyUidPackages; if (fasUidPkgs == null) { // Meaning the mForceAllAppsStandby is true. return true; } return fasUidPkgs.contains(Pair.create(uid, packageName)); } interface Stats { int UID_FG_STATE_CHANGED = 0; int UID_ACTIVE_STATE_CHANGED = 1; Loading Loading @@ -233,6 +265,7 @@ public class AppStateTrackerImpl implements AppStateTracker { return; } mForcedAppStandbyEnabled = enabled; updateForcedAppStandbyUidPackagesLocked(); if (DEBUG) { Slog.d(TAG, "Forced app standby feature flag changed: " + mForcedAppStandbyEnabled); Loading Loading @@ -277,7 +310,11 @@ public class AppStateTrackerImpl implements AppStateTracker { if (!sender.isRunAnyInBackgroundAppOpsAllowed(uid, packageName)) { Slog.v(TAG, "Package " + packageName + "/" + uid + " toggled into fg service restriction"); stopForegroundServicesForUidPackage(uid, packageName); updateForceAppStandbyForUidPackage(uid, packageName, true); } else { Slog.v(TAG, "Package " + packageName + "/" + uid + " toggled out of fg service restriction"); updateForceAppStandbyForUidPackage(uid, packageName, false); } } Loading Loading @@ -342,6 +379,7 @@ public class AppStateTrackerImpl implements AppStateTracker { private void onForceAllAppsStandbyChanged(AppStateTrackerImpl sender) { updateAllJobs(); updateAllAlarms(); updateForcedAppStandbyForAllApps(); } /** Loading @@ -366,10 +404,17 @@ public class AppStateTrackerImpl implements AppStateTracker { } /** * Called when an app goes into forced app standby and its foreground * services need to be removed from that state. * Called when an app goes in/out of forced app standby. */ public void stopForegroundServicesForUidPackage(int uid, String packageName) { public void updateForceAppStandbyForUidPackage(int uid, String packageName, boolean standby) { } /** * Called when all apps' forced-app-standby states need to be re-evaluated due to changes of * feature flags such as {@link #mForcedAppStandbyEnabled} or {@link #mForceAllAppsStandby}. */ public void updateForcedAppStandbyForAllApps() { } /** Loading Loading @@ -438,10 +483,13 @@ public class AppStateTrackerImpl implements AppStateTracker { final int uid = intent.getIntExtra(Intent.EXTRA_UID, -1); // No need to notify for state change as all the alarms and jobs should be // removed too. synchronized (mLock) { mExemptedBucketPackages.remove(userId, pkgName); mRunAnyRestrictedPackages.remove(Pair.create(uid, pkgName)); updateForcedAppStandbyUidPackagesLocked(); mActiveUids.delete(uid); } } break; } } Loading Loading @@ -580,6 +628,29 @@ public class AppStateTrackerImpl implements AppStateTracker { } } } updateForcedAppStandbyUidPackagesLocked(); } /** * Update the {@link #mForcedAppStandbyUidPackages} upon mutations on * {@link #mRunAnyRestrictedPackages}, {@link #mForcedAppStandbyEnabled} or * {@link #mForceAllAppsStandby}. */ @GuardedBy("mLock") private void updateForcedAppStandbyUidPackagesLocked() { if (!mForcedAppStandbyEnabled) { mForcedAppStandbyUidPackages = Collections.emptySet(); return; } if (mForceAllAppsStandby) { mForcedAppStandbyUidPackages = null; return; } Set<Pair<Integer, String>> fasUidPkgs = new ArraySet<>(); for (int i = 0, size = mRunAnyRestrictedPackages.size(); i < size; i++) { fasUidPkgs.add(mRunAnyRestrictedPackages.valueAt(i)); } mForcedAppStandbyUidPackages = Collections.unmodifiableSet(fasUidPkgs); } private void updateForceAllAppStandbyState() { Loading @@ -601,6 +672,7 @@ public class AppStateTrackerImpl implements AppStateTracker { return; } mForceAllAppsStandby = enable; updateForcedAppStandbyUidPackagesLocked(); mHandler.notifyForceAllAppsStandbyChanged(); } Loading Loading @@ -645,6 +717,7 @@ public class AppStateTrackerImpl implements AppStateTracker { } else { mRunAnyRestrictedPackages.removeAt(index); } updateForcedAppStandbyUidPackagesLocked(); return true; } Loading Loading @@ -896,6 +969,7 @@ public class AppStateTrackerImpl implements AppStateTracker { if (unblockAlarms) { l.unblockAllUnrestrictedAlarms(); } l.updateForcedAppStandbyForAllApps(); } mStatLogger.logDurationStat( Stats.FORCE_APP_STANDBY_FEATURE_FLAG_CHANGED, start); Loading Loading @@ -966,6 +1040,7 @@ public class AppStateTrackerImpl implements AppStateTracker { mRunAnyRestrictedPackages.removeAt(i); } } updateForcedAppStandbyUidPackagesLocked(); cleanUpArrayForUser(mActiveUids, removedUserId); mExemptedBucketPackages.remove(removedUserId); } Loading
apex/jobscheduler/service/java/com/android/server/job/JobStore.java +8 −8 Original line number Diff line number Diff line Loading @@ -554,7 +554,7 @@ public final class JobStore { out.attribute(null, "net-capabilities", Long.toString( BitUtils.packBits(network.getCapabilities()))); out.attribute(null, "net-unwanted-capabilities", Long.toString( BitUtils.packBits(network.getUnwantedCapabilities()))); BitUtils.packBits(network.getForbiddenCapabilities()))); out.attribute(null, "net-transport-types", Long.toString( BitUtils.packBits(network.getTransportTypes()))); Loading Loading @@ -977,22 +977,22 @@ public final class JobStore { String val; final String netCapabilities = parser.getAttributeValue(null, "net-capabilities"); final String netUnwantedCapabilities = parser.getAttributeValue( final String netforbiddenCapabilities = parser.getAttributeValue( null, "net-unwanted-capabilities"); final String netTransportTypes = parser.getAttributeValue(null, "net-transport-types"); if (netCapabilities != null && netTransportTypes != null) { final NetworkRequest.Builder builder = new NetworkRequest.Builder() .clearCapabilities(); final long unwantedCapabilities = netUnwantedCapabilities != null ? Long.parseLong(netUnwantedCapabilities) : BitUtils.packBits(builder.build().getUnwantedCapabilities()); final long forbiddenCapabilities = netforbiddenCapabilities != null ? Long.parseLong(netforbiddenCapabilities) : BitUtils.packBits(builder.build().getForbiddenCapabilities()); // We're okay throwing NFE here; caught by caller for (int capability : BitUtils.unpackBits(Long.parseLong(netCapabilities))) { builder.addCapability(capability); } for (int unwantedCapability : BitUtils.unpackBits( Long.parseLong(netUnwantedCapabilities))) { builder.addUnwantedCapability(unwantedCapability); for (int forbiddenCapability : BitUtils.unpackBits( Long.parseLong(netforbiddenCapabilities))) { builder.addForbiddenCapability(forbiddenCapability); } for (int transport : BitUtils.unpackBits(Long.parseLong(netTransportTypes))) { builder.addTransportType(transport); Loading
core/api/system-current.txt +4 −1 Original line number Diff line number Diff line Loading @@ -1528,6 +1528,9 @@ package android.app.search { method public boolean shouldHide(); method public void writeToParcel(@NonNull android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator<android.app.search.SearchTarget> CREATOR; field public static final String LAYOUT_TYPE_ICON = "icon"; field public static final String LAYOUT_TYPE_ICON_ROW = "icon_row"; field public static final String LAYOUT_TYPE_SHORT_ICON_ROW = "short_icon_row"; field public static final int RESULT_TYPE_APPLICATION = 1; // 0x1 field public static final int RESULT_TYPE_SHORTCUT = 2; // 0x2 field public static final int RESULT_TYPE_SLICE = 4; // 0x4 Loading @@ -1541,7 +1544,7 @@ package android.app.search { method @NonNull public android.app.search.SearchTarget.Builder setExtras(@NonNull android.os.Bundle); method @NonNull public android.app.search.SearchTarget.Builder setPackageName(@NonNull String); method @NonNull public android.app.search.SearchTarget.Builder setParentId(@NonNull String); method @NonNull public android.app.search.SearchTarget.Builder setScore(float); method @NonNull public android.app.search.SearchTarget.Builder setScore(@FloatRange(from=0.0f, to=1.0f) float); method @NonNull public android.app.search.SearchTarget.Builder setSearchAction(@Nullable android.app.search.SearchAction); method @NonNull public android.app.search.SearchTarget.Builder setShortcutInfo(@NonNull android.content.pm.ShortcutInfo); method @NonNull public android.app.search.SearchTarget.Builder setShouldHide(boolean);