diff options
124 files changed, 1954 insertions, 865 deletions
diff --git a/Android.bp b/Android.bp index 17e31e04506f..b01c3c7c920d 100644 --- a/Android.bp +++ b/Android.bp @@ -507,7 +507,7 @@ java_defaults { "telephony/java/android/telephony/ims/aidl/IImsServiceController.aidl", "telephony/java/android/telephony/ims/aidl/IImsServiceControllerListener.aidl", "telephony/java/android/telephony/ims/aidl/IImsSmsListener.aidl", - "telephony/java/android/telephony/ims/aidl/IRcs.aidl", + "telephony/java/android/telephony/ims/aidl/IRcsMessage.aidl", "telephony/java/android/telephony/mbms/IMbmsDownloadSessionCallback.aidl", "telephony/java/android/telephony/mbms/IMbmsStreamingSessionCallback.aidl", "telephony/java/android/telephony/mbms/IMbmsGroupCallSessionCallback.aidl", @@ -1275,7 +1275,6 @@ stubs_defaults { libs: [ "ext", "framework", - "voip-common", ], local_sourcepaths: frameworks_base_subdirs, installable: false, diff --git a/api/current.txt b/api/current.txt index 015874d6e30c..09f4355fae56 100755 --- a/api/current.txt +++ b/api/current.txt @@ -37412,7 +37412,7 @@ package android.provider { field public static final String CONTENT_ID = "cid"; field public static final String CONTENT_LOCATION = "cl"; field public static final String CONTENT_TYPE = "ct"; - field public static final android.net.Uri CONTENT_URI; + field @NonNull public static final android.net.Uri CONTENT_URI; field public static final String CT_START = "ctt_s"; field public static final String CT_TYPE = "ctt_t"; field public static final String FILENAME = "fn"; diff --git a/api/system-current.txt b/api/system-current.txt index 7f29b1d05fc4..593b45db5809 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -4270,6 +4270,7 @@ package android.os { public class UpdateEngine { ctor public UpdateEngine(); method public void applyPayload(String, long, long, String[]); + method public void applyPayload(java.io.FileDescriptor, long, long, String[]); method public boolean bind(android.os.UpdateEngineCallback, android.os.Handler); method public boolean bind(android.os.UpdateEngineCallback); method public void cancel(); diff --git a/cmds/bootanimation/Android.bp b/cmds/bootanimation/Android.bp index 60a1cfbe9dd7..e17f735b93a4 100644 --- a/cmds/bootanimation/Android.bp +++ b/cmds/bootanimation/Android.bp @@ -76,7 +76,6 @@ cc_library_shared { "libEGL", "libGLESv1_CM", "libgui", - "libtinyalsa", ], product_variables: { diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto index 1254f1a3afa0..f9b6219747f7 100644 --- a/cmds/statsd/src/atoms.proto +++ b/cmds/statsd/src/atoms.proto @@ -2871,6 +2871,9 @@ message NetworkDnsEventReported { // Additional pass-through fields opaque to statsd. // The DNS resolver Mainline module can add new fields here without requiring an OS update. optional android.stats.dnsresolver.DnsQueryEvents dns_query_events = 8 [(log_mode) = MODE_BYTES]; + + // The sample rate of DNS stats (to statsd) is 1/sampling_rate_denom. + optional int32 sampling_rate_denom = 9; } /** diff --git a/config/hiddenapi-greylist-max-p.txt b/config/hiddenapi-greylist-max-p.txt index f201063ef12e..a32fbec768e3 100644 --- a/config/hiddenapi-greylist-max-p.txt +++ b/config/hiddenapi-greylist-max-p.txt @@ -68,6 +68,8 @@ Lcom/android/internal/R$styleable;->MenuView:[I Lcom/android/internal/R$styleable;->Searchable:[I Lcom/android/internal/R$styleable;->SearchableActionKey:[I Lcom/android/internal/telephony/IPhoneSubInfo$Stub;-><init>()V +Lcom/android/internal/telephony/ITelephony;->getDataActivity()I +Lcom/android/internal/telephony/ITelephony;->getDataState()I Lcom/android/internal/telephony/ITelephonyRegistry;->notifyCallForwardingChanged(Z)V Lcom/android/internal/telephony/ITelephonyRegistry;->notifyCellLocation(Landroid/os/Bundle;)V Lcom/android/internal/telephony/ITelephonyRegistry;->notifyDataActivity(I)V diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index d9c82ea31537..6c67191eb3eb 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -703,6 +703,8 @@ public final class ActivityThread extends ClientTransactionHandler { boolean autofillCompatibilityEnabled; + long[] disabledCompatChanges; + public String toString() { return "AppBindData{appInfo=" + appInfo + "}"; } @@ -920,7 +922,8 @@ public final class ActivityThread extends ClientTransactionHandler { boolean enableBinderTracking, boolean trackAllocation, boolean isRestrictedBackupMode, boolean persistent, Configuration config, CompatibilityInfo compatInfo, Map services, Bundle coreSettings, - String buildSerial, boolean autofillCompatibilityEnabled) { + String buildSerial, boolean autofillCompatibilityEnabled, + long[] disabledCompatChanges) { if (services != null) { if (false) { @@ -968,6 +971,7 @@ public final class ActivityThread extends ClientTransactionHandler { data.initProfilerInfo = profilerInfo; data.buildSerial = buildSerial; data.autofillCompatibilityEnabled = autofillCompatibilityEnabled; + data.disabledCompatChanges = disabledCompatChanges; sendMessage(H.BIND_APPLICATION, data); } @@ -5670,6 +5674,7 @@ public final class ActivityThread extends ClientTransactionHandler { // Note when this process has started. Process.setStartTimes(SystemClock.elapsedRealtime(), SystemClock.uptimeMillis()); + AppCompatCallbacks.install(data.disabledCompatChanges); mBoundApplication = data; mConfiguration = new Configuration(data.config); mCompatConfiguration = new Configuration(data.config); diff --git a/core/java/android/app/AppCompatCallbacks.java b/core/java/android/app/AppCompatCallbacks.java new file mode 100644 index 000000000000..17697dba9ccd --- /dev/null +++ b/core/java/android/app/AppCompatCallbacks.java @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2019 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.app; + +import android.compat.Compatibility; +import android.os.Process; +import android.util.Log; + +import java.util.Arrays; + +/** + * App process implementation of the {@link Compatibility} API. + * + * @hide + */ +public final class AppCompatCallbacks extends Compatibility.Callbacks { + + private static final String TAG = "Compatibility"; + + private final long[] mDisabledChanges; + + /** + * Install this class into the current process. + * + * @param disabledChanges Set of compatibility changes that are disabled for this process. + */ + public static void install(long[] disabledChanges) { + Compatibility.setCallbacks(new AppCompatCallbacks(disabledChanges)); + } + + private AppCompatCallbacks(long[] disabledChanges) { + mDisabledChanges = Arrays.copyOf(disabledChanges, disabledChanges.length); + Arrays.sort(mDisabledChanges); + } + + protected void reportChange(long changeId) { + Log.d(TAG, "Compat change reported: " + changeId + "; UID " + Process.myUid()); + // TODO log via StatsLog + } + + protected boolean isChangeEnabled(long changeId) { + if (Arrays.binarySearch(mDisabledChanges, changeId) < 0) { + // Not present in the disabled array + reportChange(changeId); + return true; + } + return false; + } + +} diff --git a/core/java/android/app/IApplicationThread.aidl b/core/java/android/app/IApplicationThread.aidl index d478cd6e5946..1f45fc5b8752 100644 --- a/core/java/android/app/IApplicationThread.aidl +++ b/core/java/android/app/IApplicationThread.aidl @@ -67,7 +67,8 @@ oneway interface IApplicationThread { int debugMode, boolean enableBinderTracking, boolean trackAllocation, boolean restrictedBackupMode, boolean persistent, in Configuration config, in CompatibilityInfo compatInfo, in Map services, - in Bundle coreSettings, in String buildSerial, boolean isAutofillCompatEnabled); + in Bundle coreSettings, in String buildSerial, boolean isAutofillCompatEnabled, + in long[] disabledCompatChanges); void runIsolatedEntryPoint(in String entryPoint, in String[] entryPointArgs); void scheduleExit(); void scheduleServiceArgs(IBinder token, in ParceledListSlice args); diff --git a/core/java/android/app/SystemServiceRegistry.java b/core/java/android/app/SystemServiceRegistry.java index f6b7eefc7864..94aa4811b846 100644 --- a/core/java/android/app/SystemServiceRegistry.java +++ b/core/java/android/app/SystemServiceRegistry.java @@ -149,7 +149,8 @@ import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.telephony.euicc.EuiccCardManager; import android.telephony.euicc.EuiccManager; -import android.telephony.ims.RcsManager; +import android.telephony.ims.RcsMessageManager; +import android.util.ArrayMap; import android.util.Log; import android.view.ContextThemeWrapper; import android.view.LayoutInflater; @@ -171,7 +172,7 @@ import com.android.internal.net.INetworkWatchlistManager; import com.android.internal.os.IDropBoxManagerService; import com.android.internal.policy.PhoneLayoutInflater; -import java.util.HashMap; +import java.util.Map; /** * Manages all of the system services that can be returned by {@link Context#getSystemService}. @@ -182,10 +183,10 @@ final class SystemServiceRegistry { // Service registry information. // This information is never changed once static initialization has completed. - private static final HashMap<Class<?>, String> SYSTEM_SERVICE_NAMES = - new HashMap<Class<?>, String>(); - private static final HashMap<String, ServiceFetcher<?>> SYSTEM_SERVICE_FETCHERS = - new HashMap<String, ServiceFetcher<?>>(); + private static final Map<Class<?>, String> SYSTEM_SERVICE_NAMES = + new ArrayMap<Class<?>, String>(); + private static final Map<String, ServiceFetcher<?>> SYSTEM_SERVICE_FETCHERS = + new ArrayMap<String, ServiceFetcher<?>>(); private static int sServiceCacheSize; // Not instantiable. @@ -551,11 +552,11 @@ final class SystemServiceRegistry { return new SubscriptionManager(ctx.getOuterContext()); }}); - registerService(Context.TELEPHONY_RCS_SERVICE, RcsManager.class, - new CachedServiceFetcher<RcsManager>() { + registerService(Context.TELEPHONY_RCS_MESSAGE_SERVICE, RcsMessageManager.class, + new CachedServiceFetcher<RcsMessageManager>() { @Override - public RcsManager createService(ContextImpl ctx) { - return new RcsManager(ctx.getOuterContext()); + public RcsMessageManager createService(ContextImpl ctx) { + return new RcsMessageManager(ctx.getOuterContext()); } }); diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java index 9223f71b4428..99ff53dcb904 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -2948,7 +2948,7 @@ public abstract class Context { * @hide */ @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS) - @UnsupportedAppUsage + @UnsupportedAppUsage(trackingBug = 136728678) public boolean bindServiceAsUser(Intent service, ServiceConnection conn, int flags, Handler handler, UserHandle user) { throw new RuntimeException("Not implemented. Must override in a subclass."); @@ -4290,10 +4290,10 @@ public abstract class Context { /** * Use with {@link #getSystemService(String)} to retrieve an - * {@link android.telephony.ims.RcsManager}. + * {@link android.telephony.ims.RcsMessageManager}. * @hide */ - public static final String TELEPHONY_RCS_SERVICE = "ircs"; + public static final String TELEPHONY_RCS_MESSAGE_SERVICE = "ircsmessage"; /** * Use with {@link #getSystemService(String)} to retrieve an diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index a9ba6ca1ea99..43cbfe97ea0a 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -52,6 +52,8 @@ import android.provider.DocumentsContract; import android.provider.DocumentsProvider; import android.provider.MediaStore; import android.provider.OpenableColumns; +import android.telecom.PhoneAccount; +import android.telecom.TelecomManager; import android.text.TextUtils; import android.util.ArraySet; import android.util.AttributeSet; @@ -1108,6 +1110,12 @@ public class Intent implements Parcelable, Cloneable { * <p>Input: {@link #getData} is URI of a phone number to be dialed or a * tel: URI of an explicit phone number. * <p>Output: nothing. + * + * <p class="note"><strong>Note:</strong> It is not guaranteed that the call will be placed on + * the {@link PhoneAccount} provided in the {@link TelecomManager#EXTRA_PHONE_ACCOUNT_HANDLE} + * extra (if specified) and may be placed on another {@link PhoneAccount} with the + * {@link PhoneAccount#CAPABILITY_PLACE_EMERGENCY_CALLS} capability, depending on external + * factors, such as network conditions and Modem/SIM status. * @hide */ @SystemApi diff --git a/core/java/android/content/pm/PackageInfo.java b/core/java/android/content/pm/PackageInfo.java index cd8dc6338612..965b064293ff 100644 --- a/core/java/android/content/pm/PackageInfo.java +++ b/core/java/android/content/pm/PackageInfo.java @@ -556,7 +556,7 @@ public class PackageInfo implements Parcelable { * @hide */ public PackageInfo(ApexInfo apexInfo) { - packageName = apexInfo.packageName; + packageName = apexInfo.moduleName; setLongVersionCode(apexInfo.versionCode); isApex = true; } diff --git a/core/java/android/content/res/CompatibilityInfo.java b/core/java/android/content/res/CompatibilityInfo.java index 7d101b8f78e5..888380b41e58 100644 --- a/core/java/android/content/res/CompatibilityInfo.java +++ b/core/java/android/content/res/CompatibilityInfo.java @@ -32,8 +32,8 @@ import android.view.WindowManager; import android.view.WindowManager.LayoutParams; /** - * CompatibilityInfo class keeps the information about compatibility mode that the application is - * running under. + * CompatibilityInfo class keeps the information about the screen compatibility mode that the + * application is running under. * * {@hide} */ diff --git a/core/java/android/hardware/Camera.java b/core/java/android/hardware/Camera.java index 81abdea0d23f..10fe52a71d9d 100644 --- a/core/java/android/hardware/Camera.java +++ b/core/java/android/hardware/Camera.java @@ -812,7 +812,10 @@ public class Camera { * * @throws RuntimeException if starting preview fails; usually this would be * because of a hardware or other low-level error, or because release() - * has been called on this Camera instance. + * has been called on this Camera instance. The QCIF (176x144) exception + * mentioned in {@link Parameters#setPreviewSize setPreviewSize} and + * {@link Parameters#setPictureSize setPictureSize} can also cause this + * exception be thrown. */ public native final void startPreview(); @@ -2863,6 +2866,16 @@ public class Camera { * orientation should also be considered while setting picture size and * thumbnail size. * + * Exception on 176x144 (QCIF) resolution: + * Camera devices usually have a fixed capability for downscaling from + * larger resolution to smaller, and the QCIF resolution sometimes + * is not fully supported due to this limitation on devices with + * high-resolution image sensors. Therefore, trying to configure a QCIF + * preview size with any picture or video size larger than 1920x1080 + * (either width or height) might not be supported, and + * {@link #setParameters(Camera.Parameters)} might throw a + * RuntimeException if it is not. + * * @param width the width of the pictures, in pixels * @param height the height of the pictures, in pixels * @see #setDisplayOrientation(int) @@ -2908,6 +2921,16 @@ public class Camera { * preview can be different from the resolution of the recorded video * during video recording.</p> * + * <p>Exception on 176x144 (QCIF) resolution: + * Camera devices usually have a fixed capability for downscaling from + * larger resolution to smaller, and the QCIF resolution sometimes + * is not fully supported due to this limitation on devices with + * high-resolution image sensors. Therefore, trying to configure a QCIF + * video resolution with any preview or picture size larger than + * 1920x1080 (either width or height) might not be supported, and + * {@link #setParameters(Camera.Parameters)} will throw a + * RuntimeException if it is not.</p> + * * @return a list of Size object if camera has separate preview and * video output; otherwise, null is returned. * @see #getPreferredPreviewSizeForVideo() @@ -3202,6 +3225,16 @@ public class Camera { * <p>Applications need to consider the display orientation. See {@link * #setPreviewSize(int,int)} for reference.</p> * + * <p>Exception on 176x144 (QCIF) resolution: + * Camera devices usually have a fixed capability for downscaling from + * larger resolution to smaller, and the QCIF resolution sometimes + * is not fully supported due to this limitation on devices with + * high-resolution image sensors. Therefore, trying to configure a QCIF + * picture size with any preview or video size larger than 1920x1080 + * (either width or height) might not be supported, and + * {@link #setParameters(Camera.Parameters)} might throw a + * RuntimeException if it is not.</p> + * * @param width the width for pictures, in pixels * @param height the height for pictures, in pixels * @see #setPreviewSize(int,int) diff --git a/core/java/android/hardware/camera2/CameraCharacteristics.java b/core/java/android/hardware/camera2/CameraCharacteristics.java index a787d77bc964..e5c5328a32fa 100644 --- a/core/java/android/hardware/camera2/CameraCharacteristics.java +++ b/core/java/android/hardware/camera2/CameraCharacteristics.java @@ -2136,6 +2136,12 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * </table> * <p>Refer to {@link CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES android.request.availableCapabilities} for additional * mandatory stream configurations on a per-capability basis.</p> + * <p>Exception on 176x144 (QCIF) resolution: camera devices usually have a fixed capability for + * downscaling from larger resolution to smaller, and the QCIF resolution sometimes is not + * fully supported due to this limitation on devices with high-resolution image sensors. + * Therefore, trying to configure a QCIF resolution stream together with any other + * stream larger than 1920x1080 resolution (either width or height) might not be supported, + * and capture session creation will fail if it is not.</p> * <p>This key is available on all devices.</p> * * @see CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL @@ -2331,6 +2337,12 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * ratio 4:3, and the JPEG encoder alignment requirement is 16, the maximum JPEG size will be * 3264x2448.</li> * </ul> + * <p>Exception on 176x144 (QCIF) resolution: camera devices usually have a fixed capability on + * downscaling from larger resolution to smaller ones, and the QCIF resolution can sometimes + * not be fully supported due to this limitation on devices with high-resolution image + * sensors. Therefore, trying to configure a QCIF resolution stream together with any other + * stream larger than 1920x1080 resolution (either width or height) might not be supported, + * and capture session creation will fail if it is not.</p> * <p>This key is available on all devices.</p> * * @see CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL @@ -3188,7 +3200,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * <li><code>LEVEL_3</code> devices additionally support YUV reprocessing and RAW image capture, along * with additional output stream configurations.</li> * <li><code>EXTERNAL</code> devices are similar to <code>LIMITED</code> devices with exceptions like some sensor or - * lens information not reorted or less stable framerates.</li> + * lens information not reported or less stable framerates.</li> * </ul> * <p>See the individual level enums for full descriptions of the supported capabilities. The * {@link CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES android.request.availableCapabilities} entry describes the device's capabilities at a diff --git a/core/java/android/hardware/camera2/CameraDevice.java b/core/java/android/hardware/camera2/CameraDevice.java index ce88697fa8db..04e9246b994e 100644 --- a/core/java/android/hardware/camera2/CameraDevice.java +++ b/core/java/android/hardware/camera2/CameraDevice.java @@ -433,6 +433,14 @@ public abstract class CameraDevice implements AutoCloseable { * target combinations with sizes outside of these guarantees, but this can only be tested for * by attempting to create a session with such targets.</p> * + * <p>Exception on 176x144 (QCIF) resolution: + * Camera devices usually have a fixed capability for downscaling from larger resolution to + * smaller, and the QCIF resolution sometimes is not fully supported due to this + * limitation on devices with high-resolution image sensors. Therefore, trying to configure a + * QCIF resolution stream together with any other stream larger than 1920x1080 resolution + * (either width or height) might not be supported, and capture session creation will fail if it + * is not.</p> + * * @param outputs The new set of Surfaces that should be made available as * targets for captured image data. * @param callback The callback to notify about the status of the new capture session. diff --git a/core/java/android/os/ServiceManager.java b/core/java/android/os/ServiceManager.java index b2ba92849133..9a9b0306063b 100644 --- a/core/java/android/os/ServiceManager.java +++ b/core/java/android/os/ServiceManager.java @@ -17,13 +17,13 @@ package android.os; import android.annotation.UnsupportedAppUsage; +import android.util.ArrayMap; import android.util.Log; import com.android.internal.annotations.GuardedBy; import com.android.internal.os.BinderInternal; import com.android.internal.util.StatLogger; -import java.util.HashMap; import java.util.Map; /** @hide */ @@ -38,7 +38,7 @@ public final class ServiceManager { * Cache for the "well known" services, such as WM and AM. */ @UnsupportedAppUsage - private static HashMap<String, IBinder> sCache = new HashMap<String, IBinder>(); + private static Map<String, IBinder> sCache = new ArrayMap<String, IBinder>(); /** * We do the "slow log" at most once every this interval. diff --git a/core/java/android/os/UpdateEngine.java b/core/java/android/os/UpdateEngine.java index 8f2826c16b63..69bdde35a967 100644 --- a/core/java/android/os/UpdateEngine.java +++ b/core/java/android/os/UpdateEngine.java @@ -21,6 +21,8 @@ import android.os.IUpdateEngine; import android.os.IUpdateEngineCallback; import android.os.RemoteException; +import java.io.FileDescriptor; + /** * UpdateEngine handles calls to the update engine which takes care of A/B OTA * updates. It wraps up the update engine Binder APIs and exposes them as @@ -187,6 +189,22 @@ public class UpdateEngine { } /** + * Applies the payload passed as file descriptor {@code fd} instead of + * using the {@code file://} scheme. + * + * <p>See {@link #applyPayload(String)} for {@code offset}, {@code size} and + * {@code headerKeyValuePairs} parameters. + */ + public void applyPayload(FileDescriptor fd, long offset, long size, + String[] headerKeyValuePairs) { + try { + mUpdateEngine.applyPayloadFd(fd, offset, size, headerKeyValuePairs); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** * Permanently cancels an in-progress update. * * <p>See {@link #resetStatus} to undo a finshed update (only available diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java index 66f16d57c828..1ef262923442 100644 --- a/core/java/android/view/SurfaceControl.java +++ b/core/java/android/view/SurfaceControl.java @@ -75,7 +75,8 @@ public class SurfaceControl implements Parcelable { boolean allLayers, boolean useIdentityTransform, int rotation); private static native GraphicBuffer nativeScreenshotToBuffer(IBinder displayToken, Rect sourceCrop, int width, int height, int minLayer, int maxLayer, - boolean allLayers, boolean useIdentityTransform, int rotation); + boolean allLayers, boolean useIdentityTransform, int rotation, + boolean captureSecureLayers); private static native void nativeScreenshot(IBinder displayToken, Surface consumer, Rect sourceCrop, int width, int height, int minLayer, int maxLayer, boolean allLayers, boolean useIdentityTransform); @@ -1299,7 +1300,28 @@ public class SurfaceControl implements Parcelable { IBinder displayToken = SurfaceControl.getBuiltInDisplay( SurfaceControl.BUILT_IN_DISPLAY_ID_MAIN); return nativeScreenshotToBuffer(displayToken, sourceCrop, width, height, - minLayer, maxLayer, false, useIdentityTransform, rotation); + minLayer, maxLayer, false, useIdentityTransform, rotation, + false /* captureSecureLayers */); + } + + /** + * Like screenshotToBuffer, but if the caller is AID_SYSTEM, allows + * for the capture of secure layers. This is used for the screen rotation + * animation where the system server takes screenshots but does + * not persist them or allow them to leave the server. However in other + * cases in the system server, we mostly want to omit secure layers + * like when we take a screenshot on behalf of the assistant. + * + * @hide + */ + public static GraphicBuffer screenshotToBufferWithSecureLayersUnsafe(Rect sourceCrop, + int width, int height, int minLayer, int maxLayer, boolean useIdentityTransform, + int rotation) { + IBinder displayToken = SurfaceControl.getBuiltInDisplay( + SurfaceControl.BUILT_IN_DISPLAY_ID_MAIN); + return nativeScreenshotToBuffer(displayToken, sourceCrop, width, height, + minLayer, maxLayer, false, useIdentityTransform, rotation, + true /* captureSecureLayers */); } /** diff --git a/core/java/android/webkit/WebViewClient.java b/core/java/android/webkit/WebViewClient.java index a29d44966540..26c21753a23f 100644 --- a/core/java/android/webkit/WebViewClient.java +++ b/core/java/android/webkit/WebViewClient.java @@ -102,9 +102,11 @@ public class WebViewClient { /** * Notify the host application that a page has finished loading. This method - * is called only for main frame. When onPageFinished() is called, the - * rendering picture may not be updated yet. To get the notification for the - * new Picture, use {@link WebView.PictureListener#onNewPicture}. + * is called only for main frame. Receiving an {@code onPageFinished()} callback does not + * guarantee that the next frame drawn by WebView will reflect the state of the DOM at this + * point. In order to be notified that the current DOM state is ready to be rendered, request a + * visual state callback with {@link WebView#postVisualStateCallback} and wait for the supplied + * callback to be triggered. * * @param view The WebView that is initiating the callback. * @param url The url of the page. diff --git a/core/java/android/widget/AnalogClock.java b/core/java/android/widget/AnalogClock.java index 795b03493efb..8716471561c1 100644 --- a/core/java/android/widget/AnalogClock.java +++ b/core/java/android/widget/AnalogClock.java @@ -26,12 +26,14 @@ import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.drawable.Drawable; import android.text.format.DateUtils; -import android.text.format.Time; import android.util.AttributeSet; import android.view.View; import android.widget.RemoteViews.RemoteView; -import java.util.TimeZone; +import java.time.Clock; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; /** * This widget display an analogic clock with two hands for hours and @@ -45,7 +47,7 @@ import java.util.TimeZone; @RemoteView @Deprecated public class AnalogClock extends View { - private Time mCalendar; + private Clock mClock; @UnsupportedAppUsage private Drawable mHourHand; @@ -97,7 +99,7 @@ public class AnalogClock extends View { mMinuteHand = context.getDrawable(com.android.internal.R.drawable.clock_hand_minute); } - mCalendar = new Time(); + mClock = Clock.systemDefaultZone(); mDialWidth = mDial.getIntrinsicWidth(); mDialHeight = mDial.getIntrinsicHeight(); @@ -130,7 +132,7 @@ public class AnalogClock extends View { // in the main thread, therefore the receiver can't run before this method returns. // The time zone may have changed while the receiver wasn't registered, so update the Time - mCalendar = new Time(); + mClock = Clock.systemDefaultZone(); // Make sure we update to the current time onTimeChanged(); @@ -239,17 +241,18 @@ public class AnalogClock extends View { } private void onTimeChanged() { - mCalendar.setToNow(); + long nowMillis = mClock.millis(); + LocalDateTime localDateTime = toLocalDateTime(nowMillis, mClock.getZone()); - int hour = mCalendar.hour; - int minute = mCalendar.minute; - int second = mCalendar.second; + int hour = localDateTime.getHour(); + int minute = localDateTime.getMinute(); + int second = localDateTime.getSecond(); mMinutes = minute + second / 60.0f; mHour = hour + mMinutes / 60.0f; mChanged = true; - updateContentDescription(mCalendar); + updateContentDescription(nowMillis); } private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver() { @@ -257,7 +260,7 @@ public class AnalogClock extends View { public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Intent.ACTION_TIMEZONE_CHANGED)) { String tz = intent.getStringExtra("time-zone"); - mCalendar = new Time(TimeZone.getTimeZone(tz).getID()); + mClock = Clock.system(ZoneId.of(tz)); } onTimeChanged(); @@ -266,10 +269,17 @@ public class AnalogClock extends View { } }; - private void updateContentDescription(Time time) { + private void updateContentDescription(long timeMillis) { final int flags = DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_24HOUR; - String contentDescription = DateUtils.formatDateTime(mContext, - time.toMillis(false), flags); + String contentDescription = DateUtils.formatDateTime(mContext, timeMillis, flags); setContentDescription(contentDescription); } + + private static LocalDateTime toLocalDateTime(long timeMillis, ZoneId zoneId) { + // java.time types like LocalDateTime / Instant can support the full range of "long millis" + // with room to spare so we do not need to worry about overflow / underflow and the + // resulting exceptions while the input to this class is a long. + Instant instant = Instant.ofEpochMilli(timeMillis); + return LocalDateTime.ofInstant(instant, zoneId); + } } diff --git a/core/java/android/widget/DateTimeView.java b/core/java/android/widget/DateTimeView.java index bf2762a6d727..fedd1d2b536d 100644 --- a/core/java/android/widget/DateTimeView.java +++ b/core/java/android/widget/DateTimeView.java @@ -20,7 +20,6 @@ import static android.text.format.DateUtils.DAY_IN_MILLIS; import static android.text.format.DateUtils.HOUR_IN_MILLIS; import static android.text.format.DateUtils.MINUTE_IN_MILLIS; import static android.text.format.DateUtils.YEAR_IN_MILLIS; -import static android.text.format.Time.getJulianDay; import android.annotation.UnsupportedAppUsage; import android.app.ActivityThread; @@ -32,7 +31,6 @@ import android.content.res.Configuration; import android.content.res.TypedArray; import android.database.ContentObserver; import android.os.Handler; -import android.text.format.Time; import android.util.AttributeSet; import android.view.accessibility.AccessibilityNodeInfo; import android.widget.RemoteViews.RemoteView; @@ -40,10 +38,14 @@ import android.widget.RemoteViews.RemoteView; import com.android.internal.R; import java.text.DateFormat; +import java.time.Instant; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.ZoneId; +import java.time.temporal.JulianFields; import java.util.ArrayList; -import java.util.Calendar; import java.util.Date; -import java.util.TimeZone; // // TODO @@ -62,8 +64,9 @@ public class DateTimeView extends TextView { private static final int SHOW_TIME = 0; private static final int SHOW_MONTH_DAY_YEAR = 1; - Date mTime; - long mTimeMillis; + private long mTimeMillis; + // The LocalDateTime equivalent of mTimeMillis but truncated to minute, i.e. no seconds / nanos. + private LocalDateTime mLocalTime; int mLastDisplay = -1; DateFormat mLastFormat; @@ -127,11 +130,10 @@ public class DateTimeView extends TextView { @android.view.RemotableViewMethod @UnsupportedAppUsage - public void setTime(long time) { - Time t = new Time(); - t.set(time); - mTimeMillis = t.toMillis(false); - mTime = new Date(t.year-1900, t.month, t.monthDay, t.hour, t.minute, 0); + public void setTime(long timeMillis) { + mTimeMillis = timeMillis; + LocalDateTime dateTime = toLocalDateTime(timeMillis, ZoneId.systemDefault()); + mLocalTime = dateTime.withSecond(0); update(); } @@ -154,7 +156,7 @@ public class DateTimeView extends TextView { @UnsupportedAppUsage void update() { - if (mTime == null || getVisibility() == GONE) { + if (mLocalTime == null || getVisibility() == GONE) { return; } if (mShowRelativeTime) { @@ -163,31 +165,27 @@ public class DateTimeView extends TextView { } int display; - Date time = mTime; - - Time t = new Time(); - t.set(mTimeMillis); - t.second = 0; - - t.hour -= 12; - long twelveHoursBefore = t.toMillis(false); - t.hour += 12; - long twelveHoursAfter = t.toMillis(false); - t.hour = 0; - t.minute = 0; - long midnightBefore = t.toMillis(false); - t.monthDay++; - long midnightAfter = t.toMillis(false); - - long nowMillis = System.currentTimeMillis(); - t.set(nowMillis); - t.second = 0; - nowMillis = t.normalize(false); + ZoneId zoneId = ZoneId.systemDefault(); + + // localTime is the local time for mTimeMillis but at zero seconds past the minute. + LocalDateTime localTime = mLocalTime; + LocalDateTime localStartOfDay = + LocalDateTime.of(localTime.toLocalDate(), LocalTime.MIDNIGHT); + LocalDateTime localTomorrowStartOfDay = localStartOfDay.plusDays(1); + // now is current local time but at zero seconds past the minute. + LocalDateTime localNow = LocalDateTime.now(zoneId).withSecond(0); + + long twelveHoursBefore = toEpochMillis(localTime.minusHours(12), zoneId); + long twelveHoursAfter = toEpochMillis(localTime.plusHours(12), zoneId); + long midnightBefore = toEpochMillis(localStartOfDay, zoneId); + long midnightAfter = toEpochMillis(localTomorrowStartOfDay, zoneId); + long time = toEpochMillis(localTime, zoneId); + long now = toEpochMillis(localNow, zoneId); // Choose the display mode choose_display: { - if ((nowMillis >= midnightBefore && nowMillis < midnightAfter) - || (nowMillis >= twelveHoursBefore && nowMillis < twelveHoursAfter)) { + if ((now >= midnightBefore && now < midnightAfter) + || (now >= twelveHoursBefore && now < twelveHoursAfter)) { display = SHOW_TIME; break choose_display; } @@ -216,7 +214,7 @@ public class DateTimeView extends TextView { } // Set the text - String text = format.format(mTime); + String text = format.format(new Date(time)); setText(text); // Schedule the next update @@ -225,7 +223,7 @@ public class DateTimeView extends TextView { mUpdateTimeMillis = twelveHoursAfter > midnightAfter ? twelveHoursAfter : midnightAfter; } else { // Currently showing the date - if (mTimeMillis < nowMillis) { + if (mTimeMillis < now) { // If the time is in the past, don't schedule an update mUpdateTimeMillis = 0; } else { @@ -266,15 +264,18 @@ public class DateTimeView extends TextView { millisIncrease = HOUR_IN_MILLIS; } else if (duration < YEAR_IN_MILLIS) { // In weird cases it can become 0 because of daylight savings - TimeZone timeZone = TimeZone.getDefault(); - count = Math.max(Math.abs(dayDistance(timeZone, mTimeMillis, now)), 1); + LocalDateTime localDateTime = mLocalTime; + ZoneId zoneId = ZoneId.systemDefault(); + LocalDateTime localNow = toLocalDateTime(now, zoneId); + + count = Math.max(Math.abs(dayDistance(localDateTime, localNow)), 1); result = String.format(getContext().getResources().getQuantityString(past ? com.android.internal.R.plurals.duration_days_shortest : com.android.internal.R.plurals.duration_days_shortest_future, count), count); if (past || count != 1) { - mUpdateTimeMillis = computeNextMidnight(timeZone); + mUpdateTimeMillis = computeNextMidnight(localNow, zoneId); millisIncrease = -1; } else { millisIncrease = DAY_IN_MILLIS; @@ -300,18 +301,13 @@ public class DateTimeView extends TextView { } /** - * @param timeZone the timezone we are in - * @return the timepoint in millis at UTC at midnight in the current timezone + * Returns the epoch millis for the next midnight in the specified timezone. */ - private long computeNextMidnight(TimeZone timeZone) { - Calendar c = Calendar.getInstance(); - c.setTimeZone(timeZone); - c.add(Calendar.DAY_OF_MONTH, 1); - c.set(Calendar.HOUR_OF_DAY, 0); - c.set(Calendar.MINUTE, 0); - c.set(Calendar.SECOND, 0); - c.set(Calendar.MILLISECOND, 0); - return c.getTimeInMillis(); + private static long computeNextMidnight(LocalDateTime time, ZoneId zoneId) { + // This ignores the chance of overflow: it should never happen. + LocalDate tomorrow = time.toLocalDate().plusDays(1); + LocalDateTime nextMidnight = LocalDateTime.of(tomorrow, LocalTime.MIDNIGHT); + return toEpochMillis(nextMidnight, zoneId); } @Override @@ -329,11 +325,10 @@ public class DateTimeView extends TextView { com.android.internal.R.string.now_string_shortest); } - // Return the date difference for the two times in a given timezone. - private static int dayDistance(TimeZone timeZone, long startTime, - long endTime) { - return getJulianDay(endTime, timeZone.getOffset(endTime) / 1000) - - getJulianDay(startTime, timeZone.getOffset(startTime) / 1000); + // Return the number of days between the two dates. + private static int dayDistance(LocalDateTime start, LocalDateTime end) { + return (int) (end.getLong(JulianFields.JULIAN_DAY) + - start.getLong(JulianFields.JULIAN_DAY)); } private DateFormat getTimeFormat() { @@ -378,8 +373,11 @@ public class DateTimeView extends TextView { count); } else if (duration < YEAR_IN_MILLIS) { // In weird cases it can become 0 because of daylight savings - TimeZone timeZone = TimeZone.getDefault(); - count = Math.max(Math.abs(dayDistance(timeZone, mTimeMillis, now)), 1); + LocalDateTime localDateTime = mLocalTime; + ZoneId zoneId = ZoneId.systemDefault(); + LocalDateTime localNow = toLocalDateTime(now, zoneId); + + count = Math.max(Math.abs(dayDistance(localDateTime, localNow)), 1); result = String.format(getContext().getResources().getQuantityString(past ? com.android.internal. R.plurals.duration_days_relative @@ -515,4 +513,17 @@ public class DateTimeView extends TextView { } } } + + private static LocalDateTime toLocalDateTime(long timeMillis, ZoneId zoneId) { + // java.time types like LocalDateTime / Instant can support the full range of "long millis" + // with room to spare so we do not need to worry about overflow / underflow and the rsulting + // exceptions while the input to this class is a long. + Instant instant = Instant.ofEpochMilli(timeMillis); + return LocalDateTime.ofInstant(instant, zoneId); + } + + private static long toEpochMillis(LocalDateTime time, ZoneId zoneId) { + Instant instant = time.toInstant(zoneId.getRules().getOffset(time)); + return instant.toEpochMilli(); + } } diff --git a/core/java/com/android/internal/os/Zygote.java b/core/java/com/android/internal/os/Zygote.java index 14b511df390b..cfe05c966a79 100644 --- a/core/java/com/android/internal/os/Zygote.java +++ b/core/java/com/android/internal/os/Zygote.java @@ -99,6 +99,14 @@ public final class Zygote { */ public static final int USE_APP_IMAGE_STARTUP_CACHE = 1 << 16; + /** + * When set, application specified signal handlers are not chained (i.e, ignored) + * by the runtime. + * + * Used for debugging only. Usage: set debug.ignoreappsignalhandler to 1. + */ + public static final int DEBUG_IGNORE_APP_SIGNAL_HANDLER = 1 << 17; + /** No external storage should be mounted. */ public static final int MOUNT_EXTERNAL_NONE = IVold.REMOUNT_MODE_NONE; /** Default external storage should be mounted. */ diff --git a/core/jni/android_os_HwBlob.cpp b/core/jni/android_os_HwBlob.cpp index cb55618c685c..e5b72caf2792 100644 --- a/core/jni/android_os_HwBlob.cpp +++ b/core/jni/android_os_HwBlob.cpp @@ -88,7 +88,7 @@ JHwBlob::JHwBlob(JNIEnv *env, jobject thiz, size_t size) mOwnsBuffer(true), mHandle(0) { if (size > 0) { - mBuffer = malloc(size); + mBuffer = calloc(size, 1); } } diff --git a/core/jni/android_util_Binder.cpp b/core/jni/android_util_Binder.cpp index 9556333dbf86..fc977f14e97a 100644 --- a/core/jni/android_util_Binder.cpp +++ b/core/jni/android_util_Binder.cpp @@ -99,7 +99,9 @@ static struct sparseintarray_offsets_t static struct error_offsets_t { - jclass mClass; + jclass mError; + jclass mOutOfMemory; + jclass mStackOverflow; } gErrorOffsets; // ---------------------------------------------------------------------------- @@ -208,6 +210,16 @@ static JNIEnv* javavm_to_jnienv(JavaVM* vm) return vm->GetEnv((void **)&env, JNI_VERSION_1_4) >= 0 ? env : NULL; } +static const char* GetErrorTypeName(JNIEnv* env, jthrowable error) { + if (env->IsInstanceOf(error, gErrorOffsets.mOutOfMemory)) { + return "OutOfMemoryError"; + } + if (env->IsInstanceOf(error, gErrorOffsets.mStackOverflow)) { + return "StackOverflowError"; + } + return nullptr; +} + // Report a java.lang.Error (or subclass). This will terminate the runtime by // calling FatalError with a message derived from the given error. static void report_java_lang_error_fatal_error(JNIEnv* env, jthrowable error, @@ -217,7 +229,7 @@ static void report_java_lang_error_fatal_error(JNIEnv* env, jthrowable error, // Try to get the exception string. Sometimes logcat isn't available, // so try to add it to the abort message. - std::string exc_msg = "(Unknown exception message)"; + std::string exc_msg; { ScopedLocalRef<jclass> exc_class(env, env->GetObjectClass(error)); jmethodID method_id = env->GetMethodID(exc_class.get(), "toString", @@ -226,15 +238,36 @@ static void report_java_lang_error_fatal_error(JNIEnv* env, jthrowable error, env, reinterpret_cast<jstring>( env->CallObjectMethod(error, method_id))); - env->ExceptionClear(); // Just for good measure. + ScopedLocalRef<jthrowable> new_error(env, nullptr); + bool got_jstr = false; + if (env->ExceptionCheck()) { + new_error = ScopedLocalRef<jthrowable>(env, env->ExceptionOccurred()); + env->ExceptionClear(); + } if (jstr.get() != nullptr) { ScopedUtfChars jstr_utf(env, jstr.get()); if (jstr_utf.c_str() != nullptr) { exc_msg = jstr_utf.c_str(); + got_jstr = true; } else { + new_error = ScopedLocalRef<jthrowable>(env, env->ExceptionOccurred()); env->ExceptionClear(); } } + if (!got_jstr) { + exc_msg = "(Unknown exception message)"; + const char* orig_type = GetErrorTypeName(env, error); + if (orig_type != nullptr) { + exc_msg = base::StringPrintf("%s (Error was %s)", exc_msg.c_str(), orig_type); + } + const char* new_type = + new_error == nullptr ? nullptr : GetErrorTypeName(env, new_error.get()); + if (new_type != nullptr) { + exc_msg = base::StringPrintf("%s (toString() error was %s)", + exc_msg.c_str(), + new_type); + } + } } env->Throw(error); @@ -292,7 +325,7 @@ static void report_exception(JNIEnv* env, jthrowable excep, const char* msg) ALOGE("%s", msg); } - if (env->IsInstanceOf(excep, gErrorOffsets.mClass)) { + if (env->IsInstanceOf(excep, gErrorOffsets.mError)) { report_java_lang_error(env, excep, msg); } } @@ -1417,10 +1450,13 @@ const char* const kBinderProxyPathName = "android/os/BinderProxy"; static int int_register_android_os_BinderProxy(JNIEnv* env) { - jclass clazz = FindClassOrDie(env, "java/lang/Error"); - gErrorOffsets.mClass = MakeGlobalRefOrDie(env, clazz); + gErrorOffsets.mError = MakeGlobalRefOrDie(env, FindClassOrDie(env, "java/lang/Error")); + gErrorOffsets.mOutOfMemory = + MakeGlobalRefOrDie(env, FindClassOrDie(env, "java/lang/OutOfMemoryError")); + gErrorOffsets.mStackOverflow = + MakeGlobalRefOrDie(env, FindClassOrDie(env, "java/lang/StackOverflowError")); - clazz = FindClassOrDie(env, kBinderProxyPathName); + jclass clazz = FindClassOrDie(env, kBinderProxyPathName); gBinderProxyOffsets.mClass = MakeGlobalRefOrDie(env, clazz); gBinderProxyOffsets.mGetInstance = GetStaticMethodIDOrDie(env, clazz, "getInstance", "(JJ)Landroid/os/BinderProxy;"); diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp index 5b4b5f2a2264..614a8ff124ea 100644 --- a/core/jni/android_view_SurfaceControl.cpp +++ b/core/jni/android_view_SurfaceControl.cpp @@ -160,7 +160,7 @@ static Rect rectFromObj(JNIEnv* env, jobject rectObj) { static jobject nativeScreenshotToBuffer(JNIEnv* env, jclass clazz, jobject displayTokenObj, jobject sourceCropObj, jint width, jint height, jint minLayer, jint maxLayer, bool allLayers, bool useIdentityTransform, - int rotation) { + int rotation, bool captureSecureLayers) { sp<IBinder> displayToken = ibinderForJavaObject(env, displayTokenObj); if (displayToken == NULL) { return NULL; @@ -171,9 +171,10 @@ static jobject nativeScreenshotToBuffer(JNIEnv* env, jclass clazz, maxLayer = INT32_MAX; } sp<GraphicBuffer> buffer; + bool capturedSecureLayers = false; status_t res = ScreenshotClient::capture(displayToken, sourceCrop, width, height, minLayer, maxLayer, useIdentityTransform, - rotation, &buffer); + rotation, captureSecureLayers, &buffer, capturedSecureLayers); if (res != NO_ERROR) { return NULL; } @@ -184,7 +185,8 @@ static jobject nativeScreenshotToBuffer(JNIEnv* env, jclass clazz, buffer->getHeight(), buffer->getPixelFormat(), (jint)buffer->getUsage(), - (jlong)buffer.get()); + (jlong)buffer.get(), + capturedSecureLayers); } static jobject nativeScreenshotBitmap(JNIEnv* env, jclass clazz, @@ -1026,7 +1028,7 @@ static const JNINativeMethod sSurfaceControlMethods[] = { {"nativeGetHandle", "(J)Landroid/os/IBinder;", (void*)nativeGetHandle }, {"nativeScreenshotToBuffer", - "(Landroid/os/IBinder;Landroid/graphics/Rect;IIIIZZI)Landroid/graphics/GraphicBuffer;", + "(Landroid/os/IBinder;Landroid/graphics/Rect;IIIIZZIZ)Landroid/graphics/GraphicBuffer;", (void*)nativeScreenshotToBuffer }, {"nativeCaptureLayers", "(Landroid/os/IBinder;Landroid/graphics/Rect;F)Landroid/graphics/GraphicBuffer;", (void*)nativeCaptureLayers }, @@ -1082,7 +1084,7 @@ int register_android_view_SurfaceControl(JNIEnv* env) jclass graphicsBufferClazz = FindClassOrDie(env, "android/graphics/GraphicBuffer"); gGraphicBufferClassInfo.clazz = MakeGlobalRefOrDie(env, graphicsBufferClazz); gGraphicBufferClassInfo.builder = GetStaticMethodIDOrDie(env, graphicsBufferClazz, - "createFromExisting", "(IIIIJ)Landroid/graphics/GraphicBuffer;"); + "createFromExisting", "(IIIIJZ)Landroid/graphics/GraphicBuffer;"); return err; } diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml index 1720e8be05af..b203fa32e48e 100644 --- a/core/res/res/values-bs/strings.xml +++ b/core/res/res/values-bs/strings.xml @@ -1779,7 +1779,7 @@ <string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string> <string name="toolbar_collapse_description" msgid="2821479483960330739">"Suzi"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"Ne ometaj"</string> - <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Prestanak rada"</string> + <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Neaktivnost"</string> <string name="zen_mode_default_weeknights_name" msgid="3081318299464998143">"Radni dan uvečer"</string> <string name="zen_mode_default_weekends_name" msgid="2786495801019345244">"Vikend"</string> <string name="zen_mode_default_events_name" msgid="8158334939013085363">"Događaj"</string> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index e5f208d4a91f..6ca2691ad624 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -255,7 +255,7 @@ <string name="notification_channel_vpn" msgid="8330103431055860618">"Estat de la VPN"</string> <string name="notification_channel_device_admin" msgid="1568154104368069249">"Administració del dispositiu"</string> <string name="notification_channel_alerts" msgid="4496839309318519037">"Alertes"</string> - <string name="notification_channel_retail_mode" msgid="6088920674914038779">"Demostració comercial"</string> + <string name="notification_channel_retail_mode" msgid="6088920674914038779">"Demostració per a botigues"</string> <string name="notification_channel_usb" msgid="9006850475328924681">"Connexió USB"</string> <string name="notification_channel_heavy_weight_app" msgid="6218742927792852607">"S\'està executant una aplicació"</string> <string name="notification_channel_foreground_service" msgid="3931987440602669158">"Aplicacions que consumeixen bateria"</string> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index d9e15b2c186f..bb8548705339 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -375,13 +375,13 @@ <string name="permdesc_broadcastSticky" product="tv" msgid="6839285697565389467">"Umožňuje aplikaci odesílat trvalá vysílání, která přetrvávají i po skončení vysílání. Nadměrné používání může televizi zpomalit či způsobit její nestabilitu, protože bude používat příliš mnoho paměti."</string> <string name="permdesc_broadcastSticky" product="default" msgid="2825803764232445091">"Umožňuje aplikaci odesílat trvalá vysílání, která přetrvávají i po skončení vysílání. Nadměrné používání může telefon zpomalit či způsobit jeho nestabilitu, protože bude používat příliš mnoho paměti."</string> <string name="permlab_readContacts" msgid="8348481131899886131">"čtení kontaktů"</string> - <string name="permdesc_readContacts" product="tablet" msgid="5294866856941149639">"Umožňuje aplikaci číst údaje o kontaktech uložených v tabletu, včetně toho, jak často voláte, posíláte e-maily nebo jinak komunikujete s konkrétními osobami. Toto oprávnění umožňuje aplikacím ukládat údaje o kontaktech. Škodlivé aplikace mohou tyto údaje bez vašeho vědomí sdílet."</string> - <string name="permdesc_readContacts" product="tv" msgid="1839238344654834087">"Umožňuje aplikaci číst údaje o kontaktech uložených v televizi včetně toho, jak často voláte, posíláte e-maily nebo jinými způsoby komunikujete s konkrétními kontakty. Toto oprávnění umožňuje aplikacím ukládat údaje o vašich kontaktech a škodlivé aplikace mohou sdílet údaje o kontaktech bez vašeho vědomí."</string> - <string name="permdesc_readContacts" product="default" msgid="8440654152457300662">"Umožňuje aplikaci číst údaje o kontaktech uložených v telefonu, včetně toho, jak často voláte, posíláte e-maily nebo komunikujete jinými způsoby s konkrétními osobami. Toto oprávnění umožňuje aplikacím ukládat údaje o kontaktech. Škodlivé aplikace mohou tyto údaje bez vašeho vědomí sdílet."</string> + <string name="permdesc_readContacts" product="tablet" msgid="5294866856941149639">"Umožňuje aplikaci číst údaje o kontaktech uložených v tabletu, včetně toho, jak často voláte, posíláte e‑maily nebo jinak komunikujete s konkrétními osobami. Toto oprávnění umožňuje aplikacím ukládat údaje o kontaktech. Škodlivé aplikace mohou tyto údaje bez vašeho vědomí sdílet."</string> + <string name="permdesc_readContacts" product="tv" msgid="1839238344654834087">"Umožňuje aplikaci číst údaje o kontaktech uložených v televizi včetně toho, jak často voláte, posíláte e‑maily nebo jinými způsoby komunikujete s konkrétními kontakty. Toto oprávnění umožňuje aplikacím ukládat údaje o vašich kontaktech a škodlivé aplikace mohou sdílet údaje o kontaktech bez vašeho vědomí."</string> + <string name="permdesc_readContacts" product="default" msgid="8440654152457300662">"Umožňuje aplikaci číst údaje o kontaktech uložených v telefonu, včetně toho, jak často voláte, posíláte e‑maily nebo komunikujete jinými způsoby s konkrétními osobami. Toto oprávnění umožňuje aplikacím ukládat údaje o kontaktech. Škodlivé aplikace mohou tyto údaje bez vašeho vědomí sdílet."</string> <string name="permlab_writeContacts" msgid="5107492086416793544">"úprava kontaktů"</string> - <string name="permdesc_writeContacts" product="tablet" msgid="897243932521953602">"Umožňuje aplikaci upravit údaje o kontaktech uložených v tabletu včetně toho, jak často voláte, posíláte e-maily nebo komunikujete jinými způsoby s konkrétními kontakty. Toto oprávnění aplikacím umožňuje mazat údaje o kontaktech."</string> - <string name="permdesc_writeContacts" product="tv" msgid="5438230957000018959">"Umožňuje aplikaci upravit údaje o kontaktech uložených v televizi včetně toho, jak často voláte, posíláte e-maily nebo jinými způsoby komunikujete s konkrétními kontakty. Toto oprávnění aplikacím umožňuje mazat údaje o kontaktech."</string> - <string name="permdesc_writeContacts" product="default" msgid="589869224625163558">"Umožňuje aplikaci upravit údaje o kontaktech uložených v telefonu včetně toho, jak často voláte, posíláte e-maily nebo komunikujete jinými způsoby s konkrétními kontakty. Toto oprávnění aplikacím umožňuje mazat údaje o kontaktech."</string> + <string name="permdesc_writeContacts" product="tablet" msgid="897243932521953602">"Umožňuje aplikaci upravit údaje o kontaktech uložených v tabletu včetně toho, jak často voláte, posíláte e‑maily nebo komunikujete jinými způsoby s konkrétními kontakty. Toto oprávnění aplikacím umožňuje mazat údaje o kontaktech."</string> + <string name="permdesc_writeContacts" product="tv" msgid="5438230957000018959">"Umožňuje aplikaci upravit údaje o kontaktech uložených v televizi včetně toho, jak často voláte, posíláte e‑maily nebo jinými způsoby komunikujete s konkrétními kontakty. Toto oprávnění aplikacím umožňuje mazat údaje o kontaktech."</string> + <string name="permdesc_writeContacts" product="default" msgid="589869224625163558">"Umožňuje aplikaci upravit údaje o kontaktech uložených v telefonu včetně toho, jak často voláte, posíláte e‑maily nebo komunikujete jinými způsoby s konkrétními kontakty. Toto oprávnění aplikacím umožňuje mazat údaje o kontaktech."</string> <string name="permlab_readCallLog" msgid="3478133184624102739">"čtení seznamu hovorů"</string> <string name="permdesc_readCallLog" msgid="3204122446463552146">"Tato aplikace může číst historii volání."</string> <string name="permlab_writeCallLog" msgid="8552045664743499354">"zápis do seznamu hovorů"</string> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index ab95af6f52bc..654165539d3b 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -63,7 +63,7 @@ <string name="CfMmi" msgid="5123218989141573515">"Rufweiterleitung"</string> <string name="CwMmi" msgid="9129678056795016867">"Anklopfen"</string> <string name="BaMmi" msgid="455193067926770581">"Anrufsperre"</string> - <string name="PwdMmi" msgid="7043715687905254199">"Passwort-Änderung"</string> + <string name="PwdMmi" msgid="7043715687905254199">"Passwortänderung"</string> <string name="PinMmi" msgid="3113117780361190304">"PIN-Änderung"</string> <string name="CnipMmi" msgid="3110534680557857162">"Rufnummer vorhanden"</string> <string name="CnirMmi" msgid="3062102121430548731">"Rufnummer begrenzt"</string> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index 089320115206..6219bb90541f 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -134,7 +134,7 @@ <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Desactivado"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Preferir Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="1988279625335345908">"Preferir datos móviles"</string> - <string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Solo conexión Wi-Fi"</string> + <string name="wfc_mode_wifi_only_summary" msgid="2379919155237869320">"Solo Wi-Fi"</string> <string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: No desviada"</string> <string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string> <string name="cfTemplateForwardedTime" msgid="9206251736527085256">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> transcurridos <xliff:g id="TIME_DELAY">{2}</xliff:g> segundos"</string> diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml index 0bf480296b88..d1f6cb53d271 100644 --- a/core/res/res/values-eu/strings.xml +++ b/core/res/res/values-eu/strings.xml @@ -1195,7 +1195,7 @@ <string name="sms_short_code_confirm_deny" msgid="2927389840209170706">"Utzi"</string> <string name="sms_short_code_remember_choice" msgid="5289538592272218136">"Gogoratu aukera"</string> <string name="sms_short_code_remember_undo_instruction" msgid="4960944133052287484">"Hori geroago alda dezakezu Ezarpenak > Aplikazioak atalean"</string> - <string name="sms_short_code_confirm_always_allow" msgid="3241181154869493368">"Onartu beti"</string> + <string name="sms_short_code_confirm_always_allow" msgid="3241181154869493368">"Eman baimena beti"</string> <string name="sms_short_code_confirm_never_allow" msgid="446992765774269673">"Ez onartu inoiz"</string> <string name="sim_removed_title" msgid="6227712319223226185">"SIM txartela kendu da"</string> <string name="sim_removed_message" msgid="2333164559970958645">"Sare mugikorra ez da erabilgarri egongo baliozko SIM txartel bat sartuta berrabiarazten ez duzun arte."</string> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index f840922090c9..223d8b54fd57 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -266,7 +266,7 @@ <string name="safeMode" msgid="2788228061547930246">"Mode sécurisé"</string> <string name="android_system_label" msgid="6577375335728551336">"Système Android"</string> <string name="user_owner_label" msgid="8836124313744349203">"Passer au profil personnel"</string> - <string name="managed_profile_label" msgid="8947929265267690522">"Passer au profil professionnel"</string> + <string name="managed_profile_label" msgid="8947929265267690522">"Passer au profil pro"</string> <string name="permgrouplab_contacts" msgid="3657758145679177612">"Contacts"</string> <string name="permgroupdesc_contacts" msgid="6951499528303668046">"accéder à vos contacts"</string> <string name="permgrouprequest_contacts" msgid="1601591667800538208">"Permettre à <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> d\'accéder à vos contacts"</string> diff --git a/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java b/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java index d922c16a9297..b9f5ef996fc5 100644 --- a/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java +++ b/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java @@ -412,7 +412,8 @@ public class TransactionParcelTests { IUiAutomationConnection iUiAutomationConnection, int i, boolean b, boolean b1, boolean b2, boolean b3, Configuration configuration, CompatibilityInfo compatibilityInfo, Map map, Bundle bundle1, String s1, - boolean autofillCompatEnabled) throws RemoteException { + boolean autofillCompatEnabled, long[] disableCompatChanges) + throws RemoteException { } @Override diff --git a/core/tests/coretests/src/android/content/pm/dex/DexMetadataHelperTest.java b/core/tests/coretests/src/android/content/pm/dex/DexMetadataHelperTest.java index e248a7771cab..586b47266e4e 100644 --- a/core/tests/coretests/src/android/content/pm/dex/DexMetadataHelperTest.java +++ b/core/tests/coretests/src/android/content/pm/dex/DexMetadataHelperTest.java @@ -45,12 +45,12 @@ import java.util.Map; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; -import libcore.testing.io.TestIoUtils; - import org.junit.After; import org.junit.Assert; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; +import org.junit.rules.TemporaryFolder; import org.junit.runner.RunWith; @SmallTest @@ -59,21 +59,14 @@ public class DexMetadataHelperTest { private static final String APK_FILE_EXTENSION = ".apk"; private static final String DEX_METADATA_FILE_EXTENSION = ".dm"; + @Rule + public TemporaryFolder mTemporaryFolder = new TemporaryFolder(); + private File mTmpDir = null; @Before - public void setUp() { - mTmpDir = TestIoUtils.createTemporaryDirectory("DexMetadataHelperTest"); - } - - @After - public void tearDown() { - if (mTmpDir != null) { - File[] files = mTmpDir.listFiles(); - for (File f : files) { - f.delete(); - } - } + public void setUp() throws IOException { + mTmpDir = mTemporaryFolder.newFolder("DexMetadataHelperTest"); } private File createDexMetadataFile(String apkFileName) throws IOException { diff --git a/graphics/java/android/graphics/GraphicBuffer.java b/graphics/java/android/graphics/GraphicBuffer.java index 74086830fae2..644f7bc13208 100644 --- a/graphics/java/android/graphics/GraphicBuffer.java +++ b/graphics/java/android/graphics/GraphicBuffer.java @@ -53,6 +53,7 @@ public class GraphicBuffer implements Parcelable { private final int mHeight; private final int mFormat; private final int mUsage; + private final boolean mCapturedSecureLayers; // Note: do not rename, this field is used by native code @UnsupportedAppUsage private final long mNativeObject; @@ -87,12 +88,22 @@ public class GraphicBuffer implements Parcelable { * Private use only. See {@link #create(int, int, int, int)}. */ @UnsupportedAppUsage - private GraphicBuffer(int width, int height, int format, int usage, long nativeObject) { + private GraphicBuffer(int width, int height, int format, int usage, long nativeObject, + boolean capturedSecureLayers) { mWidth = width; mHeight = height; mFormat = format; mUsage = usage; mNativeObject = nativeObject; + mCapturedSecureLayers = capturedSecureLayers; + } + + /** + * Private use only. See {@link #create(int, int, int, int)}. + */ + @UnsupportedAppUsage + private GraphicBuffer(int width, int height, int format, int usage, long nativeObject) { + this(width, height, format, usage, nativeObject, false); } /** @@ -101,15 +112,34 @@ public class GraphicBuffer implements Parcelable { */ @UnsupportedAppUsage public static GraphicBuffer createFromExisting(int width, int height, - int format, int usage, long unwrappedNativeObject) { + int format, int usage, long unwrappedNativeObject, + boolean capturedSecureLayers) { long nativeObject = nWrapGraphicBuffer(unwrappedNativeObject); if (nativeObject != 0) { - return new GraphicBuffer(width, height, format, usage, nativeObject); + return new GraphicBuffer(width, height, format, usage, nativeObject, + capturedSecureLayers); } return null; } /** + * For SurfaceControl JNI. Provides and ignored value for capturedSecureLayers for backwards + * compatibility + * @hide + */ + public static GraphicBuffer createFromExisting(int width, int height, + int format, int usage, long unwrappedNativeObject) { + return createFromExisting(width, height, format, usage, unwrappedNativeObject, false); + } + + /** + * Returns true if the buffer contains visible secure layers. + */ + public boolean doesContainSecureLayers() { + return mCapturedSecureLayers; + } + + /** * Returns the width of this buffer in pixels. */ public int getWidth() { diff --git a/packages/CtsShim/build/shim/AndroidManifest.xml b/packages/CtsShim/build/shim/AndroidManifest.xml index 9b813ace8b80..3e546f1e02db 100644 --- a/packages/CtsShim/build/shim/AndroidManifest.xml +++ b/packages/CtsShim/build/shim/AndroidManifest.xml @@ -20,7 +20,7 @@ package="com.android.cts.ctsshim" > <uses-sdk android:minSdkVersion="24" - android:targetSdkVersion="24" /> + android:targetSdkVersion="28" /> <restrict-update android:hash="__CAN_NOT_BE_UPDATED__" /> diff --git a/packages/CtsShim/build/shim_priv/AndroidManifest.xml b/packages/CtsShim/build/shim_priv/AndroidManifest.xml index 9bf454c29768..9ab12c9743c0 100644 --- a/packages/CtsShim/build/shim_priv/AndroidManifest.xml +++ b/packages/CtsShim/build/shim_priv/AndroidManifest.xml @@ -20,7 +20,7 @@ package="com.android.cts.priv.ctsshim" > <uses-sdk android:minSdkVersion="24" - android:targetSdkVersion="24" /> + android:targetSdkVersion="28" /> <restrict-update android:hash="__HASH__" /> diff --git a/packages/CtsShim/build/shim_priv_upgrade/AndroidManifest.xml b/packages/CtsShim/build/shim_priv_upgrade/AndroidManifest.xml index 023e93e1449e..2354061fe351 100644 --- a/packages/CtsShim/build/shim_priv_upgrade/AndroidManifest.xml +++ b/packages/CtsShim/build/shim_priv_upgrade/AndroidManifest.xml @@ -20,7 +20,7 @@ package="com.android.cts.priv.ctsshim" > <uses-sdk android:minSdkVersion="24" - android:targetSdkVersion="24" /> + android:targetSdkVersion="28" /> <application android:hasCode="false" diff --git a/packages/SettingsLib/OWNERS b/packages/SettingsLib/OWNERS index d87908738b56..a28ba8584054 100644 --- a/packages/SettingsLib/OWNERS +++ b/packages/SettingsLib/OWNERS @@ -1,21 +1,13 @@ # People who can approve changes for submission -asapperstein@google.com -asargent@google.com -dehboxturtle@google.com -dhnishi@google.com -dling@google.com dsandler@android.com +edgarwang@google.com +emilychuang@google.com evanlaird@google.com -jackqdyulei@google.com -jmonk@google.com leifhendrik@google.com -mfritze@google.com -rogerxue@google.com +rafftsai@google.com +tmfang@google.com virgild@google.com zhfan@google.com -# Emergency approvers in case the above are not available -miket@google.com - # Exempt resource files (because they are in a flat directory and too hard to manage via OWNERS) per-file *.xml=* diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml index 291d4abc4006..1c35a9d9edb7 100644 --- a/packages/SettingsLib/res/values-da/strings.xml +++ b/packages/SettingsLib/res/values-da/strings.xml @@ -184,7 +184,7 @@ <string name="enable_adb_summary" msgid="4881186971746056635">"Fejlretningstilstand, når USB er tilsluttet"</string> <string name="clear_adb_keys" msgid="4038889221503122743">"Tilbagekald tilladelser for USB-fejlfinding"</string> <string name="bugreport_in_power" msgid="7923901846375587241">"Genvej til fejlrapporting"</string> - <string name="bugreport_in_power_summary" msgid="1778455732762984579">"Vis en knap til oprettelse af fejlrapporter i menu for slukknap"</string> + <string name="bugreport_in_power_summary" msgid="1778455732762984579">"Vis en knap til oprettelse af fejlrapporter i afbrydermenuen"</string> <string name="keep_screen_on" msgid="1146389631208760344">"Lås ikke"</string> <string name="keep_screen_on_summary" msgid="2173114350754293009">"Skærmen går ikke i dvale under opladning"</string> <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Aktivér Bluetooth HCI snoop log"</string> diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml index 84e33bc51ce3..df8245cf0426 100644 --- a/packages/SettingsLib/res/values-de/strings.xml +++ b/packages/SettingsLib/res/values-de/strings.xml @@ -192,7 +192,7 @@ <string name="oem_unlock_enable" msgid="6040763321967327691">"OEM-Entsperrung"</string> <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Bootloader-Entsperrung zulassen"</string> <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"OEM-Entsperrung zulassen?"</string> - <string name="confirm_enable_oem_unlock_text" msgid="5517144575601647022">"Achtung: Die Geräteschutzfunktionen funktionieren auf diesem Gerät nicht, solange diese Einstellung aktiviert ist."</string> + <string name="confirm_enable_oem_unlock_text" msgid="5517144575601647022">"Achtung: Der Geräteschutz funktioniert auf diesem Gerät nicht, solange diese Einstellung aktiviert ist."</string> <string name="mock_location_app" msgid="7966220972812881854">"App für simulierte Standorte auswählen"</string> <string name="mock_location_app_not_set" msgid="809543285495344223">"Keine App für simulierte Standorte eingerichtet"</string> <string name="mock_location_app_set" msgid="8966420655295102685">"App für simulierte Standorte: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml index bcaf79cfbaf4..5b2b8b0e33e7 100644 --- a/packages/SettingsLib/res/values-eu/strings.xml +++ b/packages/SettingsLib/res/values-eu/strings.xml @@ -33,7 +33,7 @@ <string name="wifi_check_password_try_again" msgid="516958988102584767">"Egiaztatu pasahitza zuzena dela eta saiatu berriro"</string> <string name="wifi_not_in_range" msgid="1136191511238508967">"Urrunegi"</string> <string name="wifi_no_internet_no_reconnect" msgid="5724903347310541706">"Ez da konektatuko automatikoki"</string> - <string name="wifi_no_internet" msgid="4663834955626848401">"Ezin da atzitu Internet"</string> + <string name="wifi_no_internet" msgid="4663834955626848401">"Ezin da konektatu Internetera"</string> <string name="saved_network" msgid="4352716707126620811">"<xliff:g id="NAME">%1$s</xliff:g> aplikazioak gorde du"</string> <string name="connected_via_network_scorer" msgid="5713793306870815341">"%1$s bidez automatikoki konektatuta"</string> <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Automatikoki konektatuta sareen balorazioen hornitzailearen bidez"</string> @@ -67,7 +67,7 @@ <string name="bluetooth_profile_headset" msgid="7815495680863246034">"Telefono-deiak"</string> <string name="bluetooth_profile_opp" msgid="9168139293654233697">"Fitxategi-transferentzia"</string> <string name="bluetooth_profile_hid" msgid="3680729023366986480">"Sarrerako gailua"</string> - <string name="bluetooth_profile_pan" msgid="3391606497945147673">"Interneterako sarbidea"</string> + <string name="bluetooth_profile_pan" msgid="3391606497945147673">"Interneteko konexioa"</string> <string name="bluetooth_profile_pbap" msgid="5372051906968576809">"Kontaktuak partekatzea"</string> <string name="bluetooth_profile_pbap_summary" msgid="6605229608108852198">"Erabili kontaktuak partekatzeko"</string> <string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"Interneteko konexioa partekatzea"</string> @@ -84,9 +84,9 @@ <string name="bluetooth_sap_profile_summary_connected" msgid="8561765057453083838">"SAP sarbide-puntura konektatuta"</string> <string name="bluetooth_opp_profile_summary_not_connected" msgid="1267091356089086285">"Fitxategi-transferentziako zerbitzarira konektatu gabe"</string> <string name="bluetooth_hid_profile_summary_connected" msgid="3381760054215168689">"Sarrerako gailura konektatuta"</string> - <string name="bluetooth_pan_user_profile_summary_connected" msgid="6436258151814414028">"Gailura konektatuta Interneteko sarbiderako"</string> + <string name="bluetooth_pan_user_profile_summary_connected" msgid="6436258151814414028">"Gailura konektatuta Internet atzitzeko"</string> <string name="bluetooth_pan_nap_profile_summary_connected" msgid="1322694224800769308">"Tokiko Interneteko konexioa gailu batekin partekatzea"</string> - <string name="bluetooth_pan_profile_summary_use_for" msgid="5736111170225304239">"Erabili Internet atzitzeko"</string> + <string name="bluetooth_pan_profile_summary_use_for" msgid="5736111170225304239">"Erabili Internetera konektatzeko"</string> <string name="bluetooth_map_profile_summary_use_for" msgid="5154200119919927434">"Erabili maparako"</string> <string name="bluetooth_sap_profile_summary_use_for" msgid="7085362712786907993">"Erabili SIM txartelerako sarbiderako"</string> <string name="bluetooth_a2dp_profile_summary_use_for" msgid="4630849022250168427">"Erabili euskarriaren audiorako"</string> diff --git a/packages/SystemUI/res-keyguard/values-da/strings.xml b/packages/SystemUI/res-keyguard/values-da/strings.xml index 012fe2f4c437..16073a7c33de 100644 --- a/packages/SystemUI/res-keyguard/values-da/strings.xml +++ b/packages/SystemUI/res-keyguard/values-da/strings.xml @@ -34,6 +34,7 @@ <string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"Forkert pinkode."</string> <string name="keyguard_sim_error_message_short" msgid="592109500618448312">"Ugyldigt kort."</string> <string name="keyguard_charged" msgid="2222329688813033109">"Opladet"</string> + <string name="keyguard_plugged_in_wireless" msgid="3004717438401575235">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Trådløs opladning"</string> <string name="keyguard_plugged_in" msgid="3161102098900158923">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Oplader"</string> <string name="keyguard_plugged_in_charging_fast" msgid="3684592786276709342">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Oplader hurtigt"</string> <string name="keyguard_plugged_in_charging_slowly" msgid="509533586841478405">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Oplader langsomt"</string> diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index 83451ba6743b..73b16759ca07 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -399,6 +399,7 @@ <string name="interruption_level_none_twoline" msgid="3957581548190765889">"Silenci\ntotal"</string> <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Només\ninterr. prior."</string> <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Només\nalarmes"</string> + <string name="keyguard_indication_charging_time_wireless" msgid="5376059837186496558">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • S\'està carregant sense fils (temps restant: <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g>)"</string> <string name="keyguard_indication_charging_time" msgid="2056340799276374421">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • S\'està carregant (temps restant: <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g>)"</string> <string name="keyguard_indication_charging_time_fast" msgid="7767562163577492332">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Carregant ràpidament (temps restant: <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g>)"</string> <string name="keyguard_indication_charging_time_slowly" msgid="3769655133567307069">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Carregant lentament (temps restant: <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g>)"</string> diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index 42c5caee72cf..f2905791c963 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -405,6 +405,7 @@ <string name="interruption_level_none_twoline" msgid="3957581548190765889">"שקט\nמוחלט"</string> <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"הודעות בעדיפות\nבלבד"</string> <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"התראות\nבלבד"</string> + <string name="keyguard_indication_charging_time_wireless" msgid="5376059837186496558">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • בטעינה אלחוטית (<xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> עד לסיום)"</string> <string name="keyguard_indication_charging_time" msgid="2056340799276374421">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • בטעינה (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> עד לסיום)"</string> <string name="keyguard_indication_charging_time_fast" msgid="7767562163577492332">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • בטעינה מהירה (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> עד לסיום)"</string> <string name="keyguard_indication_charging_time_slowly" msgid="3769655133567307069">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • בטעינה איטית (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> עד לסיום)"</string> @@ -800,8 +801,8 @@ <string name="pip_notification_message" msgid="5619512781514343311">"אם אינך רוצה שהתכונה הזו תשמש את <xliff:g id="NAME">%s</xliff:g>, יש להקיש כדי לפתוח את ההגדרות ולכבות את התכונה."</string> <string name="pip_play" msgid="1417176722760265888">"הפעל"</string> <string name="pip_pause" msgid="8881063404466476571">"השהה"</string> - <string name="pip_skip_to_next" msgid="1948440006726306284">"ברצוני לדלג אל הבא"</string> - <string name="pip_skip_to_prev" msgid="1955311326688637914">"ברצוני לדלג אל הקודם"</string> + <string name="pip_skip_to_next" msgid="1948440006726306284">"אפשר לדלג אל הבא"</string> + <string name="pip_skip_to_prev" msgid="1955311326688637914">"אפשר לדלג אל הקודם"</string> <string name="thermal_shutdown_title" msgid="4458304833443861111">"הטלפון כבה עקב התחממות"</string> <string name="thermal_shutdown_message" msgid="9006456746902370523">"הטלפון פועל כרגיל עכשיו"</string> <string name="thermal_shutdown_dialog_message" msgid="566347880005304139">"הטלפון שלך התחמם יותר מדי וכבה כדי להתקרר. הטלפון פועל כרגיל עכשיו.\n\nייתכן שהטלפון יתחמם יותר מדי אם:\n • תשתמש באפליקציות עתירות משאבים (כגון משחקים, אפליקציות וידאו או אפליקציות ניווט)\n • תוריד או תעלה קבצים גדולים\n • תשתמש בטלפון בטמפרטורות גבוהות"</string> diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java index 03fb9bbdbd4e..0fcb99445a44 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java @@ -340,7 +340,7 @@ public class KeyguardSecurityContainer extends FrameLayout implements KeyguardSe case SimPuk: // Shortcut for SIM PIN/PUK to go to directly to user's security screen or home SecurityMode securityMode = mSecurityModel.getSecurityMode(targetUserId); - if (securityMode == SecurityMode.None || mLockPatternUtils.isLockScreenDisabled( + if (securityMode == SecurityMode.None && mLockPatternUtils.isLockScreenDisabled( KeyguardUpdateMonitor.getCurrentUser())) { finish = true; } else { diff --git a/packages/overlays/DisplayCutoutEmulationCornerOverlay/Android.mk b/packages/overlays/DisplayCutoutEmulationCornerOverlay/Android.mk index 74c43b40616f..f5ad08978c11 100644 --- a/packages/overlays/DisplayCutoutEmulationCornerOverlay/Android.mk +++ b/packages/overlays/DisplayCutoutEmulationCornerOverlay/Android.mk @@ -4,8 +4,6 @@ include $(CLEAR_VARS) LOCAL_RRO_THEME := DisplayCutoutEmulationCorner LOCAL_CERTIFICATE := platform -LOCAL_SRC_FILES := $(call all-subdir-java-files) - LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res LOCAL_PACKAGE_NAME := DisplayCutoutEmulationCornerOverlay diff --git a/packages/overlays/DisplayCutoutEmulationDoubleOverlay/Android.mk b/packages/overlays/DisplayCutoutEmulationDoubleOverlay/Android.mk index d83b30a8785a..626455655a17 100644 --- a/packages/overlays/DisplayCutoutEmulationDoubleOverlay/Android.mk +++ b/packages/overlays/DisplayCutoutEmulationDoubleOverlay/Android.mk @@ -4,8 +4,6 @@ include $(CLEAR_VARS) LOCAL_RRO_THEME := DisplayCutoutEmulationDouble LOCAL_CERTIFICATE := platform -LOCAL_SRC_FILES := $(call all-subdir-java-files) - LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res LOCAL_PACKAGE_NAME := DisplayCutoutEmulationDoubleOverlay diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/Android.mk b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/Android.mk index f5afad24676f..2ebb87bb00d0 100644 --- a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/Android.mk +++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/Android.mk @@ -4,8 +4,6 @@ include $(CLEAR_VARS) LOCAL_RRO_THEME := DisplayCutoutEmulationNarrow LOCAL_CERTIFICATE := platform -LOCAL_SRC_FILES := $(call all-subdir-java-files) - LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res LOCAL_PACKAGE_NAME := DisplayCutoutEmulationNarrowOverlay diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/Android.mk b/packages/overlays/DisplayCutoutEmulationTallOverlay/Android.mk index f1f8c27d94f1..cab86f7920e8 100644 --- a/packages/overlays/DisplayCutoutEmulationTallOverlay/Android.mk +++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/Android.mk @@ -4,8 +4,6 @@ include $(CLEAR_VARS) LOCAL_RRO_THEME := DisplayCutoutEmulationTall LOCAL_CERTIFICATE := platform -LOCAL_SRC_FILES := $(call all-subdir-java-files) - LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res LOCAL_PACKAGE_NAME := DisplayCutoutEmulationTallOverlay diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/Android.mk b/packages/overlays/DisplayCutoutEmulationWideOverlay/Android.mk index d149d8ecf4df..51c6f5fd1157 100644 --- a/packages/overlays/DisplayCutoutEmulationWideOverlay/Android.mk +++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/Android.mk @@ -4,8 +4,6 @@ include $(CLEAR_VARS) LOCAL_RRO_THEME := DisplayCutoutEmulationWide LOCAL_CERTIFICATE := platform -LOCAL_SRC_FILES := $(call all-subdir-java-files) - LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res LOCAL_PACKAGE_NAME := DisplayCutoutEmulationWideOverlay diff --git a/packages/overlays/SysuiDarkThemeOverlay/Android.mk b/packages/overlays/SysuiDarkThemeOverlay/Android.mk index 7b277bcf0351..fd3d5d22403b 100644 --- a/packages/overlays/SysuiDarkThemeOverlay/Android.mk +++ b/packages/overlays/SysuiDarkThemeOverlay/Android.mk @@ -4,8 +4,6 @@ include $(CLEAR_VARS) LOCAL_RRO_THEME := SysuiDarkTheme LOCAL_CERTIFICATE := platform -LOCAL_SRC_FILES := $(call all-subdir-java-files) - LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res LOCAL_PACKAGE_NAME := SysuiDarkThemeOverlay diff --git a/services/core/java/com/android/server/Watchdog.java b/services/core/java/com/android/server/Watchdog.java index f1ab0be32ce7..a909843324de 100644 --- a/services/core/java/com/android/server/Watchdog.java +++ b/services/core/java/com/android/server/Watchdog.java @@ -91,16 +91,17 @@ public class Watchdog extends Thread { }; public static final List<String> HAL_INTERFACES_OF_INTEREST = Arrays.asList( - "android.hardware.audio@2.0::IDevicesFactory", - "android.hardware.audio@4.0::IDevicesFactory", - "android.hardware.bluetooth@1.0::IBluetoothHci", - "android.hardware.camera.provider@2.4::ICameraProvider", - "android.hardware.graphics.composer@2.1::IComposer", - "android.hardware.health@2.0::IHealth", - "android.hardware.media.omx@1.0::IOmx", - "android.hardware.media.omx@1.0::IOmxStore", - "android.hardware.sensors@1.0::ISensors", - "android.hardware.vr@1.0::IVr" + "android.hardware.audio@2.0::IDevicesFactory", + "android.hardware.audio@4.0::IDevicesFactory", + "android.hardware.bluetooth@1.0::IBluetoothHci", + "android.hardware.camera.provider@2.4::ICameraProvider", + "android.hardware.graphics.composer@2.1::IComposer", + "android.hardware.health@2.0::IHealth", + "android.hardware.media.omx@1.0::IOmx", + "android.hardware.media.omx@1.0::IOmxStore", + "android.hardware.sensors@1.0::ISensors", + "android.hardware.vr@1.0::IVr", + "android.system.suspend@1.0::ISystemSuspend" ); static Watchdog sWatchdog; diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 5ebd17360961..27ef4a7c54a8 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -452,20 +452,10 @@ import com.android.server.SystemService; import com.android.server.SystemServiceManager; import com.android.server.ThreadPriorityBooster; import com.android.server.Watchdog; -import com.android.server.am.ActivityManagerServiceDumpActivitiesProto; -import com.android.server.am.ActivityManagerServiceDumpBroadcastsProto; -import com.android.server.am.ActivityManagerServiceDumpProcessesProto; import com.android.server.am.ActivityManagerServiceDumpProcessesProto.UidObserverRegistrationProto; -import com.android.server.am.ActivityManagerServiceDumpServicesProto; import com.android.server.am.ActivityStack.ActivityState; -import com.android.server.am.GrantUriProto; -import com.android.server.am.ImportanceTokenProto; -import com.android.server.am.MemInfoDumpProto; import com.android.server.am.MemoryStatUtil.MemoryStat; -import com.android.server.am.NeededUriGrantsProto; -import com.android.server.am.ProcessOomProto; -import com.android.server.am.ProcessToGcProto; -import com.android.server.am.StickyBroadcastProto; +import com.android.server.compat.CompatConfig; import com.android.server.firewall.IntentFirewall; import com.android.server.job.JobSchedulerInternal; import com.android.server.pm.Installer; @@ -478,12 +468,12 @@ import com.android.server.wm.WindowManagerService; import dalvik.system.VMRuntime; -import com.google.android.collect.Lists; -import com.google.android.collect.Maps; - import libcore.io.IoUtils; import libcore.util.EmptyArray; +import com.google.android.collect.Lists; +import com.google.android.collect.Maps; + import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlSerializer; @@ -4309,6 +4299,9 @@ public class ActivityManagerService extends IActivityManager.Stub if ("1".equals(SystemProperties.get("debug.assert"))) { runtimeFlags |= Zygote.DEBUG_ENABLE_ASSERT; } + if ("1".equals(SystemProperties.get("debug.ignoreappsignalhandler"))) { + runtimeFlags |= Zygote.DEBUG_IGNORE_APP_SIGNAL_HANDLER; + } if (mNativeDebuggingApp != null && mNativeDebuggingApp.equals(app.processName)) { // Enable all debug flags required by the native debugger. runtimeFlags |= Zygote.DEBUG_ALWAYS_JIT; // Don't interpret anything @@ -7670,6 +7663,7 @@ public class ActivityManagerService extends IActivityManager.Stub checkTime(startTime, "attachApplicationLocked: immediately before bindApplication"); bindApplicationTimeMillis = SystemClock.elapsedRealtime(); mStackSupervisor.getActivityMetricsLogger().notifyBindApplication(app); + long[] disabledCompatChanges = CompatConfig.get().getDisabledChanges(app.info); if (app.isolatedEntryPoint != null) { // This is an isolated process which should just call an entry point instead of // being bound to an application. @@ -7685,7 +7679,7 @@ public class ActivityManagerService extends IActivityManager.Stub new Configuration(getGlobalConfiguration()), app.compat, getCommonServicesLocked(app.isolated), mCoreSettingsObserver.getCoreSettingsLocked(), - buildSerial, isAutofillCompatEnabled); + buildSerial, isAutofillCompatEnabled, disabledCompatChanges); } else { thread.bindApplication(processName, appInfo, providers, null, profilerInfo, null, null, null, testMode, @@ -7694,7 +7688,7 @@ public class ActivityManagerService extends IActivityManager.Stub new Configuration(getGlobalConfiguration()), app.compat, getCommonServicesLocked(app.isolated), mCoreSettingsObserver.getCoreSettingsLocked(), - buildSerial, isAutofillCompatEnabled); + buildSerial, isAutofillCompatEnabled, disabledCompatChanges); } if (profilerInfo != null) { profilerInfo.closeFd(); diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 2a598774a2e1..a83b3375125e 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -363,7 +363,7 @@ public class AudioService extends IAudioService.Stub AudioSystem.STREAM_MUSIC, // STREAM_MUSIC AudioSystem.STREAM_MUSIC, // STREAM_ALARM AudioSystem.STREAM_MUSIC, // STREAM_NOTIFICATION - AudioSystem.STREAM_MUSIC, // STREAM_BLUETOOTH_SCO + AudioSystem.STREAM_BLUETOOTH_SCO, // STREAM_BLUETOOTH_SCO AudioSystem.STREAM_MUSIC, // STREAM_SYSTEM_ENFORCED AudioSystem.STREAM_MUSIC, // STREAM_DTMF AudioSystem.STREAM_MUSIC, // STREAM_TTS diff --git a/services/core/java/com/android/server/net/watchlist/NetworkWatchlistShellCommand.java b/services/core/java/com/android/server/net/watchlist/NetworkWatchlistShellCommand.java index 766d8ca8a47c..3b24f46d4714 100644 --- a/services/core/java/com/android/server/net/watchlist/NetworkWatchlistShellCommand.java +++ b/services/core/java/com/android/server/net/watchlist/NetworkWatchlistShellCommand.java @@ -17,8 +17,6 @@ package com.android.server.net.watchlist; import android.content.Context; -import android.content.Intent; -import android.net.NetworkWatchlistManager; import android.os.Binder; import android.os.ParcelFileDescriptor; import android.os.RemoteException; @@ -26,7 +24,6 @@ import android.os.ShellCommand; import android.provider.Settings; import java.io.FileInputStream; -import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; @@ -74,10 +71,12 @@ class NetworkWatchlistShellCommand extends ShellCommand { try { final String configXmlPath = getNextArgRequired(); final ParcelFileDescriptor pfd = openFileForSystem(configXmlPath, "r"); - if (pfd != null) { - final InputStream fileStream = new FileInputStream(pfd.getFileDescriptor()); - WatchlistConfig.getInstance().setTestMode(fileStream); + if (pfd == null) { + pw.println("Error: can't open input file " + configXmlPath); + return -1; } + final InputStream fileStream = new FileInputStream(pfd.getFileDescriptor()); + WatchlistConfig.getInstance().setTestMode(fileStream); pw.println("Success!"); } catch (Exception ex) { pw.println("Error: " + ex.toString()); diff --git a/services/core/java/com/android/server/pm/BackgroundDexOptService.java b/services/core/java/com/android/server/pm/BackgroundDexOptService.java index ad9ac1232437..2b33aced7151 100644 --- a/services/core/java/com/android/server/pm/BackgroundDexOptService.java +++ b/services/core/java/com/android/server/pm/BackgroundDexOptService.java @@ -254,9 +254,16 @@ public class BackgroundDexOptService extends JobService { @Override public void run() { int result = idleOptimization(pm, pkgs, BackgroundDexOptService.this); - if (result != OPTIMIZE_ABORT_BY_JOB_SCHEDULER) { + if (result == OPTIMIZE_PROCESSED) { + Log.i(TAG, "Idle optimizations completed."); + } else if (result == OPTIMIZE_ABORT_NO_SPACE_LEFT) { Log.w(TAG, "Idle optimizations aborted because of space constraints."); - // If we didn't abort we ran to completion (or stopped because of space). + } else if (result == OPTIMIZE_ABORT_BY_JOB_SCHEDULER) { + Log.w(TAG, "Idle optimizations aborted by job scheduler."); + } else { + Log.w(TAG, "Idle optimizations ended with unexpected code: " + result); + } + if (result != OPTIMIZE_ABORT_BY_JOB_SCHEDULER) { // Abandon our timeslice and do not reschedule. jobFinished(jobParams, /* reschedule */ false); } @@ -339,6 +346,7 @@ public class BackgroundDexOptService extends JobService { long lowStorageThreshold, boolean isForPrimaryDex) { ArraySet<String> updatedPackages = new ArraySet<>(); Set<String> unusedPackages = pm.getUnusedPackages(mDowngradeUnusedAppsThresholdInMillis); + boolean hadSomeLowSpaceFailure = false; Log.d(TAG, "Unsused Packages " + String.join(",", unusedPackages)); // Only downgrade apps when space is low on device. // Threshold is selected above the lowStorageThreshold so that we can pro-actively clean @@ -359,6 +367,7 @@ public class BackgroundDexOptService extends JobService { } else { if (abort_code == OPTIMIZE_ABORT_NO_SPACE_LEFT) { // can't dexopt because of low space. + hadSomeLowSpaceFailure = true; continue; } dex_opt_performed = optimizePackage(pm, pkg, isForPrimaryDex); @@ -369,7 +378,7 @@ public class BackgroundDexOptService extends JobService { } notifyPinService(updatedPackages); - return OPTIMIZE_PROCESSED; + return hadSomeLowSpaceFailure ? OPTIMIZE_ABORT_NO_SPACE_LEFT : OPTIMIZE_PROCESSED; } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index f938b65b48c3..aac8dad52dd7 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -9004,6 +9004,20 @@ public class PackageManagerService extends IPackageManager.Stub } } + /** + * Enforces that only the system UID or root's UID or shell's UID can call + * a method exposed via Binder. + * + * @param message used as message if SecurityException is thrown + * @throws SecurityException if the caller is not system or shell + */ + private static void enforceSystemOrRootOrShell(String message) { + final int uid = Binder.getCallingUid(); + if (uid != Process.SYSTEM_UID && uid != Process.ROOT_UID && uid != Process.SHELL_UID) { + throw new SecurityException(message); + } + } + @Override public void performFstrimIfNeeded() { enforceSystemOrRoot("Only the system can request fstrim"); @@ -9498,7 +9512,13 @@ public class PackageManagerService extends IPackageManager.Stub if (getInstantAppPackageName(Binder.getCallingUid()) != null) { return false; } - return BackgroundDexOptService.runIdleOptimizationsNow(this, mContext, packageNames); + enforceSystemOrRootOrShell("runBackgroundDexoptJob"); + final long identity = Binder.clearCallingIdentity(); + try { + return BackgroundDexOptService.runIdleOptimizationsNow(this, mContext, packageNames); + } finally { + Binder.restoreCallingIdentity(identity); + } } private static List<SharedLibraryInfo> findSharedLibraries(PackageParser.Package p) { diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java index e1c13026507f..242f9c302f5e 100644 --- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java +++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java @@ -1334,6 +1334,7 @@ class PackageManagerShellCommand extends ShellCommand { } boolean result = mInterface.runBackgroundDexoptJob(packageNames.isEmpty() ? null : packageNames); + getOutPrintWriter().println(result ? "Success" : "Failure"); return result ? 0 : -1; } diff --git a/services/core/java/com/android/server/wm/ScreenRotationAnimation.java b/services/core/java/com/android/server/wm/ScreenRotationAnimation.java index 755a571cf5f7..95051dea2e9a 100644 --- a/services/core/java/com/android/server/wm/ScreenRotationAnimation.java +++ b/services/core/java/com/android/server/wm/ScreenRotationAnimation.java @@ -27,6 +27,7 @@ import static com.android.server.wm.ScreenRotationAnimationProto.ANIMATION_RUNNI import static com.android.server.wm.ScreenRotationAnimationProto.STARTED; import android.content.Context; +import android.graphics.GraphicBuffer; import android.graphics.Matrix; import android.graphics.Rect; import android.os.IBinder; @@ -285,10 +286,27 @@ class ScreenRotationAnimation { if (displayHandle != null) { Surface sur = new Surface(); sur.copyFrom(mSurfaceControl); - SurfaceControl.screenshot(displayHandle, sur); - t.setLayer(mSurfaceControl, SCREEN_FREEZE_LAYER_SCREENSHOT); - t.setAlpha(mSurfaceControl, 0); - t.show(mSurfaceControl); + GraphicBuffer gb = SurfaceControl.screenshotToBufferWithSecureLayersUnsafe( + new Rect(), 0 /* width */, 0 /* height */, 0 /* minLayer */, + 0 /* maxLayer */, false /* useIdentityTransform */, 0 /* rotation */); + if (gb != null) { + try { + sur.attachAndQueueBuffer(gb); + } catch (RuntimeException e) { + Slog.w(TAG, "Failed to attach screenshot - " + e.getMessage()); + } + // If the screenshot contains secure layers, we have to make sure the + // screenshot surface we display it in also has FLAG_SECURE so that + // the user can not screenshot secure layers via the screenshot surface. + if (gb.doesContainSecureLayers()) { + t.setSecure(mSurfaceControl, true); + } + t.setLayer(mSurfaceControl, SCREEN_FREEZE_LAYER_SCREENSHOT); + t.setAlpha(mSurfaceControl, 0); + t.show(mSurfaceControl); + } else { + Slog.w(TAG, "Unable to take screenshot of display " + displayId); + } sur.destroy(); } else { Slog.w(TAG, "Built-in display " + displayId + " is null."); diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index 83ae0fc0c95f..dab160338a76 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -1671,6 +1671,10 @@ public final class SystemServer { mSystemServiceManager.startService(StatsCompanionService.Lifecycle.class); traceEnd(); + if (safeMode) { + mActivityManagerService.enterSafeMode(); + } + // MMS service broker traceBeginAndSlog("StartMmsService"); mmsService = mSystemServiceManager.startService(MmsServiceBroker.class); diff --git a/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java b/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java index 9736e68144ae..c56a393c094f 100644 --- a/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/PackageParserTest.java @@ -38,13 +38,14 @@ import androidx.test.filters.MediumTest; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; -import libcore.io.IoUtils; - import org.junit.Before; +import org.junit.Rule; import org.junit.Test; +import org.junit.rules.TemporaryFolder; import org.junit.runner.RunWith; import java.io.File; +import java.io.IOException; import java.lang.reflect.Array; import java.lang.reflect.Field; import java.nio.charset.StandardCharsets; @@ -57,13 +58,16 @@ import java.util.Set; @RunWith(AndroidJUnit4.class) @MediumTest public class PackageParserTest { + @Rule + public TemporaryFolder mTemporaryFolder = new TemporaryFolder(); + private File mTmpDir; private static final File FRAMEWORK = new File("/system/framework/framework-res.apk"); @Before - public void setUp() { + public void setUp() throws IOException { // Create a new temporary directory for each of our tests. - mTmpDir = IoUtils.createTemporaryDirectory("PackageParserTest"); + mTmpDir = mTemporaryFolder.newFolder("PackageParserTest"); } @Test diff --git a/services/usb/java/com/android/server/usb/UsbDeviceManager.java b/services/usb/java/com/android/server/usb/UsbDeviceManager.java index e949e7490230..655363efd2e0 100644 --- a/services/usb/java/com/android/server/usb/UsbDeviceManager.java +++ b/services/usb/java/com/android/server/usb/UsbDeviceManager.java @@ -922,6 +922,8 @@ public class UsbDeviceManager implements ActivityManagerInternal.ScreenObserver if (!mScreenLocked && mScreenUnlockedFunctions != UsbManager.FUNCTION_NONE) { // If the screen is unlocked, also set current functions. setScreenUnlockedFunctions(); + } else { + setEnabledFunctions(UsbManager.FUNCTION_NONE, false); } break; case MSG_UPDATE_SCREEN_LOCK: diff --git a/startop/apps/ColorChanging/.gitignore b/startop/apps/ColorChanging/.gitignore new file mode 100644 index 000000000000..2b75303ac58f --- /dev/null +++ b/startop/apps/ColorChanging/.gitignore @@ -0,0 +1,13 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild diff --git a/startop/apps/ColorChanging/.idea/encodings.xml b/startop/apps/ColorChanging/.idea/encodings.xml new file mode 100644 index 000000000000..15a15b218a29 --- /dev/null +++ b/startop/apps/ColorChanging/.idea/encodings.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="Encoding" addBOMForNewFiles="with NO BOM" /> +</project>
\ No newline at end of file diff --git a/startop/apps/ColorChanging/.idea/gradle.xml b/startop/apps/ColorChanging/.idea/gradle.xml new file mode 100644 index 000000000000..2996d531255e --- /dev/null +++ b/startop/apps/ColorChanging/.idea/gradle.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="GradleSettings"> + <option name="linkedExternalProjectsSettings"> + <GradleProjectSettings> + <compositeConfiguration> + <compositeBuild compositeDefinitionSource="SCRIPT" /> + </compositeConfiguration> + <option name="distributionType" value="DEFAULT_WRAPPED" /> + <option name="externalProjectPath" value="$PROJECT_DIR$" /> + <option name="resolveModulePerSourceSet" value="false" /> + </GradleProjectSettings> + </option> + </component> +</project>
\ No newline at end of file diff --git a/startop/apps/ColorChanging/.idea/misc.xml b/startop/apps/ColorChanging/.idea/misc.xml new file mode 100644 index 000000000000..37a750962da6 --- /dev/null +++ b/startop/apps/ColorChanging/.idea/misc.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" project-jdk-name="1.8" project-jdk-type="JavaSDK"> + <output url="file://$PROJECT_DIR$/build/classes" /> + </component> + <component name="ProjectType"> + <option name="id" value="Android" /> + </component> +</project>
\ No newline at end of file diff --git a/startop/apps/ColorChanging/.idea/runConfigurations.xml b/startop/apps/ColorChanging/.idea/runConfigurations.xml new file mode 100644 index 000000000000..7f68460d8b38 --- /dev/null +++ b/startop/apps/ColorChanging/.idea/runConfigurations.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="RunConfigurationProducerService"> + <option name="ignoredProducers"> + <set> + <option value="org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer" /> + <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer" /> + <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer" /> + </set> + </option> + </component> +</project>
\ No newline at end of file diff --git a/startop/apps/ColorChanging/README.md b/startop/apps/ColorChanging/README.md new file mode 100644 index 000000000000..eb8b9cc1103b --- /dev/null +++ b/startop/apps/ColorChanging/README.md @@ -0,0 +1,5 @@ +This directory contains a simple Android app that is meant to help in +syncing a trace along with a video in Perfetto. + +This app changes the colors of the screen that has traces to go along +with the colors. diff --git a/startop/apps/ColorChanging/app/.gitignore b/startop/apps/ColorChanging/app/.gitignore new file mode 100644 index 000000000000..796b96d1c402 --- /dev/null +++ b/startop/apps/ColorChanging/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/startop/apps/ColorChanging/app/build.gradle b/startop/apps/ColorChanging/app/build.gradle new file mode 100644 index 000000000000..ab955aaf90ee --- /dev/null +++ b/startop/apps/ColorChanging/app/build.gradle @@ -0,0 +1,29 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 29 + buildToolsVersion "29.0.0" + defaultConfig { + applicationId "com.android.startop.colorchanging" + minSdkVersion 15 + targetSdkVersion 29 + versionCode 1 + versionName "1.0" + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation 'androidx.appcompat:appcompat:1.0.2' + implementation 'androidx.constraintlayout:constraintlayout:1.1.3' + testImplementation 'junit:junit:4.12' + androidTestImplementation 'androidx.test:runner:1.2.0' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' +} diff --git a/startop/apps/ColorChanging/app/proguard-rules.pro b/startop/apps/ColorChanging/app/proguard-rules.pro new file mode 100644 index 000000000000..f1b424510da5 --- /dev/null +++ b/startop/apps/ColorChanging/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/startop/apps/ColorChanging/app/src/androidTest/java/com/android/startop/colorchanging/ExampleInstrumentedTest.java b/startop/apps/ColorChanging/app/src/androidTest/java/com/android/startop/colorchanging/ExampleInstrumentedTest.java new file mode 100644 index 000000000000..31736f3e2862 --- /dev/null +++ b/startop/apps/ColorChanging/app/src/androidTest/java/com/android/startop/colorchanging/ExampleInstrumentedTest.java @@ -0,0 +1,27 @@ +package com.android.startop.colorchanging; + +import android.content.Context; + +import androidx.test.InstrumentationRegistry; +import androidx.test.runner.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see <a href="http://d.android.com/tools/testing">Testing documentation</a> + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getTargetContext(); + + assertEquals("com.android.startop.colorchanging", appContext.getPackageName()); + } +} diff --git a/startop/apps/ColorChanging/app/src/main/AndroidManifest.xml b/startop/apps/ColorChanging/app/src/main/AndroidManifest.xml new file mode 100644 index 000000000000..37193b5ff596 --- /dev/null +++ b/startop/apps/ColorChanging/app/src/main/AndroidManifest.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.android.startop.colorchanging"> + + <application + android:allowBackup="true" + android:icon="@mipmap/ic_launcher" + android:label="@string/app_name" + android:roundIcon="@mipmap/ic_launcher_round" + android:supportsRtl="true" + android:theme="@style/AppTheme"> + <activity android:name="com.android.startop.colorchanging.MainActivity"> + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + + <category android:name="android.intent.category.LAUNCHER" /> + </intent-filter> + </activity> + </application> + +</manifest>
\ No newline at end of file diff --git a/startop/apps/ColorChanging/app/src/main/java/com/android/startop/colorchanging/MainActivity.java b/startop/apps/ColorChanging/app/src/main/java/com/android/startop/colorchanging/MainActivity.java new file mode 100644 index 000000000000..b8f4faf299a9 --- /dev/null +++ b/startop/apps/ColorChanging/app/src/main/java/com/android/startop/colorchanging/MainActivity.java @@ -0,0 +1,91 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.startop.colorchanging; + +import androidx.appcompat.app.AppCompatActivity; + +import android.os.Bundle; +import android.os.Trace; +import android.view.View; + +public class MainActivity extends AppCompatActivity { + View view; + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + + view = this.getWindow().getDecorView(); + view.setBackgroundResource(R.color.gray); + Trace.beginSection("gray"); + } + + public void goRed(View v) { + Trace.endSection(); + view.setBackgroundResource(R.color.red); + Trace.beginSection("red"); + } + + public void goOrange(View v) { + Trace.endSection(); + view.setBackgroundResource(R.color.orange); + Trace.beginSection("orange"); + } + + public void goYellow(View v) { + Trace.endSection(); + view.setBackgroundResource(R.color.yellow); + Trace.beginSection("yellow"); + } + + public void goGreen(View v) { + Trace.endSection(); + view.setBackgroundResource(R.color.green); + Trace.beginSection("green"); + } + + public void goBlue(View v) { + Trace.endSection(); + view.setBackgroundResource(R.color.blue); + Trace.beginSection("blue"); + } + + public void goIndigo(View v) { + Trace.endSection(); + view.setBackgroundResource(R.color.indigo); + Trace.beginSection("indigo"); + } + + public void goViolet(View v) { + Trace.endSection(); + view.setBackgroundResource(R.color.violet); + Trace.beginSection("violet"); + } + + public void goCyan(View v) { + Trace.endSection(); + view.setBackgroundResource(R.color.cyan); + Trace.beginSection("cyan"); + } + + public void goBlack(View v) { + Trace.endSection(); + view.setBackgroundResource(R.color.black); + Trace.beginSection("black"); + } + +} diff --git a/startop/apps/ColorChanging/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/startop/apps/ColorChanging/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 000000000000..1f6bb290603d --- /dev/null +++ b/startop/apps/ColorChanging/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,34 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:aapt="http://schemas.android.com/aapt" + android:width="108dp" + android:height="108dp" + android:viewportWidth="108" + android:viewportHeight="108"> + <path + android:fillType="evenOdd" + android:pathData="M32,64C32,64 38.39,52.99 44.13,50.95C51.37,48.37 70.14,49.57 70.14,49.57L108.26,87.69L108,109.01L75.97,107.97L32,64Z" + android:strokeWidth="1" + android:strokeColor="#00000000"> + <aapt:attr name="android:fillColor"> + <gradient + android:endX="78.5885" + android:endY="90.9159" + android:startX="48.7653" + android:startY="61.0927" + android:type="linear"> + <item + android:color="#44000000" + android:offset="0.0" /> + <item + android:color="#00000000" + android:offset="1.0" /> + </gradient> + </aapt:attr> + </path> + <path + android:fillColor="#FFFFFF" + android:fillType="nonZero" + android:pathData="M66.94,46.02L66.94,46.02C72.44,50.07 76,56.61 76,64L32,64C32,56.61 35.56,50.11 40.98,46.06L36.18,41.19C35.45,40.45 35.45,39.3 36.18,38.56C36.91,37.81 38.05,37.81 38.78,38.56L44.25,44.05C47.18,42.57 50.48,41.71 54,41.71C57.48,41.71 60.78,42.57 63.68,44.05L69.11,38.56C69.84,37.81 70.98,37.81 71.71,38.56C72.44,39.3 72.44,40.45 71.71,41.19L66.94,46.02ZM62.94,56.92C64.08,56.92 65,56.01 65,54.88C65,53.76 64.08,52.85 62.94,52.85C61.8,52.85 60.88,53.76 60.88,54.88C60.88,56.01 61.8,56.92 62.94,56.92ZM45.06,56.92C46.2,56.92 47.13,56.01 47.13,54.88C47.13,53.76 46.2,52.85 45.06,52.85C43.92,52.85 43,53.76 43,54.88C43,56.01 43.92,56.92 45.06,56.92Z" + android:strokeWidth="1" + android:strokeColor="#00000000" /> +</vector> diff --git a/startop/apps/ColorChanging/app/src/main/res/drawable/ic_launcher_background.xml b/startop/apps/ColorChanging/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 000000000000..0d025f9bf6b6 --- /dev/null +++ b/startop/apps/ColorChanging/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ +<?xml version="1.0" encoding="utf-8"?> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="108dp" + android:height="108dp" + android:viewportWidth="108" + android:viewportHeight="108"> + <path + android:fillColor="#008577" + android:pathData="M0,0h108v108h-108z" /> + <path + android:fillColor="#00000000" + android:pathData="M9,0L9,108" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M19,0L19,108" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M29,0L29,108" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M39,0L39,108" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M49,0L49,108" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M59,0L59,108" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M69,0L69,108" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M79,0L79,108" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M89,0L89,108" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M99,0L99,108" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M0,9L108,9" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M0,19L108,19" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M0,29L108,29" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M0,39L108,39" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M0,49L108,49" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M0,59L108,59" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M0,69L108,69" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M0,79L108,79" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M0,89L108,89" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M0,99L108,99" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M19,29L89,29" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M19,39L89,39" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M19,49L89,49" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M19,59L89,59" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M19,69L89,69" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M19,79L89,79" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M29,19L29,89" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M39,19L39,89" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M49,19L49,89" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M59,19L59,89" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M69,19L69,89" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + <path + android:fillColor="#00000000" + android:pathData="M79,19L79,89" + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> +</vector> diff --git a/startop/apps/ColorChanging/app/src/main/res/layout/activity_main.xml b/startop/apps/ColorChanging/app/src/main/res/layout/activity_main.xml new file mode 100644 index 000000000000..fb18df79cce2 --- /dev/null +++ b/startop/apps/ColorChanging/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,132 @@ +<?xml version="1.0" encoding="utf-8"?> +<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + tools:context=".MainActivity"> + + <Button + android:id="@+id/button" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="16dp" + android:layout_marginLeft="16dp" + android:layout_marginTop="16dp" + android:onClick="goRed" + android:text="red" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + <Button + android:id="@+id/button4" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginTop="16dp" + android:layout_marginEnd="16dp" + android:layout_marginRight="16dp" + android:onClick="goYellow" + android:text="YELLOW" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + <Button + android:id="@+id/button6" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="16dp" + android:layout_marginLeft="16dp" + android:layout_marginTop="32dp" + android:onClick="goGreen" + android:text="GREEN" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/button" /> + + <Button + android:id="@+id/button7" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="165dp" + android:layout_marginLeft="165dp" + android:layout_marginTop="115dp" + android:layout_marginEnd="165dp" + android:layout_marginRight="165dp" + android:onClick="goViolet" + android:text="VIOLET" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.428" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/button8" /> + + <Button + android:id="@+id/button10" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="165dp" + android:layout_marginLeft="165dp" + android:layout_marginTop="32dp" + android:layout_marginEnd="165dp" + android:layout_marginRight="165dp" + android:onClick="goBlue" + android:text="BLUE" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/button8" /> + + <Button + android:id="@+id/button8" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="165dp" + android:layout_marginLeft="165dp" + android:layout_marginTop="16dp" + android:layout_marginEnd="165dp" + android:layout_marginRight="165dp" + android:onClick="goOrange" + android:text="ORANGE" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + <Button + android:id="@+id/button11" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginTop="32dp" + android:layout_marginEnd="16dp" + android:layout_marginRight="16dp" + android:onClick="goIndigo" + android:text="INDIGO" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toBottomOf="@+id/button4" /> + + <Button + android:id="@+id/button12" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="162dp" + android:layout_marginLeft="162dp" + android:layout_marginTop="25dp" + android:layout_marginEnd="161dp" + android:layout_marginRight="161dp" + android:onClick="goCyan" + android:text="CYAN" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/button7" /> + + <Button + android:id="@+id/button13" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="162dp" + android:layout_marginLeft="162dp" + android:layout_marginTop="25dp" + android:layout_marginEnd="161dp" + android:layout_marginRight="161dp" + android:onClick="goBlack" + android:text="BLACK" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/button12" /> +</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file diff --git a/startop/apps/ColorChanging/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/startop/apps/ColorChanging/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 000000000000..eca70cfe52ea --- /dev/null +++ b/startop/apps/ColorChanging/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> + <background android:drawable="@drawable/ic_launcher_background" /> + <foreground android:drawable="@drawable/ic_launcher_foreground" /> +</adaptive-icon>
\ No newline at end of file diff --git a/startop/apps/ColorChanging/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/startop/apps/ColorChanging/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 000000000000..eca70cfe52ea --- /dev/null +++ b/startop/apps/ColorChanging/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> + <background android:drawable="@drawable/ic_launcher_background" /> + <foreground android:drawable="@drawable/ic_launcher_foreground" /> +</adaptive-icon>
\ No newline at end of file diff --git a/startop/apps/ColorChanging/app/src/main/res/mipmap-hdpi/ic_launcher.png b/startop/apps/ColorChanging/app/src/main/res/mipmap-hdpi/ic_launcher.png Binary files differnew file mode 100644 index 000000000000..898f3ed59ac9 --- /dev/null +++ b/startop/apps/ColorChanging/app/src/main/res/mipmap-hdpi/ic_launcher.png diff --git a/startop/apps/ColorChanging/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/startop/apps/ColorChanging/app/src/main/res/mipmap-hdpi/ic_launcher_round.png Binary files differnew file mode 100644 index 000000000000..dffca3601eba --- /dev/null +++ b/startop/apps/ColorChanging/app/src/main/res/mipmap-hdpi/ic_launcher_round.png diff --git a/startop/apps/ColorChanging/app/src/main/res/mipmap-mdpi/ic_launcher.png b/startop/apps/ColorChanging/app/src/main/res/mipmap-mdpi/ic_launcher.png Binary files differnew file mode 100644 index 000000000000..64ba76f75e9c --- /dev/null +++ b/startop/apps/ColorChanging/app/src/main/res/mipmap-mdpi/ic_launcher.png diff --git a/startop/apps/ColorChanging/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/startop/apps/ColorChanging/app/src/main/res/mipmap-mdpi/ic_launcher_round.png Binary files differnew file mode 100644 index 000000000000..dae5e082342f --- /dev/null +++ b/startop/apps/ColorChanging/app/src/main/res/mipmap-mdpi/ic_launcher_round.png diff --git a/startop/apps/ColorChanging/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/startop/apps/ColorChanging/app/src/main/res/mipmap-xhdpi/ic_launcher.png Binary files differnew file mode 100644 index 000000000000..e5ed46597ea8 --- /dev/null +++ b/startop/apps/ColorChanging/app/src/main/res/mipmap-xhdpi/ic_launcher.png diff --git a/startop/apps/ColorChanging/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/startop/apps/ColorChanging/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png Binary files differnew file mode 100644 index 000000000000..14ed0af35023 --- /dev/null +++ b/startop/apps/ColorChanging/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png diff --git a/startop/apps/ColorChanging/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/startop/apps/ColorChanging/app/src/main/res/mipmap-xxhdpi/ic_launcher.png Binary files differnew file mode 100644 index 000000000000..b0907cac3bfd --- /dev/null +++ b/startop/apps/ColorChanging/app/src/main/res/mipmap-xxhdpi/ic_launcher.png diff --git a/startop/apps/ColorChanging/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/startop/apps/ColorChanging/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png Binary files differnew file mode 100644 index 000000000000..d8ae03154975 --- /dev/null +++ b/startop/apps/ColorChanging/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png diff --git a/startop/apps/ColorChanging/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/startop/apps/ColorChanging/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png Binary files differnew file mode 100644 index 000000000000..2c18de9e6610 --- /dev/null +++ b/startop/apps/ColorChanging/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png diff --git a/startop/apps/ColorChanging/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/startop/apps/ColorChanging/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png Binary files differnew file mode 100644 index 000000000000..beed3cdd2c32 --- /dev/null +++ b/startop/apps/ColorChanging/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png diff --git a/startop/apps/ColorChanging/app/src/main/res/values/colors.xml b/startop/apps/ColorChanging/app/src/main/res/values/colors.xml new file mode 100644 index 000000000000..209790fed1cd --- /dev/null +++ b/startop/apps/ColorChanging/app/src/main/res/values/colors.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <color name="colorPrimary">#008577</color> + <color name="colorPrimaryDark">#00574B</color> + <color name="colorAccent">#D81B60</color> + <color name="black">#000000</color> + <color name="red">#F44336</color> + <color name="green">#2CF035</color> + <color name="blue">#2C70F0</color> + <color name="yellow">#F0EA2C</color> + <color name="gray">#D3D3D3</color> + <color name="orange">#E57E0A</color> + <color name="indigo">#4B0082</color> + <color name="violet">#EE82EE</color> + <color name="cyan">#00E8FF</color> +</resources> diff --git a/startop/apps/ColorChanging/app/src/main/res/values/strings.xml b/startop/apps/ColorChanging/app/src/main/res/values/strings.xml new file mode 100644 index 000000000000..ff062fb274bf --- /dev/null +++ b/startop/apps/ColorChanging/app/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ +<resources> + <string name="app_name">ColorChanging</string> +</resources> diff --git a/startop/apps/ColorChanging/app/src/main/res/values/styles.xml b/startop/apps/ColorChanging/app/src/main/res/values/styles.xml new file mode 100644 index 000000000000..5885930df6d1 --- /dev/null +++ b/startop/apps/ColorChanging/app/src/main/res/values/styles.xml @@ -0,0 +1,11 @@ +<resources> + + <!-- Base application theme. --> + <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> + <!-- Customize your theme here. --> + <item name="colorPrimary">@color/colorPrimary</item> + <item name="colorPrimaryDark">@color/colorPrimaryDark</item> + <item name="colorAccent">@color/colorAccent</item> + </style> + +</resources> diff --git a/startop/apps/ColorChanging/app/src/test/java/com/android/startop/colorchanging/ExampleUnitTest.java b/startop/apps/ColorChanging/app/src/test/java/com/android/startop/colorchanging/ExampleUnitTest.java new file mode 100644 index 000000000000..8423674b9d75 --- /dev/null +++ b/startop/apps/ColorChanging/app/src/test/java/com/android/startop/colorchanging/ExampleUnitTest.java @@ -0,0 +1,17 @@ +package com.android.startop.colorchanging; + +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Example local unit test, which will execute on the development machine (host). + * + * @see <a href="http://d.android.com/tools/testing">Testing documentation</a> + */ +public class ExampleUnitTest { + @Test + public void addition_isCorrect() { + assertEquals(4, 2 + 2); + } +}
\ No newline at end of file diff --git a/startop/apps/ColorChanging/build.gradle b/startop/apps/ColorChanging/build.gradle new file mode 100644 index 000000000000..a960ab34dc6e --- /dev/null +++ b/startop/apps/ColorChanging/build.gradle @@ -0,0 +1,24 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. + +buildscript { + repositories { + google() + jcenter() + } + dependencies { + classpath 'com.android.tools.build:gradle:3.4.1' + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files + } +} + +allprojects { + repositories { + google() + jcenter() + } +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/startop/apps/ColorChanging/gradle.properties b/startop/apps/ColorChanging/gradle.properties new file mode 100644 index 000000000000..199d16ede38c --- /dev/null +++ b/startop/apps/ColorChanging/gradle.properties @@ -0,0 +1,20 @@ +# Project-wide Gradle settings. +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx1536m +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true +# AndroidX package structure to make it clearer which packages are bundled with the +# Android operating system, and which are packaged with your app's APK +# https://developer.android.com/topic/libraries/support-library/androidx-rn +android.useAndroidX=true +# Automatically convert third-party libraries to use AndroidX +android.enableJetifier=true + diff --git a/startop/apps/ColorChanging/gradle/wrapper/gradle-wrapper.jar b/startop/apps/ColorChanging/gradle/wrapper/gradle-wrapper.jar Binary files differnew file mode 100644 index 000000000000..f6b961fd5a86 --- /dev/null +++ b/startop/apps/ColorChanging/gradle/wrapper/gradle-wrapper.jar diff --git a/startop/apps/ColorChanging/gradle/wrapper/gradle-wrapper.properties b/startop/apps/ColorChanging/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000000..09f2718ae856 --- /dev/null +++ b/startop/apps/ColorChanging/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Mon Jun 17 13:40:58 PDT 2019 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip diff --git a/startop/apps/ColorChanging/gradlew b/startop/apps/ColorChanging/gradlew new file mode 100755 index 000000000000..cccdd3d517fc --- /dev/null +++ b/startop/apps/ColorChanging/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/startop/apps/ColorChanging/gradlew.bat b/startop/apps/ColorChanging/gradlew.bat new file mode 100644 index 000000000000..e95643d6a2ca --- /dev/null +++ b/startop/apps/ColorChanging/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/startop/apps/ColorChanging/settings.gradle b/startop/apps/ColorChanging/settings.gradle new file mode 100644 index 000000000000..e7b4def49cb5 --- /dev/null +++ b/startop/apps/ColorChanging/settings.gradle @@ -0,0 +1 @@ +include ':app' diff --git a/telecomm/java/android/telecom/PhoneAccount.java b/telecomm/java/android/telecom/PhoneAccount.java index 2ffad0345c64..f201cc1f9375 100644 --- a/telecomm/java/android/telecom/PhoneAccount.java +++ b/telecomm/java/android/telecom/PhoneAccount.java @@ -17,6 +17,7 @@ package android.telecom; import android.annotation.SystemApi; +import android.content.Intent; import android.graphics.drawable.Icon; import android.net.Uri; import android.os.Bundle; @@ -24,7 +25,6 @@ import android.os.Parcel; import android.os.Parcelable; import android.text.TextUtils; -import java.lang.String; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -314,7 +314,22 @@ public final class PhoneAccount implements Parcelable { */ public static final int CAPABILITY_RTT = 0x1000; - /* NEXT CAPABILITY: 0x2000 */ + /** + * Flag indicating that this {@link PhoneAccount} is the preferred SIM subscription for + * emergency calls. A {@link PhoneAccount} that sets this capabilitiy must also + * set the {@link #CAPABILITY_SIM_SUBSCRIPTION} and {@link #CAPABILITY_PLACE_EMERGENCY_CALLS} + * capabilities. There should only be one emergency preferred {@link PhoneAccount}. + * <p> + * When set, Telecom will prefer this {@link PhoneAccount} over others for emergency calling, + * even if the emergency call was placed with a specific {@link PhoneAccount} set using the + * extra{@link TelecomManager#EXTRA_PHONE_ACCOUNT_HANDLE} in + * {@link Intent#ACTION_CALL_EMERGENCY} or {@link TelecomManager#placeCall(Uri, Bundle)}. + * + * @hide + */ + public static final int CAPABILITY_EMERGENCY_PREFERRED = 0x2000; + + /* NEXT CAPABILITY: 0x4000 */ /** * URI scheme for telephone number URIs. @@ -1020,6 +1035,9 @@ public final class PhoneAccount implements Parcelable { if (hasCapabilities(CAPABILITY_PLACE_EMERGENCY_CALLS)) { sb.append("PlaceEmerg "); } + if (hasCapabilities(CAPABILITY_EMERGENCY_PREFERRED)) { + sb.append("EmerPrefer "); + } if (hasCapabilities(CAPABILITY_EMERGENCY_VIDEO_CALLING)) { sb.append("EmergVideo "); } diff --git a/telecomm/java/android/telecom/TelecomManager.java b/telecomm/java/android/telecom/TelecomManager.java index 1f701587412e..3b4b86807121 100644 --- a/telecomm/java/android/telecom/TelecomManager.java +++ b/telecomm/java/android/telecom/TelecomManager.java @@ -1800,6 +1800,13 @@ public class TelecomManager { * Self-managed {@link ConnectionService}s require permission * {@link android.Manifest.permission#MANAGE_OWN_CALLS}. * + * <p class="note"><strong>Note:</strong> If this method is used to place an emergency call, it + * is not guaranteed that the call will be placed on the {@link PhoneAccount} provided in + * the {@link #EXTRA_PHONE_ACCOUNT_HANDLE} extra (if specified) and may be placed on another + * {@link PhoneAccount} with the {@link PhoneAccount#CAPABILITY_PLACE_EMERGENCY_CALLS} + * capability, depending on external factors, such as network conditions and Modem/SIM status. + * </p> + * * @param address The address to make the call to. * @param extras Bundle of extras to use with the call. */ diff --git a/telephony/java/android/provider/Telephony.java b/telephony/java/android/provider/Telephony.java index 83aa52176b87..094f8c2eb053 100644 --- a/telephony/java/android/provider/Telephony.java +++ b/telephony/java/android/provider/Telephony.java @@ -2975,6 +2975,7 @@ public final class Telephony { * The {@code content://} style URL for this table. Can be appended with a part ID to * address individual parts. */ + @NonNull public static final Uri CONTENT_URI = Uri.withAppendedPath(Mms.CONTENT_URI, "part"); /** diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java index 77e35e1530bf..31cd60807570 100755 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -2649,6 +2649,68 @@ public class CarrierConfigManager { public static final String KEY_AUTO_CANCEL_CS_REJECT_NOTIFICATION = "carrier_auto_cancel_cs_notification"; + /** + * GPS configs. See android.hardware.gnss@1.0 IGnssConfiguration. + * @hide + */ + public static final class Gps { + /** Prefix of all Gps.KEY_* constants. */ + public static final String KEY_PREFIX = "gps."; + + /** + * Location information during (and after) an emergency call is only provided over control + * plane signaling from the network. + * @hide + */ + public static final int SUPL_EMERGENCY_MODE_TYPE_CP_ONLY = 0; + + /** + * Location information during (and after) an emergency call is provided over the data + * plane and serviced by the framework GNSS service, but if it fails, the carrier also + * supports control plane backup signaling. + * @hide + */ + public static final int SUPL_EMERGENCY_MODE_TYPE_CP_FALLBACK = 1; + + /** + * Location information during (and after) an emergency call is provided over the data plane + * and serviced by the framework GNSS service only. There is no backup signalling over the + * control plane if it fails. + * @hide + */ + public static final int SUPL_EMERGENCY_MODE_TYPE_DP_ONLY = 2; + + /** + * Control Plane / SUPL NI emergency extension time in seconds. Default to "0". + */ + public static final String KEY_ES_EXTENSION_SEC_STRING = KEY_PREFIX + "es_extension_sec"; + + /** + * Determines whether or not SUPL ES mode supports a control-plane mechanism to get a user's + * location in the event that data plane SUPL fails or is otherwise unavailable. + * <p> + * An integer value determines the support type of this carrier. If this carrier only + * supports data plane SUPL ES, then the value will be + * {@link #SUPL_EMERGENCY_MODE_TYPE_DP_ONLY}. If the carrier supports control plane fallback + * for emergency SUPL, the value will be {@link #SUPL_EMERGENCY_MODE_TYPE_CP_FALLBACK}. + * If the carrier does not support data plane SUPL using the framework, the value will be + * {@link #SUPL_EMERGENCY_MODE_TYPE_CP_ONLY}. + * <p> + * The default value for this configuration is {@link #SUPL_EMERGENCY_MODE_TYPE_CP_ONLY}. + * @hide + */ + public static final String KEY_ES_SUPL_CONTROL_PLANE_SUPPORT_INT = KEY_PREFIX + + "es_supl_control_plane_support_int"; + + private static PersistableBundle getDefaults() { + PersistableBundle defaults = new PersistableBundle(); + defaults.putString(KEY_ES_EXTENSION_SEC_STRING, "0"); + defaults.putInt(KEY_ES_SUPL_CONTROL_PLANE_SUPPORT_INT, + SUPL_EMERGENCY_MODE_TYPE_CP_ONLY); + return defaults; + } + } + /** * An int array containing CDMA enhanced roaming indicator values for Home (non-roaming) network. * The default values come from 3GPP2 C.R1001 table 8.1-1. @@ -3133,6 +3195,7 @@ public class CarrierConfigManager { sDefaults.putLong(KEY_OPPORTUNISTIC_NETWORK_ENTRY_OR_EXIT_HYSTERESIS_TIME_LONG, 10000); /* Default value is 10 seconds. */ sDefaults.putLong(KEY_OPPORTUNISTIC_NETWORK_DATA_SWITCH_HYSTERESIS_TIME_LONG, 10000); + sDefaults.putAll(Gps.getDefaults()); sDefaults.putIntArray(KEY_CDMA_ENHANCED_ROAMING_INDICATOR_FOR_HOME_NETWORK_INT_ARRAY, new int[] { 1 /* Roaming Indicator Off */ diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java index 6557886d3a5c..1c048571f12f 100644 --- a/telephony/java/android/telephony/SubscriptionManager.java +++ b/telephony/java/android/telephony/SubscriptionManager.java @@ -3078,18 +3078,10 @@ public class SubscriptionManager { } /** - * Returns whether the subscription is enabled or not. This is different from activated - * or deactivated for two aspects. 1) For when user disables a physical subscription, we - * actually disable the modem because we can't switch off the subscription. 2) For eSIM, - * user may enable one subscription but the system may activate another temporarily. In this - * case, user enabled one is different from current active one. - - * @param subscriptionId The subscription it asks about. - * @return whether it's enabled or not. {@code true} if user set this subscription enabled - * earlier, or user never set subscription enable / disable on this slot explicitly, and - * this subscription is currently active. Otherwise, it returns {@code false}. - * + * DO NOT USE. + * This API is designed for features that are not finished at this point. Do not call this API. * @hide + * TODO b/135547512: further clean up */ @SystemApi @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE) @@ -3107,14 +3099,10 @@ public class SubscriptionManager { } /** - * Get which subscription is enabled on this slot. See {@link #isSubscriptionEnabled(int)} - * for more details. - * - * @param slotIndex which slot it asks about. - * @return which subscription is enabled on this slot. If there's no enabled subscription - * in this slot, it will return {@link SubscriptionManager#INVALID_SUBSCRIPTION_ID}. - * + * DO NOT USE. + * This API is designed for features that are not finished at this point. Do not call this API. * @hide + * TODO b/135547512: further clean up */ @SystemApi @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE) diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index 03a5c74be766..fe812151489b 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -4777,7 +4777,8 @@ public class TelephonyManager { ITelephony telephony = getITelephony(); if (telephony == null) return DATA_ACTIVITY_NONE; - return telephony.getDataActivity(); + return telephony.getDataActivityForSubId( + getSubId(SubscriptionManager.getActiveDataSubscriptionId())); } catch (RemoteException ex) { // the phone process is restarting. return DATA_ACTIVITY_NONE; @@ -4825,7 +4826,8 @@ public class TelephonyManager { ITelephony telephony = getITelephony(); if (telephony == null) return DATA_DISCONNECTED; - return telephony.getDataState(); + return telephony.getDataStateForSubId( + getSubId(SubscriptionManager.getActiveDataSubscriptionId())); } catch (RemoteException ex) { // the phone process is restarting. return DATA_DISCONNECTED; diff --git a/telephony/java/android/telephony/ims/RcsControllerCall.java b/telephony/java/android/telephony/ims/RcsControllerCall.java index a2d68ad0cdb0..ce03c3c799bb 100644 --- a/telephony/java/android/telephony/ims/RcsControllerCall.java +++ b/telephony/java/android/telephony/ims/RcsControllerCall.java @@ -19,10 +19,11 @@ package android.telephony.ims; import android.content.Context; import android.os.RemoteException; import android.os.ServiceManager; -import android.telephony.ims.aidl.IRcs; +import android.telephony.ims.aidl.IRcsMessage; /** - * A wrapper class around RPC calls that {@link RcsMessageStore} APIs to minimize boilerplate code. + * A wrapper class around RPC calls that {@link RcsMessageManager} APIs to minimize boilerplate + * code. * * @hide - not meant for public use */ @@ -34,13 +35,14 @@ class RcsControllerCall { } <R> R call(RcsServiceCall<R> serviceCall) throws RcsMessageStoreException { - IRcs iRcs = IRcs.Stub.asInterface(ServiceManager.getService(Context.TELEPHONY_RCS_SERVICE)); - if (iRcs == null) { + IRcsMessage iRcsMessage = IRcsMessage.Stub.asInterface(ServiceManager.getService( + Context.TELEPHONY_RCS_MESSAGE_SERVICE)); + if (iRcsMessage == null) { throw new RcsMessageStoreException("Could not connect to RCS storage service"); } try { - return serviceCall.methodOnIRcs(iRcs, mContext.getOpPackageName()); + return serviceCall.methodOnIRcs(iRcsMessage, mContext.getOpPackageName()); } catch (RemoteException exception) { throw new RcsMessageStoreException(exception.getMessage()); } @@ -48,17 +50,17 @@ class RcsControllerCall { void callWithNoReturn(RcsServiceCallWithNoReturn serviceCall) throws RcsMessageStoreException { - call((iRcs, callingPackage) -> { - serviceCall.methodOnIRcs(iRcs, callingPackage); + call((iRcsMessage, callingPackage) -> { + serviceCall.methodOnIRcs(iRcsMessage, callingPackage); return null; }); } interface RcsServiceCall<R> { - R methodOnIRcs(IRcs iRcs, String callingPackage) throws RemoteException; + R methodOnIRcs(IRcsMessage iRcs, String callingPackage) throws RemoteException; } interface RcsServiceCallWithNoReturn { - void methodOnIRcs(IRcs iRcs, String callingPackage) throws RemoteException; + void methodOnIRcs(IRcsMessage iRcs, String callingPackage) throws RemoteException; } } diff --git a/telephony/java/android/telephony/ims/RcsManager.java b/telephony/java/android/telephony/ims/RcsManager.java deleted file mode 100644 index 0d6ca3cc58e1..000000000000 --- a/telephony/java/android/telephony/ims/RcsManager.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (C) 2019 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.telephony.ims; - -import android.annotation.SystemService; -import android.content.Context; - -/** - * The manager class for RCS related utilities. - * - * @hide - */ -@SystemService(Context.TELEPHONY_RCS_SERVICE) -public class RcsManager { - private final RcsMessageStore mRcsMessageStore; - - /** - * @hide - */ - public RcsManager(Context context) { - mRcsMessageStore = new RcsMessageStore(context); - } - - /** - * Returns an instance of {@link RcsMessageStore} - */ - public RcsMessageStore getRcsMessageStore() { - return mRcsMessageStore; - } -} diff --git a/telephony/java/android/telephony/ims/RcsMessageStore.java b/telephony/java/android/telephony/ims/RcsMessageManager.java index d1127984f126..a1c7c0fefab2 100644 --- a/telephony/java/android/telephony/ims/RcsMessageStore.java +++ b/telephony/java/android/telephony/ims/RcsMessageManager.java @@ -18,6 +18,7 @@ package android.telephony.ims; import android.annotation.NonNull; import android.annotation.Nullable; +import android.annotation.SystemService; import android.annotation.WorkerThread; import android.content.Context; import android.net.Uri; @@ -25,15 +26,20 @@ import android.net.Uri; import java.util.List; /** - * RcsMessageStore is the application interface to RcsProvider and provides access methods to + * RcsMessageManager is the application interface to RcsProvider and provides access methods to * RCS related database tables. * * @hide */ -public class RcsMessageStore { +@SystemService(Context.TELEPHONY_RCS_MESSAGE_SERVICE) +public class RcsMessageManager { RcsControllerCall mRcsControllerCall; - RcsMessageStore(Context context) { + /** + * Use {@link Context#getSystemService(String)} to get an instance of this service. + * @hide + */ + public RcsMessageManager(Context context) { mRcsControllerCall = new RcsControllerCall(context); } diff --git a/telephony/java/android/telephony/ims/aidl/IRcs.aidl b/telephony/java/android/telephony/ims/aidl/IRcsMessage.aidl index 9ee15daf67b9..0ae6303f024e 100644 --- a/telephony/java/android/telephony/ims/aidl/IRcs.aidl +++ b/telephony/java/android/telephony/ims/aidl/IRcsMessage.aidl @@ -35,7 +35,7 @@ import android.telephony.ims.RcsThreadQueryResultParcelable; * RPC definition between RCS storage APIs and phone process. * {@hide} */ -interface IRcs { +interface IRcsMessage { ///////////////////////// // RcsMessageStore APIs ///////////////////////// diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl index 1aba95bf5e5a..da80774e8ed0 100644 --- a/telephony/java/com/android/internal/telephony/ITelephony.aidl +++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl @@ -308,18 +308,46 @@ interface ITelephony { */ List<NeighboringCellInfo> getNeighboringCellInfo(String callingPkg); - @UnsupportedAppUsage - int getCallState(); + @UnsupportedAppUsage + int getCallState(); /** * Returns the call state for a slot. */ - int getCallStateForSlot(int slotIndex); + int getCallStateForSlot(int slotIndex); + + /** + * Replaced by getDataActivityForSubId. + */ + int getDataActivity(); + + /** + * Returns a constant indicating the type of activity on a data connection + * (cellular). + * + * @see #DATA_ACTIVITY_NONE + * @see #DATA_ACTIVITY_IN + * @see #DATA_ACTIVITY_OUT + * @see #DATA_ACTIVITY_INOUT + * @see #DATA_ACTIVITY_DORMANT + */ + int getDataActivityForSubId(int subId); + + /** + * Replaced by getDataStateForSubId. + */ + int getDataState(); - @UnsupportedAppUsage - int getDataActivity(); - @UnsupportedAppUsage - int getDataState(); + /** + * Returns a constant indicating the current data connection state + * (cellular). + * + * @see #DATA_DISCONNECTED + * @see #DATA_CONNECTING + * @see #DATA_CONNECTED + * @see #DATA_SUSPENDED + */ + int getDataStateForSubId(int subId); /** * Returns the current active phone type as integer. diff --git a/tests/BackgroundDexOptServiceIntegrationTests/Android.bp b/tests/BackgroundDexOptServiceIntegrationTests/Android.bp index 036f84526889..a85d129b013a 100644 --- a/tests/BackgroundDexOptServiceIntegrationTests/Android.bp +++ b/tests/BackgroundDexOptServiceIntegrationTests/Android.bp @@ -17,7 +17,7 @@ android_test { name: "BackgroundDexOptServiceIntegrationTests", srcs: ["src/**/*.java"], - static_libs: ["android-support-test"], + static_libs: ["androidx.test.rules"], platform_apis: true, test_suites: ["device-tests"], certificate: "platform", diff --git a/tests/BackgroundDexOptServiceIntegrationTests/AndroidManifest.xml b/tests/BackgroundDexOptServiceIntegrationTests/AndroidManifest.xml index afae155f88fe..aec9f77cf922 100644 --- a/tests/BackgroundDexOptServiceIntegrationTests/AndroidManifest.xml +++ b/tests/BackgroundDexOptServiceIntegrationTests/AndroidManifest.xml @@ -34,7 +34,7 @@ </application> <instrumentation - android:name="android.support.test.runner.AndroidJUnitRunner" + android:name="androidx.test.runner.AndroidJUnitRunner" android:targetPackage="com.android.frameworks.bgdexopttest" android:label="Integration test for BackgroundDexOptService" /> </manifest> diff --git a/tests/BackgroundDexOptServiceIntegrationTests/AndroidTest.xml b/tests/BackgroundDexOptServiceIntegrationTests/AndroidTest.xml index 9bb1e280b861..a532422a38d3 100644 --- a/tests/BackgroundDexOptServiceIntegrationTests/AndroidTest.xml +++ b/tests/BackgroundDexOptServiceIntegrationTests/AndroidTest.xml @@ -50,6 +50,6 @@ <option name="test-tag" value="BackgroundDexOptServiceIntegrationTests"/> <test class="com.android.tradefed.testtype.AndroidJUnitTest"> <option name="package" value="com.android.frameworks.bgdexopttest"/> - <option name="runner" value="android.support.test.runner.AndroidJUnitRunner"/> + <option name="runner" value="androidx.test.runner.AndroidJUnitRunner"/> </test> </configuration> diff --git a/tests/BackgroundDexOptServiceIntegrationTests/src/com/android/server/pm/BackgroundDexOptServiceIntegrationTests.java b/tests/BackgroundDexOptServiceIntegrationTests/src/com/android/server/pm/BackgroundDexOptServiceIntegrationTests.java index e247951f16ef..7d826f7172da 100644 --- a/tests/BackgroundDexOptServiceIntegrationTests/src/com/android/server/pm/BackgroundDexOptServiceIntegrationTests.java +++ b/tests/BackgroundDexOptServiceIntegrationTests/src/com/android/server/pm/BackgroundDexOptServiceIntegrationTests.java @@ -19,13 +19,14 @@ package com.android.server.pm; import android.app.AlarmManager; import android.content.Context; import android.os.Environment; +import android.os.ParcelFileDescriptor; import android.os.SystemProperties; import android.os.storage.StorageManager; -import android.support.test.InstrumentationRegistry; import android.util.Log; +import androidx.test.InstrumentationRegistry; + import org.junit.After; -import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; import org.junit.BeforeClass; @@ -34,6 +35,7 @@ import org.junit.runner.RunWith; import org.junit.runners.JUnit4; import java.io.File; +import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; @@ -141,27 +143,19 @@ public final class BackgroundDexOptServiceIntegrationTests { // Run the command and return the stdout. private static String runShellCommand(String cmd) throws IOException { Log.i(TAG, String.format("running command: '%s'", cmd)); - long startTime = System.nanoTime(); - Process p = Runtime.getRuntime().exec(cmd); - int res; - try { - res = p.waitFor(); - } catch (InterruptedException e) { - throw new RuntimeException(e); + ParcelFileDescriptor pfd = InstrumentationRegistry.getInstrumentation().getUiAutomation() + .executeShellCommand(cmd); + byte[] buf = new byte[512]; + int bytesRead; + FileInputStream fis = new ParcelFileDescriptor.AutoCloseInputStream(pfd); + StringBuilder stdout = new StringBuilder(); + while ((bytesRead = fis.read(buf)) != -1) { + stdout.append(new String(buf, 0, bytesRead)); } - String stdout = inputStreamToString(p.getInputStream()); - String stderr = inputStreamToString(p.getErrorStream()); - long elapsedTime = System.nanoTime() - startTime; - Log.i(TAG, String.format("ran command: '%s' in %d ms with return code %d", cmd, - TimeUnit.NANOSECONDS.toMillis(elapsedTime), res)); + fis.close(); Log.i(TAG, "stdout"); - Log.i(TAG, stdout); - Log.i(TAG, "stderr"); - Log.i(TAG, stderr); - if (res != 0) { - throw new RuntimeException(String.format("failed command: '%s'", cmd)); - } - return stdout; + Log.i(TAG, stdout.toString()); + return stdout.toString(); } // Run the command and return the stdout split by lines. @@ -209,7 +203,10 @@ public final class BackgroundDexOptServiceIntegrationTests { // TODO(aeubanks): figure out how to get scheduled bg-dexopt to run private static void runBackgroundDexOpt() throws IOException { - runShellCommand("cmd package bg-dexopt-job " + PACKAGE_NAME); + String result = runShellCommand("cmd package bg-dexopt-job " + PACKAGE_NAME); + if (!result.trim().equals("Success")) { + throw new IllegalStateException("Expected command success, received >" + result + "<"); + } } // Set the time ahead of the last use time of the test app in days. diff --git a/tests/CanvasCompare/src/com/android/test/hwuicompare/errorCalculator.rs b/tests/CanvasCompare/src/com/android/test/hwuicompare/errorCalculator.rscript index 0a1742ef3867..0a1742ef3867 100644 --- a/tests/CanvasCompare/src/com/android/test/hwuicompare/errorCalculator.rs +++ b/tests/CanvasCompare/src/com/android/test/hwuicompare/errorCalculator.rscript diff --git a/tests/DexLoggerIntegrationTests/src/com/android/server/pm/dex/DexLoggerIntegrationTests.java b/tests/DexLoggerIntegrationTests/src/com/android/server/pm/dex/DexLoggerIntegrationTests.java index d8b3b2086335..460022e2c83b 100644 --- a/tests/DexLoggerIntegrationTests/src/com/android/server/pm/dex/DexLoggerIntegrationTests.java +++ b/tests/DexLoggerIntegrationTests/src/com/android/server/pm/dex/DexLoggerIntegrationTests.java @@ -28,6 +28,7 @@ import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; @@ -108,6 +109,7 @@ public final class DexLoggerIntegrationTests { } @Test + @Ignore // Should invoke shell command via UiAutomation: b/137574238 public void testDexLoggerReconcileGeneratesEvents() throws Exception { int[] tagList = new int[] { SNET_TAG }; List<EventLog.Event> events = new ArrayList<>(); diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index 4b86c820975c..e08cb1622a90 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -208,6 +208,8 @@ import com.android.server.net.NetworkPinner; import com.android.server.net.NetworkPolicyManagerInternal; import com.android.testutils.ExceptionUtils; import com.android.testutils.HandlerUtilsKt; +import com.android.testutils.RecorderCallback.CallbackRecord; +import com.android.testutils.TestableNetworkCallback; import org.junit.After; import org.junit.Before; @@ -234,7 +236,6 @@ import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.List; -import java.util.Objects; import java.util.Set; import java.util.concurrent.CountDownLatch; import java.util.concurrent.Executor; @@ -243,7 +244,8 @@ import java.util.concurrent.Executors; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; -import java.util.function.Predicate; + +import kotlin.reflect.KClass; /** * Tests for {@link ConnectivityService}. @@ -467,7 +469,7 @@ public class ConnectivityServiceTest { fail("expected race condition at least once in " + attempts + " attempts"); } - private class MockNetworkAgent { + private class MockNetworkAgent implements TestableNetworkCallback.HasNetwork { private static final int VALIDATION_RESULT_BASE = NETWORK_VALIDATION_PROBE_DNS | NETWORK_VALIDATION_PROBE_HTTP | NETWORK_VALIDATION_PROBE_HTTPS; @@ -1703,281 +1705,33 @@ public class ConnectivityServiceTest { mCm.getDefaultRequest().networkCapabilities)); } - enum CallbackState { - NONE, - AVAILABLE, - NETWORK_CAPABILITIES, - LINK_PROPERTIES, - SUSPENDED, - RESUMED, - LOSING, - LOST, - UNAVAILABLE, - BLOCKED_STATUS - } - - private static class CallbackInfo { - public final CallbackState state; - public final Network network; - public final Object arg; - public CallbackInfo(CallbackState s, Network n, Object o) { - state = s; network = n; arg = o; - } - public String toString() { - return String.format("%s (%s) (%s)", state, network, arg); - } - @Override - public boolean equals(Object o) { - if (!(o instanceof CallbackInfo)) return false; - // Ignore timeMs, since it's unpredictable. - CallbackInfo other = (CallbackInfo) o; - return (state == other.state) && Objects.equals(network, other.network); - } - @Override - public int hashCode() { - return Objects.hash(state, network); - } - } - /** * Utility NetworkCallback for testing. The caller must explicitly test for all the callbacks * this class receives, by calling expectCallback() exactly once each time a callback is * received. assertNoCallback may be called at any time. */ - private class TestNetworkCallback extends NetworkCallback { - private final LinkedBlockingQueue<CallbackInfo> mCallbacks = new LinkedBlockingQueue<>(); - private Network mLastAvailableNetwork; - - protected void setLastCallback(CallbackState state, Network network, Object o) { - mCallbacks.offer(new CallbackInfo(state, network, o)); - } - - @Override - public void onAvailable(Network network) { - mLastAvailableNetwork = network; - setLastCallback(CallbackState.AVAILABLE, network, null); - } - - @Override - public void onCapabilitiesChanged(Network network, NetworkCapabilities netCap) { - setLastCallback(CallbackState.NETWORK_CAPABILITIES, network, netCap); - } - - @Override - public void onLinkPropertiesChanged(Network network, LinkProperties linkProp) { - setLastCallback(CallbackState.LINK_PROPERTIES, network, linkProp); - } - + private class TestNetworkCallback extends TestableNetworkCallback { @Override - public void onUnavailable() { - setLastCallback(CallbackState.UNAVAILABLE, null, null); - } - - @Override - public void onNetworkSuspended(Network network) { - setLastCallback(CallbackState.SUSPENDED, network, null); - } - - @Override - public void onNetworkResumed(Network network) { - setLastCallback(CallbackState.RESUMED, network, null); - } - - @Override - public void onLosing(Network network, int maxMsToLive) { - setLastCallback(CallbackState.LOSING, network, maxMsToLive /* autoboxed int */); - } - - @Override - public void onLost(Network network) { - mLastAvailableNetwork = null; - setLastCallback(CallbackState.LOST, network, null); + public void assertNoCallback() { + // TODO: better support this use case in TestableNetworkCallback + waitForIdle(); + assertNoCallback(0 /* timeout */); } @Override - public void onBlockedStatusChanged(Network network, boolean blocked) { - setLastCallback(CallbackState.BLOCKED_STATUS, network, blocked); - } - - public Network getLastAvailableNetwork() { - return mLastAvailableNetwork; - } - - CallbackInfo nextCallback(int timeoutMs) throws InterruptedException { - CallbackInfo cb = null; - cb = mCallbacks.poll(timeoutMs, TimeUnit.MILLISECONDS); - if (cb == null) { - // LinkedBlockingQueue.poll() returns null if it timeouts. - fail("Did not receive callback after " + timeoutMs + "ms"); - } - return cb; - } - - CallbackInfo expectCallback(CallbackState state, MockNetworkAgent agent, int timeoutMs) - throws Exception { - final Network expectedNetwork = (agent != null) ? agent.getNetwork() : null; - CallbackInfo expected = new CallbackInfo(state, expectedNetwork, 0); - CallbackInfo actual = nextCallback(timeoutMs); - assertEquals("Unexpected callback:", expected, actual); - - if (state == CallbackState.LOSING) { + public <T extends CallbackRecord> T expectCallback(final KClass<T> type, final HasNetwork n, + final long timeoutMs) { + final T callback = super.expectCallback(type, n, timeoutMs); + if (callback instanceof CallbackRecord.Losing) { + // TODO : move this to the specific test(s) needing this rather than here. + final CallbackRecord.Losing losing = (CallbackRecord.Losing) callback; + final int maxMsToLive = losing.getMaxMsToLive(); String msg = String.format( "Invalid linger time value %d, must be between %d and %d", - actual.arg, 0, mService.mLingerDelayMs); - int maxMsToLive = (Integer) actual.arg; + maxMsToLive, 0, mService.mLingerDelayMs); assertTrue(msg, 0 <= maxMsToLive && maxMsToLive <= mService.mLingerDelayMs); } - - return actual; - } - - CallbackInfo expectCallback(CallbackState state, MockNetworkAgent agent) throws Exception { - return expectCallback(state, agent, TEST_CALLBACK_TIMEOUT_MS); - } - - CallbackInfo expectCallbackLike(Predicate<CallbackInfo> fn) throws Exception { - return expectCallbackLike(fn, TEST_CALLBACK_TIMEOUT_MS); - } - - CallbackInfo expectCallbackLike(Predicate<CallbackInfo> fn, int timeoutMs) - throws Exception { - int timeLeft = timeoutMs; - while (timeLeft > 0) { - long start = SystemClock.elapsedRealtime(); - CallbackInfo info = nextCallback(timeLeft); - if (fn.test(info)) { - return info; - } - timeLeft -= (SystemClock.elapsedRealtime() - start); - } - fail("Did not receive expected callback after " + timeoutMs + "ms"); - return null; - } - - // Expects onAvailable and the callbacks that follow it. These are: - // - onSuspended, iff the network was suspended when the callbacks fire. - // - onCapabilitiesChanged. - // - onLinkPropertiesChanged. - // - onBlockedStatusChanged. - // - // @param agent the network to expect the callbacks on. - // @param expectSuspended whether to expect a SUSPENDED callback. - // @param expectValidated the expected value of the VALIDATED capability in the - // onCapabilitiesChanged callback. - // @param timeoutMs how long to wait for the callbacks. - void expectAvailableCallbacks(MockNetworkAgent agent, boolean expectSuspended, - boolean expectValidated, boolean expectBlocked, int timeoutMs) throws Exception { - expectCallback(CallbackState.AVAILABLE, agent, timeoutMs); - if (expectSuspended) { - expectCallback(CallbackState.SUSPENDED, agent, timeoutMs); - } - if (expectValidated) { - expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, agent, timeoutMs); - } else { - expectCapabilitiesWithout(NET_CAPABILITY_VALIDATED, agent, timeoutMs); - } - expectCallback(CallbackState.LINK_PROPERTIES, agent, timeoutMs); - expectBlockedStatusCallback(expectBlocked, agent); - } - - // Expects the available callbacks (validated), plus onSuspended. - void expectAvailableAndSuspendedCallbacks(MockNetworkAgent agent, boolean expectValidated) - throws Exception { - expectAvailableCallbacks(agent, true, expectValidated, false, TEST_CALLBACK_TIMEOUT_MS); - } - - void expectAvailableCallbacksValidated(MockNetworkAgent agent) - throws Exception { - expectAvailableCallbacks(agent, false, true, false, TEST_CALLBACK_TIMEOUT_MS); - } - - void expectAvailableCallbacksValidatedAndBlocked(MockNetworkAgent agent) throws Exception { - expectAvailableCallbacks(agent, false, true, true, TEST_CALLBACK_TIMEOUT_MS); - } - - void expectAvailableCallbacksUnvalidated(MockNetworkAgent agent) throws Exception { - expectAvailableCallbacks(agent, false, false, false, TEST_CALLBACK_TIMEOUT_MS); - } - - void expectAvailableCallbacksUnvalidatedAndBlocked(MockNetworkAgent agent) - throws Exception { - expectAvailableCallbacks(agent, false, false, true, TEST_CALLBACK_TIMEOUT_MS); - } - - // Expects the available callbacks (where the onCapabilitiesChanged must contain the - // VALIDATED capability), plus another onCapabilitiesChanged which is identical to the - // one we just sent. - // TODO: this is likely a bug. Fix it and remove this method. - void expectAvailableDoubleValidatedCallbacks(MockNetworkAgent agent) throws Exception { - expectCallback(CallbackState.AVAILABLE, agent, TEST_CALLBACK_TIMEOUT_MS); - NetworkCapabilities nc1 = expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, agent); - expectCallback(CallbackState.LINK_PROPERTIES, agent, TEST_CALLBACK_TIMEOUT_MS); - // Implicitly check the network is allowed to use. - // TODO: should we need to consider if network is in blocked status in this case? - expectBlockedStatusCallback(false, agent); - NetworkCapabilities nc2 = expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, agent); - assertEquals(nc1, nc2); - } - - // Expects the available callbacks where the onCapabilitiesChanged must not have validated, - // then expects another onCapabilitiesChanged that has the validated bit set. This is used - // when a network connects and satisfies a callback, and then immediately validates. - void expectAvailableThenValidatedCallbacks(MockNetworkAgent agent) throws Exception { - expectAvailableCallbacksUnvalidated(agent); - expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, agent); - } - - NetworkCapabilities expectCapabilitiesWith(int capability, MockNetworkAgent agent) - throws Exception { - return expectCapabilitiesWith(capability, agent, TEST_CALLBACK_TIMEOUT_MS); - } - - NetworkCapabilities expectCapabilitiesWith(int capability, MockNetworkAgent agent, - int timeoutMs) throws Exception { - CallbackInfo cbi = expectCallback(CallbackState.NETWORK_CAPABILITIES, agent, timeoutMs); - NetworkCapabilities nc = (NetworkCapabilities) cbi.arg; - assertTrue(nc.hasCapability(capability)); - return nc; - } - - NetworkCapabilities expectCapabilitiesWithout(int capability, MockNetworkAgent agent) - throws Exception { - return expectCapabilitiesWithout(capability, agent, TEST_CALLBACK_TIMEOUT_MS); - } - - NetworkCapabilities expectCapabilitiesWithout(int capability, MockNetworkAgent agent, - int timeoutMs) throws Exception { - CallbackInfo cbi = expectCallback(CallbackState.NETWORK_CAPABILITIES, agent, timeoutMs); - NetworkCapabilities nc = (NetworkCapabilities) cbi.arg; - assertFalse(nc.hasCapability(capability)); - return nc; - } - - void expectCapabilitiesLike(Predicate<NetworkCapabilities> fn, MockNetworkAgent agent) - throws Exception { - CallbackInfo cbi = expectCallback(CallbackState.NETWORK_CAPABILITIES, agent); - assertTrue("Received capabilities don't match expectations : " + cbi.arg, - fn.test((NetworkCapabilities) cbi.arg)); - } - - void expectLinkPropertiesLike(Predicate<LinkProperties> fn, MockNetworkAgent agent) - throws Exception { - CallbackInfo cbi = expectCallback(CallbackState.LINK_PROPERTIES, agent); - assertTrue("Received LinkProperties don't match expectations : " + cbi.arg, - fn.test((LinkProperties) cbi.arg)); - } - - void expectBlockedStatusCallback(boolean expectBlocked, MockNetworkAgent agent) - throws Exception { - CallbackInfo cbi = expectCallback(CallbackState.BLOCKED_STATUS, agent); - boolean actualBlocked = (boolean) cbi.arg; - assertEquals(expectBlocked, actualBlocked); - } - - void assertNoCallback() { - waitForIdle(); - CallbackInfo c = mCallbacks.peek(); - assertNull("Unexpected callback: " + c, c); + return callback; } } @@ -2031,16 +1785,16 @@ public class ConnectivityServiceTest { cv = waitForConnectivityBroadcasts(2); mWiFiNetworkAgent.disconnect(); - genericNetworkCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); - wifiNetworkCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); + genericNetworkCallback.expectCallback(CallbackRecord.LOST, mWiFiNetworkAgent); + wifiNetworkCallback.expectCallback(CallbackRecord.LOST, mWiFiNetworkAgent); cellNetworkCallback.assertNoCallback(); waitFor(cv); assertNoCallbacks(genericNetworkCallback, wifiNetworkCallback, cellNetworkCallback); cv = waitForConnectivityBroadcasts(1); mCellNetworkAgent.disconnect(); - genericNetworkCallback.expectCallback(CallbackState.LOST, mCellNetworkAgent); - cellNetworkCallback.expectCallback(CallbackState.LOST, mCellNetworkAgent); + genericNetworkCallback.expectCallback(CallbackRecord.LOST, mCellNetworkAgent); + cellNetworkCallback.expectCallback(CallbackRecord.LOST, mCellNetworkAgent); waitFor(cv); assertNoCallbacks(genericNetworkCallback, wifiNetworkCallback, cellNetworkCallback); @@ -2061,21 +1815,21 @@ public class ConnectivityServiceTest { mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); mWiFiNetworkAgent.connect(true); genericNetworkCallback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); - genericNetworkCallback.expectCallback(CallbackState.LOSING, mCellNetworkAgent); + genericNetworkCallback.expectCallback(CallbackRecord.LOSING, mCellNetworkAgent); genericNetworkCallback.expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, mWiFiNetworkAgent); wifiNetworkCallback.expectAvailableThenValidatedCallbacks(mWiFiNetworkAgent); - cellNetworkCallback.expectCallback(CallbackState.LOSING, mCellNetworkAgent); + cellNetworkCallback.expectCallback(CallbackRecord.LOSING, mCellNetworkAgent); assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork()); assertNoCallbacks(genericNetworkCallback, wifiNetworkCallback, cellNetworkCallback); mWiFiNetworkAgent.disconnect(); - genericNetworkCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); - wifiNetworkCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); + genericNetworkCallback.expectCallback(CallbackRecord.LOST, mWiFiNetworkAgent); + wifiNetworkCallback.expectCallback(CallbackRecord.LOST, mWiFiNetworkAgent); assertNoCallbacks(genericNetworkCallback, wifiNetworkCallback, cellNetworkCallback); mCellNetworkAgent.disconnect(); - genericNetworkCallback.expectCallback(CallbackState.LOST, mCellNetworkAgent); - cellNetworkCallback.expectCallback(CallbackState.LOST, mCellNetworkAgent); + genericNetworkCallback.expectCallback(CallbackRecord.LOST, mCellNetworkAgent); + cellNetworkCallback.expectCallback(CallbackRecord.LOST, mCellNetworkAgent); assertNoCallbacks(genericNetworkCallback, wifiNetworkCallback, cellNetworkCallback); } @@ -2115,7 +1869,7 @@ public class ConnectivityServiceTest { // We then get LOSING when wifi validates and cell is outscored. callback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); // TODO: Investigate sending validated before losing. - callback.expectCallback(CallbackState.LOSING, mCellNetworkAgent); + callback.expectCallback(CallbackRecord.LOSING, mCellNetworkAgent); callback.expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, mWiFiNetworkAgent); defaultCallback.expectAvailableDoubleValidatedCallbacks(mWiFiNetworkAgent); assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork()); @@ -2124,15 +1878,15 @@ public class ConnectivityServiceTest { mEthernetNetworkAgent.connect(true); callback.expectAvailableCallbacksUnvalidated(mEthernetNetworkAgent); // TODO: Investigate sending validated before losing. - callback.expectCallback(CallbackState.LOSING, mWiFiNetworkAgent); + callback.expectCallback(CallbackRecord.LOSING, mWiFiNetworkAgent); callback.expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, mEthernetNetworkAgent); defaultCallback.expectAvailableDoubleValidatedCallbacks(mEthernetNetworkAgent); assertEquals(mEthernetNetworkAgent.getNetwork(), mCm.getActiveNetwork()); assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); mEthernetNetworkAgent.disconnect(); - callback.expectCallback(CallbackState.LOST, mEthernetNetworkAgent); - defaultCallback.expectCallback(CallbackState.LOST, mEthernetNetworkAgent); + callback.expectCallback(CallbackRecord.LOST, mEthernetNetworkAgent); + defaultCallback.expectCallback(CallbackRecord.LOST, mEthernetNetworkAgent); defaultCallback.expectAvailableCallbacksValidated(mWiFiNetworkAgent); assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); @@ -2148,7 +1902,7 @@ public class ConnectivityServiceTest { newNetwork = mWiFiNetworkAgent; } - callback.expectCallback(CallbackState.LOSING, oldNetwork); + callback.expectCallback(CallbackRecord.LOSING, oldNetwork); // TODO: should we send an AVAILABLE callback to newNetwork, to indicate that it is no // longer lingering? defaultCallback.expectAvailableCallbacksValidated(newNetwork); @@ -2162,7 +1916,7 @@ public class ConnectivityServiceTest { // We expect a notification about the capabilities change, and nothing else. defaultCallback.expectCapabilitiesWithout(NET_CAPABILITY_NOT_METERED, mWiFiNetworkAgent); defaultCallback.assertNoCallback(); - callback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); + callback.expectCallback(CallbackRecord.LOST, mWiFiNetworkAgent); assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); // Wifi no longer satisfies our listen, which is for an unmetered network. @@ -2171,11 +1925,11 @@ public class ConnectivityServiceTest { // Disconnect our test networks. mWiFiNetworkAgent.disconnect(); - defaultCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); + defaultCallback.expectCallback(CallbackRecord.LOST, mWiFiNetworkAgent); defaultCallback.expectAvailableCallbacksValidated(mCellNetworkAgent); assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); mCellNetworkAgent.disconnect(); - defaultCallback.expectCallback(CallbackState.LOST, mCellNetworkAgent); + defaultCallback.expectCallback(CallbackRecord.LOST, mCellNetworkAgent); waitForIdle(); assertEquals(null, mCm.getActiveNetwork()); @@ -2206,8 +1960,8 @@ public class ConnectivityServiceTest { assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); mWiFiNetworkAgent.disconnect(); - callback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); - defaultCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); + callback.expectCallback(CallbackRecord.LOST, mWiFiNetworkAgent); + defaultCallback.expectCallback(CallbackRecord.LOST, mWiFiNetworkAgent); defaultCallback.expectAvailableCallbacksUnvalidated(mCellNetworkAgent); assertEquals(mCellNetworkAgent.getNetwork(), mCm.getActiveNetwork()); assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); @@ -2218,15 +1972,15 @@ public class ConnectivityServiceTest { mWiFiNetworkAgent.adjustScore(50); mWiFiNetworkAgent.connect(false); // Score: 70 callback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); - callback.expectCallback(CallbackState.LOSING, mCellNetworkAgent); + callback.expectCallback(CallbackRecord.LOSING, mCellNetworkAgent); defaultCallback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork()); assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); // Tear down wifi. mWiFiNetworkAgent.disconnect(); - callback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); - defaultCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); + callback.expectCallback(CallbackRecord.LOST, mWiFiNetworkAgent); + defaultCallback.expectCallback(CallbackRecord.LOST, mWiFiNetworkAgent); defaultCallback.expectAvailableCallbacksUnvalidated(mCellNetworkAgent); assertEquals(mCellNetworkAgent.getNetwork(), mCm.getActiveNetwork()); assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); @@ -2237,19 +1991,19 @@ public class ConnectivityServiceTest { mWiFiNetworkAgent.connect(true); callback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); // TODO: Investigate sending validated before losing. - callback.expectCallback(CallbackState.LOSING, mCellNetworkAgent); + callback.expectCallback(CallbackRecord.LOSING, mCellNetworkAgent); callback.expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, mWiFiNetworkAgent); defaultCallback.expectAvailableThenValidatedCallbacks(mWiFiNetworkAgent); assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork()); assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); mWiFiNetworkAgent.disconnect(); - callback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); - defaultCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); + callback.expectCallback(CallbackRecord.LOST, mWiFiNetworkAgent); + defaultCallback.expectCallback(CallbackRecord.LOST, mWiFiNetworkAgent); defaultCallback.expectAvailableCallbacksUnvalidated(mCellNetworkAgent); mCellNetworkAgent.disconnect(); - callback.expectCallback(CallbackState.LOST, mCellNetworkAgent); - defaultCallback.expectCallback(CallbackState.LOST, mCellNetworkAgent); + callback.expectCallback(CallbackRecord.LOST, mCellNetworkAgent); + defaultCallback.expectCallback(CallbackRecord.LOST, mCellNetworkAgent); waitForIdle(); assertEquals(null, mCm.getActiveNetwork()); @@ -2264,7 +2018,7 @@ public class ConnectivityServiceTest { defaultCallback.expectAvailableDoubleValidatedCallbacks(mWiFiNetworkAgent); callback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); // TODO: Investigate sending validated before losing. - callback.expectCallback(CallbackState.LOSING, mCellNetworkAgent); + callback.expectCallback(CallbackRecord.LOSING, mCellNetworkAgent); callback.expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, mWiFiNetworkAgent); assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); @@ -2275,13 +2029,13 @@ public class ConnectivityServiceTest { // TODO: should this cause an AVAILABLE callback, to indicate that the network is no longer // lingering? mCm.unregisterNetworkCallback(noopCallback); - callback.expectCallback(CallbackState.LOSING, mCellNetworkAgent); + callback.expectCallback(CallbackRecord.LOSING, mCellNetworkAgent); // Similar to the above: lingering can start even after the lingered request is removed. // Disconnect wifi and switch to cell. mWiFiNetworkAgent.disconnect(); - callback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); - defaultCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); + callback.expectCallback(CallbackRecord.LOST, mWiFiNetworkAgent); + defaultCallback.expectCallback(CallbackRecord.LOST, mWiFiNetworkAgent); defaultCallback.expectAvailableCallbacksValidated(mCellNetworkAgent); assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); @@ -2300,12 +2054,12 @@ public class ConnectivityServiceTest { callback.assertNoCallback(); // Now unregister cellRequest and expect cell to start lingering. mCm.unregisterNetworkCallback(noopCallback); - callback.expectCallback(CallbackState.LOSING, mCellNetworkAgent); + callback.expectCallback(CallbackRecord.LOSING, mCellNetworkAgent); // Let linger run its course. callback.assertNoCallback(); final int lingerTimeoutMs = mService.mLingerDelayMs + mService.mLingerDelayMs / 4; - callback.expectCallback(CallbackState.LOST, mCellNetworkAgent, lingerTimeoutMs); + callback.expectCallback(CallbackRecord.LOST, mCellNetworkAgent, lingerTimeoutMs); // Register a TRACK_DEFAULT request and check that it does not affect lingering. TestNetworkCallback trackDefaultCallback = new TestNetworkCallback(); @@ -2314,20 +2068,20 @@ public class ConnectivityServiceTest { mEthernetNetworkAgent = new MockNetworkAgent(TRANSPORT_ETHERNET); mEthernetNetworkAgent.connect(true); callback.expectAvailableCallbacksUnvalidated(mEthernetNetworkAgent); - callback.expectCallback(CallbackState.LOSING, mWiFiNetworkAgent); + callback.expectCallback(CallbackRecord.LOSING, mWiFiNetworkAgent); callback.expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, mEthernetNetworkAgent); trackDefaultCallback.expectAvailableDoubleValidatedCallbacks(mEthernetNetworkAgent); defaultCallback.expectAvailableDoubleValidatedCallbacks(mEthernetNetworkAgent); assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); // Let linger run its course. - callback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent, lingerTimeoutMs); + callback.expectCallback(CallbackRecord.LOST, mWiFiNetworkAgent, lingerTimeoutMs); // Clean up. mEthernetNetworkAgent.disconnect(); - callback.expectCallback(CallbackState.LOST, mEthernetNetworkAgent); - defaultCallback.expectCallback(CallbackState.LOST, mEthernetNetworkAgent); - trackDefaultCallback.expectCallback(CallbackState.LOST, mEthernetNetworkAgent); + callback.expectCallback(CallbackRecord.LOST, mEthernetNetworkAgent); + defaultCallback.expectCallback(CallbackRecord.LOST, mEthernetNetworkAgent); + trackDefaultCallback.expectCallback(CallbackRecord.LOST, mEthernetNetworkAgent); mCm.unregisterNetworkCallback(callback); mCm.unregisterNetworkCallback(defaultCallback); @@ -2357,7 +2111,7 @@ public class ConnectivityServiceTest { mWiFiNetworkAgent.connect(true); defaultCallback.expectAvailableDoubleValidatedCallbacks(mWiFiNetworkAgent); callback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); - callback.expectCallback(CallbackState.LOSING, mCellNetworkAgent); + callback.expectCallback(CallbackRecord.LOSING, mCellNetworkAgent); callback.expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, mWiFiNetworkAgent); // File a request for cellular, then release it. @@ -2366,7 +2120,7 @@ public class ConnectivityServiceTest { NetworkCallback noopCallback = new NetworkCallback(); mCm.requestNetwork(cellRequest, noopCallback); mCm.unregisterNetworkCallback(noopCallback); - callback.expectCallback(CallbackState.LOSING, mCellNetworkAgent); + callback.expectCallback(CallbackRecord.LOSING, mCellNetworkAgent); // Let linger run its course. callback.assertNoCallback(); @@ -2410,12 +2164,12 @@ public class ConnectivityServiceTest { // If the user chooses yes on the "No Internet access, stay connected?" dialog, we switch to // wifi even though it's unvalidated. mCm.setAcceptUnvalidated(mWiFiNetworkAgent.getNetwork(), true, false); - callback.expectCallback(CallbackState.LOSING, mCellNetworkAgent); + callback.expectCallback(CallbackRecord.LOSING, mCellNetworkAgent); assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork()); // Disconnect wifi, and then reconnect, again with explicitlySelected=true. mWiFiNetworkAgent.disconnect(); - callback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); + callback.expectCallback(CallbackRecord.LOST, mWiFiNetworkAgent); mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); mWiFiNetworkAgent.explicitlySelected(true, false); mWiFiNetworkAgent.connect(false); @@ -2424,14 +2178,14 @@ public class ConnectivityServiceTest { // If the user chooses no on the "No Internet access, stay connected?" dialog, we ask the // network to disconnect. mCm.setAcceptUnvalidated(mWiFiNetworkAgent.getNetwork(), false, false); - callback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); + callback.expectCallback(CallbackRecord.LOST, mWiFiNetworkAgent); // Reconnect, again with explicitlySelected=true, but this time validate. mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); mWiFiNetworkAgent.explicitlySelected(true, false); mWiFiNetworkAgent.connect(true); callback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); - callback.expectCallback(CallbackState.LOSING, mCellNetworkAgent); + callback.expectCallback(CallbackRecord.LOSING, mCellNetworkAgent); callback.expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, mWiFiNetworkAgent); assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork()); @@ -2447,20 +2201,20 @@ public class ConnectivityServiceTest { // (i.e., with explicitlySelected=true and acceptUnvalidated=true). Expect to switch to // wifi immediately. mWiFiNetworkAgent.disconnect(); - callback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); + callback.expectCallback(CallbackRecord.LOST, mWiFiNetworkAgent); mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); mWiFiNetworkAgent.explicitlySelected(true, true); mWiFiNetworkAgent.connect(false); callback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); - callback.expectCallback(CallbackState.LOSING, mEthernetNetworkAgent); + callback.expectCallback(CallbackRecord.LOSING, mEthernetNetworkAgent); assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork()); mEthernetNetworkAgent.disconnect(); - callback.expectCallback(CallbackState.LOST, mEthernetNetworkAgent); + callback.expectCallback(CallbackRecord.LOST, mEthernetNetworkAgent); // Disconnect and reconnect with explicitlySelected=false and acceptUnvalidated=true. // Check that the network is not scored specially and that the device prefers cell data. mWiFiNetworkAgent.disconnect(); - callback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); + callback.expectCallback(CallbackRecord.LOST, mWiFiNetworkAgent); mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); mWiFiNetworkAgent.explicitlySelected(false, true); mWiFiNetworkAgent.connect(false); @@ -2471,8 +2225,8 @@ public class ConnectivityServiceTest { mWiFiNetworkAgent.disconnect(); mCellNetworkAgent.disconnect(); - callback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); - callback.expectCallback(CallbackState.LOST, mCellNetworkAgent); + callback.expectCallback(CallbackRecord.LOST, mWiFiNetworkAgent); + callback.expectCallback(CallbackRecord.LOST, mCellNetworkAgent); } private int[] makeIntArray(final int size, final int value) { @@ -2721,7 +2475,7 @@ public class ConnectivityServiceTest { // Need a trigger point to let NetworkMonitor tell ConnectivityService that network is // validated. mCm.reportNetworkConnectivity(mWiFiNetworkAgent.getNetwork(), true); - callback.expectCallback(CallbackState.LOSING, mCellNetworkAgent); + callback.expectCallback(CallbackRecord.LOSING, mCellNetworkAgent); NetworkCapabilities nc = callback.expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, mWiFiNetworkAgent); assertTrue(nc.hasCapability(NET_CAPABILITY_PARTIAL_CONNECTIVITY)); @@ -2729,7 +2483,7 @@ public class ConnectivityServiceTest { // Disconnect and reconnect wifi with partial connectivity again. mWiFiNetworkAgent.disconnect(); - callback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); + callback.expectCallback(CallbackRecord.LOST, mWiFiNetworkAgent); mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); mWiFiNetworkAgent.connectWithPartialConnectivity(); callback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); @@ -2741,7 +2495,7 @@ public class ConnectivityServiceTest { // If the user chooses no, disconnect wifi immediately. mCm.setAcceptPartialConnectivity(mWiFiNetworkAgent.getNetwork(), false/* accept */, false /* always */); - callback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); + callback.expectCallback(CallbackRecord.LOST, mWiFiNetworkAgent); // If user accepted partial connectivity before, and device reconnects to that network // again, but now the network has full connectivity. The network shouldn't contain @@ -2758,14 +2512,14 @@ public class ConnectivityServiceTest { waitForIdle(); verify(mWiFiNetworkAgent.mNetworkMonitor, times(1)).setAcceptPartialConnectivity(); callback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); - callback.expectCallback(CallbackState.LOSING, mCellNetworkAgent); + callback.expectCallback(CallbackRecord.LOSING, mCellNetworkAgent); nc = callback.expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, mWiFiNetworkAgent); assertFalse(nc.hasCapability(NET_CAPABILITY_PARTIAL_CONNECTIVITY)); // Wifi should be the default network. assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork()); mWiFiNetworkAgent.disconnect(); - callback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); + callback.expectCallback(CallbackRecord.LOST, mWiFiNetworkAgent); // The user accepted partial connectivity and selected "don't ask again". Now the user // reconnects to the partial connectivity network. Switch to wifi as soon as partial @@ -2780,7 +2534,7 @@ public class ConnectivityServiceTest { waitForIdle(); verify(mWiFiNetworkAgent.mNetworkMonitor, times(1)).setAcceptPartialConnectivity(); callback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); - callback.expectCallback(CallbackState.LOSING, mCellNetworkAgent); + callback.expectCallback(CallbackRecord.LOSING, mCellNetworkAgent); assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork()); callback.expectCapabilitiesWith(NET_CAPABILITY_PARTIAL_CONNECTIVITY, mWiFiNetworkAgent); mWiFiNetworkAgent.setNetworkValid(); @@ -2790,7 +2544,7 @@ public class ConnectivityServiceTest { mCm.reportNetworkConnectivity(mWiFiNetworkAgent.getNetwork(), true); callback.expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, mWiFiNetworkAgent); mWiFiNetworkAgent.disconnect(); - callback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); + callback.expectCallback(CallbackRecord.LOST, mWiFiNetworkAgent); // If the user accepted partial connectivity, and the device auto-reconnects to the partial // connectivity network, it should contain both PARTIAL_CONNECTIVITY and VALIDATED. @@ -2805,11 +2559,11 @@ public class ConnectivityServiceTest { waitForIdle(); verify(mWiFiNetworkAgent.mNetworkMonitor, times(1)).setAcceptPartialConnectivity(); callback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); - callback.expectCallback(CallbackState.LOSING, mCellNetworkAgent); + callback.expectCallback(CallbackRecord.LOSING, mCellNetworkAgent); callback.expectCapabilitiesWith( NET_CAPABILITY_PARTIAL_CONNECTIVITY | NET_CAPABILITY_VALIDATED, mWiFiNetworkAgent); mWiFiNetworkAgent.disconnect(); - callback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); + callback.expectCallback(CallbackRecord.LOST, mWiFiNetworkAgent); } @Test @@ -2851,7 +2605,7 @@ public class ConnectivityServiceTest { false /* always */); waitForIdle(); mCm.reportNetworkConnectivity(mWiFiNetworkAgent.getNetwork(), true); - captivePortalCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); + captivePortalCallback.expectCallback(CallbackRecord.LOST, mWiFiNetworkAgent); validatedCallback.expectAvailableCallbacksValidated(mWiFiNetworkAgent); NetworkCapabilities nc = validatedCallback.expectCapabilitiesWith(NET_CAPABILITY_PARTIAL_CONNECTIVITY, @@ -2884,7 +2638,7 @@ public class ConnectivityServiceTest { // Take down network. // Expect onLost callback. mWiFiNetworkAgent.disconnect(); - captivePortalCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); + captivePortalCallback.expectCallback(CallbackRecord.LOST, mWiFiNetworkAgent); // Bring up a network with a captive portal. // Expect onAvailable callback of listen for NET_CAPABILITY_CAPTIVE_PORTAL. @@ -2898,7 +2652,7 @@ public class ConnectivityServiceTest { // Expect onLost callback because network no longer provides NET_CAPABILITY_CAPTIVE_PORTAL. mWiFiNetworkAgent.setNetworkValid(); mCm.reportNetworkConnectivity(mWiFiNetworkAgent.getNetwork(), true); - captivePortalCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); + captivePortalCallback.expectCallback(CallbackRecord.LOST, mWiFiNetworkAgent); // Expect NET_CAPABILITY_VALIDATED onAvailable callback. validatedCallback.expectAvailableDoubleValidatedCallbacks(mWiFiNetworkAgent); @@ -2910,7 +2664,7 @@ public class ConnectivityServiceTest { // Expect NET_CAPABILITY_VALIDATED onLost callback. mWiFiNetworkAgent.setNetworkInvalid(); mCm.reportNetworkConnectivity(mWiFiNetworkAgent.getNetwork(), false); - validatedCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); + validatedCallback.expectCallback(CallbackRecord.LOST, mWiFiNetworkAgent); } @Test @@ -2942,7 +2696,7 @@ public class ConnectivityServiceTest { mWiFiNetworkAgent.setNetworkPortal("http://example.com"); mCm.reportNetworkConnectivity(wifiNetwork, false); captivePortalCallback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); - validatedCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); + validatedCallback.expectCallback(CallbackRecord.LOST, mWiFiNetworkAgent); // Check that startCaptivePortalApp sends the expected command to NetworkMonitor. mCm.startCaptivePortalApp(wifiNetwork); @@ -2963,7 +2717,7 @@ public class ConnectivityServiceTest { mWiFiNetworkAgent.setNetworkValid(); mWiFiNetworkAgent.mNetworkMonitor.forceReevaluation(Process.myUid()); validatedCallback.expectAvailableCallbacksValidated(mWiFiNetworkAgent); - captivePortalCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); + captivePortalCallback.expectCallback(CallbackRecord.LOST, mWiFiNetworkAgent); verify(mNotificationManager, times(1)).notifyAsUser(anyString(), eq(NotificationType.LOGGED_IN.eventId), any(), eq(UserHandle.ALL)); @@ -3103,24 +2857,24 @@ public class ConnectivityServiceTest { mWiFiNetworkAgent.setNetworkSpecifier(nsFoo); cFoo.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); for (TestNetworkCallback c: emptyCallbacks) { - c.expectCapabilitiesLike((caps) -> caps.getNetworkSpecifier().equals(nsFoo), - mWiFiNetworkAgent); + c.expectCapabilitiesThat(mWiFiNetworkAgent, + (caps) -> caps.getNetworkSpecifier().equals(nsFoo)); } - cFoo.expectCapabilitiesLike((caps) -> caps.getNetworkSpecifier().equals(nsFoo), - mWiFiNetworkAgent); + cFoo.expectCapabilitiesThat(mWiFiNetworkAgent, + (caps) -> caps.getNetworkSpecifier().equals(nsFoo)); assertEquals(nsFoo, mCm.getNetworkCapabilities(mWiFiNetworkAgent.getNetwork()).getNetworkSpecifier()); cFoo.assertNoCallback(); mWiFiNetworkAgent.setNetworkSpecifier(nsBar); - cFoo.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); + cFoo.expectCallback(CallbackRecord.LOST, mWiFiNetworkAgent); cBar.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); for (TestNetworkCallback c: emptyCallbacks) { - c.expectCapabilitiesLike((caps) -> caps.getNetworkSpecifier().equals(nsBar), - mWiFiNetworkAgent); + c.expectCapabilitiesThat(mWiFiNetworkAgent, + (caps) -> caps.getNetworkSpecifier().equals(nsBar)); } - cBar.expectCapabilitiesLike((caps) -> caps.getNetworkSpecifier().equals(nsBar), - mWiFiNetworkAgent); + cBar.expectCapabilitiesThat(mWiFiNetworkAgent, + (caps) -> caps.getNetworkSpecifier().equals(nsBar)); assertEquals(nsBar, mCm.getNetworkCapabilities(mWiFiNetworkAgent.getNetwork()).getNetworkSpecifier()); cBar.assertNoCallback(); @@ -3128,23 +2882,23 @@ public class ConnectivityServiceTest { mWiFiNetworkAgent.setNetworkSpecifier(new ConfidentialMatchAllNetworkSpecifier()); cFoo.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); for (TestNetworkCallback c : emptyCallbacks) { - c.expectCapabilitiesLike((caps) -> caps.getNetworkSpecifier() == null, - mWiFiNetworkAgent); + c.expectCapabilitiesThat(mWiFiNetworkAgent, + (caps) -> caps.getNetworkSpecifier() == null); } - cFoo.expectCapabilitiesLike((caps) -> caps.getNetworkSpecifier() == null, - mWiFiNetworkAgent); - cBar.expectCapabilitiesLike((caps) -> caps.getNetworkSpecifier() == null, - mWiFiNetworkAgent); + cFoo.expectCapabilitiesThat(mWiFiNetworkAgent, + (caps) -> caps.getNetworkSpecifier() == null); + cBar.expectCapabilitiesThat(mWiFiNetworkAgent, + (caps) -> caps.getNetworkSpecifier() == null); assertNull( mCm.getNetworkCapabilities(mWiFiNetworkAgent.getNetwork()).getNetworkSpecifier()); cFoo.assertNoCallback(); cBar.assertNoCallback(); mWiFiNetworkAgent.setNetworkSpecifier(null); - cFoo.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); - cBar.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); + cFoo.expectCallback(CallbackRecord.LOST, mWiFiNetworkAgent); + cBar.expectCallback(CallbackRecord.LOST, mWiFiNetworkAgent); for (TestNetworkCallback c: emptyCallbacks) { - c.expectCallback(CallbackState.NETWORK_CAPABILITIES, mWiFiNetworkAgent); + c.expectCallback(CallbackRecord.NETWORK_CAPS_UPDATED, mWiFiNetworkAgent); } assertNoCallbacks(cEmpty1, cEmpty2, cEmpty3, cEmpty4, cFoo, cBar); @@ -3287,7 +3041,7 @@ public class ConnectivityServiceTest { // Bring down cell. Expect no default network callback, since it wasn't the default. mCellNetworkAgent.disconnect(); - cellNetworkCallback.expectCallback(CallbackState.LOST, mCellNetworkAgent); + cellNetworkCallback.expectCallback(CallbackRecord.LOST, mCellNetworkAgent); defaultNetworkCallback.assertNoCallback(); assertEquals(defaultNetworkCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); @@ -3302,11 +3056,11 @@ public class ConnectivityServiceTest { // followed by AVAILABLE cell. mWiFiNetworkAgent.disconnect(); cellNetworkCallback.assertNoCallback(); - defaultNetworkCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); + defaultNetworkCallback.expectCallback(CallbackRecord.LOST, mWiFiNetworkAgent); defaultNetworkCallback.expectAvailableCallbacksValidated(mCellNetworkAgent); mCellNetworkAgent.disconnect(); - cellNetworkCallback.expectCallback(CallbackState.LOST, mCellNetworkAgent); - defaultNetworkCallback.expectCallback(CallbackState.LOST, mCellNetworkAgent); + cellNetworkCallback.expectCallback(CallbackRecord.LOST, mCellNetworkAgent); + defaultNetworkCallback.expectCallback(CallbackRecord.LOST, mCellNetworkAgent); waitForIdle(); assertEquals(null, mCm.getActiveNetwork()); @@ -3322,7 +3076,7 @@ public class ConnectivityServiceTest { assertEquals(defaultNetworkCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); vpnNetworkAgent.disconnect(); - defaultNetworkCallback.expectCallback(CallbackState.LOST, vpnNetworkAgent); + defaultNetworkCallback.expectCallback(CallbackRecord.LOST, vpnNetworkAgent); waitForIdle(); assertEquals(null, mCm.getActiveNetwork()); } @@ -3350,14 +3104,15 @@ public class ConnectivityServiceTest { lp.setInterfaceName("foonet_data0"); mCellNetworkAgent.sendLinkProperties(lp); // We should get onLinkPropertiesChanged(). - cellNetworkCallback.expectCallback(CallbackState.LINK_PROPERTIES, mCellNetworkAgent); + cellNetworkCallback.expectCallback(CallbackRecord.LINK_PROPERTIES_CHANGED, + mCellNetworkAgent); cellNetworkCallback.assertNoCallback(); // Suspend the network. mCellNetworkAgent.suspend(); cellNetworkCallback.expectCapabilitiesWithout(NET_CAPABILITY_NOT_SUSPENDED, mCellNetworkAgent); - cellNetworkCallback.expectCallback(CallbackState.SUSPENDED, mCellNetworkAgent); + cellNetworkCallback.expectCallback(CallbackRecord.SUSPENDED, mCellNetworkAgent); cellNetworkCallback.assertNoCallback(); // Register a garden variety default network request. @@ -3372,7 +3127,7 @@ public class ConnectivityServiceTest { mCellNetworkAgent.resume(); cellNetworkCallback.expectCapabilitiesWith(NET_CAPABILITY_NOT_SUSPENDED, mCellNetworkAgent); - cellNetworkCallback.expectCallback(CallbackState.RESUMED, mCellNetworkAgent); + cellNetworkCallback.expectCallback(CallbackRecord.RESUMED, mCellNetworkAgent); cellNetworkCallback.assertNoCallback(); dfltNetworkCallback = new TestNetworkCallback(); @@ -3435,10 +3190,10 @@ public class ConnectivityServiceTest { // When wifi connects, cell lingers. callback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); - callback.expectCallback(CallbackState.LOSING, mCellNetworkAgent); + callback.expectCallback(CallbackRecord.LOSING, mCellNetworkAgent); callback.expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, mWiFiNetworkAgent); fgCallback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); - fgCallback.expectCallback(CallbackState.LOSING, mCellNetworkAgent); + fgCallback.expectCallback(CallbackRecord.LOSING, mCellNetworkAgent); fgCallback.expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, mWiFiNetworkAgent); assertTrue(isForegroundNetwork(mCellNetworkAgent)); assertTrue(isForegroundNetwork(mWiFiNetworkAgent)); @@ -3446,7 +3201,7 @@ public class ConnectivityServiceTest { // When lingering is complete, cell is still there but is now in the background. waitForIdle(); int timeoutMs = TEST_LINGER_DELAY_MS + TEST_LINGER_DELAY_MS / 4; - fgCallback.expectCallback(CallbackState.LOST, mCellNetworkAgent, timeoutMs); + fgCallback.expectCallback(CallbackRecord.LOST, mCellNetworkAgent, timeoutMs); // Expect a network capabilities update sans FOREGROUND. callback.expectCapabilitiesWithout(NET_CAPABILITY_FOREGROUND, mCellNetworkAgent); assertFalse(isForegroundNetwork(mCellNetworkAgent)); @@ -3472,7 +3227,7 @@ public class ConnectivityServiceTest { // Release the request. The network immediately goes into the background, since it was not // lingering. mCm.unregisterNetworkCallback(cellCallback); - fgCallback.expectCallback(CallbackState.LOST, mCellNetworkAgent); + fgCallback.expectCallback(CallbackRecord.LOST, mCellNetworkAgent); // Expect a network capabilities update sans FOREGROUND. callback.expectCapabilitiesWithout(NET_CAPABILITY_FOREGROUND, mCellNetworkAgent); assertFalse(isForegroundNetwork(mCellNetworkAgent)); @@ -3480,8 +3235,8 @@ public class ConnectivityServiceTest { // Disconnect wifi and check that cell is foreground again. mWiFiNetworkAgent.disconnect(); - callback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); - fgCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); + callback.expectCallback(CallbackRecord.LOST, mWiFiNetworkAgent); + fgCallback.expectCallback(CallbackRecord.LOST, mWiFiNetworkAgent); fgCallback.expectAvailableCallbacksValidated(mCellNetworkAgent); assertTrue(isForegroundNetwork(mCellNetworkAgent)); @@ -3618,7 +3373,7 @@ public class ConnectivityServiceTest { testFactory.waitForNetworkRequests(1); // ... and cell data to be torn down. - cellNetworkCallback.expectCallback(CallbackState.LOST, mCellNetworkAgent); + cellNetworkCallback.expectCallback(CallbackRecord.LOST, mCellNetworkAgent); assertLength(1, mCm.getAllNetworks()); testFactory.unregister(); @@ -3709,7 +3464,7 @@ public class ConnectivityServiceTest { mWiFiNetworkAgent.setNetworkInvalid(); mCm.reportNetworkConnectivity(wifiNetwork, false); defaultCallback.expectCapabilitiesWithout(NET_CAPABILITY_VALIDATED, mWiFiNetworkAgent); - validatedWifiCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); + validatedWifiCallback.expectCallback(CallbackRecord.LOST, mWiFiNetworkAgent); // Because avoid bad wifi is off, we don't switch to cellular. defaultCallback.assertNoCallback(); @@ -3753,7 +3508,7 @@ public class ConnectivityServiceTest { mWiFiNetworkAgent.setNetworkInvalid(); mCm.reportNetworkConnectivity(wifiNetwork, false); defaultCallback.expectCapabilitiesWithout(NET_CAPABILITY_VALIDATED, mWiFiNetworkAgent); - validatedWifiCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); + validatedWifiCallback.expectCallback(CallbackRecord.LOST, mWiFiNetworkAgent); // Simulate the user selecting "switch" and checking the don't ask again checkbox. Settings.Global.putInt(cr, Settings.Global.NETWORK_AVOID_BAD_WIFI, 1); @@ -3780,7 +3535,7 @@ public class ConnectivityServiceTest { // If cell goes down, we switch to wifi. mCellNetworkAgent.disconnect(); - defaultCallback.expectCallback(CallbackState.LOST, mCellNetworkAgent); + defaultCallback.expectCallback(CallbackRecord.LOST, mCellNetworkAgent); defaultCallback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); validatedWifiCallback.assertNoCallback(); @@ -3845,7 +3600,7 @@ public class ConnectivityServiceTest { networkCallback.expectAvailableCallbacks(mWiFiNetworkAgent, false, false, false, TEST_CALLBACK_TIMEOUT_MS); mWiFiNetworkAgent.disconnect(); - networkCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); + networkCallback.expectCallback(CallbackRecord.LOST, mWiFiNetworkAgent); // Validate that UNAVAILABLE is not called networkCallback.assertNoCallback(); @@ -3865,7 +3620,7 @@ public class ConnectivityServiceTest { mCm.requestNetwork(nr, networkCallback, timeoutMs); // pass timeout and validate that UNAVAILABLE is called - networkCallback.expectCallback(CallbackState.UNAVAILABLE, null); + networkCallback.expectCallback(CallbackRecord.UNAVAILABLE, null); // create a network satisfying request - validate that request not triggered mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); @@ -3956,7 +3711,7 @@ public class ConnectivityServiceTest { // Simulate the factory releasing the request as unfulfillable and expect onUnavailable! testFactory.triggerUnfulfillable(requests.get(newRequestId)); - networkCallback.expectCallback(CallbackState.UNAVAILABLE, null); + networkCallback.expectCallback(CallbackRecord.UNAVAILABLE, null); testFactory.waitForRequests(); // unregister network callback - a no-op (since already freed by the @@ -4797,7 +4552,7 @@ public class ConnectivityServiceTest { // Disconnect wifi aware network. wifiAware.disconnect(); - callback.expectCallbackLike((info) -> info.state == CallbackState.LOST, TIMEOUT_MS); + callback.expectCallbackThat(TIMEOUT_MS, (info) -> info instanceof CallbackRecord.Lost); mCm.unregisterNetworkCallback(callback); verifyNoNetwork(); @@ -4846,14 +4601,15 @@ public class ConnectivityServiceTest { // ConnectivityService. MockNetworkAgent networkAgent = new MockNetworkAgent(TRANSPORT_WIFI, lp); networkAgent.connect(true); - networkCallback.expectCallback(CallbackState.AVAILABLE, networkAgent); - networkCallback.expectCallback(CallbackState.NETWORK_CAPABILITIES, networkAgent); - CallbackInfo cbi = networkCallback.expectCallback(CallbackState.LINK_PROPERTIES, + networkCallback.expectCallback(CallbackRecord.AVAILABLE, networkAgent); + networkCallback.expectCallback(CallbackRecord.NETWORK_CAPS_UPDATED, networkAgent); + CallbackRecord.LinkPropertiesChanged cbi = + networkCallback.expectCallback(CallbackRecord.LINK_PROPERTIES_CHANGED, networkAgent); - networkCallback.expectCallback(CallbackState.BLOCKED_STATUS, networkAgent); + networkCallback.expectCallback(CallbackRecord.BLOCKED_STATUS, networkAgent); networkCallback.expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, networkAgent); networkCallback.assertNoCallback(); - checkDirectlyConnectedRoutes(cbi.arg, Arrays.asList(myIpv4Address), + checkDirectlyConnectedRoutes(cbi.getLp(), Arrays.asList(myIpv4Address), Arrays.asList(myIpv4DefaultRoute)); checkDirectlyConnectedRoutes(mCm.getLinkProperties(networkAgent.getNetwork()), Arrays.asList(myIpv4Address), Arrays.asList(myIpv4DefaultRoute)); @@ -4865,9 +4621,9 @@ public class ConnectivityServiceTest { newLp.addLinkAddress(myIpv6Address1); newLp.addLinkAddress(myIpv6Address2); networkAgent.sendLinkProperties(newLp); - cbi = networkCallback.expectCallback(CallbackState.LINK_PROPERTIES, networkAgent); + cbi = networkCallback.expectCallback(CallbackRecord.LINK_PROPERTIES_CHANGED, networkAgent); networkCallback.assertNoCallback(); - checkDirectlyConnectedRoutes(cbi.arg, + checkDirectlyConnectedRoutes(cbi.getLp(), Arrays.asList(myIpv4Address, myIpv6Address1, myIpv6Address2), Arrays.asList(myIpv4DefaultRoute)); mCm.unregisterNetworkCallback(networkCallback); @@ -5071,15 +4827,15 @@ public class ConnectivityServiceTest { assertTrue(ArrayUtils.containsAll(resolvrParams.tlsServers, new String[] { "2001:db8::1", "192.0.2.1" })); reset(mMockDnsResolver); - cellNetworkCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); - cellNetworkCallback.expectCallback(CallbackState.NETWORK_CAPABILITIES, + cellNetworkCallback.expectCallback(CallbackRecord.AVAILABLE, mCellNetworkAgent); + cellNetworkCallback.expectCallback(CallbackRecord.NETWORK_CAPS_UPDATED, mCellNetworkAgent); - CallbackInfo cbi = cellNetworkCallback.expectCallback( - CallbackState.LINK_PROPERTIES, mCellNetworkAgent); - cellNetworkCallback.expectCallback(CallbackState.BLOCKED_STATUS, mCellNetworkAgent); + CallbackRecord.LinkPropertiesChanged cbi = cellNetworkCallback.expectCallback( + CallbackRecord.LINK_PROPERTIES_CHANGED, mCellNetworkAgent); + cellNetworkCallback.expectCallback(CallbackRecord.BLOCKED_STATUS, mCellNetworkAgent); cellNetworkCallback.assertNoCallback(); - assertFalse(((LinkProperties)cbi.arg).isPrivateDnsActive()); - assertNull(((LinkProperties)cbi.arg).getPrivateDnsServerName()); + assertFalse(cbi.getLp().isPrivateDnsActive()); + assertNull(cbi.getLp().getPrivateDnsServerName()); setPrivateDnsSettings(PRIVATE_DNS_MODE_OFF, "ignored.example.com"); verify(mMockDnsResolver, times(1)).setResolverConfiguration( @@ -5107,11 +4863,11 @@ public class ConnectivityServiceTest { setPrivateDnsSettings(PRIVATE_DNS_MODE_PROVIDER_HOSTNAME, "strict.example.com"); // Can't test dns configuration for strict mode without properly mocking // out the DNS lookups, but can test that LinkProperties is updated. - cbi = cellNetworkCallback.expectCallback(CallbackState.LINK_PROPERTIES, + cbi = cellNetworkCallback.expectCallback(CallbackRecord.LINK_PROPERTIES_CHANGED, mCellNetworkAgent); cellNetworkCallback.assertNoCallback(); - assertTrue(((LinkProperties)cbi.arg).isPrivateDnsActive()); - assertEquals("strict.example.com", ((LinkProperties)cbi.arg).getPrivateDnsServerName()); + assertTrue(cbi.getLp().isPrivateDnsActive()); + assertEquals("strict.example.com", cbi.getLp().getPrivateDnsServerName()); } @Test @@ -5130,17 +4886,17 @@ public class ConnectivityServiceTest { mCellNetworkAgent.sendLinkProperties(lp); mCellNetworkAgent.connect(false); waitForIdle(); - cellNetworkCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); - cellNetworkCallback.expectCallback(CallbackState.NETWORK_CAPABILITIES, + cellNetworkCallback.expectCallback(CallbackRecord.AVAILABLE, mCellNetworkAgent); + cellNetworkCallback.expectCallback(CallbackRecord.NETWORK_CAPS_UPDATED, mCellNetworkAgent); - CallbackInfo cbi = cellNetworkCallback.expectCallback( - CallbackState.LINK_PROPERTIES, mCellNetworkAgent); - cellNetworkCallback.expectCallback(CallbackState.BLOCKED_STATUS, mCellNetworkAgent); + CallbackRecord.LinkPropertiesChanged cbi = cellNetworkCallback.expectCallback( + CallbackRecord.LINK_PROPERTIES_CHANGED, mCellNetworkAgent); + cellNetworkCallback.expectCallback(CallbackRecord.BLOCKED_STATUS, mCellNetworkAgent); cellNetworkCallback.assertNoCallback(); - assertFalse(((LinkProperties)cbi.arg).isPrivateDnsActive()); - assertNull(((LinkProperties)cbi.arg).getPrivateDnsServerName()); + assertFalse(cbi.getLp().isPrivateDnsActive()); + assertNull(cbi.getLp().getPrivateDnsServerName()); Set<InetAddress> dnsServers = new HashSet<>(); - checkDnsServers(cbi.arg, dnsServers); + checkDnsServers(cbi.getLp(), dnsServers); // Send a validation event for a server that is not part of the current // resolver config. The validation event should be ignored. @@ -5152,13 +4908,13 @@ public class ConnectivityServiceTest { LinkProperties lp2 = new LinkProperties(lp); lp2.addDnsServer(InetAddress.getByName("145.100.185.16")); mCellNetworkAgent.sendLinkProperties(lp2); - cbi = cellNetworkCallback.expectCallback(CallbackState.LINK_PROPERTIES, + cbi = cellNetworkCallback.expectCallback(CallbackRecord.LINK_PROPERTIES_CHANGED, mCellNetworkAgent); cellNetworkCallback.assertNoCallback(); - assertFalse(((LinkProperties)cbi.arg).isPrivateDnsActive()); - assertNull(((LinkProperties)cbi.arg).getPrivateDnsServerName()); + assertFalse(cbi.getLp().isPrivateDnsActive()); + assertNull(cbi.getLp().getPrivateDnsServerName()); dnsServers.add(InetAddress.getByName("145.100.185.16")); - checkDnsServers(cbi.arg, dnsServers); + checkDnsServers(cbi.getLp(), dnsServers); // Send a validation event containing a hostname that is not part of // the current resolver config. The validation event should be ignored. @@ -5176,39 +4932,39 @@ public class ConnectivityServiceTest { // private dns fields should be sent. mService.mNetdEventCallback.onPrivateDnsValidationEvent( mCellNetworkAgent.getNetwork().netId, "145.100.185.16", "", true); - cbi = cellNetworkCallback.expectCallback(CallbackState.LINK_PROPERTIES, + cbi = cellNetworkCallback.expectCallback(CallbackRecord.LINK_PROPERTIES_CHANGED, mCellNetworkAgent); cellNetworkCallback.assertNoCallback(); - assertTrue(((LinkProperties)cbi.arg).isPrivateDnsActive()); - assertNull(((LinkProperties)cbi.arg).getPrivateDnsServerName()); - checkDnsServers(cbi.arg, dnsServers); + assertTrue(cbi.getLp().isPrivateDnsActive()); + assertNull(cbi.getLp().getPrivateDnsServerName()); + checkDnsServers(cbi.getLp(), dnsServers); // The private dns fields in LinkProperties should be preserved when // the network agent sends unrelated changes. LinkProperties lp3 = new LinkProperties(lp2); lp3.setMtu(1300); mCellNetworkAgent.sendLinkProperties(lp3); - cbi = cellNetworkCallback.expectCallback(CallbackState.LINK_PROPERTIES, + cbi = cellNetworkCallback.expectCallback(CallbackRecord.LINK_PROPERTIES_CHANGED, mCellNetworkAgent); cellNetworkCallback.assertNoCallback(); - assertTrue(((LinkProperties)cbi.arg).isPrivateDnsActive()); - assertNull(((LinkProperties)cbi.arg).getPrivateDnsServerName()); - checkDnsServers(cbi.arg, dnsServers); - assertEquals(1300, ((LinkProperties)cbi.arg).getMtu()); + assertTrue(cbi.getLp().isPrivateDnsActive()); + assertNull(cbi.getLp().getPrivateDnsServerName()); + checkDnsServers(cbi.getLp(), dnsServers); + assertEquals(1300, cbi.getLp().getMtu()); // Removing the only validated server should affect the private dns // fields in LinkProperties. LinkProperties lp4 = new LinkProperties(lp3); lp4.removeDnsServer(InetAddress.getByName("145.100.185.16")); mCellNetworkAgent.sendLinkProperties(lp4); - cbi = cellNetworkCallback.expectCallback(CallbackState.LINK_PROPERTIES, + cbi = cellNetworkCallback.expectCallback(CallbackRecord.LINK_PROPERTIES_CHANGED, mCellNetworkAgent); cellNetworkCallback.assertNoCallback(); - assertFalse(((LinkProperties)cbi.arg).isPrivateDnsActive()); - assertNull(((LinkProperties)cbi.arg).getPrivateDnsServerName()); + assertFalse(cbi.getLp().isPrivateDnsActive()); + assertNull(cbi.getLp().getPrivateDnsServerName()); dnsServers.remove(InetAddress.getByName("145.100.185.16")); - checkDnsServers(cbi.arg, dnsServers); - assertEquals(1300, ((LinkProperties)cbi.arg).getMtu()); + checkDnsServers(cbi.getLp(), dnsServers); + assertEquals(1300, cbi.getLp().getMtu()); } private void checkDirectlyConnectedRoutes(Object callbackObj, @@ -5290,19 +5046,19 @@ public class ConnectivityServiceTest { defaultCallback.expectAvailableCallbacksUnvalidated(vpnNetworkAgent); assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); - genericNetworkCallback.expectCallback(CallbackState.NETWORK_CAPABILITIES, vpnNetworkAgent); + genericNetworkCallback.expectCallback(CallbackRecord.NETWORK_CAPS_UPDATED, vpnNetworkAgent); genericNotVpnNetworkCallback.assertNoCallback(); - vpnNetworkCallback.expectCapabilitiesLike(nc -> null == nc.getUids(), vpnNetworkAgent); - defaultCallback.expectCallback(CallbackState.NETWORK_CAPABILITIES, vpnNetworkAgent); + vpnNetworkCallback.expectCapabilitiesThat(vpnNetworkAgent, nc -> null == nc.getUids()); + defaultCallback.expectCallback(CallbackRecord.NETWORK_CAPS_UPDATED, vpnNetworkAgent); assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); ranges.clear(); vpnNetworkAgent.setUids(ranges); - genericNetworkCallback.expectCallback(CallbackState.LOST, vpnNetworkAgent); + genericNetworkCallback.expectCallback(CallbackRecord.LOST, vpnNetworkAgent); genericNotVpnNetworkCallback.assertNoCallback(); wifiNetworkCallback.assertNoCallback(); - vpnNetworkCallback.expectCallback(CallbackState.LOST, vpnNetworkAgent); + vpnNetworkCallback.expectCallback(CallbackRecord.LOST, vpnNetworkAgent); // TODO : The default network callback should actually get a LOST call here (also see the // comment below for AVAILABLE). This is because ConnectivityService does not look at UID @@ -5310,7 +5066,7 @@ public class ConnectivityServiceTest { // can't currently update their UIDs without disconnecting, so this does not matter too // much, but that is the reason the test here has to check for an update to the // capabilities instead of the expected LOST then AVAILABLE. - defaultCallback.expectCallback(CallbackState.NETWORK_CAPABILITIES, vpnNetworkAgent); + defaultCallback.expectCallback(CallbackRecord.NETWORK_CAPS_UPDATED, vpnNetworkAgent); ranges.add(new UidRange(uid, uid)); mMockVpn.setUids(ranges); @@ -5322,23 +5078,23 @@ public class ConnectivityServiceTest { vpnNetworkCallback.expectAvailableCallbacksValidated(vpnNetworkAgent); // TODO : Here like above, AVAILABLE would be correct, but because this can't actually // happen outside of the test, ConnectivityService does not rematch callbacks. - defaultCallback.expectCallback(CallbackState.NETWORK_CAPABILITIES, vpnNetworkAgent); + defaultCallback.expectCallback(CallbackRecord.NETWORK_CAPS_UPDATED, vpnNetworkAgent); mWiFiNetworkAgent.disconnect(); - genericNetworkCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); - genericNotVpnNetworkCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); - wifiNetworkCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); + genericNetworkCallback.expectCallback(CallbackRecord.LOST, mWiFiNetworkAgent); + genericNotVpnNetworkCallback.expectCallback(CallbackRecord.LOST, mWiFiNetworkAgent); + wifiNetworkCallback.expectCallback(CallbackRecord.LOST, mWiFiNetworkAgent); vpnNetworkCallback.assertNoCallback(); defaultCallback.assertNoCallback(); vpnNetworkAgent.disconnect(); - genericNetworkCallback.expectCallback(CallbackState.LOST, vpnNetworkAgent); + genericNetworkCallback.expectCallback(CallbackRecord.LOST, vpnNetworkAgent); genericNotVpnNetworkCallback.assertNoCallback(); wifiNetworkCallback.assertNoCallback(); - vpnNetworkCallback.expectCallback(CallbackState.LOST, vpnNetworkAgent); - defaultCallback.expectCallback(CallbackState.LOST, vpnNetworkAgent); + vpnNetworkCallback.expectCallback(CallbackRecord.LOST, vpnNetworkAgent); + defaultCallback.expectCallback(CallbackRecord.LOST, vpnNetworkAgent); assertEquals(null, mCm.getActiveNetwork()); mCm.unregisterNetworkCallback(genericNetworkCallback); @@ -5402,7 +5158,7 @@ public class ConnectivityServiceTest { assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork()); vpnNetworkAgent.disconnect(); - defaultCallback.expectCallback(CallbackState.LOST, vpnNetworkAgent); + defaultCallback.expectCallback(CallbackRecord.LOST, vpnNetworkAgent); defaultCallback.expectAvailableCallbacksValidated(mWiFiNetworkAgent); mCm.unregisterNetworkCallback(defaultCallback); @@ -5432,7 +5188,7 @@ public class ConnectivityServiceTest { // Even though the VPN is unvalidated, it becomes the default network for our app. callback.expectAvailableCallbacksUnvalidated(vpnNetworkAgent); // TODO: this looks like a spurious callback. - callback.expectCallback(CallbackState.NETWORK_CAPABILITIES, vpnNetworkAgent); + callback.expectCallback(CallbackRecord.NETWORK_CAPS_UPDATED, vpnNetworkAgent); callback.assertNoCallback(); assertTrue(vpnNetworkAgent.getScore() > mEthernetNetworkAgent.getScore()); @@ -5456,7 +5212,7 @@ public class ConnectivityServiceTest { callback.assertNoCallback(); vpnNetworkAgent.disconnect(); - callback.expectCallback(CallbackState.LOST, vpnNetworkAgent); + callback.expectCallback(CallbackRecord.LOST, vpnNetworkAgent); callback.expectAvailableCallbacksValidated(mEthernetNetworkAgent); } @@ -5496,10 +5252,10 @@ public class ConnectivityServiceTest { mService.setUnderlyingNetworksForVpn( new Network[] { mCellNetworkAgent.getNetwork() }); - vpnNetworkCallback.expectCapabilitiesLike((caps) -> caps.hasTransport(TRANSPORT_VPN) + vpnNetworkCallback.expectCapabilitiesThat(vpnNetworkAgent, + (caps) -> caps.hasTransport(TRANSPORT_VPN) && caps.hasTransport(TRANSPORT_CELLULAR) && !caps.hasTransport(TRANSPORT_WIFI) - && !caps.hasCapability(NET_CAPABILITY_NOT_METERED), - vpnNetworkAgent); + && !caps.hasCapability(NET_CAPABILITY_NOT_METERED)); mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); mWiFiNetworkAgent.addCapability(NET_CAPABILITY_NOT_METERED); @@ -5508,52 +5264,52 @@ public class ConnectivityServiceTest { mService.setUnderlyingNetworksForVpn( new Network[] { mCellNetworkAgent.getNetwork(), mWiFiNetworkAgent.getNetwork() }); - vpnNetworkCallback.expectCapabilitiesLike((caps) -> caps.hasTransport(TRANSPORT_VPN) + vpnNetworkCallback.expectCapabilitiesThat(vpnNetworkAgent, + (caps) -> caps.hasTransport(TRANSPORT_VPN) && caps.hasTransport(TRANSPORT_CELLULAR) && caps.hasTransport(TRANSPORT_WIFI) - && !caps.hasCapability(NET_CAPABILITY_NOT_METERED), - vpnNetworkAgent); + && !caps.hasCapability(NET_CAPABILITY_NOT_METERED)); // Don't disconnect, but note the VPN is not using wifi any more. mService.setUnderlyingNetworksForVpn( new Network[] { mCellNetworkAgent.getNetwork() }); - vpnNetworkCallback.expectCapabilitiesLike((caps) -> caps.hasTransport(TRANSPORT_VPN) + vpnNetworkCallback.expectCapabilitiesThat(vpnNetworkAgent, + (caps) -> caps.hasTransport(TRANSPORT_VPN) && caps.hasTransport(TRANSPORT_CELLULAR) && !caps.hasTransport(TRANSPORT_WIFI) - && !caps.hasCapability(NET_CAPABILITY_NOT_METERED), - vpnNetworkAgent); + && !caps.hasCapability(NET_CAPABILITY_NOT_METERED)); // Use Wifi but not cell. Note the VPN is now unmetered. mService.setUnderlyingNetworksForVpn( new Network[] { mWiFiNetworkAgent.getNetwork() }); - vpnNetworkCallback.expectCapabilitiesLike((caps) -> caps.hasTransport(TRANSPORT_VPN) + vpnNetworkCallback.expectCapabilitiesThat(vpnNetworkAgent, + (caps) -> caps.hasTransport(TRANSPORT_VPN) && !caps.hasTransport(TRANSPORT_CELLULAR) && caps.hasTransport(TRANSPORT_WIFI) - && caps.hasCapability(NET_CAPABILITY_NOT_METERED), - vpnNetworkAgent); + && caps.hasCapability(NET_CAPABILITY_NOT_METERED)); // Use both again. mService.setUnderlyingNetworksForVpn( new Network[] { mCellNetworkAgent.getNetwork(), mWiFiNetworkAgent.getNetwork() }); - vpnNetworkCallback.expectCapabilitiesLike((caps) -> caps.hasTransport(TRANSPORT_VPN) + vpnNetworkCallback.expectCapabilitiesThat(vpnNetworkAgent, + (caps) -> caps.hasTransport(TRANSPORT_VPN) && caps.hasTransport(TRANSPORT_CELLULAR) && caps.hasTransport(TRANSPORT_WIFI) - && !caps.hasCapability(NET_CAPABILITY_NOT_METERED), - vpnNetworkAgent); + && !caps.hasCapability(NET_CAPABILITY_NOT_METERED)); // Disconnect cell. Receive update without even removing the dead network from the // underlying networks – it's dead anyway. Not metered any more. mCellNetworkAgent.disconnect(); - vpnNetworkCallback.expectCapabilitiesLike((caps) -> caps.hasTransport(TRANSPORT_VPN) + vpnNetworkCallback.expectCapabilitiesThat(vpnNetworkAgent, + (caps) -> caps.hasTransport(TRANSPORT_VPN) && !caps.hasTransport(TRANSPORT_CELLULAR) && caps.hasTransport(TRANSPORT_WIFI) - && caps.hasCapability(NET_CAPABILITY_NOT_METERED), - vpnNetworkAgent); + && caps.hasCapability(NET_CAPABILITY_NOT_METERED)); // Disconnect wifi too. No underlying networks means this is now metered. mWiFiNetworkAgent.disconnect(); - vpnNetworkCallback.expectCapabilitiesLike((caps) -> caps.hasTransport(TRANSPORT_VPN) + vpnNetworkCallback.expectCapabilitiesThat(vpnNetworkAgent, + (caps) -> caps.hasTransport(TRANSPORT_VPN) && !caps.hasTransport(TRANSPORT_CELLULAR) && !caps.hasTransport(TRANSPORT_WIFI) - && !caps.hasCapability(NET_CAPABILITY_NOT_METERED), - vpnNetworkAgent); + && !caps.hasCapability(NET_CAPABILITY_NOT_METERED)); mMockVpn.disconnect(); } @@ -5592,20 +5348,20 @@ public class ConnectivityServiceTest { mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); mCellNetworkAgent.connect(true); - vpnNetworkCallback.expectCapabilitiesLike((caps) -> caps.hasTransport(TRANSPORT_VPN) + vpnNetworkCallback.expectCapabilitiesThat(vpnNetworkAgent, + (caps) -> caps.hasTransport(TRANSPORT_VPN) && caps.hasTransport(TRANSPORT_CELLULAR) && !caps.hasTransport(TRANSPORT_WIFI) - && !caps.hasCapability(NET_CAPABILITY_NOT_METERED), - vpnNetworkAgent); + && !caps.hasCapability(NET_CAPABILITY_NOT_METERED)); // Connect to WiFi; WiFi is the new default. mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); mWiFiNetworkAgent.addCapability(NET_CAPABILITY_NOT_METERED); mWiFiNetworkAgent.connect(true); - vpnNetworkCallback.expectCapabilitiesLike((caps) -> caps.hasTransport(TRANSPORT_VPN) + vpnNetworkCallback.expectCapabilitiesThat(vpnNetworkAgent, + (caps) -> caps.hasTransport(TRANSPORT_VPN) && !caps.hasTransport(TRANSPORT_CELLULAR) && caps.hasTransport(TRANSPORT_WIFI) - && caps.hasCapability(NET_CAPABILITY_NOT_METERED), - vpnNetworkAgent); + && caps.hasCapability(NET_CAPABILITY_NOT_METERED)); // Disconnect Cell. The default network did not change, so there shouldn't be any changes in // the capabilities. @@ -5614,10 +5370,10 @@ public class ConnectivityServiceTest { // Disconnect wifi too. Now we have no default network. mWiFiNetworkAgent.disconnect(); - vpnNetworkCallback.expectCapabilitiesLike((caps) -> caps.hasTransport(TRANSPORT_VPN) + vpnNetworkCallback.expectCapabilitiesThat(vpnNetworkAgent, + (caps) -> caps.hasTransport(TRANSPORT_VPN) && !caps.hasTransport(TRANSPORT_CELLULAR) && !caps.hasTransport(TRANSPORT_WIFI) - && !caps.hasCapability(NET_CAPABILITY_NOT_METERED), - vpnNetworkAgent); + && !caps.hasCapability(NET_CAPABILITY_NOT_METERED)); mMockVpn.disconnect(); } @@ -5893,7 +5649,7 @@ public class ConnectivityServiceTest { // Switch to METERED network. Restrict the use of the network. mWiFiNetworkAgent.disconnect(); - defaultCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); + defaultCallback.expectCallback(CallbackRecord.LOST, mWiFiNetworkAgent); defaultCallback.expectAvailableCallbacksValidatedAndBlocked(mCellNetworkAgent); // Network becomes NOT_METERED. @@ -5907,7 +5663,7 @@ public class ConnectivityServiceTest { defaultCallback.assertNoCallback(); mCellNetworkAgent.disconnect(); - defaultCallback.expectCallback(CallbackState.LOST, mCellNetworkAgent); + defaultCallback.expectCallback(CallbackRecord.LOST, mCellNetworkAgent); defaultCallback.assertNoCallback(); mCm.unregisterNetworkCallback(defaultCallback); @@ -5983,7 +5739,7 @@ public class ConnectivityServiceTest { // the NAT64 prefix was removed because one was never discovered. cellLp.addLinkAddress(myIpv4); mCellNetworkAgent.sendLinkProperties(cellLp); - networkCallback.expectCallback(CallbackState.LINK_PROPERTIES, mCellNetworkAgent); + networkCallback.expectCallback(CallbackRecord.LINK_PROPERTIES_CHANGED, mCellNetworkAgent); verify(mMockDnsResolver, times(1)).stopPrefix64Discovery(cellNetId); verify(mMockDnsResolver, atLeastOnce()).setResolverConfiguration(any()); @@ -5996,7 +5752,7 @@ public class ConnectivityServiceTest { cellLp.removeLinkAddress(myIpv4); cellLp.removeRoute(new RouteInfo(myIpv4, null, MOBILE_IFNAME)); mCellNetworkAgent.sendLinkProperties(cellLp); - networkCallback.expectCallback(CallbackState.LINK_PROPERTIES, mCellNetworkAgent); + networkCallback.expectCallback(CallbackRecord.LINK_PROPERTIES_CHANGED, mCellNetworkAgent); verify(mMockDnsResolver, times(1)).startPrefix64Discovery(cellNetId); // When NAT64 prefix discovery succeeds, LinkProperties are updated and clatd is started. @@ -6004,15 +5760,15 @@ public class ConnectivityServiceTest { assertNull(mCm.getLinkProperties(mCellNetworkAgent.getNetwork()).getNat64Prefix()); mService.mNetdEventCallback.onNat64PrefixEvent(cellNetId, true /* added */, kNat64PrefixString, 96); - LinkProperties lpBeforeClat = (LinkProperties) networkCallback.expectCallback( - CallbackState.LINK_PROPERTIES, mCellNetworkAgent).arg; + LinkProperties lpBeforeClat = networkCallback.expectCallback( + CallbackRecord.LINK_PROPERTIES_CHANGED, mCellNetworkAgent).getLp(); assertEquals(0, lpBeforeClat.getStackedLinks().size()); assertEquals(kNat64Prefix, lpBeforeClat.getNat64Prefix()); verify(mMockNetd, times(1)).clatdStart(MOBILE_IFNAME, kNat64Prefix.toString()); // Clat iface comes up. Expect stacked link to be added. clat.interfaceLinkStateChanged(CLAT_PREFIX + MOBILE_IFNAME, true); - networkCallback.expectCallback(CallbackState.LINK_PROPERTIES, mCellNetworkAgent); + networkCallback.expectCallback(CallbackRecord.LINK_PROPERTIES_CHANGED, mCellNetworkAgent); List<LinkProperties> stackedLps = mCm.getLinkProperties(mCellNetworkAgent.getNetwork()) .getStackedLinks(); assertEquals(makeClatLinkProperties(myIpv4), stackedLps.get(0)); @@ -6020,7 +5776,7 @@ public class ConnectivityServiceTest { // Change trivial linkproperties and see if stacked link is preserved. cellLp.addDnsServer(InetAddress.getByName("8.8.8.8")); mCellNetworkAgent.sendLinkProperties(cellLp); - networkCallback.expectCallback(CallbackState.LINK_PROPERTIES, mCellNetworkAgent); + networkCallback.expectCallback(CallbackRecord.LINK_PROPERTIES_CHANGED, mCellNetworkAgent); List<LinkProperties> stackedLpsAfterChange = mCm.getLinkProperties(mCellNetworkAgent.getNetwork()).getStackedLinks(); @@ -6038,12 +5794,12 @@ public class ConnectivityServiceTest { cellLp.addLinkAddress(myIpv4); cellLp.addRoute(new RouteInfo(myIpv4, null, MOBILE_IFNAME)); mCellNetworkAgent.sendLinkProperties(cellLp); - networkCallback.expectCallback(CallbackState.LINK_PROPERTIES, mCellNetworkAgent); + networkCallback.expectCallback(CallbackRecord.LINK_PROPERTIES_CHANGED, mCellNetworkAgent); verify(mMockNetd, times(1)).clatdStop(MOBILE_IFNAME); verify(mMockDnsResolver, times(1)).stopPrefix64Discovery(cellNetId); // As soon as stop is called, the linkproperties lose the stacked interface. - networkCallback.expectCallback(CallbackState.LINK_PROPERTIES, mCellNetworkAgent); + networkCallback.expectCallback(CallbackRecord.LINK_PROPERTIES_CHANGED, mCellNetworkAgent); LinkProperties actualLpAfterIpv4 = mCm.getLinkProperties(mCellNetworkAgent.getNetwork()); LinkProperties expected = new LinkProperties(cellLp); expected.setNat64Prefix(kNat64Prefix); @@ -6062,41 +5818,39 @@ public class ConnectivityServiceTest { // Stopping prefix discovery causes netd to tell us that the NAT64 prefix is gone. mService.mNetdEventCallback.onNat64PrefixEvent(cellNetId, false /* added */, kNat64PrefixString, 96); - networkCallback.expectLinkPropertiesLike((lp) -> lp.getNat64Prefix() == null, - mCellNetworkAgent); + networkCallback.expectLinkPropertiesThat(mCellNetworkAgent, + (lp) -> lp.getNat64Prefix() == null); // Remove IPv4 address and expect prefix discovery and clatd to be started again. cellLp.removeLinkAddress(myIpv4); cellLp.removeRoute(new RouteInfo(myIpv4, null, MOBILE_IFNAME)); cellLp.removeDnsServer(InetAddress.getByName("8.8.8.8")); mCellNetworkAgent.sendLinkProperties(cellLp); - networkCallback.expectCallback(CallbackState.LINK_PROPERTIES, mCellNetworkAgent); + networkCallback.expectCallback(CallbackRecord.LINK_PROPERTIES_CHANGED, mCellNetworkAgent); verify(mMockDnsResolver, times(1)).startPrefix64Discovery(cellNetId); mService.mNetdEventCallback.onNat64PrefixEvent(cellNetId, true /* added */, kNat64PrefixString, 96); - networkCallback.expectCallback(CallbackState.LINK_PROPERTIES, mCellNetworkAgent); + networkCallback.expectCallback(CallbackRecord.LINK_PROPERTIES_CHANGED, mCellNetworkAgent); verify(mMockNetd, times(1)).clatdStart(MOBILE_IFNAME, kNat64Prefix.toString()); // Clat iface comes up. Expect stacked link to be added. clat.interfaceLinkStateChanged(CLAT_PREFIX + MOBILE_IFNAME, true); - networkCallback.expectLinkPropertiesLike( - (lp) -> lp.getStackedLinks().size() == 1 && lp.getNat64Prefix() != null, - mCellNetworkAgent); + networkCallback.expectLinkPropertiesThat(mCellNetworkAgent, + (lp) -> lp.getStackedLinks().size() == 1 && lp.getNat64Prefix() != null); // NAT64 prefix is removed. Expect that clat is stopped. mService.mNetdEventCallback.onNat64PrefixEvent(cellNetId, false /* added */, kNat64PrefixString, 96); - networkCallback.expectLinkPropertiesLike( - (lp) -> lp.getStackedLinks().size() == 0 && lp.getNat64Prefix() == null, - mCellNetworkAgent); + networkCallback.expectLinkPropertiesThat(mCellNetworkAgent, + (lp) -> lp.getStackedLinks().size() == 0 && lp.getNat64Prefix() == null); verify(mMockNetd, times(1)).clatdStop(MOBILE_IFNAME); - networkCallback.expectLinkPropertiesLike((lp) -> lp.getStackedLinks().size() == 0, - mCellNetworkAgent); + networkCallback.expectLinkPropertiesThat(mCellNetworkAgent, + (lp) -> lp.getStackedLinks().size() == 0); // Clean up. mCellNetworkAgent.disconnect(); - networkCallback.expectCallback(CallbackState.LOST, mCellNetworkAgent); + networkCallback.expectCallback(CallbackRecord.LOST, mCellNetworkAgent); networkCallback.assertNoCallback(); mCm.unregisterNetworkCallback(networkCallback); } @@ -6128,7 +5882,7 @@ public class ConnectivityServiceTest { reset(mNetworkManagementService); mWiFiNetworkAgent.connect(true); networkCallback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); - networkCallback.expectCallback(CallbackState.LOSING, mCellNetworkAgent); + networkCallback.expectCallback(CallbackRecord.LOSING, mCellNetworkAgent); networkCallback.expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, mWiFiNetworkAgent); verify(mNetworkManagementService, times(1)).addIdleTimer(eq(WIFI_IFNAME), anyInt(), eq(ConnectivityManager.TYPE_WIFI)); @@ -6137,7 +5891,7 @@ public class ConnectivityServiceTest { // Disconnect wifi and switch back to cell reset(mNetworkManagementService); mWiFiNetworkAgent.disconnect(); - networkCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); + networkCallback.expectCallback(CallbackRecord.LOST, mWiFiNetworkAgent); assertNoCallbacks(networkCallback); verify(mNetworkManagementService, times(1)).removeIdleTimer(eq(WIFI_IFNAME)); verify(mNetworkManagementService, times(1)).addIdleTimer(eq(MOBILE_IFNAME), anyInt(), @@ -6149,14 +5903,14 @@ public class ConnectivityServiceTest { mWiFiNetworkAgent.sendLinkProperties(wifiLp); mWiFiNetworkAgent.connect(true); networkCallback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); - networkCallback.expectCallback(CallbackState.LOSING, mCellNetworkAgent); + networkCallback.expectCallback(CallbackRecord.LOSING, mCellNetworkAgent); networkCallback.expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, mWiFiNetworkAgent); // Disconnect cell reset(mNetworkManagementService); reset(mMockNetd); mCellNetworkAgent.disconnect(); - networkCallback.expectCallback(CallbackState.LOST, mCellNetworkAgent); + networkCallback.expectCallback(CallbackRecord.LOST, mCellNetworkAgent); // LOST callback is triggered earlier than removing idle timer. Broadcast should also be // sent as network being switched. Ensure rule removal for cell will not be triggered // unexpectedly before network being removed. diff --git a/tools/lock_agent/Android.bp b/tools/lock_agent/Android.bp index 408946b28836..79dce4a8ce09 100644 --- a/tools/lock_agent/Android.bp +++ b/tools/lock_agent/Android.bp @@ -12,13 +12,9 @@ cc_library { ], sdk_version: "current", stl: "c++_static", - include_dirs: [ - // NDK headers aren't available in platform NDK builds. - "libnativehelper/include_jni", - // Use ScopedUtfChars. - "libnativehelper/header_only_include", - ], header_libs: [ + // Use ScopedUtfChars. + "libnativehelper_header_only", "libopenjdkjvmti_headers", ], compile_multilib: "both", @@ -32,13 +28,9 @@ cc_binary_host { "libz", "slicer", ], - include_dirs: [ - // NDK headers aren't available in platform NDK builds. - "libnativehelper/include_jni", - // Use ScopedUtfChars. - "libnativehelper/header_only_include", - ], header_libs: [ + // Use ScopedUtfChars. + "libnativehelper_header_only", "libopenjdkjvmti_headers", ], } diff --git a/tools/preload2/Android.bp b/tools/preload2/Android.bp new file mode 100644 index 000000000000..5809421da3e8 --- /dev/null +++ b/tools/preload2/Android.bp @@ -0,0 +1,50 @@ +// Copyright (C) 2015 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. + +java_library_host { + name: "preload2", + + srcs: ["src/**/*.java"], + + // To connect to devices (and take hprof dumps). + static_libs: [ + "ddmlib-prebuilt", + "tools-common-prebuilt", + + // To process hprof dumps. + "perflib-prebuilt", + + "trove-prebuilt", + "guavalib", + + // For JDWP access we use the framework in the JDWP tests from Apache Harmony, for + // convenience (and to not depend on internal JDK APIs). + "apache-harmony-jdwp-tests", + "junit", + ], + + // Copy to build artifacts + dist: { + targets: [ + "dist_files", + ], + }, +} + +// Copy the preload-tool shell script to the host's bin directory. +sh_binary_host { + name: "preload-tool", + src: "preload-tool", + required: ["preload2"], +} diff --git a/tools/preload2/Android.mk b/tools/preload2/Android.mk deleted file mode 100644 index d3ee1d370855..000000000000 --- a/tools/preload2/Android.mk +++ /dev/null @@ -1,30 +0,0 @@ -LOCAL_PATH:= $(call my-dir) - -include $(CLEAR_VARS) - -LOCAL_SRC_FILES := $(call all-java-files-under,src) - -# To connect to devices (and take hprof dumps). -LOCAL_STATIC_JAVA_LIBRARIES := ddmlib-prebuilt tools-common-prebuilt - -# To process hprof dumps. -LOCAL_STATIC_JAVA_LIBRARIES += perflib-prebuilt trove-prebuilt guavalib - -# For JDWP access we use the framework in the JDWP tests from Apache Harmony, for -# convenience (and to not depend on internal JDK APIs). -LOCAL_STATIC_JAVA_LIBRARIES += apache-harmony-jdwp-tests-host junit-host - -LOCAL_MODULE:= preload2 - -include $(BUILD_HOST_JAVA_LIBRARY) -# Copy to build artifacts -$(call dist-for-goals,dist_files,$(LOCAL_BUILT_MODULE):$(LOCAL_MODULE).jar) - -# Copy the preload-tool shell script to the host's bin directory. -include $(CLEAR_VARS) -LOCAL_IS_HOST_MODULE := true -LOCAL_MODULE_CLASS := EXECUTABLES -LOCAL_MODULE := preload-tool -LOCAL_SRC_FILES := preload-tool -LOCAL_REQUIRED_MODULES := preload2 -include $(BUILD_PREBUILT) |