Merge "Added sanitization for CompoundButton and RadioGroup."
diff --git a/Android.mk b/Android.mk
index b98d3bc..e372fda 100644
--- a/Android.mk
+++ b/Android.mk
@@ -213,7 +213,6 @@
core/java/android/hardware/usb/IUsbManager.aidl \
core/java/android/net/ICaptivePortal.aidl \
core/java/android/net/IConnectivityManager.aidl \
- core/java/android/net/IConnectivityMetricsLogger.aidl \
core/java/android/net/IIpConnectivityMetrics.aidl \
core/java/android/net/IEthernetManager.aidl \
core/java/android/net/IEthernetServiceListener.aidl \
diff --git a/api/current.txt b/api/current.txt
index bdca2c8..4e7057c 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -2722,10 +2722,10 @@
method public final android.accessibilityservice.AccessibilityServiceInfo getServiceInfo();
method public final android.accessibilityservice.AccessibilityService.SoftKeyboardController getSoftKeyboardController();
method public java.util.List<android.view.accessibility.AccessibilityWindowInfo> getWindows();
- method public abstract void onAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
+ method public void onAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
method public final android.os.IBinder onBind(android.content.Intent);
method protected boolean onGesture(int);
- method public abstract void onInterrupt();
+ method public void onInterrupt();
method protected boolean onKeyEvent(android.view.KeyEvent);
method protected void onServiceConnected();
method public final boolean performGlobalAction(int);
@@ -6883,6 +6883,7 @@
method public long getFreeBytes(java.lang.String);
method public long getTotalBytes(java.lang.String);
method public android.app.usage.ExternalStorageStats queryExternalStatsForUser(java.lang.String, android.os.UserHandle);
+ method public android.app.usage.StorageStats queryStatsForPackage(java.lang.String, java.lang.String, android.os.UserHandle);
method public android.app.usage.StorageStats queryStatsForUid(java.lang.String, int);
method public android.app.usage.StorageStats queryStatsForUser(java.lang.String, android.os.UserHandle);
}
@@ -20798,6 +20799,7 @@
field public static final int AUDIOFOCUS_LOSS = -1; // 0xffffffff
field public static final int AUDIOFOCUS_LOSS_TRANSIENT = -2; // 0xfffffffe
field public static final int AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK = -3; // 0xfffffffd
+ field public static final int AUDIOFOCUS_NONE = 0; // 0x0
field public static final int AUDIOFOCUS_REQUEST_FAILED = 0; // 0x0
field public static final int AUDIOFOCUS_REQUEST_GRANTED = 1; // 0x1
field public static final int AUDIO_SESSION_ID_GENERATE = 0; // 0x0
@@ -40153,7 +40155,7 @@
package android.test.suitebuilder {
- public class TestMethod {
+ public deprecated class TestMethod {
ctor public TestMethod(java.lang.reflect.Method, java.lang.Class<? extends junit.framework.TestCase>);
ctor public TestMethod(java.lang.String, java.lang.Class<? extends junit.framework.TestCase>);
ctor public TestMethod(junit.framework.TestCase);
@@ -40164,7 +40166,7 @@
method public java.lang.String getName();
}
- public class TestSuiteBuilder {
+ public deprecated class TestSuiteBuilder {
ctor public TestSuiteBuilder(java.lang.Class);
ctor public TestSuiteBuilder(java.lang.String, java.lang.ClassLoader);
method public android.test.suitebuilder.TestSuiteBuilder addRequirements(java.util.List<com.android.internal.util.Predicate<android.test.suitebuilder.TestMethod>>);
@@ -40177,7 +40179,7 @@
method public android.test.suitebuilder.TestSuiteBuilder named(java.lang.String);
}
- public static class TestSuiteBuilder.FailedToCreateTests extends junit.framework.TestCase {
+ public static deprecated class TestSuiteBuilder.FailedToCreateTests extends junit.framework.TestCase {
ctor public TestSuiteBuilder.FailedToCreateTests(java.lang.Exception);
method public void testSuiteConstructionFailed();
}
@@ -50826,6 +50828,8 @@
method public int resolveAdjustedSize(int, int);
method public void resume();
method public void seekTo(int);
+ method public void setAudioAttributes(android.media.AudioAttributes);
+ method public void setAudioFocusRequest(int);
method public void setMediaController(android.widget.MediaController);
method public void setOnCompletionListener(android.media.MediaPlayer.OnCompletionListener);
method public void setOnErrorListener(android.media.MediaPlayer.OnErrorListener);
@@ -50930,7 +50934,7 @@
package com.android.internal.util {
- public abstract interface Predicate<T> {
+ public abstract deprecated interface Predicate<T> {
method public abstract boolean apply(T);
}
diff --git a/api/system-current.txt b/api/system-current.txt
index 6ecf0f5..8bce101 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -2842,10 +2842,10 @@
method public final android.accessibilityservice.AccessibilityServiceInfo getServiceInfo();
method public final android.accessibilityservice.AccessibilityService.SoftKeyboardController getSoftKeyboardController();
method public java.util.List<android.view.accessibility.AccessibilityWindowInfo> getWindows();
- method public abstract void onAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
+ method public void onAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
method public final android.os.IBinder onBind(android.content.Intent);
method protected boolean onGesture(int);
- method public abstract void onInterrupt();
+ method public void onInterrupt();
method protected boolean onKeyEvent(android.view.KeyEvent);
method protected void onServiceConnected();
method public final boolean performGlobalAction(int);
@@ -7305,6 +7305,7 @@
method public long getFreeBytes(java.lang.String);
method public long getTotalBytes(java.lang.String);
method public android.app.usage.ExternalStorageStats queryExternalStatsForUser(java.lang.String, android.os.UserHandle);
+ method public android.app.usage.StorageStats queryStatsForPackage(java.lang.String, java.lang.String, android.os.UserHandle);
method public android.app.usage.StorageStats queryStatsForUid(java.lang.String, int);
method public android.app.usage.StorageStats queryStatsForUser(java.lang.String, android.os.UserHandle);
}
@@ -22465,6 +22466,7 @@
field public static final int AUDIOFOCUS_LOSS = -1; // 0xffffffff
field public static final int AUDIOFOCUS_LOSS_TRANSIENT = -2; // 0xfffffffe
field public static final int AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK = -3; // 0xfffffffd
+ field public static final int AUDIOFOCUS_NONE = 0; // 0x0
field public static final int AUDIOFOCUS_REQUEST_FAILED = 0; // 0x0
field public static final int AUDIOFOCUS_REQUEST_GRANTED = 1; // 0x1
field public static final int AUDIO_SESSION_ID_GENERATE = 0; // 0x0
@@ -26829,44 +26831,6 @@
method public void onTetheringStarted();
}
- public final class ConnectivityMetricsEvent implements android.os.Parcelable {
- ctor public ConnectivityMetricsEvent(long, int, int, android.os.Parcelable);
- method public int describeContents();
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.net.ConnectivityMetricsEvent> CREATOR;
- field public final int componentTag;
- field public final android.os.Parcelable data;
- field public final int eventTag;
- field public final long timestamp;
- }
-
- public static final class ConnectivityMetricsEvent.Reference implements android.os.Parcelable {
- ctor public ConnectivityMetricsEvent.Reference(long);
- method public int describeContents();
- method public long getValue();
- method public void readFromParcel(android.os.Parcel);
- method public void setValue(long);
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.net.ConnectivityMetricsEvent.Reference> CREATOR;
- }
-
- public class ConnectivityMetricsLogger {
- ctor public ConnectivityMetricsLogger();
- method public android.net.ConnectivityMetricsEvent[] getEvents(android.net.ConnectivityMetricsEvent.Reference);
- method public void logEvent(long, int, int, android.os.Parcelable);
- method public boolean register(android.app.PendingIntent);
- method public boolean unregister(android.app.PendingIntent);
- field public static final int COMPONENT_TAG_BLUETOOTH = 1; // 0x1
- field public static final int COMPONENT_TAG_CONNECTIVITY = 0; // 0x0
- field public static final int COMPONENT_TAG_TELECOM = 3; // 0x3
- field public static final int COMPONENT_TAG_TELEPHONY = 4; // 0x4
- field public static final int COMPONENT_TAG_WIFI = 2; // 0x2
- field public static final java.lang.String CONNECTIVITY_METRICS_LOGGER_SERVICE = "connectivity_metrics_logger";
- field public static final java.lang.String DATA_KEY_EVENTS_COUNT = "count";
- field public static final int NUMBER_OF_COMPONENTS = 5; // 0x5
- field public static final int TAG_SKIPPED_EVENTS = -1; // 0xffffffff
- }
-
public class Credentials {
ctor public Credentials(int, int, int);
method public int getGid();
@@ -27578,175 +27542,6 @@
}
-package android.net.metrics {
-
- public final class ApfProgramEvent implements android.os.Parcelable {
- method public int describeContents();
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.net.metrics.ApfProgramEvent> CREATOR;
- field public static final int FLAG_HAS_IPV4_ADDRESS = 1; // 0x1
- field public static final int FLAG_MULTICAST_FILTER_ON = 0; // 0x0
- field public final int currentRas;
- field public final int filteredRas;
- field public final int flags;
- field public final long lifetime;
- field public final int programLength;
- }
-
- public final class ApfStats implements android.os.Parcelable {
- method public int describeContents();
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.net.metrics.ApfStats> CREATOR;
- field public final int droppedRas;
- field public final long durationMs;
- field public final int matchingRas;
- field public final int maxProgramSize;
- field public final int parseErrors;
- field public final int programUpdates;
- field public final int receivedRas;
- field public final int zeroLifetimeRas;
- }
-
- public final class DefaultNetworkEvent implements android.os.Parcelable {
- method public int describeContents();
- method public static void logEvent(int, int[], int, boolean, boolean);
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.net.metrics.DefaultNetworkEvent> CREATOR;
- field public final int netId;
- field public final boolean prevIPv4;
- field public final boolean prevIPv6;
- field public final int prevNetId;
- field public final int[] transportTypes;
- }
-
- public final class DhcpClientEvent implements android.os.Parcelable {
- method public int describeContents();
- method public static void logStateEvent(java.lang.String, java.lang.String);
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.net.metrics.DhcpClientEvent> CREATOR;
- field public final int durationMs;
- field public final java.lang.String ifName;
- field public final java.lang.String msg;
- }
-
- public final class DhcpErrorEvent implements android.os.Parcelable {
- method public int describeContents();
- method public static int errorCodeWithOption(int, int);
- method public static void logParseError(java.lang.String, int);
- method public static void logReceiveError(java.lang.String);
- method public void writeToParcel(android.os.Parcel, int);
- field public static final int BOOTP_TOO_SHORT;
- field public static final int BUFFER_UNDERFLOW;
- field public static final android.os.Parcelable.Creator<android.net.metrics.DhcpErrorEvent> CREATOR;
- field public static final int DHCP_BAD_MAGIC_COOKIE;
- field public static final int DHCP_ERROR = 4; // 0x4
- field public static final int DHCP_INVALID_OPTION_LENGTH;
- field public static final int DHCP_NO_MSG_TYPE;
- field public static final int DHCP_UNKNOWN_MSG_TYPE;
- field public static final int L2_ERROR = 1; // 0x1
- field public static final int L2_TOO_SHORT;
- field public static final int L2_WRONG_ETH_TYPE;
- field public static final int L3_ERROR = 2; // 0x2
- field public static final int L3_INVALID_IP;
- field public static final int L3_NOT_IPV4;
- field public static final int L3_TOO_SHORT;
- field public static final int L4_ERROR = 3; // 0x3
- field public static final int L4_NOT_UDP;
- field public static final int L4_WRONG_PORT;
- field public static final int MISC_ERROR = 5; // 0x5
- field public static final int RECEIVE_ERROR;
- field public final int errorCode;
- field public final java.lang.String ifName;
- }
-
- public final class DnsEvent implements android.os.Parcelable {
- method public int describeContents();
- method public static void logEvent(int, byte[], byte[], int[]);
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.net.metrics.DnsEvent> CREATOR;
- field public final byte[] eventTypes;
- field public final int[] latenciesMs;
- field public final int netId;
- field public final byte[] returnCodes;
- }
-
- public final class IpManagerEvent implements android.os.Parcelable {
- method public int describeContents();
- method public static void logEvent(int, java.lang.String, long);
- method public void writeToParcel(android.os.Parcel, int);
- field public static final int COMPLETE_LIFECYCLE = 3; // 0x3
- field public static final android.os.Parcelable.Creator<android.net.metrics.IpManagerEvent> CREATOR;
- field public static final int PROVISIONING_FAIL = 2; // 0x2
- field public static final int PROVISIONING_OK = 1; // 0x1
- field public final long durationMs;
- field public final int eventType;
- field public final java.lang.String ifName;
- }
-
- public final class IpReachabilityEvent implements android.os.Parcelable {
- method public int describeContents();
- method public static void logNudFailed(java.lang.String);
- method public static void logProbeEvent(java.lang.String, int);
- method public static void logProvisioningLost(java.lang.String);
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.net.metrics.IpReachabilityEvent> CREATOR;
- field public static final int NUD_FAILED = 512; // 0x200
- field public static final int PROBE = 256; // 0x100
- field public static final int PROVISIONING_LOST = 768; // 0x300
- field public final int eventType;
- field public final java.lang.String ifName;
- }
-
- public final class NetworkEvent implements android.os.Parcelable {
- method public int describeContents();
- method public static void logCaptivePortalFound(int, long);
- method public static void logEvent(int, int);
- method public static void logValidated(int, long);
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.net.metrics.NetworkEvent> CREATOR;
- field public static final int NETWORK_CAPTIVE_PORTAL_FOUND = 4; // 0x4
- field public static final int NETWORK_CONNECTED = 1; // 0x1
- field public static final int NETWORK_DISCONNECTED = 7; // 0x7
- field public static final int NETWORK_LINGER = 5; // 0x5
- field public static final int NETWORK_UNLINGER = 6; // 0x6
- field public static final int NETWORK_VALIDATED = 2; // 0x2
- field public static final int NETWORK_VALIDATION_FAILED = 3; // 0x3
- field public final long durationMs;
- field public final int eventType;
- field public final int netId;
- }
-
- public final class RaEvent implements android.os.Parcelable {
- method public int describeContents();
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.net.metrics.RaEvent> CREATOR;
- field public final long dnsslLifetime;
- field public final long prefixPreferredLifetime;
- field public final long prefixValidLifetime;
- field public final long rdnssLifetime;
- field public final long routeInfoLifetime;
- field public final long routerLifetime;
- }
-
- public final class ValidationProbeEvent implements android.os.Parcelable {
- method public int describeContents();
- method public static void logEvent(int, long, int, int);
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.net.metrics.ValidationProbeEvent> CREATOR;
- field public static final int DNS_FAILURE = 0; // 0x0
- field public static final int DNS_SUCCESS = 1; // 0x1
- field public static final int PROBE_DNS = 0; // 0x0
- field public static final int PROBE_HTTP = 1; // 0x1
- field public static final int PROBE_HTTPS = 2; // 0x2
- field public static final int PROBE_PAC = 3; // 0x3
- field public final long durationMs;
- field public final int netId;
- field public final int probeType;
- field public final int returnCode;
- }
-
-}
-
package android.net.nsd {
public final class NsdManager {
@@ -43697,7 +43492,7 @@
package android.test.suitebuilder {
- public class TestMethod {
+ public deprecated class TestMethod {
ctor public TestMethod(java.lang.reflect.Method, java.lang.Class<? extends junit.framework.TestCase>);
ctor public TestMethod(java.lang.String, java.lang.Class<? extends junit.framework.TestCase>);
ctor public TestMethod(junit.framework.TestCase);
@@ -43708,7 +43503,7 @@
method public java.lang.String getName();
}
- public class TestSuiteBuilder {
+ public deprecated class TestSuiteBuilder {
ctor public TestSuiteBuilder(java.lang.Class);
ctor public TestSuiteBuilder(java.lang.String, java.lang.ClassLoader);
method public android.test.suitebuilder.TestSuiteBuilder addRequirements(java.util.List<com.android.internal.util.Predicate<android.test.suitebuilder.TestMethod>>);
@@ -43721,7 +43516,7 @@
method public android.test.suitebuilder.TestSuiteBuilder named(java.lang.String);
}
- public static class TestSuiteBuilder.FailedToCreateTests extends junit.framework.TestCase {
+ public static deprecated class TestSuiteBuilder.FailedToCreateTests extends junit.framework.TestCase {
ctor public TestSuiteBuilder.FailedToCreateTests(java.lang.Exception);
method public void testSuiteConstructionFailed();
}
@@ -54735,6 +54530,8 @@
method public int resolveAdjustedSize(int, int);
method public void resume();
method public void seekTo(int);
+ method public void setAudioAttributes(android.media.AudioAttributes);
+ method public void setAudioFocusRequest(int);
method public void setMediaController(android.widget.MediaController);
method public void setOnCompletionListener(android.media.MediaPlayer.OnCompletionListener);
method public void setOnErrorListener(android.media.MediaPlayer.OnErrorListener);
@@ -54839,7 +54636,7 @@
package com.android.internal.util {
- public abstract interface Predicate<T> {
+ public abstract deprecated interface Predicate<T> {
method public abstract boolean apply(T);
}
diff --git a/api/test-current.txt b/api/test-current.txt
index 50d5bb8..cb417bf 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -2722,10 +2722,10 @@
method public final android.accessibilityservice.AccessibilityServiceInfo getServiceInfo();
method public final android.accessibilityservice.AccessibilityService.SoftKeyboardController getSoftKeyboardController();
method public java.util.List<android.view.accessibility.AccessibilityWindowInfo> getWindows();
- method public abstract void onAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
+ method public void onAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
method public final android.os.IBinder onBind(android.content.Intent);
method protected boolean onGesture(int);
- method public abstract void onInterrupt();
+ method public void onInterrupt();
method protected boolean onKeyEvent(android.view.KeyEvent);
method protected void onServiceConnected();
method public final boolean performGlobalAction(int);
@@ -6909,6 +6909,7 @@
method public long getFreeBytes(java.lang.String);
method public long getTotalBytes(java.lang.String);
method public android.app.usage.ExternalStorageStats queryExternalStatsForUser(java.lang.String, android.os.UserHandle);
+ method public android.app.usage.StorageStats queryStatsForPackage(java.lang.String, java.lang.String, android.os.UserHandle);
method public android.app.usage.StorageStats queryStatsForUid(java.lang.String, int);
method public android.app.usage.StorageStats queryStatsForUser(java.lang.String, android.os.UserHandle);
}
@@ -20894,6 +20895,7 @@
field public static final int AUDIOFOCUS_LOSS = -1; // 0xffffffff
field public static final int AUDIOFOCUS_LOSS_TRANSIENT = -2; // 0xfffffffe
field public static final int AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK = -3; // 0xfffffffd
+ field public static final int AUDIOFOCUS_NONE = 0; // 0x0
field public static final int AUDIOFOCUS_REQUEST_FAILED = 0; // 0x0
field public static final int AUDIOFOCUS_REQUEST_GRANTED = 1; // 0x1
field public static final int AUDIO_SESSION_ID_GENERATE = 0; // 0x0
@@ -40341,7 +40343,7 @@
package android.test.suitebuilder {
- public class TestMethod {
+ public deprecated class TestMethod {
ctor public TestMethod(java.lang.reflect.Method, java.lang.Class<? extends junit.framework.TestCase>);
ctor public TestMethod(java.lang.String, java.lang.Class<? extends junit.framework.TestCase>);
ctor public TestMethod(junit.framework.TestCase);
@@ -40352,7 +40354,7 @@
method public java.lang.String getName();
}
- public class TestSuiteBuilder {
+ public deprecated class TestSuiteBuilder {
ctor public TestSuiteBuilder(java.lang.Class);
ctor public TestSuiteBuilder(java.lang.String, java.lang.ClassLoader);
method public android.test.suitebuilder.TestSuiteBuilder addRequirements(java.util.List<com.android.internal.util.Predicate<android.test.suitebuilder.TestMethod>>);
@@ -40365,7 +40367,7 @@
method public android.test.suitebuilder.TestSuiteBuilder named(java.lang.String);
}
- public static class TestSuiteBuilder.FailedToCreateTests extends junit.framework.TestCase {
+ public static deprecated class TestSuiteBuilder.FailedToCreateTests extends junit.framework.TestCase {
ctor public TestSuiteBuilder.FailedToCreateTests(java.lang.Exception);
method public void testSuiteConstructionFailed();
}
@@ -51205,6 +51207,8 @@
method public int resolveAdjustedSize(int, int);
method public void resume();
method public void seekTo(int);
+ method public void setAudioAttributes(android.media.AudioAttributes);
+ method public void setAudioFocusRequest(int);
method public void setMediaController(android.widget.MediaController);
method public void setOnCompletionListener(android.media.MediaPlayer.OnCompletionListener);
method public void setOnErrorListener(android.media.MediaPlayer.OnErrorListener);
@@ -51309,7 +51313,7 @@
package com.android.internal.util {
- public abstract interface Predicate<T> {
+ public abstract deprecated interface Predicate<T> {
method public abstract boolean apply(T);
}
diff --git a/core/java/android/accessibilityservice/AccessibilityService.java b/core/java/android/accessibilityservice/AccessibilityService.java
index b4e119e..3884748 100644
--- a/core/java/android/accessibilityservice/AccessibilityService.java
+++ b/core/java/android/accessibilityservice/AccessibilityService.java
@@ -421,12 +421,12 @@
* this method returns. Services wishing to use the event after this method returns should
* make a copy.
*/
- public abstract void onAccessibilityEvent(AccessibilityEvent event);
+ public void onAccessibilityEvent(AccessibilityEvent event) {}
/**
* Callback for interrupting the accessibility feedback.
*/
- public abstract void onInterrupt();
+ public void onInterrupt() {}
/**
* Dispatches service connection to internal components first, then the
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index 6fc60e9..a820da4 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -844,6 +844,8 @@
private boolean mHasCurrentPermissionsRequest;
+ private boolean mAutoFillResetNeeded;
+
private static native String getDlWarning();
/** Return the intent that started this activity. */
@@ -1780,7 +1782,7 @@
getApplication().dispatchActivityStopped(this);
mTranslucentCallback = null;
mCalled = true;
- if (isFinishing() && AutoFillManager.isClientActive(getActivityToken())) {
+ if (isFinishing() && mAutoFillResetNeeded) {
getSystemService(AutoFillManager.class).reset();
}
}
@@ -6746,8 +6748,6 @@
mCurrentConfig = config;
mWindow.setColorMode(info.colorMode);
-
- AutoFillManager.addClient(token, this);
}
/** @hide */
@@ -7214,6 +7214,12 @@
}
}
+ /** @hide */
+ @Override
+ public void resetableStateAvailable() {
+ mAutoFillResetNeeded = true;
+ }
+
class HostCallbacks extends FragmentHostCallback<Activity> {
public HostCallbacks() {
super(Activity.this /*activity*/);
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 7ff11ec..4c2f51f 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -2773,7 +2773,7 @@
for (int id : dm.getDisplayIds()) {
if (id != Display.DEFAULT_DISPLAY) {
Display display =
- dm.getCompatibleDisplay(id, appContext.getDisplayAdjustments(id));
+ dm.getCompatibleDisplay(id, appContext.getResources());
appContext = (ContextImpl) appContext.createDisplayContext(display);
break;
}
diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java
index 045bd0a..3e9b987 100644
--- a/core/java/android/app/ContextImpl.java
+++ b/core/java/android/app/ContextImpl.java
@@ -2067,24 +2067,17 @@
@Override
public Display getDisplay() {
- final DisplayAdjustments displayAdjustments = mResources.getDisplayAdjustments();
if (mDisplay == null) {
return mResourcesManager.getAdjustedDisplay(Display.DEFAULT_DISPLAY,
- displayAdjustments);
+ mResources);
}
- if (!mDisplay.getDisplayAdjustments().equals(displayAdjustments)) {
- mDisplay = mResourcesManager.getAdjustedDisplay(mDisplay.getDisplayId(),
- displayAdjustments);
- }
return mDisplay;
}
@Override
public void updateDisplay(int displayId) {
- final DisplayAdjustments displayAdjustments = mResources.getDisplayAdjustments();
- mDisplay = mResourcesManager.getAdjustedDisplay(displayId,
- displayAdjustments);
+ mDisplay = mResourcesManager.getAdjustedDisplay(displayId, mResources);
}
@Override
@@ -2202,7 +2195,7 @@
compatInfo,
classLoader);
context.mDisplay = resourcesManager.getAdjustedDisplay(displayId,
- context.mResources.getDisplayAdjustments());
+ context.getResources());
return context;
}
diff --git a/core/java/android/app/ResourcesManager.java b/core/java/android/app/ResourcesManager.java
index 55f7df3..52ec045 100644
--- a/core/java/android/app/ResourcesManager.java
+++ b/core/java/android/app/ResourcesManager.java
@@ -104,10 +104,17 @@
new WeakHashMap<>();
/**
- * A cache of DisplayId to DisplayAdjustments.
+ * A cache of DisplayId, DisplayAdjustments to Display.
*/
- private final ArrayMap<Pair<Integer, DisplayAdjustments>, WeakReference<Display>> mDisplays =
- new ArrayMap<>();
+ private final ArrayMap<Pair<Integer, DisplayAdjustments>, WeakReference<Display>>
+ mAdjustedDisplays = new ArrayMap<>();
+
+ /**
+ * A cache of DisplayId, Resources to Display. These display adjustments associated with these
+ * {@link Display}s will change as the resources change.
+ */
+ private final ArrayMap<Pair<Integer, Resources>, WeakReference<Display>> mResourceDisplays =
+ new ArrayMap<>();
public static ResourcesManager getInstance() {
synchronized (ResourcesManager.class) {
@@ -201,19 +208,21 @@
/**
* Returns an adjusted {@link Display} object based on the inputs or null if display isn't
- * available.
+ * available. This method is only used within {@link ResourcesManager} to calculate display
+ * metrics based on a set {@link DisplayAdjustments}. All other usages should instead call
+ * {@link ResourcesManager#getAdjustedDisplay(int, Resources)}.
*
* @param displayId display Id.
* @param displayAdjustments display adjustments.
*/
- public Display getAdjustedDisplay(final int displayId,
+ private Display getAdjustedDisplay(final int displayId,
@Nullable DisplayAdjustments displayAdjustments) {
final DisplayAdjustments displayAdjustmentsCopy = (displayAdjustments != null)
? new DisplayAdjustments(displayAdjustments) : new DisplayAdjustments();
final Pair<Integer, DisplayAdjustments> key =
Pair.create(displayId, displayAdjustmentsCopy);
synchronized (this) {
- WeakReference<Display> wd = mDisplays.get(key);
+ WeakReference<Display> wd = mAdjustedDisplays.get(key);
if (wd != null) {
final Display display = wd.get();
if (display != null) {
@@ -227,7 +236,37 @@
}
final Display display = dm.getCompatibleDisplay(displayId, key.second);
if (display != null) {
- mDisplays.put(key, new WeakReference<>(display));
+ mAdjustedDisplays.put(key, new WeakReference<>(display));
+ }
+ return display;
+ }
+ }
+
+ /**
+ * Returns an adjusted {@link Display} object based on the inputs or null if display isn't
+ * available.
+ *
+ * @param displayId display Id.
+ * @param resources The {@link Resources} backing the display adjustments.
+ */
+ public Display getAdjustedDisplay(final int displayId, Resources resources) {
+ final Pair<Integer, Resources> key = Pair.create(displayId, resources);
+ synchronized (this) {
+ WeakReference<Display> wd = mResourceDisplays.get(key);
+ if (wd != null) {
+ final Display display = wd.get();
+ if (display != null) {
+ return display;
+ }
+ }
+ final DisplayManagerGlobal dm = DisplayManagerGlobal.getInstance();
+ if (dm == null) {
+ // may be null early in system startup
+ return null;
+ }
+ final Display display = dm.getCompatibleDisplay(displayId, resources);
+ if (display != null) {
+ mResourceDisplays.put(key, new WeakReference<>(display));
}
return display;
}
@@ -316,6 +355,7 @@
final DisplayMetrics dm = getDisplayMetrics(key.mDisplayId, daj);
final Configuration config = generateConfig(key, dm);
final ResourcesImpl impl = new ResourcesImpl(assets, dm, config, daj);
+
if (DEBUG) {
Slog.d(TAG, "- creating impl=" + impl + " with key: " + key);
}
@@ -811,7 +851,9 @@
}
int changes = mResConfiguration.updateFrom(config);
// Things might have changed in display manager, so clear the cached displays.
- mDisplays.clear();
+ mAdjustedDisplays.clear();
+ mResourceDisplays.clear();
+
DisplayMetrics defaultDisplayMetrics = getDisplayMetrics();
if (compat != null && (mResCompatibilityInfo == null ||
diff --git a/core/java/android/app/usage/IStorageStatsManager.aidl b/core/java/android/app/usage/IStorageStatsManager.aidl
index f4c18dd..76c0293 100644
--- a/core/java/android/app/usage/IStorageStatsManager.aidl
+++ b/core/java/android/app/usage/IStorageStatsManager.aidl
@@ -24,6 +24,7 @@
boolean isQuotaSupported(String volumeUuid, String callingPackage);
long getTotalBytes(String volumeUuid, String callingPackage);
long getFreeBytes(String volumeUuid, String callingPackage);
+ StorageStats queryStatsForPackage(String volumeUuid, String packageName, int userId, String callingPackage);
StorageStats queryStatsForUid(String volumeUuid, int uid, String callingPackage);
StorageStats queryStatsForUser(String volumeUuid, int userId, String callingPackage);
ExternalStorageStats queryExternalStatsForUser(String volumeUuid, int userId, String callingPackage);
diff --git a/core/java/android/app/usage/StorageStatsManager.java b/core/java/android/app/usage/StorageStatsManager.java
index 7d4efb9..081ccd9 100644
--- a/core/java/android/app/usage/StorageStatsManager.java
+++ b/core/java/android/app/usage/StorageStatsManager.java
@@ -19,6 +19,7 @@
import android.annotation.WorkerThread;
import android.content.Context;
import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageInfo;
import android.os.RemoteException;
import android.os.UserHandle;
@@ -100,6 +101,37 @@
}
/**
+ * Return storage statistics for a specific package on the requested storage
+ * volume.
+ * <p>
+ * This method may take several seconds to calculate the requested values,
+ * so it should only be called from a worker thread.
+ * <p class="note">
+ * Note: if the requested package uses the {@code android:sharedUserId}
+ * manifest feature, this call will be forced into a slower manual
+ * calculation path. If possible, consider always using
+ * {@link #queryStatsForUid(String, int)}, which is typically faster.
+ * </p>
+ *
+ * @param volumeUuid the UUID of the storage volume you're interested in, or
+ * {@code null} to specify the default internal storage.
+ * @param packageName the package name you're interested in.
+ * @param user the user you're interested in.
+ * @see ApplicationInfo#volumeUuid
+ * @see PackageInfo#packageName
+ */
+ @WorkerThread
+ public StorageStats queryStatsForPackage(String volumeUuid, String packageName,
+ UserHandle user) {
+ try {
+ return mService.queryStatsForPackage(volumeUuid, packageName, user.getIdentifier(),
+ mContext.getOpPackageName());
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
* Return storage statistics for a specific UID on the requested storage
* volume.
* <p>
diff --git a/core/java/android/hardware/display/DisplayManager.java b/core/java/android/hardware/display/DisplayManager.java
index 33a9f5e..a529c2f 100644
--- a/core/java/android/hardware/display/DisplayManager.java
+++ b/core/java/android/hardware/display/DisplayManager.java
@@ -339,8 +339,7 @@
private Display getOrCreateDisplayLocked(int displayId, boolean assumeValid) {
Display display = mDisplays.get(displayId);
if (display == null) {
- display = mGlobal.getCompatibleDisplay(displayId,
- mContext.getDisplayAdjustments(displayId));
+ display = mGlobal.getCompatibleDisplay(displayId, mContext.getResources());
if (display != null) {
mDisplays.put(displayId, display);
}
diff --git a/core/java/android/hardware/display/DisplayManagerGlobal.java b/core/java/android/hardware/display/DisplayManagerGlobal.java
index 826eb74..341754c 100644
--- a/core/java/android/hardware/display/DisplayManagerGlobal.java
+++ b/core/java/android/hardware/display/DisplayManagerGlobal.java
@@ -18,6 +18,7 @@
import android.content.Context;
import android.content.res.Configuration;
+import android.content.res.Resources;
import android.hardware.display.DisplayManager.DisplayListener;
import android.media.projection.MediaProjection;
import android.media.projection.IMediaProjection;
@@ -181,6 +182,24 @@
}
/**
+ * Gets information about a logical display.
+ *
+ * The display metrics may be adjusted to provide compatibility
+ * for legacy applications or limited screen areas.
+ *
+ * @param displayId The logical display id.
+ * @param resources Resources providing compatibility info.
+ * @return The display object, or null if there is no display with the given id.
+ */
+ public Display getCompatibleDisplay(int displayId, Resources resources) {
+ DisplayInfo displayInfo = getDisplayInfo(displayId);
+ if (displayInfo == null) {
+ return null;
+ }
+ return new Display(this, displayId, displayInfo, resources);
+ }
+
+ /**
* Gets information about a logical display without applying any compatibility metrics.
*
* @param displayId The logical display id.
diff --git a/core/java/android/net/ConnectivityMetricsEvent.aidl b/core/java/android/net/ConnectivityMetricsEvent.aidl
index a027d7c..1c541dc 100644
--- a/core/java/android/net/ConnectivityMetricsEvent.aidl
+++ b/core/java/android/net/ConnectivityMetricsEvent.aidl
@@ -16,5 +16,5 @@
package android.net;
+/** {@hide} */
parcelable ConnectivityMetricsEvent;
-parcelable ConnectivityMetricsEvent.Reference;
diff --git a/core/java/android/net/ConnectivityMetricsEvent.java b/core/java/android/net/ConnectivityMetricsEvent.java
index eaaef7f..6fdc739 100644
--- a/core/java/android/net/ConnectivityMetricsEvent.java
+++ b/core/java/android/net/ConnectivityMetricsEvent.java
@@ -16,12 +16,10 @@
package android.net;
-import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
/** {@hide} */
-@SystemApi
public final class ConnectivityMetricsEvent implements Parcelable {
/** The time when this event was collected, as returned by System.currentTimeMillis(). */
@@ -67,7 +65,6 @@
return 0;
}
- /** Implement the Parcelable interface */
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeLong(timestamp);
@@ -80,51 +77,4 @@
return String.format("ConnectivityMetricsEvent(%tT.%tL, %d, %d): %s",
timestamp, timestamp, componentTag, eventTag, data);
}
-
- /** {@hide} */
- @SystemApi
- public final static class Reference implements Parcelable {
-
- private long mValue;
-
- public Reference(long ref) {
- this.mValue = ref;
- }
-
- /** Implement the Parcelable interface */
- public static final Parcelable.Creator<Reference> CREATOR
- = new Parcelable.Creator<Reference> (){
- public Reference createFromParcel(Parcel source) {
- return new Reference(source.readLong());
- }
-
- public Reference[] newArray(int size) {
- return new Reference[size];
- }
- };
-
- /** Implement the Parcelable interface */
- @Override
- public int describeContents() {
- return 0;
- }
-
- /** Implement the Parcelable interface */
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- dest.writeLong(mValue);
- }
-
- public void readFromParcel(Parcel in) {
- mValue = in.readLong();
- }
-
- public long getValue() {
- return mValue;
- }
-
- public void setValue(long val) {
- mValue = val;
- }
- }
}
diff --git a/core/java/android/net/ConnectivityMetricsLogger.java b/core/java/android/net/ConnectivityMetricsLogger.java
deleted file mode 100644
index 67b6908..0000000
--- a/core/java/android/net/ConnectivityMetricsLogger.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright (C) 2016 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 android.net;
-
-import android.annotation.SystemApi;
-import android.app.PendingIntent;
-import android.os.Bundle;
-import android.os.Parcelable;
-import android.os.RemoteException;
-import android.os.ServiceManager;
-import android.util.Log;
-
-import com.android.internal.annotations.VisibleForTesting;
-
-/** {@hide} */
-@SystemApi
-public class ConnectivityMetricsLogger {
- private static String TAG = "ConnectivityMetricsLogger";
- private static final boolean DBG = true;
-
- public static final String CONNECTIVITY_METRICS_LOGGER_SERVICE = "connectivity_metrics_logger";
-
- // Component Tags
- public static final int COMPONENT_TAG_CONNECTIVITY = 0;
- public static final int COMPONENT_TAG_BLUETOOTH = 1;
- public static final int COMPONENT_TAG_WIFI = 2;
- public static final int COMPONENT_TAG_TELECOM = 3;
- public static final int COMPONENT_TAG_TELEPHONY = 4;
- public static final int NUMBER_OF_COMPONENTS = 5;
-
- // Event Tag
- public static final int TAG_SKIPPED_EVENTS = -1;
-
- public static final String DATA_KEY_EVENTS_COUNT = "count";
-
- public ConnectivityMetricsLogger() {
- }
-
- /**
- * Log a ConnectivityMetricsEvent.
- *
- * This method keeps track of skipped events when MetricsLoggerService throttles input events.
- * It skips logging when MetricsLoggerService is active. When throttling ends, it logs a
- * meta-event containing the number of events dropped. It is not safe to call this method
- * concurrently from different threads.
- *
- * @param timestamp is the epoch timestamp of the event in ms.
- * @param componentTag is the COMPONENT_* constant the event belongs to.
- * @param eventTag is an event type constant whose meaning is specific to the component tag.
- * @param data is a Parcelable instance representing the event.
- */
- public void logEvent(long timestamp, int componentTag, int eventTag, Parcelable data) {
- }
-
- /**
- * Retrieve events
- *
- * @param reference of the last event previously returned. The function will return
- * events following it.
- * If 0 then all events will be returned.
- * After the function call it will contain reference of the
- * last returned event.
- * @return events
- */
- public ConnectivityMetricsEvent[] getEvents(ConnectivityMetricsEvent.Reference reference) {
- return new ConnectivityMetricsEvent[0];
- }
-
- /**
- * Register PendingIntent which will be sent when new events are ready to be retrieved.
- */
- public boolean register(PendingIntent newEventsIntent) {
- return false;
- }
-
- public boolean unregister(PendingIntent newEventsIntent) {
- return false;
- }
-}
diff --git a/core/java/android/net/IConnectivityMetricsLogger.aidl b/core/java/android/net/IConnectivityMetricsLogger.aidl
deleted file mode 100644
index a83a019..0000000
--- a/core/java/android/net/IConnectivityMetricsLogger.aidl
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (C) 2016 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 android.net;
-
-import android.app.PendingIntent;
-import android.net.ConnectivityMetricsEvent;
-
-/** {@hide} */
-interface IConnectivityMetricsLogger {
-
- /**
- * @return 0 on success
- * <0 if error happened
- * >0 timestamp after which new events will be accepted
- */
- long logEvent(in ConnectivityMetricsEvent event);
- long logEvents(in ConnectivityMetricsEvent[] events);
-
- /**
- * @param reference of the last event previously returned. The function will return
- * events following it.
- * If 0 then all events will be returned.
- * After the function call it will contain reference of the last event.
- */
- ConnectivityMetricsEvent[] getEvents(inout ConnectivityMetricsEvent.Reference reference);
-
- boolean register(in PendingIntent newEventsIntent);
- void unregister(in PendingIntent newEventsIntent);
-}
diff --git a/core/java/android/net/NetworkScoreManager.java b/core/java/android/net/NetworkScoreManager.java
index 8f3af66..edfaee4 100644
--- a/core/java/android/net/NetworkScoreManager.java
+++ b/core/java/android/net/NetworkScoreManager.java
@@ -96,17 +96,24 @@
public static final String EXTRA_NETWORKS_TO_SCORE = "networksToScore";
/**
- * Activity action: launch a custom activity for configuring a scorer before enabling it.
- * Scorer applications may choose to specify an activity for this action, in which case the
- * framework will launch that activity which should return RESULT_OK if scoring was enabled.
- *
- * <p>If no activity is included in a scorer which implements this action, the system dialog for
- * selecting a scorer will be shown instead.
+ * Activity action: launch an activity for configuring a provider for the feature that connects
+ * and secures open wifi networks available before enabling it. Applications that enable this
+ * feature must provide an activity for this action. The framework will launch this activity
+ * which must return RESULT_OK if the feature should be enabled.
*/
@SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
public static final String ACTION_CUSTOM_ENABLE = "android.net.scoring.CUSTOM_ENABLE";
/**
+ * Meta-data specified on a {@link NetworkRecommendationProvider} that specified the package
+ * name of the application that connects and secures open wifi networks automatically. The
+ * specified package must provide an Activity for {@link #ACTION_CUSTOM_ENABLE}.
+ * @hide
+ */
+ public static final String USE_OPEN_WIFI_PACKAGE_META_DATA =
+ "android.net.wifi.use_open_wifi_package";
+
+ /**
* Broadcast action: the active scorer has been changed. Scorer apps may listen to this to
* perform initialization once selected as the active scorer, or clean up unneeded resources
* if another scorer has been selected. This is an explicit broadcast only sent to the
diff --git a/core/java/android/net/NetworkScorerAppManager.java b/core/java/android/net/NetworkScorerAppManager.java
index a166c7f..bbc1c79 100644
--- a/core/java/android/net/NetworkScorerAppManager.java
+++ b/core/java/android/net/NetworkScorerAppManager.java
@@ -26,6 +26,7 @@
import android.content.pm.ResolveInfo;
import android.os.Parcel;
import android.os.Parcelable;
+import android.content.pm.ServiceInfo;
import android.os.UserHandle;
import android.provider.Settings;
import android.text.TextUtils;
@@ -60,21 +61,30 @@
/** UID of the scorer app. */
public final int packageUid;
private final ComponentName mRecommendationService;
+ /**
+ * The {@link ComponentName} of the Activity to start before enabling the "connect to open
+ * wifi networks automatically" feature.
+ */
+ private final ComponentName mEnableUseOpenWifiActivity;
- public NetworkScorerAppData(int packageUid, ComponentName recommendationServiceComp) {
+ public NetworkScorerAppData(int packageUid, ComponentName recommendationServiceComp,
+ ComponentName enableUseOpenWifiActivity) {
this.packageUid = packageUid;
this.mRecommendationService = recommendationServiceComp;
+ this.mEnableUseOpenWifiActivity = enableUseOpenWifiActivity;
}
protected NetworkScorerAppData(Parcel in) {
packageUid = in.readInt();
mRecommendationService = ComponentName.readFromParcel(in);
+ mEnableUseOpenWifiActivity = ComponentName.readFromParcel(in);
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(packageUid);
ComponentName.writeToParcel(mRecommendationService, dest);
+ ComponentName.writeToParcel(mEnableUseOpenWifiActivity, dest);
}
@Override
@@ -103,11 +113,16 @@
return mRecommendationService;
}
+ @Nullable public ComponentName getEnableUseOpenWifiActivity() {
+ return mEnableUseOpenWifiActivity;
+ }
+
@Override
public String toString() {
return "NetworkScorerAppData{" +
"packageUid=" + packageUid +
", mRecommendationService=" + mRecommendationService +
+ ", mEnableUseOpenWifiActivity=" + mEnableUseOpenWifiActivity +
'}';
}
@@ -117,12 +132,13 @@
if (o == null || getClass() != o.getClass()) return false;
NetworkScorerAppData that = (NetworkScorerAppData) o;
return packageUid == that.packageUid &&
- Objects.equals(mRecommendationService, that.mRecommendationService);
+ Objects.equals(mRecommendationService, that.mRecommendationService) &&
+ Objects.equals(mEnableUseOpenWifiActivity, that.mEnableUseOpenWifiActivity);
}
@Override
public int hashCode() {
- return Objects.hash(packageUid, mRecommendationService);
+ return Objects.hash(packageUid, mRecommendationService, mEnableUseOpenWifiActivity);
}
}
@@ -165,12 +181,14 @@
final String potentialPkg = potentialPkgs.get(i);
// Look for the recommendation service class and required receiver.
- final ResolveInfo resolveServiceInfo = findRecommendationService(potentialPkg);
- if (resolveServiceInfo != null) {
- final ComponentName componentName =
- new ComponentName(potentialPkg, resolveServiceInfo.serviceInfo.name);
- return new NetworkScorerAppData(resolveServiceInfo.serviceInfo.applicationInfo.uid,
- componentName);
+ final ServiceInfo serviceInfo = findRecommendationService(potentialPkg);
+ if (serviceInfo != null) {
+ final ComponentName serviceComponentName =
+ new ComponentName(potentialPkg, serviceInfo.name);
+ final ComponentName useOpenWifiNetworksActivity =
+ findUseOpenWifiNetworksActivity(serviceInfo);
+ return new NetworkScorerAppData(serviceInfo.applicationInfo.uid,
+ serviceComponentName, useOpenWifiNetworksActivity);
} else {
if (DEBUG) {
Log.d(TAG, potentialPkg + " does not have the required components, skipping.");
@@ -182,6 +200,36 @@
return null;
}
+ @Nullable private ComponentName findUseOpenWifiNetworksActivity(ServiceInfo serviceInfo) {
+ if (serviceInfo.metaData == null) {
+ if (DEBUG) {
+ Log.d(TAG, "No metadata found on recommendation service.");
+ }
+ return null;
+ }
+ final String useOpenWifiPackage = serviceInfo.metaData
+ .getString(NetworkScoreManager.USE_OPEN_WIFI_PACKAGE_META_DATA);
+ if (TextUtils.isEmpty(useOpenWifiPackage)) {
+ if (DEBUG) {
+ Log.d(TAG, "No use_open_wifi_package metadata found.");
+ }
+ return null;
+ }
+ final Intent enableUseOpenWifiIntent = new Intent(NetworkScoreManager.ACTION_CUSTOM_ENABLE)
+ .setPackage(useOpenWifiPackage);
+ final ResolveInfo resolveActivityInfo = mContext.getPackageManager()
+ .resolveActivity(enableUseOpenWifiIntent, 0 /* flags */);
+ if (VERBOSE) {
+ Log.d(TAG, "Resolved " + enableUseOpenWifiIntent + " to " + serviceInfo);
+ }
+
+ if (resolveActivityInfo != null && resolveActivityInfo.activityInfo != null) {
+ return resolveActivityInfo.activityInfo.getComponentName();
+ }
+
+ return null;
+ }
+
/**
* @return A priority order list of package names that have been granted the
* permission needed for them to act as a network recommendation provider.
@@ -220,10 +268,9 @@
return packages;
}
- private ResolveInfo findRecommendationService(String packageName) {
+ @Nullable private ServiceInfo findRecommendationService(String packageName) {
final PackageManager pm = mContext.getPackageManager();
- final int resolveFlags = 0;
-
+ final int resolveFlags = PackageManager.GET_META_DATA;
final Intent serviceIntent = new Intent(NetworkScoreManager.ACTION_RECOMMEND_NETWORKS);
serviceIntent.setPackage(packageName);
final ResolveInfo resolveServiceInfo =
@@ -234,7 +281,7 @@
}
if (resolveServiceInfo != null && resolveServiceInfo.serviceInfo != null) {
- return resolveServiceInfo;
+ return resolveServiceInfo.serviceInfo;
}
if (VERBOSE) {
diff --git a/core/java/android/net/http/SslCertificate.java b/core/java/android/net/http/SslCertificate.java
index 2715af0..4c0f418 100644
--- a/core/java/android/net/http/SslCertificate.java
+++ b/core/java/android/net/http/SslCertificate.java
@@ -506,6 +506,6 @@
if (certificateDate == null) {
return "";
}
- return DateFormat.getDateFormat(context).format(certificateDate);
+ return DateFormat.getMediumDateFormat(context).format(certificateDate);
}
}
diff --git a/core/java/android/net/metrics/ApfProgramEvent.java b/core/java/android/net/metrics/ApfProgramEvent.java
index 258d8e1..c2795a2a 100644
--- a/core/java/android/net/metrics/ApfProgramEvent.java
+++ b/core/java/android/net/metrics/ApfProgramEvent.java
@@ -17,7 +17,6 @@
package android.net.metrics;
import android.annotation.IntDef;
-import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;
@@ -36,7 +35,6 @@
* the APF program in place with a new APF program.
* {@hide}
*/
-@SystemApi
public final class ApfProgramEvent implements Parcelable {
// Bitflag constants describing what an Apf program filters.
@@ -55,7 +53,6 @@
public final int programLength; // Length of the APF program in bytes
public final int flags; // Bitfield compound of FLAG_* constants
- /** {@hide} */
public ApfProgramEvent(
long lifetime, int filteredRas, int currentRas, int programLength, @Flags int flags) {
this.lifetime = lifetime;
@@ -105,7 +102,6 @@
}
};
- /** {@hide} */
public static @Flags int flagsFor(boolean hasIPv4, boolean multicastFilterOn) {
int bitfield = 0;
if (hasIPv4) {
diff --git a/core/java/android/net/metrics/ApfStats.java b/core/java/android/net/metrics/ApfStats.java
index 8451e53..f8d7fa9 100644
--- a/core/java/android/net/metrics/ApfStats.java
+++ b/core/java/android/net/metrics/ApfStats.java
@@ -16,7 +16,6 @@
package android.net.metrics;
-import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
@@ -24,7 +23,6 @@
* An event logged for an interface with APF capabilities when its IpManager state machine exits.
* {@hide}
*/
-@SystemApi
public final class ApfStats implements Parcelable {
public final long durationMs; // time interval in milliseconds these stastistics covers
@@ -36,7 +34,6 @@
public final int programUpdates; // number of APF program updates
public final int maxProgramSize; // maximum APF program size advertised by hardware
- /** {@hide} */
public ApfStats(long durationMs, int receivedRas, int matchingRas, int droppedRas,
int zeroLifetimeRas, int parseErrors, int programUpdates, int maxProgramSize) {
this.durationMs = durationMs;
diff --git a/core/java/android/net/metrics/DefaultNetworkEvent.java b/core/java/android/net/metrics/DefaultNetworkEvent.java
index 9f0bad7..28cf42f 100644
--- a/core/java/android/net/metrics/DefaultNetworkEvent.java
+++ b/core/java/android/net/metrics/DefaultNetworkEvent.java
@@ -16,7 +16,6 @@
package android.net.metrics;
-import android.annotation.SystemApi;
import android.net.NetworkCapabilities;
import android.os.Parcel;
import android.os.Parcelable;
@@ -25,7 +24,6 @@
* An event recorded by ConnectivityService when there is a change in the default network.
* {@hide}
*/
-@SystemApi
public final class DefaultNetworkEvent implements Parcelable {
// The ID of the network that has become the new default or NETID_UNSET if none.
public final int netId;
@@ -38,7 +36,6 @@
public final boolean prevIPv4;
public final boolean prevIPv6;
- /** {@hide} */
public DefaultNetworkEvent(int netId, int[] transportTypes,
int prevNetId, boolean prevIPv4, boolean prevIPv6) {
this.netId = netId;
@@ -106,8 +103,4 @@
return new DefaultNetworkEvent[size];
}
};
-
- public static void logEvent(
- int netId, int[] transports, int prevNetId, boolean hadIPv4, boolean hadIPv6) {
- }
}
diff --git a/core/java/android/net/metrics/DhcpClientEvent.java b/core/java/android/net/metrics/DhcpClientEvent.java
index 4a9ff05..7e30ab5 100644
--- a/core/java/android/net/metrics/DhcpClientEvent.java
+++ b/core/java/android/net/metrics/DhcpClientEvent.java
@@ -16,7 +16,6 @@
package android.net.metrics;
-import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
@@ -24,7 +23,6 @@
* An event recorded when a DhcpClient state machine transitions to a new state.
* {@hide}
*/
-@SystemApi
public final class DhcpClientEvent implements Parcelable {
// Names for recording DhcpClient pseudo-state transitions.
@@ -37,7 +35,6 @@
public final String msg;
public final int durationMs;
- /** {@hide} */
public DhcpClientEvent(String ifName, String msg, int durationMs) {
this.ifName = ifName;
this.msg = msg;
@@ -77,7 +74,4 @@
return new DhcpClientEvent[size];
}
};
-
- public static void logStateEvent(String ifName, String state) {
- }
}
diff --git a/core/java/android/net/metrics/DhcpErrorEvent.java b/core/java/android/net/metrics/DhcpErrorEvent.java
index c3abcf7..f34ffdf 100644
--- a/core/java/android/net/metrics/DhcpErrorEvent.java
+++ b/core/java/android/net/metrics/DhcpErrorEvent.java
@@ -16,7 +16,6 @@
package android.net.metrics;
-import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.SparseArray;
@@ -27,7 +26,6 @@
* Event class used to record error events when parsing DHCP response packets.
* {@hide}
*/
-@SystemApi
public final class DhcpErrorEvent implements Parcelable {
public static final int L2_ERROR = 1;
public static final int L3_ERROR = 2;
@@ -50,12 +48,10 @@
public static final int DHCP_INVALID_OPTION_LENGTH = makeErrorCode(DHCP_ERROR, 3);
public static final int DHCP_NO_MSG_TYPE = makeErrorCode(DHCP_ERROR, 4);
public static final int DHCP_UNKNOWN_MSG_TYPE = makeErrorCode(DHCP_ERROR, 5);
- /** {@hide} */
public static final int DHCP_NO_COOKIE = makeErrorCode(DHCP_ERROR, 6);
public static final int BUFFER_UNDERFLOW = makeErrorCode(MISC_ERROR, 1);
public static final int RECEIVE_ERROR = makeErrorCode(MISC_ERROR, 2);
- /** {@hide} */
public static final int PARSING_ERROR = makeErrorCode(MISC_ERROR, 3);
public final String ifName;
@@ -66,7 +62,6 @@
// byte 3: optional code
public final int errorCode;
- /** {@hide} */
public DhcpErrorEvent(String ifName, int errorCode) {
this.ifName = ifName;
this.errorCode = errorCode;
@@ -99,12 +94,6 @@
}
};
- public static void logParseError(String ifName, int errorCode) {
- }
-
- public static void logReceiveError(String ifName) {
- }
-
public static int errorCodeWithOption(int errorCode, int option) {
return (0xFFFF0000 & errorCode) | (0xFF & option);
}
diff --git a/core/java/android/net/metrics/DnsEvent.java b/core/java/android/net/metrics/DnsEvent.java
index 6176b2c..89ae1c2 100644
--- a/core/java/android/net/metrics/DnsEvent.java
+++ b/core/java/android/net/metrics/DnsEvent.java
@@ -16,7 +16,6 @@
package android.net.metrics;
-import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
@@ -24,7 +23,6 @@
* A DNS event recorded by NetdEventListenerService.
* {@hide}
*/
-@SystemApi
final public class DnsEvent implements Parcelable {
public final int netId;
@@ -38,7 +36,6 @@
// queries.
public final int[] latenciesMs;
- /** {@hide} */
public DnsEvent(int netId, byte[] eventTypes, byte[] returnCodes, int[] latenciesMs) {
this.netId = netId;
this.eventTypes = eventTypes;
@@ -82,8 +79,4 @@
return new DnsEvent[size];
}
};
-
- public static void logEvent(
- int netId, byte[] eventTypes, byte[] returnCodes, int[] latenciesMs) {
- }
}
diff --git a/core/java/android/net/metrics/IpManagerEvent.java b/core/java/android/net/metrics/IpManagerEvent.java
index e0a026e..50dda7c 100644
--- a/core/java/android/net/metrics/IpManagerEvent.java
+++ b/core/java/android/net/metrics/IpManagerEvent.java
@@ -17,7 +17,6 @@
package android.net.metrics;
import android.annotation.IntDef;
-import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.SparseArray;
@@ -32,17 +31,15 @@
* when a network disconnects.
* {@hide}
*/
-@SystemApi
public final class IpManagerEvent implements Parcelable {
- public static final int PROVISIONING_OK = 1;
- public static final int PROVISIONING_FAIL = 2;
- public static final int COMPLETE_LIFECYCLE = 3;
- /** @hide */ public static final int ERROR_STARTING_IPV4 = 4;
- /** @hide */ public static final int ERROR_STARTING_IPV6 = 5;
- /** @hide */ public static final int ERROR_STARTING_IPREACHABILITYMONITOR = 6;
+ public static final int PROVISIONING_OK = 1;
+ public static final int PROVISIONING_FAIL = 2;
+ public static final int COMPLETE_LIFECYCLE = 3;
+ public static final int ERROR_STARTING_IPV4 = 4;
+ public static final int ERROR_STARTING_IPV6 = 5;
+ public static final int ERROR_STARTING_IPREACHABILITYMONITOR = 6;
- /** {@hide} */
@IntDef(value = {
PROVISIONING_OK, PROVISIONING_FAIL, COMPLETE_LIFECYCLE,
ERROR_STARTING_IPV4, ERROR_STARTING_IPV6, ERROR_STARTING_IPREACHABILITYMONITOR,
@@ -54,7 +51,6 @@
public final @EventType int eventType;
public final long durationMs;
- /** {@hide} */
public IpManagerEvent(String ifName, @EventType int eventType, long duration) {
this.ifName = ifName;
this.eventType = eventType;
@@ -90,9 +86,6 @@
}
};
- public static void logEvent(int eventType, String ifName, long durationMs) {
- }
-
@Override
public String toString() {
return String.format("IpManagerEvent(%s, %s, %dms)",
diff --git a/core/java/android/net/metrics/IpReachabilityEvent.java b/core/java/android/net/metrics/IpReachabilityEvent.java
index ee09e22..d69e806 100644
--- a/core/java/android/net/metrics/IpReachabilityEvent.java
+++ b/core/java/android/net/metrics/IpReachabilityEvent.java
@@ -16,7 +16,6 @@
package android.net.metrics;
-import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.SparseArray;
@@ -28,7 +27,6 @@
* a neighbor probe result.
* {@hide}
*/
-@SystemApi
public final class IpReachabilityEvent implements Parcelable {
// Event types.
@@ -38,9 +36,9 @@
public static final int NUD_FAILED = 2 << 8;
/** Neighbor unreachable after a forced probe, IP provisioning is also lost. */
public static final int PROVISIONING_LOST = 3 << 8;
- /** {@hide} Neighbor unreachable notification from kernel. */
+ /** Neighbor unreachable notification from kernel. */
public static final int NUD_FAILED_ORGANIC = 4 << 8;
- /** {@hide} Neighbor unreachable notification from kernel, IP provisioning is also lost. */
+ /** Neighbor unreachable notification from kernel, IP provisioning is also lost. */
public static final int PROVISIONING_LOST_ORGANIC = 5 << 8;
public final String ifName;
@@ -51,7 +49,6 @@
// byte 3: when byte 2 == PROBE, errno code from RTNetlink or IpReachabilityMonitor.
public final int eventType;
- /** {@hide} */
public IpReachabilityEvent(String ifName, int eventType) {
this.ifName = ifName;
this.eventType = eventType;
@@ -84,18 +81,8 @@
}
};
- public static void logProbeEvent(String ifName, int nlErrorCode) {
- }
-
- public static void logNudFailed(String ifName) {
- }
-
- public static void logProvisioningLost(String ifName) {
- }
-
/**
* Returns the NUD failure event type code corresponding to the given conditions.
- * {@hide}
*/
public static int nudFailureEventType(boolean isFromProbe, boolean isProvisioningLost) {
if (isFromProbe) {
diff --git a/core/java/android/net/metrics/NetworkEvent.java b/core/java/android/net/metrics/NetworkEvent.java
index 0667495..4df3bf0 100644
--- a/core/java/android/net/metrics/NetworkEvent.java
+++ b/core/java/android/net/metrics/NetworkEvent.java
@@ -17,7 +17,6 @@
package android.net.metrics;
import android.annotation.IntDef;
-import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.SparseArray;
@@ -30,7 +29,6 @@
/**
* {@hide}
*/
-@SystemApi
public final class NetworkEvent implements Parcelable {
public static final int NETWORK_CONNECTED = 1;
@@ -41,16 +39,11 @@
public static final int NETWORK_UNLINGER = 6;
public static final int NETWORK_DISCONNECTED = 7;
- /** {@hide} */
public static final int NETWORK_FIRST_VALIDATION_SUCCESS = 8;
- /** {@hide} */
public static final int NETWORK_REVALIDATION_SUCCESS = 9;
- /** {@hide} */
public static final int NETWORK_FIRST_VALIDATION_PORTAL_FOUND = 10;
- /** {@hide} */
public static final int NETWORK_REVALIDATION_PORTAL_FOUND = 11;
- /** {@hide} */
@IntDef(value = {
NETWORK_CONNECTED,
NETWORK_VALIDATED,
@@ -71,14 +64,12 @@
public final @EventType int eventType;
public final long durationMs;
- /** {@hide} */
public NetworkEvent(int netId, @EventType int eventType, long durationMs) {
this.netId = netId;
this.eventType = eventType;
this.durationMs = durationMs;
}
- /** {@hide} */
public NetworkEvent(int netId, @EventType int eventType) {
this(netId, eventType, 0);
}
@@ -112,15 +103,6 @@
}
};
- public static void logEvent(int netId, int eventType) {
- }
-
- public static void logValidated(int netId, long durationMs) {
- }
-
- public static void logCaptivePortalFound(int netId, long durationMs) {
- }
-
@Override
public String toString() {
return String.format("NetworkEvent(%d, %s, %dms)",
diff --git a/core/java/android/net/metrics/RaEvent.java b/core/java/android/net/metrics/RaEvent.java
index 91bd023..3249f80 100644
--- a/core/java/android/net/metrics/RaEvent.java
+++ b/core/java/android/net/metrics/RaEvent.java
@@ -16,7 +16,6 @@
package android.net.metrics;
-import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
@@ -24,10 +23,8 @@
* An event logged when the APF packet socket receives an RA packet.
* {@hide}
*/
-@SystemApi
public final class RaEvent implements Parcelable {
- /** {@hide} */
public static final long NO_LIFETIME = -1L;
// Lifetime in seconds of options found in a single RA packet.
@@ -39,7 +36,6 @@
public final long rdnssLifetime;
public final long dnsslLifetime;
- /** {@hide} */
public RaEvent(long routerLifetime, long prefixValidLifetime, long prefixPreferredLifetime,
long routeInfoLifetime, long rdnssLifetime, long dnsslLifetime) {
this.routerLifetime = routerLifetime;
@@ -96,7 +92,6 @@
}
};
- /** {@hide} */
public static class Builder {
long routerLifetime = NO_LIFETIME;
diff --git a/core/java/android/net/metrics/ValidationProbeEvent.java b/core/java/android/net/metrics/ValidationProbeEvent.java
index a724ec1..70c6e84 100644
--- a/core/java/android/net/metrics/ValidationProbeEvent.java
+++ b/core/java/android/net/metrics/ValidationProbeEvent.java
@@ -17,7 +17,6 @@
package android.net.metrics;
import android.annotation.IntDef;
-import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.SparseArray;
@@ -31,14 +30,12 @@
* An event recorded by NetworkMonitor when sending a probe for finding captive portals.
* {@hide}
*/
-@SystemApi
public final class ValidationProbeEvent implements Parcelable {
public static final int PROBE_DNS = 0;
public static final int PROBE_HTTP = 1;
public static final int PROBE_HTTPS = 2;
public static final int PROBE_PAC = 3;
- /** {@hide} */
public static final int PROBE_FALLBACK = 4;
public static final int DNS_FAILURE = 0;
@@ -47,7 +44,6 @@
private static final int FIRST_VALIDATION = 1 << 8;
private static final int REVALIDATION = 2 << 8;
- /** {@hide} */
@IntDef(value = {DNS_FAILURE, DNS_SUCCESS})
@Retention(RetentionPolicy.SOURCE)
public @interface ReturnCode {}
@@ -62,7 +58,6 @@
public final int probeType;
public final @ReturnCode int returnCode;
- /** {@hide} */
public ValidationProbeEvent(
int netId, long durationMs, int probeType, @ReturnCode int returnCode) {
this.netId = netId;
@@ -102,24 +97,18 @@
}
};
- /** @hide */
public static int makeProbeType(int probeType, boolean firstValidation) {
return (probeType & 0xff) | (firstValidation ? FIRST_VALIDATION : REVALIDATION);
}
- /** @hide */
public static String getProbeName(int probeType) {
return Decoder.constants.get(probeType & 0xff, "PROBE_???");
}
- /** @hide */
public static String getValidationStage(int probeType) {
return Decoder.constants.get(probeType & 0xff00, "UNKNOWN");
}
- public static void logEvent(int netId, long durationMs, int probeType, int returnCode) {
- }
-
@Override
public String toString() {
return String.format("ValidationProbeEvent(%d, %s:%d %s, %dms)", netId,
diff --git a/core/java/android/os/FileUtils.java b/core/java/android/os/FileUtils.java
index 280fa2c..af05ee7 100644
--- a/core/java/android/os/FileUtils.java
+++ b/core/java/android/os/FileUtils.java
@@ -770,4 +770,17 @@
return dir.mkdir() ? dir : null;
}
+
+ /**
+ * Round the given size of a storage device to a nice round power-of-two
+ * value, such as 256MB or 32GB. This avoids showing weird values like
+ * "29.5GB" in UI.
+ */
+ public static long roundStorageSize(long size) {
+ long res = 1;
+ while (res < size) {
+ res <<= 1;
+ }
+ return res;
+ }
}
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 6d5fcc0..40de928 100755
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -4635,7 +4635,7 @@
return setLocationModeForUser(resolver, Integer.parseInt(value), userHandle);
}
if (MOVED_TO_GLOBAL.contains(name)) {
- Log.w(TAG, "Setting " + name + " has moved from android.provider.Settings.System"
+ Log.w(TAG, "Setting " + name + " has moved from android.provider.Settings.Secure"
+ " to android.provider.Settings.Global");
return Global.putStringForUser(resolver, name, value,
tag, makeDefault, userHandle);
@@ -8258,6 +8258,15 @@
public static final String CURATE_SAVED_OPEN_NETWORKS = "curate_saved_open_networks";
/**
+ * The package name of the application that connect and secures high quality open wifi
+ * networks automatically.
+ *
+ * Type: string package name or null if the feature is either not provided or disabled.
+ * @hide
+ */
+ public static final String USE_OPEN_WIFI_PACKAGE = "use_open_wifi_package";
+
+ /**
* The number of milliseconds the {@link com.android.server.NetworkScoreService}
* will give a recommendation request to complete before returning a default response.
*
@@ -9679,6 +9688,7 @@
CURATE_SAVED_OPEN_NETWORKS,
WIFI_WAKEUP_ENABLED,
WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON,
+ USE_OPEN_WIFI_PACKAGE,
WIFI_WATCHDOG_POOR_NETWORK_TEST_ENABLED,
EMERGENCY_TONE,
CALL_AUTO_RETRY,
diff --git a/core/java/android/view/Display.java b/core/java/android/view/Display.java
index 83b6a52..7ec7ba7 100644
--- a/core/java/android/view/Display.java
+++ b/core/java/android/view/Display.java
@@ -21,6 +21,7 @@
import android.annotation.IntDef;
import android.annotation.RequiresPermission;
import android.content.res.CompatibilityInfo;
+import android.content.res.Resources;
import android.graphics.PixelFormat;
import android.graphics.Point;
import android.graphics.Rect;
@@ -71,7 +72,8 @@
private final String mAddress;
private final int mOwnerUid;
private final String mOwnerPackageName;
- private final DisplayAdjustments mDisplayAdjustments;
+ private final Resources mResources;
+ private DisplayAdjustments mDisplayAdjustments;
private DisplayInfo mDisplayInfo; // never null
private boolean mIsValid;
@@ -355,19 +357,39 @@
/**
* Internal method to create a display.
+ * The display created with this method will have a static {@link DisplayAdjustments} applied.
* Applications should use {@link android.view.WindowManager#getDefaultDisplay()}
* or {@link android.hardware.display.DisplayManager#getDisplay}
* to get a display object.
*
* @hide
*/
- public Display(DisplayManagerGlobal global,
- int displayId, DisplayInfo displayInfo /*not null*/,
+ public Display(DisplayManagerGlobal global, int displayId, /*@NotNull*/ DisplayInfo displayInfo,
DisplayAdjustments daj) {
+ this(global, displayId, displayInfo, daj, null /*res*/);
+ }
+
+ /**
+ * Internal method to create a display.
+ * The display created with this method will be adjusted based on the adjustments in the
+ * supplied {@link Resources}.
+ *
+ * @hide
+ */
+ public Display(DisplayManagerGlobal global, int displayId, /*@NotNull*/ DisplayInfo displayInfo,
+ Resources res) {
+ this(global, displayId, displayInfo, null /*daj*/, res);
+ }
+
+ private Display(DisplayManagerGlobal global, int displayId,
+ /*@NotNull*/ DisplayInfo displayInfo, DisplayAdjustments daj, Resources res) {
mGlobal = global;
mDisplayId = displayId;
mDisplayInfo = displayInfo;
- mDisplayAdjustments = new DisplayAdjustments(daj);
+ mResources = res;
+ mDisplayAdjustments = mResources != null
+ ? new DisplayAdjustments(mResources.getConfiguration())
+ : daj != null ? new DisplayAdjustments(daj) : null;
mIsValid = true;
// Cache properties that cannot change as long as the display is valid.
@@ -512,6 +534,13 @@
* @hide
*/
public DisplayAdjustments getDisplayAdjustments() {
+ if (mResources != null) {
+ final DisplayAdjustments currentAdjustements = mResources.getDisplayAdjustments();
+ if (!mDisplayAdjustments.equals(currentAdjustements)) {
+ mDisplayAdjustments = new DisplayAdjustments(currentAdjustements);
+ }
+ }
+
return mDisplayAdjustments;
}
@@ -562,7 +591,7 @@
public void getSize(Point outSize) {
synchronized (this) {
updateDisplayInfoLocked();
- mDisplayInfo.getAppMetrics(mTempMetrics, mDisplayAdjustments);
+ mDisplayInfo.getAppMetrics(mTempMetrics, getDisplayAdjustments());
outSize.x = mTempMetrics.widthPixels;
outSize.y = mTempMetrics.heightPixels;
}
@@ -577,7 +606,7 @@
public void getRectSize(Rect outSize) {
synchronized (this) {
updateDisplayInfoLocked();
- mDisplayInfo.getAppMetrics(mTempMetrics, mDisplayAdjustments);
+ mDisplayInfo.getAppMetrics(mTempMetrics, getDisplayAdjustments());
outSize.set(0, 0, mTempMetrics.widthPixels, mTempMetrics.heightPixels);
}
}
@@ -908,7 +937,7 @@
public void getMetrics(DisplayMetrics outMetrics) {
synchronized (this) {
updateDisplayInfoLocked();
- mDisplayInfo.getAppMetrics(outMetrics, mDisplayAdjustments);
+ mDisplayInfo.getAppMetrics(outMetrics, getDisplayAdjustments());
}
}
@@ -1017,7 +1046,7 @@
long now = SystemClock.uptimeMillis();
if (now > mLastCachedAppSizeUpdate + CACHED_APP_SIZE_DURATION_MILLIS) {
updateDisplayInfoLocked();
- mDisplayInfo.getAppMetrics(mTempMetrics, mDisplayAdjustments);
+ mDisplayInfo.getAppMetrics(mTempMetrics, getDisplayAdjustments());
mCachedAppWidthCompat = mTempMetrics.widthPixels;
mCachedAppHeightCompat = mTempMetrics.heightPixels;
mLastCachedAppSizeUpdate = now;
@@ -1029,7 +1058,7 @@
public String toString() {
synchronized (this) {
updateDisplayInfoLocked();
- mDisplayInfo.getAppMetrics(mTempMetrics, mDisplayAdjustments);
+ mDisplayInfo.getAppMetrics(mTempMetrics, getDisplayAdjustments());
return "Display id " + mDisplayId + ": " + mDisplayInfo
+ ", " + mTempMetrics + ", isValid=" + mIsValid;
}
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 66c394f..8666930 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -953,7 +953,7 @@
public @interface AutoFillMode {}
/**
- * This view inherits the autofill state from it's parent. If there is no parent it is
+ * This view inherits the auto-fill state from it's parent. If there is no parent it is
* {@link #AUTO_FILL_MODE_AUTO}.
* Use with {@link #setAutoFillMode(int)} and <a href="#attr_android:autoFillMode">
* {@code android:autoFillMode}.
@@ -968,7 +968,11 @@
public static final int AUTO_FILL_MODE_AUTO = 1;
/**
- * Require the user to manually force an auto-fill request.
+ * Do not trigger an auto-fill request if this view is focused. The user can still force
+ * an auto-fill request.
+ * <p>This does not prevent this field from being auto-filled if an auto-fill operation is
+ * triggered from a different view.</p>
+ *
* Use with {@link #setAutoFillMode(int)} and <a href="#attr_android:autoFillMode">{@code
* android:autoFillMode}.
*/
@@ -6523,7 +6527,12 @@
if (isAutoFillable()) {
AutoFillManager afm = getAutoFillManager();
if (afm != null) {
- afm.focusChanged(this, gainFocus);
+ boolean adjGainFocus = gainFocus;
+ if (adjGainFocus && getResolvedAutoFillMode() == AUTO_FILL_MODE_MANUAL) {
+ adjGainFocus = false;
+ }
+
+ afm.focusChanged(this, adjGainFocus);
}
}
@@ -9307,6 +9316,30 @@
}
/**
+ * Returns the resolved auto-fill mode for this view.
+ *
+ * This is the same as {@link #getAutoFillMode()} but if the mode is
+ * {@link #AUTO_FILL_MODE_INHERIT} the parents auto-fill mode will be returned.
+ *
+ * @return One of {@link #AUTO_FILL_MODE_AUTO}, or {@link #AUTO_FILL_MODE_MANUAL}.
+ *
+ * @hide
+ */
+ public @AutoFillMode int getResolvedAutoFillMode() {
+ @AutoFillMode int autoFillMode = getAutoFillMode();
+
+ if (autoFillMode == AUTO_FILL_MODE_INHERIT) {
+ if (mParent == null) {
+ throw new IllegalStateException("View is detached, cannot resolve autoFillMode");
+ } else {
+ return mParent.getResolvedAutoFillMode();
+ }
+ } else {
+ return autoFillMode;
+ }
+ }
+
+ /**
* Find the nearest view in the specified direction that can take focus.
* This does not actually give focus to that view.
*
diff --git a/core/java/android/view/ViewParent.java b/core/java/android/view/ViewParent.java
index cc11cb8..cdfd61b 100644
--- a/core/java/android/view/ViewParent.java
+++ b/core/java/android/view/ViewParent.java
@@ -659,4 +659,17 @@
* @return true if the action was consumed by this ViewParent
*/
public boolean onNestedPrePerformAccessibilityAction(View target, int action, Bundle arguments);
+
+ /**
+ * Return the resolved auto-fill mode.
+ *
+ * @return The resolved auto-fill mode
+ *
+ * @see View#getResolvedAutoFillMode()
+ *
+ * @hide
+ */
+ default @View.AutoFillMode int getResolvedAutoFillMode() {
+ return View.AUTO_FILL_MODE_AUTO;
+ }
}
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index c81e938..595e7a1 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -1047,8 +1047,8 @@
// Get new instance of display based on current display adjustments. It may be updated later
// if moving between the displays also involved a configuration change.
- final DisplayAdjustments displayAdjustments = mView.getResources().getDisplayAdjustments();
- mDisplay = ResourcesManager.getInstance().getAdjustedDisplay(displayId, displayAdjustments);
+ mDisplay = ResourcesManager.getInstance().getAdjustedDisplay(displayId,
+ mView.getResources());
mAttachInfo.mDisplayState = mDisplay.getState();
// Internal state updated, now notify the view hierarchy.
mView.dispatchMovedToDisplay(mDisplay);
@@ -3384,7 +3384,7 @@
if (force || mLastConfiguration.diff(config) != 0) {
// Update the display with new DisplayAdjustments.
mDisplay = ResourcesManager.getInstance().getAdjustedDisplay(
- mDisplay.getDisplayId(), localResources.getDisplayAdjustments());
+ mDisplay.getDisplayId(), localResources);
final int lastLayoutDirection = mLastConfiguration.getLayoutDirection();
final int currentLayoutDirection = config.getLayoutDirection();
diff --git a/core/java/android/view/autofill/AutoFillManager.java b/core/java/android/view/autofill/AutoFillManager.java
index 2168444..baba389 100644
--- a/core/java/android/view/autofill/AutoFillManager.java
+++ b/core/java/android/view/autofill/AutoFillManager.java
@@ -23,10 +23,8 @@
import android.content.IntentSender;
import android.graphics.Rect;
import android.os.Bundle;
-import android.os.IBinder;
import android.os.Parcelable;
import android.os.RemoteException;
-import android.util.ArrayMap;
import android.util.Log;
import android.view.View;
@@ -70,13 +68,6 @@
/** @hide */ public static final int FLAG_FOCUS_LOST = 0x4;
/** @hide */ public static final int FLAG_VALUE_CHANGED = 0x8;
- // These are activities that may have auto-fill UI which are keyed off their tokens.
- // This is done instead of the activity setting the client in the auto-fill manager
- // to avoid unnecessary instantiation of the manager and do this only if there is an
- // auto-fillable focused. This has only the cost of loading the class vs creating an
- // auto-fill manager for every activity even one that cannot be filled.
- private static final ArrayMap<IBinder, AutoFillClient> sPendingClients = new ArrayMap<>();
-
private final Rect mTempRect = new Rect();
private final IAutoFillManager mService;
@@ -84,8 +75,6 @@
private Context mContext;
- private AutoFillClient mClient;
-
private boolean mHasSession;
private boolean mEnabled;
@@ -106,6 +95,11 @@
* @param fillInIntent The authentication fill-in intent.
*/
void authenticate(IntentSender intent, Intent fillInIntent);
+
+ /**
+ * Tells the client this manager has state to be reset.
+ */
+ void resetableStateAvailable();
}
/**
@@ -219,25 +213,11 @@
finishSession();
}
- /** @hide */
- public static void addClient(IBinder token, AutoFillClient client) {
- sPendingClients.put(token, client);
- }
-
- /** @hide */
- public static boolean isClientActive(IBinder token) {
- return !sPendingClients.containsKey(token);
- }
-
- private void activateClient() {
- mClient = sPendingClients.remove(mContext.getActivityToken());
- }
-
private AutoFillClient getClient() {
- if (mClient == null) {
- return sPendingClients.get(mContext.getActivityToken());
+ if (mContext instanceof AutoFillClient) {
+ return (AutoFillClient) mContext;
}
- return mClient;
+ return null;
}
/** @hide */
@@ -278,8 +258,11 @@
try {
mService.startSession(mContext.getActivityToken(), mServiceClient.asBinder(),
id, bounds, value, mContext.getUserId());
+ AutoFillClient client = getClient();
+ if (client != null) {
+ client.resetableStateAvailable();
+ }
mHasSession = true;
- activateClient();
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
diff --git a/core/java/android/widget/TextInputTimePickerView.java b/core/java/android/widget/TextInputTimePickerView.java
index ef91576..0183343 100644
--- a/core/java/android/widget/TextInputTimePickerView.java
+++ b/core/java/android/widget/TextInputTimePickerView.java
@@ -177,15 +177,15 @@
mAmPmSpinner.setVisibility(is24Hour ? View.INVISIBLE : View.VISIBLE);
- mHourEditText.setText(String.format(format, localizedHour));
- mMinuteEditText.setText(String.format(format, minute));
-
if (amOrPm == AM) {
mAmPmSpinner.setSelection(0);
} else {
mAmPmSpinner.setSelection(1);
}
+ mHourEditText.setText(String.format(format, localizedHour));
+ mMinuteEditText.setText(String.format(format, minute));
+
if (mErrorShowing) {
validateInput();
}
diff --git a/core/java/android/widget/VideoView.java b/core/java/android/widget/VideoView.java
index b973324..7b2efea 100644
--- a/core/java/android/widget/VideoView.java
+++ b/core/java/android/widget/VideoView.java
@@ -16,11 +16,13 @@
package android.widget;
+import android.annotation.NonNull;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.res.Resources;
import android.graphics.Canvas;
+import android.media.AudioAttributes;
import android.media.AudioManager;
import android.media.Cea708CaptionRenderer;
import android.media.ClosedCaptionRenderer;
@@ -67,6 +69,14 @@
* {@link android.app.Activity#onRestoreInstanceState}.<p>
* Also note that the audio session id (from {@link #getAudioSessionId}) may
* change from its previously returned value when the VideoView is restored.
+ * <p>
+ * By default, VideoView requests audio focus with {@link AudioManager#AUDIOFOCUS_GAIN}. Use
+ * {@link #setAudioFocusRequest(int)} to change this behavior.
+ * <p>
+ * The default {@link AudioAttributes} used during playback have a usage of
+ * {@link AudioAttributes#USAGE_MEDIA} and a content type of
+ * {@link AudioAttributes#CONTENT_TYPE_MOVIE}, use {@link #setAudioAttributes(AudioAttributes)} to
+ * modify them.
*/
public class VideoView extends SurfaceView
implements MediaPlayerControl, SubtitleController.Anchor {
@@ -113,6 +123,9 @@
private boolean mCanPause;
private boolean mCanSeekBack;
private boolean mCanSeekForward;
+ private AudioManager mAudioManager;
+ private int mAudioFocusType = AudioManager.AUDIOFOCUS_GAIN; // legacy focus gain
+ private AudioAttributes mAudioAttributes;
/** Subtitle rendering widget overlaid on top of the video. */
private RenderingWidget mSubtitleWidget;
@@ -138,6 +151,10 @@
mVideoWidth = 0;
mVideoHeight = 0;
+ mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
+ mAudioAttributes = new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_MEDIA)
+ .setContentType(AudioAttributes.CONTENT_TYPE_MOVIE).build();
+
getHolder().addCallback(mSHCallback);
getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
@@ -260,6 +277,41 @@
}
/**
+ * Sets which type of audio focus will be requested during the playback, or configures playback
+ * to not request audio focus. Valid values for focus requests are
+ * {@link AudioManager#AUDIOFOCUS_GAIN}, {@link AudioManager#AUDIOFOCUS_GAIN_TRANSIENT},
+ * {@link AudioManager#AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK}, and
+ * {@link AudioManager#AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE}. Or use
+ * {@link AudioManager#AUDIOFOCUS_NONE} to express that audio focus should not be
+ * requested when playback starts. You can for instance use this when playing a silent animation
+ * through this class, and you don't want to affect other audio applications playing in the
+ * background.
+ * @param focusGain the type of audio focus gain that will be requested, or
+ * {@link AudioManager#AUDIOFOCUS_NONE} to disable the use audio focus during playback.
+ */
+ public void setAudioFocusRequest(int focusGain) {
+ if (focusGain != AudioManager.AUDIOFOCUS_NONE
+ && focusGain != AudioManager.AUDIOFOCUS_GAIN
+ && focusGain != AudioManager.AUDIOFOCUS_GAIN_TRANSIENT
+ && focusGain != AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK
+ && focusGain != AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE) {
+ throw new IllegalArgumentException("Illegal audio focus type " + focusGain);
+ }
+ mAudioFocusType = focusGain;
+ }
+
+ /**
+ * Sets the {@link AudioAttributes} to be used during the playback of the video.
+ * @param attributes non-null <code>AudioAttributes</code>.
+ */
+ public void setAudioAttributes(@NonNull AudioAttributes attributes) {
+ if (attributes == null) {
+ throw new IllegalArgumentException("Illegal null AudioAttributes");
+ }
+ mAudioAttributes = attributes;
+ }
+
+ /**
* Adds an external subtitle source file (from the provided input stream.)
*
* Note that a single external subtitle source may contain multiple or no
@@ -301,8 +353,7 @@
mMediaPlayer = null;
mCurrentState = STATE_IDLE;
mTargetState = STATE_IDLE;
- AudioManager am = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
- am.abandonAudioFocus(null);
+ mAudioManager.abandonAudioFocus(null);
}
}
@@ -315,8 +366,10 @@
// called start() previously
release(false);
- AudioManager am = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
- am.requestAudioFocus(null, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);
+ if (mAudioFocusType != AudioManager.AUDIOFOCUS_NONE) {
+ // TODO this should have a focus listener
+ mAudioManager.requestAudioFocus(null, mAudioAttributes, mAudioFocusType, 0 /*flags*/);
+ }
try {
mMediaPlayer = new MediaPlayer();
@@ -345,7 +398,7 @@
mCurrentBufferPercentage = 0;
mMediaPlayer.setDataSource(mContext, mUri, mHeaders);
mMediaPlayer.setDisplay(mSurfaceHolder);
- mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
+ mMediaPlayer.setAudioAttributes(mAudioAttributes);
mMediaPlayer.setScreenOnWhilePlaying(true);
mMediaPlayer.prepareAsync();
@@ -482,6 +535,9 @@
if (mOnCompletionListener != null) {
mOnCompletionListener.onCompletion(mMediaPlayer);
}
+ if (mAudioFocusType != AudioManager.AUDIOFOCUS_NONE) {
+ mAudioManager.abandonAudioFocus(null);
+ }
}
};
@@ -644,8 +700,9 @@
if (cleartargetstate) {
mTargetState = STATE_IDLE;
}
- AudioManager am = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
- am.abandonAudioFocus(null);
+ if (mAudioFocusType != AudioManager.AUDIOFOCUS_NONE) {
+ mAudioManager.abandonAudioFocus(null);
+ }
}
}
diff --git a/core/java/com/android/internal/util/Predicate.java b/core/java/com/android/internal/util/Predicate.java
index bc6d6b3..1b5eaff 100644
--- a/core/java/com/android/internal/util/Predicate.java
+++ b/core/java/com/android/internal/util/Predicate.java
@@ -25,7 +25,10 @@
* <p/>
* Implementors of Predicate which may cause side effects upon evaluation are
* strongly encouraged to state this fact clearly in their API documentation.
+ *
+ * @deprecated Use {@code java.util.function.Predicate} instead.
*/
+@Deprecated
public interface Predicate<T> {
boolean apply(T t);
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index 8031f19..d2d6620 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -2289,12 +2289,14 @@
<!-- Controls the auto-fill behavior for this view -->
<attr name="autoFillMode">
- <!-- Inherit the behavior from the parent. If there is no parent it is auto. -->
+ <!-- Inherit the behavior from the parent. If there is no parent it is auto. This is the
+ default value for this attribute.-->
<enum name="inherit" value="0" />
<!-- Allows this view to automatically trigger an auto-fill request when it get focus.
-->
<enum name="auto" value="1" />
- <!-- The user has to manually force an auto-fill request for this view. -->
+ <!-- Do not trigger an auto-fill request when this view is focused. The user can still
+ manually force an auto-fill request for this view. -->
<enum name="manual" value="2" />
</attr>
diff --git a/core/tests/coretests/src/android/net/NetworkScorerAppManagerTest.java b/core/tests/coretests/src/android/net/NetworkScorerAppManagerTest.java
index ce5d3ef..347024d 100644
--- a/core/tests/coretests/src/android/net/NetworkScorerAppManagerTest.java
+++ b/core/tests/coretests/src/android/net/NetworkScorerAppManagerTest.java
@@ -23,12 +23,14 @@
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
+import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
import android.content.res.Resources;
import android.net.NetworkScorerAppManager.NetworkScorerAppData;
+import android.os.Bundle;
import android.provider.Settings;
import android.test.InstrumentationTestCase;
@@ -154,6 +156,62 @@
assertEquals(924, activeScorer.packageUid);
}
+ public void testGetActiveScorer_providerAvailable_enableUseOpenWifiActivityNotSet()
+ throws Exception {
+ final ComponentName recoComponent = new ComponentName("package1", "class1");
+ setNetworkRecommendationPackageNames(recoComponent.getPackageName());
+ mockScoreNetworksGranted(recoComponent.getPackageName());
+ mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */,
+ null /* enableUseOpenWifiPackageActivityPackage*/);
+
+ ContentResolver cr = mTargetContext.getContentResolver();
+ Settings.Global.putInt(cr, Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED, 1);
+
+ final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer();
+ assertNotNull(activeScorer);
+ assertEquals(recoComponent, activeScorer.getRecommendationServiceComponent());
+ assertEquals(924, activeScorer.packageUid);
+ assertNull(activeScorer.getEnableUseOpenWifiActivity());
+ }
+
+ public void testGetActiveScorer_providerAvailable_enableUseOpenWifiActivityNotResolved()
+ throws Exception {
+ final ComponentName recoComponent = new ComponentName("package1", "class1");
+ setNetworkRecommendationPackageNames(recoComponent.getPackageName());
+ mockScoreNetworksGranted(recoComponent.getPackageName());
+ mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */,
+ "package2" /* enableUseOpenWifiPackageActivityPackage*/);
+
+ ContentResolver cr = mTargetContext.getContentResolver();
+ Settings.Global.putInt(cr, Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED, 1);
+
+ final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer();
+ assertNotNull(activeScorer);
+ assertEquals(recoComponent, activeScorer.getRecommendationServiceComponent());
+ assertEquals(924, activeScorer.packageUid);
+ assertNull(activeScorer.getEnableUseOpenWifiActivity());
+ }
+
+ public void testGetActiveScorer_providerAvailable_enableUseOpenWifiActivityResolved()
+ throws Exception {
+ final ComponentName recoComponent = new ComponentName("package1", "class1");
+ final ComponentName enableUseOpenWifiComponent = new ComponentName("package2", "class2");
+ setNetworkRecommendationPackageNames(recoComponent.getPackageName());
+ mockScoreNetworksGranted(recoComponent.getPackageName());
+ mockRecommendationServiceAvailable(recoComponent, 924 /* packageUid */,
+ enableUseOpenWifiComponent.getPackageName());
+ mockEnableUseOpenWifiActivity(enableUseOpenWifiComponent);
+
+ ContentResolver cr = mTargetContext.getContentResolver();
+ Settings.Global.putInt(cr, Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED, 1);
+
+ final NetworkScorerAppData activeScorer = mNetworkScorerAppManager.getActiveScorer();
+ assertNotNull(activeScorer);
+ assertEquals(recoComponent, activeScorer.getRecommendationServiceComponent());
+ assertEquals(924, activeScorer.packageUid);
+ assertEquals(enableUseOpenWifiComponent, activeScorer.getEnableUseOpenWifiActivity());
+ }
+
public void testGetActiveScorer_providerNotAvailable()
throws Exception {
ContentResolver cr = mTargetContext.getContentResolver();
@@ -194,14 +252,25 @@
}
private void mockRecommendationServiceAvailable(final ComponentName compName, int packageUid) {
+ mockRecommendationServiceAvailable(compName, packageUid, null);
+ }
+
+ private void mockRecommendationServiceAvailable(final ComponentName compName, int packageUid,
+ String enableUseOpenWifiActivityPackage) {
final ResolveInfo serviceInfo = new ResolveInfo();
serviceInfo.serviceInfo = new ServiceInfo();
serviceInfo.serviceInfo.name = compName.getClassName();
serviceInfo.serviceInfo.packageName = compName.getPackageName();
serviceInfo.serviceInfo.applicationInfo = new ApplicationInfo();
serviceInfo.serviceInfo.applicationInfo.uid = packageUid;
+ if (enableUseOpenWifiActivityPackage != null) {
+ serviceInfo.serviceInfo.metaData = new Bundle();
+ serviceInfo.serviceInfo.metaData.putString(
+ NetworkScoreManager.USE_OPEN_WIFI_PACKAGE_META_DATA,
+ enableUseOpenWifiActivityPackage);
+ }
- final int flags = 0;
+ final int flags = PackageManager.GET_META_DATA;
when(mMockPm.resolveService(
Mockito.argThat(new ArgumentMatcher<Intent>() {
@Override
@@ -213,4 +282,22 @@
}
}), Mockito.eq(flags))).thenReturn(serviceInfo);
}
+
+ private void mockEnableUseOpenWifiActivity(final ComponentName useOpenWifiComp) {
+ final ResolveInfo resolveActivityInfo = new ResolveInfo();
+ resolveActivityInfo.activityInfo = new ActivityInfo();
+ resolveActivityInfo.activityInfo.name = useOpenWifiComp.getClassName();
+ resolveActivityInfo.activityInfo.packageName = useOpenWifiComp.getPackageName();
+
+ final int flags = 0;
+ when(mMockPm.resolveActivity(
+ Mockito.argThat(new ArgumentMatcher<Intent>() {
+ @Override
+ public boolean matches(Object object) {
+ Intent intent = (Intent) object;
+ return NetworkScoreManager.ACTION_CUSTOM_ENABLE.equals(intent.getAction())
+ && useOpenWifiComp.getPackageName().equals(intent.getPackage());
+ }
+ }), Mockito.eq(flags))).thenReturn(resolveActivityInfo);
+ }
}
diff --git a/core/tests/coretests/src/android/os/FileUtilsTest.java b/core/tests/coretests/src/android/os/FileUtilsTest.java
index bd90079..5c7da70 100644
--- a/core/tests/coretests/src/android/os/FileUtilsTest.java
+++ b/core/tests/coretests/src/android/os/FileUtilsTest.java
@@ -311,6 +311,28 @@
assertNameEquals("test.foo (1).bar", FileUtils.buildUniqueFile(mTarget, "test.foo.bar"));
}
+ public void testRoundStorageSize() throws Exception {
+ final long M128 = 134217728L;
+ final long M256 = M128 * 2;
+ final long M512 = M256 * 2;
+ final long M1024 = M512 * 2;
+ final long G16 = M1024 * 16;
+ final long G32 = M1024 * 32;
+ final long G64 = M1024 * 64;
+
+ assertEquals(M128, FileUtils.roundStorageSize(M128));
+ assertEquals(M256, FileUtils.roundStorageSize(M128 + 1));
+ assertEquals(M256, FileUtils.roundStorageSize(M256 - 1));
+ assertEquals(M256, FileUtils.roundStorageSize(M256));
+ assertEquals(M512, FileUtils.roundStorageSize(M256 + 1));
+
+ assertEquals(G16, FileUtils.roundStorageSize(G16));
+ assertEquals(G32, FileUtils.roundStorageSize(G16 + 1));
+ assertEquals(G32, FileUtils.roundStorageSize(G32 - 1));
+ assertEquals(G32, FileUtils.roundStorageSize(G32));
+ assertEquals(G64, FileUtils.roundStorageSize(G32 + 1));
+ }
+
private static void assertNameEquals(String expected, File actual) {
assertEquals(expected, actual.getName());
}
diff --git a/core/tests/coretests/src/android/provider/SettingsBackupTest.java b/core/tests/coretests/src/android/provider/SettingsBackupTest.java
index c4016c2..da6a294 100644
--- a/core/tests/coretests/src/android/provider/SettingsBackupTest.java
+++ b/core/tests/coretests/src/android/provider/SettingsBackupTest.java
@@ -325,7 +325,6 @@
Settings.Global.USE_GOOGLE_MAIL,
Settings.Global.VT_IMS_ENABLED,
Settings.Global.WAIT_FOR_DEBUGGER,
- Settings.Global.WAIT_FOR_NETWORK_TIMEOUT_MS,
Settings.Global.WARNING_TEMPERATURE,
Settings.Global.WEBVIEW_DATA_REDUCTION_PROXY_KEY,
Settings.Global.WEBVIEW_FALLBACK_LOGIC_ENABLED,
diff --git a/data/etc/platform.xml b/data/etc/platform.xml
index 344f3c8..6248856 100644
--- a/data/etc/platform.xml
+++ b/data/etc/platform.xml
@@ -60,7 +60,6 @@
</permission>
<permission name="android.permission.WRITE_MEDIA_STORAGE" >
- <group gid="media_rw" />
<group gid="sdcard_rw" />
</permission>
diff --git a/legacy-test/Android.mk b/legacy-test/Android.mk
index 0a814f3..05fec5e 100644
--- a/legacy-test/Android.mk
+++ b/legacy-test/Android.mk
@@ -50,5 +50,5 @@
LOCAL_SRC_FILES := src/android/test/PerformanceTestCase.java
LOCAL_MODULE := legacy-performance-test-hostdex
-include $(BUILD_HOST_DALVIK_JAVA_LIBRARY)
+include $(BUILD_HOST_DALVIK_STATIC_JAVA_LIBRARY)
endif # HOST_OS == linux
diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java
index a4f2a7e..95d354b 100644
--- a/media/java/android/media/AudioManager.java
+++ b/media/java/android/media/AudioManager.java
@@ -1981,8 +1981,7 @@
}
/**
- * @hide
- * Used to indicate no audio focus has been gained or lost.
+ * Used to indicate no audio focus has been gained or lost, or requested.
*/
public static final int AUDIOFOCUS_NONE = 0;
diff --git a/media/java/android/media/AudioPlaybackConfiguration.java b/media/java/android/media/AudioPlaybackConfiguration.java
index dd9c6a7..6b8a279 100644
--- a/media/java/android/media/AudioPlaybackConfiguration.java
+++ b/media/java/android/media/AudioPlaybackConfiguration.java
@@ -366,11 +366,18 @@
* @param pw
*/
public void dump(PrintWriter pw) {
- pw.println(" ID:" + mPlayerIId
- + " -- type:" + toLogFriendlyPlayerType(mPlayerType)
- + " -- u/pid:" + mClientUid +"/" + mClientPid
- + " -- state:" + toLogFriendlyPlayerState(mPlayerState)
- + " -- attr:" + mPlayerAttr);
+ pw.println(" " + toLogFriendlyString(this));
+ }
+
+ /**
+ * @hide
+ */
+ public static String toLogFriendlyString(AudioPlaybackConfiguration apc) {
+ return new String("ID:" + apc.mPlayerIId
+ + " -- type:" + toLogFriendlyPlayerType(apc.mPlayerType)
+ + " -- u/pid:" + apc.mClientUid +"/" + apc.mClientPid
+ + " -- state:" + toLogFriendlyPlayerState(apc.mPlayerState)
+ + " -- attr:" + apc.mPlayerAttr);
}
public static final Parcelable.Creator<AudioPlaybackConfiguration> CREATOR
diff --git a/media/java/android/media/IAudioService.aidl b/media/java/android/media/IAudioService.aidl
index fa4796a..5855984 100644
--- a/media/java/android/media/IAudioService.aidl
+++ b/media/java/android/media/IAudioService.aidl
@@ -192,7 +192,7 @@
oneway void releasePlayer(in int piid);
- void disableRingtoneSync();
+ void disableRingtoneSync(in int userId);
int getFocusRampTimeMs(in int focusGain, in AudioAttributes attr);
diff --git a/media/java/android/media/RingtoneManager.java b/media/java/android/media/RingtoneManager.java
index 8a1027b..e774c71 100644
--- a/media/java/android/media/RingtoneManager.java
+++ b/media/java/android/media/RingtoneManager.java
@@ -103,10 +103,6 @@
*/
public static final int TYPE_ALL = TYPE_RINGTONE | TYPE_NOTIFICATION | TYPE_ALARM;
- private static final int[] RINGTONE_TYPES = {
- TYPE_RINGTONE, TYPE_NOTIFICATION, TYPE_ALARM
- };
-
// </attr>
/**
@@ -773,30 +769,17 @@
}
/**
- * Disables Settings.System.SYNC_PARENT_SOUNDS, copying the parent's ringtones to the current
- * profile
+ * Disables Settings.System.SYNC_PARENT_SOUNDS.
*
* @hide
*/
- @RequiresPermission(Manifest.permission.WRITE_SECURE_SETTINGS)
public static void disableSyncFromParent(Context userContext) {
- // Must disable sync first so that ringtone copy below doesn't get redirected to parent
- Settings.Secure.putIntForUser(userContext.getContentResolver(),
- Settings.Secure.SYNC_PARENT_SOUNDS, 0 /* false */, userContext.getUserId());
-
- // Copy ringtones from parent profile
- UserManager um = UserManager.get(userContext);
- UserInfo parentInfo = um.getProfileParent(userContext.getUserId());
- if (parentInfo != null) {
- final Context targetContext = createPackageContextAsUser(userContext, parentInfo.id);
- if (targetContext != null) {
- for (int ringtoneType : RINGTONE_TYPES) {
- Uri ringtoneUri = getActualDefaultRingtoneUri(targetContext, ringtoneType);
- // Add user id of parent so that custom ringtones can be read and played
- RingtoneManager.setActualDefaultRingtoneUri(userContext, ringtoneType,
- maybeAddUserId(ringtoneUri, parentInfo.id));
- }
- }
+ IBinder b = ServiceManager.getService(Context.AUDIO_SERVICE);
+ IAudioService audioService = IAudioService.Stub.asInterface(b);
+ try {
+ audioService.disableRingtoneSync(userContext.getUserId());
+ } catch (RemoteException e) {
+ Log.e(TAG, "Unable to disable ringtone sync.");
}
}
@@ -851,22 +834,15 @@
* @see #getActualDefaultRingtoneUri(Context, int)
*/
public static void setActualDefaultRingtoneUri(Context context, int type, Uri ringtoneUri) {
- final ContentResolver resolver = context.getContentResolver();
-
- if (Settings.Secure.getString(resolver, Settings.Secure.SYNC_PARENT_SOUNDS).equals("1")) {
- // Sync is enabled, so we need to disable it
- IBinder b = ServiceManager.getService(Context.AUDIO_SERVICE);
- IAudioService audioService = IAudioService.Stub.asInterface(b);
- try {
- audioService.disableRingtoneSync();
- } catch (RemoteException e) {
- Log.e(TAG, "Unable to disable ringtone sync.");
- return;
- }
- }
-
String setting = getSettingForType(type);
if (setting == null) return;
+
+ final ContentResolver resolver = context.getContentResolver();
+ if (Settings.Secure.getIntForUser(resolver, Settings.Secure.SYNC_PARENT_SOUNDS, 0,
+ context.getUserId()) == 1) {
+ // Parent sound override is enabled. Disable it using the audio service.
+ disableSyncFromParent(context);
+ }
if(!isInternalRingtoneUri(ringtoneUri)) {
ringtoneUri = ContentProvider.maybeAddUserId(ringtoneUri, context.getUserId());
}
diff --git a/packages/CarrierDefaultApp/AndroidManifest.xml b/packages/CarrierDefaultApp/AndroidManifest.xml
index e2080b0..d910920 100644
--- a/packages/CarrierDefaultApp/AndroidManifest.xml
+++ b/packages/CarrierDefaultApp/AndroidManifest.xml
@@ -31,7 +31,7 @@
<application android:label="@string/app_name" >
<receiver android:name="com.android.carrierdefaultapp.CarrierDefaultBroadcastReceiver">
<intent-filter>
- <action android:name="android.intent.action.CARRIER_SIGNAL_REDIRECTED" />
+ <action android:name="com.android.internal.telephony.CARRIER_SIGNAL_REDIRECTED" />
</intent-filter>
</receiver>
<activity android:name="com.android.carrierdefaultapp.CaptivePortalLaunchActivity"
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
index 521b8d7..2dc9d63 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
@@ -88,6 +88,7 @@
import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
@@ -2617,6 +2618,8 @@
if (isSecureSettingsKey(key)) {
maybeNotifyProfiles(getTypeFromKey(key), userId, uri, name,
sSecureCloneToManagedSettings);
+ maybeNotifyProfiles(SETTINGS_TYPE_SYSTEM, userId, uri, name,
+ sSystemCloneFromParentOnDependency.values());
} else if (isSystemSettingsKey(key)) {
maybeNotifyProfiles(getTypeFromKey(key), userId, uri, name,
sSystemCloneToManagedSettings);
@@ -2626,7 +2629,7 @@
}
private void maybeNotifyProfiles(int type, int userId, Uri uri, String name,
- Set<String> keysCloned) {
+ Collection<String> keysCloned) {
if (keysCloned.contains(name)) {
for (int profileId : mUserManager.getProfileIdsWithDisabled(userId)) {
// the notification for userId has already been sent.
diff --git a/services/core/java/com/android/server/GraphicsStatsService.java b/services/core/java/com/android/server/GraphicsStatsService.java
index bdd80e38..14a9a31 100644
--- a/services/core/java/com/android/server/GraphicsStatsService.java
+++ b/services/core/java/com/android/server/GraphicsStatsService.java
@@ -137,16 +137,21 @@
}
private void onAlarm() {
+ // We need to make a copy since some of the callbacks won't be proxy and thus
+ // can result in a re-entrant acquisition of mLock that would result in a modification
+ // of mActive during iteration.
+ ActiveBuffer[] activeCopy;
synchronized (mLock) {
mRotateIsScheduled = false;
scheduleRotateLocked();
- for (ActiveBuffer active : mActive) {
- try {
- active.mCallback.onRotateGraphicsStatsBuffer();
- } catch (RemoteException e) {
- Log.w(TAG, String.format("Failed to notify '%s' (pid=%d) to rotate buffers",
- active.mInfo.packageName, active.mPid), e);
- }
+ activeCopy = mActive.toArray(new ActiveBuffer[0]);
+ }
+ for (ActiveBuffer active : activeCopy) {
+ try {
+ active.mCallback.onRotateGraphicsStatsBuffer();
+ } catch (RemoteException e) {
+ Log.w(TAG, String.format("Failed to notify '%s' (pid=%d) to rotate buffers",
+ active.mInfo.packageName, active.mPid), e);
}
}
// Give a few seconds for everyone to rotate before doing the cleanup
diff --git a/services/core/java/com/android/server/InputMethodManagerService.java b/services/core/java/com/android/server/InputMethodManagerService.java
index fe5b3a2..b95ed08 100644
--- a/services/core/java/com/android/server/InputMethodManagerService.java
+++ b/services/core/java/com/android/server/InputMethodManagerService.java
@@ -881,7 +881,7 @@
final class MyPackageMonitor extends PackageMonitor {
/**
- * Set of packages to be monitored.
+ * Package names that are known to contain {@link InputMethodService}.
*
* <p>No need to include packages because of direct-boot unaware IMEs since we always rescan
* all the packages when the user is unlocked, and direct-boot awareness will not be changed
@@ -889,16 +889,36 @@
* rescanning.</p>
*/
@GuardedBy("mMethodMap")
- private ArraySet<String> mPackagesToMonitorComponentChange = new ArraySet<>();
+ final private ArraySet<String> mKnownImePackageNames = new ArraySet<>();
+
+ /**
+ * Packages that are appeared, disappeared, or modified for whatever reason.
+ *
+ * <p>Note: For now we intentionally use {@link ArrayList} instead of {@link ArraySet}
+ * because 1) the number of elements is almost always 1 or so, and 2) we do not care
+ * duplicate elements for our use case.</p>
+ *
+ * <p>This object must be accessed only from callback methods in {@link PackageMonitor},
+ * which should be bound to {@link #getRegisteredHandler()}.</p>
+ */
+ private final ArrayList<String> mChangedPackages = new ArrayList<>();
+
+ /**
+ * {@code true} if one or more packages that contain {@link InputMethodService} appeared.
+ *
+ * <p>This field must be accessed only from callback methods in {@link PackageMonitor},
+ * which should be bound to {@link #getRegisteredHandler()}.</p>
+ */
+ private boolean mImePackageAppeared = false;
@GuardedBy("mMethodMap")
- void clearPackagesToMonitorComponentChangeLocked() {
- mPackagesToMonitorComponentChange.clear();
+ void clearKnownImePackageNamesLocked() {
+ mKnownImePackageNames.clear();
}
@GuardedBy("mMethodMap")
- final void addPackageToMonitorComponentChangeLocked(@NonNull String packageName) {
- mPackagesToMonitorComponentChange.add(packageName);
+ final void addKnownImePackageNameLocked(@NonNull String packageName) {
+ mKnownImePackageNames.add(packageName);
}
@GuardedBy("mMethodMap")
@@ -943,19 +963,97 @@
}
@Override
- public boolean onPackageChanged(String packageName, int uid, String[] components) {
- // If this package is in the watch list, we want to check it.
- synchronized (mMethodMap) {
- return mPackagesToMonitorComponentChange.contains(packageName);
+ public void onBeginPackageChanges() {
+ clearPackageChangeState();
+ }
+
+ @Override
+ public void onPackageAppeared(String packageName, int reason) {
+ if (!mImePackageAppeared) {
+ final PackageManager pm = mContext.getPackageManager();
+ final List<ResolveInfo> services = pm.queryIntentServicesAsUser(
+ new Intent(InputMethod.SERVICE_INTERFACE).setPackage(packageName),
+ PackageManager.MATCH_DISABLED_COMPONENTS, getChangingUserId());
+ // No need to lock this because we access it only on getRegisteredHandler().
+ if (!services.isEmpty()) {
+ mImePackageAppeared = true;
+ }
+ }
+ // No need to lock this because we access it only on getRegisteredHandler().
+ mChangedPackages.add(packageName);
+ }
+
+ @Override
+ public void onPackageDisappeared(String packageName, int reason) {
+ // No need to lock this because we access it only on getRegisteredHandler().
+ mChangedPackages.add(packageName);
+ }
+
+ @Override
+ public void onPackageModified(String packageName) {
+ // No need to lock this because we access it only on getRegisteredHandler().
+ mChangedPackages.add(packageName);
+ }
+
+ @Override
+ public void onPackagesSuspended(String[] packages) {
+ // No need to lock this because we access it only on getRegisteredHandler().
+ for (String packageName : packages) {
+ mChangedPackages.add(packageName);
}
}
@Override
- public void onSomePackagesChanged() {
+ public void onPackagesUnsuspended(String[] packages) {
+ // No need to lock this because we access it only on getRegisteredHandler().
+ for (String packageName : packages) {
+ mChangedPackages.add(packageName);
+ }
+ }
+
+ @Override
+ public void onFinishPackageChanges() {
+ onFinishPackageChangesInternal();
+ clearPackageChangeState();
+ }
+
+ private void clearPackageChangeState() {
+ // No need to lock them because we access these fields only on getRegisteredHandler().
+ mChangedPackages.clear();
+ mImePackageAppeared = false;
+ }
+
+ private boolean shouldRebuildInputMethodListLocked() {
+ // This method is guaranteed to be called only by getRegisteredHandler().
+
+ // If there is any new package that contains at least one IME, then rebuilt the list
+ // of IMEs.
+ if (mImePackageAppeared) {
+ return true;
+ }
+
+ // Otherwise, check if mKnownImePackageNames and mChangedPackages have any intersection.
+ // TODO: Consider to create a utility method to do the following test. List.retainAll()
+ // is an option, but it may still do some extra operations that we do not need here.
+ final int N = mChangedPackages.size();
+ for (int i = 0; i < N; ++i) {
+ final String packageName = mChangedPackages.get(i);
+ if (mKnownImePackageNames.contains(packageName)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private void onFinishPackageChangesInternal() {
synchronized (mMethodMap) {
if (!isChangingPackagesOfCurrentUserLocked()) {
return;
}
+ if (!shouldRebuildInputMethodListLocked()) {
+ return;
+ }
+
InputMethodInfo curIm = null;
String curInputMethodId = mSettings.getSelectedInputMethod();
final int N = mMethodList.size();
@@ -3283,7 +3381,7 @@
mMethodList.clear();
mMethodMap.clear();
mMethodMapUpdateCount++;
- mMyPackageMonitor.clearPackagesToMonitorComponentChangeLocked();
+ mMyPackageMonitor.clearKnownImePackageNamesLocked();
// Use for queryIntentServicesAsUser
final PackageManager pm = mContext.getPackageManager();
@@ -3339,10 +3437,9 @@
final int N = allInputMethodServices.size();
for (int i = 0; i < N; ++i) {
final ServiceInfo si = allInputMethodServices.get(i).serviceInfo;
- if (!android.Manifest.permission.BIND_INPUT_METHOD.equals(si.permission)) {
- continue;
+ if (android.Manifest.permission.BIND_INPUT_METHOD.equals(si.permission)) {
+ mMyPackageMonitor.addKnownImePackageNameLocked(si.packageName);
}
- mMyPackageMonitor.addPackageToMonitorComponentChangeLocked(si.packageName);
}
}
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index 5b3495f..79b99a3 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -6518,35 +6518,22 @@
return mRecordMonitor.getActiveRecordingConfigurations();
}
- public void disableRingtoneSync() {
+ public void disableRingtoneSync(final int userId) {
final int callingUserId = UserHandle.getCallingUserId();
+ if (callingUserId != userId) {
+ mContext.enforceCallingOrSelfPermission(Manifest.permission.INTERACT_ACROSS_USERS_FULL,
+ "disable sound settings syncing for another profile");
+ }
final long token = Binder.clearCallingIdentity();
try {
- UserManager userManager = UserManager.get(mContext);
-
- // Disable the sync setting
- Settings.Secure.putIntForUser(mContentResolver,
- Settings.Secure.SYNC_PARENT_SOUNDS, 0 /* false */, callingUserId);
-
- UserInfo parentInfo = userManager.getProfileParent(callingUserId);
- if (parentInfo != null && parentInfo.id != callingUserId) {
- // This is a managed profile, so we clone the ringtones from the parent profile
- cloneRingtoneSetting(callingUserId, parentInfo.id, Settings.System.RINGTONE);
- cloneRingtoneSetting(callingUserId, parentInfo.id,
- Settings.System.NOTIFICATION_SOUND);
- cloneRingtoneSetting(callingUserId, parentInfo.id, Settings.System.ALARM_ALERT);
- }
+ // Disable the sync setting so the profile uses its own sound settings.
+ Settings.Secure.putIntForUser(mContentResolver, Settings.Secure.SYNC_PARENT_SOUNDS,
+ 0 /* false */, userId);
} finally {
Binder.restoreCallingIdentity(token);
}
}
- private void cloneRingtoneSetting(int userId, int parentId, String ringtoneSetting) {
- String parentSetting = Settings.System.getStringForUser(mContentResolver, ringtoneSetting,
- parentId);
- Settings.System.putStringForUser(mContentResolver, ringtoneSetting, parentSetting, userId);
- }
-
//======================
// Audio playback notification
//======================
diff --git a/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java b/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java
index 1f64b65..e8ff510 100644
--- a/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java
+++ b/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java
@@ -47,6 +47,7 @@
implements AudioPlaybackConfiguration.PlayerDeathMonitor, PlayerFocusEnforcer {
public final static String TAG = "AudioService.PlaybackActivityMonitor";
+
private final static boolean DEBUG = false;
private final static int VOLUME_SHAPER_SYSTEM_DUCK_ID = 1;
diff --git a/services/core/java/com/android/server/notification/RankingHelper.java b/services/core/java/com/android/server/notification/RankingHelper.java
index 76890b1..867af9a 100644
--- a/services/core/java/com/android/server/notification/RankingHelper.java
+++ b/services/core/java/com/android/server/notification/RankingHelper.java
@@ -32,6 +32,7 @@
import android.content.pm.ParceledListSlice;
import android.os.Build;
import android.os.UserHandle;
+import android.provider.Settings;
import android.service.notification.NotificationListenerService.Ranking;
import android.text.TextUtils;
import android.util.ArrayMap;
@@ -516,6 +517,10 @@
if (!r.showBadge) {
channel.setShowBadge(false);
}
+ if (channel.getSound() == null) {
+ channel.setSound(Settings.System.DEFAULT_NOTIFICATION_URI,
+ Notification.AUDIO_ATTRIBUTES_DEFAULT);
+ }
r.channels.put(channel.getId(), channel);
updateConfig();
}
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index e447072..975ae06 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -251,6 +251,7 @@
import com.android.internal.os.Zygote;
import com.android.internal.telephony.CarrierAppUtils;
import com.android.internal.util.ArrayUtils;
+import com.android.internal.util.ConcurrentUtils;
import com.android.internal.util.FastPrintWriter;
import com.android.internal.util.FastXmlSerializer;
import com.android.internal.util.IndentingPrintWriter;
@@ -265,6 +266,7 @@
import com.android.server.LocalServices;
import com.android.server.ServiceThread;
import com.android.server.SystemConfig;
+import com.android.server.SystemServerInitThreadPool;
import com.android.server.Watchdog;
import com.android.server.net.NetworkPolicyManagerInternal;
import com.android.server.pm.Installer.InstallerException;
@@ -322,6 +324,7 @@
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
@@ -857,6 +860,8 @@
private ArraySet<String> mPrivappPermissionsViolations;
+ private Future<?> mPrepareAppDataFuture;
+
private static class IFVerificationParams {
PackageParser.Package pkg;
boolean replacing;
@@ -2757,8 +2762,32 @@
} else {
storageFlags = StorageManager.FLAG_STORAGE_DE | StorageManager.FLAG_STORAGE_CE;
}
- reconcileAppsDataLI(StorageManager.UUID_PRIVATE_INTERNAL, UserHandle.USER_SYSTEM,
- storageFlags, true /* migrateAppData */);
+ List<String> deferPackages = reconcileAppsDataLI(StorageManager.UUID_PRIVATE_INTERNAL,
+ UserHandle.USER_SYSTEM, storageFlags, true /* migrateAppData */,
+ true /* onlyCoreApps */);
+ mPrepareAppDataFuture = SystemServerInitThreadPool.get().submit(() -> {
+ if (deferPackages == null || deferPackages.isEmpty()) {
+ return;
+ }
+ int count = 0;
+ for (String pkgName : deferPackages) {
+ PackageParser.Package pkg = null;
+ synchronized (mPackages) {
+ PackageSetting ps = mSettings.getPackageLPr(pkgName);
+ if (ps != null && ps.getInstalled(UserHandle.USER_SYSTEM)) {
+ pkg = ps.pkg;
+ }
+ }
+ if (pkg != null) {
+ synchronized (mInstallLock) {
+ prepareAppDataAndMigrateLIF(pkg, UserHandle.USER_SYSTEM, storageFlags,
+ true /* maybeMigrateAppData */);
+ }
+ count++;
+ }
+ }
+ Slog.i(TAG, "Deferred reconcileAppsData finished " + count + " packages");
+ }, "prepareAppData");
// If this is first boot after an OTA, and a normal boot, then
// we need to clear code cache directories.
@@ -14202,88 +14231,6 @@
abstract void handleReturnCode();
}
- class MeasureParams extends HandlerParams {
- private final PackageStats mStats;
- private boolean mSuccess;
-
- private final IPackageStatsObserver mObserver;
-
- public MeasureParams(PackageStats stats, IPackageStatsObserver observer) {
- super(new UserHandle(stats.userHandle));
- mObserver = observer;
- mStats = stats;
- }
-
- @Override
- public String toString() {
- return "MeasureParams{"
- + Integer.toHexString(System.identityHashCode(this))
- + " " + mStats.packageName + "}";
- }
-
- @Override
- void handleStartCopy() throws RemoteException {
- synchronized (mInstallLock) {
- mSuccess = getPackageSizeInfoLI(mStats.packageName, mStats.userHandle, mStats);
- }
-
- if (mSuccess) {
- boolean mounted = false;
- try {
- final String status = Environment.getExternalStorageState();
- mounted = (Environment.MEDIA_MOUNTED.equals(status)
- || Environment.MEDIA_MOUNTED_READ_ONLY.equals(status));
- } catch (Exception e) {
- }
-
- if (mounted) {
- final UserEnvironment userEnv = new UserEnvironment(mStats.userHandle);
-
- mStats.externalCacheSize = calculateDirectorySize(mContainerService,
- userEnv.buildExternalStorageAppCacheDirs(mStats.packageName));
-
- mStats.externalDataSize = calculateDirectorySize(mContainerService,
- userEnv.buildExternalStorageAppDataDirs(mStats.packageName));
-
- // Always subtract cache size, since it's a subdirectory
- mStats.externalDataSize -= mStats.externalCacheSize;
-
- mStats.externalMediaSize = calculateDirectorySize(mContainerService,
- userEnv.buildExternalStorageAppMediaDirs(mStats.packageName));
-
- mStats.externalObbSize = calculateDirectorySize(mContainerService,
- userEnv.buildExternalStorageAppObbDirs(mStats.packageName));
- }
- }
- }
-
- @Override
- void handleReturnCode() {
- if (mObserver != null) {
- try {
- mObserver.onGetStatsCompleted(mStats, mSuccess);
- } catch (RemoteException e) {
- Slog.i(TAG, "Observer no longer exists.");
- }
- }
- }
-
- @Override
- void handleServiceError() {
- Slog.e(TAG, "Could not measure application " + mStats.packageName
- + " external storage");
- }
- }
-
- private static long calculateDirectorySize(IMediaContainerService mcs, File[] paths)
- throws RemoteException {
- long result = 0;
- for (File path : paths) {
- result += mcs.calculateDirectorySize(path.getAbsolutePath());
- }
- return result;
- }
-
private static void clearDirectory(IMediaContainerService mcs, File[] paths) {
for (File path : paths) {
try {
@@ -18739,21 +18686,11 @@
@Override
public void getPackageSizeInfo(final String packageName, int userHandle,
final IPackageStatsObserver observer) {
- mContext.enforceCallingOrSelfPermission(
- android.Manifest.permission.GET_PACKAGE_SIZE, null);
- if (packageName == null) {
- throw new IllegalArgumentException("Attempt to get size of null packageName");
+ Slog.w(TAG, "Shame on you for calling a hidden API. Shame!");
+ try {
+ observer.onGetStatsCompleted(null, false);
+ } catch (RemoteException ignored) {
}
-
- PackageStats stats = new PackageStats(packageName, userHandle);
-
- /*
- * Queue up an async operation since the package measurement may take a
- * little while.
- */
- Message msg = mHandler.obtainMessage(INIT_COPY);
- msg.obj = new MeasureParams(stats, observer);
- mHandler.sendMessage(msg);
}
private boolean getPackageSizeInfoLI(String packageName, int userId, PackageStats stats) {
@@ -20168,6 +20105,14 @@
}
}
+ public void waitForAppDataPrepared() {
+ if (mPrepareAppDataFuture == null) {
+ return;
+ }
+ ConcurrentUtils.waitForFutureNoInterrupt(mPrepareAppDataFuture, "wait for prepareAppData");
+ mPrepareAppDataFuture = null;
+ }
+
@Override
public boolean isSafeMode() {
return mSafeMode;
@@ -21618,6 +21563,11 @@
}
}
+ private void reconcileAppsDataLI(String volumeUuid, int userId, int flags,
+ boolean migrateAppData) {
+ reconcileAppsDataLI(volumeUuid, userId, flags, migrateAppData, false /* onlyCoreApps */);
+ }
+
/**
* Reconcile all app data on given mounted volume.
* <p>
@@ -21626,11 +21576,13 @@
* <p>
* Verifies that directories exist and that ownership and labeling is
* correct for all installed apps.
+ * @returns list of skipped non-core packages (if {@code onlyCoreApps} is true)
*/
- private void reconcileAppsDataLI(String volumeUuid, int userId, int flags,
- boolean migrateAppData) {
+ private List<String> reconcileAppsDataLI(String volumeUuid, int userId, int flags,
+ boolean migrateAppData, boolean onlyCoreApps) {
Slog.v(TAG, "reconcileAppsData for " + volumeUuid + " u" + userId + " 0x"
+ Integer.toHexString(flags) + " migrateAppData=" + migrateAppData);
+ List<String> result = onlyCoreApps ? new ArrayList<>() : null;
final File ceDir = Environment.getDataUserCeDirectory(volumeUuid, userId);
final File deDir = Environment.getDataUserDeDirectory(volumeUuid, userId);
@@ -21694,21 +21646,20 @@
// and reconcile again once they're scanned
continue;
}
+ // Skip non-core apps if requested
+ if (onlyCoreApps && !ps.pkg.coreApp) {
+ result.add(packageName);
+ continue;
+ }
if (ps.getInstalled(userId)) {
- prepareAppDataLIF(ps.pkg, userId, flags);
-
- if (migrateAppData && maybeMigrateAppDataLIF(ps.pkg, userId)) {
- // We may have just shuffled around app data directories, so
- // prepare them one more time
- prepareAppDataLIF(ps.pkg, userId, flags);
- }
-
+ prepareAppDataAndMigrateLIF(ps.pkg, userId, flags, migrateAppData);
preparedCount++;
}
}
Slog.v(TAG, "reconcileAppsData finished " + preparedCount + " packages");
+ return result;
}
/**
@@ -21769,6 +21720,17 @@
}
}
+ private void prepareAppDataAndMigrateLIF(PackageParser.Package pkg, int userId, int flags,
+ boolean maybeMigrateAppData) {
+ prepareAppDataLIF(pkg, userId, flags);
+
+ if (maybeMigrateAppData && maybeMigrateAppDataLIF(pkg, userId)) {
+ // We may have just shuffled around app data directories, so
+ // prepare them one more time
+ prepareAppDataLIF(pkg, userId, flags);
+ }
+ }
+
private void prepareAppDataLeafLIF(PackageParser.Package pkg, int userId, int flags) {
if (DEBUG_APP_DATA) {
Slog.v(TAG, "prepareAppData for " + pkg.packageName + " u" + userId + " 0x"
diff --git a/services/core/jni/com_android_server_location_ContextHubService.cpp b/services/core/jni/com_android_server_location_ContextHubService.cpp
index 05ef0d1..27d2b6d 100644
--- a/services/core/jni/com_android_server_location_ContextHubService.cpp
+++ b/services/core/jni/com_android_server_location_ContextHubService.cpp
@@ -558,7 +558,7 @@
void initContextHubService() {
db.hubInfo.numHubs = 0;
- db.hubInfo.contextHub = IContexthub::getService("context_hub");
+ db.hubInfo.contextHub = IContexthub::getService();
if (db.hubInfo.contextHub == nullptr) {
ALOGE("Could not load context hub hal");
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index c8a80c2..a5f1945 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -182,10 +182,8 @@
"com.google.android.clockwork.ThermalObserver";
private static final String WEAR_BLUETOOTH_SERVICE_CLASS =
"com.google.android.clockwork.bluetooth.WearBluetoothService";
- private static final String WEAR_WIFI_MEDIATOR_SERVICE_CLASS =
- "com.google.android.clockwork.wifi.WearWifiMediatorService";
- private static final String WEAR_CELLULAR_MEDIATOR_SERVICE_CLASS =
- "com.google.android.clockwork.cellular.WearCellularMediatorService";
+ private static final String WEAR_CONNECTIVITY_SERVICE_CLASS =
+ "com.google.android.clockwork.connectivity.WearConnectivityService";
private static final String WEAR_TIME_SERVICE_CLASS =
"com.google.android.clockwork.time.WearTimeService";
private static final String ACCOUNT_SERVICE_CLASS =
@@ -376,6 +374,7 @@
startBootstrapServices();
startCoreServices();
startOtherServices();
+ SystemServerInitThreadPool.shutdown();
} catch (Throwable ex) {
Slog.e("System", "******************************************");
Slog.e("System", "************ Failure starting system services", ex);
@@ -383,7 +382,6 @@
} finally {
traceEnd();
}
- SystemServerInitThreadPool.shutdown();
// For debug builds, log event loop stalls to dropbox for analysis.
if (StrictMode.conditionallyEnableDebugLogging()) {
@@ -1459,16 +1457,10 @@
mSystemServiceManager.startService(WEAR_BLUETOOTH_SERVICE_CLASS);
traceEnd();
- traceBeginAndSlog("StartWearWifiMediator");
- mSystemServiceManager.startService(WEAR_WIFI_MEDIATOR_SERVICE_CLASS);
+ traceBeginAndSlog("StartWearConnectivityService");
+ mSystemServiceManager.startService(WEAR_CONNECTIVITY_SERVICE_CLASS);
traceEnd();
- if (SystemProperties.getBoolean("config.enable_cellmediator", false)) {
- traceBeginAndSlog("StartWearCellularMediator");
- mSystemServiceManager.startService(WEAR_CELLULAR_MEDIATOR_SERVICE_CLASS);
- traceEnd();
- }
-
if (!disableNonCoreServices) {
traceBeginAndSlog("StartWearTimeService");
mSystemServiceManager.startService(WEAR_TIME_SERVICE_CLASS);
@@ -1694,6 +1686,9 @@
Watchdog.getInstance().start();
traceEnd();
+ // Wait for all packages to be prepared
+ mPackageManagerService.waitForAppDataPrepared();
+
// It is now okay to let the various system services start their
// third party code...
traceBeginAndSlog("PhaseThirdPartyAppsCanStart");
diff --git a/services/tests/notification/src/com/android/server/notification/RankingHelperTest.java b/services/tests/notification/src/com/android/server/notification/RankingHelperTest.java
index 9ea9ce9..8210072 100644
--- a/services/tests/notification/src/com/android/server/notification/RankingHelperTest.java
+++ b/services/tests/notification/src/com/android/server/notification/RankingHelperTest.java
@@ -776,6 +776,26 @@
}
@Test
+ public void testCreateChannel_addMissingSound() throws Exception {
+ final NotificationChannel channel =
+ new NotificationChannel("id2", "name2", IMPORTANCE_LOW);
+ mHelper.createNotificationChannel(pkg, uid, channel, true);
+ assertNotNull(mHelper.getNotificationChannel(
+ pkg, uid, channel.getId(), false).getSound());
+ }
+
+ @Test
+ public void testCreateChannel_noOverrideSound() throws Exception {
+ Uri sound = new Uri.Builder().scheme("test").build();
+ final NotificationChannel channel = new NotificationChannel("id2", "name2",
+ NotificationManager.IMPORTANCE_DEFAULT);
+ channel.setSound(sound, mAudioAttributes);
+ mHelper.createNotificationChannel(pkg, uid, channel, true);
+ assertEquals(sound, mHelper.getNotificationChannel(
+ pkg, uid, channel.getId(), false).getSound());
+ }
+
+ @Test
public void testPermanentlyDeleteChannels() throws Exception {
NotificationChannel channel1 =
new NotificationChannel("id1", "name1", NotificationManager.IMPORTANCE_HIGH);
diff --git a/services/tests/servicestests/src/com/android/server/NetworkScoreServiceTest.java b/services/tests/servicestests/src/com/android/server/NetworkScoreServiceTest.java
index c0b79be..665f01f 100644
--- a/services/tests/servicestests/src/com/android/server/NetworkScoreServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/NetworkScoreServiceTest.java
@@ -120,14 +120,16 @@
private static final String INVALID_BSSID = "invalid_bssid";
private static final ComponentName RECOMMENDATION_SERVICE_COMP =
new ComponentName("newPackageName", "newScoringServiceClass");
+ private static final ComponentName USE_WIFI_ENABLE_ACTIVITY_COMP =
+ new ComponentName("useWifiPackageName", "enableUseWifiActivityClass");
private static final ScoredNetwork SCORED_NETWORK =
new ScoredNetwork(new NetworkKey(new WifiKey(quote(SSID), "00:00:00:00:00:00")),
null /* rssiCurve*/);
private static final ScoredNetwork SCORED_NETWORK_2 =
new ScoredNetwork(new NetworkKey(new WifiKey(quote(SSID_2), "00:00:00:00:00:00")),
null /* rssiCurve*/);
- private static final NetworkScorerAppData NEW_SCORER =
- new NetworkScorerAppData(1, RECOMMENDATION_SERVICE_COMP);
+ private static final NetworkScorerAppData NEW_SCORER = new NetworkScorerAppData(
+ 1, RECOMMENDATION_SERVICE_COMP, USE_WIFI_ENABLE_ACTIVITY_COMP);
@Mock private NetworkScorerAppManager mNetworkScorerAppManager;
@Mock private Context mContext;
@@ -661,6 +663,8 @@
assertEquals(NEW_SCORER.getRecommendationServicePackageName(),
mNetworkScoreService.getActiveScorerPackage());
+ assertEquals(NEW_SCORER.getEnableUseOpenWifiActivity(),
+ mNetworkScoreService.getActiveScorer().getEnableUseOpenWifiActivity());
}
@Test
@@ -920,8 +924,8 @@
throws Exception {
when(mContext.checkCallingOrSelfPermission(permission.REQUEST_NETWORK_SCORES))
.thenReturn(PackageManager.PERMISSION_GRANTED);
- NetworkScorerAppData expectedAppData =
- new NetworkScorerAppData(Binder.getCallingUid(), RECOMMENDATION_SERVICE_COMP);
+ NetworkScorerAppData expectedAppData = new NetworkScorerAppData(Binder.getCallingUid(),
+ RECOMMENDATION_SERVICE_COMP, USE_WIFI_ENABLE_ACTIVITY_COMP);
bindToScorer(expectedAppData);
assertEquals(expectedAppData, mNetworkScoreService.getActiveScorer());
}
@@ -961,8 +965,8 @@
private void bindToScorer(boolean callerIsScorer) {
final int callingUid = callerIsScorer ? Binder.getCallingUid() : Binder.getCallingUid() + 1;
- NetworkScorerAppData appData =
- new NetworkScorerAppData(callingUid, RECOMMENDATION_SERVICE_COMP);
+ NetworkScorerAppData appData = new NetworkScorerAppData(callingUid,
+ RECOMMENDATION_SERVICE_COMP, USE_WIFI_ENABLE_ACTIVITY_COMP);
bindToScorer(appData);
}
diff --git a/services/usage/java/com/android/server/usage/StorageStatsService.java b/services/usage/java/com/android/server/usage/StorageStatsService.java
index 632c045..ed1530a 100644
--- a/services/usage/java/com/android/server/usage/StorageStatsService.java
+++ b/services/usage/java/com/android/server/usage/StorageStatsService.java
@@ -30,6 +30,7 @@
import android.content.pm.UserInfo;
import android.os.Binder;
import android.os.Environment;
+import android.os.FileUtils;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
@@ -148,11 +149,10 @@
enforcePermission(Binder.getCallingUid(), callingPackage);
if (volumeUuid == StorageManager.UUID_PRIVATE_INTERNAL) {
- // TODO: round total size to nearest power of two
- return mStorage.getPrimaryStorageSize();
+ return FileUtils.roundStorageSize(mStorage.getPrimaryStorageSize());
} else {
final VolumeInfo vol = mStorage.findVolumeByUuid(volumeUuid);
- return vol.disk.size;
+ return FileUtils.roundStorageSize(vol.disk.size);
}
}
@@ -175,6 +175,43 @@
}
@Override
+ public StorageStats queryStatsForPackage(String volumeUuid, String packageName, int userId,
+ String callingPackage) {
+ enforcePermission(Binder.getCallingUid(), callingPackage);
+ if (userId != UserHandle.getCallingUserId()) {
+ mContext.enforceCallingOrSelfPermission(
+ android.Manifest.permission.INTERACT_ACROSS_USERS, TAG);
+ }
+
+ final ApplicationInfo appInfo;
+ try {
+ appInfo = mPackage.getApplicationInfoAsUser(packageName, 0, userId);
+ } catch (NameNotFoundException e) {
+ throw new IllegalStateException(e);
+ }
+
+ if (mPackage.getPackagesForUid(appInfo.uid).length == 1) {
+ // Only one package inside UID means we can fast-path
+ return queryStatsForUid(volumeUuid, appInfo.uid, callingPackage);
+ } else {
+ // Multiple packages means we need to go manual
+ final int appId = UserHandle.getUserId(appInfo.uid);
+ final String[] packageNames = new String[] { packageName };
+ final long[] ceDataInodes = new long[1];
+ final String[] codePaths = new String[] { appInfo.getCodePath() };
+
+ final PackageStats stats = new PackageStats(TAG);
+ try {
+ mInstaller.getAppSize(volumeUuid, packageNames, userId, 0,
+ appId, ceDataInodes, codePaths, stats);
+ } catch (InstallerException e) {
+ throw new IllegalStateException(e);
+ }
+ return translate(stats);
+ }
+ }
+
+ @Override
public StorageStats queryStatsForUid(String volumeUuid, int uid, String callingPackage) {
enforcePermission(Binder.getCallingUid(), callingPackage);
if (UserHandle.getUserId(uid) != UserHandle.getCallingUserId()) {
diff --git a/telephony/java/com/android/internal/telephony/TelephonyIntents.java b/telephony/java/com/android/internal/telephony/TelephonyIntents.java
index 7fd511f..d40835b 100644
--- a/telephony/java/com/android/internal/telephony/TelephonyIntents.java
+++ b/telephony/java/com/android/internal/telephony/TelephonyIntents.java
@@ -411,7 +411,7 @@
* <p class="note">This is a protected intent that can only be sent by the system.</p>
*/
public static final String ACTION_CARRIER_SIGNAL_REDIRECTED =
- "android.intent.action.CARRIER_SIGNAL_REDIRECTED";
+ "com.android.internal.telephony.CARRIER_SIGNAL_REDIRECTED";
/**
* <p>Broadcast Action: when data connections setup fails.
* intended for sim/account status checks and only sent to the specified carrier app
@@ -424,7 +424,7 @@
* <p class="note">This is a protected intent that can only be sent by the system. </p>
*/
public static final String ACTION_CARRIER_SIGNAL_REQUEST_NETWORK_FAILED =
- "android.intent.action.CARRIER_SIGNAL_REQUEST_NETWORK_FAILED";
+ "com.android.internal.telephony.CARRIER_SIGNAL_REQUEST_NETWORK_FAILED";
/**
* <p>Broadcast Action: when pco value is available.
@@ -441,7 +441,7 @@
* <p class="note">This is a protected intent that can only be sent by the system. </p>
*/
public static final String ACTION_CARRIER_SIGNAL_PCO_VALUE =
- "android.intent.action.CARRIER_SIGNAL_PCO_VALUE";
+ "com.android.internal.telephony.CARRIER_SIGNAL_PCO_VALUE";
// CARRIER_SIGNAL_ACTION extra keys
public static final String EXTRA_REDIRECTION_URL_KEY = "redirectionUrl";
diff --git a/test-runner/src/android/test/suitebuilder/TestMethod.java b/test-runner/src/android/test/suitebuilder/TestMethod.java
index 08568d5..ae1db5e 100644
--- a/test-runner/src/android/test/suitebuilder/TestMethod.java
+++ b/test-runner/src/android/test/suitebuilder/TestMethod.java
@@ -26,7 +26,11 @@
/**
* Represents a test to be run. Can be constructed without instantiating the TestCase or even
* loading the class.
+ *
+ * @deprecated New tests should be written using the
+ * <a href="{@docRoot}tools/testing-support-library/index.html">Android Testing Support Library</a>.
*/
+@Deprecated
public class TestMethod {
private final String enclosingClassname;
diff --git a/test-runner/src/android/test/suitebuilder/TestSuiteBuilder.java b/test-runner/src/android/test/suitebuilder/TestSuiteBuilder.java
index 8c89489..3b920cf 100644
--- a/test-runner/src/android/test/suitebuilder/TestSuiteBuilder.java
+++ b/test-runner/src/android/test/suitebuilder/TestSuiteBuilder.java
@@ -38,7 +38,11 @@
/**
* Build suites based on a combination of included packages, excluded packages,
* and predicates that must be satisfied.
+ *
+ * @deprecated New tests should be written using the
+ * <a href="{@docRoot}tools/testing-support-library/index.html">Android Testing Support Library</a>.
*/
+@Deprecated
public class TestSuiteBuilder {
private Context context;
@@ -223,7 +227,11 @@
/**
* A special {@link junit.framework.TestCase} used to indicate a failure during the build()
* step.
+ *
+ * @deprecated New tests should be written using the
+ * <a href="{@docRoot}tools/testing-support-library/index.html">Android Testing Support Library</a>.
*/
+ @Deprecated
public static class FailedToCreateTests extends TestCase {
private final Exception exception;
diff --git a/tests/net/java/com/android/server/connectivity/MetricsTestUtil.java b/tests/net/java/com/android/server/connectivity/MetricsTestUtil.java
index e201012..c5965e8 100644
--- a/tests/net/java/com/android/server/connectivity/MetricsTestUtil.java
+++ b/tests/net/java/com/android/server/connectivity/MetricsTestUtil.java
@@ -17,101 +17,59 @@
package com.android.server.connectivity;
import android.net.ConnectivityMetricsEvent;
-import android.net.ConnectivityMetricsLogger;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
+import java.util.function.Consumer;
+
abstract public class MetricsTestUtil {
private MetricsTestUtil() {
}
- static ConnectivityMetricsEvent ipEv(Parcelable p) {
- return ev(ConnectivityMetricsLogger.COMPONENT_TAG_CONNECTIVITY, p);
+ static ConnectivityMetricsEvent ev(Parcelable p) {
+ return new ConnectivityMetricsEvent(1L, 0, 0, p);
}
- static ConnectivityMetricsEvent telephonyEv() {
- return ev(ConnectivityMetricsLogger.COMPONENT_TAG_TELEPHONY, new Bundle());
- }
-
- static ConnectivityMetricsEvent ev(int tag, Parcelable p) {
- return new ConnectivityMetricsEvent(1L, tag, 0, p);
- }
-
- // Utiliy interface for describing the content of a Parcel. This relies on
- // the implementation defails of Parcelable and on the fact that the fully
- // qualified Parcelable class names are written as string in the Parcels.
- interface ParcelField {
- void write(Parcel p);
- }
-
- static ConnectivityMetricsEvent describeIpEvent(ParcelField... fs) {
+ static ConnectivityMetricsEvent describeIpEvent(Consumer<Parcel>... fs) {
Parcel p = Parcel.obtain();
- for (ParcelField f : fs) {
- f.write(p);
+ for (Consumer<Parcel> f : fs) {
+ f.accept(p);
}
p.setDataPosition(0);
- return ipEv(p.readParcelable(ClassLoader.getSystemClassLoader()));
+ return ev(p.readParcelable(ClassLoader.getSystemClassLoader()));
}
- static ParcelField aType(Class<?> c) {
- return new ParcelField() {
- public void write(Parcel p) {
- p.writeString(c.getName());
- }
- };
+ static Consumer<Parcel> aType(Class<?> c) {
+ return aString(c.getName());
}
- static ParcelField aBool(boolean b) {
+ static Consumer<Parcel> aBool(boolean b) {
return aByte((byte) (b ? 1 : 0));
}
- static ParcelField aByte(byte b) {
- return new ParcelField() {
- public void write(Parcel p) {
- p.writeByte(b);
- }
- };
+ static Consumer<Parcel> aByte(byte b) {
+ return (p) -> p.writeByte(b);
}
- static ParcelField anInt(int i) {
- return new ParcelField() {
- public void write(Parcel p) {
- p.writeInt(i);
- }
- };
+ static Consumer<Parcel> anInt(int i) {
+ return (p) -> p.writeInt(i);
}
- static ParcelField aLong(long l) {
- return new ParcelField() {
- public void write(Parcel p) {
- p.writeLong(l);
- }
- };
+ static Consumer<Parcel> aLong(long l) {
+ return (p) -> p.writeLong(l);
}
- static ParcelField aString(String s) {
- return new ParcelField() {
- public void write(Parcel p) {
- p.writeString(s);
- }
- };
+ static Consumer<Parcel> aString(String s) {
+ return (p) -> p.writeString(s);
}
- static ParcelField aByteArray(byte... ary) {
- return new ParcelField() {
- public void write(Parcel p) {
- p.writeByteArray(ary);
- }
- };
+ static Consumer<Parcel> aByteArray(byte... ary) {
+ return (p) -> p.writeByteArray(ary);
}
- static ParcelField anIntArray(int... ary) {
- return new ParcelField() {
- public void write(Parcel p) {
- p.writeIntArray(ary);
- }
- };
+ static Consumer<Parcel> anIntArray(int... ary) {
+ return (p) -> p.writeIntArray(ary);
}
static byte b(int i) {