Merge "release-request-25678148-c7cb-47b4-8abd-6c8063d3f5e2-for-aosp-nougat-cts-release-4369580 snap-temp-L55000000107926022" into nougat-cts-release
diff --git a/hostsidetests/services/activitymanager/src/android/server/cts/ActivityAndWindowManagersState.java b/hostsidetests/services/activitymanager/src/android/server/cts/ActivityAndWindowManagersState.java
index bb7f521..095d39f 100644
--- a/hostsidetests/services/activitymanager/src/android/server/cts/ActivityAndWindowManagersState.java
+++ b/hostsidetests/services/activitymanager/src/android/server/cts/ActivityAndWindowManagersState.java
@@ -40,6 +40,7 @@
     // Clone of android DisplayMetrics.DENSITY_DEFAULT (DENSITY_MEDIUM)
     // (Needed in host-side tests to convert dp to px.)
     private static final int DISPLAY_DENSITY_DEFAULT = 160;
+    public static final int DEFAULT_DISPLAY_ID = 0;
 
     // Default minimal size of resizable task, used if none is set explicitly.
     // Must be kept in sync with 'default_minimal_size_resizable_task' dimen from frameworks/base.
diff --git a/hostsidetests/services/activitymanager/src/android/server/cts/ActivityManagerAppConfigurationTests.java b/hostsidetests/services/activitymanager/src/android/server/cts/ActivityManagerAppConfigurationTests.java
old mode 100644
new mode 100755
index ea18b99..95d46e6
--- a/hostsidetests/services/activitymanager/src/android/server/cts/ActivityManagerAppConfigurationTests.java
+++ b/hostsidetests/services/activitymanager/src/android/server/cts/ActivityManagerAppConfigurationTests.java
@@ -17,9 +17,13 @@
 
 import com.android.ddmlib.Log.LogLevel;
 import com.android.tradefed.log.LogUtil.CLog;
+import java.awt.Rectangle;
+import static android.server.cts.ActivityAndWindowManagersState.DEFAULT_DISPLAY_ID;
 
 public class ActivityManagerAppConfigurationTests extends ActivityManagerTestBase {
     private static final String TEST_ACTIVITY_NAME = "ResizeableActivity";
+    private static final int DISPLAY_DENSITY_DEFAULT = 160;
+    private static final int NAVI_BAR_HEIGHT_DP = 48;
 
     /**
      * Tests that the WindowManager#getDefaultDisplay() and the Configuration of the Activity
@@ -106,10 +110,43 @@
     }
 
     /**
+     * If aspect ratio larger than 2.0, and system insets less than default system insets height
+     * (from nav bar),it won't meet CTS testcase requirement, so we treat these scenario specially
+     * and do not check the rotation.
+     */
+    private boolean shouldSkipRotationCheck() throws Exception{
+        WindowManagerState wmState = mAmWmState.getWmState();
+        wmState.computeState(mDevice, true);
+        WindowManagerState.Display display = wmState.getDisplay(DEFAULT_DISPLAY_ID);
+        Rectangle displayRect = display.getDisplayRect();
+        Rectangle appRect = display.getAppRect();
+
+        float aspectRatio = 0.0f;
+        int naviBarHeight;
+        if (displayRect.height > displayRect.width) {
+            aspectRatio = (float) displayRect.height / displayRect.width;
+            naviBarHeight = displayRect.height - appRect.height;
+        } else {
+            aspectRatio = (float) displayRect.width / displayRect.height;
+            naviBarHeight = displayRect.width - appRect.width;
+        }
+
+        int density = display.getDpi();
+        int systemInsetsHeight = dpToPx(NAVI_BAR_HEIGHT_DP, density);
+        // After changed rotation the dispalySize will be effected by aspect ratio and system UI
+        // insets (from nav bar) together, so we should check if needed to skip testcase
+        return aspectRatio >= 2.0 && naviBarHeight < systemInsetsHeight;
+    }
+
+    static int dpToPx(float dp, int densityDpi){
+        return (int) (dp * densityDpi / DISPLAY_DENSITY_DEFAULT + 0.5f);
+    }
+
+    /**
      * Asserts that after rotation, the aspect ratios of display size, metrics, and configuration
      * have flipped.
      */
-    private static void assertSizesRotate(ReportedSizes rotationA, ReportedSizes rotationB)
+    private void assertSizesRotate(ReportedSizes rotationA, ReportedSizes rotationB)
             throws Exception {
         assertEquals(rotationA.displayWidth, rotationA.metricsWidth);
         assertEquals(rotationA.displayHeight, rotationA.metricsHeight);
@@ -118,7 +155,9 @@
 
         final boolean beforePortrait = rotationA.displayWidth < rotationA.displayHeight;
         final boolean afterPortrait = rotationB.displayWidth < rotationB.displayHeight;
-        assertFalse(beforePortrait == afterPortrait);
+        if (!shouldSkipRotationCheck()) {
+            assertFalse(beforePortrait == afterPortrait);
+        }
 
         final boolean beforeConfigPortrait = rotationA.widthDp < rotationA.heightDp;
         final boolean afterConfigPortrait = rotationB.widthDp < rotationB.heightDp;
diff --git a/tests/tests/permission2/res/raw/android_manifest.xml b/tests/tests/permission2/res/raw/android_manifest.xml
index 2bee7a6..4f0176f 100644
--- a/tests/tests/permission2/res/raw/android_manifest.xml
+++ b/tests/tests/permission2/res/raw/android_manifest.xml
@@ -2138,6 +2138,15 @@
     <permission android:name="android.permission.INTERNAL_SYSTEM_WINDOW"
                 android:protectionLevel="signature" />
 
+    <!-- @SystemApi Allows an application to use
+        {@link android.view.WindowManager.LayoutsParams#PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS}
+        to hide non-system-overlay windows.
+        <p>Not for use by third-party applications.
+        @hide
+    -->
+    <permission android:name="android.permission.HIDE_NON_SYSTEM_OVERLAY_WINDOWS"
+                android:protectionLevel="signature|installer" />
+
     <!-- @SystemApi Allows an application to manage (create, destroy,
          Z-order) application tokens in the window manager.
          <p>Not for use by third-party applications.
diff --git a/tests/tests/permission2/src/android/permission2/cts/PermissionPolicyTest.java b/tests/tests/permission2/src/android/permission2/cts/PermissionPolicyTest.java
index 61dd66b..1c9c6f1 100644
--- a/tests/tests/permission2/src/android/permission2/cts/PermissionPolicyTest.java
+++ b/tests/tests/permission2/src/android/permission2/cts/PermissionPolicyTest.java
@@ -29,15 +29,24 @@
 
 import java.io.InputStream;
 import java.lang.String;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import static android.os.Build.VERSION.SECURITY_PATCH;
+
 /**
  * Tests for permission policy on the platform.
  */
 public class PermissionPolicyTest extends AndroidTestCase {
+    private static final Date HIDE_NON_SYSTEM_OVERLAY_WINDOWS_PATCH_DATE = parseDate("2017-09-05");
+    private static final String HIDE_NON_SYSTEM_OVERLAY_WINDOWS_PERMISSION
+            = "android.permission.HIDE_NON_SYSTEM_OVERLAY_WINDOWS";
+
     private static final String LOG_TAG = "PermissionProtectionTest";
 
     private static final String PLATFORM_PACKAGE_NAME = "android";
@@ -68,8 +77,12 @@
         Set<String> expectedPermissionGroups = new ArraySet<String>();
 
         for (PermissionInfo expectedPermission : loadExpectedPermissions()) {
-            // OEMs cannot remove permissions
             String expectedPermissionName = expectedPermission.name;
+            if (shouldSkipPermission(expectedPermissionName)) {
+                continue;
+            }
+
+            // OEMs cannot remove permissions
             PermissionInfo declaredPermission = declaredPermissionsMap.get(expectedPermissionName);
             assertNotNull("Permission " + expectedPermissionName
                     + " must be declared", declaredPermission);
@@ -208,4 +221,21 @@
         }
         return protectionLevel;
     }
+
+    private static Date parseDate(String date) {
+        Date patchDate = new Date();
+        try {
+            SimpleDateFormat template = new SimpleDateFormat("yyyy-MM-dd");
+            patchDate = template.parse(date);
+        } catch (ParseException e) {
+        }
+
+        return patchDate;
+    }
+
+    private boolean shouldSkipPermission(String permissionName) {
+        return parseDate(SECURITY_PATCH).before(HIDE_NON_SYSTEM_OVERLAY_WINDOWS_PATCH_DATE) &&
+                HIDE_NON_SYSTEM_OVERLAY_WINDOWS_PERMISSION.equals(permissionName);
+
+    }
 }