Merge "Add settings page for notification channel groups"
diff --git a/res/drawable/ic_airplanemode_active.xml b/res/drawable/ic_airplanemode_active.xml
index 5759341..10dd7ed 100644
--- a/res/drawable/ic_airplanemode_active.xml
+++ b/res/drawable/ic_airplanemode_active.xml
@@ -20,9 +20,9 @@
android:viewportHeight="24.0"
android:tint="?android:attr/colorControlNormal">
<path
- android:pathData="M10.18,9"
- android:fillColor="#FFFFFFFF"/>
- <path
- android:pathData="M21,16v-2l-8,-5V3.5c0,-0.83 -0.67,-1.5 -1.5,-1.5S10,2.67 10,3.5V9l-8,5v2l8,-2.5V19l-2,1.5V22l3.5,-1 3.5,1v-1.5L13,19v-5.5l8,2.5z"
+ android:pathData="M20.8,13.56L13.5,9V3.5C13.5,2.67,12.83,2,12,2s-1.5,0.67-1.5,1.5V9l-7.3,4.56c-0.43,0.27-0.7,0.75-0.7,1.27v0.49
+c0,0.34,0.33,0.58,0.65,0.48l7.35-2.3V19l-1.6,1.2c-0.25,0.19-0.4,0.49-0.4,0.8v0.67c0,0.17,0.14,0.28,0.31,0.24
+c1.94-0.55,1.3-0.37,3.19-0.91c1.21,0.35,1.99,0.57,3.19,0.91c0.17,0.04,0.31-0.07,0.31-0.24V21c0-0.31-0.15-0.61-0.4-0.8L13.5,19
+v-5.5l7.35,2.3c0.32,0.1,0.65-0.14,0.65-0.48v-0.49C21.5,14.31,21.23,13.83,20.8,13.56z"
android:fillColor="#FFFFFFFF"/>
</vector>
diff --git a/res/drawable/ic_apps.xml b/res/drawable/ic_apps.xml
index 784a818..9f00141 100644
--- a/res/drawable/ic_apps.xml
+++ b/res/drawable/ic_apps.xml
@@ -20,6 +20,11 @@
android:viewportHeight="24.0"
android:tint="?android:attr/colorControlNormal">
<path
- android:pathData="M4,8h4L8,4L4,4v4zM10,20h4v-4h-4v4zM4,20h4v-4L4,16v4zM4,14h4v-4L4,10v4zM10,14h4v-4h-4v4zM16,4v4h4L20,4h-4zM10,8h4L14,4h-4v4zM16,14h4v-4h-4v4zM16,20h4v-4h-4v4z"
+ android:pathData="M6 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm6 12c1.1 0 2-.9 2-2s-.9-2-2-2-2
+.9-2 2 .9 2 2 2zm-6 0c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0-6c1.1 0 2-.9
+2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm6 0c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2
+2zm4-8c0 1.1 .9 2 2 2s2-.9 2-2-.9-2-2-2-2 .9-2 2zm-4 2c1.1 0 2-.9
+2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm6 6c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2
+2zm0 6c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2z"
android:fillColor="#FFFFFFFF"/>
</vector>
diff --git a/res/drawable/ic_arrow_down_24dp.xml b/res/drawable/ic_arrow_down_24dp.xml
index 7c5866d..f334902 100644
--- a/res/drawable/ic_arrow_down_24dp.xml
+++ b/res/drawable/ic_arrow_down_24dp.xml
@@ -22,5 +22,6 @@
android:tint="?android:attr/colorAccent">
<path
android:fillColor="#FF000000"
- android:pathData="M7.41,7.84L12,12.42l4.59,-4.58L18,9.25l-6,6 -6,-6z"/>
+ android:pathData="M8.12 9.29L12 13.17l3.88-3.88a.996 .996 0 1 1 1.41 1.41l-4.59 4.59a.996 .996 0 0
+1-1.41 0L6.7 10.7a.996 .996 0 0 1 0-1.41c.39-.38 1.03-.39 1.42 0z"/>
</vector>
diff --git a/res/drawable/ic_cast_24dp.xml b/res/drawable/ic_cast_24dp.xml
index 7dc895e..948deca 100644
--- a/res/drawable/ic_cast_24dp.xml
+++ b/res/drawable/ic_cast_24dp.xml
@@ -22,5 +22,10 @@
android:tint="?android:attr/colorControlNormal">
<path
android:fillColor="#FFFFFFFF"
- android:pathData="M21,3L3,3c-1.1,0 -2,0.9 -2,2v3h2L3,5h18v14h-7v2h7c1.1,0 2,-0.9 2,-2L23,5c0,-1.1 -0.9,-2 -2,-2zM1,18v3h3c0,-1.66 -1.34,-3 -3,-3zM1,14v2c2.76,0 5,2.24 5,5h2c0,-3.87 -3.13,-7 -7,-7zM1,10v2c4.97,0 9,4.03 9,9h2c0,-6.08 -4.93,-11 -11,-11z"/>
+ android:pathData="M1 18v2c0 .55 .45 1 1 1h2c0-1.66-1.34-3-3-3zm0-2.94c-.01 .51 .32 .93 .82 1.02
+2.08 .36 3.74 2 4.1 4.08 .09 .48 .5 .84 .99 .84 .61 0 1.09-.54 1-1.14a6.996
+6.996 0 0 0-5.8-5.78c-.59-.09-1.09 .38 -1.11 .98 zm0-4.03c-.01 .52 .34 .96 .85
+1.01 4.26 .43 7.68 3.82 8.1 8.08 .05 .5 .48 .88 .99 .88 .59 0 1.06-.51
+1-1.1-.52-5.21-4.66-9.34-9.87-9.85-.57-.05-1.05 .4 -1.07 .98 zM21 3H3c-1.1 0-2
+.9-2 2v3h2V5h18v14h-7v2h7c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z"/>
</vector>
diff --git a/res/drawable/ic_chevron_right_24dp.xml b/res/drawable/ic_chevron_right_24dp.xml
index 63532cb..ba62187 100644
--- a/res/drawable/ic_chevron_right_24dp.xml
+++ b/res/drawable/ic_chevron_right_24dp.xml
@@ -23,5 +23,6 @@
android:viewportWidth="24.0"
android:tint="?android:attr/colorControlNormal">
<path android:fillColor="#FF000000"
- android:pathData="M10,6L8.59,7.41 13.17,12l-4.58,4.59L10,18l6,-6z" />
+ android:pathData="M9.29,15.63l3.88-3.88L9.29,7.87c-0.39-0.39-0.39-1.02,0-1.41l0,0c0.39-0.39,1.02-0.39,1.41,0l4.59,4.59
+c0.39,0.39,0.39,1.02,0,1.41l-4.59,4.59c-0.39,0.39-1.02,0.39-1.41,0l0,0C8.91,16.66,8.9,16.02,9.29,15.63z" />
</vector>
diff --git a/res/drawable/ic_devices_other.xml b/res/drawable/ic_devices_other.xml
index 20639a3..b22e483 100644
--- a/res/drawable/ic_devices_other.xml
+++ b/res/drawable/ic_devices_other.xml
@@ -20,6 +20,13 @@
android:viewportHeight="24.0"
android:tint="?android:attr/colorControlNormal">
<path
- android:pathData="M3,6h18L21,4L3,4c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h4v-2L3,18L3,6zM13,12L9,12v1.78c-0.61,0.55 -1,1.33 -1,2.22s0.39,1.67 1,2.22L9,20h4v-1.78c0.61,-0.55 1,-1.34 1,-2.22s-0.39,-1.67 -1,-2.22L13,12zM11,17.5c-0.83,0 -1.5,-0.67 -1.5,-1.5s0.67,-1.5 1.5,-1.5 1.5,0.67 1.5,1.5 -0.67,1.5 -1.5,1.5zM22,8h-6c-0.5,0 -1,0.5 -1,1v10c0,0.5 0.5,1 1,1h6c0.5,0 1,-0.5 1,-1L23,9c0,-0.5 -0.5,-1 -1,-1zM21,18h-4v-8h4v8z"
- android:fillColor="#FFFFFFFF"/>
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M3,6h17c0.55,0,1-0.45,1-1v0c0-0.55-0.45-1-1-1H3C1.9,4,1,4.9,1,6v12c0,1.1,0.9,2,2,2h3c0.55,0,1-0.45,1-1v0
+ c0-0.55-0.45-1-1-1H3V6z
+ M13,12H9v1.78C8.39,14.33,8,15.11,8,16c0,0.89,0.39,1.67,1,2.22V20h4v-1.78c0.61-0.55,1-1.34,1-2.22
+ s-0.39-1.67-1-2.22V12z
+ M11,17.5c-0.83,0-1.5-0.67-1.5-1.5s0.67-1.5,1.5-1.5s1.5,0.67,1.5,1.5S11.83,17.5,11,17.5z
+ M22,8h-6
+ c-0.5,0-1,0.5-1,1v10c0,0.5,0.5,1,1,1h6c0.5,0,1-0.5,1-1V9C23,8.5,22.5,8,22,8z
+ M21,18h-4v-8h4V18z" />
</vector>
diff --git a/res/drawable/ic_expand_more.xml b/res/drawable/ic_expand_more.xml
index 609cf36..edffde3 100644
--- a/res/drawable/ic_expand_more.xml
+++ b/res/drawable/ic_expand_more.xml
@@ -23,7 +23,8 @@
android:tint="?android:attr/colorControlNormal">
<path
- android:fillColor="@android:color/white"
- android:pathData="M16.59,8.59L12.0,13.17 7.41,8.59 6.0,10.0l6.0,6.0 6.0,-6.0z"/>
+ android:fillColor="#000000"
+ android:pathData="M8.12 9.29L12 13.17l3.88-3.88a.996 .996 0 1 1 1.41 1.41l-4.59 4.59a.996 .996 0 0
+1-1.41 0L6.7 10.7a.996 .996 0 0 1 0-1.41c.39-.38 1.03-.39 1.42 0z" />
</vector>
diff --git a/res/drawable/ic_help.xml b/res/drawable/ic_help.xml
index 7a225e5..6add484 100644
--- a/res/drawable/ic_help.xml
+++ b/res/drawable/ic_help.xml
@@ -20,6 +20,11 @@
android:viewportHeight="24.0"
android:tint="?android:attr/colorControlNormal">
<path
- android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM13,19h-2v-2h2v2zM15.07,11.25l-0.9,0.92C13.45,12.9 13,13.5 13,15h-2v-0.5c0,-1.1 0.45,-2.1 1.17,-2.83l1.24,-1.26c0.37,-0.36 0.59,-0.86 0.59,-1.41 0,-1.1 -0.9,-2 -2,-2s-2,0.9 -2,2L8,9c0,-2.21 1.79,-4 4,-4s4,1.79 4,4c0,0.88 -0.36,1.68 -0.93,2.25z"
+ android:pathData="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 16.81c-.72
+0-1.3-.58-1.3-1.3s.58-1.3 1.3-1.3 1.3 .58 1.3 1.3-.58 1.3-1.3
+1.3zm1.07-4.62c-.09 .52 -.59 .87 -1.13 .79 -.57-.08-.94-.66-.83-1.23 .52 -2.61
+2.66-2.84 2.87-4.5 .12 -.96-.42-1.87-1.34-2.17-1.04-.33-2.21 .16 -2.55 1.37-.12
+.45 -.52 .74 -.97 .74 -.66 0-1.13-.63-.96-1.27 .63 -2.25 2.91-3.38 5.05-2.74
+1.71 .51 2.84 2.16 2.78 3.95-.07 2.44-2.49 2.61-2.92 5.06z"
android:fillColor="#FFFFFFFF"/>
</vector>
diff --git a/res/drawable/ic_info_outline_24dp.xml b/res/drawable/ic_info_outline_24dp.xml
deleted file mode 100644
index 3fe1e9e..0000000
--- a/res/drawable/ic_info_outline_24dp.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0"
- android:tint="?android:attr/textColorSecondary">
- <path
- android:fillColor="#000000"
- android:pathData="M11,17h2v-6h-2v6zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8zM11,9h2L13,7h-2v2z"/>
-</vector>
diff --git a/res/drawable/ic_menu_add.xml b/res/drawable/ic_menu_add.xml
index 3387f29..9e2175b 100644
--- a/res/drawable/ic_menu_add.xml
+++ b/res/drawable/ic_menu_add.xml
@@ -23,5 +23,6 @@
android:tint="?android:attr/colorAccent">
<path
android:fillColor="#FF000000"
- android:pathData="M19,13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"/>
+ android:pathData="M18,13h-5v5c0,0.55-0.45,1-1,1h0c-0.55,0-1-0.45-1-1v-5H6c-0.55,0-1-0.45-1-1v0c0-0.55,0.45-1,1-1h5V6c0-0.55,0.45-1,1-1h0
+c0.55,0,1,0.45,1,1v5h5c0.55,0,1,0.45,1,1v0C19,12.55,18.55,13,18,13z"/>
</vector>
diff --git a/res/drawable/ic_restore.xml b/res/drawable/ic_restore.xml
index 737f811..201b1df 100644
--- a/res/drawable/ic_restore.xml
+++ b/res/drawable/ic_restore.xml
@@ -22,7 +22,11 @@
android:tint="?android:attr/colorControlNormal">
<path
android:fillColor="#FFFFFFFF"
- android:pathData="M13 3c-4.97 0-9 4.03-9 9H1l3.89 3.89 .07 .14L9 12H6c0-3.87 3.13-7 7-7s7 3.13 7
-7-3.13 7-7 7c-1.93 0-3.68-.79-4.94-2.06l-1.42 1.42C8.27 19.99 10.51 21 13
-21c4.97 0 9-4.03 9-9s-4.03-9-9-9zm-1 5v5l4.28 2.54 .72 -1.21-3.5-2.08V8H12z" />
+ android:pathData="M13.5 7.75v4.5l3.37 2c.34 .2 .46 .65 .25 .99 s-.64 .45 -.98 .24 L12
+13V7.75c0-.41 .34 -.75 .75 -.75s.75 .34 .75 .75 zM13.05 3C8.11 3 4.1 7.02 4.1
+11.95c0 .02 .01 .03 .01 .05H2.05c-.47 0-.71 .57 -.37 .9 l2.95 2.94c.21 .21 .54
+.21 .75 0l2.95-2.94c.33-.33 .1 -.9-.37-.9H5.99c0-.02 .01 -.03 .01 -.05C6 8.06
+9.16 4.9 13.05 4.9S20.1 8.11 20.1 12s-3.16 7.1-7.05 7.1c-1.58
+0-3.08-.51-4.32-1.48a.94 .94 0 0 0-1.32 .16 l-.01 .01 a.94 .94 0 0 0 .16
+1.32l.01 .01 A8.77 8.77 0 0 0 13.05 21c4.94 0 8.95-4.07 8.95-9s-4.02-9-8.95-9z" />
</vector>
\ No newline at end of file
diff --git a/res/drawable/ic_search_24dp.xml b/res/drawable/ic_search_24dp.xml
index 4693dd7..8f14e88 100644
--- a/res/drawable/ic_search_24dp.xml
+++ b/res/drawable/ic_search_24dp.xml
@@ -16,12 +16,15 @@
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0"
- android:tint="?android:attr/colorControlNormal">
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24"
+ android:viewportHeight="24"
+ android:tint="?android:attr/colorControlNormal">
+
<path
- android:pathData="M15.5,14l-0.8,0l-0.3,-0.3c1,-1.1 1.6,-2.6 1.6,-4.2C16,5.9 13.1,3 9.5,3C5.9,3 3,5.9 3,9.5S5.9,16 9.5,16c1.6,0 3.1,-0.6 4.2,-1.6l0.3,0.3l0,0.8l5,5l1.5,-1.5L15.5,14zM9.5,14C7,14 5,12 5,9.5S7,5 9.5,5C12,5 14,7 14,9.5S12,14 9.5,14z"
- android:fillColor="#ffffff"/>
-</vector>
+ android:fillColor="#000000"
+ android:pathData="M15.5,14h-0.79l-0.28-0.27c1.2-1.4,1.82-3.31,1.48-5.34c-0.47-2.78-2.79-5-5.59-5.34c-4.23-0.52-7.79,3.04-7.27,7.27
+c0.34,2.8,2.56,5.12,5.34,5.59c2.03,0.34,3.94-0.28,5.34-1.48L14,14.71v0.79l5.2,5.19c0.41,0.41,1.07,0.41,1.48,0l0.01-0.01
+c0.41-0.41,0.41-1.07,0-1.48L15.5,14z M9.5,14C7.01,14,5,11.99,5,9.5S7.01,5,9.5,5S14,7.01,14,9.5S11.99,14,9.5,14z" />
+</vector>
\ No newline at end of file
diff --git a/res/drawable/ic_settings.xml b/res/drawable/ic_settings.xml
index 439c1a7..3d8563d 100644
--- a/res/drawable/ic_settings.xml
+++ b/res/drawable/ic_settings.xml
@@ -21,16 +21,14 @@
android:tint="?android:attr/colorAccent">
<path
android:fillColor="#FF000000"
- android:pathData="M19.43,12.98c0.04,-0.32 0.07,-0.64 0.07,-0.98s-0.03,-0.66
- -0.07,-0.98l2.11,-1.65c0.19,-0.15 0.24,-0.42 0.12,-0.64l-2,-3.46c-0.12,-0.22 -0.39,-0.3
- -0.61,-0.22l-2.49,1c-0.52,-0.4 -1.08,-0.73 -1.69,-0.98l-0.38,-2.65C14.46,2.18 14.25,2
- 14,2h-4c-0.25,0 -0.46,0.18 -0.49,0.42l-0.38,2.65c-0.61,0.25 -1.17,0.59
- -1.69,0.98l-2.49,-1c-0.23,-0.09 -0.49,0 -0.61,0.22l-2,3.46c-0.13,0.22 -0.07,0.49
- 0.12,0.64l2.11,1.65c-0.04,0.32 -0.07,0.65 -0.07,0.98s0.03,0.66
- 0.07,0.98l-2.11,1.65c-0.19,0.15 -0.24,0.42 -0.12,0.64l2,3.46c0.12,0.22 0.39,0.3
- 0.61,0.22l2.49,-1c0.52,0.4 1.08,0.73 1.69,0.98l0.38,2.65c0.03,0.24 0.24,0.42
- 0.49,0.42h4c0.25,0 0.46,-0.18 0.49,-0.42l0.38,-2.65c0.61,-0.25
- 1.17,-0.59 1.69,-0.98l2.49,1c0.23,0.09 0.49,0 0.61,-0.22l2,-3.46c0.12,-0.22 0.07,-0.49
- -0.12,-0.64l-2.11,-1.65zM12,15.5c-1.93,0 -3.5,-1.57
- -3.5,-3.5s1.57,-3.5 3.5,-3.5 3.5,1.57 3.5,3.5 -1.57,3.5 -3.5,3.5z"/>
+ android:pathData="M21.4 14.2l-1.94-1.45c.03-.25 .04 -.5 .04 -.76s-.01-.51-.04-.76L21.4 9.8c.42-.31
+.52 -.94 .24 -1.41l-1.6-2.76c-.28-.48-.88-.7-1.36-.5l-2.14 .91
+c-.48-.37-1.01-.68-1.57-.92l-.27-2.2c-.06-.52-.56-.92-1.11-.92h-3.18c-.55 0-1.05
+.4 -1.11 .92 l-.26 2.19c-.57 .24 -1.1 .55 -1.58 .92 l-2.14-.91c-.48-.2-1.08 .02
+-1.36 .5 l-1.6 2.76c-.28 .48 -.18 1.1 .24 1.42l1.94 1.45c-.03 .24 -.04 .49 -.04
+.75 s.01 .51 .04 .76 L2.6 14.2c-.42 .31 -.52 .94 -.24 1.41l1.6 2.76c.28 .48 .88
+.7 1.36 .5 l2.14-.91c.48 .37 1.01 .68 1.57 .92 l.27 2.19c.06 .53 .56 .93 1.11
+.93 h3.18c.55 0 1.04-.4 1.11-.92l.27-2.19c.56-.24 1.09-.55 1.57-.92l2.14 .91
+c.48 .2 1.08-.02 1.36-.5l1.6-2.76c.28-.48 .18 -1.1-.24-1.42zM12 15.5c-1.93
+0-3.5-1.57-3.5-3.5s1.57-3.5 3.5-3.5 3.5 1.57 3.5 3.5-1.57 3.5-3.5 3.5z"/>
</vector>
diff --git a/res/drawable/ic_settings_about.xml b/res/drawable/ic_settings_about.xml
index cdf8275..887fca6 100644
--- a/res/drawable/ic_settings_about.xml
+++ b/res/drawable/ic_settings_about.xml
@@ -20,6 +20,12 @@
android:viewportHeight="24.0"
android:tint="?android:attr/colorControlNormal">
<path
- android:fillColor="#FFFFFFFF"
- android:pathData="M11.0,17.0l2.0,0.0l0.0,-6.0l-2.0,0.0l0.0,6.0zm1.0,-15.0C6.48,2.0 2.0,6.48 2.0,12.0s4.48,10.0 10.0,10.0 10.0,-4.48 10.0,-10.0S17.52,2.0 12.0,2.0zm0.0,18.0c-4.41,0.0 -8.0,-3.59 -8.0,-8.0s3.59,-8.0 8.0,-8.0 8.0,3.59 8.0,8.0 -3.59,8.0 -8.0,8.0zM11.0,9.0l2.0,0.0L13.0,7.0l-2.0,0.0l0.0,2.0z"/>
+ android:fillColor="#FF000000"
+ android:pathData="M12,17L12,17c0.55,0 1,-0.45 1,-1v-4c0,-0.55 -0.45,-1 -1,-1l0,0c-0.55,0 -1,0.45 -1,1v4C11,16.55 11.45,17 12,17z"/>
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M12,2c-5.52,0 -10,4.48 -10,10s4.48,10 10,10s10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8s8,3.59 8,8S16.41,20 12,20z"/>
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M12,9.1L12,9.1c0.61,0 1.1,-0.49 1.1,-1.1l0,0c0,-0.61 -0.49,-1.1 -1.1,-1.1l0,0c-0.61,0 -1.1,0.49 -1.1,1.1l0,0C10.9,8.61 11.39,9.1 12,9.1z"/>
</vector>
diff --git a/res/drawable/ic_settings_accessibility.xml b/res/drawable/ic_settings_accessibility.xml
index 1570312..4cf5182 100644
--- a/res/drawable/ic_settings_accessibility.xml
+++ b/res/drawable/ic_settings_accessibility.xml
@@ -21,5 +21,5 @@
android:tint="?android:attr/colorControlNormal">
<path
android:fillColor="#FFFFFFFF"
- android:pathData="M20.5 6c-2.61.7-5.67 1-8.5 1s-5.89-.3-8.5-1L3 8c1.86.5 4 .83 6 1v13h2v-6h2v6h2V9c2-.17 4.14-.5 6-1l-.5-2zM12 6c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2z"/>
+ android:pathData="M20.75,6.99c-0.14,-0.55 -0.69,-0.87 -1.24,-0.75C17.13,6.77 14.48,7 12,7S6.87,6.77 4.49,6.24c-0.55,-0.12 -1.1,0.2 -1.24,0.75l0,0C3.11,7.55 3.45,8.12 4,8.25C5.61,8.61 7.35,8.86 9,9v12c0,0.55 0.45,1 1,1h0c0.55,0 1,-0.45 1,-1v-5h2v5c0,0.55 0.45,1 1,1h0c0.55,0 1,-0.45 1,-1V9c1.65,-0.14 3.39,-0.39 5,-0.75C20.55,8.12 20.89,7.55 20.75,6.99L20.75,6.99zM12,6c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2s-2,0.9 -2,2S10.9,6 12,6z"/>
</vector>
diff --git a/res/drawable/ic_settings_data_usage.xml b/res/drawable/ic_settings_data_usage.xml
index 31ea994..0e0b447 100644
--- a/res/drawable/ic_settings_data_usage.xml
+++ b/res/drawable/ic_settings_data_usage.xml
@@ -16,23 +16,16 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24.0dp"
android:height="24.0dp"
- android:viewportWidth="48.0"
- android:viewportHeight="48.0"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0"
android:tint="?android:attr/colorControlNormal">
<path
android:fillColor="#FFFFFFFF"
- android:pathData="M26.0,4.1
- l0.0,6.06
- c6.7,0.97 12.0,6.79 12.0,13.84
- 0.0,1.79 -0.35,3.5 -0.96,5.07
- l5.2,3.07
- C43.35,29.65 44.0,26.91 44.0,24.0
- c0.0,-10.37 -7.89,-18.89 -18.0,-19.9z
- M24.0,38.0
- c-7.73,0.0 -14.0,-6.27 -14.0,-14.0 0.0,-7.05 5.22,-12.87 12.0,-13.84
- l0.0,-6
- C11.88,5.1 4.0,13.63 4.0,24.0
- c0.0,11.05 8.94,20.0 19.99,20.0 6.62,0.0 12.47,-3.23 16.11,-8.18
- l-5.19,-3.06
- C32.35,35.95 28.42,38.0 24.0,38.0z"/>
+ android:pathData="M18.32 16.75l1.32 .76 c.26 .15 .34 .51 .15 .74 -2.09 2.6-5.44 4.14-9.14
+3.65-4.4-.58-7.96-4.12-8.56-8.52C1.34 7.8 5.21 2.95 10.43 2.12c.3-.05 .57 .2 .57
+.5v1.53c0 .24-.18 .44 -.41 .49 -3.6 .69 -6.29 3.95-6.07 7.79 .21 3.82 3.43 6.95
+7.25 7.07 2.37 .08 4.51-.96 5.93-2.63a.48 .48 0 0 1 .62-.12zM19.5 12c0 .83-.14
+1.63-.39 2.38-.08 .23 .01 .47 .21 .59 l1.33 .77 c.26 .15 .61 .04 .72-.24 .4
+-1.09 .63 -2.27 .63 -3.5 0-4.99-3.65-9.12-8.43-9.88-.3-.04-.57 .2 -.57 .5
+v1.53c0 .24 .18 .44 .41 .48 3.46 .68 6.09 3.72 6.09 7.37z"/>
</vector>
diff --git a/res/drawable/ic_settings_date_time.xml b/res/drawable/ic_settings_date_time.xml
index b965878..1d2f3d3 100644
--- a/res/drawable/ic_settings_date_time.xml
+++ b/res/drawable/ic_settings_date_time.xml
@@ -1,28 +1,25 @@
<!--
- Copyright (C) 2016 The Android Open Source Project
+ 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
+ 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
+ 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.
+ 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.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24.0dp"
- android:height="24.0dp"
+ android:width="24dp"
+ android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0"
android:tint="?android:attr/colorControlNormal">
<path
android:fillColor="#FFFFFFFF"
- android:pathData="M11.99,2.0C6.47,2.0 2.0,6.48 2.0,12.0s4.47,10.0 9.99,10.0C17.52,22.0 22.0,17.52 22.0,12.0S17.52,2.0 11.99,2.0zM12.0,20.0c-4.42,0.0 -8.0,-3.58 -8.0,-8.0s3.58,-8.0 8.0,-8.0 8.0,3.58 8.0,8.0 -3.58,8.0 -8.0,8.0z"/>
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M12.5,7.0L11.0,7.0l0.0,6.0l5.25,3.1 0.75,-1.23 -4.5,-2.67z"/>
+ android:pathData="M11.99,2C6.47,2 2,6.48 2,12s4.47,10 9.99,10C17.52,22 22,17.52 22,12S17.52,2 11.99,2zM12,20c-4.42,0 -8,-3.58 -8,-8s3.58,-8 8,-8 8,3.58 8,8 -3.58,8 -8,8zM11.75,6.1c-0.5,0 -0.75,0.32 -0.75,0.72L11,13l4.64,2.78c0.34,0.2 0.78,0.1 0.98,-0.24a0.71,0.71 0,0 0,-0.25 -0.99l-3.87,-2.3L12.5,6.82c0,-0.4 -0.25,-0.72 -0.75,-0.72z"/>
</vector>
diff --git a/res/drawable/ic_settings_display.xml b/res/drawable/ic_settings_display.xml
index ff763f0..de71508 100644
--- a/res/drawable/ic_settings_display.xml
+++ b/res/drawable/ic_settings_display.xml
@@ -21,5 +21,8 @@
android:tint="?android:attr/colorControlNormal">
<path
android:fillColor="#FFFFFFFF"
- android:pathData="M20.0,15.31L23.31,12.0 20.0,8.69L20.0,4.0l-4.69,0.0L12.0,0.69 8.69,4.0L4.0,4.0l0.0,4.69L0.69,12.0 4.0,15.31L4.0,20.0l4.69,0.0L12.0,23.31 15.31,20.0L20.0,20.0l0.0,-4.69zM12.0,18.0L12.0,6.0c3.31,0.0 6.0,2.69 6.0,6.0s-2.69,6.0 -6.0,6.0z"/>
+ android:pathData="M20,15.31l2.6-2.6c0.39-0.39,0.39-1.02,0-1.41L20,8.69V5c0-0.55-0.45-1-1-1h-3.69l-2.6-2.6c-0.39-0.39-1.02-0.39-1.41,0
+L8.69,4H5C4.45,4,4,4.45,4,5v3.69l-2.6,2.6c-0.39,0.39-0.39,1.02,0,1.41l2.6,2.6V19c0,0.55,0.45,1,1,1h3.69l2.6,2.6
+c0.39,0.39,1.02,0.39,1.41,0l2.6-2.6H19c0.55,0,1-0.45,1-1V15.31z
+M12,18V6c3.31,0,6,2.69,6,6S15.31,18,12,18z"/>
</vector>
diff --git a/res/drawable/ic_settings_print.xml b/res/drawable/ic_settings_print.xml
index 7470014..0eab402 100644
--- a/res/drawable/ic_settings_print.xml
+++ b/res/drawable/ic_settings_print.xml
@@ -21,5 +21,8 @@
android:tint="?android:attr/colorControlNormal">
<path
android:fillColor="#FFFFFFFF"
- android:pathData="M19.0,8.0L5.0,8.0c-1.66,0.0 -3.0,1.34 -3.0,3.0l0.0,6.0l4.0,0.0l0.0,4.0l12.0,0.0l0.0,-4.0l4.0,0.0l0.0,-6.0c0.0,-1.66 -1.34,-3.0 -3.0,-3.0zm-3.0,11.0L8.0,19.0l0.0,-5.0l8.0,0.0l0.0,5.0zm3.0,-7.0c-0.55,0.0 -1.0,-0.45 -1.0,-1.0s0.45,-1.0 1.0,-1.0 1.0,0.45 1.0,1.0 -0.45,1.0 -1.0,1.0zm-1.0,-9.0L6.0,3.0l0.0,4.0l12.0,0.0L18.0,3.0z"/>
+ android:pathData="M19,8H5c-1.66,0-3,1.34-3,3v5c0,0.55,0.45,1,1,1h3v3c0,0.55,0.45,1,1,1h10c0.55,0,1-0.45,1-1v-3h3c0.55,0,1-0.45,1-1v-5
+C22,9.34,20.66,8,19,8z M16,19H8v-5h8V19z
+M19,12c-0.55,0-1-0.45-1-1s0.45-1,1-1s1,0.45,1,1S19.55,12,19,12z M17,3H7
+C6.45,3,6,3.45,6,4v3h12V4C18,3.45,17.55,3,17,3z"/>
</vector>
diff --git a/res/drawable/ic_settings_sound.xml b/res/drawable/ic_settings_sound.xml
index 598a02a..7054d78 100644
--- a/res/drawable/ic_settings_sound.xml
+++ b/res/drawable/ic_settings_sound.xml
@@ -21,5 +21,10 @@
android:tint="?android:attr/colorControlNormal">
<path
android:fillColor="#FFFFFFFF"
- android:pathData="M3.0,9.0l0.0,6.0l4.0,0.0l5.0,5.0L12.0,4.0L7.0,9.0L3.0,9.0zm13.5,3.0c0.0,-1.77 -1.02,-3.29 -2.5,-4.03l0.0,8.05c1.48,-0.73 2.5,-2.25 2.5,-4.02zM14.0,3.23l0.0,2.06c2.8,0.86 5.0,3.54 5.0,6.71s-2.11,5.85 -5.0,6.71l0.0,2.06c4.01,-0.91 7.0,-4.49 7.0,-8.77s-2.99,-7.86 -7.0,-8.77z"/>
+ android:pathData="M3 10v4c0 .55 .45 1 1 1h3l3.29 3.29c.63 .63 1.71 .18
+1.71-.71V6.41c0-.89-1.08-1.34-1.71-.71L7 9H4c-.55 0-1 .45-1 1zm13.5 2A4.5 4.5 0
+0 0 14 7.97v8.05c1.48-.73 2.5-2.25 2.5-4.02zM14 4.46v.19c0 .38 .25 .71 .61
+.85C17.18 6.54 19 9.06 19 12s-1.82 5.46-4.39 6.5c-.36 .14 -.61 .47 -.61 .85
+v.19c0 .63 .63 1.08 1.22 .86 a8.995 8.995 0 0 0 0-16.8c-.59-.23-1.22 .23 -1.22
+.86 z"/>
</vector>
diff --git a/res/drawable/ic_vpn_key.xml b/res/drawable/ic_vpn_key.xml
index aad1096..71b29d6 100644
--- a/res/drawable/ic_vpn_key.xml
+++ b/res/drawable/ic_vpn_key.xml
@@ -20,6 +20,7 @@
android:viewportHeight="24.0"
android:tint="?android:attr/colorControlNormal">
<path
- android:pathData="M12.65,10C11.83,7.67 9.61,6 7,6c-3.31,0 -6,2.69 -6,6s2.69,6 6,6c2.61,0 4.83,-1.67 5.65,-4H17v4h4v-4h2v-4H12.65zM7,14c-1.1,0 -2,-0.9 -2,-2s0.9,-2 2,-2 2,0.9 2,2 -0.9,2 -2,2z"
+ android:pathData="M12.65,10C11.7,7.31,8.9,5.5,5.78,6.12C3.49,6.58,1.62,8.41,1.14,10.7C0.32,14.57,3.26,18,7,18c2.61,0,4.83-1.67,5.65-4H16
+v2c0,1.1,0.9,2,2,2h0c1.1,0,2-0.9,2-2v-2h1c1.1,0,2-0.9,2-2v0c0-1.1-0.9-2-2-2H12.65z M7,14c-1.1,0-2-0.9-2-2s0.9-2,2-2s2,0.9,2,2 S8.1,14,7,14z"
android:fillColor="#FFFFFFFF"/>
</vector>
diff --git a/res/drawable/ic_zen.xml b/res/drawable/ic_zen.xml
index 17ecf21..8c50d5d 100644
--- a/res/drawable/ic_zen.xml
+++ b/res/drawable/ic_zen.xml
@@ -14,13 +14,13 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:viewportHeight="24.0"
+ android:viewportWidth="24.0"
android:height="24dp"
- android:viewportHeight="48.0"
- android:viewportWidth="48.0"
android:width="24dp" >
<path
android:fillColor="#FFFFFFFF"
- android:pathData="M24.0,4.0C12.95,4.0 4.0,12.95 4.0,24.0s8.95,20.0 20.0,20.0 20.0,-8.95 20.0,-20.0S35.05,4.0 24.0,4.0zm10.0,22.0L14.0,26.0l0.0,-4.0l20.0,0.0l0.0,4.0z" />
+ android:pathData="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm4 11H8c-.55 0-1-.45-1-1s.45-1 1-1h8c.55 0 1 .45 1 1s-.45 1-1 1z" />
</vector>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 0edb017..6241850 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -5218,9 +5218,10 @@
<string name="credentials_not_erased">Credential storage couldn\u2019t be erased.</string>
<!-- Toast message [CHAR LIMIT=30] -->
<string name="credentials_enabled">Credential storage is enabled.</string>
- <!-- Description of dialog to explain that a lock screen password is required to use credential storage [CHAR LIMIT=NONE] -->
- <string name="credentials_configure_lock_screen_hint">You need to set a lock screen PIN or password before you can use credential storage.</string>
-
+ <!-- This string is in a dialog, and the dialog shows up on a device that's managed by a user's company. It lets the user know that they need to have a secure lock screen (PIN, password, or pattern) before they can use credential storage [CHAR LIMIT=NONE] -->
+ <string name="credentials_configure_lock_screen_hint">Before you can use credential storage, your device need to have a secure lock screen</string>
+ <!-- This string is for the content of the button that leads user to lock screen settings [CHAR LIMIT=20] -->
+ <string name="credentials_configure_lock_screen_button">SET LOCK</string>
<!-- Title of Usage Access preference item [CHAR LIMIT=30] -->
<string name="usage_access_title">Apps with usage access</string>
@@ -6841,8 +6842,8 @@
<!-- [CHAR LIMIT=100] Notification importance screen title -->
<string name="notification_importance_title">Importance</string>
- <!-- [CHAR LIMIT=100] Notification Importance: unspecified importance level description -->
- <string name="notification_importance_unspecified">Let the app decide</string>
+ <!-- [CHAR LIMIT=100 BACKUP_MESSAGE_ID=1820188704793497324] Notification Importance: unspecified importance level description -->
+ <string name="notification_importance_unspecified">Allow sound</string>
<!-- [CHAR LIMIT=100] Notification Importance: blocked importance level description -->
<string name="notification_importance_blocked">Never show notifications</string>
diff --git a/res/xml/development_prefs.xml b/res/xml/development_prefs.xml
index 92205e4..11a579a 100644
--- a/res/xml/development_prefs.xml
+++ b/res/xml/development_prefs.xml
@@ -215,6 +215,11 @@
android:entryValues="@array/usb_configuration_values" />
<SwitchPreference
+ android:key="bluetooth_show_devices_without_names"
+ android:title="@string/bluetooth_show_devices_without_names"
+ android:summary="@string/bluetooth_show_devices_without_names_summary"/>
+
+ <SwitchPreference
android:key="bluetooth_disable_absolute_volume"
android:title="@string/bluetooth_disable_absolute_volume"
android:summary="@string/bluetooth_disable_absolute_volume_summary"/>
diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java
index 2a57577..417ac0f 100644
--- a/src/com/android/settings/Utils.java
+++ b/src/com/android/settings/Utils.java
@@ -107,6 +107,7 @@
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.UserIcons;
import com.android.internal.widget.LockPatternUtils;
+import com.android.settings.enterprise.DevicePolicyManagerWrapper;
import com.android.settings.password.FingerprintManagerWrapper;
import com.android.settings.password.IFingerprintManager;
@@ -1280,6 +1281,28 @@
}
/**
+ * Return {@code true} if the supplied package is device owner or profile owner of at
+ * least one user.
+ * @param userManager used to get profile owner app for each user
+ * @param devicePolicyManager used to check whether it is device owner app
+ * @param packageName package to check about
+ */
+ public static boolean isProfileOrDeviceOwner(UserManager userManager,
+ DevicePolicyManagerWrapper devicePolicyManager, String packageName) {
+ List<UserInfo> userInfos = userManager.getUsers();
+ if (devicePolicyManager.isDeviceOwnerAppOnAnyUser(packageName)) {
+ return true;
+ }
+ for (int i = 0, size = userInfos.size(); i < size; i++) {
+ ComponentName cn = devicePolicyManager.getProfileOwnerAsUser(userInfos.get(i).id);
+ if (cn != null && cn.getPackageName().equals(packageName)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
* Return the resource id to represent the install status for an app
*/
@StringRes
diff --git a/src/com/android/settings/applications/AppInfoBase.java b/src/com/android/settings/applications/AppInfoBase.java
index 4af9bc6..a5daee2 100644
--- a/src/com/android/settings/applications/AppInfoBase.java
+++ b/src/com/android/settings/applications/AppInfoBase.java
@@ -43,6 +43,8 @@
import com.android.settings.SettingsPreferenceFragment;
import com.android.settings.Utils;
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
+import com.android.settings.enterprise.DevicePolicyManagerWrapper;
+import com.android.settings.enterprise.DevicePolicyManagerWrapperImpl;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.RestrictedLockUtils;
import com.android.settingslib.applications.ApplicationsState;
@@ -73,7 +75,7 @@
protected String mPackageName;
protected IUsbManager mUsbManager;
- protected DevicePolicyManager mDpm;
+ protected DevicePolicyManagerWrapper mDpm;
protected UserManager mUserManager;
protected PackageManager mPm;
@@ -92,7 +94,8 @@
.getApplicationFeatureProvider(activity);
mState = ApplicationsState.getInstance(activity.getApplication());
mSession = mState.newSession(this);
- mDpm = (DevicePolicyManager) activity.getSystemService(Context.DEVICE_POLICY_SERVICE);
+ mDpm = new DevicePolicyManagerWrapperImpl(
+ (DevicePolicyManager) activity.getSystemService(Context.DEVICE_POLICY_SERVICE));
mUserManager = (UserManager) activity.getSystemService(Context.USER_SERVICE);
mPm = activity.getPackageManager();
IBinder b = ServiceManager.getService(Context.USB_SERVICE);
diff --git a/src/com/android/settings/applications/InstalledAppDetails.java b/src/com/android/settings/applications/InstalledAppDetails.java
index 5e834d8..209cd22 100755
--- a/src/com/android/settings/applications/InstalledAppDetails.java
+++ b/src/com/android/settings/applications/InstalledAppDetails.java
@@ -277,7 +277,7 @@
// We don't allow uninstalling DO/PO on *any* users, because if it's a system app,
// "uninstall" is actually "downgrade to the system version + disable", and "downgrade"
// will clear data on all users.
- if (isProfileOrDeviceOwner(mPackageInfo.packageName)) {
+ if (Utils.isProfileOrDeviceOwner(mUserManager, mDpm, mPackageInfo.packageName)) {
enabled = false;
}
@@ -352,23 +352,6 @@
return enabled;
}
- /** Returns if the supplied package is device owner or profile owner of at least one user */
- private boolean isProfileOrDeviceOwner(String packageName) {
- List<UserInfo> userInfos = mUserManager.getUsers();
- DevicePolicyManager dpm = (DevicePolicyManager)
- getContext().getSystemService(Context.DEVICE_POLICY_SERVICE);
- if (dpm.isDeviceOwnerAppOnAnyUser(packageName)) {
- return true;
- }
- for (UserInfo userInfo : userInfos) {
- ComponentName cn = dpm.getProfileOwnerAsUser(userInfo.id);
- if (cn != null && cn.getPackageName().equals(packageName)) {
- return true;
- }
- }
- return false;
- }
-
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle icicle) {
diff --git a/src/com/android/settings/bluetooth/BluetoothDevicePreference.java b/src/com/android/settings/bluetooth/BluetoothDevicePreference.java
index 7b81018..084b50e 100644
--- a/src/com/android/settings/bluetooth/BluetoothDevicePreference.java
+++ b/src/com/android/settings/bluetooth/BluetoothDevicePreference.java
@@ -54,16 +54,17 @@
private final UserManager mUserManager;
private AlertDialog mDisconnectDialog;
-
private String contentDescription = null;
-
+ private DeviceListPreferenceFragment mDeviceListPreferenceFragment;
/* Talk-back descriptions for various BT icons */
Resources mResources;
- public BluetoothDevicePreference(Context context, CachedBluetoothDevice cachedDevice) {
+ public BluetoothDevicePreference(Context context, CachedBluetoothDevice cachedDevice,
+ DeviceListPreferenceFragment deviceListPreferenceFragment) {
super(context, null);
mResources = getContext().getResources();
mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
+ mDeviceListPreferenceFragment = deviceListPreferenceFragment;
if (sDimAlpha == Integer.MIN_VALUE) {
TypedValue outValue = new TypedValue();
@@ -131,6 +132,11 @@
// Used to gray out the item
setEnabled(!mCachedDevice.isBusy());
+ // Device is only visible in the UI if it has a valid name besides MAC address or when user
+ // allows showing devices without user-friendly name in developer settings
+ setVisible(mDeviceListPreferenceFragment.shouldShowDevicesWithoutNames()
+ || mCachedDevice.hasHumanReadableName());
+
// This could affect ordering, so notify that
notifyHierarchyChanged();
}
diff --git a/src/com/android/settings/bluetooth/BluetoothPairingDialog.java b/src/com/android/settings/bluetooth/BluetoothPairingDialog.java
index 97382c3..22cb3a6 100644
--- a/src/com/android/settings/bluetooth/BluetoothPairingDialog.java
+++ b/src/com/android/settings/bluetooth/BluetoothPairingDialog.java
@@ -108,12 +108,6 @@
@VisibleForTesting
void dismiss() {
if (!isFinishing()) {
- BluetoothPairingDialogFragment bluetoothFragment =
- (BluetoothPairingDialogFragment) getFragmentManager()
- .findFragmentByTag(FRAGMENT_TAG);
- if (bluetoothFragment != null) {
- bluetoothFragment.dismiss();
- }
finish();
}
}
diff --git a/src/com/android/settings/bluetooth/BluetoothSettings.java b/src/com/android/settings/bluetooth/BluetoothSettings.java
index 2ee58a1..9789310 100644
--- a/src/com/android/settings/bluetooth/BluetoothSettings.java
+++ b/src/com/android/settings/bluetooth/BluetoothSettings.java
@@ -140,6 +140,8 @@
mBluetoothEnabler.resume(getActivity());
}
super.onStart();
+ // Always show paired devices regardless whether user-friendly name exists
+ mShowDevicesWithoutNames = true;
if (isUiRestricted()) {
getPreferenceScreen().removeAll();
if (!isUiRestrictedByOnlyAdmin()) {
diff --git a/src/com/android/settings/bluetooth/DeviceListPreferenceFragment.java b/src/com/android/settings/bluetooth/DeviceListPreferenceFragment.java
index ca06e3c..0485e69 100644
--- a/src/com/android/settings/bluetooth/DeviceListPreferenceFragment.java
+++ b/src/com/android/settings/bluetooth/DeviceListPreferenceFragment.java
@@ -19,6 +19,7 @@
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.os.Bundle;
+import android.os.SystemProperties;
import android.support.annotation.VisibleForTesting;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceCategory;
@@ -52,6 +53,10 @@
private static final String KEY_BT_SCAN = "bt_scan";
+ // Copied from DevelopmentSettings.java
+ private static final String BLUETOOTH_SHOW_DEVICES_WITHOUT_NAMES_PROPERTY =
+ "persist.bluetooth.showdeviceswithoutnames";
+
private BluetoothDeviceFilter.Filter mFilter;
@VisibleForTesting
@@ -68,6 +73,8 @@
final WeakHashMap<CachedBluetoothDevice, BluetoothDevicePreference> mDevicePreferenceMap =
new WeakHashMap<CachedBluetoothDevice, BluetoothDevicePreference>();
+ boolean mShowDevicesWithoutNames;
+
DeviceListPreferenceFragment(String restrictedKey) {
super(restrictedKey);
mFilter = BluetoothDeviceFilter.ALL_FILTER;
@@ -103,6 +110,8 @@
@Override
public void onStart() {
super.onStart();
+ mShowDevicesWithoutNames = SystemProperties.getBoolean(
+ BLUETOOTH_SHOW_DEVICES_WITHOUT_NAMES_PROPERTY, false);
if (mLocalManager == null || isUiRestricted()) return;
mLocalManager.setForegroundActivity(getActivity());
@@ -181,7 +190,7 @@
BluetoothDevicePreference preference = (BluetoothDevicePreference) getCachedPreference(key);
if (preference == null) {
- preference = new BluetoothDevicePreference(getPrefContext(), cachedDevice);
+ preference = new BluetoothDevicePreference(getPrefContext(), cachedDevice, this);
preference.setKey(key);
mDeviceListGroup.addPreference(preference);
} else {
@@ -271,4 +280,8 @@
* Return the key of the {@link PreferenceGroup} that contains the bluetooth devices
*/
public abstract String getDeviceListKey();
+
+ public boolean shouldShowDevicesWithoutNames() {
+ return mShowDevicesWithoutNames;
+ }
}
diff --git a/src/com/android/settings/development/CameraHalHdrplusPreferenceController.java b/src/com/android/settings/development/CameraHalHdrplusPreferenceController.java
index e8e2c2d..a4f087a 100644
--- a/src/com/android/settings/development/CameraHalHdrplusPreferenceController.java
+++ b/src/com/android/settings/development/CameraHalHdrplusPreferenceController.java
@@ -102,6 +102,6 @@
}
private boolean isHalHdrplusEnabled() {
- return SystemProperties.getBoolean(PROPERTY_CAMERA_HAL_HDRPLUS, false);
+ return SystemProperties.getBoolean(PROPERTY_CAMERA_HAL_HDRPLUS, true);
}
}
diff --git a/src/com/android/settings/development/DevelopmentSettings.java b/src/com/android/settings/development/DevelopmentSettings.java
index 0af3dd4..4df72e6 100644
--- a/src/com/android/settings/development/DevelopmentSettings.java
+++ b/src/com/android/settings/development/DevelopmentSettings.java
@@ -166,6 +166,10 @@
private static final String FORCE_RESIZABLE_KEY = "force_resizable_activities";
private static final String COLOR_TEMPERATURE_KEY = "color_temperature";
+ private static final String BLUETOOTH_SHOW_DEVICES_WITHOUT_NAMES_KEY =
+ "bluetooth_show_devices_without_names";
+ private static final String BLUETOOTH_SHOW_DEVICES_WITHOUT_NAMES_PROPERTY =
+ "persist.bluetooth.showdeviceswithoutnames";
private static final String BLUETOOTH_DISABLE_ABSOLUTE_VOLUME_KEY =
"bluetooth_disable_absolute_volume";
private static final String BLUETOOTH_DISABLE_ABSOLUTE_VOLUME_PROPERTY =
@@ -250,6 +254,7 @@
private SwitchPreference mWifiAggressiveHandover;
private SwitchPreference mMobileDataAlwaysOn;
private SwitchPreference mTetheringHardwareOffload;
+ private SwitchPreference mBluetoothShowDevicesWithoutNames;
private SwitchPreference mBluetoothDisableAbsVolume;
private SwitchPreference mBluetoothEnableInbandRinging;
@@ -459,6 +464,8 @@
mMobileDataAlwaysOn = findAndInitSwitchPref(MOBILE_DATA_ALWAYS_ON);
mTetheringHardwareOffload = findAndInitSwitchPref(TETHERING_HARDWARE_OFFLOAD);
mUsbConfiguration = addListPreference(USB_CONFIGURATION_KEY);
+ mBluetoothShowDevicesWithoutNames =
+ findAndInitSwitchPref(BLUETOOTH_SHOW_DEVICES_WITHOUT_NAMES_KEY);
mBluetoothDisableAbsVolume = findAndInitSwitchPref(BLUETOOTH_DISABLE_ABSOLUTE_VOLUME_KEY);
mBluetoothEnableInbandRinging = findAndInitSwitchPref(BLUETOOTH_ENABLE_INBAND_RINGING_KEY);
if (!BluetoothHeadset.isInbandRingingSupported(getContext())) {
@@ -813,6 +820,7 @@
if (mColorTemperaturePreference != null) {
updateColorTemperature();
}
+ updateBluetoothShowDevicesWithoutUserFriendlyNameOptions();
updateBluetoothDisableAbsVolumeOptions();
updateBluetoothEnableInbandRingingOptions();
updateBluetoothA2dpConfigurationValues();
@@ -867,14 +875,17 @@
}
private void updatePasswordSummary() {
- try {
- if (mBackupManager.hasBackupPassword()) {
- mPassword.setSummary(R.string.local_backup_password_summary_change);
- } else {
- mPassword.setSummary(R.string.local_backup_password_summary_none);
+ mPassword.setEnabled(mBackupManager != null);
+ if (mBackupManager != null) {
+ try {
+ if (mBackupManager.hasBackupPassword()) {
+ mPassword.setSummary(R.string.local_backup_password_summary_change);
+ } else {
+ mPassword.setSummary(R.string.local_backup_password_summary_none);
+ }
+ } catch (RemoteException e) {
+ // Not much we can do here
}
- } catch (RemoteException e) {
- // Not much we can do here
}
}
@@ -1443,6 +1454,17 @@
mWifiManager.setAllowScansWithTraffic(mWifiAllowScansWithTraffic.isChecked() ? 1 : 0);
}
+ private void updateBluetoothShowDevicesWithoutUserFriendlyNameOptions() {
+ updateSwitchPreference(mBluetoothShowDevicesWithoutNames,
+ SystemProperties.getBoolean(
+ BLUETOOTH_SHOW_DEVICES_WITHOUT_NAMES_PROPERTY, false));
+ }
+
+ private void writeBluetoothShowDevicesWithoutUserFriendlyNameOptions() {
+ SystemProperties.set(BLUETOOTH_SHOW_DEVICES_WITHOUT_NAMES_PROPERTY,
+ mBluetoothShowDevicesWithoutNames.isChecked() ? "true" : "false");
+ }
+
private void updateBluetoothDisableAbsVolumeOptions() {
updateSwitchPreference(mBluetoothDisableAbsVolume,
SystemProperties.getBoolean(BLUETOOTH_DISABLE_ABSOLUTE_VOLUME_PROPERTY, false));
@@ -2283,6 +2305,8 @@
writeUSBAudioOptions();
} else if (preference == mForceResizable) {
writeForceResizableOptions();
+ } else if (preference == mBluetoothShowDevicesWithoutNames) {
+ writeBluetoothShowDevicesWithoutUserFriendlyNameOptions();
} else if (preference == mBluetoothDisableAbsVolume) {
writeBluetoothDisableAbsVolumeOptions();
} else if (preference == mBluetoothEnableInbandRinging) {
diff --git a/src/com/android/settings/deviceinfo/StorageDashboardFragment.java b/src/com/android/settings/deviceinfo/StorageDashboardFragment.java
index be72539..33d7d36 100644
--- a/src/com/android/settings/deviceinfo/StorageDashboardFragment.java
+++ b/src/com/android/settings/deviceinfo/StorageDashboardFragment.java
@@ -109,8 +109,9 @@
public void onResume() {
super.onResume();
getLoaderManager().restartLoader(STORAGE_JOB_ID, Bundle.EMPTY, this);
+ getLoaderManager()
+ .restartLoader(VOLUME_SIZE_JOB_ID, Bundle.EMPTY, new VolumeSizeCallbacks());
getLoaderManager().initLoader(ICON_JOB_ID, Bundle.EMPTY, new IconLoaderCallbacks());
- getLoaderManager().initLoader(VOLUME_SIZE_JOB_ID, Bundle.EMPTY, new VolumeSizeCallbacks());
}
@Override
diff --git a/src/com/android/settings/deviceinfo/storage/UserProfileController.java b/src/com/android/settings/deviceinfo/storage/UserProfileController.java
index 684ac52..cf1e360 100644
--- a/src/com/android/settings/deviceinfo/storage/UserProfileController.java
+++ b/src/com/android/settings/deviceinfo/storage/UserProfileController.java
@@ -19,6 +19,7 @@
import android.content.Context;
import android.content.Intent;
import android.content.pm.UserInfo;
+import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.storage.VolumeInfo;
@@ -126,7 +127,14 @@
public void handleUserIcons(SparseArray<Drawable> fetchedIcons) {
Drawable userIcon = fetchedIcons.get(mUser.id);
if (userIcon != null) {
- mStoragePreference.setIcon(userIcon);
+ mStoragePreference.setIcon(applyTint(mContext, userIcon));
}
}
+
+ private static Drawable applyTint(Context context, Drawable icon) {
+ icon = icon.mutate();
+ icon.setTint(Utils.getColorAttr(context, android.R.attr.colorControlNormal));
+ return icon;
+ }
+
}
diff --git a/src/com/android/settings/fingerprint/FingerprintSettings.java b/src/com/android/settings/fingerprint/FingerprintSettings.java
index 7ebf294..6ae2fa1 100644
--- a/src/com/android/settings/fingerprint/FingerprintSettings.java
+++ b/src/com/android/settings/fingerprint/FingerprintSettings.java
@@ -903,7 +903,7 @@
}
private static class LearnMoreSpan extends URLSpan {
-
+ private static final String TAG = "LearnMoreSpan";
private static final Typeface TYPEFACE_MEDIUM =
Typeface.create("sans-serif-medium", Typeface.NORMAL);
@@ -928,6 +928,10 @@
RestrictedLockUtils.sendShowAdminSupportDetailsIntent(ctx, mEnforcedAdmin);
} else {
Intent intent = HelpUtils.getHelpIntent(ctx, getURL(), ctx.getClass().getName());
+ if (intent == null) {
+ Log.w(LearnMoreSpan.TAG, "Null help intent.");
+ return;
+ }
try {
widget.startActivityForResult(intent, 0);
} catch (ActivityNotFoundException e) {
diff --git a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
index 3b83fa5..0142e62 100644
--- a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
+++ b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
@@ -16,7 +16,9 @@
package com.android.settings.fuelgauge;
+import android.annotation.UserIdInt;
import android.app.Activity;
+import android.app.ActivityManager;
import android.app.LoaderManager;
import android.app.admin.DevicePolicyManager;
import android.content.Context;
@@ -152,7 +154,14 @@
caller.startPreferencePanelAsUser(fragment, AdvancedPowerUsageDetail.class.getName(), args,
R.string.battery_details_title, null,
- new UserHandle(UserHandle.getUserId(sipper.getUid())));
+ new UserHandle(getUserIdToLaunchAdvancePowerUsageDetail(sipper)));
+ }
+
+ private static @UserIdInt int getUserIdToLaunchAdvancePowerUsageDetail(BatterySipper bs) {
+ if (bs.drainType == BatterySipper.DrainType.USER) {
+ return ActivityManager.getCurrentUser();
+ }
+ return UserHandle.getUserId(bs.getUid());
}
public static void startBatteryDetailPage(SettingsActivity caller, PreferenceFragment fragment,
diff --git a/src/com/android/settings/fuelgauge/AppButtonsPreferenceController.java b/src/com/android/settings/fuelgauge/AppButtonsPreferenceController.java
index 8b56b59..0d5bed8 100644
--- a/src/com/android/settings/fuelgauge/AppButtonsPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/AppButtonsPreferenceController.java
@@ -383,7 +383,7 @@
// We don't allow uninstalling DO/PO on *any* users, because if it's a system app,
// "uninstall" is actually "downgrade to the system version + disable", and "downgrade"
// will clear data on all users.
- if (isProfileOrDeviceOwner(mPackageInfo.packageName)) {
+ if (Utils.isProfileOrDeviceOwner(mUserManager, mDpm, mPackageInfo.packageName)) {
enabled = false;
}
@@ -582,21 +582,6 @@
|| (mUserManager.isSplitSystemUser() && userCount == 2);
}
- /** Returns if the supplied package is device owner or profile owner of at least one user */
- private boolean isProfileOrDeviceOwner(String packageName) {
- List<UserInfo> userInfos = mUserManager.getUsers();
- if (mDpm.isDeviceOwnerAppOnAnyUser(packageName)) {
- return true;
- }
- for (int i = 0, size = userInfos.size(); i < size; i++) {
- ComponentName cn = mDpm.getProfileOwnerAsUser(userInfos.get(i).id);
- if (cn != null && cn.getPackageName().equals(packageName)) {
- return true;
- }
- }
- return false;
- }
-
private final BroadcastReceiver mCheckKillProcessesReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
diff --git a/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceController.java b/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceController.java
index 89089e5..4d1cf77 100644
--- a/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceController.java
@@ -15,17 +15,22 @@
package com.android.settings.fuelgauge;
import android.app.AppOpsManager;
+import android.app.admin.DevicePolicyManager;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.os.Build;
+import android.os.UserManager;
import android.support.annotation.VisibleForTesting;
import android.support.v14.preference.SwitchPreference;
import android.support.v7.preference.Preference;
import android.util.Log;
import com.android.settings.R;
+import com.android.settings.Utils;
import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settings.enterprise.DevicePolicyManagerWrapper;
+import com.android.settings.enterprise.DevicePolicyManagerWrapperImpl;
import com.android.settingslib.core.AbstractPreferenceController;
/**
@@ -39,14 +44,20 @@
private final PackageManager mPackageManager;
private final AppOpsManager mAppOpsManager;
+ private final UserManager mUserManager;
private final String[] mPackages;
private final int mUid;
+ @VisibleForTesting
+ DevicePolicyManagerWrapper mDpm;
private String mTargetPackage;
public BackgroundActivityPreferenceController(Context context, int uid) {
super(context);
mPackageManager = context.getPackageManager();
+ mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
+ mDpm = new DevicePolicyManagerWrapperImpl(
+ (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE));
mAppOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
mUid = uid;
mPackages = mPackageManager.getPackagesForUid(mUid);
@@ -56,12 +67,15 @@
public void updateState(Preference preference) {
final int mode = mAppOpsManager
.checkOpNoThrow(AppOpsManager.OP_RUN_IN_BACKGROUND, mUid, mTargetPackage);
- if (mode == AppOpsManager.MODE_ERRORED) {
- preference.setEnabled(false);
- } else {
+ // Set checked or not before we may set it disabled
+ if (mode != AppOpsManager.MODE_ERRORED) {
final boolean checked = mode != AppOpsManager.MODE_IGNORED;
((SwitchPreference) preference).setChecked(checked);
}
+ if (mode == AppOpsManager.MODE_ERRORED
+ || Utils.isProfileOrDeviceOwner(mUserManager, mDpm, mTargetPackage)) {
+ preference.setEnabled(false);
+ }
updateSummary(preference);
}
diff --git a/src/com/android/settings/fuelgauge/PowerUsageSummary.java b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
index 3d44c40..1596aca 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageSummary.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
@@ -428,7 +428,8 @@
}
private static boolean isSystemUid(int uid) {
- return uid >= Process.SYSTEM_UID && uid < Process.FIRST_APPLICATION_UID;
+ final int appUid = UserHandle.getAppId(uid);
+ return appUid >= Process.SYSTEM_UID && appUid < Process.FIRST_APPLICATION_UID;
}
/**
diff --git a/src/com/android/settings/location/LocationSettings.java b/src/com/android/settings/location/LocationSettings.java
index dc321e2..34e8cc3 100644
--- a/src/com/android/settings/location/LocationSettings.java
+++ b/src/com/android/settings/location/LocationSettings.java
@@ -211,11 +211,6 @@
request.contentDescription);
pref.setIcon(request.icon);
pref.setTitle(request.label);
- if (request.isHighBattery) {
- pref.setSummary(R.string.location_high_battery_use);
- } else {
- pref.setSummary(R.string.location_low_battery_use);
- }
pref.setOnPreferenceClickListener(
new PackageEntryClickedListener(request.packageName, request.userHandle));
recentLocationPrefs.add(pref);
diff --git a/src/com/android/settings/search/SavedQueryController.java b/src/com/android/settings/search/SavedQueryController.java
index 545b415..eaba3d6 100644
--- a/src/com/android/settings/search/SavedQueryController.java
+++ b/src/com/android/settings/search/SavedQueryController.java
@@ -34,10 +34,6 @@
MenuItem.OnMenuItemClickListener {
// TODO: make a generic background task manager to handle one-off tasks like this one.
-
- private static final int LOADER_ID_SAVE_QUERY_TASK = 0;
- private static final int LOADER_ID_REMOVE_QUERY_TASK = 1;
- private static final int LOADER_ID_SAVED_QUERIES = 2;
private static final String ARG_QUERY = "remove_query";
private static final String TAG = "SearchSavedQueryCtrl";
@@ -60,11 +56,11 @@
@Override
public Loader onCreateLoader(int id, Bundle args) {
switch (id) {
- case LOADER_ID_SAVE_QUERY_TASK:
+ case SearchFragment.SearchLoaderId.SAVE_QUERY_TASK:
return new SavedQueryRecorder(mContext, args.getString(ARG_QUERY));
- case LOADER_ID_REMOVE_QUERY_TASK:
+ case SearchFragment.SearchLoaderId.REMOVE_QUERY_TASK:
return new SavedQueryRemover(mContext);
- case LOADER_ID_SAVED_QUERIES:
+ case SearchFragment.SearchLoaderId.SAVED_QUERIES:
return mSearchFeatureProvider.getSavedQueryLoader(mContext);
}
return null;
@@ -73,10 +69,11 @@
@Override
public void onLoadFinished(Loader loader, Object data) {
switch (loader.getId()) {
- case LOADER_ID_REMOVE_QUERY_TASK:
- mLoaderManager.restartLoader(LOADER_ID_SAVED_QUERIES, null, this);
+ case SearchFragment.SearchLoaderId.REMOVE_QUERY_TASK:
+ mLoaderManager.restartLoader(SearchFragment.SearchLoaderId.SAVED_QUERIES,
+ null /* args */, this /* callback */);
break;
- case LOADER_ID_SAVED_QUERIES:
+ case SearchFragment.SearchLoaderId.SAVED_QUERIES:
if (SettingsSearchIndexablesProvider.DEBUG) {
Log.d(TAG, "Saved queries loaded");
}
@@ -107,7 +104,8 @@
public void saveQuery(String query) {
final Bundle args = new Bundle();
args.putString(ARG_QUERY, query);
- mLoaderManager.restartLoader(LOADER_ID_SAVE_QUERY_TASK, args, this);
+ mLoaderManager.restartLoader(SearchFragment.SearchLoaderId.SAVE_QUERY_TASK, args,
+ this /* callback */);
}
/**
@@ -115,13 +113,15 @@
*/
public void removeQueries() {
final Bundle args = new Bundle();
- mLoaderManager.restartLoader(LOADER_ID_REMOVE_QUERY_TASK, args, this);
+ mLoaderManager.restartLoader(SearchFragment.SearchLoaderId.REMOVE_QUERY_TASK, args,
+ this /* callback */);
}
public void loadSavedQueries() {
if (SettingsSearchIndexablesProvider.DEBUG) {
Log.d(TAG, "loading saved queries");
}
- mLoaderManager.restartLoader(LOADER_ID_SAVED_QUERIES, null, this);
+ mLoaderManager.restartLoader(SearchFragment.SearchLoaderId.SAVED_QUERIES, null /* args */,
+ this /* callback */);
}
}
diff --git a/src/com/android/settings/search/SearchFragment.java b/src/com/android/settings/search/SearchFragment.java
index ccc4d61..092404c 100644
--- a/src/com/android/settings/search/SearchFragment.java
+++ b/src/com/android/settings/search/SearchFragment.java
@@ -77,15 +77,19 @@
private static final String STATE_NEVER_ENTERED_QUERY = "state_never_entered_query";
private static final String STATE_RESULT_CLICK_COUNT = "state_result_click_count";
- // Loader IDs
- @VisibleForTesting
- static final int LOADER_ID_DATABASE = 1;
- @VisibleForTesting
- static final int LOADER_ID_INSTALLED_APPS = 2;
- @VisibleForTesting
- static final int LOADER_ID_ACCESSIBILITY_SERVICES = 3;
- @VisibleForTesting
- static final int LOADER_ID_INPUT_DEVICES = 4;
+ static final class SearchLoaderId {
+ // Search Query IDs
+ public static final int DATABASE = 1;
+ public static final int INSTALLED_APPS = 2;
+ public static final int ACCESSIBILITY_SERVICES = 3;
+ public static final int INPUT_DEVICES = 4;
+
+ // Saved Query IDs
+ public static final int SAVE_QUERY_TASK = 5;
+ public static final int REMOVE_QUERY_TASK = 6;
+ public static final int SAVED_QUERIES = 7;
+ }
+
private static final int NUM_QUERY_LOADERS = 4;
@@ -283,10 +287,10 @@
if (isEmptyQuery) {
final LoaderManager loaderManager = getLoaderManager();
- loaderManager.destroyLoader(LOADER_ID_DATABASE);
- loaderManager.destroyLoader(LOADER_ID_INSTALLED_APPS);
- loaderManager.destroyLoader(LOADER_ID_ACCESSIBILITY_SERVICES);
- loaderManager.destroyLoader(LOADER_ID_INPUT_DEVICES);
+ loaderManager.destroyLoader(SearchLoaderId.DATABASE);
+ loaderManager.destroyLoader(SearchLoaderId.INSTALLED_APPS);
+ loaderManager.destroyLoader(SearchLoaderId.ACCESSIBILITY_SERVICES);
+ loaderManager.destroyLoader(SearchLoaderId.INPUT_DEVICES);
mShowingSavedQuery = true;
mSavedQueryController.loadSavedQueries();
mSearchFeatureProvider.hideFeedbackButton();
@@ -311,13 +315,13 @@
final Activity activity = getActivity();
switch (id) {
- case LOADER_ID_DATABASE:
+ case SearchLoaderId.DATABASE:
return mSearchFeatureProvider.getDatabaseSearchLoader(activity, mQuery);
- case LOADER_ID_INSTALLED_APPS:
+ case SearchLoaderId.INSTALLED_APPS:
return mSearchFeatureProvider.getInstalledAppSearchLoader(activity, mQuery);
- case LOADER_ID_ACCESSIBILITY_SERVICES:
+ case SearchLoaderId.ACCESSIBILITY_SERVICES:
return mSearchFeatureProvider.getAccessibilityServiceResultLoader(activity, mQuery);
- case LOADER_ID_INPUT_DEVICES:
+ case SearchLoaderId.INPUT_DEVICES:
return mSearchFeatureProvider.getInputDeviceResultLoader(activity, mQuery);
default:
return null;
@@ -351,13 +355,13 @@
mSavedQueryController.loadSavedQueries();
} else {
final LoaderManager loaderManager = getLoaderManager();
- loaderManager.initLoader(LOADER_ID_DATABASE, null /* args */, this /* callback */);
+ loaderManager.initLoader(SearchLoaderId.DATABASE, null /* args */, this /* callback */);
loaderManager.initLoader(
- LOADER_ID_INSTALLED_APPS, null /* args */, this /* callback */);
+ SearchLoaderId.INSTALLED_APPS, null /* args */, this /* callback */);
loaderManager.initLoader(
- LOADER_ID_ACCESSIBILITY_SERVICES, null /* args */, this /* callback */);
+ SearchLoaderId.ACCESSIBILITY_SERVICES, null /* args */, this /* callback */);
loaderManager.initLoader(
- LOADER_ID_INPUT_DEVICES, null /* args */, this /* callback */);
+ SearchLoaderId.INPUT_DEVICES, null /* args */, this /* callback */);
}
requery();
@@ -395,12 +399,14 @@
mShowingSavedQuery = false;
final LoaderManager loaderManager = getLoaderManager();
mUnfinishedLoadersCount.set(NUM_QUERY_LOADERS);
- loaderManager.restartLoader(LOADER_ID_DATABASE, null /* args */, this /* callback */);
- loaderManager.restartLoader(LOADER_ID_INSTALLED_APPS, null /* args */, this /* callback */);
- loaderManager.restartLoader(LOADER_ID_ACCESSIBILITY_SERVICES, null /* args */,
- this /* callback */);
- loaderManager.restartLoader(LOADER_ID_INPUT_DEVICES, null /* args */,
- this /* callback */);
+ loaderManager.restartLoader(
+ SearchLoaderId.DATABASE, null /* args */, this /* callback */);
+ loaderManager.restartLoader(
+ SearchLoaderId.INSTALLED_APPS, null /* args */, this /* callback */);
+ loaderManager.restartLoader(
+ SearchLoaderId.ACCESSIBILITY_SERVICES, null /* args */, this /* callback */);
+ loaderManager.restartLoader(
+ SearchLoaderId.INPUT_DEVICES, null /* args */, this /* callback */);
}
public String getQuery() {
diff --git a/src/com/android/settings/security/ConfigureKeyGuardDialog.java b/src/com/android/settings/security/ConfigureKeyGuardDialog.java
index 3c89340..dfe3bbe 100644
--- a/src/com/android/settings/security/ConfigureKeyGuardDialog.java
+++ b/src/com/android/settings/security/ConfigureKeyGuardDialog.java
@@ -51,7 +51,7 @@
return new AlertDialog.Builder(getActivity())
.setTitle(android.R.string.dialog_alert_title)
.setMessage(R.string.credentials_configure_lock_screen_hint)
- .setPositiveButton(android.R.string.ok, this)
+ .setPositiveButton(R.string.credentials_configure_lock_screen_button, this)
.setNegativeButton(android.R.string.cancel, this)
.create();
}
diff --git a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
index 72fc981..b16e645 100644
--- a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
+++ b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
@@ -448,7 +448,7 @@
String dnsServers = mLinkProperties.getDnsServers().stream()
.filter(Inet4Address.class::isInstance)
.map(InetAddress::getHostAddress)
- .collect(Collectors.joining(","));
+ .collect(Collectors.joining("\n"));
// Update UI.
updatePreference(mIpAddressPref, ipv4Address);
diff --git a/tests/anomaly-tester/Android.mk b/tests/anomaly-tester/Android.mk
index beb5d69..ade37db 100644
--- a/tests/anomaly-tester/Android.mk
+++ b/tests/anomaly-tester/Android.mk
@@ -2,6 +2,15 @@
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := tests
+LOCAL_CERTIFICATE := platform
+
+LOCAL_JAVA_LIBRARIES := android.test.runner bouncycastle
+
+LOCAL_STATIC_JAVA_LIBRARIES := \
+ android-support-test \
+ mockito-target \
+ ub-uiautomator \
+ truth-prebuilt \
LOCAL_SRC_FILES := $(call all-subdir-java-files)
@@ -9,7 +18,7 @@
LOCAL_PACKAGE_NAME := AnomalyTester
-LOCAL_CERTIFICATE := platform
+LOCAL_INSTRUMENTATION_FOR := Settings
LOCAL_USE_AAPT2 := true
diff --git a/tests/anomaly-tester/AndroidManifest.xml b/tests/anomaly-tester/AndroidManifest.xml
index 68e2dd7..7893b86 100644
--- a/tests/anomaly-tester/AndroidManifest.xml
+++ b/tests/anomaly-tester/AndroidManifest.xml
@@ -22,11 +22,13 @@
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"/>
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
+
<application
android:allowBackup="false"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@android:style/Theme.Material.Light.DarkActionBar">
+ <uses-library android:name="android.test.runner" />
<activity
android:name=".AnomalyActivity"
android:exported="true">
@@ -41,4 +43,10 @@
android:exported="false"/>
</application>
+ <instrumentation
+ android:name="android.support.test.runner.AndroidJUnitRunner"
+ android:targetPackage="com.android.settings"
+ android:label="Settings Test Cases">
+ </instrumentation>
+
</manifest>
\ No newline at end of file
diff --git a/tests/anomaly-tester/src/com/android/settings/anomaly/tests/BluetoothAnomalyTest.java b/tests/anomaly-tester/src/com/android/settings/anomaly/tests/BluetoothAnomalyTest.java
new file mode 100644
index 0000000..3630ce4
--- /dev/null
+++ b/tests/anomaly-tester/src/com/android/settings/anomaly/tests/BluetoothAnomalyTest.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2017 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.settings.anomaly.tests;
+
+import static com.google.common.truth.Truth.assertWithMessage;
+
+import android.app.Instrumentation;
+import android.content.Context;
+import android.content.Intent;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.runner.AndroidJUnit4;
+import android.support.test.uiautomator.By;
+import android.support.test.uiautomator.UiDevice;
+import android.support.test.uiautomator.Until;
+import android.text.format.DateUtils;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+/**
+ * Functional test for bluetooth unoptimized scanning anomaly detector
+ *
+ * @see com.android.settings.fuelgauge.anomaly.checker.BluetoothScanAnomalyDetector
+ */
+@RunWith(AndroidJUnit4.class)
+public class BluetoothAnomalyTest {
+ private static final String BATTERY_INTENT = "android.intent.action.POWER_USAGE_SUMMARY";
+ private static final String RES_BT_EDITTEXT =
+ "com.android.settings.anomaly.tester:id/bluetooth_run_time";
+ private static final String RES_BT_BUTTON =
+ "com.android.settings.anomaly.tester:id/bluetooth_button";
+ private static final long TIME_OUT = 3000;
+ private UiDevice mDevice;
+
+ @Before
+ public void setUp() {
+ final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
+ final Context context = instrumentation.getContext();
+ mDevice = UiDevice.getInstance(instrumentation);
+
+ // setup environment
+ TestUtils.setUp(instrumentation);
+ // start anomaly-tester app
+ TestUtils.startAnomalyApp(context, mDevice);
+ }
+
+ @After
+ public void tearDown() {
+ TestUtils.tearDown(InstrumentationRegistry.getInstrumentation());
+ }
+
+ @Test
+ public void testBluetoothAnomaly_longScanningTime_reportAnomaly() throws InterruptedException {
+ // Set running time
+ final long durationMs = DateUtils.SECOND_IN_MILLIS * 15;
+ TestUtils.setEditTextWithValue(mDevice, RES_BT_EDITTEXT, durationMs);
+
+ // Click start button
+ TestUtils.clickButton(mDevice, RES_BT_BUTTON);
+
+ // Wait for its running
+ mDevice.pressHome();
+ TestUtils.wait(mDevice, durationMs);
+
+ // Check it in battery main page
+ Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
+ instrumentation.startActivitySync(new Intent(BATTERY_INTENT));
+ assertWithMessage("Doesn't have bluetooth anomaly").that(
+ mDevice.wait(Until.findObject(By.text("AnomalyTester draining battery")),
+ TIME_OUT)).isNotNull();
+ }
+
+ @Test
+ public void testBluetoothAnomaly_shortScanningTime_notReport() throws InterruptedException {
+ // Set running time
+ final long durationMs = DateUtils.SECOND_IN_MILLIS;
+ TestUtils.setEditTextWithValue(mDevice, RES_BT_EDITTEXT, durationMs);
+
+ // Click start button
+ TestUtils.clickButton(mDevice, RES_BT_BUTTON);
+
+ // Wait for its running
+ mDevice.pressHome();
+ TestUtils.wait(mDevice, durationMs);
+
+ // Check it in battery main page
+ Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
+ instrumentation.startActivitySync(new Intent(BATTERY_INTENT));
+ assertWithMessage("Shouldn't have bluetooth anomaly").that(
+ mDevice.wait(Until.findObject(By.text("AnomalyTester draining battery")),
+ TIME_OUT)).isNull();
+ }
+
+}
diff --git a/tests/anomaly-tester/src/com/android/settings/anomaly/tests/TestUtils.java b/tests/anomaly-tester/src/com/android/settings/anomaly/tests/TestUtils.java
new file mode 100644
index 0000000..ac15d77
--- /dev/null
+++ b/tests/anomaly-tester/src/com/android/settings/anomaly/tests/TestUtils.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2017 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.settings.anomaly.tests;
+
+import static com.google.common.truth.Truth.assertWithMessage;
+
+import android.app.Instrumentation;
+import android.app.UiAutomation;
+import android.content.Context;
+import android.content.Intent;
+import android.support.test.uiautomator.By;
+import android.support.test.uiautomator.UiDevice;
+import android.support.test.uiautomator.UiObject2;
+import android.support.test.uiautomator.Until;
+
+public class TestUtils {
+ private static final String PACKAGE_NAME = "com.android.settings.anomaly.tester";
+ private static final long TIME_OUT = 3000;
+
+ /**
+ * This method set up the environment for anomaly test
+ *
+ * @param instrumentation to execute command
+ */
+ public static void setUp(Instrumentation instrumentation) {
+ final UiAutomation uiAutomation = instrumentation.getUiAutomation();
+ // pretend unplug and screen off, also reset the battery stats
+ uiAutomation.executeShellCommand("dumpsys battery unplug");
+ uiAutomation.executeShellCommand("dumpsys batterystats enable pretend-screen-off");
+ uiAutomation.executeShellCommand("dumpsys batterystats --reset");
+ }
+
+ /**
+ * This method cleans up all the commands in {@link #setUp(Instrumentation)}
+ *
+ * @param instrumentation to execute command
+ */
+ public static void tearDown(Instrumentation instrumentation) {
+ final UiAutomation uiAutomation = instrumentation.getUiAutomation();
+ // reset unplug and screen-off
+ uiAutomation.executeShellCommand("dumpsys battery reset");
+ uiAutomation.executeShellCommand("dumpsys batterystats disable pretend-screen-off");
+ }
+
+ public static void startAnomalyApp(Context context, UiDevice uiDevice) {
+ final Intent intent = context.getPackageManager().getLaunchIntentForPackage(PACKAGE_NAME);
+ intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
+ context.startActivity(intent);
+ uiDevice.wait(Until.hasObject(By.pkg(PACKAGE_NAME).depth(0)), TIME_OUT);
+ }
+
+ /**
+ * Find {@link android.widget.EditText} with {@code res} and set its {@code value}
+ */
+ public static void setEditTextWithValue(UiDevice uiDevice, String res, long value) {
+ final UiObject2 editText = uiDevice.findObject(By.res(res));
+ assertWithMessage("Cannot find editText with res: " + res).that(editText).isNotNull();
+ editText.setText(String.valueOf(value));
+ }
+
+ /**
+ * Find {@link android.widget.Button} with {@code res} and click it
+ */
+ public static void clickButton(UiDevice uiDevice, String res) {
+ final UiObject2 button = uiDevice.findObject(By.res(res));
+ assertWithMessage("Cannot find button with res: " + res).that(button).isNotNull();
+ button.click();
+ }
+
+ /**
+ * Make {@link UiDevice} wait for {@code timeMs}
+ *
+ * @see Thread#sleep(long)
+ */
+ public static void wait(UiDevice uiDevice, long timeMs) throws InterruptedException {
+ uiDevice.waitForIdle();
+ Thread.sleep(timeMs);
+ }
+}
diff --git a/tests/anomaly-tester/src/com/android/settings/anomaly/tests/WakelockAnomalyTest.java b/tests/anomaly-tester/src/com/android/settings/anomaly/tests/WakelockAnomalyTest.java
new file mode 100644
index 0000000..a2f3804
--- /dev/null
+++ b/tests/anomaly-tester/src/com/android/settings/anomaly/tests/WakelockAnomalyTest.java
@@ -0,0 +1,132 @@
+/*
+ * Copyright (C) 2017 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.settings.anomaly.tests;
+
+import static com.google.common.truth.Truth.assertWithMessage;
+
+import android.app.Instrumentation;
+import android.content.Context;
+import android.content.Intent;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.runner.AndroidJUnit4;
+import android.support.test.uiautomator.By;
+import android.support.test.uiautomator.UiDevice;
+import android.support.test.uiautomator.Until;
+import android.text.format.DateUtils;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+/**
+ * Functional test for bluetooth unoptimized scanning anomaly detector
+ *
+ * @see com.android.settings.fuelgauge.anomaly.checker.BluetoothScanAnomalyDetector
+ */
+@RunWith(AndroidJUnit4.class)
+public class WakelockAnomalyTest {
+ private static final String BATTERY_INTENT = "android.intent.action.POWER_USAGE_SUMMARY";
+ private static final String RES_WAKELOCK_EDITTEXT =
+ "com.android.settings.anomaly.tester:id/wakelock_run_time";
+ private static final String RES_WAKELOCK_BUTTON =
+ "com.android.settings.anomaly.tester:id/wakelock_button";
+ private static final long TIME_OUT = 3000;
+ private UiDevice mDevice;
+
+ @Before
+ public void setUp() {
+ final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
+ final Context context = instrumentation.getContext();
+ mDevice = UiDevice.getInstance(instrumentation);
+
+ // setup environment
+ TestUtils.setUp(instrumentation);
+ // start anomaly-tester app
+ TestUtils.startAnomalyApp(context, mDevice);
+ }
+
+ @After
+ public void tearDown() {
+ TestUtils.tearDown(InstrumentationRegistry.getInstrumentation());
+ }
+
+ @Test
+ public void testWakelockAnomaly_longTimeWhileRunning_report() throws InterruptedException {
+ // Set running time
+ final long durationMs = DateUtils.SECOND_IN_MILLIS * 15;
+ TestUtils.setEditTextWithValue(mDevice, RES_WAKELOCK_EDITTEXT, durationMs);
+
+ // Click start button
+ TestUtils.clickButton(mDevice, RES_WAKELOCK_BUTTON);
+
+ // Wait for its running
+ mDevice.pressHome();
+ // Sleeping time less than running time, so the app still holding wakelock when we check
+ TestUtils.wait(mDevice, durationMs - TIME_OUT);
+
+ // Check it in battery main page
+ Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
+ instrumentation.startActivitySync(new Intent(BATTERY_INTENT));
+ assertWithMessage("Doesn't have wakelock anomaly").that(
+ mDevice.wait(Until.findObject(By.text("AnomalyTester draining battery")),
+ TIME_OUT)).isNotNull();
+ }
+
+ @Test
+ public void testWakelockAnomaly_shortTime_notReport() throws InterruptedException {
+ // Set running time
+ final long durationMs = DateUtils.SECOND_IN_MILLIS;
+ TestUtils.setEditTextWithValue(mDevice, RES_WAKELOCK_EDITTEXT, durationMs);
+
+ // Click start button
+ TestUtils.clickButton(mDevice, RES_WAKELOCK_BUTTON);
+
+ // Wait for its running
+ mDevice.pressHome();
+ TestUtils.wait(mDevice, durationMs);
+
+ // Check it in battery main page
+ Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
+ instrumentation.startActivitySync(new Intent(BATTERY_INTENT));
+ assertWithMessage("Shouldn't have wakelock anomaly").that(
+ mDevice.wait(Until.findObject(By.text("AnomalyTester draining battery")),
+ TIME_OUT)).isNull();
+ }
+
+ @Test
+ public void testWakelockAnomaly_longTimeWhileNotRunning_notReport()
+ throws InterruptedException {
+ // Set running time
+ final long durationMs = DateUtils.SECOND_IN_MILLIS * 10;
+ TestUtils.setEditTextWithValue(mDevice, RES_WAKELOCK_EDITTEXT, durationMs);
+
+ // Click start button
+ TestUtils.clickButton(mDevice, RES_WAKELOCK_BUTTON);
+
+ // Wait for its running
+ mDevice.pressHome();
+ // Wait more time for releasing the wakelock
+ TestUtils.wait(mDevice, durationMs + TIME_OUT);
+
+ // Check it in battery main page
+ Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
+ instrumentation.startActivitySync(new Intent(BATTERY_INTENT));
+ assertWithMessage("Shouldn't have wakelock anomaly").that(
+ mDevice.wait(Until.findObject(By.text("AnomalyTester draining battery")),
+ TIME_OUT)).isNull();
+ }
+
+}
diff --git a/tests/app/Android.mk b/tests/app/Android.mk
deleted file mode 100644
index c0c0ccf..0000000
--- a/tests/app/Android.mk
+++ /dev/null
@@ -1,27 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-# We only want this apk build for tests.
-LOCAL_MODULE_TAGS := tests
-LOCAL_CERTIFICATE := platform
-
-LOCAL_JAVA_LIBRARIES := android.test.runner bouncycastle
-
-LOCAL_STATIC_JAVA_LIBRARIES := \
- android-support-test \
- mockito-target \
- espresso-core \
- espresso-contrib-nodep \
- espresso-intents-nodep \
- ub-uiautomator \
- truth-prebuilt \
- legacy-android-test
-
-# Include all test java files.
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_PACKAGE_NAME := SettingsTests
-
-LOCAL_INSTRUMENTATION_FOR := Settings
-
-include $(BUILD_PACKAGE)
diff --git a/tests/app/AndroidManifest.xml b/tests/app/AndroidManifest.xml
deleted file mode 100644
index 6659e5f..0000000
--- a/tests/app/AndroidManifest.xml
+++ /dev/null
@@ -1,67 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2008 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.
--->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.settings.tests">
-
- <uses-permission android:name="android.permission.BLUETOOTH" />
- <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
- <uses-permission android:name="android.permission.USE_CREDENTIALS" />
- <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
- <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS" />
- <uses-permission android:name="android.permission.UPDATE_APP_OPS_STATS" />
-
- <application>
- <uses-library android:name="android.test.runner" />
- <activity android:name="BluetoothRequestPermissionTest"
- android:label="Bluetooth Perm Test" >
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.DEFAULT" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- <activity android:name="Operator" android:label="Operator Hook Test" >
- <intent-filter>
- <action android:name="com.android.settings.OPERATOR_APPLICATION_SETTING" />
- </intent-filter>
- <meta-data android:name="com.android.settings.title" android:resource="@string/operator_settings_title" />
- <meta-data android:name="com.android.settings.summary" android:resource="@string/operator_settings_summary" />
- <meta-data android:name="com.android.settings.icon" android:resource="@drawable/ic_settings_applications" />
- </activity>
- <activity android:name="Manufacturer" android:label="Manufacturer Hook Test" >
- <intent-filter>
- <action android:name="com.android.settings.MANUFACTURER_APPLICATION_SETTING" />
- </intent-filter>
- <meta-data android:name="com.android.settings.title" android:resource="@string/manufacturer_settings_title" />
- <meta-data android:name="com.android.settings.summary" android:resource="@string/manufacturer_settings_summary" />
- <meta-data android:name="com.android.settings.icon" android:resource="@drawable/ic_settings_applications" />
- </activity>
- </application>
-
- <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
- android:targetPackage="com.android.settings"
- android:label="Settings Test Cases">
- </instrumentation>
-
- <instrumentation android:name="SettingsLaunchPerformance"
- android:targetPackage="com.android.settings"
- android:label="Settings Launch Performance">
- </instrumentation>
-
-</manifest>
diff --git a/tests/app/src/com/android/settings/notification/SoundSettingsIntegrationTest.java b/tests/app/src/com/android/settings/notification/SoundSettingsIntegrationTest.java
deleted file mode 100644
index dff7e61..0000000
--- a/tests/app/src/com/android/settings/notification/SoundSettingsIntegrationTest.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.settings.notification;
-
-import static android.support.test.espresso.Espresso.onView;
-import static android.support.test.espresso.assertion.ViewAssertions.matches;
-import static android.support.test.espresso.matcher.ViewMatchers.hasDescendant;
-import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
-import static android.support.test.espresso.matcher.ViewMatchers.withId;
-import static android.support.test.espresso.matcher.ViewMatchers.withText;
-import static org.hamcrest.Matchers.allOf;
-import static org.hamcrest.Matchers.containsString;
-
-import android.content.Context;
-import android.media.AudioManager;
-import android.support.test.espresso.contrib.RecyclerViewActions;
-import android.support.test.filters.SmallTest;
-import android.support.test.rule.ActivityTestRule;
-import android.support.test.runner.AndroidJUnit4;
-import com.android.settings.R;
-import com.android.settings.Settings;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidJUnit4.class)
-@SmallTest
-public class SoundSettingsIntegrationTest {
-
- private AudioManager mAudioManager;
- private final String TRUNCATED_SUMMARY = "Ring volume at";
-
- @Rule
- public ActivityTestRule<Settings> mActivityRule =
- new ActivityTestRule<>(Settings.class, true);
-
- @Test
- public void soundPreferenceShowsCorrectSummaryOnSilentMode() {
- mAudioManager = (AudioManager) mActivityRule.getActivity().getApplicationContext()
- .getSystemService(Context.AUDIO_SERVICE);
- mAudioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
- onView(withId(R.id.dashboard_container))
- .perform(RecyclerViewActions.scrollTo(
- hasDescendant(withText(R.string.sound_settings))));
- onView(withText(R.string.sound_settings_summary_silent)).check(matches(isDisplayed()));
- }
-
- @Test
- public void soundPreferenceShowsCorrectSummaryOnVibrateMode() {
- mAudioManager = (AudioManager) mActivityRule.getActivity().getApplicationContext()
- .getSystemService(Context.AUDIO_SERVICE);
- mAudioManager.setRingerMode(AudioManager.RINGER_MODE_VIBRATE);
- onView(withId(R.id.dashboard_container)).perform(RecyclerViewActions
- .scrollTo(hasDescendant(withText(R.string.sound_settings))));
- onView(withText(R.string.sound_settings_summary_vibrate)).check(matches(isDisplayed()));
- }
-
- @Test
- public void soundPreferenceShowsCorrectSummaryOnMaxVolume() {
- mAudioManager = (AudioManager) mActivityRule.getActivity().getApplicationContext()
- .getSystemService(Context.AUDIO_SERVICE);
- mAudioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
- mAudioManager.setStreamVolume(AudioManager.STREAM_RING,
- mAudioManager.getStreamMaxVolume(AudioManager.STREAM_RING), 0);
- onView(withId(R.id.dashboard_container))
- .perform(RecyclerViewActions.scrollTo(
- hasDescendant(withText(R.string.sound_settings))));
- onView(withText(containsString(TRUNCATED_SUMMARY))).check(matches(isDisplayed()));
- }
-}
\ No newline at end of file
diff --git a/tests/app/src/com/android/settings/tests/DashboardAdapterTest.java b/tests/app/src/com/android/settings/tests/DashboardAdapterTest.java
deleted file mode 100644
index 4b8e6cf..0000000
--- a/tests/app/src/com/android/settings/tests/DashboardAdapterTest.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.settings.tests;
-
-import android.app.Instrumentation;
-import android.content.Context;
-import android.content.Intent;
-import android.provider.Settings;
-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 com.android.settings.R;
-
-import static android.support.test.espresso.Espresso.onView;
-import static android.support.test.espresso.action.ViewActions.click;
-import static android.support.test.espresso.assertion.ViewAssertions.matches;
-import static android.support.test.espresso.matcher.ViewMatchers.*;
-import static android.support.test.espresso.matcher.ViewMatchers.Visibility.VISIBLE;
-import static org.hamcrest.core.AllOf.allOf;
-
-@RunWith(AndroidJUnit4.class)
-@SmallTest
-public class DashboardAdapterTest {
- @Before
- public void SetUp() {
- Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
- instrumentation.startActivitySync(new Intent(Settings
- .ACTION_SETTINGS));
- }
-
- @Test
- public void testTileConsistency_ToggleSuggestionsAndOpenBluetooth_shouldInBluetooth()
- throws Exception{
- final Context context = InstrumentationRegistry.getTargetContext();
-
- onView(allOf(withText(context.getString(R.string.suggestions_title)),
- withEffectiveVisibility(VISIBLE))).perform(click());
- onView(allOf(withText(context.getString(R.string.bluetooth_settings)),
- withEffectiveVisibility(VISIBLE))).perform(click());
-
- // It should go to Bluetooth sub page, not other page or crash
- onView(allOf(withText(context.getString(R.string.bluetooth_settings)),
- withEffectiveVisibility(VISIBLE))).check(matches(isDisplayed()));
-
- }
-}
diff --git a/tests/robotests/src/com/android/settings/UtilsTest.java b/tests/robotests/src/com/android/settings/UtilsTest.java
index d85464d..33ead1f 100644
--- a/tests/robotests/src/com/android/settings/UtilsTest.java
+++ b/tests/robotests/src/com/android/settings/UtilsTest.java
@@ -8,14 +8,17 @@
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
+import android.content.ComponentName;
import android.content.Context;
import android.content.pm.ApplicationInfo;
+import android.content.pm.UserInfo;
import android.net.ConnectivityManager;
import android.net.LinkAddress;
import android.net.LinkProperties;
import android.net.Network;
import android.net.wifi.WifiManager;
import android.os.Bundle;
+import android.os.UserManager;
import android.os.storage.DiskInfo;
import android.os.storage.StorageManager;
import android.os.storage.VolumeInfo;
@@ -23,6 +26,7 @@
import android.text.format.DateUtils;
import android.text.style.TtsSpan;
+import com.android.settings.enterprise.DevicePolicyManagerWrapper;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import org.junit.Before;
@@ -34,12 +38,15 @@
import org.robolectric.annotation.Config;
import java.net.InetAddress;
+import java.util.ArrayList;
+import java.util.List;
@RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class UtilsTest {
private static final String TIME_DESCRIPTION = "1 day 20 hours 30 minutes";
+ private static final String PACKAGE_NAME = "com.android.app";
private Context mContext;
@Mock
private WifiManager wifiManager;
@@ -47,6 +54,10 @@
private Network network;
@Mock
private ConnectivityManager connectivityManager;
+ @Mock
+ private DevicePolicyManagerWrapper mDevicePolicyManager;
+ @Mock
+ private UserManager mUserManager;
@Before
public void setUp() {
@@ -194,4 +205,25 @@
assertThat(Utils.getInstallationStatus(info)).isEqualTo(R.string.disabled);
}
+
+ @Test
+ public void testIsProfileOrDeviceOwner_deviceOwnerApp_returnTrue() {
+ when(mDevicePolicyManager.isDeviceOwnerAppOnAnyUser(PACKAGE_NAME)).thenReturn(true);
+
+ assertThat(Utils.isProfileOrDeviceOwner(mUserManager, mDevicePolicyManager,
+ PACKAGE_NAME)).isTrue();
+ }
+
+ @Test
+ public void testIsProfileOrDeviceOwner_profileOwnerApp_returnTrue() {
+ final List<UserInfo> userInfos = new ArrayList<>();
+ userInfos.add(new UserInfo());
+
+ when(mUserManager.getUsers()).thenReturn(userInfos);
+ when(mDevicePolicyManager.getProfileOwnerAsUser(userInfos.get(0).id)).thenReturn(
+ new ComponentName(PACKAGE_NAME, ""));
+
+ assertThat(Utils.isProfileOrDeviceOwner(mUserManager, mDevicePolicyManager,
+ PACKAGE_NAME)).isTrue();
+ }
}
diff --git a/tests/robotests/src/com/android/settings/applications/InstalledAppDetailsTest.java b/tests/robotests/src/com/android/settings/applications/InstalledAppDetailsTest.java
index dc0730e..8fb1e99 100644
--- a/tests/robotests/src/com/android/settings/applications/InstalledAppDetailsTest.java
+++ b/tests/robotests/src/com/android/settings/applications/InstalledAppDetailsTest.java
@@ -55,6 +55,7 @@
import com.android.settings.TestConfig;
import com.android.settings.applications.instantapps.InstantAppButtonsController;
import com.android.settings.applications.instantapps.InstantAppButtonsController.ShowDialogDelegate;
+import com.android.settings.enterprise.DevicePolicyManagerWrapper;
import com.android.settings.fuelgauge.BatteryUtils;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
@@ -103,7 +104,7 @@
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
private SettingsActivity mActivity;
@Mock
- private DevicePolicyManager mDevicePolicyManager;
+ private DevicePolicyManagerWrapper mDevicePolicyManager;
@Mock
private BatterySipper mBatterySipper;
@Mock
diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDevicePreferenceTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDevicePreferenceTest.java
index b16e5bc..a1db5de 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDevicePreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDevicePreferenceTest.java
@@ -39,6 +39,8 @@
import org.robolectric.util.ReflectionHelpers;
import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
@@ -52,6 +54,8 @@
private Context mContext;
@Mock
private CachedBluetoothDevice mCachedBluetoothDevice;
+ @Mock
+ private DeviceListPreferenceFragment mDeviceListPreferenceFragment;
private FakeFeatureFactory mFakeFeatureFactory;
private MetricsFeatureProvider mMetricsFeatureProvider;
@@ -64,7 +68,8 @@
FakeFeatureFactory.setupForTest(mContext);
mFakeFeatureFactory = (FakeFeatureFactory) FakeFeatureFactory.getFactory(mContext);
mMetricsFeatureProvider = mFakeFeatureFactory.getMetricsFeatureProvider();
- mPreference = new BluetoothDevicePreference(mContext, mCachedBluetoothDevice);
+ mPreference = new BluetoothDevicePreference(mContext, mCachedBluetoothDevice,
+ mDeviceListPreferenceFragment);
}
@Test
@@ -151,4 +156,49 @@
assertThat(mPreference.getIcon()).isEqualTo(
mContext.getDrawable(R.drawable.ic_settings_print));
}
+
+ @Test
+ public void testVisible_notVisibleThenVisible() {
+ when(mDeviceListPreferenceFragment.shouldShowDevicesWithoutNames()).thenReturn(false);
+ final boolean[] humanReadableName = {false};
+ doAnswer(invocation -> humanReadableName[0]).when(mCachedBluetoothDevice)
+ .hasHumanReadableName();
+ BluetoothDevicePreference preference =
+ new BluetoothDevicePreference(mContext, mCachedBluetoothDevice,
+ mDeviceListPreferenceFragment);
+ assertThat(preference.isVisible()).isFalse();
+ humanReadableName[0] = true;
+ preference.onDeviceAttributesChanged();
+ assertThat(preference.isVisible()).isTrue();
+ }
+
+ @Test
+ public void testVisible_visibleThenNotVisible() {
+ when(mDeviceListPreferenceFragment.shouldShowDevicesWithoutNames()).thenReturn(false);
+ final boolean[] humanReadableName = {true};
+ doAnswer(invocation -> humanReadableName[0]).when(mCachedBluetoothDevice)
+ .hasHumanReadableName();
+ BluetoothDevicePreference preference =
+ new BluetoothDevicePreference(mContext, mCachedBluetoothDevice,
+ mDeviceListPreferenceFragment);
+ assertThat(preference.isVisible()).isTrue();
+ humanReadableName[0] = false;
+ preference.onDeviceAttributesChanged();
+ assertThat(preference.isVisible()).isFalse();
+ }
+
+ @Test
+ public void testVisible_alwaysVisibleWhenEnabled() {
+ when(mDeviceListPreferenceFragment.shouldShowDevicesWithoutNames()).thenReturn(true);
+ final boolean[] humanReadableName = {true};
+ doAnswer(invocation -> humanReadableName[0]).when(mCachedBluetoothDevice)
+ .hasHumanReadableName();
+ BluetoothDevicePreference preference =
+ new BluetoothDevicePreference(mContext, mCachedBluetoothDevice,
+ mDeviceListPreferenceFragment);
+ assertThat(preference.isVisible()).isTrue();
+ humanReadableName[0] = false;
+ preference.onDeviceAttributesChanged();
+ assertThat(preference.isVisible()).isTrue();
+ }
}
diff --git a/tests/robotests/src/com/android/settings/core/codeinspection/ClassScanner.java b/tests/robotests/src/com/android/settings/core/codeinspection/ClassScanner.java
index 09af870..bf57f40 100644
--- a/tests/robotests/src/com/android/settings/core/codeinspection/ClassScanner.java
+++ b/tests/robotests/src/com/android/settings/core/codeinspection/ClassScanner.java
@@ -16,50 +16,47 @@
package com.android.settings.core.codeinspection;
-import java.io.File;
+import com.google.common.reflect.ClassPath;
+
import java.io.IOException;
-import java.net.JarURLConnection;
-import java.net.URL;
-import java.net.URLConnection;
-import java.net.URLDecoder;
import java.util.ArrayList;
-import java.util.Enumeration;
import java.util.List;
-import java.util.jar.JarEntry;
-import java.util.jar.JarFile;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
/**
* Scans and builds all classes in current classloader.
*/
public class ClassScanner {
- private static final String CLASS_SUFFIX = ".class";
-
public List<Class<?>> getClassesForPackage(String packageName)
throws ClassNotFoundException {
final List<Class<?>> classes = new ArrayList<>();
try {
- final Enumeration<URL> resources = Thread.currentThread().getContextClassLoader()
- .getResources(packageName.replace('.', '/'));
- if (!resources.hasMoreElements()) {
- return classes;
- }
- URL url = resources.nextElement();
- while (url != null) {
- final URLConnection connection = url.openConnection();
+ ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+ ClassPath classPath = ClassPath.from(classLoader);
- if (connection instanceof JarURLConnection) {
- loadClassFromJar((JarURLConnection) connection, packageName,
- classes);
- } else {
- loadClassFromDirectory(new File(URLDecoder.decode(url.getPath(), "UTF-8")),
- packageName, classes);
- }
- if (resources.hasMoreElements()) {
- url = resources.nextElement();
- } else {
- break;
+ // Some anonymous classes don't return true when calling isAnonymousClass(), but they
+ // always seem to be nested anonymous classes like com.android.settings.Foo$1$2. In
+ // general we don't want any anonymous classes so we just filter these out by searching
+ // for $[0-9] in the name.
+ Pattern anonymousClassPattern = Pattern.compile(".*\\$\\d+.*");
+ Matcher anonymousClassMatcher = anonymousClassPattern.matcher("");
+
+ for (ClassPath.ClassInfo info : classPath.getAllClasses()) {
+ if (info.getPackageName().startsWith(packageName)) {
+ try {
+ Class clazz = classLoader.loadClass(info.getName());
+ if (clazz.isAnonymousClass() || anonymousClassMatcher.reset(
+ clazz.getName()).matches()) {
+ continue;
+ }
+ classes.add(clazz);
+ } catch (NoClassDefFoundError e) {
+ // do nothing. this class hasn't been found by the
+ // loader, and we don't care.
+ }
}
}
} catch (final IOException e) {
@@ -68,63 +65,4 @@
return classes;
}
- private void loadClassFromDirectory(File directory, String packageName, List<Class<?>> classes)
- throws ClassNotFoundException {
- if (directory.exists() && directory.isDirectory()) {
- final String[] files = directory.list();
-
- for (final String file : files) {
- if (file.endsWith(CLASS_SUFFIX)) {
- try {
- classes.add(Class.forName(
- packageName + '.' + file.substring(0, file.length() - 6),
- false /* init */,
- Thread.currentThread().getContextClassLoader()));
- } catch (NoClassDefFoundError e) {
- // do nothing. this class hasn't been found by the
- // loader, and we don't care.
- }
- } else {
- final File tmpDirectory = new File(directory, file);
- if (tmpDirectory.isDirectory()) {
- loadClassFromDirectory(tmpDirectory, packageName + "." + file, classes);
- }
- }
- }
- }
- }
-
- private void loadClassFromJar(JarURLConnection connection, String packageName,
- List<Class<?>> classes) throws ClassNotFoundException, IOException {
- final JarFile jarFile = connection.getJarFile();
- final Enumeration<JarEntry> entries = jarFile.entries();
- String name;
- if (!entries.hasMoreElements()) {
- return;
- }
- JarEntry jarEntry = entries.nextElement();
- while (jarEntry != null) {
- name = jarEntry.getName();
-
- if (name.contains(CLASS_SUFFIX)) {
- name = name.substring(0, name.length() - CLASS_SUFFIX.length()).replace('/', '.');
-
- if (name.startsWith(packageName)) {
- try {
- classes.add(Class.forName(name,
- false /* init */,
- Thread.currentThread().getContextClassLoader()));
- } catch (NoClassDefFoundError e) {
- // do nothing. this class hasn't been found by the
- // loader, and we don't care.
- }
- }
- }
- if (entries.hasMoreElements()) {
- jarEntry = entries.nextElement();
- } else {
- break;
- }
- }
- }
}
diff --git a/tests/robotests/src/com/android/settings/core/codeinspection/CodeInspectionTest.java b/tests/robotests/src/com/android/settings/core/codeinspection/CodeInspectionTest.java
index faaf338..126a346 100644
--- a/tests/robotests/src/com/android/settings/core/codeinspection/CodeInspectionTest.java
+++ b/tests/robotests/src/com/android/settings/core/codeinspection/CodeInspectionTest.java
@@ -44,14 +44,12 @@
@Before
public void setUp() throws Exception {
mClasses = new ClassScanner().getClassesForPackage(CodeInspector.PACKAGE_NAME);
- // Disabled temporarily - see b/64840107
- //assertThat(mClasses).isNotEmpty();
+ assertThat(mClasses).isNotEmpty();
}
@Test
public void runCodeInspections() {
- // Disabled temporarily - see b/64840107
- // new InstrumentableFragmentCodeInspector(mClasses).run();
- // new SearchIndexProviderCodeInspector(mClasses).run();
+ new InstrumentableFragmentCodeInspector(mClasses).run();
+ new SearchIndexProviderCodeInspector(mClasses).run();
}
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
index 54d043c..c9fcf26 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
@@ -53,6 +53,7 @@
import com.android.settings.applications.LayoutPreference;
import com.android.settings.R;
import com.android.settings.testutils.FakeFeatureFactory;
+import com.android.settings.testutils.shadow.ShadowActivityManager;
import com.android.settings.testutils.shadow.ShadowEntityHeaderController;
import com.android.settings.widget.EntityHeaderController;
import com.android.settingslib.applications.AppUtils;
@@ -78,7 +79,7 @@
@RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION,
- shadows = ShadowEntityHeaderController.class)
+ shadows = {ShadowEntityHeaderController.class, ShadowActivityManager.class})
public class AdvancedPowerUsageDetailTest {
private static final String APP_LABEL = "app label";
private static final String SUMMARY = "summary";
@@ -350,6 +351,22 @@
}
@Test
+ public void testStartBatteryDetailPage_typeUser_startByCurrentUser() {
+ mBatterySipper.drainType = BatterySipper.DrainType.USER;
+ mBatterySipper.userId = 10;
+
+ final int currentUser = 20;
+ ShadowActivityManager.setCurrentUser(currentUser);
+ AdvancedPowerUsageDetail.startBatteryDetailPage(mTestActivity, mBatteryUtils, null,
+ mBatteryStatsHelper, 0, mBatteryEntry, USAGE_PERCENT, null);
+
+
+ verify(mTestActivity).startPreferencePanelAsUser(
+ nullable(Fragment.class), nullable(String.class), nullable(Bundle.class), anyInt(),
+ nullable(CharSequence.class), eq(new UserHandle(currentUser)));
+ }
+
+ @Test
public void testStartBatteryDetailPage_noBatteryUsage_hasBasicData() {
final ArgumentCaptor<Bundle> captor = ArgumentCaptor.forClass(Bundle.class);
Answer<Void> callable = invocation -> {
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceControllerTest.java
index 4f48945..91f4a2b 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceControllerTest.java
@@ -17,14 +17,17 @@
package com.android.settings.fuelgauge;
import android.app.AppOpsManager;
+import android.app.admin.DevicePolicyManager;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.os.Build;
+import android.os.UserManager;
import android.support.v14.preference.SwitchPreference;
import com.android.settings.R;
import com.android.settings.TestConfig;
+import com.android.settings.enterprise.DevicePolicyManagerWrapper;
import org.junit.Before;
import org.junit.Test;
@@ -62,6 +65,12 @@
private ApplicationInfo mHighApplicationInfo;
@Mock
private ApplicationInfo mLowApplicationInfo;
+ @Mock
+ private UserManager mUserManager;
+ @Mock
+ private DevicePolicyManager mDevicePolicyManager;
+ @Mock
+ private DevicePolicyManagerWrapper mDevicePolicyManagerWrapper;
private BackgroundActivityPreferenceController mController;
private SwitchPreference mPreference;
private Context mShadowContext;
@@ -73,6 +82,9 @@
mShadowContext = RuntimeEnvironment.application;
when(mContext.getPackageManager()).thenReturn(mPackageManager);
when(mContext.getSystemService(Context.APP_OPS_SERVICE)).thenReturn(mAppOpsManager);
+ when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
+ when(mContext.getSystemService(Context.DEVICE_POLICY_SERVICE)).thenReturn(
+ mDevicePolicyManager);
when(mPackageManager.getPackagesForUid(UID_NORMAL)).thenReturn(PACKAGES_NORMAL);
when(mPackageManager.getPackagesForUid(UID_SPECIAL)).thenReturn(PACKAGES_SPECIAL);
@@ -86,6 +98,7 @@
mPreference = new SwitchPreference(mShadowContext);
mController = spy(new BackgroundActivityPreferenceController(mContext, UID_NORMAL));
mController.isAvailable();
+ mController.mDpm = mDevicePolicyManagerWrapper;
}
@Test
@@ -181,6 +194,7 @@
@Test
public void testMultiplePackages_ReturnStatusForTargetPackage() {
mController = new BackgroundActivityPreferenceController(mContext, UID_SPECIAL);
+ mController.mDpm = mDevicePolicyManagerWrapper;
when(mAppOpsManager
.checkOpNoThrow(AppOpsManager.OP_RUN_IN_BACKGROUND, UID_SPECIAL, LOW_SDK_PACKAGE))
.thenReturn(AppOpsManager.MODE_ALLOWED);
diff --git a/tests/robotests/src/com/android/settings/search/SearchFragmentTest.java b/tests/robotests/src/com/android/settings/search/SearchFragmentTest.java
index 71c31aa..d78a818 100644
--- a/tests/robotests/src/com/android/settings/search/SearchFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/search/SearchFragmentTest.java
@@ -410,9 +410,9 @@
fragment.onIndexingFinished();
- verify(loaderManager).initLoader(eq(SearchFragment.LOADER_ID_DATABASE),
+ verify(loaderManager).initLoader(eq(SearchFragment.SearchLoaderId.DATABASE),
eq(null), any(LoaderManager.LoaderCallbacks.class));
- verify(loaderManager).initLoader(eq(SearchFragment.LOADER_ID_INSTALLED_APPS),
+ verify(loaderManager).initLoader(eq(SearchFragment.SearchLoaderId.INSTALLED_APPS),
eq(null), any(LoaderManager.LoaderCallbacks.class));
}
diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowActivityManager.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowActivityManager.java
new file mode 100644
index 0000000..b7698b3
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowActivityManager.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2017 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.settings.testutils.shadow;
+
+import android.app.ActivityManager;
+
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+
+@Implements(ActivityManager.class)
+public class ShadowActivityManager {
+ private static int sCurrentUserId = 0;
+
+ @Implementation
+ public static int getCurrentUser() {
+ return sCurrentUserId;
+ }
+
+ public static void setCurrentUser(int userId) {
+ sCurrentUserId = userId;
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java
index 2a7f0cc..86a5ba3 100644
--- a/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java
@@ -433,7 +433,7 @@
displayAndResume();
- verify(mockDnsPref).setDetailText("8.8.4.4,8.8.8.8");
+ verify(mockDnsPref).setDetailText("8.8.4.4\n8.8.8.8");
}
@Test
@@ -545,7 +545,7 @@
lp.addDnsServer(Constants.IPV4_DNS2);
updateLinkProperties(lp);
inOrder.verify(mockDnsPref).setDetailText(
- Constants.IPV4_DNS1.getHostAddress() + "," +
+ Constants.IPV4_DNS1.getHostAddress() + "\n" +
Constants.IPV4_DNS2.getHostAddress());
inOrder.verify(mockDnsPref).setVisible(true);
}
diff --git a/tests/unit/Android.mk b/tests/unit/Android.mk
index b75a592..a91dcb1 100644
--- a/tests/unit/Android.mk
+++ b/tests/unit/Android.mk
@@ -14,6 +14,7 @@
mockito-target-minus-junit4 \
truth-prebuilt \
ub-uiautomator \
+ espresso-contrib-nodep \
espresso-intents-nodep \
diff --git a/tests/unit/AndroidManifest.xml b/tests/unit/AndroidManifest.xml
index c4cae0c..65ed661 100644
--- a/tests/unit/AndroidManifest.xml
+++ b/tests/unit/AndroidManifest.xml
@@ -17,8 +17,41 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.settings.tests.unit">
+ <uses-permission android:name="android.permission.BLUETOOTH" />
+ <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
+ <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+ <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
+ <uses-permission android:name="android.permission.USE_CREDENTIALS" />
+ <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
+ <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS" />
+ <uses-permission android:name="android.permission.UPDATE_APP_OPS_STATS" />
+
<application>
<uses-library android:name="android.test.runner" />
+ <activity android:name="com.android.settings.tests.BluetoothRequestPermissionTest"
+ android:label="Bluetooth Perm Test" >
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
+ <activity android:name="Operator" android:label="Operator Hook Test" >
+ <intent-filter>
+ <action android:name="com.android.settings.OPERATOR_APPLICATION_SETTING" />
+ </intent-filter>
+ <meta-data android:name="com.android.settings.title" android:resource="@string/operator_settings_title" />
+ <meta-data android:name="com.android.settings.summary" android:resource="@string/operator_settings_summary" />
+ <meta-data android:name="com.android.settings.icon" android:resource="@drawable/ic_settings_applications" />
+ </activity>
+ <activity android:name="Manufacturer" android:label="Manufacturer Hook Test" >
+ <intent-filter>
+ <action android:name="com.android.settings.MANUFACTURER_APPLICATION_SETTING" />
+ </intent-filter>
+ <meta-data android:name="com.android.settings.title" android:resource="@string/manufacturer_settings_title" />
+ <meta-data android:name="com.android.settings.summary" android:resource="@string/manufacturer_settings_summary" />
+ <meta-data android:name="com.android.settings.icon" android:resource="@drawable/ic_settings_applications" />
+ </activity>
</application>
<instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
@@ -26,4 +59,9 @@
android:label="Settings Test Cases">
</instrumentation>
+ <instrumentation android:name="com.android.settings.tests.SettingsLaunchPerformance"
+ android:targetPackage="com.android.settings"
+ android:label="Settings Launch Performance">
+ </instrumentation>
+
</manifest>
diff --git a/tests/app/res/drawable-hdpi/ic_settings_applications.png b/tests/unit/res/drawable-hdpi/ic_settings_applications.png
similarity index 100%
rename from tests/app/res/drawable-hdpi/ic_settings_applications.png
rename to tests/unit/res/drawable-hdpi/ic_settings_applications.png
Binary files differ
diff --git a/tests/app/res/drawable-mdpi/ic_settings_applications.png b/tests/unit/res/drawable-mdpi/ic_settings_applications.png
similarity index 100%
rename from tests/app/res/drawable-mdpi/ic_settings_applications.png
rename to tests/unit/res/drawable-mdpi/ic_settings_applications.png
Binary files differ
diff --git a/tests/app/res/drawable-xhdpi/ic_settings_applications.png b/tests/unit/res/drawable-xhdpi/ic_settings_applications.png
similarity index 100%
rename from tests/app/res/drawable-xhdpi/ic_settings_applications.png
rename to tests/unit/res/drawable-xhdpi/ic_settings_applications.png
Binary files differ
diff --git a/tests/app/res/layout/bluetooth_request_permission_test.xml b/tests/unit/res/layout/bluetooth_request_permission_test.xml
similarity index 100%
rename from tests/app/res/layout/bluetooth_request_permission_test.xml
rename to tests/unit/res/layout/bluetooth_request_permission_test.xml
diff --git a/tests/app/res/layout/manufacturer_main.xml b/tests/unit/res/layout/manufacturer_main.xml
similarity index 100%
rename from tests/app/res/layout/manufacturer_main.xml
rename to tests/unit/res/layout/manufacturer_main.xml
diff --git a/tests/app/res/layout/operator_main.xml b/tests/unit/res/layout/operator_main.xml
similarity index 100%
rename from tests/app/res/layout/operator_main.xml
rename to tests/unit/res/layout/operator_main.xml
diff --git a/tests/app/res/values-af/strings.xml b/tests/unit/res/values-af/strings.xml
similarity index 100%
rename from tests/app/res/values-af/strings.xml
rename to tests/unit/res/values-af/strings.xml
diff --git a/tests/app/res/values-am/strings.xml b/tests/unit/res/values-am/strings.xml
similarity index 100%
rename from tests/app/res/values-am/strings.xml
rename to tests/unit/res/values-am/strings.xml
diff --git a/tests/app/res/values-ar/strings.xml b/tests/unit/res/values-ar/strings.xml
similarity index 100%
rename from tests/app/res/values-ar/strings.xml
rename to tests/unit/res/values-ar/strings.xml
diff --git a/tests/app/res/values-az/strings.xml b/tests/unit/res/values-az/strings.xml
similarity index 100%
rename from tests/app/res/values-az/strings.xml
rename to tests/unit/res/values-az/strings.xml
diff --git a/tests/app/res/values-b+sr+Latn/strings.xml b/tests/unit/res/values-b+sr+Latn/strings.xml
similarity index 100%
rename from tests/app/res/values-b+sr+Latn/strings.xml
rename to tests/unit/res/values-b+sr+Latn/strings.xml
diff --git a/tests/app/res/values-be/strings.xml b/tests/unit/res/values-be/strings.xml
similarity index 100%
rename from tests/app/res/values-be/strings.xml
rename to tests/unit/res/values-be/strings.xml
diff --git a/tests/app/res/values-bg/strings.xml b/tests/unit/res/values-bg/strings.xml
similarity index 100%
rename from tests/app/res/values-bg/strings.xml
rename to tests/unit/res/values-bg/strings.xml
diff --git a/tests/app/res/values-bn/strings.xml b/tests/unit/res/values-bn/strings.xml
similarity index 100%
rename from tests/app/res/values-bn/strings.xml
rename to tests/unit/res/values-bn/strings.xml
diff --git a/tests/app/res/values-bs/strings.xml b/tests/unit/res/values-bs/strings.xml
similarity index 100%
rename from tests/app/res/values-bs/strings.xml
rename to tests/unit/res/values-bs/strings.xml
diff --git a/tests/app/res/values-ca/strings.xml b/tests/unit/res/values-ca/strings.xml
similarity index 100%
rename from tests/app/res/values-ca/strings.xml
rename to tests/unit/res/values-ca/strings.xml
diff --git a/tests/app/res/values-cs/strings.xml b/tests/unit/res/values-cs/strings.xml
similarity index 100%
rename from tests/app/res/values-cs/strings.xml
rename to tests/unit/res/values-cs/strings.xml
diff --git a/tests/app/res/values-da/strings.xml b/tests/unit/res/values-da/strings.xml
similarity index 100%
rename from tests/app/res/values-da/strings.xml
rename to tests/unit/res/values-da/strings.xml
diff --git a/tests/app/res/values-de/strings.xml b/tests/unit/res/values-de/strings.xml
similarity index 100%
rename from tests/app/res/values-de/strings.xml
rename to tests/unit/res/values-de/strings.xml
diff --git a/tests/app/res/values-el/strings.xml b/tests/unit/res/values-el/strings.xml
similarity index 100%
rename from tests/app/res/values-el/strings.xml
rename to tests/unit/res/values-el/strings.xml
diff --git a/tests/app/res/values-en-rAU/strings.xml b/tests/unit/res/values-en-rAU/strings.xml
similarity index 100%
rename from tests/app/res/values-en-rAU/strings.xml
rename to tests/unit/res/values-en-rAU/strings.xml
diff --git a/tests/app/res/values-en-rCA/strings.xml b/tests/unit/res/values-en-rCA/strings.xml
similarity index 100%
rename from tests/app/res/values-en-rCA/strings.xml
rename to tests/unit/res/values-en-rCA/strings.xml
diff --git a/tests/app/res/values-en-rGB/strings.xml b/tests/unit/res/values-en-rGB/strings.xml
similarity index 100%
rename from tests/app/res/values-en-rGB/strings.xml
rename to tests/unit/res/values-en-rGB/strings.xml
diff --git a/tests/app/res/values-en-rIN/strings.xml b/tests/unit/res/values-en-rIN/strings.xml
similarity index 100%
rename from tests/app/res/values-en-rIN/strings.xml
rename to tests/unit/res/values-en-rIN/strings.xml
diff --git a/tests/app/res/values-en-rXC/strings.xml b/tests/unit/res/values-en-rXC/strings.xml
similarity index 100%
rename from tests/app/res/values-en-rXC/strings.xml
rename to tests/unit/res/values-en-rXC/strings.xml
diff --git a/tests/app/res/values-es-rUS/strings.xml b/tests/unit/res/values-es-rUS/strings.xml
similarity index 100%
rename from tests/app/res/values-es-rUS/strings.xml
rename to tests/unit/res/values-es-rUS/strings.xml
diff --git a/tests/app/res/values-es/strings.xml b/tests/unit/res/values-es/strings.xml
similarity index 100%
rename from tests/app/res/values-es/strings.xml
rename to tests/unit/res/values-es/strings.xml
diff --git a/tests/app/res/values-et/strings.xml b/tests/unit/res/values-et/strings.xml
similarity index 100%
rename from tests/app/res/values-et/strings.xml
rename to tests/unit/res/values-et/strings.xml
diff --git a/tests/app/res/values-eu/strings.xml b/tests/unit/res/values-eu/strings.xml
similarity index 100%
rename from tests/app/res/values-eu/strings.xml
rename to tests/unit/res/values-eu/strings.xml
diff --git a/tests/app/res/values-fa/strings.xml b/tests/unit/res/values-fa/strings.xml
similarity index 100%
rename from tests/app/res/values-fa/strings.xml
rename to tests/unit/res/values-fa/strings.xml
diff --git a/tests/app/res/values-fi/strings.xml b/tests/unit/res/values-fi/strings.xml
similarity index 100%
rename from tests/app/res/values-fi/strings.xml
rename to tests/unit/res/values-fi/strings.xml
diff --git a/tests/app/res/values-fr-rCA/strings.xml b/tests/unit/res/values-fr-rCA/strings.xml
similarity index 100%
rename from tests/app/res/values-fr-rCA/strings.xml
rename to tests/unit/res/values-fr-rCA/strings.xml
diff --git a/tests/app/res/values-fr/strings.xml b/tests/unit/res/values-fr/strings.xml
similarity index 100%
rename from tests/app/res/values-fr/strings.xml
rename to tests/unit/res/values-fr/strings.xml
diff --git a/tests/app/res/values-gl/strings.xml b/tests/unit/res/values-gl/strings.xml
similarity index 100%
rename from tests/app/res/values-gl/strings.xml
rename to tests/unit/res/values-gl/strings.xml
diff --git a/tests/app/res/values-gu/strings.xml b/tests/unit/res/values-gu/strings.xml
similarity index 100%
rename from tests/app/res/values-gu/strings.xml
rename to tests/unit/res/values-gu/strings.xml
diff --git a/tests/app/res/values-hi/strings.xml b/tests/unit/res/values-hi/strings.xml
similarity index 100%
rename from tests/app/res/values-hi/strings.xml
rename to tests/unit/res/values-hi/strings.xml
diff --git a/tests/app/res/values-hr/strings.xml b/tests/unit/res/values-hr/strings.xml
similarity index 100%
rename from tests/app/res/values-hr/strings.xml
rename to tests/unit/res/values-hr/strings.xml
diff --git a/tests/app/res/values-hu/strings.xml b/tests/unit/res/values-hu/strings.xml
similarity index 100%
rename from tests/app/res/values-hu/strings.xml
rename to tests/unit/res/values-hu/strings.xml
diff --git a/tests/app/res/values-hy/strings.xml b/tests/unit/res/values-hy/strings.xml
similarity index 100%
rename from tests/app/res/values-hy/strings.xml
rename to tests/unit/res/values-hy/strings.xml
diff --git a/tests/app/res/values-in/strings.xml b/tests/unit/res/values-in/strings.xml
similarity index 100%
rename from tests/app/res/values-in/strings.xml
rename to tests/unit/res/values-in/strings.xml
diff --git a/tests/app/res/values-is/strings.xml b/tests/unit/res/values-is/strings.xml
similarity index 100%
rename from tests/app/res/values-is/strings.xml
rename to tests/unit/res/values-is/strings.xml
diff --git a/tests/app/res/values-it/strings.xml b/tests/unit/res/values-it/strings.xml
similarity index 100%
rename from tests/app/res/values-it/strings.xml
rename to tests/unit/res/values-it/strings.xml
diff --git a/tests/app/res/values-iw/strings.xml b/tests/unit/res/values-iw/strings.xml
similarity index 100%
rename from tests/app/res/values-iw/strings.xml
rename to tests/unit/res/values-iw/strings.xml
diff --git a/tests/app/res/values-ja/strings.xml b/tests/unit/res/values-ja/strings.xml
similarity index 100%
rename from tests/app/res/values-ja/strings.xml
rename to tests/unit/res/values-ja/strings.xml
diff --git a/tests/app/res/values-ka/strings.xml b/tests/unit/res/values-ka/strings.xml
similarity index 100%
rename from tests/app/res/values-ka/strings.xml
rename to tests/unit/res/values-ka/strings.xml
diff --git a/tests/app/res/values-kk/strings.xml b/tests/unit/res/values-kk/strings.xml
similarity index 100%
rename from tests/app/res/values-kk/strings.xml
rename to tests/unit/res/values-kk/strings.xml
diff --git a/tests/app/res/values-km/strings.xml b/tests/unit/res/values-km/strings.xml
similarity index 100%
rename from tests/app/res/values-km/strings.xml
rename to tests/unit/res/values-km/strings.xml
diff --git a/tests/app/res/values-kn/strings.xml b/tests/unit/res/values-kn/strings.xml
similarity index 100%
rename from tests/app/res/values-kn/strings.xml
rename to tests/unit/res/values-kn/strings.xml
diff --git a/tests/app/res/values-ko/strings.xml b/tests/unit/res/values-ko/strings.xml
similarity index 100%
rename from tests/app/res/values-ko/strings.xml
rename to tests/unit/res/values-ko/strings.xml
diff --git a/tests/app/res/values-ky/strings.xml b/tests/unit/res/values-ky/strings.xml
similarity index 100%
rename from tests/app/res/values-ky/strings.xml
rename to tests/unit/res/values-ky/strings.xml
diff --git a/tests/app/res/values-lo/strings.xml b/tests/unit/res/values-lo/strings.xml
similarity index 100%
rename from tests/app/res/values-lo/strings.xml
rename to tests/unit/res/values-lo/strings.xml
diff --git a/tests/app/res/values-lt/strings.xml b/tests/unit/res/values-lt/strings.xml
similarity index 100%
rename from tests/app/res/values-lt/strings.xml
rename to tests/unit/res/values-lt/strings.xml
diff --git a/tests/app/res/values-lv/strings.xml b/tests/unit/res/values-lv/strings.xml
similarity index 100%
rename from tests/app/res/values-lv/strings.xml
rename to tests/unit/res/values-lv/strings.xml
diff --git a/tests/app/res/values-mk/strings.xml b/tests/unit/res/values-mk/strings.xml
similarity index 100%
rename from tests/app/res/values-mk/strings.xml
rename to tests/unit/res/values-mk/strings.xml
diff --git a/tests/app/res/values-ml/strings.xml b/tests/unit/res/values-ml/strings.xml
similarity index 100%
rename from tests/app/res/values-ml/strings.xml
rename to tests/unit/res/values-ml/strings.xml
diff --git a/tests/app/res/values-mn/strings.xml b/tests/unit/res/values-mn/strings.xml
similarity index 100%
rename from tests/app/res/values-mn/strings.xml
rename to tests/unit/res/values-mn/strings.xml
diff --git a/tests/app/res/values-mr/strings.xml b/tests/unit/res/values-mr/strings.xml
similarity index 100%
rename from tests/app/res/values-mr/strings.xml
rename to tests/unit/res/values-mr/strings.xml
diff --git a/tests/app/res/values-ms/strings.xml b/tests/unit/res/values-ms/strings.xml
similarity index 100%
rename from tests/app/res/values-ms/strings.xml
rename to tests/unit/res/values-ms/strings.xml
diff --git a/tests/app/res/values-my/strings.xml b/tests/unit/res/values-my/strings.xml
similarity index 100%
rename from tests/app/res/values-my/strings.xml
rename to tests/unit/res/values-my/strings.xml
diff --git a/tests/app/res/values-nb/strings.xml b/tests/unit/res/values-nb/strings.xml
similarity index 100%
rename from tests/app/res/values-nb/strings.xml
rename to tests/unit/res/values-nb/strings.xml
diff --git a/tests/app/res/values-ne/strings.xml b/tests/unit/res/values-ne/strings.xml
similarity index 100%
rename from tests/app/res/values-ne/strings.xml
rename to tests/unit/res/values-ne/strings.xml
diff --git a/tests/app/res/values-nl/strings.xml b/tests/unit/res/values-nl/strings.xml
similarity index 100%
rename from tests/app/res/values-nl/strings.xml
rename to tests/unit/res/values-nl/strings.xml
diff --git a/tests/app/res/values-pa/strings.xml b/tests/unit/res/values-pa/strings.xml
similarity index 100%
rename from tests/app/res/values-pa/strings.xml
rename to tests/unit/res/values-pa/strings.xml
diff --git a/tests/app/res/values-pl/strings.xml b/tests/unit/res/values-pl/strings.xml
similarity index 100%
rename from tests/app/res/values-pl/strings.xml
rename to tests/unit/res/values-pl/strings.xml
diff --git a/tests/app/res/values-pt-rBR/strings.xml b/tests/unit/res/values-pt-rBR/strings.xml
similarity index 100%
rename from tests/app/res/values-pt-rBR/strings.xml
rename to tests/unit/res/values-pt-rBR/strings.xml
diff --git a/tests/app/res/values-pt-rPT/strings.xml b/tests/unit/res/values-pt-rPT/strings.xml
similarity index 100%
rename from tests/app/res/values-pt-rPT/strings.xml
rename to tests/unit/res/values-pt-rPT/strings.xml
diff --git a/tests/app/res/values-pt/strings.xml b/tests/unit/res/values-pt/strings.xml
similarity index 100%
rename from tests/app/res/values-pt/strings.xml
rename to tests/unit/res/values-pt/strings.xml
diff --git a/tests/app/res/values-ro/strings.xml b/tests/unit/res/values-ro/strings.xml
similarity index 100%
rename from tests/app/res/values-ro/strings.xml
rename to tests/unit/res/values-ro/strings.xml
diff --git a/tests/app/res/values-ru/strings.xml b/tests/unit/res/values-ru/strings.xml
similarity index 100%
rename from tests/app/res/values-ru/strings.xml
rename to tests/unit/res/values-ru/strings.xml
diff --git a/tests/app/res/values-si/strings.xml b/tests/unit/res/values-si/strings.xml
similarity index 100%
rename from tests/app/res/values-si/strings.xml
rename to tests/unit/res/values-si/strings.xml
diff --git a/tests/app/res/values-sk/strings.xml b/tests/unit/res/values-sk/strings.xml
similarity index 100%
rename from tests/app/res/values-sk/strings.xml
rename to tests/unit/res/values-sk/strings.xml
diff --git a/tests/app/res/values-sl/strings.xml b/tests/unit/res/values-sl/strings.xml
similarity index 100%
rename from tests/app/res/values-sl/strings.xml
rename to tests/unit/res/values-sl/strings.xml
diff --git a/tests/app/res/values-sq/strings.xml b/tests/unit/res/values-sq/strings.xml
similarity index 100%
rename from tests/app/res/values-sq/strings.xml
rename to tests/unit/res/values-sq/strings.xml
diff --git a/tests/app/res/values-sr/strings.xml b/tests/unit/res/values-sr/strings.xml
similarity index 100%
rename from tests/app/res/values-sr/strings.xml
rename to tests/unit/res/values-sr/strings.xml
diff --git a/tests/app/res/values-sv/strings.xml b/tests/unit/res/values-sv/strings.xml
similarity index 100%
rename from tests/app/res/values-sv/strings.xml
rename to tests/unit/res/values-sv/strings.xml
diff --git a/tests/app/res/values-sw/strings.xml b/tests/unit/res/values-sw/strings.xml
similarity index 100%
rename from tests/app/res/values-sw/strings.xml
rename to tests/unit/res/values-sw/strings.xml
diff --git a/tests/app/res/values-ta/strings.xml b/tests/unit/res/values-ta/strings.xml
similarity index 100%
rename from tests/app/res/values-ta/strings.xml
rename to tests/unit/res/values-ta/strings.xml
diff --git a/tests/app/res/values-te/strings.xml b/tests/unit/res/values-te/strings.xml
similarity index 100%
rename from tests/app/res/values-te/strings.xml
rename to tests/unit/res/values-te/strings.xml
diff --git a/tests/app/res/values-th/strings.xml b/tests/unit/res/values-th/strings.xml
similarity index 100%
rename from tests/app/res/values-th/strings.xml
rename to tests/unit/res/values-th/strings.xml
diff --git a/tests/app/res/values-tl/strings.xml b/tests/unit/res/values-tl/strings.xml
similarity index 100%
rename from tests/app/res/values-tl/strings.xml
rename to tests/unit/res/values-tl/strings.xml
diff --git a/tests/app/res/values-tr/strings.xml b/tests/unit/res/values-tr/strings.xml
similarity index 100%
rename from tests/app/res/values-tr/strings.xml
rename to tests/unit/res/values-tr/strings.xml
diff --git a/tests/app/res/values-uk/strings.xml b/tests/unit/res/values-uk/strings.xml
similarity index 100%
rename from tests/app/res/values-uk/strings.xml
rename to tests/unit/res/values-uk/strings.xml
diff --git a/tests/app/res/values-ur/strings.xml b/tests/unit/res/values-ur/strings.xml
similarity index 100%
rename from tests/app/res/values-ur/strings.xml
rename to tests/unit/res/values-ur/strings.xml
diff --git a/tests/app/res/values-uz/strings.xml b/tests/unit/res/values-uz/strings.xml
similarity index 100%
rename from tests/app/res/values-uz/strings.xml
rename to tests/unit/res/values-uz/strings.xml
diff --git a/tests/app/res/values-vi/strings.xml b/tests/unit/res/values-vi/strings.xml
similarity index 100%
rename from tests/app/res/values-vi/strings.xml
rename to tests/unit/res/values-vi/strings.xml
diff --git a/tests/app/res/values-zh-rCN/strings.xml b/tests/unit/res/values-zh-rCN/strings.xml
similarity index 100%
rename from tests/app/res/values-zh-rCN/strings.xml
rename to tests/unit/res/values-zh-rCN/strings.xml
diff --git a/tests/app/res/values-zh-rHK/strings.xml b/tests/unit/res/values-zh-rHK/strings.xml
similarity index 100%
rename from tests/app/res/values-zh-rHK/strings.xml
rename to tests/unit/res/values-zh-rHK/strings.xml
diff --git a/tests/app/res/values-zh-rTW/strings.xml b/tests/unit/res/values-zh-rTW/strings.xml
similarity index 100%
rename from tests/app/res/values-zh-rTW/strings.xml
rename to tests/unit/res/values-zh-rTW/strings.xml
diff --git a/tests/app/res/values-zu/strings.xml b/tests/unit/res/values-zu/strings.xml
similarity index 100%
rename from tests/app/res/values-zu/strings.xml
rename to tests/unit/res/values-zu/strings.xml
diff --git a/tests/app/res/values/strings.xml b/tests/unit/res/values/strings.xml
similarity index 100%
rename from tests/app/res/values/strings.xml
rename to tests/unit/res/values/strings.xml
diff --git a/tests/app/src/com/android/settings/SettingsHookTests.java b/tests/unit/src/com/android/settings/SettingsHookTests.java
similarity index 97%
rename from tests/app/src/com/android/settings/SettingsHookTests.java
rename to tests/unit/src/com/android/settings/SettingsHookTests.java
index 4dfd484..cc7aa89 100644
--- a/tests/app/src/com/android/settings/SettingsHookTests.java
+++ b/tests/unit/src/com/android/settings/SettingsHookTests.java
@@ -17,8 +17,6 @@
package com.android.settings;
import com.android.settings.Settings;
-import com.android.settings.tests.Manufacturer;
-import com.android.settings.tests.Operator;
import android.content.Context;
import android.content.Intent;
@@ -41,7 +39,7 @@
*/
public class SettingsHookTests extends ActivityInstrumentationTestCase2<Settings> {
- private static final String PACKAGE_NAME = "com.android.settings.tests";
+ private static final String PACKAGE_NAME = "com.android.settings.tests.unit";
private static final String KEY_SETTINGS_ROOT = "parent";
private static final String KEY_SETTINGS_OPERATOR = "operator_settings";
diff --git a/tests/app/src/com/android/settings/applications/DefaultAppSettingsTest.java b/tests/unit/src/com/android/settings/applications/DefaultAppSettingsTest.java
similarity index 93%
rename from tests/app/src/com/android/settings/applications/DefaultAppSettingsTest.java
rename to tests/unit/src/com/android/settings/applications/DefaultAppSettingsTest.java
index bd03bc9..eafe32a 100644
--- a/tests/app/src/com/android/settings/applications/DefaultAppSettingsTest.java
+++ b/tests/unit/src/com/android/settings/applications/DefaultAppSettingsTest.java
@@ -67,6 +67,9 @@
final String titleApps = mTargetContext.getResources().getString(
R.string.app_and_notification_dashboard_title);
mDevice.findObject(new UiSelector().text(titleApps)).click();
+ final String titleAdvance = mTargetContext.getResources().getString(
+ R.string.advanced_section_header);
+ mDevice.findObject(new UiSelector().text(titleAdvance)).click();
final String titleDefaultApps = mTargetContext.getResources().getString(
R.string.app_default_dashboard_title);
mDevice.findObject(new UiSelector().text(titleDefaultApps)).click();
diff --git a/tests/app/src/com/android/settings/applications/ExternalSourcesSettingsTest.java b/tests/unit/src/com/android/settings/applications/ExternalSourcesSettingsTest.java
similarity index 100%
rename from tests/app/src/com/android/settings/applications/ExternalSourcesSettingsTest.java
rename to tests/unit/src/com/android/settings/applications/ExternalSourcesSettingsTest.java
diff --git a/tests/app/src/com/android/settings/deviceinfo/StorageDashboardFragmentEspressoTest.java b/tests/unit/src/com/android/settings/deviceinfo/StorageDashboardFragmentTest.java
similarity index 91%
rename from tests/app/src/com/android/settings/deviceinfo/StorageDashboardFragmentEspressoTest.java
rename to tests/unit/src/com/android/settings/deviceinfo/StorageDashboardFragmentTest.java
index b43a5ba..00b710f 100644
--- a/tests/app/src/com/android/settings/deviceinfo/StorageDashboardFragmentEspressoTest.java
+++ b/tests/unit/src/com/android/settings/deviceinfo/StorageDashboardFragmentTest.java
@@ -19,7 +19,7 @@
import static org.hamcrest.Matchers.equalTo;
@SmallTest
-public class StorageDashboardFragmentEspressoTest {
+public class StorageDashboardFragmentTest {
public static final String EXTRA_KEY = ":settings:show_fragment";
@@ -30,7 +30,7 @@
@Test
public void testStorageManagePreference_canClickTextView() throws InterruptedException {
// Click on the actual textbox instead of just somewhere in the preference
- onView(withText(R.string.storage_menu_manage)).perform(click());
+ onView(withText(R.string.automatic_storage_manager_preference_title)).perform(click());
// Check that it worked by seeing if we switched screens
intended(hasExtra(equalTo(EXTRA_KEY),
diff --git a/tests/app/src/com/android/settings/fuelgauge/PowerUsageSummaryUiTest.java b/tests/unit/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java
similarity index 97%
rename from tests/app/src/com/android/settings/fuelgauge/PowerUsageSummaryUiTest.java
rename to tests/unit/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java
index 6c372c5..9cbd742 100644
--- a/tests/app/src/com/android/settings/fuelgauge/PowerUsageSummaryUiTest.java
+++ b/tests/unit/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java
@@ -34,7 +34,7 @@
@RunWith(AndroidJUnit4.class)
@SmallTest
-public class PowerUsageSummaryUiTest {
+public class PowerUsageSummaryTest {
private static final String BATTERY_INTENT = "android.intent.action.POWER_USAGE_SUMMARY";
@Before
diff --git a/tests/app/src/com/android/settings/notification/ZenModeSettingsIntegrationTest.java b/tests/unit/src/com/android/settings/notification/ZenModeSettingsIntegrationTest.java
similarity index 100%
rename from tests/app/src/com/android/settings/notification/ZenModeSettingsIntegrationTest.java
rename to tests/unit/src/com/android/settings/notification/ZenModeSettingsIntegrationTest.java
diff --git a/tests/app/src/com/android/settings/password/ChooseLockGenericTest.java b/tests/unit/src/com/android/settings/password/ChooseLockGenericTest.java
similarity index 96%
rename from tests/app/src/com/android/settings/password/ChooseLockGenericTest.java
rename to tests/unit/src/com/android/settings/password/ChooseLockGenericTest.java
index 40b69a4..32b47df 100644
--- a/tests/app/src/com/android/settings/password/ChooseLockGenericTest.java
+++ b/tests/unit/src/com/android/settings/password/ChooseLockGenericTest.java
@@ -170,6 +170,14 @@
enterTestPin(view);
enterTestPin(view);
+ // Dismiss notifications setting
+ view = new UiObject(new UiSelector()
+ .resourceId(mSettingPackage + ":id/redaction_done_button"));
+ if (view.waitForExists(TIMEOUT)) {
+ view.click();
+ mDevice.waitForIdle();
+ }
+
mDevice.pressBack();
assertThat(getTargetContext().getSystemService(KeyguardManager.class).isDeviceSecure())
diff --git a/tests/app/src/com/android/settings/password/ChooseLockPasswordTest.java b/tests/unit/src/com/android/settings/password/ChooseLockPasswordTest.java
similarity index 100%
rename from tests/app/src/com/android/settings/password/ChooseLockPasswordTest.java
rename to tests/unit/src/com/android/settings/password/ChooseLockPasswordTest.java
diff --git a/tests/app/src/com/android/settings/password/ConfirmLockPasswordTest.java b/tests/unit/src/com/android/settings/password/ConfirmLockPasswordTest.java
similarity index 100%
rename from tests/app/src/com/android/settings/password/ConfirmLockPasswordTest.java
rename to tests/unit/src/com/android/settings/password/ConfirmLockPasswordTest.java
diff --git a/tests/app/src/com/android/settings/password/SetupChooseLockPasswordAppTest.java b/tests/unit/src/com/android/settings/password/SetupChooseLockPasswordAppTest.java
similarity index 100%
rename from tests/app/src/com/android/settings/password/SetupChooseLockPasswordAppTest.java
rename to tests/unit/src/com/android/settings/password/SetupChooseLockPasswordAppTest.java
diff --git a/tests/app/src/com/android/settings/tests/BluetoothRequestPermissionTest.java b/tests/unit/src/com/android/settings/tests/BluetoothRequestPermissionTest.java
similarity index 99%
rename from tests/app/src/com/android/settings/tests/BluetoothRequestPermissionTest.java
rename to tests/unit/src/com/android/settings/tests/BluetoothRequestPermissionTest.java
index a2cdafe..442f4b6 100644
--- a/tests/app/src/com/android/settings/tests/BluetoothRequestPermissionTest.java
+++ b/tests/unit/src/com/android/settings/tests/BluetoothRequestPermissionTest.java
@@ -30,6 +30,7 @@
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
+import com.android.settings.tests.unit.R;
public class BluetoothRequestPermissionTest extends Activity {
private static final String TAG = "BluetoothRequestPermissionTest";
diff --git a/tests/app/src/com/android/settings/tests/DrawOverlayDetailsTest.java b/tests/unit/src/com/android/settings/tests/DrawOverlayDetailsTest.java
similarity index 84%
rename from tests/app/src/com/android/settings/tests/DrawOverlayDetailsTest.java
rename to tests/unit/src/com/android/settings/tests/DrawOverlayDetailsTest.java
index 234f8e6..3e00a45 100644
--- a/tests/app/src/com/android/settings/tests/DrawOverlayDetailsTest.java
+++ b/tests/unit/src/com/android/settings/tests/DrawOverlayDetailsTest.java
@@ -21,9 +21,13 @@
import android.content.Intent;
import android.content.pm.PackageManager;
import android.support.test.InstrumentationRegistry;
+import android.support.test.uiautomator.UiDevice;
+
import org.junit.runner.RunWith;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
+import android.support.test.uiautomator.UiScrollable;
+import android.support.test.uiautomator.UiSelector;
import org.junit.Test;
import com.android.settings.R;
@@ -52,8 +56,16 @@
final String appName = (String) packageManager.getApplicationLabel(packageManager
.getApplicationInfo(PACKAGE_SYSTEM_UI, PackageManager.GET_META_DATA));
+ final UiDevice device = UiDevice.getInstance(instrumentation);
+ device.waitForIdle();
+
openActionBarOverflowOrOptionsMenu(targetContext);
onView(withText(targetContext.getString(R.string.menu_show_system))).perform(click());
+ device.waitForIdle();
+
+ final UiScrollable settings = new UiScrollable(
+ new UiSelector().packageName(targetContext.getPackageName()).scrollable(true));
+ settings.scrollTextIntoView(appName);
onView(withText(appName)).perform(click());
onView(withText(targetContext.getString(R.string.permit_draw_overlay))).check(matches
(not(isEnabled())));
diff --git a/tests/app/src/com/android/settings/tests/KeepOnScreenTest.java b/tests/unit/src/com/android/settings/tests/KeepOnScreenTest.java
similarity index 100%
rename from tests/app/src/com/android/settings/tests/KeepOnScreenTest.java
rename to tests/unit/src/com/android/settings/tests/KeepOnScreenTest.java
diff --git a/tests/app/src/com/android/settings/tests/Manufacturer.java b/tests/unit/src/com/android/settings/tests/Manufacturer.java
similarity index 95%
rename from tests/app/src/com/android/settings/tests/Manufacturer.java
rename to tests/unit/src/com/android/settings/tests/Manufacturer.java
index 692e6a8..a708d1b 100644
--- a/tests/app/src/com/android/settings/tests/Manufacturer.java
+++ b/tests/unit/src/com/android/settings/tests/Manufacturer.java
@@ -18,6 +18,7 @@
import android.app.Activity;
import android.os.Bundle;
+import com.android.settings.tests.unit.R;
public class Manufacturer extends Activity {
diff --git a/tests/app/src/com/android/settings/tests/Operator.java b/tests/unit/src/com/android/settings/tests/Operator.java
similarity index 95%
rename from tests/app/src/com/android/settings/tests/Operator.java
rename to tests/unit/src/com/android/settings/tests/Operator.java
index 8a34363..94bcc78 100644
--- a/tests/app/src/com/android/settings/tests/Operator.java
+++ b/tests/unit/src/com/android/settings/tests/Operator.java
@@ -18,6 +18,7 @@
import android.app.Activity;
import android.os.Bundle;
+import com.android.settings.tests.unit.R;
public class Operator extends Activity {
diff --git a/tests/app/src/com/android/settings/tests/SettingsLaunchPerformance.java b/tests/unit/src/com/android/settings/tests/SettingsLaunchPerformance.java
similarity index 100%
rename from tests/app/src/com/android/settings/tests/SettingsLaunchPerformance.java
rename to tests/unit/src/com/android/settings/tests/SettingsLaunchPerformance.java
diff --git a/tests/unit/src/com/android/settings/wifi/tether/WifiTetherSettingsTest.java b/tests/unit/src/com/android/settings/wifi/tether/WifiTetherSettingsTest.java
index 26a711b..b311816 100644
--- a/tests/unit/src/com/android/settings/wifi/tether/WifiTetherSettingsTest.java
+++ b/tests/unit/src/com/android/settings/wifi/tether/WifiTetherSettingsTest.java
@@ -66,15 +66,15 @@
@Test
public void launchTetherSettings_shouldHaveAllFields() {
launchWifiTetherActivity();
- onView(withText("Network name")).check(matches(isDisplayed()));
- onView(withText("Password")).check(matches(isDisplayed()));
- onView(withText("Select AP Band")).check(matches(isDisplayed()));
+ onView(withText("Hotspot name")).check(matches(isDisplayed()));
+ onView(withText("Hotspot password")).check(matches(isDisplayed()));
+ onView(withText("AP Band")).check(matches(isDisplayed()));
}
private void launchWifiTetherActivity() {
mInstrumentation.startActivitySync(mTetherActivityIntent);
- onView(withText("Portable Wi‑Fi hotspot")).perform();
- UiObject2 item = mDevice.wait(Until.findObject(By.text("Portable Wi‑Fi hotspot")), TIMEOUT);
+ onView(withText("Wi‑Fi hotspot")).perform();
+ UiObject2 item = mDevice.wait(Until.findObject(By.text("Wi‑Fi hotspot")), TIMEOUT);
item.click();
}
}