Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3a582255 authored by android-build-team Robot's avatar android-build-team Robot
Browse files

Snap for 7349343 from 048fc0ae to sc-release

Change-Id: I86ca2be9f722d2ca6666875cb4074b51746ef6e8
parents b1c63889 048fc0ae
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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",
+18 −8
Original line number Diff line number Diff line
@@ -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();
    }
}
+85 −10
Original line number Diff line number Diff line
@@ -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:
@@ -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;
@@ -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);
@@ -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);
            }
        }

@@ -342,6 +379,7 @@ public class AppStateTrackerImpl implements AppStateTracker {
        private void onForceAllAppsStandbyChanged(AppStateTrackerImpl sender) {
            updateAllJobs();
            updateAllAlarms();
            updateForcedAppStandbyForAllApps();
        }

        /**
@@ -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() {
        }

        /**
@@ -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;
            }
        }
@@ -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() {
@@ -601,6 +672,7 @@ public class AppStateTrackerImpl implements AppStateTracker {
            return;
        }
        mForceAllAppsStandby = enable;
        updateForcedAppStandbyUidPackagesLocked();

        mHandler.notifyForceAllAppsStandbyChanged();
    }
@@ -645,6 +717,7 @@ public class AppStateTrackerImpl implements AppStateTracker {
        } else {
            mRunAnyRestrictedPackages.removeAt(index);
        }
        updateForcedAppStandbyUidPackagesLocked();
        return true;
    }

@@ -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);
@@ -966,6 +1040,7 @@ public class AppStateTrackerImpl implements AppStateTracker {
                    mRunAnyRestrictedPackages.removeAt(i);
                }
            }
            updateForcedAppStandbyUidPackagesLocked();
            cleanUpArrayForUser(mActiveUids, removedUserId);
            mExemptedBucketPackages.remove(removedUserId);
        }
+8 −8
Original line number Diff line number Diff line
@@ -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())));
@@ -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);
+4 −1
Original line number Diff line number Diff line
@@ -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
@@ -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