Merge "Enforce Treble-only neverallows" into oc-dev
diff --git a/apps/CameraITS/tools/run_all_tests.py b/apps/CameraITS/tools/run_all_tests.py
index b1c8177..9e98b79 100644
--- a/apps/CameraITS/tools/run_all_tests.py
+++ b/apps/CameraITS/tools/run_all_tests.py
@@ -19,11 +19,26 @@
 import subprocess
 import time
 import sys
-import textwrap
+
+import its.caps
 import its.device
 from its.device import ItsSession
 
 CHART_DELAY = 1  # seconds
+FACING_EXTERNAL = 2
+SKIP_RET_CODE = 101  # note this must be same as tests/scene*/test_*
+
+
+def skip_sensor_fusion():
+    """Determine if sensor fusion test is skipped for this camera."""
+
+    skip_code = SKIP_RET_CODE
+    with ItsSession() as cam:
+        props = cam.get_camera_properties()
+        if (its.caps.sensor_fusion(props) and its.caps.manual_sensor(props) and
+                props['android.lens.facing'] is not FACING_EXTERNAL):
+            skip_code = None
+    return skip_code
 
 
 def main():
@@ -45,61 +60,58 @@
                all android devices.
     """
 
-    SKIP_RET_CODE = 101
-
     # Not yet mandated tests
     NOT_YET_MANDATED = {
-        "scene0":[
+        "scene0": [
             "test_jitter"
-        ],
-        "scene1":[
+            ],
+        "scene1": [
             "test_ae_af",
             "test_ae_precapture_trigger",
             "test_crop_region_raw",
             "test_ev_compensation_advanced",
             "test_ev_compensation_basic",
             "test_yuv_plus_jpeg"
-        ],
-        "scene2":[],
-        "scene3":[
+            ],
+        "scene2": [],
+        "scene3": [
             "test_lens_movement_reporting",
             "test_lens_position"
-        ],
-        "scene4":[],
-        "scene5":[],
-        "sensor_fusion":[]
+            ],
+        "scene4": [],
+        "scene5": [],
+        "sensor_fusion": []
     }
 
-    all_scenes = ["scene0", "scene1", "scene2", "scene3", "scene4", "scene5"]
+    all_scenes = ["scene0", "scene1", "scene2", "scene3", "scene4", "scene5",
+                  "sensor_fusion"]
 
     auto_scenes = ["scene0", "scene1", "scene2", "scene3", "scene4"]
 
     scene_req = {
-        "scene0" : None,
-        "scene1" : "A grey card covering at least the middle 30% of the scene",
-        "scene2" : "A picture containing human faces",
-        "scene3" : "The ISO 12233 chart",
-        "scene4" : "A specific test page of a circle covering at least the "
-                   "middle 50% of the scene. See CameraITS.pdf section 2.3.4 "
-                   "for more details",
-        "scene5" : "Capture images with a diffuser attached to the camera. See "
-                   "CameraITS.pdf section 2.3.4 for more details",
-        "sensor_fusion" : "Rotating checkboard pattern. See "
-                          "sensor_fusion/SensorFusion.pdf for detailed "
-                          "instructions. Note that this test will be skipped "
-                          "on devices not supporting REALTIME camera timestamp."
-                          "If that is the case, no scene setup is required and "
-                          "you can just answer Y when being asked if the scene "
-                          "is okay"
+        "scene0": None,
+        "scene1": "A grey card covering at least the middle 30% of the scene",
+        "scene2": "A picture containing human faces",
+        "scene3": "The ISO 12233 chart",
+        "scene4": "A specific test page of a circle covering at least the "
+                  "middle 50% of the scene. See CameraITS.pdf section 2.3.4 "
+                  "for more details",
+        "scene5": "Capture images with a diffuser attached to the camera. See "
+                  "CameraITS.pdf section 2.3.4 for more details",
+        "sensor_fusion": "Rotating checkboard pattern. See "
+                         "sensor_fusion/SensorFusion.pdf for detailed "
+                         "instructions.\nNote that this test will be skipped "
+                         "on devices not supporting REALTIME camera timestamp."
     }
     scene_extra_args = {
-        "scene5" : ["doAF=False"]
+        "scene5": ["doAF=False"]
     }
 
     camera_ids = []
     scenes = []
     chart_host_id = None
     result_device_id = None
+    rot_rig_id = None
 
     for s in sys.argv[1:]:
         if s[:7] == "camera=" and len(s) > 7:
@@ -110,6 +122,9 @@
             chart_host_id = s[6:]
         elif s[:7] == 'result=' and len(s) > 7:
             result_device_id = s[7:]
+        elif s[:8] == 'rot_rig=' and len(s) > 8:
+            rot_rig_id = s[8:]  # valid values: 'default' or '$VID:$PID:$CH'
+            # The default '$VID:$PID:$CH' is '04d8:fc73:1'
 
     auto_scene_switch = chart_host_id is not None
     merge_result_switch = result_device_id is not None
@@ -128,7 +143,6 @@
             else:
                 try:
                     # Try replace "X" to "sceneX"
-                    scene_num = int(s)
                     scene_str = "scene" + s
                     if scene_str not in possible_scenes:
                         valid_scenes = False
@@ -140,7 +154,7 @@
 
         if not valid_scenes:
             print "Unknown scene specifiied:", s
-            assert(False)
+            assert False
         scenes = temp_scenes
 
     # Initialize test results
@@ -157,7 +171,7 @@
     device_id_arg = "device=" + device_id
     print "Testing device " + device_id
 
-    #Sanity Check for devices
+    # Sanity Check for devices
     device_bfp = its.device.get_device_fingerprint(device_id)
     assert device_bfp is not None
 
@@ -167,19 +181,19 @@
 
     if merge_result_switch:
         result_device_bfp = its.device.get_device_fingerprint(result_device_id)
-        assert device_bfp == result_device_bfp, \
-            "Can not merge result to a different build, from %s to %s" \
-             % (device_bfp, result_device_bfp)
+        assert_err_msg = ('Cannot merge result to a different build, from '
+                          '%s to %s' % (device_bfp, result_device_bfp))
+        assert device_bfp == result_device_bfp, assert_err_msg
 
     # user doesn't specify camera id, run through all cameras
     if not camera_ids:
         camera_ids_path = os.path.join(topdir, "camera_ids.txt")
         out_arg = "out=" + camera_ids_path
         cmd = ['python',
-               os.path.join(os.getcwd(),"tools/get_camera_ids.py"), out_arg,
+               os.path.join(os.getcwd(), "tools/get_camera_ids.py"), out_arg,
                device_id_arg]
-        retcode = subprocess.call(cmd,cwd=topdir)
-        assert(retcode == 0)
+        cam_code = subprocess.call(cmd, cwd=topdir)
+        assert cam_code == 0
         with open(camera_ids_path, "r") as f:
             for line in f:
                 camera_ids.append(line.replace('\n', ''))
@@ -196,8 +210,8 @@
             screen_id_arg = ('screen=%s' % chart_host_id)
             cmd = ['python', os.path.join(os.environ['CAMERA_ITS_TOP'], 'tools',
                                           'wake_up_screen.py'), screen_id_arg]
-            retcode = subprocess.call(cmd)
-            assert retcode == 0
+            wake_code = subprocess.call(cmd)
+            assert wake_code == 0
 
     for camera_id in camera_ids:
         # Loop capturing images until user confirm test scene is correct
@@ -209,8 +223,9 @@
             os.mkdir(os.path.join(topdir, camera_id, d))
 
         for scene in scenes:
-            tests = [(s[:-3],os.path.join("tests", scene, s))
-                     for s in os.listdir(os.path.join("tests",scene))
+            skip_code = None
+            tests = [(s[:-3], os.path.join("tests", scene, s))
+                     for s in os.listdir(os.path.join("tests", scene))
                      if s[-3:] == ".py" and s[:4] == "test"]
             tests.sort()
 
@@ -219,36 +234,42 @@
             numskip = 0
             num_not_mandated_fail = 0
             numfail = 0
-            if scene_req[scene] != None:
+            validate_switch = True
+            if scene_req[scene] is not None:
                 out_path = os.path.join(topdir, camera_id, scene+".jpg")
                 out_arg = "out=" + out_path
+                if scene == 'sensor_fusion':
+                    skip_code = skip_sensor_fusion()
+                    if rot_rig_id or skip_code == SKIP_RET_CODE:
+                        validate_switch = False
+                if scene == 'scene5':
+                    validate_switch = False
                 cmd = None
                 if auto_scene_switch:
-                    if not merge_result_switch or \
-                            (merge_result_switch and camera_ids[0] == '0'):
-                        scene_arg = "scene=" + scene
+                    if (not merge_result_switch or
+                            (merge_result_switch and camera_ids[0] == '0')):
+                        scene_arg = 'scene=' + scene
                         cmd = ['python',
                                os.path.join(os.getcwd(), 'tools/load_scene.py'),
                                scene_arg, screen_id_arg]
                     else:
                         time.sleep(CHART_DELAY)
                 else:
-                    # Skip scene validation for scene 5 running in parallel
-                    if not merge_result_switch or scene != 'scene5':
-                        scene_arg = "scene=" + scene_req[scene]
+                    # Skip scene validation under certain conditions
+                    if validate_switch and not merge_result_switch:
+                        scene_arg = 'scene=' + scene_req[scene]
                         extra_args = scene_extra_args.get(scene, [])
                         cmd = ['python',
-                                os.path.join(os.getcwd(),"tools/validate_scene.py"),
-                                camera_id_arg, out_arg,
-                                scene_arg, device_id_arg] + extra_args
-
+                               os.path.join(os.getcwd(),
+                                            'tools/validate_scene.py'),
+                               camera_id_arg, out_arg,
+                               scene_arg, device_id_arg] + extra_args
                 if cmd is not None:
-                    retcode = subprocess.call(cmd,cwd=topdir)
-                    assert(retcode == 0)
+                    valid_scene_code = subprocess.call(cmd, cwd=topdir)
+                    assert valid_scene_code == 0
             print "Start running ITS on camera %s, %s" % (camera_id, scene)
-
             # Run each test, capturing stdout and stderr.
-            for (testname,testpath) in tests:
+            for (testname, testpath) in tests:
                 if auto_scene_switch:
                     if merge_result_switch and camera_ids[0] == '0':
                         # Send an input event to keep the screen not dimmed.
@@ -260,25 +281,37 @@
                         cmd = ('adb -s %s shell input keyevent FOCUS'
                                % chart_host_id)
                         subprocess.call(cmd.split())
-                cmd = ['python', os.path.join(os.getcwd(),testpath)] + \
-                      sys.argv[1:] + [camera_id_arg]
-                outdir = os.path.join(topdir,camera_id,scene)
-                outpath = os.path.join(outdir,testname+"_stdout.txt")
-                errpath = os.path.join(outdir,testname+"_stderr.txt")
                 t0 = time.time()
-                with open(outpath,"w") as fout, open(errpath,"w") as ferr:
-                    retcode = subprocess.call(
-                            cmd,stderr=ferr,stdout=fout,cwd=outdir)
+                outdir = os.path.join(topdir, camera_id, scene)
+                outpath = os.path.join(outdir, testname+'_stdout.txt')
+                errpath = os.path.join(outdir, testname+'_stderr.txt')
+                if scene == 'sensor_fusion':
+                    if skip_code is not SKIP_RET_CODE:
+                        if rot_rig_id:
+                            print 'Rotating phone w/ rig %s' % rot_rig_id
+                            rig = ('python tools/rotation_rig.py rotator=%s' %
+                                   rot_rig_id)
+                            subprocess.Popen(rig.split())
+                        else:
+                            print 'Rotate phone 15s as shown in SensorFusion.pdf'
+                    else:
+                        test_code = skip_code
+                if skip_code is not SKIP_RET_CODE:
+                    cmd = ['python', os.path.join(os.getcwd(), testpath)]
+                    cmd += sys.argv[1:] + [camera_id_arg]
+                    with open(outpath, 'w') as fout, open(errpath, 'w') as ferr:
+                        test_code = subprocess.call(
+                            cmd, stderr=ferr, stdout=fout, cwd=outdir)
                 t1 = time.time()
 
                 test_failed = False
-                if retcode == 0:
+                if test_code == 0:
                     retstr = "PASS "
                     numpass += 1
-                elif retcode == SKIP_RET_CODE:
+                elif test_code == SKIP_RET_CODE:
                     retstr = "SKIP "
                     numskip += 1
-                elif retcode != 0 and testname in NOT_YET_MANDATED[scene]:
+                elif test_code != 0 and testname in NOT_YET_MANDATED[scene]:
                     retstr = "FAIL*"
                     num_not_mandated_fail += 1
                 else:
@@ -294,16 +327,15 @@
 
             if numskip > 0:
                 skipstr = ", %d test%s skipped" % (
-                        numskip, "s" if numskip > 1 else "")
+                    numskip, "s" if numskip > 1 else "")
             else:
                 skipstr = ""
 
             test_result = "\n%d / %d tests passed (%.1f%%)%s" % (
-                    numpass + num_not_mandated_fail, len(tests) - numskip,
-                    100.0 * float(numpass + num_not_mandated_fail) /
-                            (len(tests) - numskip)
-                            if len(tests) != numskip else 100.0,
-                    skipstr)
+                numpass + num_not_mandated_fail, len(tests) - numskip,
+                100.0 * float(numpass + num_not_mandated_fail) /
+                (len(tests) - numskip)
+                if len(tests) != numskip else 100.0, skipstr)
             print test_result
 
             if num_not_mandated_fail > 0:
@@ -316,7 +348,7 @@
 
             passed = numfail == 0
             results[scene][result_key] = (ItsSession.RESULT_PASS if passed
-                    else ItsSession.RESULT_FAIL)
+                                          else ItsSession.RESULT_FAIL)
             results[scene][ItsSession.SUMMARY_KEY] = summary_path
 
         print "Reporting ITS result to CtsVerifier"
@@ -335,15 +367,15 @@
             screen_id_arg = ('screen=%s' % chart_host_id)
             cmd = ['python', os.path.join(os.environ['CAMERA_ITS_TOP'], 'tools',
                                           'turn_off_screen.py'), screen_id_arg]
-            retcode = subprocess.call(cmd)
-            assert retcode == 0
+            screen_off_code = subprocess.call(cmd)
+            assert screen_off_code == 0
 
             print 'Shutting down DUT screen: ', device_id
             screen_id_arg = ('screen=%s' % device_id)
             cmd = ['python', os.path.join(os.environ['CAMERA_ITS_TOP'], 'tools',
-                                      'turn_off_screen.py'), screen_id_arg]
-            retcode = subprocess.call(cmd)
-            assert retcode == 0
+                                          'turn_off_screen.py'), screen_id_arg]
+            screen_off_code = subprocess.call(cmd)
+            assert screen_off_code == 0
 
     print "ITS tests finished. Please go back to CtsVerifier and proceed"
 
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/usb/device/UsbDeviceTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/usb/device/UsbDeviceTestActivity.java
index 996a056..6794059 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/usb/device/UsbDeviceTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/usb/device/UsbDeviceTestActivity.java
@@ -67,6 +67,7 @@
 import java.util.NoSuchElementException;
 import java.util.Random;
 import java.util.Set;
+import java.util.concurrent.TimeoutException;
 import java.util.concurrent.atomic.AtomicInteger;
 
 public class UsbDeviceTestActivity extends PassFailButtons.Activity {
@@ -842,14 +843,12 @@
         runAndAssertException(() -> connection.requestWait(-1), IllegalArgumentException.class);
 
         long startTime = now();
-        UsbRequest req = connection.requestWait(100);
-        assertNull(req);
+        runAndAssertException(() -> connection.requestWait(100), TimeoutException.class);
         assertTrue(now() - startTime >= 100);
         assertTrue(now() - startTime < 400);
 
         startTime = now();
-        req = connection.requestWait(0);
-        assertNull(req);
+        runAndAssertException(() -> connection.requestWait(0), TimeoutException.class);
         assertTrue(now() - startTime < 400);
     }
 
@@ -860,7 +859,7 @@
      * @param in         The endpoint to receive requests from
      */
     private void receiveAfterTimeout(@NonNull UsbDeviceConnection connection,
-            @NonNull UsbEndpoint in, int timeout) throws InterruptedException {
+            @NonNull UsbEndpoint in, long timeout) throws InterruptedException, TimeoutException {
         UsbRequest reqQueued = new UsbRequest();
         ByteBuffer buffer = ByteBuffer.allocate(1);
 
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/wifiaware/testcase/DataPathInBandTestCase.java b/apps/CtsVerifier/src/com/android/cts/verifier/wifiaware/testcase/DataPathInBandTestCase.java
index 7ecdc30..a73f964 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/wifiaware/testcase/DataPathInBandTestCase.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/wifiaware/testcase/DataPathInBandTestCase.java
@@ -285,12 +285,11 @@
         // 6. request network
         ConnectivityManager cm = (ConnectivityManager) mContext.getSystemService(
                 Context.CONNECTIVITY_SERVICE);
-        String networkSpecifier = mIsSecurityOpen ? discoverySession.createNetworkSpecifierOpen(
-                peerHandle) : discoverySession.createNetworkSpecifierPassphrase(peerHandle,
-                PASSPHRASE);
         NetworkRequest nr = new NetworkRequest.Builder().addTransportType(
                 NetworkCapabilities.TRANSPORT_WIFI_AWARE).setNetworkSpecifier(
-                networkSpecifier).build();
+                mIsSecurityOpen ? discoverySession.createNetworkSpecifierOpen(peerHandle)
+                        : discoverySession.createNetworkSpecifierPassphrase(peerHandle,
+                                PASSPHRASE)).build();
         CallbackUtils.NetworkCb networkCb = new CallbackUtils.NetworkCb();
         cm.requestNetwork(nr, CALLBACK_TIMEOUT_SEC * 1000, networkCb);
         mListener.onTestMsgReceived(mContext.getString(R.string.aware_status_network_requested));
@@ -374,12 +373,11 @@
         // 4. Request network
         ConnectivityManager cm = (ConnectivityManager) mContext.getSystemService(
                 Context.CONNECTIVITY_SERVICE);
-        String networkSpecifier = mIsSecurityOpen ? discoverySession.createNetworkSpecifierOpen(
-                peerHandle) : discoverySession.createNetworkSpecifierPassphrase(peerHandle,
-                PASSPHRASE);
         NetworkRequest nr = new NetworkRequest.Builder().addTransportType(
                 NetworkCapabilities.TRANSPORT_WIFI_AWARE).setNetworkSpecifier(
-                networkSpecifier).build();
+                mIsSecurityOpen ? discoverySession.createNetworkSpecifierOpen(peerHandle)
+                        : discoverySession.createNetworkSpecifierPassphrase(peerHandle,
+                                PASSPHRASE)).build();
         CallbackUtils.NetworkCb networkCb = new CallbackUtils.NetworkCb();
         cm.requestNetwork(nr, CALLBACK_TIMEOUT_SEC * 1000, networkCb);
         mListener.onTestMsgReceived(mContext.getString(R.string.aware_status_network_requested));
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/wifiaware/testcase/DataPathOutOfBandTestCase.java b/apps/CtsVerifier/src/com/android/cts/verifier/wifiaware/testcase/DataPathOutOfBandTestCase.java
index a2e0de5..3dc31e1 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/wifiaware/testcase/DataPathOutOfBandTestCase.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/wifiaware/testcase/DataPathOutOfBandTestCase.java
@@ -265,13 +265,13 @@
         // 6. Request network (as Responder) and wait for network
         ConnectivityManager cm = (ConnectivityManager) mContext.getSystemService(
                 Context.CONNECTIVITY_SERVICE);
-        String networkSpecifier = mIsSecurityOpen ? mWifiAwareSession.createNetworkSpecifierOpen(
-                WifiAwareManager.WIFI_AWARE_DATA_PATH_ROLE_RESPONDER, peerMac)
-                : mWifiAwareSession.createNetworkSpecifierPassphrase(
-                        WifiAwareManager.WIFI_AWARE_DATA_PATH_ROLE_RESPONDER, peerMac, PASSPHRASE);
         NetworkRequest nr = new NetworkRequest.Builder().addTransportType(
                 NetworkCapabilities.TRANSPORT_WIFI_AWARE).setNetworkSpecifier(
-                networkSpecifier).build();
+                mIsSecurityOpen ? mWifiAwareSession.createNetworkSpecifierOpen(
+                        WifiAwareManager.WIFI_AWARE_DATA_PATH_ROLE_RESPONDER, peerMac)
+                        : mWifiAwareSession.createNetworkSpecifierPassphrase(
+                                WifiAwareManager.WIFI_AWARE_DATA_PATH_ROLE_RESPONDER, peerMac,
+                                PASSPHRASE)).build();
         CallbackUtils.NetworkCb networkCb = new CallbackUtils.NetworkCb();
         cm.requestNetwork(nr, CALLBACK_TIMEOUT_SEC * 1000, networkCb);
         mListener.onTestMsgReceived(mContext.getString(R.string.aware_status_network_requested));
@@ -397,13 +397,13 @@
         // 8. Request network (as Initiator) and wait for network
         ConnectivityManager cm = (ConnectivityManager) mContext.getSystemService(
                 Context.CONNECTIVITY_SERVICE);
-        String networkSpecifier = mIsSecurityOpen ? mWifiAwareSession.createNetworkSpecifierOpen(
-                WifiAwareManager.WIFI_AWARE_DATA_PATH_ROLE_INITIATOR, peerMac)
-                : mWifiAwareSession.createNetworkSpecifierPassphrase(
-                        WifiAwareManager.WIFI_AWARE_DATA_PATH_ROLE_INITIATOR, peerMac, PASSPHRASE);
         NetworkRequest nr = new NetworkRequest.Builder().addTransportType(
                 NetworkCapabilities.TRANSPORT_WIFI_AWARE).setNetworkSpecifier(
-                networkSpecifier).build();
+                mIsSecurityOpen ? mWifiAwareSession.createNetworkSpecifierOpen(
+                        WifiAwareManager.WIFI_AWARE_DATA_PATH_ROLE_INITIATOR, peerMac)
+                        : mWifiAwareSession.createNetworkSpecifierPassphrase(
+                                WifiAwareManager.WIFI_AWARE_DATA_PATH_ROLE_INITIATOR, peerMac,
+                                PASSPHRASE)).build();
         CallbackUtils.NetworkCb networkCb = new CallbackUtils.NetworkCb();
         cm.requestNetwork(nr, CALLBACK_TIMEOUT_SEC * 1000, networkCb);
         mListener.onTestMsgReceived(mContext.getString(R.string.aware_status_network_requested));
diff --git a/apps/CtsVerifierUSBCompanion/src/com/android/cts/verifierusbcompanion/DeviceTestCompanion.java b/apps/CtsVerifierUSBCompanion/src/com/android/cts/verifierusbcompanion/DeviceTestCompanion.java
index 001b18a..7cbeccf 100644
--- a/apps/CtsVerifierUSBCompanion/src/com/android/cts/verifierusbcompanion/DeviceTestCompanion.java
+++ b/apps/CtsVerifierUSBCompanion/src/com/android/cts/verifierusbcompanion/DeviceTestCompanion.java
@@ -76,7 +76,8 @@
         assertEquals(42, sizeBuffer[0]);
         assertEquals(1, numRead);
 
-        return Charset.forName("UTF-8").decode(ByteBuffer.wrap(nextTestNameBytes)).toString();
+        return Charset.forName("UTF-8").decode(
+                ByteBuffer.wrap(nextTestNameBytes)).toString().trim();
     }
 
     /**
diff --git a/hostsidetests/incident/src/com/android/server/cts/NotificationTest.java b/hostsidetests/incident/src/com/android/server/cts/NotificationTest.java
index 0e27a66..10a1b77 100644
--- a/hostsidetests/incident/src/com/android/server/cts/NotificationTest.java
+++ b/hostsidetests/incident/src/com/android/server/cts/NotificationTest.java
@@ -43,7 +43,6 @@
                 found = true;
                 assertEquals(State.POSTED, record.getState());
                 assertTrue(record.getImportance() > 0 /* NotificationManager.IMPORTANCE_NONE */);
-                assertEquals(record.getKey(), record.getGroupKey());
 
                 // Ensure these fields exist, at least
                 record.getFlags();
diff --git a/tests/autofillservice/src/android/autofillservice/cts/LoginActivityTest.java b/tests/autofillservice/src/android/autofillservice/cts/LoginActivityTest.java
index f6ddb13..3f68b50 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/LoginActivityTest.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/LoginActivityTest.java
@@ -57,7 +57,6 @@
 import android.content.IntentFilter;
 import android.content.IntentSender;
 import android.os.Bundle;
-import android.os.SystemClock;
 import android.support.test.rule.ActivityTestRule;
 import android.support.test.uiautomator.UiObject2;
 import android.view.View;
@@ -85,7 +84,7 @@
  *
  *  Save
  *  - test cases where only non-savable-ids are changed
- *  - test case where 'no thanks' is tapped (similar to testSaveSnackBarGoesAway())
+ *  - test case where 'no thanks' or 'x' is tapped (similar to former testSaveSnackBarGoesAway())
  *
  *  Other assertions
  *  - illegal state thrown on callback calls
@@ -810,53 +809,6 @@
         assertNoDanglingSessions();
     }
 
-    private void setSnackBarLifetimeMs(long timeout) {
-        runShellCommand("cmd autofill set save_timeout %s", timeout);
-    }
-
-    @Test
-    public void testSaveSnackBarGoesAway() throws Exception {
-        enableService();
-        final int timeout = 1000;
-        setSnackBarLifetimeMs(timeout);
-
-        try {
-            // Set expectations.
-            sReplier.addResponse(new CannedFillResponse.Builder()
-                    .setRequiredSavableIds(SAVE_DATA_TYPE_PASSWORD, ID_USERNAME, ID_PASSWORD)
-                    .build());
-
-            // Trigger auto-fill.
-            mActivity.onUsername(View::requestFocus);
-
-            // Wait for onFill() before proceeding, otherwise the fields might be changed before
-            // the session started
-            sReplier.getNextFillRequest();
-
-            // Sanity check.
-            sUiBot.assertNoDatasets();
-
-            // Set credentials...
-            mActivity.onUsername((v) -> v.setText("malkovich"));
-            mActivity.onPassword((v) -> v.setText("malkovich"));
-
-            // ...and login
-            final String expectedMessage = getWelcomeMessage("malkovich");
-            final String actualMessage = mActivity.tapLogin();
-            assertWithMessage("Wrong welcome msg").that(actualMessage).isEqualTo(expectedMessage);
-
-            // Assert the snack bar is shown.
-            sUiBot.assertSaveShowing(SAVE_DATA_TYPE_PASSWORD);
-            SystemClock.sleep(timeout);
-            sUiBot.assertSaveNotShowing(SAVE_DATA_TYPE_PASSWORD);
-
-            // Sanity check: once timed out, session should be finsihed.
-            assertNoDanglingSessions();
-        } finally {
-            setSnackBarLifetimeMs(5000);
-        }
-    }
-
     @Test
     public void testGenericSave() throws Exception {
         customizedSaveTest(SAVE_DATA_TYPE_GENERIC);
diff --git a/tests/signature/src/android/signature/cts/JDiffClassDescription.java b/tests/signature/src/android/signature/cts/JDiffClassDescription.java
index 2779ea7..2d13ed2 100644
--- a/tests/signature/src/android/signature/cts/JDiffClassDescription.java
+++ b/tests/signature/src/android/signature/cts/JDiffClassDescription.java
@@ -58,6 +58,8 @@
         // list are probably not meant to be implemented in an application.
         HIDDEN_INTERFACE_WHITELIST.add("public abstract boolean android.companion.DeviceFilter.matches(D)");
         HIDDEN_INTERFACE_WHITELIST.add("public static <D> boolean android.companion.DeviceFilter.matches(android.companion.DeviceFilter<D>,D)");
+        HIDDEN_INTERFACE_WHITELIST.add("public abstract java.lang.String android.companion.DeviceFilter.getDeviceDisplayName(D)");
+        HIDDEN_INTERFACE_WHITELIST.add("public abstract int android.companion.DeviceFilter.getMediumType()");
         HIDDEN_INTERFACE_WHITELIST.add("public abstract void android.nfc.tech.TagTechnology.reconnect() throws java.io.IOException");
         HIDDEN_INTERFACE_WHITELIST.add("public abstract void android.os.IBinder.shellCommand(java.io.FileDescriptor,java.io.FileDescriptor,java.io.FileDescriptor,java.lang.String[],android.os.ShellCallback,android.os.ResultReceiver) throws android.os.RemoteException");
         HIDDEN_INTERFACE_WHITELIST.add("public abstract int android.text.ParcelableSpan.getSpanTypeIdInternal()");
diff --git a/tests/tests/content/src/android/content/cts/AvailableIntentsTest.java b/tests/tests/content/src/android/content/cts/AvailableIntentsTest.java
index b69a8c5..096eef9 100644
--- a/tests/tests/content/src/android/content/cts/AvailableIntentsTest.java
+++ b/tests/tests/content/src/android/content/cts/AvailableIntentsTest.java
@@ -276,6 +276,9 @@
     }
 
     public void testAlarmClockShowTimers() {
+        if (mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_LEANBACK_ONLY)) {
+            return;
+        }
         Intent intent = new Intent(AlarmClock.ACTION_SHOW_TIMERS);
         assertCanBeHandled(intent);
     }
diff --git a/tests/tests/graphics/res/drawable-nodpi/alpha_mask.png b/tests/tests/graphics/res/drawable-nodpi/alpha_mask.png
new file mode 100644
index 0000000..1d6177f
--- /dev/null
+++ b/tests/tests/graphics/res/drawable-nodpi/alpha_mask.png
Binary files differ
diff --git a/tests/tests/graphics/src/android/graphics/cts/BitmapColorSpaceTest.java b/tests/tests/graphics/src/android/graphics/cts/BitmapColorSpaceTest.java
index 194f36c..5012e1c 100644
--- a/tests/tests/graphics/src/android/graphics/cts/BitmapColorSpaceTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/BitmapColorSpaceTest.java
@@ -26,6 +26,7 @@
 import android.support.test.InstrumentationRegistry;
 import android.support.test.filters.SmallTest;
 import android.support.test.runner.AndroidJUnit4;
+import android.util.Log;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -40,11 +41,14 @@
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 @SmallTest
 @RunWith(AndroidJUnit4.class)
 public class BitmapColorSpaceTest {
+    private static final String LOG_TAG = "BitmapColorSpaceTest";
+
     private Resources mResources;
 
     @Before
@@ -52,12 +56,92 @@
         mResources = InstrumentationRegistry.getTargetContext().getResources();
     }
 
+    @SuppressWarnings("deprecation")
+    @Test
+    public void createWithColorSpace() {
+        Bitmap b;
+        ColorSpace cs;
+
+        // We don't test HARDWARE configs because they are not compatible with mutable bitmaps
+
+        b = Bitmap.createBitmap(32, 32, Bitmap.Config.ARGB_8888, true, null);
+        cs = b.getColorSpace();
+        assertNotNull(cs);
+        assertSame(ColorSpace.get(ColorSpace.Named.SRGB), cs);
+
+        b = Bitmap.createBitmap(32, 32, Bitmap.Config.ARGB_8888, true,
+                ColorSpace.get(ColorSpace.Named.ADOBE_RGB));
+        cs = b.getColorSpace();
+        assertNotNull(cs);
+        assertSame(ColorSpace.get(ColorSpace.Named.ADOBE_RGB), cs);
+
+        b = Bitmap.createBitmap(32, 32, Bitmap.Config.RGBA_F16, true, null);
+        cs = b.getColorSpace();
+        assertNotNull(cs);
+        assertSame(ColorSpace.get(ColorSpace.Named.LINEAR_EXTENDED_SRGB), cs);
+
+        b = Bitmap.createBitmap(32, 32, Bitmap.Config.RGBA_F16, true,
+                ColorSpace.get(ColorSpace.Named.ADOBE_RGB));
+        cs = b.getColorSpace();
+        assertNotNull(cs);
+        assertSame(ColorSpace.get(ColorSpace.Named.LINEAR_EXTENDED_SRGB), cs);
+
+        b = Bitmap.createBitmap(32, 32, Bitmap.Config.RGB_565, true, null);
+        cs = b.getColorSpace();
+        assertNotNull(cs);
+        assertSame(ColorSpace.get(ColorSpace.Named.SRGB), cs);
+
+        b = Bitmap.createBitmap(32, 32, Bitmap.Config.RGB_565, true,
+                ColorSpace.get(ColorSpace.Named.ADOBE_RGB));
+        cs = b.getColorSpace();
+        assertNotNull(cs);
+        assertSame(ColorSpace.get(ColorSpace.Named.SRGB), cs);
+
+        b = Bitmap.createBitmap(32, 32, Bitmap.Config.ALPHA_8, true, null);
+        cs = b.getColorSpace();
+        assertNotNull(cs);
+        assertSame(ColorSpace.get(ColorSpace.Named.SRGB), cs);
+
+        b = Bitmap.createBitmap(32, 32, Bitmap.Config.ALPHA_8, true,
+                ColorSpace.get(ColorSpace.Named.ADOBE_RGB));
+        cs = b.getColorSpace();
+        assertNotNull(cs);
+        assertSame(ColorSpace.get(ColorSpace.Named.SRGB), cs);
+
+        b = Bitmap.createBitmap(32, 32, Bitmap.Config.ARGB_4444, true, null);
+        cs = b.getColorSpace();
+        assertNotNull(cs);
+        assertSame(ColorSpace.get(ColorSpace.Named.SRGB), cs);
+
+        b = Bitmap.createBitmap(32, 32, Bitmap.Config.ARGB_4444, true,
+                ColorSpace.get(ColorSpace.Named.ADOBE_RGB));
+        cs = b.getColorSpace();
+        assertNotNull(cs);
+        assertSame(ColorSpace.get(ColorSpace.Named.SRGB), cs);
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void createWithNonRgbColorSpace() {
+        Bitmap.createBitmap(32, 32, Bitmap.Config.ARGB_8888, true,
+                ColorSpace.get(ColorSpace.Named.CIE_LAB));
+    }
+
     @Test
     public void sRGB() {
         Bitmap b = BitmapFactory.decodeResource(mResources, R.drawable.robot);
         ColorSpace cs = b.getColorSpace();
         assertNotNull(cs);
         assertSame(ColorSpace.get(ColorSpace.Named.SRGB), cs);
+
+        b = Bitmap.createBitmap(b, 0, 0, b.getWidth() / 2, b.getHeight() / 2);
+        cs = b.getColorSpace();
+        assertNotNull(cs);
+        assertSame(ColorSpace.get(ColorSpace.Named.SRGB), cs);
+
+        b = Bitmap.createScaledBitmap(b, b.getWidth() / 2, b.getHeight() / 2, true);
+        cs = b.getColorSpace();
+        assertNotNull(cs);
+        assertSame(ColorSpace.get(ColorSpace.Named.SRGB), cs);
     }
 
     @Test
@@ -67,6 +151,16 @@
             ColorSpace cs = b.getColorSpace();
             assertNotNull(cs);
             assertSame(ColorSpace.get(ColorSpace.Named.DISPLAY_P3), cs);
+
+            b = Bitmap.createBitmap(b, 0, 0, b.getWidth() / 2, b.getHeight() / 2);
+            cs = b.getColorSpace();
+            assertNotNull(cs);
+            assertSame(ColorSpace.get(ColorSpace.Named.DISPLAY_P3), cs);
+
+            b = Bitmap.createScaledBitmap(b, b.getWidth() / 2, b.getHeight() / 2, true);
+            cs = b.getColorSpace();
+            assertNotNull(cs);
+            assertSame(ColorSpace.get(ColorSpace.Named.DISPLAY_P3), cs);
         } catch (IOException e) {
             fail();
         }
@@ -79,6 +173,16 @@
             ColorSpace cs = b.getColorSpace();
             assertNotNull(cs);
             assertSame(ColorSpace.get(ColorSpace.Named.LINEAR_EXTENDED_SRGB), cs);
+
+            b = Bitmap.createBitmap(b, 0, 0, b.getWidth() / 2, b.getHeight() / 2);
+            cs = b.getColorSpace();
+            assertNotNull(cs);
+            assertSame(ColorSpace.get(ColorSpace.Named.LINEAR_EXTENDED_SRGB), cs);
+
+            b = Bitmap.createScaledBitmap(b, b.getWidth() / 2, b.getHeight() / 2, true);
+            cs = b.getColorSpace();
+            assertNotNull(cs);
+            assertSame(ColorSpace.get(ColorSpace.Named.LINEAR_EXTENDED_SRGB), cs);
         } catch (IOException e) {
             fail();
         }
@@ -139,7 +243,7 @@
 
     @Test
     public void getPixel() {
-        verifyGetPixel("green-p3.png", 0x75fb4cff, 0xff03ff00);
+        verifyGetPixel("green-p3.png", 0x75fb4cff, 0xff00ff00);
         verifyGetPixel("translucent-green-p3.png", 0x3a7d267f, 0x7f00ff00); // 50% translucent
     }
 
@@ -151,22 +255,34 @@
             assertNotNull(cs);
             assertSame(ColorSpace.get(ColorSpace.Named.DISPLAY_P3), cs);
 
-            ByteBuffer dst = ByteBuffer.allocate(b.getByteCount());
-            b.copyPixelsToBuffer(dst);
-            dst.rewind();
-            // Stored as RGBA
-            assertEquals(rawColor, dst.asIntBuffer().get());
+            verifyGetPixel(b, rawColor, srgbColor);
 
-            int srgb = b.getPixel(31, 31);
-            assertEquals(srgbColor, srgb);
+            b = Bitmap.createBitmap(b, 0, 0, b.getWidth() / 2, b.getHeight() / 2);
+            verifyGetPixel(b, rawColor, srgbColor);
+
+            b = Bitmap.createScaledBitmap(b, b.getWidth() / 2, b.getHeight() / 2, true);
+            verifyGetPixel(b, rawColor, srgbColor);
         } catch (IOException e) {
             fail();
         }
     }
 
+    private static void verifyGetPixel(@NonNull Bitmap b,
+            @ColorInt int rawColor, @ColorInt int srgbColor) {
+        ByteBuffer dst = ByteBuffer.allocate(b.getByteCount());
+        b.copyPixelsToBuffer(dst);
+        dst.rewind();
+
+        // Stored as RGBA
+        assertEquals(rawColor, dst.asIntBuffer().get());
+
+        int srgb = b.getPixel(15, 15);
+        almostEqual(srgbColor, srgb, 3, 15 * b.getWidth() + 15);
+    }
+
     @Test
     public void getPixels() {
-        verifyGetPixels("green-p3.png", 0xff03ff00);
+        verifyGetPixels("green-p3.png", 0xff00ff00);
         verifyGetPixels("translucent-green-p3.png", 0x7f00ff00); // 50% translucent
     }
 
@@ -177,16 +293,28 @@
             assertNotNull(cs);
             assertSame(ColorSpace.get(ColorSpace.Named.DISPLAY_P3), cs);
 
-            int[] pixels = new int[b.getWidth() * b.getHeight()];
-            b.getPixels(pixels, 0, b.getWidth(), 0, 0, b.getWidth(), b.getHeight());
-            for (int pixel : pixels) {
-                assertEquals(expected, pixel);
-            }
+            verifyGetPixels(b, expected);
+
+            b = Bitmap.createBitmap(b, 0, 0, b.getWidth() / 2, b.getHeight() / 2);
+            verifyGetPixels(b, expected);
+
+            b = Bitmap.createScaledBitmap(b, b.getWidth() / 2, b.getHeight() / 2, true);
+            verifyGetPixels(b, expected);
         } catch (IOException e) {
             fail();
         }
     }
 
+    private static void verifyGetPixels(@NonNull Bitmap b, @ColorInt int expected) {
+        int[] pixels = new int[b.getWidth() * b.getHeight()];
+        b.getPixels(pixels, 0, b.getWidth(), 0, 0, b.getWidth(), b.getHeight());
+
+        for (int i = 0; i < pixels.length; i++) {
+            int pixel = pixels[i];
+            almostEqual(expected, pixel, 3, i);
+        }
+    }
+
     @Test
     public void setPixel() {
         verifySetPixel("green-p3.png", 0xffff0000, 0xea3323ff);
@@ -204,18 +332,29 @@
             assertNotNull(cs);
             assertSame(ColorSpace.get(ColorSpace.Named.DISPLAY_P3), cs);
 
-            b.setPixel(0, 0, newColor);
+            verifySetPixel(b, newColor, expectedColor);
 
-            ByteBuffer dst = ByteBuffer.allocate(b.getByteCount());
-            b.copyPixelsToBuffer(dst);
-            dst.rewind();
-            // Stored as RGBA
-            assertEquals(expectedColor, dst.asIntBuffer().get());
+            b = Bitmap.createBitmap(b, 0, 0, b.getWidth() / 2, b.getHeight() / 2);
+            verifySetPixel(b, newColor, expectedColor);
+
+            b = Bitmap.createScaledBitmap(b, b.getWidth() / 2, b.getHeight() / 2, true);
+            verifySetPixel(b, newColor, expectedColor);
         } catch (IOException e) {
             fail();
         }
     }
 
+    private static void verifySetPixel(@NonNull Bitmap b,
+            @ColorInt int newColor, @ColorInt int expectedColor) {
+        b.setPixel(0, 0, newColor);
+
+        ByteBuffer dst = ByteBuffer.allocate(b.getByteCount());
+        b.copyPixelsToBuffer(dst);
+        dst.rewind();
+        // Stored as RGBA
+        assertEquals(expectedColor, dst.asIntBuffer().get());
+    }
+
     @Test
     public void setPixels() {
         verifySetPixels("green-p3.png", 0xffff0000, 0xea3323ff);
@@ -233,25 +372,36 @@
             assertNotNull(cs);
             assertSame(ColorSpace.get(ColorSpace.Named.DISPLAY_P3), cs);
 
-            int[] pixels = new int[b.getWidth() * b.getHeight()];
-            Arrays.fill(pixels, newColor);
-            b.setPixels(pixels, 0, b.getWidth(), 0, 0, b.getWidth(), b.getHeight());
+            verifySetPixels(b, newColor, expectedColor);
 
-            ByteBuffer dst = ByteBuffer.allocate(b.getByteCount());
-            b.copyPixelsToBuffer(dst);
-            dst.rewind();
+            b = Bitmap.createBitmap(b, 0, 0, b.getWidth() / 2, b.getHeight() / 2);
+            verifySetPixels(b, newColor, expectedColor);
 
-            IntBuffer buffer = dst.asIntBuffer();
-            //noinspection ForLoopReplaceableByForEach
-            for (int i = 0; i < pixels.length; i++) {
-                // Stored as RGBA
-                assertEquals(expectedColor, buffer.get());
-            }
+            b = Bitmap.createScaledBitmap(b, b.getWidth() / 2, b.getHeight() / 2, true);
+            verifySetPixels(b, newColor, expectedColor);
         } catch (IOException e) {
             fail();
         }
     }
 
+    private static void verifySetPixels(@NonNull Bitmap b,
+            @ColorInt int newColor, @ColorInt int expectedColor) {
+        int[] pixels = new int[b.getWidth() * b.getHeight()];
+        Arrays.fill(pixels, newColor);
+        b.setPixels(pixels, 0, b.getWidth(), 0, 0, b.getWidth(), b.getHeight());
+
+        ByteBuffer dst = ByteBuffer.allocate(b.getByteCount());
+        b.copyPixelsToBuffer(dst);
+        dst.rewind();
+
+        IntBuffer buffer = dst.asIntBuffer();
+        //noinspection ForLoopReplaceableByForEach
+        for (int i = 0; i < pixels.length; i++) {
+            // Stored as RGBA
+            assertEquals(expectedColor, buffer.get());
+        }
+    }
+
     @Test
     public void writeColorSpace() {
         verifyColorSpaceMarshalling("green-srgb.png", ColorSpace.get(ColorSpace.Named.SRGB));
@@ -400,4 +550,65 @@
             fail();
         }
     }
+
+    @Test
+    public void copy() {
+        Bitmap b = BitmapFactory.decodeResource(mResources, R.drawable.robot);
+        Bitmap c = b.copy(Bitmap.Config.ARGB_8888, false);
+        ColorSpace cs = c.getColorSpace();
+        assertNotNull(cs);
+        assertSame(ColorSpace.get(ColorSpace.Named.SRGB), cs);
+
+        c = b.copy(Bitmap.Config.ARGB_8888, true);
+        cs = c.getColorSpace();
+        assertNotNull(cs);
+        assertSame(ColorSpace.get(ColorSpace.Named.SRGB), cs);
+
+        try (InputStream in = mResources.getAssets().open("green-p3.png")) {
+            b = BitmapFactory.decodeStream(in);
+            c = b.copy(Bitmap.Config.ARGB_8888, false);
+            cs = c.getColorSpace();
+            assertNotNull(cs);
+            assertSame(ColorSpace.get(ColorSpace.Named.DISPLAY_P3), cs);
+
+            c = b.copy(Bitmap.Config.ARGB_8888, true);
+            cs = c.getColorSpace();
+            assertNotNull(cs);
+            assertSame(ColorSpace.get(ColorSpace.Named.DISPLAY_P3), cs);
+        } catch (IOException e) {
+            fail();
+        }
+
+        try (InputStream in = mResources.getAssets().open("prophoto-rgba16f.png")) {
+            b = BitmapFactory.decodeStream(in);
+            c = b.copy(Bitmap.Config.RGBA_F16, false);
+            cs = c.getColorSpace();
+            assertNotNull(cs);
+            assertSame(ColorSpace.get(ColorSpace.Named.LINEAR_EXTENDED_SRGB), cs);
+
+            c = b.copy(Bitmap.Config.RGBA_F16, true);
+            cs = c.getColorSpace();
+            assertNotNull(cs);
+            assertSame(ColorSpace.get(ColorSpace.Named.LINEAR_EXTENDED_SRGB), cs);
+        } catch (IOException e) {
+            fail();
+        }
+    }
+
+    @SuppressWarnings("SameParameterValue")
+    private static void almostEqual(@ColorInt int expected,
+            @ColorInt int pixel, int threshold, int index) {
+        int diffA = Math.abs(expected >>> 24 - pixel >>> 24);
+        int diffR = Math.abs((expected >> 16) & 0xff - (pixel >> 16) & 0xff);
+        int diffG = Math.abs((expected >>  8) & 0xff - (pixel >>  8) & 0xff);
+        int diffB = Math.abs((expected      ) & 0xff - (pixel      ) & 0xff);
+
+        boolean pass = diffA + diffR + diffG + diffB < threshold;
+        if (!pass) {
+            Log.d(LOG_TAG, "Expected 0x" + Integer.toHexString(expected) +
+                    " but was 0x" + Integer.toHexString(pixel) + " with index " + index);
+        }
+
+        assertTrue(pass);
+    }
 }
diff --git a/tests/tests/graphics/src/android/graphics/cts/BitmapRGBAF16Test.java b/tests/tests/graphics/src/android/graphics/cts/BitmapRGBAF16Test.java
index 114a385..02c9425 100644
--- a/tests/tests/graphics/src/android/graphics/cts/BitmapRGBAF16Test.java
+++ b/tests/tests/graphics/src/android/graphics/cts/BitmapRGBAF16Test.java
@@ -15,38 +15,41 @@
  */
 package android.graphics.cts;
 
-import android.content.res.Resources;
-import android.graphics.Bitmap;
-import android.graphics.Bitmap.Config;
-import android.graphics.BitmapFactory;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.Bitmap.Config;
+import android.graphics.BitmapFactory;
+import android.graphics.Canvas;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
 @SmallTest
 @RunWith(AndroidJUnit4.class)
 public class BitmapRGBAF16Test {
     private Bitmap mOpaqueBitmap;
     private Bitmap mTransparentBitmap;
+    private Resources mResources;
 
     @Before
     public void setup() {
-        Resources resources = InstrumentationRegistry.getTargetContext().getResources();
+        mResources = InstrumentationRegistry.getTargetContext().getResources();
 
         BitmapFactory.Options options = new BitmapFactory.Options();
         options.inMutable = true;
 
         // The bitmaps are in raw-nodpi/ to guarantee aapt and framework leave them untouched
-        mOpaqueBitmap = BitmapFactory.decodeResource(resources, R.raw.p3_opaque, options);
-        mTransparentBitmap = BitmapFactory.decodeResource(resources, R.raw.p3_transparent, options);
+        mOpaqueBitmap = BitmapFactory.decodeResource(mResources, R.raw.p3_opaque, options);
+        mTransparentBitmap = BitmapFactory.decodeResource(mResources, R.raw.p3_transparent, options);
     }
 
     @Test
@@ -133,4 +136,16 @@
         assertTrue(before != after);
         assertEquals(0x7f102030, after);
     }
+
+    @Test
+    public void testCopyFromA8() {
+        Bitmap res = BitmapFactory.decodeResource(mResources, R.drawable.alpha_mask);
+        Bitmap mask = Bitmap.createBitmap(res.getWidth(), res.getHeight(),
+                Bitmap.Config.ALPHA_8);
+        Canvas c = new Canvas(mask);
+        c.drawBitmap(res, 0, 0, null);
+
+        Bitmap b = mask.copy(Config.RGBA_F16, false);
+        assertNotNull(b);
+    }
 }
diff --git a/tests/tests/permission/src/android/permission/cts/TelephonyManagerPermissionTest.java b/tests/tests/permission/src/android/permission/cts/TelephonyManagerPermissionTest.java
index 54c2371..0197f5d 100644
--- a/tests/tests/permission/src/android/permission/cts/TelephonyManagerPermissionTest.java
+++ b/tests/tests/permission/src/android/permission/cts/TelephonyManagerPermissionTest.java
@@ -242,7 +242,11 @@
             getContext().sendBroadcast(intent);
             fail("SecurityException expected!");
         } catch (SecurityException e) {}
-
+        try {
+            Intent intent = new Intent("android.provider.Telephony.SECRET_CODE");
+            getContext().sendBroadcast(intent);
+            fail("SecurityException expected!");
+        } catch (SecurityException e) {}
     }
 
     /**
diff --git a/tests/tests/text/src/android/text/method/cts/DateKeyListenerTest.java b/tests/tests/text/src/android/text/method/cts/DateKeyListenerTest.java
index d8342ca..16f632c 100644
--- a/tests/tests/text/src/android/text/method/cts/DateKeyListenerTest.java
+++ b/tests/tests/text/src/android/text/method/cts/DateKeyListenerTest.java
@@ -111,16 +111,26 @@
 
     @Test
     public void testGetInputType() {
-        final int expected = InputType.TYPE_CLASS_DATETIME | InputType.TYPE_DATETIME_VARIATION_DATE;
+        // The "normal" input type that has been used consistently until Android O.
+        final int dateTimeType = InputType.TYPE_CLASS_DATETIME
+                | InputType.TYPE_DATETIME_VARIATION_DATE;
+        // Fallback for locales that need more characters.
+        final int textType = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_NORMAL;
 
+        // Deprecated constructor that needs to preserve pre-existing behavior.
         DateKeyListener dateKeyListener = new DateKeyListener();
-        assertEquals(expected, dateKeyListener.getInputType());
+        assertEquals(dateTimeType, dateKeyListener.getInputType());
 
+        // TYPE_CLASS_DATETIME is fine for English locales.
         dateKeyListener = new DateKeyListener(Locale.US);
-        assertEquals(expected, dateKeyListener.getInputType());
+        assertEquals(dateTimeType, dateKeyListener.getInputType());
+        dateKeyListener = new DateKeyListener(Locale.UK);
+        assertEquals(dateTimeType, dateKeyListener.getInputType());
 
+        // Persian needs more characters then typically provided by datetime inputs, so it falls
+        // back on normal text.
         dateKeyListener = new DateKeyListener(Locale.forLanguageTag("fa-IR"));
-        assertEquals(expected, dateKeyListener.getInputType());
+        assertEquals(textType, dateKeyListener.getInputType());
     }
 
     /*
diff --git a/tests/tests/text/src/android/text/method/cts/DateTimeKeyListenerTest.java b/tests/tests/text/src/android/text/method/cts/DateTimeKeyListenerTest.java
index 06bb68c..decd451 100644
--- a/tests/tests/text/src/android/text/method/cts/DateTimeKeyListenerTest.java
+++ b/tests/tests/text/src/android/text/method/cts/DateTimeKeyListenerTest.java
@@ -114,17 +114,26 @@
 
     @Test
     public void testGetInputType() {
-        final int expected = InputType.TYPE_CLASS_DATETIME
+        // The "normal" input type that has been used consistently until Android O.
+        final int dateTimeType = InputType.TYPE_CLASS_DATETIME
                 | InputType.TYPE_DATETIME_VARIATION_NORMAL;
+        // Fallback for locales that need more characters.
+        final int textType = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_NORMAL;
 
+        // Deprecated constructor that needs to preserve pre-existing behavior.
         DateTimeKeyListener listener = DateTimeKeyListener.getInstance();
-        assertEquals(expected, listener.getInputType());
+        assertEquals(dateTimeType, listener.getInputType());
 
+        // TYPE_CLASS_DATETIME is fine for English locales.
         listener = DateTimeKeyListener.getInstance(Locale.US);
-        assertEquals(expected, listener.getInputType());
+        assertEquals(dateTimeType, listener.getInputType());
+        listener = DateTimeKeyListener.getInstance(Locale.UK);
+        assertEquals(dateTimeType, listener.getInputType());
 
+        // Persian needs more characters then typically provided by datetime inputs, so it falls
+        // back on normal text.
         listener = DateTimeKeyListener.getInstance(Locale.forLanguageTag("fa-IR"));
-        assertEquals(expected, listener.getInputType());
+        assertEquals(textType, listener.getInputType());
     }
 
     /*
diff --git a/tests/tests/text/src/android/text/method/cts/DigitsKeyListenerTest.java b/tests/tests/text/src/android/text/method/cts/DigitsKeyListenerTest.java
index 510d329..7854268 100644
--- a/tests/tests/text/src/android/text/method/cts/DigitsKeyListenerTest.java
+++ b/tests/tests/text/src/android/text/method/cts/DigitsKeyListenerTest.java
@@ -899,8 +899,9 @@
         assertEquals(-1, acceptedChars.indexOf(usDecimalSeparator));
     }
 
+    // Deprecated constructors that need to preserve pre-existing behavior.
     @Test
-    public void testGetInputType1() {
+    public void testGetInputType_deprecatedConstructors() {
         DigitsKeyListener digitsKeyListener = DigitsKeyListener.getInstance(false, false);
         int expected = InputType.TYPE_CLASS_NUMBER;
         assertEquals(expected, digitsKeyListener.getInputType());
@@ -922,27 +923,57 @@
         assertEquals(expected, digitsKeyListener.getInputType());
     }
 
+    // Deprecated constructors that need to preserve pre-existing behavior.
     @Test
-    public void testGetInputType2() {
-        final Locale irLocale = Locale.forLanguageTag("fa-IR");
-        DigitsKeyListener digitsKeyListener = DigitsKeyListener.getInstance(irLocale, false, false);
+    public void testGetInputType_English() {
         int expected = InputType.TYPE_CLASS_NUMBER;
+        DigitsKeyListener digitsKeyListener = DigitsKeyListener.getInstance(
+                Locale.US, false, false);
+        assertEquals(expected, digitsKeyListener.getInputType());
+        digitsKeyListener = DigitsKeyListener.getInstance(
+                Locale.UK, false, false);
         assertEquals(expected, digitsKeyListener.getInputType());
 
-        digitsKeyListener = DigitsKeyListener.getInstance(irLocale, true, false);
         expected = InputType.TYPE_CLASS_NUMBER
                 | InputType.TYPE_NUMBER_FLAG_SIGNED;
+        digitsKeyListener = DigitsKeyListener.getInstance(Locale.US, true, false);
+        assertEquals(expected, digitsKeyListener.getInputType());
+        digitsKeyListener = DigitsKeyListener.getInstance(Locale.UK, true, false);
         assertEquals(expected, digitsKeyListener.getInputType());
 
-        digitsKeyListener = DigitsKeyListener.getInstance(irLocale, false, true);
         expected = InputType.TYPE_CLASS_NUMBER
                 | InputType.TYPE_NUMBER_FLAG_DECIMAL;
+        digitsKeyListener = DigitsKeyListener.getInstance(Locale.US, false, true);
+        assertEquals(expected, digitsKeyListener.getInputType());
+        digitsKeyListener = DigitsKeyListener.getInstance(Locale.UK, false, true);
         assertEquals(expected, digitsKeyListener.getInputType());
 
-        digitsKeyListener = DigitsKeyListener.getInstance(irLocale, true, true);
         expected = InputType.TYPE_CLASS_NUMBER
                 | InputType.TYPE_NUMBER_FLAG_SIGNED
                 | InputType.TYPE_NUMBER_FLAG_DECIMAL;
+        digitsKeyListener = DigitsKeyListener.getInstance(Locale.US, true, true);
+        assertEquals(expected, digitsKeyListener.getInputType());
+        digitsKeyListener = DigitsKeyListener.getInstance(Locale.UK, true, true);
+        assertEquals(expected, digitsKeyListener.getInputType());
+    }
+
+    // Persian needs more characters then typically provided by datetime inputs, so it falls
+    // back on normal text.
+    @Test
+    public void testGetInputType_Persian() {
+        final Locale irLocale = Locale.forLanguageTag("fa-IR");
+        final int expected = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_NORMAL;
+
+        DigitsKeyListener digitsKeyListener = DigitsKeyListener.getInstance(irLocale, false, false);
+        assertEquals(expected, digitsKeyListener.getInputType());
+
+        digitsKeyListener = DigitsKeyListener.getInstance(irLocale, true, false);
+        assertEquals(expected, digitsKeyListener.getInputType());
+
+        digitsKeyListener = DigitsKeyListener.getInstance(irLocale, false, true);
+        assertEquals(expected, digitsKeyListener.getInputType());
+
+        digitsKeyListener = DigitsKeyListener.getInstance(irLocale, true, true);
         assertEquals(expected, digitsKeyListener.getInputType());
     }
 
diff --git a/tests/tests/text/src/android/text/method/cts/TimeKeyListenerTest.java b/tests/tests/text/src/android/text/method/cts/TimeKeyListenerTest.java
index 68d410d..a887a19 100644
--- a/tests/tests/text/src/android/text/method/cts/TimeKeyListenerTest.java
+++ b/tests/tests/text/src/android/text/method/cts/TimeKeyListenerTest.java
@@ -110,17 +110,26 @@
 
     @Test
     public void testGetInputType() {
-        final int expected = InputType.TYPE_CLASS_DATETIME
+        // The "normal" input type that has been used consistently until Android O.
+        final int dateTimeType = InputType.TYPE_CLASS_DATETIME
                 | InputType.TYPE_DATETIME_VARIATION_TIME;
+        // Fallback for locales that need more characters.
+        final int textType = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_NORMAL;
 
+        // Deprecated constructor that needs to preserve pre-existing behavior.
         TimeKeyListener listener = TimeKeyListener.getInstance();
-        assertEquals(expected, listener.getInputType());
+        assertEquals(dateTimeType, listener.getInputType());
 
+        // TYPE_CLASS_DATETIME is fine for English locales.
         listener = TimeKeyListener.getInstance(Locale.US);
-        assertEquals(expected, listener.getInputType());
+        assertEquals(dateTimeType, listener.getInputType());
+        listener = TimeKeyListener.getInstance(Locale.UK);
+        assertEquals(dateTimeType, listener.getInputType());
 
+        // Persian needs more characters then typically provided by datetime inputs, so it falls
+        // back on normal text.
         listener = TimeKeyListener.getInstance(Locale.forLanguageTag("fa-IR"));
-        assertEquals(expected, listener.getInputType());
+        assertEquals(textType, listener.getInputType());
     }
 
     /*
diff --git a/tests/tests/widget/src/android/widget/cts/ListPopupWindowTest.java b/tests/tests/widget/src/android/widget/cts/ListPopupWindowTest.java
index 334a1f6..70f9661 100644
--- a/tests/tests/widget/src/android/widget/cts/ListPopupWindowTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ListPopupWindowTest.java
@@ -504,7 +504,7 @@
         mInstrumentation.waitForIdleSync();
 
         verify(mPopupWindowBuilder.mOnItemClickListener, times(1)).onItemClick(
-                any(AdapterView.class), any(View.class), eq(1), eq(1L));
+                any(AdapterView.class), any(), eq(1), eq(1L));
         // Also verify that the popup window has been dismissed
         assertFalse(mPopupWindow.isShowing());
         verify(mPopupWindowBuilder.mOnDismissListener, times(2)).onDismiss();
diff --git a/tests/tests/widget/src/android/widget/cts/TextViewTest.java b/tests/tests/widget/src/android/widget/cts/TextViewTest.java
index 86f9877..968b6e3 100644
--- a/tests/tests/widget/src/android/widget/cts/TextViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/TextViewTest.java
@@ -114,7 +114,6 @@
 import android.util.TypedValue;
 import android.view.ActionMode;
 import android.view.ContextMenu;
-import android.view.ContextMenu.ContextMenuInfo;
 import android.view.Gravity;
 import android.view.InputDevice;
 import android.view.KeyEvent;
@@ -3038,7 +3037,7 @@
             ((ContextMenu) invocation.getArguments() [0]).add("menu item");
             return null;
         }).when(mockOnCreateContextMenuListener).onCreateContextMenu(
-                any(ContextMenu.class), any(View.class), any(ContextMenuInfo.class));
+                any(ContextMenu.class), any(View.class), any());
 
         mTextView.setOnLongClickListener(mockOnLongClickListener);
         mTextView.setOnCreateContextMenuListener(mockOnCreateContextMenuListener);
@@ -3051,16 +3050,16 @@
         assertTrue(mTextView.performLongClick());
         verify(mockOnLongClickListener, times(1)).onLongClick(mTextView);
         verify(mockOnCreateContextMenuListener, times(1)).onCreateContextMenu(
-                any(ContextMenu.class), eq(mTextView), any(ContextMenuInfo.class));
+                any(ContextMenu.class), eq(mTextView), any());
 
         reset(mockOnCreateContextMenuListener);
         mTextView.setOnLongClickListener(null);
         doNothing().when(mockOnCreateContextMenuListener).onCreateContextMenu(
-                any(ContextMenu.class), any(View.class), any(ContextMenuInfo.class));
+                any(ContextMenu.class), any(View.class), any());
         assertFalse(mTextView.performLongClick());
         verifyNoMoreInteractions(mockOnLongClickListener);
         verify(mockOnCreateContextMenuListener, times(1)).onCreateContextMenu(
-                any(ContextMenu.class), eq(mTextView), any(ContextMenuInfo.class));
+                any(ContextMenu.class), eq(mTextView), any());
     }
 
     @UiThreadTest
diff --git a/tools/selinux/SELinuxNeverallowTestGen.py b/tools/selinux/SELinuxNeverallowTestGen.py
index ec29e45..e74ba78 100755
--- a/tools/selinux/SELinuxNeverallowTestGen.py
+++ b/tools/selinux/SELinuxNeverallowTestGen.py
@@ -79,7 +79,7 @@
     # check usage
     if len(sys.argv) != 3:
         print usage
-        exit()
+        exit(1)
     input_file = sys.argv[1]
     output_file = sys.argv[2]