summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Android.bp6
-rw-r--r--core/java/android/net/NetworkScore.java107
-rw-r--r--core/java/com/android/internal/util/FunctionalUtils.java20
-rw-r--r--keystore/java/android/security/KeyChain.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/tiles/UserDetailView.java10
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/UserAvatarView.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcher.java10
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java6
-rw-r--r--services/core/java/android/content/pm/PackageManagerInternal.java27
-rw-r--r--services/core/java/com/android/server/ConnectivityService.java45
-rw-r--r--services/core/java/com/android/server/MemoryPressureUtil.java56
-rw-r--r--services/core/java/com/android/server/SystemServerInitThreadPool.java2
-rw-r--r--services/core/java/com/android/server/Watchdog.java14
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java32
-rw-r--r--services/core/java/com/android/server/am/ProcessRecord.java16
-rw-r--r--services/core/java/com/android/server/connectivity/NetworkRanker.java36
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java168
-rw-r--r--services/core/java/com/android/server/pm/PackageSettingBase.java17
-rw-r--r--services/core/java/com/android/server/pm/UserRestrictionsUtils.java11
-rw-r--r--services/core/java/com/android/server/stats/pull/StatsPullAtomService.java250
-rw-r--r--services/core/java/com/android/server/wm/InputManagerCallback.java3
-rw-r--r--services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java6
-rw-r--r--tests/net/common/java/android/net/NetworkScoreTest.kt40
-rw-r--r--tests/net/java/com/android/server/connectivity/NetworkRankerTest.kt2
-rw-r--r--wifi/Android.bp1
25 files changed, 509 insertions, 387 deletions
diff --git a/Android.bp b/Android.bp
index d63cd4ef0614..7764d25e7f61 100644
--- a/Android.bp
+++ b/Android.bp
@@ -1228,6 +1228,12 @@ java_library {
visibility: ["//frameworks/base/wifi"],
}
+filegroup {
+ name: "framework-wifi-util-lib-aidls",
+ srcs: ["core/java/android/content/pm/ParceledListSlice.aidl"],
+ path: "core/java",
+}
+
// utility classes statically linked into wifi-service
filegroup {
name: "framework-wifi-service-shared-srcs",
diff --git a/core/java/android/net/NetworkScore.java b/core/java/android/net/NetworkScore.java
index d207e7960d34..ae17378cfc4c 100644
--- a/core/java/android/net/NetworkScore.java
+++ b/core/java/android/net/NetworkScore.java
@@ -21,6 +21,7 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.annotation.TestApi;
+import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
@@ -83,69 +84,10 @@ public final class NetworkScore implements Parcelable {
uplinkBandwidthKBps = uplinkBandwidth;
}
- /**
- * Evaluate whether a metrics codes for faster network is faster than another.
- *
- * This is a simple comparison of expected speeds. If either of the tested attributes
- * are unknown, this returns zero. This implementation just assumes downlink bandwidth
- * is more important than uplink bandwidth, which is more important than latency. This
- * is not a very good way of evaluating network speed, but it's a start.
- * TODO : do something more representative of how fast the network feels
- *
- * @param other the Metrics to evaluate against
- * @return a negative integer, zero, or a positive integer as this metrics is worse than,
- * equally good as (or unknown), or better than the passed Metrics.
- * @see #compareToPreferringKnown(Metrics)
- * @hide
- */
- // Can't implement Comparable<Metrics> because this is @hide.
- public int compareTo(@NonNull final Metrics other) {
- if (downlinkBandwidthKBps != BANDWIDTH_UNKNOWN
- && other.downlinkBandwidthKBps != BANDWIDTH_UNKNOWN) {
- if (downlinkBandwidthKBps > other.downlinkBandwidthKBps) return 1;
- if (downlinkBandwidthKBps < other.downlinkBandwidthKBps) return -1;
- }
- if (uplinkBandwidthKBps != BANDWIDTH_UNKNOWN
- && other.uplinkBandwidthKBps != BANDWIDTH_UNKNOWN) {
- if (uplinkBandwidthKBps > other.uplinkBandwidthKBps) return 1;
- if (uplinkBandwidthKBps < other.uplinkBandwidthKBps) return -1;
- }
- if (latencyMs != LATENCY_UNKNOWN && other.latencyMs != LATENCY_UNKNOWN) {
- // Latency : lower is better
- if (latencyMs > other.latencyMs) return -1;
- if (latencyMs < other.latencyMs) return 1;
- }
- return 0;
- }
-
- /**
- * Evaluate whether a metrics codes for faster network is faster than another.
- *
- * This is a simple comparison of expected speeds. If either of the tested attributes
- * are unknown, this prefers the known attributes. This implementation just assumes
- * downlink bandwidth is more important than uplink bandwidth, which is more important than
- * latency. This is not a very good way of evaluating network speed, but it's a start.
- * TODO : do something more representative of how fast the network feels
- *
- * @param other the Metrics to evaluate against
- * @return a negative integer, zero, or a positive integer as this metrics is worse than,
- * equally good as (or unknown), or better than the passed Metrics.
- * @see #compareTo(Metrics)
- * @hide
- */
- public int compareToPreferringKnown(@NonNull final Metrics other) {
- if (downlinkBandwidthKBps > other.downlinkBandwidthKBps) return 1;
- if (downlinkBandwidthKBps < other.downlinkBandwidthKBps) return -1;
- if (uplinkBandwidthKBps > other.uplinkBandwidthKBps) return 1;
- if (uplinkBandwidthKBps < other.uplinkBandwidthKBps) return -1;
- // Latency : lower is better
- return -Integer.compare(latencyMs, other.latencyMs);
- }
-
/** toString */
public String toString() {
return "latency = " + latencyMs + " downlinkBandwidth = " + downlinkBandwidthKBps
- + " uplinkBandwidth = " + uplinkBandwidthKBps;
+ + "uplinkBandwidth = " + uplinkBandwidthKBps;
}
@NonNull
@@ -405,33 +347,6 @@ public final class NetworkScore implements Parcelable {
return mLegacyScore;
}
- /**
- * Use the metrics to evaluate whether a network is faster than another.
- *
- * This is purely based on the metrics, and explicitly ignores policy or exiting. It's
- * provided to get a decision on two networks when policy can not decide, or to evaluate
- * how a network is expected to compare to another if it should validate.
- *
- * @param other the score to evaluate against
- * @return whether this network is probably faster than the other
- * @hide
- */
- public boolean probablyFasterThan(@NonNull final NetworkScore other) {
- if (mLegacyScore > other.mLegacyScore) return true;
- final int atEndToEnd = mEndToEndMetrics.compareTo(other.mEndToEndMetrics);
- if (atEndToEnd > 0) return true;
- if (atEndToEnd < 0) return false;
- final int atLinkLayer = mLinkLayerMetrics.compareTo(other.mLinkLayerMetrics);
- if (atLinkLayer > 0) return true;
- if (atLinkLayer < 0) return false;
- final int atEndToEndPreferringKnown =
- mEndToEndMetrics.compareToPreferringKnown(other.mEndToEndMetrics);
- if (atEndToEndPreferringKnown > 0) return true;
- if (atEndToEndPreferringKnown < 0) return false;
- // If this returns 0, neither is "probably faster" so just return false.
- return mLinkLayerMetrics.compareToPreferringKnown(other.mLinkLayerMetrics) > 0;
- }
-
/** Builder for NetworkScore. */
public static class Builder {
private int mPolicy = 0;
@@ -439,27 +354,17 @@ public final class NetworkScore implements Parcelable {
private Metrics mLinkLayerMetrics = new Metrics(Metrics.LATENCY_UNKNOWN,
Metrics.BANDWIDTH_UNKNOWN, Metrics.BANDWIDTH_UNKNOWN);
@NonNull
- private Metrics mEndToEndMetrics = new Metrics(Metrics.LATENCY_UNKNOWN,
+ private Metrics mEndToMetrics = new Metrics(Metrics.LATENCY_UNKNOWN,
Metrics.BANDWIDTH_UNKNOWN, Metrics.BANDWIDTH_UNKNOWN);
private int mSignalStrength = UNKNOWN_SIGNAL_STRENGTH;
private int mRange = RANGE_UNKNOWN;
private boolean mExiting = false;
private int mLegacyScore = 0;
+ @NonNull private Bundle mExtensions = new Bundle();
/** Create a new builder. */
public Builder() { }
- /** @hide */
- public Builder(@NonNull final NetworkScore source) {
- mPolicy = source.mPolicy;
- mLinkLayerMetrics = source.mLinkLayerMetrics;
- mEndToEndMetrics = source.mEndToEndMetrics;
- mSignalStrength = source.mSignalStrength;
- mRange = source.mRange;
- mExiting = source.mExiting;
- mLegacyScore = source.mLegacyScore;
- }
-
/** Add a policy flag. */
@NonNull public Builder addPolicy(@Policy final int policy) {
mPolicy |= policy;
@@ -480,7 +385,7 @@ public final class NetworkScore implements Parcelable {
/** Set the end-to-end metrics. */
@NonNull public Builder setEndToEndMetrics(@NonNull final Metrics endToEndMetrics) {
- mEndToEndMetrics = endToEndMetrics;
+ mEndToMetrics = endToEndMetrics;
return this;
}
@@ -512,7 +417,7 @@ public final class NetworkScore implements Parcelable {
/** Build the NetworkScore object represented by this builder. */
@NonNull public NetworkScore build() {
- return new NetworkScore(mPolicy, mLinkLayerMetrics, mEndToEndMetrics,
+ return new NetworkScore(mPolicy, mLinkLayerMetrics, mEndToMetrics,
mSignalStrength, mRange, mExiting, mLegacyScore);
}
}
diff --git a/core/java/com/android/internal/util/FunctionalUtils.java b/core/java/com/android/internal/util/FunctionalUtils.java
index 720f4feeaebe..3c9791791a68 100644
--- a/core/java/com/android/internal/util/FunctionalUtils.java
+++ b/core/java/com/android/internal/util/FunctionalUtils.java
@@ -16,16 +16,12 @@
package com.android.internal.util;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
import android.os.RemoteException;
import android.util.ExceptionUtils;
-import java.util.Collection;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.function.Function;
-import java.util.function.Predicate;
import java.util.function.Supplier;
/**
@@ -222,20 +218,4 @@ public class FunctionalUtils {
}
}
}
-
- /**
- * Find the first element in the list that matches the predicate.
- *
- * The standard Java way of doing this is to use streams, which is very expensive.
- *
- * @return the first matching element, or null if none.
- */
- @Nullable
- public static <T> T findFirst(@NonNull final Collection<T> haystack,
- @NonNull final Predicate<T> p) {
- for (final T needle : haystack) {
- if (p.test(needle)) return needle;
- }
- return null;
- }
}
diff --git a/keystore/java/android/security/KeyChain.java b/keystore/java/android/security/KeyChain.java
index a7e17d13c9e1..acd90a7f10cf 100644
--- a/keystore/java/android/security/KeyChain.java
+++ b/keystore/java/android/security/KeyChain.java
@@ -34,6 +34,7 @@ import android.os.Looper;
import android.os.Process;
import android.os.RemoteException;
import android.os.UserHandle;
+import android.os.UserManager;
import android.security.keystore.AndroidKeyStoreProvider;
import android.security.keystore.KeyPermanentlyInvalidatedException;
import android.security.keystore.KeyProperties;
@@ -811,6 +812,10 @@ public final class KeyChain {
throw new NullPointerException("context == null");
}
ensureNotOnMainThread(context);
+ if (!UserManager.get(context).isUserUnlocked(user)) {
+ throw new IllegalStateException("User must be unlocked");
+ }
+
final CountDownLatch countDownLatch = new CountDownLatch(1);
final AtomicReference<IKeyChainService> keyChainService = new AtomicReference<>();
ServiceConnection keyChainServiceConnection = new ServiceConnection() {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/UserDetailView.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/UserDetailView.java
index 187a3bdec13f..4f9052709870 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/UserDetailView.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/UserDetailView.java
@@ -59,6 +59,7 @@ public class UserDetailView extends PseudoGridView {
private final Context mContext;
protected UserSwitcherController mController;
+ private View mCurrentUserView;
public Adapter(Context context, UserSwitcherController controller) {
super(controller);
@@ -89,6 +90,9 @@ public class UserDetailView extends PseudoGridView {
v.bind(name, item.picture, item.info.id);
}
v.setActivated(item.isCurrent);
+ if (item.isCurrent) {
+ mCurrentUserView = v;
+ }
v.setDisabledByAdmin(item.isDisabledByAdmin);
if (!item.isSwitchToEnabled) {
v.setEnabled(false);
@@ -107,6 +111,12 @@ public class UserDetailView extends PseudoGridView {
mController.startActivity(intent);
} else if (tag.isSwitchToEnabled) {
MetricsLogger.action(mContext, MetricsEvent.QS_SWITCH_USER);
+ if (!tag.isAddUser && !tag.isRestricted && !tag.isDisabledByAdmin) {
+ if (mCurrentUserView != null) {
+ mCurrentUserView.setActivated(false);
+ }
+ view.setActivated(true);
+ }
switchTo(tag);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/UserAvatarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/UserAvatarView.java
index ba55f2ddcf13..c404cf69f1a8 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/UserAvatarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/UserAvatarView.java
@@ -74,6 +74,12 @@ public class UserAvatarView extends View {
this(context, null);
}
+ @Override
+ public void setActivated(boolean activated) {
+ super.setActivated(activated);
+ mDrawable.invalidateSelf();
+ }
+
/**
* @deprecated use {@link #setAvatar(Bitmap)} instead.
*/
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcher.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcher.java
index d28a66994e1d..2abae3e26013 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcher.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcher.java
@@ -257,6 +257,7 @@ public class KeyguardUserSwitcher {
private Context mContext;
private KeyguardUserSwitcher mKeyguardUserSwitcher;
+ private View mCurrentUserView;
public Adapter(Context context, UserSwitcherController controller,
KeyguardUserSwitcher kgu) {
@@ -285,6 +286,9 @@ public class KeyguardUserSwitcher {
// Disable the icon if switching is disabled
v.setAvatarEnabled(item.isSwitchToEnabled);
convertView.setActivated(item.isCurrent);
+ if (item.isCurrent) {
+ mCurrentUserView = convertView;
+ }
convertView.setTag(item);
return convertView;
}
@@ -297,6 +301,12 @@ public class KeyguardUserSwitcher {
// tapping the guest user while it's current clears the session.
mKeyguardUserSwitcher.hideIfNotSimple(true /* animate */);
} else if (user.isSwitchToEnabled) {
+ if (!user.isAddUser && !user.isRestricted && !user.isDisabledByAdmin) {
+ if (mCurrentUserView != null) {
+ mCurrentUserView.setActivated(false);
+ }
+ v.setActivated(true);
+ }
switchTo(user);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java
index 8dfcb0ac215d..9ce31d030c43 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java
@@ -236,8 +236,7 @@ public class UserSwitcherController implements Dumpable {
picture, avatarSize, avatarSize, true);
}
}
- int index = isCurrent ? 0 : records.size();
- records.add(index, new UserRecord(info, picture, false /* isGuest */,
+ records.add(new UserRecord(info, picture, false /* isGuest */,
isCurrent, false /* isAddUser */, false /* isRestricted */,
switchToEnabled));
}
@@ -269,8 +268,7 @@ public class UserSwitcherController implements Dumpable {
records.add(guestRecord);
}
} else {
- int index = guestRecord.isCurrent ? 0 : records.size();
- records.add(index, guestRecord);
+ records.add(guestRecord);
}
if (canCreateUser) {
diff --git a/services/core/java/android/content/pm/PackageManagerInternal.java b/services/core/java/android/content/pm/PackageManagerInternal.java
index 0f8d57e3d9e3..8b2bfa10a029 100644
--- a/services/core/java/android/content/pm/PackageManagerInternal.java
+++ b/services/core/java/android/content/pm/PackageManagerInternal.java
@@ -237,6 +237,33 @@ public abstract class PackageManagerInternal {
public abstract boolean isPackageSuspended(String packageName, int userId);
/**
+ * Removes all package suspensions imposed by any non-system packages.
+ */
+ public abstract void removeAllNonSystemPackageSuspensions(int userId);
+
+ /**
+ * Removes all suspensions imposed on the given package by non-system packages.
+ */
+ public abstract void removeNonSystemPackageSuspensions(String packageName, int userId);
+
+ /**
+ * Removes all {@link PackageManager.DistractionRestriction restrictions} set on the given
+ * package
+ */
+ public abstract void removeDistractingPackageRestrictions(String packageName, int userId);
+
+ /**
+ * Removes all {@link PackageManager.DistractionRestriction restrictions} set on all the
+ * packages.
+ */
+ public abstract void removeAllDistractingPackageRestrictions(int userId);
+
+ /**
+ * Flushes package restrictions for the given user immediately to disk.
+ */
+ public abstract void flushPackageRestrictions(int userId);
+
+ /**
* Get the name of the package that suspended the given package. Packages can be suspended by
* device administrators or apps holding {@link android.Manifest.permission#MANAGE_USERS} or
* {@link android.Manifest.permission#SUSPEND_APPS}.
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index 7cf3fae70eb4..f84d35fb7776 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -3302,7 +3302,6 @@ public class ConnectivityService extends IConnectivityManager.Stub
for (int i = 0; i < nai.numNetworkRequests(); i++) {
NetworkRequest request = nai.requestAt(i);
final NetworkRequestInfo nri = mNetworkRequests.get(request);
- ensureRunningOnConnectivityServiceThread();
final NetworkAgentInfo currentNetwork = nri.mSatisfier;
if (currentNetwork != null && currentNetwork.network.netId == nai.network.netId) {
nri.mSatisfier = null;
@@ -3454,7 +3453,6 @@ public class ConnectivityService extends IConnectivityManager.Stub
// If this Network is already the highest scoring Network for a request, or if
// there is hope for it to become one if it validated, then it is needed.
- ensureRunningOnConnectivityServiceThread();
if (nri.request.isRequest() && nai.satisfies(nri.request) &&
(nai.isSatisfyingRequest(nri.request.requestId) ||
// Note that this catches two important cases:
@@ -3493,7 +3491,6 @@ public class ConnectivityService extends IConnectivityManager.Stub
if (mNetworkRequests.get(nri.request) == null) {
return;
}
- ensureRunningOnConnectivityServiceThread();
if (nri.mSatisfier != null) {
return;
}
@@ -3531,7 +3528,6 @@ public class ConnectivityService extends IConnectivityManager.Stub
mNetworkRequestInfoLogs.log("RELEASE " + nri);
if (nri.request.isRequest()) {
boolean wasKept = false;
- ensureRunningOnConnectivityServiceThread();
final NetworkAgentInfo nai = nri.mSatisfier;
if (nai != null) {
boolean wasBackgroundNetwork = nai.isBackgroundNetwork();
@@ -3843,9 +3839,8 @@ public class ConnectivityService extends IConnectivityManager.Stub
return avoidBadWifi();
}
+
private void rematchForAvoidBadWifiUpdate() {
- ensureRunningOnConnectivityServiceThread();
- mixInAllNetworkScores();
rematchAllNetworksAndRequests();
for (NetworkAgentInfo nai: mNetworkAgentInfos.values()) {
if (nai.networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
@@ -7071,45 +7066,9 @@ public class ConnectivityService extends IConnectivityManager.Stub
}
}
- /**
- * Re-mixin all network scores.
- * This is called when some global setting like avoidBadWifi has changed.
- * TODO : remove this when all usages have been removed.
- */
- private void mixInAllNetworkScores() {
- ensureRunningOnConnectivityServiceThread();
- for (final NetworkAgentInfo nai : mNetworkAgentInfos.values()) {
- nai.setNetworkScore(mixInNetworkScore(nai, nai.getNetworkScore()));
- }
- }
-
- /**
- * Mix in the Connectivity-managed parts of the NetworkScore.
- * @param nai The NAI this score applies to.
- * @param sourceScore the score sent by the network agent, or the previous score of this NAI.
- * @return A new score with the Connectivity-managed parts mixed in.
- */
- @NonNull
- private NetworkScore mixInNetworkScore(@NonNull final NetworkAgentInfo nai,
- @NonNull final NetworkScore sourceScore) {
- final NetworkScore.Builder score = new NetworkScore.Builder(sourceScore);
-
- // TODO : this should be done in Telephony. It should be handled per-network because
- // it's a carrier-dependent config.
- if (nai.networkCapabilities.hasTransport(TRANSPORT_CELLULAR)) {
- if (mMultinetworkPolicyTracker.getAvoidBadWifi()) {
- score.clearPolicy(NetworkScore.POLICY_IGNORE_ON_WIFI);
- } else {
- score.addPolicy(NetworkScore.POLICY_IGNORE_ON_WIFI);
- }
- }
-
- return score.build();
- }
-
private void updateNetworkScore(NetworkAgentInfo nai, NetworkScore ns) {
if (VDBG || DDBG) log("updateNetworkScore for " + nai.toShortString() + " to " + ns);
- nai.setNetworkScore(mixInNetworkScore(nai, ns));
+ nai.setNetworkScore(ns);
rematchAllNetworksAndRequests();
sendUpdatedScoreToFactories(nai);
}
diff --git a/services/core/java/com/android/server/MemoryPressureUtil.java b/services/core/java/com/android/server/MemoryPressureUtil.java
new file mode 100644
index 000000000000..c34dc2f5a9b1
--- /dev/null
+++ b/services/core/java/com/android/server/MemoryPressureUtil.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server;
+
+import android.os.StrictMode;
+import android.util.Slog;
+
+import libcore.io.IoUtils;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.StringWriter;
+
+/**
+ * Utility method for memory pressure (PSI).
+ */
+public final class MemoryPressureUtil {
+ private static final String FILE = "/proc/pressure/memory";
+ private static final String TAG = "MemoryPressure";
+
+ /**
+ * @return a stanza about memory PSI to add to a report.
+ */
+ public static String currentPsiState() {
+ final StrictMode.ThreadPolicy savedPolicy = StrictMode.allowThreadDiskReads();
+ StringWriter contents = new StringWriter();
+ try {
+ if (new File(FILE).exists()) {
+ contents.append("----- Output from /proc/pressure/memory -----\n");
+ contents.append(IoUtils.readFileAsString(FILE));
+ contents.append("----- End output from /proc/pressure/memory -----\n\n");
+ }
+ } catch (IOException e) {
+ Slog.e(TAG, "Could not read " + FILE, e);
+ } finally {
+ StrictMode.setThreadPolicy(savedPolicy);
+ }
+ return contents.toString();
+ }
+
+ private MemoryPressureUtil(){}
+}
diff --git a/services/core/java/com/android/server/SystemServerInitThreadPool.java b/services/core/java/com/android/server/SystemServerInitThreadPool.java
index 179780d88084..8f914fe6f59f 100644
--- a/services/core/java/com/android/server/SystemServerInitThreadPool.java
+++ b/services/core/java/com/android/server/SystemServerInitThreadPool.java
@@ -175,6 +175,6 @@ public class SystemServerInitThreadPool {
final ArrayList<Integer> pids = new ArrayList<>();
pids.add(Process.myPid());
ActivityManagerService.dumpStackTraces(pids, null, null,
- Watchdog.getInterestingNativePids());
+ Watchdog.getInterestingNativePids(), null);
}
}
diff --git a/services/core/java/com/android/server/Watchdog.java b/services/core/java/com/android/server/Watchdog.java
index 8900eee6f50f..ac7867f29a79 100644
--- a/services/core/java/com/android/server/Watchdog.java
+++ b/services/core/java/com/android/server/Watchdog.java
@@ -50,6 +50,7 @@ import com.android.server.wm.SurfaceAnimationThread;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
+import java.io.StringWriter;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
@@ -583,7 +584,7 @@ public class Watchdog extends Thread {
ArrayList<Integer> pids = new ArrayList<Integer>();
pids.add(Process.myPid());
ActivityManagerService.dumpStackTraces(pids, null, null,
- getInterestingNativePids());
+ getInterestingNativePids(), null);
waitedHalf = true;
}
continue;
@@ -609,16 +610,21 @@ public class Watchdog extends Thread {
if (mPhonePid > 0) pids.add(mPhonePid);
long anrTime = SystemClock.uptimeMillis();
+ StringBuilder report = new StringBuilder();
+ report.append(MemoryPressureUtil.currentPsiState());
ProcessCpuTracker processCpuTracker = new ProcessCpuTracker(false);
+ StringWriter tracesFileException = new StringWriter();
final File stack = ActivityManagerService.dumpStackTraces(
- pids, processCpuTracker, new SparseArray<>(), getInterestingNativePids());
+ pids, processCpuTracker, new SparseArray<>(), getInterestingNativePids(),
+ tracesFileException);
// Give some extra time to make sure the stack traces get written.
// The system's been hanging for a minute, another second or two won't hurt much.
SystemClock.sleep(5000);
processCpuTracker.update();
- String cpuInfo = processCpuTracker.printCurrentState(anrTime);
+ report.append(processCpuTracker.printCurrentState(anrTime));
+ report.append(tracesFileException.getBuffer());
// Trigger the kernel to dump all blocked threads, and backtraces on all CPUs to the kernel log
doSysRq('w');
@@ -634,7 +640,7 @@ public class Watchdog extends Thread {
if (mActivity != null) {
mActivity.addErrorToDropBox(
"watchdog", null, "system_server", null, null, null,
- subject, cpuInfo, stack, null);
+ subject, report.toString(), stack, null);
}
FrameworkStatsLog.write(FrameworkStatsLog.SYSTEM_SERVER_WATCHDOG_OCCURRED,
subject);
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index a529f24eff1c..6c0623021025 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -3851,10 +3851,11 @@ public class ActivityManagerService extends IActivityManager.Stub
* @param firstPids of dalvik VM processes to dump stack traces for first
* @param lastPids of dalvik VM processes to dump stack traces for last
* @param nativePids optional list of native pids to dump stack crawls
+ * @param logExceptionCreatingFile optional writer to which we log errors creating the file
*/
public static File dumpStackTraces(ArrayList<Integer> firstPids,
ProcessCpuTracker processCpuTracker, SparseArray<Boolean> lastPids,
- ArrayList<Integer> nativePids) {
+ ArrayList<Integer> nativePids, StringWriter logExceptionCreatingFile) {
ArrayList<Integer> extraPids = null;
Slog.i(TAG, "dumpStackTraces pids=" + lastPids + " nativepids=" + nativePids);
@@ -3894,8 +3895,15 @@ public class ActivityManagerService extends IActivityManager.Stub
// NOTE: We should consider creating the file in native code atomically once we've
// gotten rid of the old scheme of dumping and lot of the code that deals with paths
// can be removed.
- File tracesFile = createAnrDumpFile(tracesDir);
- if (tracesFile == null) {
+ File tracesFile;
+ try {
+ tracesFile = createAnrDumpFile(tracesDir);
+ } catch (IOException e) {
+ Slog.w(TAG, "Exception creating ANR dump file:", e);
+ if (logExceptionCreatingFile != null) {
+ logExceptionCreatingFile.append("----- Exception creating ANR dump file -----\n");
+ e.printStackTrace(new PrintWriter(logExceptionCreatingFile));
+ }
return null;
}
@@ -3906,7 +3914,7 @@ public class ActivityManagerService extends IActivityManager.Stub
@GuardedBy("ActivityManagerService.class")
private static SimpleDateFormat sAnrFileDateFormat;
- private static synchronized File createAnrDumpFile(File tracesDir) {
+ private static synchronized File createAnrDumpFile(File tracesDir) throws IOException {
if (sAnrFileDateFormat == null) {
sAnrFileDateFormat = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss-SSS");
}
@@ -3914,18 +3922,12 @@ public class ActivityManagerService extends IActivityManager.Stub
final String formattedDate = sAnrFileDateFormat.format(new Date());
final File anrFile = new File(tracesDir, "anr_" + formattedDate);
- try {
- if (anrFile.createNewFile()) {
- FileUtils.setPermissions(anrFile.getAbsolutePath(), 0600, -1, -1); // -rw-------
- return anrFile;
- } else {
- Slog.w(TAG, "Unable to create ANR dump file: createNewFile failed");
- }
- } catch (IOException ioe) {
- Slog.w(TAG, "Exception creating ANR dump file:", ioe);
+ if (anrFile.createNewFile()) {
+ FileUtils.setPermissions(anrFile.getAbsolutePath(), 0600, -1, -1); // -rw-------
+ return anrFile;
+ } else {
+ throw new IOException("Unable to create ANR dump file: createNewFile failed");
}
-
- return null;
}
/**
diff --git a/services/core/java/com/android/server/am/ProcessRecord.java b/services/core/java/com/android/server/am/ProcessRecord.java
index e63da9b1e80b..c2f03ec8d6c4 100644
--- a/services/core/java/com/android/server/am/ProcessRecord.java
+++ b/services/core/java/com/android/server/am/ProcessRecord.java
@@ -66,11 +66,13 @@ import com.android.internal.os.BatteryStatsImpl;
import com.android.internal.os.ProcessCpuTracker;
import com.android.internal.os.Zygote;
import com.android.internal.util.FrameworkStatsLog;
+import com.android.server.MemoryPressureUtil;
import com.android.server.wm.WindowProcessController;
import com.android.server.wm.WindowProcessListener;
import java.io.File;
import java.io.PrintWriter;
+import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -1581,6 +1583,8 @@ class ProcessRecord implements WindowProcessListener {
info.append("Parent: ").append(parentShortComponentName).append("\n");
}
+ StringBuilder report = new StringBuilder();
+ report.append(MemoryPressureUtil.currentPsiState());
ProcessCpuTracker processCpuTracker = new ProcessCpuTracker(true);
// don't dump native PIDs for background ANRs unless it is the process of interest
@@ -1608,19 +1612,20 @@ class ProcessRecord implements WindowProcessListener {
// For background ANRs, don't pass the ProcessCpuTracker to
// avoid spending 1/2 second collecting stats to rank lastPids.
+ StringWriter tracesFileException = new StringWriter();
File tracesFile = ActivityManagerService.dumpStackTraces(firstPids,
(isSilentAnr()) ? null : processCpuTracker, (isSilentAnr()) ? null : lastPids,
- nativePids);
+ nativePids, tracesFileException);
- String cpuInfo = null;
if (isMonitorCpuUsage()) {
mService.updateCpuStatsNow();
synchronized (mService.mProcessCpuTracker) {
- cpuInfo = mService.mProcessCpuTracker.printCurrentState(anrTime);
+ report.append(mService.mProcessCpuTracker.printCurrentState(anrTime));
}
info.append(processCpuTracker.printCurrentLoad());
- info.append(cpuInfo);
+ info.append(report);
}
+ report.append(tracesFileException.getBuffer());
info.append(processCpuTracker.printCurrentState(anrTime));
@@ -1645,7 +1650,8 @@ class ProcessRecord implements WindowProcessListener {
final ProcessRecord parentPr = parentProcess != null
? (ProcessRecord) parentProcess.mOwner : null;
mService.addErrorToDropBox("anr", this, processName, activityShortComponentName,
- parentShortComponentName, parentPr, annotation, cpuInfo, tracesFile, null);
+ parentShortComponentName, parentPr, annotation, report.toString(), tracesFile,
+ null);
if (mWindowProcessController.appNotResponding(info.toString(), () -> kill("anr",
ApplicationExitInfo.REASON_ANR, true),
diff --git a/services/core/java/com/android/server/connectivity/NetworkRanker.java b/services/core/java/com/android/server/connectivity/NetworkRanker.java
index c536ab25e925..d0aabf95d572 100644
--- a/services/core/java/com/android/server/connectivity/NetworkRanker.java
+++ b/services/core/java/com/android/server/connectivity/NetworkRanker.java
@@ -16,16 +16,10 @@
package com.android.server.connectivity;
-import static android.net.NetworkScore.POLICY_IGNORE_ON_WIFI;
-
-import static com.android.internal.util.FunctionalUtils.findFirst;
-
import android.annotation.NonNull;
import android.annotation.Nullable;
-import android.net.NetworkCapabilities;
import android.net.NetworkRequest;
-import java.util.ArrayList;
import java.util.Collection;
/**
@@ -37,38 +31,20 @@ public class NetworkRanker {
/**
* Find the best network satisfying this request among the list of passed networks.
*/
+ // Almost equivalent to Collections.max(nais), but allows returning null if no network
+ // satisfies the request.
@Nullable
public NetworkAgentInfo getBestNetwork(@NonNull final NetworkRequest request,
@NonNull final Collection<NetworkAgentInfo> nais) {
- final ArrayList<NetworkAgentInfo> candidates = new ArrayList<>(nais);
- candidates.removeIf(nai -> !nai.satisfies(request));
- // Enforce policy.
- filterBadWifiAvoidancePolicy(candidates);
-
NetworkAgentInfo bestNetwork = null;
int bestScore = Integer.MIN_VALUE;
- for (final NetworkAgentInfo nai : candidates) {
- final int score = nai.getCurrentScore();
- if (score > bestScore) {
+ for (final NetworkAgentInfo nai : nais) {
+ if (!nai.satisfies(request)) continue;
+ if (nai.getCurrentScore() > bestScore) {
bestNetwork = nai;
- bestScore = score;
+ bestScore = nai.getCurrentScore();
}
}
return bestNetwork;
}
-
- // If some network with wifi transport is present, drop all networks with POLICY_IGNORE_ON_WIFI.
- private void filterBadWifiAvoidancePolicy(
- @NonNull final ArrayList<NetworkAgentInfo> candidates) {
- final NetworkAgentInfo wifi = findFirst(candidates,
- nai -> nai.networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)
- && nai.everValidated
- // Horrible hack : there is old UI that will let a user say they want to
- // override the policy only for this network only at this time and it
- // feeds into the following member. This old UI should probably be removed
- // but for now keep backward compatibility.
- && !nai.avoidUnvalidated);
- if (null == wifi) return; // No wifi : this policy doesn't apply
- candidates.removeIf(nai -> nai.getNetworkScore().hasPolicy(POLICY_IGNORE_ON_WIFI));
- }
}
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 14964b5fb3dc..52052f8dd871 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -12760,7 +12760,11 @@ public class PackageManagerService extends IPackageManager.Stub
throw new SecurityException("Calling uid " + callingUid + " cannot call for user "
+ userId);
}
- Preconditions.checkNotNull(packageNames, "packageNames cannot be null");
+ Objects.requireNonNull(packageNames, "packageNames cannot be null");
+ if (restrictionFlags != 0 && !isSuspendAllowedForUser(userId)) {
+ Slog.w(TAG, "Cannot restrict packages due to restrictions on user " + userId);
+ return packageNames;
+ }
final List<String> changedPackagesList = new ArrayList<>(packageNames.length);
final IntArray changedUids = new IntArray(packageNames.length);
@@ -12847,6 +12851,10 @@ public class PackageManagerService extends IPackageManager.Stub
if (ArrayUtils.isEmpty(packageNames)) {
return packageNames;
}
+ if (suspended && !isSuspendAllowedForUser(userId)) {
+ Slog.w(TAG, "Cannot suspend due to restrictions on user " + userId);
+ return packageNames;
+ }
final List<String> changedPackagesList = new ArrayList<>(packageNames.length);
final IntArray changedUids = new IntArray(packageNames.length);
@@ -12985,30 +12993,41 @@ public class PackageManagerService extends IPackageManager.Stub
}
}
+ void unsuspendForSuspendingPackage(String suspendingPackage, int userId) {
+ final String[] allPackages;
+ synchronized (mLock) {
+ allPackages = mPackages.keySet().toArray(new String[mPackages.size()]);
+ }
+ removeSuspensionsBySuspendingPackage(allPackages, suspendingPackage::equals, userId);
+ }
+
/**
- * Immediately unsuspends any packages suspended by the given package. To be called
- * when such a package's data is cleared or it is removed from the device.
+ * Removes any suspensions on given packages that were added by packages that pass the given
+ * predicate.
*
- * <p><b>Should not be used on a frequent code path</b> as it flushes state to disk
- * synchronously
+ * <p> Caller must flush package restrictions if it cares about immediate data consistency.
*
- * @param suspendingPackage The suspending package
+ * @param packagesToChange The packages on which the suspension are to be removed.
+ * @param suspendingPackagePredicate A predicate identifying the suspending packages whose
+ * suspensions will be removed.
* @param userId The user for which the changes are taking place.
*/
- private void unsuspendForSuspendingPackage(String suspendingPackage, int userId) {
+ void removeSuspensionsBySuspendingPackage(String[] packagesToChange,
+ Predicate<String> suspendingPackagePredicate, int userId) {
final List<String> unsuspendedPackages = new ArrayList<>();
final IntArray unsuspendedUids = new IntArray();
synchronized (mLock) {
- for (PackageSetting ps : mSettings.mPackages.values()) {
- final PackageUserState pus = ps.readUserState(userId);
- if (pus.suspended) {
- ps.removeSuspension(suspendingPackage, userId);
+ for (String packageName : packagesToChange) {
+ final PackageSetting ps = mSettings.mPackages.get(packageName);
+ if (ps.getSuspended(userId)) {
+ ps.removeSuspension(suspendingPackagePredicate, userId);
if (!ps.getSuspended(userId)) {
unsuspendedPackages.add(ps.name);
unsuspendedUids.add(UserHandle.getUid(userId, ps.getAppId()));
}
}
}
+ scheduleWritePackageRestrictionsLocked(userId);
}
if (!unsuspendedPackages.isEmpty()) {
final String[] packageArray = unsuspendedPackages.toArray(
@@ -13016,13 +13035,67 @@ public class PackageManagerService extends IPackageManager.Stub
sendMyPackageSuspendedOrUnsuspended(packageArray, false, userId);
sendPackagesSuspendedForUser(packageArray, unsuspendedUids.toArray(), userId, false);
}
- // Write package restrictions immediately to avoid an inconsistent state.
- mSettings.writePackageRestrictionsLPr(userId);
+ }
+
+ void removeAllDistractingPackageRestrictions(int userId) {
+ final String[] allPackages;
+ synchronized (mLock) {
+ allPackages = mPackages.keySet().toArray(new String[mPackages.size()]);
+ }
+ PackageManagerService.this.removeDistractingPackageRestrictions(allPackages, userId);
+ }
+
+ /**
+ * Removes any {@link android.content.pm.PackageManager.DistractionRestriction restrictions}
+ * set on given packages.
+ *
+ * <p> Caller must flush package restrictions if it cares about immediate data consistency.
+ *
+ * @param packagesToChange The packages on which restrictions are to be removed.
+ * @param userId the user for which changes are taking place.
+ */
+ void removeDistractingPackageRestrictions(String[] packagesToChange, int userId) {
+ final List<String> changedPackages = new ArrayList<>();
+ final IntArray changedUids = new IntArray();
+ synchronized (mLock) {
+ for (String packageName : packagesToChange) {
+ final PackageSetting ps = mSettings.mPackages.get(packageName);
+ if (ps.getDistractionFlags(userId) != 0) {
+ ps.setDistractionFlags(0, userId);
+ changedPackages.add(ps.name);
+ changedUids.add(UserHandle.getUid(userId, ps.getAppId()));
+ }
+ }
+ if (!changedPackages.isEmpty()) {
+ final String[] packageArray = changedPackages.toArray(
+ new String[changedPackages.size()]);
+ sendDistractingPackagesChanged(packageArray, changedUids.toArray(), userId, 0);
+ scheduleWritePackageRestrictionsLocked(userId);
+ }
+ }
+ }
+
+ private boolean isCallerDeviceOrProfileOwner(int userId) {
+ final int callingUid = Binder.getCallingUid();
+ if (callingUid == Process.SYSTEM_UID) {
+ return true;
+ }
+ final String ownerPackage = mProtectedPackages.getDeviceOwnerOrProfileOwnerPackage(userId);
+ if (ownerPackage != null) {
+ return callingUid == getPackageUidInternal(ownerPackage, 0, userId, callingUid);
+ }
+ return false;
+ }
+
+ private boolean isSuspendAllowedForUser(int userId) {
+ return isCallerDeviceOrProfileOwner(userId)
+ || (!mUserManager.hasUserRestriction(UserManager.DISALLOW_APPS_CONTROL, userId)
+ && !mUserManager.hasUserRestriction(UserManager.DISALLOW_UNINSTALL_APPS, userId));
}
@Override
public String[] getUnsuspendablePackagesForUser(String[] packageNames, int userId) {
- Preconditions.checkNotNull(packageNames, "packageNames cannot be null");
+ Objects.requireNonNull(packageNames, "packageNames cannot be null");
mContext.enforceCallingOrSelfPermission(Manifest.permission.SUSPEND_APPS,
"getUnsuspendablePackagesForUser");
final int callingUid = Binder.getCallingUid();
@@ -13030,11 +13103,23 @@ public class PackageManagerService extends IPackageManager.Stub
throw new SecurityException("Calling uid " + callingUid
+ " cannot query getUnsuspendablePackagesForUser for user " + userId);
}
+ if (!isSuspendAllowedForUser(userId)) {
+ Slog.w(TAG, "Cannot suspend due to restrictions on user " + userId);
+ return packageNames;
+ }
final ArraySet<String> unactionablePackages = new ArraySet<>();
final boolean[] canSuspend = canSuspendPackageForUserInternal(packageNames, userId);
for (int i = 0; i < packageNames.length; i++) {
if (!canSuspend[i]) {
unactionablePackages.add(packageNames[i]);
+ continue;
+ }
+ synchronized (mLock) {
+ final PackageSetting ps = mSettings.mPackages.get(packageNames[i]);
+ if (ps == null || shouldFilterApplicationLocked(ps, callingUid, userId)) {
+ Slog.w(TAG, "Could not find package setting for package: " + packageNames[i]);
+ unactionablePackages.add(packageNames[i]);
+ }
}
}
return unactionablePackages.toArray(new String[unactionablePackages.size()]);
@@ -13051,6 +13136,7 @@ public class PackageManagerService extends IPackageManager.Stub
@NonNull
private boolean[] canSuspendPackageForUserInternal(@NonNull String[] packageNames, int userId) {
final boolean[] canSuspend = new boolean[packageNames.length];
+ final boolean isCallerOwner = isCallerDeviceOrProfileOwner(userId);
final long callingId = Binder.clearCallingIdentity();
try {
final String activeLauncherPackageName = getActiveLauncherPackageName(userId);
@@ -13100,6 +13186,11 @@ public class PackageManagerService extends IPackageManager.Stub
+ "\": protected package");
continue;
}
+ if (!isCallerOwner && mSettings.getBlockUninstallLPr(userId, packageName)) {
+ Slog.w(TAG, "Cannot suspend package \"" + packageName
+ + "\": blocked by admin");
+ continue;
+ }
// Cannot suspend static shared libs as they are considered
// a part of the using app (emulating static linking). Also
@@ -18449,6 +18540,8 @@ public class PackageManagerService extends IPackageManager.Stub
if (checkPermission(Manifest.permission.SUSPEND_APPS, packageName, userId)
== PERMISSION_GRANTED) {
unsuspendForSuspendingPackage(packageName, userId);
+ removeAllDistractingPackageRestrictions(userId);
+ flushPackageRestrictionsAsUserInternalLocked(userId);
}
}
} else {
@@ -19972,6 +20065,16 @@ public class PackageManagerService extends IPackageManager.Stub
}
synchronized (mLock) {
pkgSetting.setEnabled(newState, userId, callingPackage);
+ if (newState == COMPONENT_ENABLED_STATE_DISABLED_USER
+ || newState == COMPONENT_ENABLED_STATE_DISABLED
+ && pkgSetting.getPermissionsState().hasPermission(
+ Manifest.permission.SUSPEND_APPS, userId)) {
+ // This app should not generally be allowed to get disabled by the UI, but if it
+ // ever does, we don't want to end up with some of the user's apps permanently
+ // blocked
+ unsuspendForSuspendingPackage(packageName, userId);
+ removeAllDistractingPackageRestrictions(userId);
+ }
}
} else {
synchronized (mLock) {
@@ -23213,6 +23316,43 @@ public class PackageManagerService extends IPackageManager.Stub
}
@Override
+ public void removeAllNonSystemPackageSuspensions(int userId) {
+ final String[] allPackages;
+ synchronized (mLock) {
+ allPackages = mPackages.keySet().toArray(new String[mPackages.size()]);
+ }
+ PackageManagerService.this.removeSuspensionsBySuspendingPackage(allPackages,
+ (suspendingPackage) -> !PLATFORM_PACKAGE_NAME.equals(suspendingPackage),
+ userId);
+ }
+
+ @Override
+ public void removeNonSystemPackageSuspensions(String packageName, int userId) {
+ PackageManagerService.this.removeSuspensionsBySuspendingPackage(
+ new String[]{packageName},
+ (suspendingPackage) -> !PLATFORM_PACKAGE_NAME.equals(suspendingPackage),
+ userId);
+ }
+
+ @Override
+ public void flushPackageRestrictions(int userId) {
+ synchronized (mLock) {
+ PackageManagerService.this.flushPackageRestrictionsAsUserInternalLocked(userId);
+ }
+ }
+
+ @Override
+ public void removeDistractingPackageRestrictions(String packageName, int userId) {
+ PackageManagerService.this.removeDistractingPackageRestrictions(
+ new String[]{packageName}, userId);
+ }
+
+ @Override
+ public void removeAllDistractingPackageRestrictions(int userId) {
+ PackageManagerService.this.removeAllDistractingPackageRestrictions(userId);
+ }
+
+ @Override
public String getSuspendingPackage(String suspendedPackage, int userId) {
synchronized (mLock) {
final PackageSetting ps = mSettings.mPackages.get(suspendedPackage);
diff --git a/services/core/java/com/android/server/pm/PackageSettingBase.java b/services/core/java/com/android/server/pm/PackageSettingBase.java
index 18bc879b978b..318a233b6e14 100644
--- a/services/core/java/com/android/server/pm/PackageSettingBase.java
+++ b/services/core/java/com/android/server/pm/PackageSettingBase.java
@@ -43,6 +43,7 @@ import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
+import java.util.function.Predicate;
/**
* Settings base class for pending and resolved classes.
@@ -433,6 +434,22 @@ public abstract class PackageSettingBase extends SettingBase {
existingUserState.suspended = (existingUserState.suspendParams != null);
}
+ void removeSuspension(Predicate<String> suspendingPackagePredicate, int userId) {
+ final PackageUserState existingUserState = modifyUserState(userId);
+ if (existingUserState.suspendParams != null) {
+ for (int i = existingUserState.suspendParams.size() - 1; i >= 0; i--) {
+ final String suspendingPackage = existingUserState.suspendParams.keyAt(i);
+ if (suspendingPackagePredicate.test(suspendingPackage)) {
+ existingUserState.suspendParams.removeAt(i);
+ }
+ }
+ if (existingUserState.suspendParams.size() == 0) {
+ existingUserState.suspendParams = null;
+ }
+ }
+ existingUserState.suspended = (existingUserState.suspendParams != null);
+ }
+
public boolean getInstantApp(int userId) {
return readUserState(userId).instantApp;
}
diff --git a/services/core/java/com/android/server/pm/UserRestrictionsUtils.java b/services/core/java/com/android/server/pm/UserRestrictionsUtils.java
index 27e8b0be4478..8d3f32aab9c5 100644
--- a/services/core/java/com/android/server/pm/UserRestrictionsUtils.java
+++ b/services/core/java/com/android/server/pm/UserRestrictionsUtils.java
@@ -26,6 +26,7 @@ import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.IPackageManager;
import android.content.pm.PackageManager;
+import android.content.pm.PackageManagerInternal;
import android.os.Binder;
import android.os.Bundle;
import android.os.Process;
@@ -42,6 +43,7 @@ import android.util.Slog;
import android.util.SparseArray;
import com.android.internal.util.Preconditions;
+import com.android.server.LocalServices;
import com.google.android.collect.Sets;
@@ -679,6 +681,15 @@ public class UserRestrictionsUtils {
Global.LOCATION_GLOBAL_KILL_SWITCH, "0");
}
break;
+ case UserManager.DISALLOW_APPS_CONTROL:
+ // Intentional fall-through
+ case UserManager.DISALLOW_UNINSTALL_APPS:
+ final PackageManagerInternal pmi = LocalServices.getService(
+ PackageManagerInternal.class);
+ pmi.removeAllNonSystemPackageSuspensions(userId);
+ pmi.removeAllDistractingPackageRestrictions(userId);
+ pmi.flushPackageRestrictions(userId);
+ break;
}
} finally {
Binder.restoreCallingIdentity(id);
diff --git a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
index df6784e818f9..aed2d9bb9dc7 100644
--- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
+++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
@@ -82,6 +82,7 @@ import android.os.SynchronousResultReceiver;
import android.os.SystemClock;
import android.os.SystemProperties;
import android.os.Temperature;
+import android.os.Trace;
import android.os.UserHandle;
import android.os.UserManager;
import android.os.connectivity.WifiActivityEnergyInfo;
@@ -271,127 +272,134 @@ public class StatsPullAtomService extends SystemService {
private class StatsPullAtomCallbackImpl implements StatsManager.StatsPullAtomCallback {
@Override
public int onPullAtom(int atomTag, List<StatsEvent> data) {
- switch(atomTag) {
- case FrameworkStatsLog.WIFI_BYTES_TRANSFER:
- return pullWifiBytesTransfer(atomTag, data);
- case FrameworkStatsLog.WIFI_BYTES_TRANSFER_BY_FG_BG:
- return pullWifiBytesTransferBackground(atomTag, data);
- case FrameworkStatsLog.MOBILE_BYTES_TRANSFER:
- return pullMobileBytesTransfer(atomTag, data);
- case FrameworkStatsLog.MOBILE_BYTES_TRANSFER_BY_FG_BG:
- return pullMobileBytesTransferBackground(atomTag, data);
- case FrameworkStatsLog.BLUETOOTH_BYTES_TRANSFER:
- return pullBluetoothBytesTransfer(atomTag, data);
- case FrameworkStatsLog.KERNEL_WAKELOCK:
- return pullKernelWakelock(atomTag, data);
- case FrameworkStatsLog.CPU_TIME_PER_FREQ:
- return pullCpuTimePerFreq(atomTag, data);
- case FrameworkStatsLog.CPU_TIME_PER_UID:
- return pullCpuTimePerUid(atomTag, data);
- case FrameworkStatsLog.CPU_TIME_PER_UID_FREQ:
- return pullCpuTimeperUidFreq(atomTag, data);
- case FrameworkStatsLog.CPU_ACTIVE_TIME:
- return pullCpuActiveTime(atomTag, data);
- case FrameworkStatsLog.CPU_CLUSTER_TIME:
- return pullCpuClusterTime(atomTag, data);
- case FrameworkStatsLog.WIFI_ACTIVITY_INFO:
- return pullWifiActivityInfo(atomTag, data);
- case FrameworkStatsLog.MODEM_ACTIVITY_INFO:
- return pullModemActivityInfo(atomTag, data);
- case FrameworkStatsLog.BLUETOOTH_ACTIVITY_INFO:
- return pullBluetoothActivityInfo(atomTag, data);
- case FrameworkStatsLog.SYSTEM_ELAPSED_REALTIME:
- return pullSystemElapsedRealtime(atomTag, data);
- case FrameworkStatsLog.SYSTEM_UPTIME:
- return pullSystemUptime(atomTag, data);
- case FrameworkStatsLog.PROCESS_MEMORY_STATE:
- return pullProcessMemoryState(atomTag, data);
- case FrameworkStatsLog.PROCESS_MEMORY_HIGH_WATER_MARK:
- return pullProcessMemoryHighWaterMark(atomTag, data);
- case FrameworkStatsLog.PROCESS_MEMORY_SNAPSHOT:
- return pullProcessMemorySnapshot(atomTag, data);
- case FrameworkStatsLog.SYSTEM_ION_HEAP_SIZE:
- return pullSystemIonHeapSize(atomTag, data);
- case FrameworkStatsLog.ION_HEAP_SIZE:
- return pullIonHeapSize(atomTag, data);
- case FrameworkStatsLog.PROCESS_SYSTEM_ION_HEAP_SIZE:
- return pullProcessSystemIonHeapSize(atomTag, data);
- case FrameworkStatsLog.TEMPERATURE:
- return pullTemperature(atomTag, data);
- case FrameworkStatsLog.COOLING_DEVICE:
- return pullCooldownDevice(atomTag, data);
- case FrameworkStatsLog.BINDER_CALLS:
- return pullBinderCallsStats(atomTag, data);
- case FrameworkStatsLog.BINDER_CALLS_EXCEPTIONS:
- return pullBinderCallsStatsExceptions(atomTag, data);
- case FrameworkStatsLog.LOOPER_STATS:
- return pullLooperStats(atomTag, data);
- case FrameworkStatsLog.DISK_STATS:
- return pullDiskStats(atomTag, data);
- case FrameworkStatsLog.DIRECTORY_USAGE:
- return pullDirectoryUsage(atomTag, data);
- case FrameworkStatsLog.APP_SIZE:
- return pullAppSize(atomTag, data);
- case FrameworkStatsLog.CATEGORY_SIZE:
- return pullCategorySize(atomTag, data);
- case FrameworkStatsLog.NUM_FINGERPRINTS_ENROLLED:
- return pullNumBiometricsEnrolled(
- BiometricsProtoEnums.MODALITY_FINGERPRINT, atomTag, data);
- case FrameworkStatsLog.NUM_FACES_ENROLLED:
- return pullNumBiometricsEnrolled(
- BiometricsProtoEnums.MODALITY_FACE, atomTag, data);
- case FrameworkStatsLog.PROC_STATS:
- return pullProcStats(ProcessStats.REPORT_ALL, atomTag, data);
- case FrameworkStatsLog.PROC_STATS_PKG_PROC:
- return pullProcStats(ProcessStats.REPORT_PKG_PROC_STATS, atomTag, data);
- case FrameworkStatsLog.DISK_IO:
- return pullDiskIO(atomTag, data);
- case FrameworkStatsLog.POWER_PROFILE:
- return pullPowerProfile(atomTag, data);
- case FrameworkStatsLog.PROCESS_CPU_TIME:
- return pullProcessCpuTime(atomTag, data);
- case FrameworkStatsLog.CPU_TIME_PER_THREAD_FREQ:
- return pullCpuTimePerThreadFreq(atomTag, data);
- case FrameworkStatsLog.DEVICE_CALCULATED_POWER_USE:
- return pullDeviceCalculatedPowerUse(atomTag, data);
- case FrameworkStatsLog.DEVICE_CALCULATED_POWER_BLAME_UID:
- return pullDeviceCalculatedPowerBlameUid(atomTag, data);
- case FrameworkStatsLog.DEVICE_CALCULATED_POWER_BLAME_OTHER:
- return pullDeviceCalculatedPowerBlameOther(atomTag, data);
- case FrameworkStatsLog.DEBUG_ELAPSED_CLOCK:
- return pullDebugElapsedClock(atomTag, data);
- case FrameworkStatsLog.DEBUG_FAILING_ELAPSED_CLOCK:
- return pullDebugFailingElapsedClock(atomTag, data);
- case FrameworkStatsLog.BUILD_INFORMATION:
- return pullBuildInformation(atomTag, data);
- case FrameworkStatsLog.ROLE_HOLDER:
- return pullRoleHolder(atomTag, data);
- case FrameworkStatsLog.DANGEROUS_PERMISSION_STATE:
- return pullDangerousPermissionState(atomTag, data);
- case FrameworkStatsLog.TIME_ZONE_DATA_INFO:
- return pullTimeZoneDataInfo(atomTag, data);
- case FrameworkStatsLog.EXTERNAL_STORAGE_INFO:
- return pullExternalStorageInfo(atomTag, data);
- case FrameworkStatsLog.APPS_ON_EXTERNAL_STORAGE_INFO:
- return pullAppsOnExternalStorageInfo(atomTag, data);
- case FrameworkStatsLog.FACE_SETTINGS:
- return pullFaceSettings(atomTag, data);
- case FrameworkStatsLog.APP_OPS:
- return pullAppOps(atomTag, data);
- case FrameworkStatsLog.RUNTIME_APP_OP_ACCESS:
- return pullRuntimeAppOpAccessMessage(atomTag, data);
- case FrameworkStatsLog.NOTIFICATION_REMOTE_VIEWS:
- return pullNotificationRemoteViews(atomTag, data);
- case FrameworkStatsLog.DANGEROUS_PERMISSION_STATE_SAMPLED:
- return pullDangerousPermissionState(atomTag, data);
- case FrameworkStatsLog.BATTERY_LEVEL:
- case FrameworkStatsLog.REMAINING_BATTERY_CAPACITY:
- case FrameworkStatsLog.FULL_BATTERY_CAPACITY:
- case FrameworkStatsLog.BATTERY_VOLTAGE:
- case FrameworkStatsLog.BATTERY_CYCLE_COUNT:
- return pullHealthHal(atomTag, data);
- default:
- throw new UnsupportedOperationException("Unknown tagId=" + atomTag);
+ if (Trace.isTagEnabled(Trace.TRACE_TAG_SYSTEM_SERVER)) {
+ Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "StatsPull-" + atomTag);
+ }
+ try {
+ switch (atomTag) {
+ case FrameworkStatsLog.WIFI_BYTES_TRANSFER:
+ return pullWifiBytesTransfer(atomTag, data);
+ case FrameworkStatsLog.WIFI_BYTES_TRANSFER_BY_FG_BG:
+ return pullWifiBytesTransferBackground(atomTag, data);
+ case FrameworkStatsLog.MOBILE_BYTES_TRANSFER:
+ return pullMobileBytesTransfer(atomTag, data);
+ case FrameworkStatsLog.MOBILE_BYTES_TRANSFER_BY_FG_BG:
+ return pullMobileBytesTransferBackground(atomTag, data);
+ case FrameworkStatsLog.BLUETOOTH_BYTES_TRANSFER:
+ return pullBluetoothBytesTransfer(atomTag, data);
+ case FrameworkStatsLog.KERNEL_WAKELOCK:
+ return pullKernelWakelock(atomTag, data);
+ case FrameworkStatsLog.CPU_TIME_PER_FREQ:
+ return pullCpuTimePerFreq(atomTag, data);
+ case FrameworkStatsLog.CPU_TIME_PER_UID:
+ return pullCpuTimePerUid(atomTag, data);
+ case FrameworkStatsLog.CPU_TIME_PER_UID_FREQ:
+ return pullCpuTimeperUidFreq(atomTag, data);
+ case FrameworkStatsLog.CPU_ACTIVE_TIME:
+ return pullCpuActiveTime(atomTag, data);
+ case FrameworkStatsLog.CPU_CLUSTER_TIME:
+ return pullCpuClusterTime(atomTag, data);
+ case FrameworkStatsLog.WIFI_ACTIVITY_INFO:
+ return pullWifiActivityInfo(atomTag, data);
+ case FrameworkStatsLog.MODEM_ACTIVITY_INFO:
+ return pullModemActivityInfo(atomTag, data);
+ case FrameworkStatsLog.BLUETOOTH_ACTIVITY_INFO:
+ return pullBluetoothActivityInfo(atomTag, data);
+ case FrameworkStatsLog.SYSTEM_ELAPSED_REALTIME:
+ return pullSystemElapsedRealtime(atomTag, data);
+ case FrameworkStatsLog.SYSTEM_UPTIME:
+ return pullSystemUptime(atomTag, data);
+ case FrameworkStatsLog.PROCESS_MEMORY_STATE:
+ return pullProcessMemoryState(atomTag, data);
+ case FrameworkStatsLog.PROCESS_MEMORY_HIGH_WATER_MARK:
+ return pullProcessMemoryHighWaterMark(atomTag, data);
+ case FrameworkStatsLog.PROCESS_MEMORY_SNAPSHOT:
+ return pullProcessMemorySnapshot(atomTag, data);
+ case FrameworkStatsLog.SYSTEM_ION_HEAP_SIZE:
+ return pullSystemIonHeapSize(atomTag, data);
+ case FrameworkStatsLog.ION_HEAP_SIZE:
+ return pullIonHeapSize(atomTag, data);
+ case FrameworkStatsLog.PROCESS_SYSTEM_ION_HEAP_SIZE:
+ return pullProcessSystemIonHeapSize(atomTag, data);
+ case FrameworkStatsLog.TEMPERATURE:
+ return pullTemperature(atomTag, data);
+ case FrameworkStatsLog.COOLING_DEVICE:
+ return pullCooldownDevice(atomTag, data);
+ case FrameworkStatsLog.BINDER_CALLS:
+ return pullBinderCallsStats(atomTag, data);
+ case FrameworkStatsLog.BINDER_CALLS_EXCEPTIONS:
+ return pullBinderCallsStatsExceptions(atomTag, data);
+ case FrameworkStatsLog.LOOPER_STATS:
+ return pullLooperStats(atomTag, data);
+ case FrameworkStatsLog.DISK_STATS:
+ return pullDiskStats(atomTag, data);
+ case FrameworkStatsLog.DIRECTORY_USAGE:
+ return pullDirectoryUsage(atomTag, data);
+ case FrameworkStatsLog.APP_SIZE:
+ return pullAppSize(atomTag, data);
+ case FrameworkStatsLog.CATEGORY_SIZE:
+ return pullCategorySize(atomTag, data);
+ case FrameworkStatsLog.NUM_FINGERPRINTS_ENROLLED:
+ return pullNumBiometricsEnrolled(
+ BiometricsProtoEnums.MODALITY_FINGERPRINT, atomTag, data);
+ case FrameworkStatsLog.NUM_FACES_ENROLLED:
+ return pullNumBiometricsEnrolled(
+ BiometricsProtoEnums.MODALITY_FACE, atomTag, data);
+ case FrameworkStatsLog.PROC_STATS:
+ return pullProcStats(ProcessStats.REPORT_ALL, atomTag, data);
+ case FrameworkStatsLog.PROC_STATS_PKG_PROC:
+ return pullProcStats(ProcessStats.REPORT_PKG_PROC_STATS, atomTag, data);
+ case FrameworkStatsLog.DISK_IO:
+ return pullDiskIO(atomTag, data);
+ case FrameworkStatsLog.POWER_PROFILE:
+ return pullPowerProfile(atomTag, data);
+ case FrameworkStatsLog.PROCESS_CPU_TIME:
+ return pullProcessCpuTime(atomTag, data);
+ case FrameworkStatsLog.CPU_TIME_PER_THREAD_FREQ:
+ return pullCpuTimePerThreadFreq(atomTag, data);
+ case FrameworkStatsLog.DEVICE_CALCULATED_POWER_USE:
+ return pullDeviceCalculatedPowerUse(atomTag, data);
+ case FrameworkStatsLog.DEVICE_CALCULATED_POWER_BLAME_UID:
+ return pullDeviceCalculatedPowerBlameUid(atomTag, data);
+ case FrameworkStatsLog.DEVICE_CALCULATED_POWER_BLAME_OTHER:
+ return pullDeviceCalculatedPowerBlameOther(atomTag, data);
+ case FrameworkStatsLog.DEBUG_ELAPSED_CLOCK:
+ return pullDebugElapsedClock(atomTag, data);
+ case FrameworkStatsLog.DEBUG_FAILING_ELAPSED_CLOCK:
+ return pullDebugFailingElapsedClock(atomTag, data);
+ case FrameworkStatsLog.BUILD_INFORMATION:
+ return pullBuildInformation(atomTag, data);
+ case FrameworkStatsLog.ROLE_HOLDER:
+ return pullRoleHolder(atomTag, data);
+ case FrameworkStatsLog.DANGEROUS_PERMISSION_STATE:
+ return pullDangerousPermissionState(atomTag, data);
+ case FrameworkStatsLog.TIME_ZONE_DATA_INFO:
+ return pullTimeZoneDataInfo(atomTag, data);
+ case FrameworkStatsLog.EXTERNAL_STORAGE_INFO:
+ return pullExternalStorageInfo(atomTag, data);
+ case FrameworkStatsLog.APPS_ON_EXTERNAL_STORAGE_INFO:
+ return pullAppsOnExternalStorageInfo(atomTag, data);
+ case FrameworkStatsLog.FACE_SETTINGS:
+ return pullFaceSettings(atomTag, data);
+ case FrameworkStatsLog.APP_OPS:
+ return pullAppOps(atomTag, data);
+ case FrameworkStatsLog.RUNTIME_APP_OP_ACCESS:
+ return pullRuntimeAppOpAccessMessage(atomTag, data);
+ case FrameworkStatsLog.NOTIFICATION_REMOTE_VIEWS:
+ return pullNotificationRemoteViews(atomTag, data);
+ case FrameworkStatsLog.DANGEROUS_PERMISSION_STATE_SAMPLED:
+ return pullDangerousPermissionState(atomTag, data);
+ case FrameworkStatsLog.BATTERY_LEVEL:
+ case FrameworkStatsLog.REMAINING_BATTERY_CAPACITY:
+ case FrameworkStatsLog.FULL_BATTERY_CAPACITY:
+ case FrameworkStatsLog.BATTERY_VOLTAGE:
+ case FrameworkStatsLog.BATTERY_CYCLE_COUNT:
+ return pullHealthHal(atomTag, data);
+ default:
+ throw new UnsupportedOperationException("Unknown tagId=" + atomTag);
+ }
+ } finally {
+ Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
}
}
}
diff --git a/services/core/java/com/android/server/wm/InputManagerCallback.java b/services/core/java/com/android/server/wm/InputManagerCallback.java
index 5b892f808e2f..deaec0ac75ae 100644
--- a/services/core/java/com/android/server/wm/InputManagerCallback.java
+++ b/services/core/java/com/android/server/wm/InputManagerCallback.java
@@ -158,7 +158,8 @@ final class InputManagerCallback implements InputManagerService.WindowManagerCal
}
final File tracesFile = ActivityManagerService.dumpStackTraces(firstPids,
- null /* processCpuTracker */, null /* lastPids */, nativePids);
+ null /* processCpuTracker */, null /* lastPids */, nativePids,
+ null /* logExceptionCreatingFile */);
if (tracesFile != null) {
tracesFile.renameTo(new File(tracesFile.getParent(), tracesFile.getName() + "_pre"));
}
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index 46d8800463eb..440b779b8566 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -11176,6 +11176,12 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
mInjector.binderRestoreCallingIdentity(id);
}
}
+ if (uninstallBlocked) {
+ final PackageManagerInternal pmi = mInjector.getPackageManagerInternal();
+ pmi.removeNonSystemPackageSuspensions(packageName, userId);
+ pmi.removeDistractingPackageRestrictions(packageName, userId);
+ pmi.flushPackageRestrictions(userId);
+ }
final boolean isDelegate = (who == null);
DevicePolicyEventLogger
.createEvent(DevicePolicyEnums.SET_UNINSTALL_BLOCKED)
diff --git a/tests/net/common/java/android/net/NetworkScoreTest.kt b/tests/net/common/java/android/net/NetworkScoreTest.kt
index a7e33b3d63b6..a63d58d5a0f6 100644
--- a/tests/net/common/java/android/net/NetworkScoreTest.kt
+++ b/tests/net/common/java/android/net/NetworkScoreTest.kt
@@ -16,9 +16,7 @@
package android.net
-import android.net.NetworkScore.POLICY_DEFAULT_SUBSCRIPTION
-import android.net.NetworkScore.POLICY_IGNORE_ON_WIFI
-import android.net.NetworkScore.RANGE_MEDIUM
+import android.net.NetworkScore.Metrics.BANDWIDTH_UNKNOWN
import androidx.test.filters.SmallTest
import androidx.test.runner.AndroidJUnit4
import com.android.testutils.assertParcelSane
@@ -34,30 +32,26 @@ private const val TEST_SCORE = 80
@RunWith(AndroidJUnit4::class)
@SmallTest
class NetworkScoreTest {
- private fun makeScoreBuilder() = NetworkScore.Builder()
- .setLegacyScore(TEST_SCORE)
- .addPolicy(POLICY_IGNORE_ON_WIFI)
- .addPolicy(POLICY_DEFAULT_SUBSCRIPTION)
- .setExiting(false)
- .setEndToEndMetrics(NetworkScore.Metrics(145 /* latency */,
- 2500 /* downlinkBandwidth */, 1430 /* uplinkBandwidth */))
- .setRange(RANGE_MEDIUM)
- .setSignalStrength(400)
-
@Test
fun testParcelNetworkScore() {
val defaultCap = NetworkCapabilities()
- val legacyBuilder = NetworkScore.Builder().setLegacyScore(TEST_SCORE)
- assertEquals(TEST_SCORE, legacyBuilder.build().getLegacyScore())
- assertParcelSane(legacyBuilder.build(), 7)
+ val builder = NetworkScore.Builder().setLegacyScore(TEST_SCORE)
+ assertEquals(TEST_SCORE, builder.build().getLegacyScore())
+ assertParcelSane(builder.build(), 7)
- val builder = makeScoreBuilder()
+ builder.addPolicy(NetworkScore.POLICY_IGNORE_ON_WIFI)
+ .addPolicy(NetworkScore.POLICY_DEFAULT_SUBSCRIPTION)
+ .setLinkLayerMetrics(NetworkScore.Metrics(44 /* latency */,
+ 380 /* downlinkBandwidth */, BANDWIDTH_UNKNOWN /* uplinkBandwidth */))
+ .setEndToEndMetrics(NetworkScore.Metrics(11 /* latency */,
+ BANDWIDTH_UNKNOWN /* downlinkBandwidth */, 100_000 /* uplinkBandwidth */))
+ .setRange(NetworkScore.RANGE_MEDIUM)
assertParcelSane(builder.build(), 7)
- builder.clearPolicy(POLICY_IGNORE_ON_WIFI)
+ builder.clearPolicy(NetworkScore.POLICY_IGNORE_ON_WIFI)
val ns = builder.build()
assertParcelSane(ns, 7)
- assertFalse(ns.hasPolicy(POLICY_IGNORE_ON_WIFI))
- assertTrue(ns.hasPolicy(POLICY_DEFAULT_SUBSCRIPTION))
+ assertFalse(ns.hasPolicy(NetworkScore.POLICY_IGNORE_ON_WIFI))
+ assertTrue(ns.hasPolicy(NetworkScore.POLICY_DEFAULT_SUBSCRIPTION))
val exitingNs = ns.withExiting(true)
assertNotEquals(ns.isExiting, exitingNs.isExiting)
@@ -79,10 +73,4 @@ class NetworkScoreTest {
assertTrue(builder1.build().equals(builder2.build()))
assertEquals(builder1.build().hashCode(), builder2.build().hashCode())
}
-
- @Test
- fun testBuilderEquals() {
- val ns = makeScoreBuilder().build()
- assertEquals(ns, NetworkScore.Builder(ns).build())
- }
}
diff --git a/tests/net/java/com/android/server/connectivity/NetworkRankerTest.kt b/tests/net/java/com/android/server/connectivity/NetworkRankerTest.kt
index a6b371a23b58..86c91165f61b 100644
--- a/tests/net/java/com/android/server/connectivity/NetworkRankerTest.kt
+++ b/tests/net/java/com/android/server/connectivity/NetworkRankerTest.kt
@@ -16,7 +16,6 @@
package com.android.server.connectivity
-import android.net.NetworkCapabilities
import android.net.NetworkRequest
import androidx.test.filters.SmallTest
import androidx.test.runner.AndroidJUnit4
@@ -36,7 +35,6 @@ class NetworkRankerTest {
private fun makeNai(satisfy: Boolean, score: Int) = mock(NetworkAgentInfo::class.java).also {
doReturn(satisfy).`when`(it).satisfies(any())
doReturn(score).`when`(it).currentScore
- it.networkCapabilities = NetworkCapabilities()
}
@Test
diff --git a/wifi/Android.bp b/wifi/Android.bp
index 5c9fb4e86bc7..0c6cf1c170f5 100644
--- a/wifi/Android.bp
+++ b/wifi/Android.bp
@@ -89,6 +89,7 @@ java_library {
],
srcs: [
":framework-wifi-updatable-sources",
+ ":framework-wifi-util-lib-aidls",
],
// java_api_finder must accompany `srcs`
plugins: ["java_api_finder"],