Merge "Import translations. DO NOT MERGE" into oc-dr1-dev
diff --git a/res/drawable/ic_apps_vd_theme_24.xml b/res/drawable/ic_local_movies.xml
similarity index 75%
copy from res/drawable/ic_apps_vd_theme_24.xml
copy to res/drawable/ic_local_movies.xml
index ba59e83..9997723 100644
--- a/res/drawable/ic_apps_vd_theme_24.xml
+++ b/res/drawable/ic_local_movies.xml
@@ -20,6 +20,6 @@
android:viewportHeight="24.0"
android:tint="?android:attr/colorControlNormal">
<path
- android:fillColor="@android:color/white"
- 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"/>
-</vector>
\ No newline at end of file
+ android:fillColor="#FF000000"
+ android:pathData="M18,3v2h-2V3H8v2H6V3H5C4.45,3 4,3.45 4,4v16c0,0.55 0.45,1 1,1h1v-2h2v2h8v-2h2v2h1c0.55,0 1,-0.45 1,-1V4c0,-0.55 -0.45,-1 -1,-1H18zM8,17H6v-2h2V17zM8,13H6v-2h2V13zM8,9H6V7h2V9zM18,17h-2v-2h2V17zM18,13h-2v-2h2V13zM18,9h-2V7h2V9z"/>
+</vector>
diff --git a/res/drawable/ic_apps_vd_theme_24.xml b/res/drawable/ic_media_stream.xml
similarity index 77%
rename from res/drawable/ic_apps_vd_theme_24.xml
rename to res/drawable/ic_media_stream.xml
index ba59e83..4eb78bc 100644
--- a/res/drawable/ic_apps_vd_theme_24.xml
+++ b/res/drawable/ic_media_stream.xml
@@ -20,6 +20,6 @@
android:viewportHeight="24.0"
android:tint="?android:attr/colorControlNormal">
<path
- android:fillColor="@android:color/white"
- 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"/>
-</vector>
\ No newline at end of file
+ android:fillColor="#FF000000"
+ android:pathData="M18,3h-5c-0.55,0 -1,0.45 -1,1v8.3a3.88,3.88 0,0 0,-2.9 -0.04c-1.79,0.67 -3.11,2.35 -3.1,4.26A4.483,4.483 0,0 0,10.5 21c2.5,0 4.5,-2.3 4.5,-4.5V6h3c0.55,0 1,-0.45 1,-1V4c0,-0.55 -0.45,-1 -1,-1z"/>
+</vector>
diff --git a/res/drawable/ic_music_note_vd_theme_24.xml b/res/drawable/ic_music_note_vd_theme_24.xml
deleted file mode 100644
index f31b023..0000000
--- a/res/drawable/ic_music_note_vd_theme_24.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<!--
- 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.
--->
-<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">
- <path
- android:fillColor="@android:color/white"
- android:pathData="M12,3v10.55c-0.59,-0.34 -1.27,-0.55 -2,-0.55 -2.21,0 -4,1.79 -4,4s1.79,4 4,4 4,-1.79 4,-4V7h4V3h-6z"/>
-</vector>
\ No newline at end of file
diff --git a/res/drawable/ic_apps_vd_theme_24.xml b/res/drawable/ic_photo_library.xml
similarity index 72%
copy from res/drawable/ic_apps_vd_theme_24.xml
copy to res/drawable/ic_photo_library.xml
index ba59e83..732a348 100644
--- a/res/drawable/ic_apps_vd_theme_24.xml
+++ b/res/drawable/ic_photo_library.xml
@@ -20,6 +20,6 @@
android:viewportHeight="24.0"
android:tint="?android:attr/colorControlNormal">
<path
- android:fillColor="@android:color/white"
- 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"/>
-</vector>
\ No newline at end of file
+ android:fillColor="#FF000000"
+ android:pathData="M22,16V4c0,-1.11 -0.9,-2 -2,-2H8C6.89,2 6,2.89 6,4v12c0,1.1 0.89,2 2,2h12C21.1,18 22,17.1 22,16zM11,12l2.03,2.71L16,11l4,5H8L11,12zM2,7v13c0,1.1 0.9,2 2,2h13c0.55,0 1,-0.45 1,-1v0c0,-0.55 -0.45,-1 -1,-1H4.5C4.22,20 4,19.78 4,19.5V7c0,-0.55 -0.45,-1 -1,-1h0C2.45,6 2,6.45 2,7z"/>
+</vector>
diff --git a/res/drawable/ic_photo_library_vd_theme_24.xml b/res/drawable/ic_photo_library_vd_theme_24.xml
deleted file mode 100644
index 3cd97fc..0000000
--- a/res/drawable/ic_photo_library_vd_theme_24.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<!--
- 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.
--->
-<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">
- <path
- android:fillColor="@android:color/white"
- android:pathData="M22,16L22,4c0,-1.1 -0.9,-2 -2,-2L8,2c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2zM11,12l2.03,2.71L16,11l4,5L8,16l3,-4zM2,6v14c0,1.1 0.9,2 2,2h14v-2L4,20L4,6L2,6z"/>
-</vector>
\ No newline at end of file
diff --git a/res/drawable/ic_settings_storage.xml b/res/drawable/ic_settings_storage.xml
index 9bf6a27..36dcc38 100644
--- a/res/drawable/ic_settings_storage.xml
+++ b/res/drawable/ic_settings_storage.xml
@@ -1,5 +1,5 @@
<!--
- Copyright (C) 2016 The Android Open Source Project
+ 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.
@@ -14,12 +14,12 @@
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="M2.0,20.0l20.0,0.0l0.0,-4.0L2.0,16.0l0.0,4.0zm2.0,-3.0l2.0,0.0l0.0,2.0L4.0,19.0l0.0,-2.0zM2.0,4.0l0.0,4.0l20.0,0.0L22.0,4.0L2.0,4.0zm4.0,3.0L4.0,7.0L4.0,5.0l2.0,0.0l0.0,2.0zm-4.0,7.0l20.0,0.0l0.0,-4.0L2.0,10.0l0.0,4.0zm2.0,-3.0l2.0,0.0l0.0,2.0L4.0,13.0l0.0,-2.0z"/>
+ android:fillColor="#FF000000"
+ android:pathData="M20,16L4,16c-1.1,0 -2,0.9 -2,2s0.9,2 2,2h16c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2zM5,19.1c-0.61,0 -1.1,-0.49 -1.1,-1.1 0,-0.61 0.49,-1.1 1.1,-1.1s1.1,0.49 1.1,1.1c0,0.61 -0.49,1.1 -1.1,1.1zM4,8h16c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2L4,4c-1.1,0 -2,0.9 -2,2s0.9,2 2,2zM5,4.9c0.61,0 1.1,0.49 1.1,1.1 0,0.61 -0.49,1.1 -1.1,1.1S3.9,6.61 3.9,6c0,-0.61 0.49,-1.1 1.1,-1.1zM20,10L4,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2h16c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2zM5,13.1c-0.61,0 -1.1,-0.49 -1.1,-1.1 0,-0.61 0.49,-1.1 1.1,-1.1s1.1,0.49 1.1,1.1c0,0.61 -0.49,1.1 -1.1,1.1z"/>
</vector>
diff --git a/res/drawable/ic_storage.xml b/res/drawable/ic_storage.xml
new file mode 100644
index 0000000..36dcc38
--- /dev/null
+++ b/res/drawable/ic_storage.xml
@@ -0,0 +1,25 @@
+<!--
+ 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.
+-->
+<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">
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M20,16L4,16c-1.1,0 -2,0.9 -2,2s0.9,2 2,2h16c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2zM5,19.1c-0.61,0 -1.1,-0.49 -1.1,-1.1 0,-0.61 0.49,-1.1 1.1,-1.1s1.1,0.49 1.1,1.1c0,0.61 -0.49,1.1 -1.1,1.1zM4,8h16c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2L4,4c-1.1,0 -2,0.9 -2,2s0.9,2 2,2zM5,4.9c0.61,0 1.1,0.49 1.1,1.1 0,0.61 -0.49,1.1 -1.1,1.1S3.9,6.61 3.9,6c0,-0.61 0.49,-1.1 1.1,-1.1zM20,10L4,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2h16c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2zM5,13.1c-0.61,0 -1.1,-0.49 -1.1,-1.1 0,-0.61 0.49,-1.1 1.1,-1.1s1.1,0.49 1.1,1.1c0,0.61 -0.49,1.1 -1.1,1.1z"/>
+</vector>
diff --git a/res/drawable/ic_storage_apps.xml b/res/drawable/ic_storage_apps.xml
new file mode 100644
index 0000000..7b86b89
--- /dev/null
+++ b/res/drawable/ic_storage_apps.xml
@@ -0,0 +1,25 @@
+<!--
+ 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.
+-->
+<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">
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M6,8c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM12,20c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM6,20c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM6,14c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM12,14c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM16,6c0,1.1 0.9,2 2,2s2,-0.9 2,-2 -0.9,-2 -2,-2 -2,0.9 -2,2zM12,8c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM18,14c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM18,20c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2z"/>
+</vector>
diff --git a/res/drawable/ic_theaters_vd_theme_24.xml b/res/drawable/ic_theaters_vd_theme_24.xml
deleted file mode 100644
index d0bad19..0000000
--- a/res/drawable/ic_theaters_vd_theme_24.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<!--
- 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.
--->
-<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">
- <path
- android:fillColor="@android:color/white"
- android:pathData="M18,3v2h-2L16,3L8,3v2L6,5L6,3L4,3v18h2v-2h2v2h8v-2h2v2h2L20,3h-2zM8,17L6,17v-2h2v2zM8,13L6,13v-2h2v2zM8,9L6,9L6,7h2v2zM18,17h-2v-2h2v2zM18,13h-2v-2h2v2zM18,9h-2L16,7h2v2z"/>
-</vector>
\ No newline at end of file
diff --git a/res/layout-land/confirm_lock_password.xml b/res/layout-land/confirm_lock_password.xml
index 0cc9339..218192c 100644
--- a/res/layout-land/confirm_lock_password.xml
+++ b/res/layout-land/confirm_lock_password.xml
@@ -76,7 +76,6 @@
android:inputType="textPassword"
android:imeOptions="actionNext|flagNoFullscreen|flagForceAscii"
android:gravity="center"
- android:textSize="16sp"
style="@style/TextAppearance.PasswordEntry"/>
<TextView style="@style/TextAppearance.ConfirmDeviceCredentialsErrorText"
diff --git a/res/layout/choose_lock_password.xml b/res/layout/choose_lock_password.xml
index 082d6c9..7ce3034 100644
--- a/res/layout/choose_lock_password.xml
+++ b/res/layout/choose_lock_password.xml
@@ -59,7 +59,6 @@
android:gravity="center"
android:inputType="textPassword"
android:imeOptions="actionNext|flagNoExtractUi|flagForceAscii"
- android:textSize="24sp"
style="@style/TextAppearance.PasswordEntry"/>
<android.support.v7.widget.RecyclerView
diff --git a/res/layout/condition_tile_new_ui.xml b/res/layout/condition_tile_new_ui.xml
index d8d2284..49bf0c0 100644
--- a/res/layout/condition_tile_new_ui.xml
+++ b/res/layout/condition_tile_new_ui.xml
@@ -24,15 +24,15 @@
<LinearLayout
android:layout_width="match_parent"
- android:layout_height="48dp"
+ android:layout_height="36dp"
android:background="?android:attr/selectableItemBackground"
- android:orientation="horizontal"
- android:gravity="center_vertical">
+ android:orientation="horizontal">
<ImageView
android:id="@android:id/icon"
android:layout_width="@dimen/dashboard_tile_image_size"
android:layout_height="@dimen/dashboard_tile_image_size"
+ android:layout_marginTop="12dp"
android:layout_marginStart="14dp"
android:layout_marginEnd="24dp"
android:tint="?android:attr/colorAccent" />
@@ -41,6 +41,7 @@
android:id="@android:id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
+ android:layout_marginTop="14dp"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="?android:attr/colorAccent" />
@@ -62,7 +63,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="62dp"
- android:paddingBottom="8dp"
+ android:paddingBottom="1dp"
style="?android:attr/buttonBarStyle"
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd">
diff --git a/res/layout/confirm_lock_password_base.xml b/res/layout/confirm_lock_password_base.xml
index 0c65e86..05e90d2 100644
--- a/res/layout/confirm_lock_password_base.xml
+++ b/res/layout/confirm_lock_password_base.xml
@@ -76,7 +76,6 @@
android:inputType="textPassword"
android:imeOptions="actionNext|flagNoFullscreen|flagForceAscii"
android:gravity="center"
- android:textSize="16sp"
style="@style/TextAppearance.PasswordEntry"/>
<TextView
diff --git a/res/layout/confirm_lock_password_internal.xml b/res/layout/confirm_lock_password_internal.xml
index 701ff57..558522c 100644
--- a/res/layout/confirm_lock_password_internal.xml
+++ b/res/layout/confirm_lock_password_internal.xml
@@ -54,7 +54,6 @@
android:inputType="textPassword"
android:imeOptions="actionNext|flagNoFullscreen|flagForceAscii"
android:gravity="center"
- android:textSize="16sp"
style="@style/TextAppearance.PasswordEntry"/>
<TextView
diff --git a/res/values/colors.xml b/res/values/colors.xml
index f63d963..7f4cb79 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -100,7 +100,7 @@
<color name="usage_graph_dots">#B0BEC5</color>
<!-- Gestures settings -->
- <color name="gestures_setting_background_color">#f5f5f5</color>
+ <color name="gestures_setting_background_color">#f4f4f4</color>
<color name="status_bar_color">#3c3c3c</color>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 398bdbd..e40850d 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -79,6 +79,7 @@
<item name="android:gravity">center</item>
<item name="android:singleLine">true</item>
<item name="android:textColor">?android:attr/textColorPrimary</item>
+ <item name="android:textSize">24sp</item>
</style>
<style name="TextAppearance.CryptKeeper_PasswordEntry" parent="android:TextAppearance.Material">
diff --git a/res/xml/storage_dashboard_fragment.xml b/res/xml/storage_dashboard_fragment.xml
index b31d0eb..54699d3 100644
--- a/res/xml/storage_dashboard_fragment.xml
+++ b/res/xml/storage_dashboard_fragment.xml
@@ -26,20 +26,20 @@
android:fragment="com.android.settings.deletionhelper.AutomaticStorageManagerSettings"
android:key="toggle_asm"
android:title="@string/automatic_storage_manager_preference_title"
- android:icon="@drawable/ic_settings_storage"
+ android:icon="@drawable/ic_storage"
android:order="1"
settings:allowDividerAbove="true"
settings:allowDividerBelow="true"/>
<com.android.settings.deviceinfo.StorageItemPreference
android:key="pref_photos_videos"
android:title="@string/storage_photos_videos"
- android:icon="@drawable/ic_photo_library_vd_theme_24"
+ android:icon="@drawable/ic_photo_library"
settings:allowDividerAbove="true"
android:order="2" />
<com.android.settings.deviceinfo.StorageItemPreference
android:key="pref_music_audio"
android:title="@string/storage_music_audio"
- android:icon="@drawable/ic_music_note_vd_theme_24"
+ android:icon="@drawable/ic_media_stream"
android:order="3" />
<com.android.settings.deviceinfo.StorageItemPreference
android:key="pref_games"
@@ -49,12 +49,12 @@
<com.android.settings.deviceinfo.StorageItemPreference
android:key="pref_movies"
android:title="@string/storage_movies_tv"
- android:icon="@drawable/ic_theaters_vd_theme_24"
+ android:icon="@drawable/ic_local_movies"
android:order="5" />
<com.android.settings.deviceinfo.StorageItemPreference
android:key="pref_other_apps"
android:title="@string/storage_other_apps"
- android:icon="@drawable/ic_apps_vd_theme_24"
+ android:icon="@drawable/ic_storage_apps"
android:order="6" />
<com.android.settings.deviceinfo.StorageItemPreference
android:key="pref_files"
diff --git a/res/xml/storage_profile_fragment.xml b/res/xml/storage_profile_fragment.xml
index be269e5..a12bdd5 100644
--- a/res/xml/storage_profile_fragment.xml
+++ b/res/xml/storage_profile_fragment.xml
@@ -21,12 +21,12 @@
<com.android.settings.deviceinfo.StorageItemPreference
android:key="pref_photos_videos"
android:title="@string/storage_photos_videos"
- android:icon="@drawable/ic_photo_library_vd_theme_24"
+ android:icon="@drawable/ic_photo_library"
android:order="2" />
<com.android.settings.deviceinfo.StorageItemPreference
android:key="pref_music_audio"
android:title="@string/storage_music_audio"
- android:icon="@drawable/ic_music_note_vd_theme_24"
+ android:icon="@drawable/ic_media_stream"
android:order="3" />
<com.android.settings.deviceinfo.StorageItemPreference
android:key="pref_games"
@@ -36,13 +36,13 @@
<com.android.settings.deviceinfo.StorageItemPreference
android:key="pref_movies"
android:title="@string/storage_movies_tv"
- android:icon="@drawable/ic_theaters_vd_theme_24"
+ android:icon="@drawable/ic_local_movies"
android:order="5"
/>
<com.android.settings.deviceinfo.StorageItemPreference
android:key="pref_other_apps"
android:title="@string/storage_other_apps"
- android:icon="@drawable/ic_apps_vd_theme_24"
+ android:icon="@drawable/ic_storage_apps"
android:order="6" />
<com.android.settings.deviceinfo.StorageItemPreference
android:key="pref_files"
diff --git a/src/com/android/settings/ApnEditor.java b/src/com/android/settings/ApnEditor.java
index c8f9dd1..ba160ab 100644
--- a/src/com/android/settings/ApnEditor.java
+++ b/src/com/android/settings/ApnEditor.java
@@ -52,6 +52,7 @@
import com.android.internal.telephony.PhoneConstants;
import com.android.internal.util.ArrayUtils;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
@@ -117,6 +118,7 @@
private String[] mReadOnlyApnTypes;
private String[] mReadOnlyApnFields;
private boolean mReadOnlyApn;
+ private String mUserEnteredApnType;
/**
* Standard projection for the interesting columns of a normal note.
@@ -212,6 +214,7 @@
mReadOnlyApn = false;
mReadOnlyApnTypes = null;
mReadOnlyApnFields = null;
+ mUserEnteredApnType = null;
CarrierConfigManager configManager = (CarrierConfigManager)
getSystemService(Context.CARRIER_CONFIG_SERVICE);
@@ -220,6 +223,11 @@
if (b != null) {
mReadOnlyApnTypes = b.getStringArray(
CarrierConfigManager.KEY_READ_ONLY_APN_TYPES_STRING_ARRAY);
+ if (!ArrayUtils.isEmpty(mReadOnlyApnTypes)) {
+ for (String apnType : mReadOnlyApnTypes) {
+ Log.d(TAG, "onCreate: read only APN type: " + apnType);
+ }
+ }
mReadOnlyApnFields = b.getStringArray(
CarrierConfigManager.KEY_READ_ONLY_APN_FIELDS_STRING_ARRAY);
}
@@ -951,7 +959,7 @@
callUpdate = setStringValueAndCheckIfDiff(values,
Telephony.Carriers.TYPE,
- checkNotSet(mApnType.getText()),
+ checkNotSet(getUserEnteredApnType()),
callUpdate,
TYPE_INDEX);
@@ -1057,10 +1065,11 @@
// if carrier does not allow editing certain apn types, make sure type does not include
// those
if (!ArrayUtils.isEmpty(mReadOnlyApnTypes)
- && apnTypesMatch(mReadOnlyApnTypes, mApnType.getText())) {
+ && apnTypesMatch(mReadOnlyApnTypes, getUserEnteredApnType())) {
StringBuilder stringBuilder = new StringBuilder();
for (String type : mReadOnlyApnTypes) {
stringBuilder.append(type).append(", ");
+ Log.d(TAG, "getErrorMsg: appending type: " + type);
}
// remove last ", "
if (stringBuilder.length() >= 2) {
@@ -1107,6 +1116,41 @@
}
}
+ private String getUserEnteredApnType() {
+ if (mUserEnteredApnType != null) {
+ return mUserEnteredApnType;
+ }
+
+ // if user has not specified a type, map it to "ALL APN TYPES THAT ARE NOT READ-ONLY"
+ mUserEnteredApnType = mApnType.getText();
+ if (mUserEnteredApnType != null) mUserEnteredApnType = mUserEnteredApnType.trim();
+ if ((TextUtils.isEmpty(mUserEnteredApnType)
+ || PhoneConstants.APN_TYPE_ALL.equals(mUserEnteredApnType))
+ && !ArrayUtils.isEmpty(mReadOnlyApnTypes)) {
+ StringBuilder editableApnTypes = new StringBuilder();
+ List<String> readOnlyApnTypes = Arrays.asList(mReadOnlyApnTypes);
+ boolean first = true;
+ for (String apnType : PhoneConstants.APN_TYPES) {
+ // add APN type if it is not read-only and is not wild-cardable
+ if (!readOnlyApnTypes.contains(apnType)
+ && !apnType.equals(PhoneConstants.APN_TYPE_IA)
+ && !apnType.equals(PhoneConstants.APN_TYPE_EMERGENCY)) {
+ if (first) {
+ first = false;
+ } else {
+ editableApnTypes.append(",");
+ }
+ editableApnTypes.append(apnType);
+ }
+ }
+ mUserEnteredApnType = editableApnTypes.toString();
+ Log.d(TAG, "getUserEnteredApnType: changed apn type to editable apn types: "
+ + mUserEnteredApnType);
+ }
+
+ return mUserEnteredApnType;
+ }
+
public static class ErrorDialog extends InstrumentedDialogFragment {
public static void showError(ApnEditor editor) {
diff --git a/src/com/android/settings/applications/MusicViewHolderController.java b/src/com/android/settings/applications/MusicViewHolderController.java
index 61a011d..af822a0 100644
--- a/src/com/android/settings/applications/MusicViewHolderController.java
+++ b/src/com/android/settings/applications/MusicViewHolderController.java
@@ -19,6 +19,7 @@
import android.app.Fragment;
import android.content.Context;
import android.content.Intent;
+import android.graphics.drawable.InsetDrawable;
import android.os.UserHandle;
import android.provider.DocumentsContract;
import android.support.annotation.WorkerThread;
@@ -38,6 +39,7 @@
private static final String TAG = "MusicViewHolderController";
private static final String AUTHORITY_MEDIA = "com.android.providers.media.documents";
+ private static final int INSET_SIZE = 24; // dp
private Context mContext;
private StorageStatsSource mSource;
@@ -71,7 +73,8 @@
@Override
public void setupView(AppViewHolder holder) {
- holder.appIcon.setImageDrawable(mContext.getDrawable(R.drawable.ic_headset_24dp));
+ holder.appIcon.setImageDrawable(
+ new InsetDrawable(mContext.getDrawable(R.drawable.ic_headset_24dp), INSET_SIZE));
holder.appName.setText(mContext.getText(R.string.audio_files_title));
holder.summary.setText(Formatter.formatFileSize(mContext, mMusicSize));
}
diff --git a/src/com/android/settings/bluetooth/BluetoothDetailsButtonsController.java b/src/com/android/settings/bluetooth/BluetoothDetailsButtonsController.java
index 41cd28d..bbc8d81 100644
--- a/src/com/android/settings/bluetooth/BluetoothDetailsButtonsController.java
+++ b/src/com/android/settings/bluetooth/BluetoothDetailsButtonsController.java
@@ -43,14 +43,19 @@
mIsConnected = device.isConnected();
}
+ private void onForgetButtonPressed() {
+ ForgetDeviceDialogFragment fragment =
+ ForgetDeviceDialogFragment.newInstance(mCachedDevice.getAddress());
+ fragment.show(mFragment.getFragmentManager(), ForgetDeviceDialogFragment.TAG);
+ }
+
@Override
protected void init(PreferenceScreen screen) {
mActionButtons = (LayoutPreference) screen.findPreference(getPreferenceKey());
Button rightButton = (Button) mActionButtons.findViewById(R.id.right_button);
rightButton.setText(R.string.forget);
rightButton.setOnClickListener((view) -> {
- mCachedDevice.unpair();
- mFragment.getActivity().finish();
+ onForgetButtonPressed();
});
}
diff --git a/src/com/android/settings/bluetooth/ForgetDeviceDialogFragment.java b/src/com/android/settings/bluetooth/ForgetDeviceDialogFragment.java
new file mode 100644
index 0000000..1f3a689
--- /dev/null
+++ b/src/com/android/settings/bluetooth/ForgetDeviceDialogFragment.java
@@ -0,0 +1,84 @@
+/*
+ * 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.bluetooth;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.bluetooth.BluetoothDevice;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.os.Bundle;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.logging.nano.MetricsProto;
+import com.android.settings.R;
+import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
+
+/** Implements an AlertDialog for confirming that a user wishes to unpair or "forget" a paired
+ * device*/
+public class ForgetDeviceDialogFragment extends InstrumentedDialogFragment {
+ public static final String TAG = "ForgetBluetoothDevice";
+ private static final String KEY_DEVICE_ADDRESS = "device_address";
+
+ private CachedBluetoothDevice mDevice;
+
+ public static ForgetDeviceDialogFragment newInstance(String deviceAddress) {
+ Bundle args = new Bundle(1);
+ args.putString(KEY_DEVICE_ADDRESS, deviceAddress);
+ ForgetDeviceDialogFragment dialog = new ForgetDeviceDialogFragment();
+ dialog.setArguments(args);
+ return dialog;
+ }
+
+ @VisibleForTesting
+ CachedBluetoothDevice getDevice(Context context) {
+ String deviceAddress = getArguments().getString(KEY_DEVICE_ADDRESS);
+ LocalBluetoothManager manager = Utils.getLocalBtManager(context);
+ BluetoothDevice device = manager.getBluetoothAdapter().getRemoteDevice(deviceAddress);
+ return manager.getCachedDeviceManager().findDevice(device);
+ }
+
+ @Override
+ public int getMetricsCategory() {
+ return MetricsProto.MetricsEvent.DIALOG_BLUETOOTH_PAIRED_DEVICE_FORGET;
+ }
+
+ @Override
+ public Dialog onCreateDialog(Bundle inState) {
+ DialogInterface.OnClickListener onConfirm = (dialog, which) -> {
+ mDevice.unpair();
+ Activity activity = getActivity();
+ if (activity != null) {
+ activity.finish();
+ }
+ };
+ Context context = getContext();
+ mDevice = getDevice(context);
+ AlertDialog dialog = new AlertDialog.Builder(context)
+ .setPositiveButton(R.string.bluetooth_unpair_dialog_forget_confirm_button,
+ onConfirm)
+ .setNegativeButton(android.R.string.cancel, null)
+ .create();
+ dialog.setTitle(R.string.bluetooth_unpair_dialog_title);
+ dialog.setMessage(context.getString(R.string.bluetooth_unpair_dialog_body,
+ mDevice.getName()));
+ return dialog;
+ }
+}
diff --git a/src/com/android/settings/fuelgauge/BatteryStatsHelperLoader.java b/src/com/android/settings/fuelgauge/BatteryStatsHelperLoader.java
index b99519b..bc166c3 100644
--- a/src/com/android/settings/fuelgauge/BatteryStatsHelperLoader.java
+++ b/src/com/android/settings/fuelgauge/BatteryStatsHelperLoader.java
@@ -41,9 +41,12 @@
@Override
public BatteryStatsHelper loadInBackground() {
- final BatteryStatsHelper statsHelper = new BatteryStatsHelper(getContext(), true);
+ Context context = getContext();
+ final BatteryStatsHelper statsHelper = new BatteryStatsHelper(context,
+ true /* collectBatteryBroadcast */);
- initBatteryStatsHelper(statsHelper);
+ BatteryUtils.getInstance(context).initBatteryStatsHelper(statsHelper, mBundle,
+ mUserManager);
return statsHelper;
}
@@ -52,9 +55,5 @@
}
- @VisibleForTesting
- void initBatteryStatsHelper(BatteryStatsHelper statsHelper) {
- statsHelper.create(mBundle);
- statsHelper.refreshStats(BatteryStats.STATS_SINCE_CHARGED, mUserManager.getUserProfiles());
- }
+
}
diff --git a/src/com/android/settings/fuelgauge/BatteryUtils.java b/src/com/android/settings/fuelgauge/BatteryUtils.java
index 48da886..e98ed82 100644
--- a/src/com/android/settings/fuelgauge/BatteryUtils.java
+++ b/src/com/android/settings/fuelgauge/BatteryUtils.java
@@ -15,10 +15,15 @@
*/
package com.android.settings.fuelgauge;
+import android.app.AppOpsManager;
import android.content.Context;
+import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.os.BatteryStats;
+import android.os.Bundle;
+import android.os.Build;
import android.os.SystemClock;
+import android.os.UserManager;
import android.support.annotation.IntDef;
import android.support.annotation.Nullable;
import android.support.annotation.StringRes;
@@ -45,6 +50,7 @@
*/
public class BatteryUtils {
public static final int UID_NULL = -1;
+ public static final int SDK_NULL = -1;
@Retention(RetentionPolicy.SOURCE)
@IntDef({StatusType.FOREGROUND,
@@ -64,6 +70,7 @@
private static BatteryUtils sInstance;
private PackageManager mPackageManager;
+ private AppOpsManager mAppOpsManager;
@VisibleForTesting
PowerUsageFeatureProvider mPowerUsageFeatureProvider;
@@ -77,6 +84,7 @@
@VisibleForTesting
BatteryUtils(Context context) {
mPackageManager = context.getPackageManager();
+ mAppOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
mPowerUsageFeatureProvider = FeatureFactory.getFactory(
context).getPowerUsageFeatureProvider(context);
}
@@ -262,6 +270,37 @@
}
/**
+ * Find the targetSdkVersion for package with name {@code packageName}
+ *
+ * @return the targetSdkVersion, or {@link #SDK_NULL} if {@code packageName} doesn't exist
+ */
+ public int getTargetSdkVersion(final String packageName) {
+ try {
+ ApplicationInfo info = mPackageManager.getApplicationInfo(packageName,
+ PackageManager.GET_META_DATA);
+
+ return info.targetSdkVersion;
+ } catch (PackageManager.NameNotFoundException e) {
+ Log.e(TAG, "Cannot find package: " + packageName, e);
+ }
+
+ return SDK_NULL;
+ }
+
+ /**
+ * Check whether background restriction is enabled
+ */
+ public boolean isBackgroundRestrictionEnabled(final int targetSdkVersion, final int uid,
+ final String packageName) {
+ if (targetSdkVersion >= Build.VERSION_CODES.O) {
+ return true;
+ }
+ final int mode = mAppOpsManager
+ .checkOpNoThrow(AppOpsManager.OP_RUN_IN_BACKGROUND, uid, packageName);
+ return mode == AppOpsManager.MODE_IGNORED || mode == AppOpsManager.MODE_ERRORED;
+ }
+
+ /**
* Sort the {@code usageList} based on {@link BatterySipper#totalPowerMah}
*/
public void sortUsageList(List<BatterySipper> usageList) {
@@ -328,8 +367,14 @@
return timeMs * 1000;
}
+ public void initBatteryStatsHelper(BatteryStatsHelper statsHelper, Bundle bundle,
+ UserManager userManager) {
+ statsHelper.create(bundle);
+ statsHelper.refreshStats(BatteryStats.STATS_SINCE_CHARGED, userManager.getUserProfiles());
+ }
+
private boolean isDataCorrupted() {
- return mPackageManager == null;
+ return mPackageManager == null || mAppOpsManager == null;
}
@VisibleForTesting
diff --git a/src/com/android/settings/fuelgauge/anomaly/Anomaly.java b/src/com/android/settings/fuelgauge/anomaly/Anomaly.java
index 2a4282a..dba964f 100644
--- a/src/com/android/settings/fuelgauge/anomaly/Anomaly.java
+++ b/src/com/android/settings/fuelgauge/anomaly/Anomaly.java
@@ -46,16 +46,18 @@
@Retention(RetentionPolicy.SOURCE)
@IntDef({AnomalyActionType.FORCE_STOP,
AnomalyActionType.BACKGROUND_CHECK,
- AnomalyActionType.LOCATION_CHECK})
+ AnomalyActionType.LOCATION_CHECK,
+ AnomalyActionType.STOP_AND_BACKGROUND_CHECK})
public @interface AnomalyActionType {
int FORCE_STOP = 0;
int BACKGROUND_CHECK = 1;
int LOCATION_CHECK = 2;
+ int STOP_AND_BACKGROUND_CHECK = 3;
}
@AnomalyType
- public static final int[] ANOMALY_TYPE_LIST =
- {AnomalyType.WAKE_LOCK,
+ public static final int[] ANOMALY_TYPE_LIST = {
+ AnomalyType.WAKE_LOCK,
AnomalyType.WAKEUP_ALARM,
AnomalyType.BLUETOOTH_SCAN};
@@ -64,8 +66,15 @@
*/
public final int type;
public final int uid;
+ public final int targetSdkVersion;
public final long wakelockTimeMs;
/**
+ * {@code true} if background restriction is enabled
+ *
+ * @see android.app.AppOpsManager.OP_RUN_IN_BACKGROUND
+ */
+ public final boolean backgroundRestrictionEnabled;
+ /**
* Display name of this anomaly, usually it is the app name
*/
public final CharSequence displayName;
@@ -77,6 +86,8 @@
displayName = builder.mDisplayName;
packageName = builder.mPackageName;
wakelockTimeMs = builder.mWakeLockTimeMs;
+ targetSdkVersion = builder.mTargetSdkVersion;
+ backgroundRestrictionEnabled = builder.mBgRestrictionEnabled;
}
private Anomaly(Parcel in) {
@@ -85,6 +96,8 @@
displayName = in.readCharSequence();
packageName = in.readString();
wakelockTimeMs = in.readLong();
+ targetSdkVersion = in.readInt();
+ backgroundRestrictionEnabled = in.readBoolean();
}
@Override
@@ -99,6 +112,8 @@
dest.writeCharSequence(displayName);
dest.writeString(packageName);
dest.writeLong(wakelockTimeMs);
+ dest.writeInt(targetSdkVersion);
+ dest.writeBoolean(backgroundRestrictionEnabled);
}
@Override
@@ -115,12 +130,15 @@
&& uid == other.uid
&& wakelockTimeMs == other.wakelockTimeMs
&& TextUtils.equals(displayName, other.displayName)
- && TextUtils.equals(packageName, other.packageName);
+ && TextUtils.equals(packageName, other.packageName)
+ && targetSdkVersion == other.targetSdkVersion
+ && backgroundRestrictionEnabled == other.backgroundRestrictionEnabled;
}
@Override
public int hashCode() {
- return Objects.hash(type, uid, displayName, packageName, wakelockTimeMs);
+ return Objects.hash(type, uid, displayName, packageName, wakelockTimeMs, targetSdkVersion,
+ backgroundRestrictionEnabled);
}
public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
@@ -137,9 +155,11 @@
@AnomalyType
private int mType;
private int mUid;
+ private int mTargetSdkVersion;
private CharSequence mDisplayName;
private String mPackageName;
private long mWakeLockTimeMs;
+ private boolean mBgRestrictionEnabled;
public Builder setType(@AnomalyType int type) {
mType = type;
@@ -166,6 +186,16 @@
return this;
}
+ public Builder setTargetSdkVersion(int targetSdkVersion) {
+ mTargetSdkVersion = targetSdkVersion;
+ return this;
+ }
+
+ public Builder setBackgroundRestrictionEnabled(boolean bgRestrictionEnabled) {
+ mBgRestrictionEnabled = bgRestrictionEnabled;
+ return this;
+ }
+
public Anomaly build() {
return new Anomaly(this);
}
diff --git a/src/com/android/settings/fuelgauge/anomaly/AnomalyDialogFragment.java b/src/com/android/settings/fuelgauge/anomaly/AnomalyDialogFragment.java
index 452cc35..69d03b9 100644
--- a/src/com/android/settings/fuelgauge/anomaly/AnomalyDialogFragment.java
+++ b/src/com/android/settings/fuelgauge/anomaly/AnomalyDialogFragment.java
@@ -90,7 +90,7 @@
return;
}
- final AnomalyAction anomalyAction = mAnomalyUtils.getAnomalyAction(mAnomaly.type);
+ final AnomalyAction anomalyAction = mAnomalyUtils.getAnomalyAction(mAnomaly);
final int metricsKey = getArguments().getInt(ARG_METRICS_KEY);
anomalyAction.handlePositiveAction(mAnomaly, metricsKey);
@@ -103,16 +103,18 @@
mAnomaly = bundle.getParcelable(ARG_ANOMALY);
final Context context = getContext();
- final AnomalyAction anomalyAction = mAnomalyUtils.getAnomalyAction(mAnomaly.type);
+ final AnomalyAction anomalyAction = mAnomalyUtils.getAnomalyAction(mAnomaly);
switch (anomalyAction.getActionType()) {
case Anomaly.AnomalyActionType.FORCE_STOP:
return new AlertDialog.Builder(context)
.setTitle(R.string.dialog_stop_title)
- .setMessage(getString(R.string.dialog_stop_message, mAnomaly.displayName))
+ .setMessage(getString(mAnomaly.type == Anomaly.AnomalyType.WAKE_LOCK
+ ? R.string.dialog_stop_message
+ : R.string.dialog_stop_message_wakeup_alarm, mAnomaly.displayName))
.setPositiveButton(R.string.dialog_stop_ok, this)
.setNegativeButton(R.string.dlg_cancel, null)
.create();
- case Anomaly.AnomalyActionType.BACKGROUND_CHECK:
+ case Anomaly.AnomalyActionType.STOP_AND_BACKGROUND_CHECK:
return new AlertDialog.Builder(context)
.setTitle(R.string.dialog_background_check_title)
.setMessage(getString(R.string.dialog_background_check_message,
diff --git a/src/com/android/settings/fuelgauge/anomaly/AnomalyUtils.java b/src/com/android/settings/fuelgauge/anomaly/AnomalyUtils.java
index 9d0e1d0..8ac9e6f 100644
--- a/src/com/android/settings/fuelgauge/anomaly/AnomalyUtils.java
+++ b/src/com/android/settings/fuelgauge/anomaly/AnomalyUtils.java
@@ -17,12 +17,13 @@
package com.android.settings.fuelgauge.anomaly;
import android.content.Context;
+import android.os.Build;
import android.support.annotation.VisibleForTesting;
import com.android.settings.fuelgauge.anomaly.action.AnomalyAction;
-import com.android.settings.fuelgauge.anomaly.action.BackgroundCheckAction;
import com.android.settings.fuelgauge.anomaly.action.ForceStopAction;
import com.android.settings.fuelgauge.anomaly.action.LocationCheckAction;
+import com.android.settings.fuelgauge.anomaly.action.StopAndBackgroundCheckAction;
import com.android.settings.fuelgauge.anomaly.checker.AnomalyDetector;
import com.android.settings.fuelgauge.anomaly.checker.BluetoothScanAnomalyDetector;
import com.android.settings.fuelgauge.anomaly.checker.WakeLockAnomalyDetector;
@@ -49,16 +50,22 @@
/**
* Return the corresponding {@link AnomalyAction} according to
- * {@link com.android.settings.fuelgauge.anomaly.Anomaly.AnomalyType}
+ * {@link com.android.settings.fuelgauge.anomaly.Anomaly}
*
* @return corresponding {@link AnomalyAction}, or null if cannot find it.
*/
- public AnomalyAction getAnomalyAction(@Anomaly.AnomalyType int anomalyType) {
- switch (anomalyType) {
+ public AnomalyAction getAnomalyAction(Anomaly anomaly) {
+ switch (anomaly.type) {
case Anomaly.AnomalyType.WAKE_LOCK:
return new ForceStopAction(mContext);
case Anomaly.AnomalyType.WAKEUP_ALARM:
- return new BackgroundCheckAction(mContext);
+ if (anomaly.targetSdkVersion >= Build.VERSION_CODES.O
+ || (anomaly.targetSdkVersion < Build.VERSION_CODES.O
+ && anomaly.backgroundRestrictionEnabled)) {
+ return new ForceStopAction(mContext);
+ } else {
+ return new StopAndBackgroundCheckAction(mContext);
+ }
case Anomaly.AnomalyType.BLUETOOTH_SCAN:
return new LocationCheckAction(mContext);
default:
diff --git a/src/com/android/settings/fuelgauge/anomaly/action/BackgroundCheckAction.java b/src/com/android/settings/fuelgauge/anomaly/action/BackgroundCheckAction.java
index 799bddc..5526cc9 100644
--- a/src/com/android/settings/fuelgauge/anomaly/action/BackgroundCheckAction.java
+++ b/src/com/android/settings/fuelgauge/anomaly/action/BackgroundCheckAction.java
@@ -18,8 +18,11 @@
import android.app.AppOpsManager;
import android.content.Context;
+import android.os.Build;
+import android.support.annotation.VisibleForTesting;
import com.android.internal.logging.nano.MetricsProto;
+import com.android.settings.fuelgauge.BatteryUtils;
import com.android.settings.fuelgauge.anomaly.Anomaly;
/**
@@ -28,6 +31,8 @@
public class BackgroundCheckAction extends AnomalyAction {
private AppOpsManager mAppOpsManager;
+ @VisibleForTesting
+ BatteryUtils mBatteryUtils;
public BackgroundCheckAction(Context context) {
super(context);
@@ -38,17 +43,17 @@
@Override
public void handlePositiveAction(Anomaly anomaly, int contextMetricsKey) {
super.handlePositiveAction(anomaly, contextMetricsKey);
-
- mAppOpsManager.setMode(AppOpsManager.OP_RUN_IN_BACKGROUND, anomaly.uid, anomaly.packageName,
- AppOpsManager.MODE_IGNORED);
+ if (anomaly.targetSdkVersion < Build.VERSION_CODES.O) {
+ mAppOpsManager.setMode(AppOpsManager.OP_RUN_IN_BACKGROUND, anomaly.uid,
+ anomaly.packageName,
+ AppOpsManager.MODE_IGNORED);
+ }
}
@Override
public boolean isActionActive(Anomaly anomaly) {
- final int mode = mAppOpsManager
- .checkOpNoThrow(AppOpsManager.OP_RUN_IN_BACKGROUND, anomaly.uid,
- anomaly.packageName);
- return mode != AppOpsManager.MODE_IGNORED && mode != AppOpsManager.MODE_ERRORED;
+ return !mBatteryUtils.isBackgroundRestrictionEnabled(anomaly.targetSdkVersion, anomaly.uid,
+ anomaly.packageName);
}
@Override
diff --git a/src/com/android/settings/fuelgauge/anomaly/action/StopAndBackgroundCheckAction.java b/src/com/android/settings/fuelgauge/anomaly/action/StopAndBackgroundCheckAction.java
new file mode 100644
index 0000000..dba221a
--- /dev/null
+++ b/src/com/android/settings/fuelgauge/anomaly/action/StopAndBackgroundCheckAction.java
@@ -0,0 +1,63 @@
+/*
+ * 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.fuelgauge.anomaly.action;
+
+import android.content.Context;
+import android.support.annotation.VisibleForTesting;
+
+import com.android.settings.fuelgauge.anomaly.Anomaly;
+
+/**
+ * Force stop and background check action for anomaly app, this action will
+ * 1. Force stop the app
+ * 2. Turn on background check
+ */
+public class StopAndBackgroundCheckAction extends AnomalyAction {
+ @VisibleForTesting
+ ForceStopAction mForceStopAction;
+ @VisibleForTesting
+ BackgroundCheckAction mBackgroundCheckAction;
+
+ public StopAndBackgroundCheckAction(Context context) {
+ this(context, new ForceStopAction(context), new BackgroundCheckAction(context));
+ }
+
+ @VisibleForTesting
+ StopAndBackgroundCheckAction(Context context, ForceStopAction forceStopAction,
+ BackgroundCheckAction backgroundCheckAction) {
+ super(context);
+ mForceStopAction = forceStopAction;
+ mBackgroundCheckAction = backgroundCheckAction;
+ }
+
+ @Override
+ public void handlePositiveAction(Anomaly anomaly, int metricsKey) {
+ mForceStopAction.handlePositiveAction(anomaly, metricsKey);
+ mBackgroundCheckAction.handlePositiveAction(anomaly, metricsKey);
+ }
+
+ @Override
+ public boolean isActionActive(Anomaly anomaly) {
+ return mForceStopAction.isActionActive(anomaly)
+ && mBackgroundCheckAction.isActionActive(anomaly);
+ }
+
+ @Override
+ public int getActionType() {
+ return Anomaly.AnomalyActionType.STOP_AND_BACKGROUND_CHECK;
+ }
+}
diff --git a/src/com/android/settings/fuelgauge/anomaly/checker/BluetoothScanAnomalyDetector.java b/src/com/android/settings/fuelgauge/anomaly/checker/BluetoothScanAnomalyDetector.java
index 4281743..f66c61c 100644
--- a/src/com/android/settings/fuelgauge/anomaly/checker/BluetoothScanAnomalyDetector.java
+++ b/src/com/android/settings/fuelgauge/anomaly/checker/BluetoothScanAnomalyDetector.java
@@ -42,24 +42,21 @@
private static final String TAG = "BluetoothScanAnomalyDetector";
@VisibleForTesting
BatteryUtils mBatteryUtils;
- @VisibleForTesting
- AnomalyAction mAnomalyAction;
private long mBluetoothScanningThreshold;
private Context mContext;
+ private AnomalyUtils mAnomalyUtils;
public BluetoothScanAnomalyDetector(Context context) {
- this(context, new AnomalyDetectionPolicy(context),
- AnomalyUtils.getInstance(context).getAnomalyAction(
- Anomaly.AnomalyType.BLUETOOTH_SCAN));
+ this(context, new AnomalyDetectionPolicy(context), AnomalyUtils.getInstance(context));
}
@VisibleForTesting
BluetoothScanAnomalyDetector(Context context, AnomalyDetectionPolicy policy,
- AnomalyAction anomalyAction) {
+ AnomalyUtils anomalyUtils) {
mContext = context;
mBatteryUtils = BatteryUtils.getInstance(context);
- mAnomalyAction = anomalyAction;
mBluetoothScanningThreshold = policy.bluetoothScanThreshold;
+ mAnomalyUtils = anomalyUtils;
}
@Override
@@ -98,7 +95,7 @@
.setPackageName(packageName)
.build();
- if (mAnomalyAction.isActionActive(anomaly)) {
+ if (mAnomalyUtils.getAnomalyAction(anomaly).isActionActive(anomaly)) {
anomalies.add(anomaly);
}
}
diff --git a/src/com/android/settings/fuelgauge/anomaly/checker/WakeLockAnomalyDetector.java b/src/com/android/settings/fuelgauge/anomaly/checker/WakeLockAnomalyDetector.java
index 5fa0e41..959ceb5 100644
--- a/src/com/android/settings/fuelgauge/anomaly/checker/WakeLockAnomalyDetector.java
+++ b/src/com/android/settings/fuelgauge/anomaly/checker/WakeLockAnomalyDetector.java
@@ -29,7 +29,6 @@
import com.android.settings.fuelgauge.anomaly.Anomaly;
import com.android.settings.fuelgauge.anomaly.AnomalyDetectionPolicy;
import com.android.settings.fuelgauge.anomaly.AnomalyUtils;
-import com.android.settings.fuelgauge.anomaly.action.AnomalyAction;
import java.util.ArrayList;
import java.util.List;
@@ -39,27 +38,25 @@
*/
public class WakeLockAnomalyDetector implements AnomalyDetector {
private static final String TAG = "WakeLockAnomalyChecker";
- private PackageManager mPackageManager;
- private Context mContext;
@VisibleForTesting
BatteryUtils mBatteryUtils;
@VisibleForTesting
long mWakeLockThresholdMs;
- @VisibleForTesting
- AnomalyAction mAnomalyAction;
+ private PackageManager mPackageManager;
+ private Context mContext;
+ private AnomalyUtils mAnomalyUtils;
public WakeLockAnomalyDetector(Context context) {
- this(context, new AnomalyDetectionPolicy(context));
+ this(context, new AnomalyDetectionPolicy(context), AnomalyUtils.getInstance(context));
}
@VisibleForTesting
- WakeLockAnomalyDetector(Context context, AnomalyDetectionPolicy policy) {
+ WakeLockAnomalyDetector(Context context, AnomalyDetectionPolicy policy,
+ AnomalyUtils anomalyUtils) {
mContext = context;
mPackageManager = context.getPackageManager();
mBatteryUtils = BatteryUtils.getInstance(context);
- mAnomalyAction = AnomalyUtils.getInstance(context).getAnomalyAction(
- Anomaly.AnomalyType.WAKE_LOCK);
-
+ mAnomalyUtils = anomalyUtils;
mWakeLockThresholdMs = policy.wakeLockThreshold;
}
@@ -94,15 +91,20 @@
final String packageName = mBatteryUtils.getPackageName(uid.getUid());
final CharSequence displayName = Utils.getApplicationLabel(mContext,
packageName);
+ final int targetSdkVersion = mBatteryUtils.getTargetSdkVersion(packageName);
Anomaly anomaly = new Anomaly.Builder()
.setUid(uid.getUid())
.setType(Anomaly.AnomalyType.WAKE_LOCK)
.setDisplayName(displayName)
.setPackageName(packageName)
+ .setTargetSdkVersion(targetSdkVersion)
+ .setBackgroundRestrictionEnabled(
+ mBatteryUtils.isBackgroundRestrictionEnabled(targetSdkVersion,
+ uid.getUid(), packageName))
.build();
- if (mAnomalyAction.isActionActive(anomaly)) {
+ if (mAnomalyUtils.getAnomalyAction(anomaly).isActionActive(anomaly)) {
anomalies.add(anomaly);
}
}
diff --git a/src/com/android/settings/fuelgauge/anomaly/checker/WakeupAlarmAnomalyDetector.java b/src/com/android/settings/fuelgauge/anomaly/checker/WakeupAlarmAnomalyDetector.java
index 55686e0..f6ff7aa 100644
--- a/src/com/android/settings/fuelgauge/anomaly/checker/WakeupAlarmAnomalyDetector.java
+++ b/src/com/android/settings/fuelgauge/anomaly/checker/WakeupAlarmAnomalyDetector.java
@@ -41,21 +41,20 @@
private static final String TAG = "WakeupAlarmAnomalyDetector";
@VisibleForTesting
BatteryUtils mBatteryUtils;
- @VisibleForTesting
- AnomalyAction mAnomalyAction;
private long mWakeupAlarmThreshold;
private Context mContext;
+ private AnomalyUtils mAnomalyUtils;
public WakeupAlarmAnomalyDetector(Context context) {
- this(context, new AnomalyDetectionPolicy(context));
+ this(context, new AnomalyDetectionPolicy(context), AnomalyUtils.getInstance(context));
}
@VisibleForTesting
- WakeupAlarmAnomalyDetector(Context context, AnomalyDetectionPolicy policy) {
+ WakeupAlarmAnomalyDetector(Context context, AnomalyDetectionPolicy policy,
+ AnomalyUtils anomalyUtils) {
mContext = context;
mBatteryUtils = BatteryUtils.getInstance(context);
- mAnomalyAction = AnomalyUtils.getInstance(context).getAnomalyAction(
- Anomaly.AnomalyType.WAKEUP_ALARM);
+ mAnomalyUtils = anomalyUtils;
mWakeupAlarmThreshold = policy.wakeupAlarmThreshold;
}
@@ -98,7 +97,7 @@
.setPackageName(packageName)
.build();
- if (mAnomalyAction.isActionActive(anomaly)) {
+ if (mAnomalyUtils.getAnomalyAction(anomaly).isActionActive(anomaly)) {
anomalies.add(anomaly);
}
}
diff --git a/src/com/android/settings/gestures/AssistGesturePreferenceController.java b/src/com/android/settings/gestures/AssistGesturePreferenceController.java
index ede20c2..a3d4ec1 100644
--- a/src/com/android/settings/gestures/AssistGesturePreferenceController.java
+++ b/src/com/android/settings/gestures/AssistGesturePreferenceController.java
@@ -65,9 +65,12 @@
public void displayPreference(PreferenceScreen screen) {
mScreen = screen;
mPreference = screen.findPreference(getPreferenceKey());
+ if (!mFeatureProvider.isSensorAvailable(mContext)) {
+ removePreference(mScreen, getPreferenceKey());
+ return;
+ }
if (!mFeatureProvider.isSupported(mContext)) {
mScreen.removePreference(mPreference);
- removePreference(mScreen, getPreferenceKey());
return;
}
// Call super last or AbstractPreferenceController might remove the preference from the
diff --git a/src/com/android/settings/password/ChooseLockPassword.java b/src/com/android/settings/password/ChooseLockPassword.java
index b646360..0f50375 100644
--- a/src/com/android/settings/password/ChooseLockPassword.java
+++ b/src/com/android/settings/password/ChooseLockPassword.java
@@ -30,6 +30,7 @@
import android.content.Intent;
import android.content.res.Resources.Theme;
import android.graphics.Insets;
+import android.graphics.Typeface;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
@@ -204,7 +205,7 @@
private Stage mUiStage = Stage.Introduction;
private PasswordRequirementAdapter mPasswordRequirementAdapter;
private GlifLayout mLayout;
- private boolean mForFingerprint;
+ protected boolean mForFingerprint;
private String mFirstPin;
private RecyclerView mPasswordRestrictionView;
@@ -375,6 +376,10 @@
int currentType = mPasswordEntry.getInputType();
mPasswordEntry.setInputType(mIsAlphaMode ? currentType
: (InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_PASSWORD));
+ // Can't set via XML since setInputType resets the fontFamily to null
+ mPasswordEntry.setTypeface(Typeface.create(
+ getContext().getString(com.android.internal.R.string.config_headlineFontFamily),
+ Typeface.NORMAL));
Intent intent = getActivity().getIntent();
final boolean confirmCredentials = intent.getBooleanExtra(
diff --git a/src/com/android/settings/password/ConfirmLockPassword.java b/src/com/android/settings/password/ConfirmLockPassword.java
index f48ec96..853ab36 100644
--- a/src/com/android/settings/password/ConfirmLockPassword.java
+++ b/src/com/android/settings/password/ConfirmLockPassword.java
@@ -20,6 +20,7 @@
import android.app.admin.DevicePolicyManager;
import android.content.Context;
import android.content.Intent;
+import android.graphics.Typeface;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.CountDownTimer;
@@ -172,6 +173,10 @@
int currentType = mPasswordEntry.getInputType();
mPasswordEntry.setInputType(mIsAlpha ? currentType
: (InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_PASSWORD));
+ // Can't set via XML since setInputType resets the fontFamily to null
+ mPasswordEntry.setTypeface(Typeface.create(
+ getContext().getString(com.android.internal.R.string.config_headlineFontFamily),
+ Typeface.NORMAL));
mAppearAnimationUtils = new AppearAnimationUtils(getContext(),
220, 2f /* translationScale */, 1f /* delayScale*/,
AnimationUtils.loadInterpolator(getContext(),
diff --git a/src/com/android/settings/password/SetupChooseLockPassword.java b/src/com/android/settings/password/SetupChooseLockPassword.java
index f23ab6d..8a7028e 100644
--- a/src/com/android/settings/password/SetupChooseLockPassword.java
+++ b/src/com/android/settings/password/SetupChooseLockPassword.java
@@ -77,7 +77,11 @@
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
- mCancelButton.setText(R.string.skip_label);
+ if (mForFingerprint) {
+ mCancelButton.setVisibility(View.GONE);
+ } else {
+ mCancelButton.setText(R.string.skip_label);
+ }
boolean showOptionsButton = getActivity().getIntent().getBooleanExtra(
ChooseLockGenericFragment.EXTRA_SHOW_OPTIONS_BUTTON, false);
diff --git a/src/com/android/settings/widget/SeekBarPreference.java b/src/com/android/settings/widget/SeekBarPreference.java
index 4ab1af2..6c08e3d 100644
--- a/src/com/android/settings/widget/SeekBarPreference.java
+++ b/src/com/android/settings/widget/SeekBarPreference.java
@@ -135,6 +135,10 @@
}
}
+ public int getMax() {
+ return mMax;
+ }
+
public void setProgress(int progress) {
setProgress(progress, true);
}
diff --git a/tests/robotests/src/com/android/settings/applications/InstalledAppDetailsTest.java b/tests/robotests/src/com/android/settings/applications/InstalledAppDetailsTest.java
index a570361..e20a435 100644
--- a/tests/robotests/src/com/android/settings/applications/InstalledAppDetailsTest.java
+++ b/tests/robotests/src/com/android/settings/applications/InstalledAppDetailsTest.java
@@ -18,6 +18,7 @@
import android.app.AlertDialog;
+import android.app.AppOpsManager;
import android.app.Fragment;
import android.app.LoaderManager;
import android.app.admin.DevicePolicyManager;
@@ -113,6 +114,8 @@
private BatteryUtils mBatteryUtils;
@Mock
private LoaderManager mLoaderManager;
+ @Mock
+ private AppOpsManager mAppOpsManager;
private FakeFeatureFactory mFeatureFactory;
private InstalledAppDetails mAppDetail;
@@ -138,6 +141,7 @@
doReturn(mActivity).when(mAppDetail).getActivity();
doReturn(mShadowContext).when(mAppDetail).getContext();
doReturn(mPackageManager).when(mActivity).getPackageManager();
+ doReturn(mAppOpsManager).when(mActivity).getSystemService(Context.APP_OPS_SERVICE);
// Default to not considering any apps to be instant (individual tests can override this).
ReflectionHelpers.setStaticField(AppUtils.class, "sInstantAppDataProvider",
diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsButtonsControllerTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsButtonsControllerTest.java
index f2dc851..7af2b85 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsButtonsControllerTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsButtonsControllerTest.java
@@ -18,25 +18,30 @@
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import android.app.FragmentManager;
+import android.app.FragmentTransaction;
import android.widget.Button;
import com.android.settings.R;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig;
import com.android.settings.applications.LayoutPreference;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.shadow.SettingsShadowBluetoothDevice;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
import org.robolectric.annotation.Config;
@RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION,
- shadows=SettingsShadowBluetoothDevice.class)
+ shadows = SettingsShadowBluetoothDevice.class)
public class BluetoothDetailsButtonsControllerTest extends BluetoothDetailsControllerTestBase {
private BluetoothDetailsButtonsController mController;
private LayoutPreference mLayoutPreference;
@@ -125,13 +130,21 @@
}
@Test
- public void forget() {
+ public void forgetDialog() {
showScreen(mController);
+ FragmentManager fragmentManager = mock(FragmentManager.class);
+ when(mFragment.getFragmentManager()).thenReturn(fragmentManager);
+ FragmentTransaction ft = mock(FragmentTransaction.class);
+ when(fragmentManager.beginTransaction()).thenReturn(ft);
mRightButton.callOnClick();
- verify(mCachedDevice).unpair();
- verify(mActivity).finish();
- }
+ ArgumentCaptor<ForgetDeviceDialogFragment> dialogCaptor =
+ ArgumentCaptor.forClass(ForgetDeviceDialogFragment.class);
+ verify(ft).add(dialogCaptor.capture(), anyString());
+
+ ForgetDeviceDialogFragment dialogFragment = dialogCaptor.getValue();
+ assertThat(dialogFragment).isNotNull();
+ }
@Test
public void startsOutBusy() {
diff --git a/tests/robotests/src/com/android/settings/bluetooth/ForgetDeviceDialogFragmentTest.java b/tests/robotests/src/com/android/settings/bluetooth/ForgetDeviceDialogFragmentTest.java
new file mode 100644
index 0000000..21bc868
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/bluetooth/ForgetDeviceDialogFragmentTest.java
@@ -0,0 +1,88 @@
+/*
+ * 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.bluetooth;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.Context;
+
+import com.android.settings.TestConfig;
+import com.android.settings.testutils.FakeFeatureFactory;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settingslib.bluetooth.LocalBluetoothManager;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Answers;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.Robolectric;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowDialog;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class ForgetDeviceDialogFragmentTest {
+
+ @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+ private CachedBluetoothDevice mCachedDevice;
+
+ private ForgetDeviceDialogFragment mFragment;
+ private Context mContext;
+ private Activity mActivity;
+ private AlertDialog mDialog;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mContext = spy(RuntimeEnvironment.application);
+ FakeFeatureFactory.setupForTest(mContext);
+ String deviceAddress = "55:66:77:88:99:AA";
+ when(mCachedDevice.getAddress()).thenReturn(deviceAddress);
+ mFragment = spy(ForgetDeviceDialogFragment.newInstance(deviceAddress));
+ doReturn(mCachedDevice).when(mFragment).getDevice(any());
+ mActivity = Robolectric.setupActivity(Activity.class);
+ mActivity.getFragmentManager().beginTransaction().add(mFragment, null).commit();
+ mDialog = (AlertDialog) ShadowDialog.getLatestDialog();
+ }
+
+ @Test
+ public void cancelDialog() {
+ mDialog.getButton(AlertDialog.BUTTON_NEGATIVE).performClick();
+ verify(mCachedDevice, never()).unpair();
+ assertThat(mActivity.isFinishing()).isFalse();
+ }
+
+ @Test
+ public void confirmDialog() {
+ mDialog.getButton(AlertDialog.BUTTON_POSITIVE).performClick();
+ verify(mCachedDevice).unpair();
+ assertThat(mActivity.isFinishing()).isTrue();
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceControllerTest.java
index 5c18670..0d6a4d7 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceControllerTest.java
@@ -298,19 +298,19 @@
@Test
public void settingUserIdAppliesNewIcons() {
StorageItemPreference audio = spy(new StorageItemPreference(mContext));
- audio.setIcon(R.drawable.ic_photo_library_vd_theme_24);
+ audio.setIcon(R.drawable.ic_media_stream);
StorageItemPreference video = spy(new StorageItemPreference(mContext));
- video.setIcon(R.drawable.ic_photo_library_vd_theme_24);
+ video.setIcon(R.drawable.ic_local_movies);
StorageItemPreference image = spy(new StorageItemPreference(mContext));
- image.setIcon(R.drawable.ic_photo_library_vd_theme_24);
+ image.setIcon(R.drawable.ic_photo_library);
StorageItemPreference games = spy(new StorageItemPreference(mContext));
- games.setIcon(R.drawable.ic_photo_library_vd_theme_24);
+ games.setIcon(R.drawable.ic_videogame_vd_theme_24);
StorageItemPreference apps = spy(new StorageItemPreference(mContext));
- apps.setIcon(R.drawable.ic_photo_library_vd_theme_24);
+ apps.setIcon(R.drawable.ic_storage_apps);
StorageItemPreference system = spy(new StorageItemPreference(mContext));
- system.setIcon(R.drawable.ic_photo_library_vd_theme_24);
+ system.setIcon(R.drawable.ic_system_update_vd_theme_24);
StorageItemPreference files = spy(new StorageItemPreference(mContext));
- files.setIcon(R.drawable.ic_photo_library_vd_theme_24);
+ files.setIcon(R.drawable.ic_folder_vd_theme_24);
PreferenceScreen screen = mock(PreferenceScreen.class);
when(screen.findPreference(
eq(StorageItemPreferenceController.AUDIO_KEY))).thenReturn(audio);
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
index 0cabb05..7f2aeb6 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
@@ -30,6 +30,7 @@
import static org.mockito.Mockito.verify;
import android.app.Activity;
+import android.app.AppOpsManager;
import android.app.Fragment;
import android.app.LoaderManager;
import android.content.Context;
@@ -116,6 +117,8 @@
@Mock
private PackageManager mPackageManager;
@Mock
+ private AppOpsManager mAppOpsManager;
+ @Mock
private LoaderManager mLoaderManager;
@Mock
private AnomalySummaryPreferenceController mAnomalySummaryPreferenceController;
@@ -184,6 +187,7 @@
mTestActivity = spy(new SettingsActivity());
doReturn(mPackageManager).when(mTestActivity).getPackageManager();
+ doReturn(mAppOpsManager).when(mTestActivity).getSystemService(Context.APP_OPS_SERVICE);
final ArgumentCaptor<Bundle> captor = ArgumentCaptor.forClass(Bundle.class);
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryStatsHelperLoaderTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryStatsHelperLoaderTest.java
deleted file mode 100644
index f04b3b8..0000000
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryStatsHelperLoaderTest.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * 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.fuelgauge;
-
-import static org.mockito.Mockito.verify;
-
-import android.content.Context;
-import android.os.BatteryStats;
-import android.os.Bundle;
-import android.os.UserManager;
-
-import com.android.internal.os.BatteryStatsHelper;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
-import com.android.settings.TestConfig;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.annotation.Config;
-
-@RunWith(SettingsRobolectricTestRunner.class)
-@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
-public class BatteryStatsHelperLoaderTest {
- @Mock
- private BatteryStatsHelper mBatteryStatsHelper;
- @Mock
- private Bundle mBundle;
- @Mock
- private Context mContext;
- @Mock
- private UserManager mUserManager;
- private BatteryStatsHelperLoader mLoader;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
-
- mLoader = new BatteryStatsHelperLoader(mContext, mBundle);
- mLoader.mUserManager = mUserManager;
- }
-
- @Test
- public void testInitBatteryStatsHelper_init() {
- mLoader.initBatteryStatsHelper(mBatteryStatsHelper);
-
- verify(mBatteryStatsHelper).create(mBundle);
- verify(mBatteryStatsHelper).refreshStats(BatteryStats.STATS_SINCE_CHARGED,
- mUserManager.getUserProfiles());
- }
-}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryUtilsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryUtilsTest.java
index e2c6f6d..aa19055 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryUtilsTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryUtilsTest.java
@@ -15,10 +15,16 @@
*/
package com.android.settings.fuelgauge;
+import android.app.AppOpsManager;
import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
import android.os.BatteryStats;
+import android.os.Bundle;
+import android.os.Build;
import android.os.Process;
import android.os.SystemClock;
+import android.os.UserManager;
import android.text.format.DateUtils;
import com.android.internal.os.BatterySipper;
@@ -56,7 +62,9 @@
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.spy;
@@ -93,6 +101,8 @@
private static final int DISCHARGE_AMOUNT = 80;
private static final double PERCENT_SYSTEM_USAGE = 60;
private static final double PRECISION = 0.001;
+ private static final int SDK_VERSION = Build.VERSION_CODES.L;
+ private static final String PACKAGE_NAME = "com.android.app";
@Mock
private BatteryStats.Uid mUid;
@@ -116,6 +126,16 @@
private BatterySipper mCellBatterySipper;
@Mock
private BatterySipper mIdleBatterySipper;
+ @Mock
+ private Bundle mBundle;
+ @Mock
+ private UserManager mUserManager;
+ @Mock
+ private PackageManager mPackageManager;
+ @Mock
+ private AppOpsManager mAppOpsManager;
+ @Mock
+ private ApplicationInfo mApplicationInfo;
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
private Context mContext;
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
@@ -170,10 +190,11 @@
mIdleBatterySipper.drainType = BatterySipper.DrainType.IDLE;
mIdleBatterySipper.totalPowerMah = BATTERY_IDLE_USAGE;
- mBatteryUtils = BatteryUtils.getInstance(RuntimeEnvironment.application);
+ final Context shadowContext = spy(RuntimeEnvironment.application);
+ doReturn(mPackageManager).when(shadowContext).getPackageManager();
+ doReturn(mAppOpsManager).when(shadowContext).getSystemService(Context.APP_OPS_SERVICE);
+ mBatteryUtils = spy(new BatteryUtils(shadowContext));
mBatteryUtils.mPowerUsageFeatureProvider = mProvider;
-
- mBatteryUtils = spy(new BatteryUtils(RuntimeEnvironment.application));
}
@Test
@@ -385,6 +406,44 @@
TIME_SINCE_LAST_FULL_CHARGE_US);
}
+ @Test
+ public void testGetTargetSdkVersion_packageExist_returnSdk() throws
+ PackageManager.NameNotFoundException {
+ doReturn(mApplicationInfo).when(mPackageManager).getApplicationInfo(PACKAGE_NAME,
+ PackageManager.GET_META_DATA);
+ mApplicationInfo.targetSdkVersion = SDK_VERSION;
+
+ assertThat(mBatteryUtils.getTargetSdkVersion(PACKAGE_NAME)).isEqualTo(SDK_VERSION);
+ }
+
+ @Test
+ public void testGetTargetSdkVersion_packageNotExist_returnSdkNull() throws
+ PackageManager.NameNotFoundException {
+ doThrow(new PackageManager.NameNotFoundException()).when(
+ mPackageManager).getApplicationInfo(PACKAGE_NAME, PackageManager.GET_META_DATA);
+
+ assertThat(mBatteryUtils.getTargetSdkVersion(PACKAGE_NAME)).isEqualTo(
+ BatteryUtils.SDK_NULL);
+ }
+
+ @Test
+ public void testBackgroundRestrictionOn_restrictionOn_returnTrue() {
+ doReturn(AppOpsManager.MODE_IGNORED).when(mAppOpsManager).checkOpNoThrow(
+ AppOpsManager.OP_RUN_IN_BACKGROUND, UID, PACKAGE_NAME);
+
+ assertThat(mBatteryUtils.isBackgroundRestrictionEnabled(SDK_VERSION, UID,
+ PACKAGE_NAME)).isTrue();
+ }
+
+ @Test
+ public void testBackgroundRestrictionOn_restrictionOff_returnFalse() {
+ doReturn(AppOpsManager.MODE_ALLOWED).when(mAppOpsManager).checkOpNoThrow(
+ AppOpsManager.OP_RUN_IN_BACKGROUND, UID, PACKAGE_NAME);
+
+ assertThat(mBatteryUtils.isBackgroundRestrictionEnabled(SDK_VERSION, UID,
+ PACKAGE_NAME)).isFalse();
+ }
+
private BatterySipper createTestSmearBatterySipper(long topTime,
double totalPowerMah, int uidCode, boolean isUidNull) {
final BatterySipper sipper = mock(BatterySipper.class);
@@ -401,4 +460,13 @@
return sipper;
}
+
+ @Test
+ public void testInitBatteryStatsHelper_init() {
+ mBatteryUtils.initBatteryStatsHelper(mBatteryStatsHelper, mBundle, mUserManager);
+
+ verify(mBatteryStatsHelper).create(mBundle);
+ verify(mBatteryStatsHelper).refreshStats(BatteryStats.STATS_SINCE_CHARGED,
+ mUserManager.getUserProfiles());
+ }
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyDialogFragmentTest.java b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyDialogFragmentTest.java
index e8e4bab..1111804 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyDialogFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyDialogFragmentTest.java
@@ -18,6 +18,7 @@
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
@@ -27,6 +28,7 @@
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
+import android.os.Build;
import com.android.settings.R;
import com.android.settings.fuelgauge.anomaly.action.AnomalyAction;
@@ -57,6 +59,7 @@
private AnomalyAction mAnomalyAction;
private Anomaly mWakeLockAnomaly;
private Anomaly mWakeupAlarmAnomaly;
+ private Anomaly mWakeupAlarmAnomaly2;
private Anomaly mBluetoothAnomaly;
private AnomalyDialogFragment mAnomalyDialogFragment;
private Context mContext;
@@ -78,6 +81,13 @@
.setPackageName(PACKAGE_NAME)
.setDisplayName(DISPLAY_NAME)
.build();
+ mWakeupAlarmAnomaly2 = new Anomaly.Builder()
+ .setType(Anomaly.AnomalyType.WAKEUP_ALARM)
+ .setUid(UID)
+ .setPackageName(PACKAGE_NAME)
+ .setDisplayName(DISPLAY_NAME)
+ .setTargetSdkVersion(Build.VERSION_CODES.O)
+ .build();
mBluetoothAnomaly = new Anomaly.Builder()
.setType(Anomaly.AnomalyType.BLUETOOTH_SCAN)
.setUid(UID)
@@ -116,7 +126,7 @@
}
@Test
- public void testOnCreateDialog_wakeupAlarmAnomaly_fireBackgroundCheckDialog() {
+ public void testOnCreateDialog_wakeupAlarmAnomalyPriorO_fireStopAndBackgroundCheckDialog() {
mAnomalyDialogFragment = AnomalyDialogFragment.newInstance(mWakeupAlarmAnomaly,
0 /* metricskey */);
@@ -137,11 +147,32 @@
}
@Test
+ public void testOnCreateDialog_wakeupAlarmAnomalyTargetingO_fireForceStopDialog() {
+ mAnomalyDialogFragment = AnomalyDialogFragment.newInstance(mWakeupAlarmAnomaly2,
+ 0 /* metricskey */);
+
+ FragmentTestUtil.startFragment(mAnomalyDialogFragment);
+
+ final AlertDialog dialog = (AlertDialog) ShadowDialog.getLatestDialog();
+ ShadowAlertDialog shadowDialog = shadowOf(dialog);
+
+ assertThat(shadowDialog.getMessage()).isEqualTo(
+ mContext.getString(R.string.dialog_stop_message_wakeup_alarm,
+ mWakeLockAnomaly.displayName));
+ assertThat(shadowDialog.getTitle()).isEqualTo(
+ mContext.getString(R.string.dialog_stop_title));
+ assertThat(dialog.getButton(DialogInterface.BUTTON_POSITIVE).getText()).isEqualTo(
+ mContext.getString(R.string.dialog_stop_ok));
+ assertThat(dialog.getButton(DialogInterface.BUTTON_NEGATIVE).getText()).isEqualTo(
+ mContext.getString(R.string.dlg_cancel));
+ }
+
+ @Test
public void testOnCreateDialog_bluetoothAnomaly_fireLocationCheckDialog() {
mAnomalyDialogFragment = spy(AnomalyDialogFragment.newInstance(mBluetoothAnomaly,
0 /* metricskey */));
mAnomalyDialogFragment.mAnomalyUtils = mAnomalyUtils;
- doReturn(mAnomalyAction).when(mAnomalyUtils).getAnomalyAction(anyInt());
+ doReturn(mAnomalyAction).when(mAnomalyUtils).getAnomalyAction(any());
doNothing().when(mAnomalyDialogFragment).initAnomalyUtils();
doReturn(Anomaly.AnomalyActionType.LOCATION_CHECK).when(mAnomalyAction).getActionType();
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyTest.java b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyTest.java
index 55b8308..759f0fd 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyTest.java
@@ -18,6 +18,8 @@
import static com.google.common.truth.Truth.assertThat;
+import android.os.Build;
+
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig;
@@ -30,6 +32,7 @@
public class AnomalyTest {
private static int TYPE = Anomaly.AnomalyType.WAKE_LOCK;
private static int UID = 111;
+ private static int SDK_VERSION = Build.VERSION_CODES.L;
private static long WAKE_LOCK_TIME_MS = 1500;
private static String PACKAGE_NAME = "com.android.settings";
private static String DISPLAY_NAME = "settings";
@@ -42,6 +45,8 @@
.setWakeLockTimeMs(WAKE_LOCK_TIME_MS)
.setPackageName(PACKAGE_NAME)
.setDisplayName(DISPLAY_NAME)
+ .setTargetSdkVersion(SDK_VERSION)
+ .setBackgroundRestrictionEnabled(true)
.build();
assertThat(anomaly.type).isEqualTo(TYPE);
@@ -49,5 +54,7 @@
assertThat(anomaly.wakelockTimeMs).isEqualTo(WAKE_LOCK_TIME_MS);
assertThat(anomaly.packageName).isEqualTo(PACKAGE_NAME);
assertThat(anomaly.displayName).isEqualTo(DISPLAY_NAME);
+ assertThat(anomaly.targetSdkVersion).isEqualTo(SDK_VERSION);
+ assertThat(anomaly.backgroundRestrictionEnabled).isTrue();
}
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyUtilsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyUtilsTest.java
index 15bca7e..8cd5a06 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyUtilsTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalyUtilsTest.java
@@ -18,9 +18,11 @@
import static com.google.common.truth.Truth.assertThat;
+import android.os.Build;
+
+import com.android.settings.fuelgauge.anomaly.action.StopAndBackgroundCheckAction;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig;
-import com.android.settings.fuelgauge.anomaly.action.BackgroundCheckAction;
import com.android.settings.fuelgauge.anomaly.action.ForceStopAction;
import com.android.settings.fuelgauge.anomaly.checker.WakeLockAnomalyDetector;
import com.android.settings.testutils.shadow.ShadowKeyValueListParserWrapperImpl;
@@ -45,23 +47,52 @@
@Test
public void testGetAnomalyAction_typeWakeLock_returnForceStop() {
- assertThat(mAnomalyUtils.getAnomalyAction(Anomaly.AnomalyType.WAKE_LOCK)).isInstanceOf(
+ Anomaly anomaly = new Anomaly.Builder()
+ .setType(Anomaly.AnomalyType.WAKE_LOCK)
+ .build();
+ assertThat(mAnomalyUtils.getAnomalyAction(anomaly)).isInstanceOf(
ForceStopAction.class);
}
@Test
- public void testGetAnomalyAction_typeWakeUpAlarm_returnBackgroundCheck() {
- assertThat(mAnomalyUtils.getAnomalyAction(Anomaly.AnomalyType.WAKEUP_ALARM)).isInstanceOf(
- BackgroundCheckAction.class);
- }
-
- @Test
public void testGetAnomalyDetector_typeWakeLock_returnWakeLockDetector() {
assertThat(mAnomalyUtils.getAnomalyDetector(Anomaly.AnomalyType.WAKE_LOCK)).isInstanceOf(
WakeLockAnomalyDetector.class);
}
@Test
+ public void testGetAnomalyAction_typeWakeUpAlarmTargetO_returnForceStop() {
+ Anomaly anomaly = new Anomaly.Builder()
+ .setType(Anomaly.AnomalyType.WAKEUP_ALARM)
+ .setTargetSdkVersion(Build.VERSION_CODES.O)
+ .build();
+ assertThat(mAnomalyUtils.getAnomalyAction(anomaly)).isInstanceOf(
+ ForceStopAction.class);
+ }
+
+ @Test
+ public void testGetAnomalyAction_typeWakeUpAlarmTargetPriorOAndBgOff_returnStopAndBackground() {
+ Anomaly anomaly = new Anomaly.Builder()
+ .setType(Anomaly.AnomalyType.WAKEUP_ALARM)
+ .setTargetSdkVersion(Build.VERSION_CODES.L)
+ .setBackgroundRestrictionEnabled(false)
+ .build();
+ assertThat(mAnomalyUtils.getAnomalyAction(anomaly)).isInstanceOf(
+ StopAndBackgroundCheckAction.class);
+ }
+
+ @Test
+ public void testGetAnomalyAction_typeWakeUpAlarmTargetPriorOAndBgOn_returnForceStop() {
+ Anomaly anomaly = new Anomaly.Builder()
+ .setType(Anomaly.AnomalyType.WAKEUP_ALARM)
+ .setTargetSdkVersion(Build.VERSION_CODES.L)
+ .setBackgroundRestrictionEnabled(true)
+ .build();
+ assertThat(mAnomalyUtils.getAnomalyAction(anomaly)).isInstanceOf(
+ ForceStopAction.class);
+ }
+
+ @Test
public void testGetAnomalyDetector_typeWakeUpAlarm_returnWakeUpAlarmDetector() {
assertThat(mAnomalyUtils.getAnomalyDetector(Anomaly.AnomalyType.WAKEUP_ALARM)).isInstanceOf(
WakeupAlarmAnomalyDetector.class);
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/action/BackgroundCheckActionTest.java b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/action/BackgroundCheckActionTest.java
index ae783ab..e2b8656 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/action/BackgroundCheckActionTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/action/BackgroundCheckActionTest.java
@@ -23,7 +23,9 @@
import android.app.AppOpsManager;
import android.content.Context;
+import android.os.Build;
+import com.android.settings.fuelgauge.BatteryUtils;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig;
import com.android.settings.fuelgauge.anomaly.Anomaly;
@@ -42,11 +44,14 @@
public class BackgroundCheckActionTest {
private static final String PACKAGE_NAME = "com.android.app";
private static final int UID = 111;
+ private static final int SDK_VERSION = Build.VERSION_CODES.L;
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
private Context mContext;
@Mock
- private AppOpsManager mAppOpsManagerr;
+ private AppOpsManager mAppOpsManager;
+ @Mock
+ private BatteryUtils mBatteryUtils;
private Anomaly mAnomaly;
private BackgroundCheckAction mBackgroundCheckAction;
@@ -55,35 +60,37 @@
MockitoAnnotations.initMocks(this);
FakeFeatureFactory.setupForTest(mContext);
- doReturn(mAppOpsManagerr).when(mContext).getSystemService(Context.APP_OPS_SERVICE);
+ doReturn(mAppOpsManager).when(mContext).getSystemService(Context.APP_OPS_SERVICE);
mAnomaly = new Anomaly.Builder()
.setUid(UID)
.setPackageName(PACKAGE_NAME)
+ .setTargetSdkVersion(SDK_VERSION)
.build();
mBackgroundCheckAction = new BackgroundCheckAction(mContext);
+ mBackgroundCheckAction.mBatteryUtils = mBatteryUtils;
}
@Test
public void testHandlePositiveAction_forceStopPackage() {
mBackgroundCheckAction.handlePositiveAction(mAnomaly, 0 /* metricskey */);
- verify(mAppOpsManagerr).setMode(AppOpsManager.OP_RUN_IN_BACKGROUND, UID, PACKAGE_NAME,
+ verify(mAppOpsManager).setMode(AppOpsManager.OP_RUN_IN_BACKGROUND, UID, PACKAGE_NAME,
AppOpsManager.MODE_IGNORED);
}
@Test
public void testIsActionActive_modeAllowed_returnTrue() {
- doReturn(AppOpsManager.MODE_ALLOWED).when(mAppOpsManagerr).checkOpNoThrow(
- AppOpsManager.OP_RUN_IN_BACKGROUND, UID, PACKAGE_NAME);
+ doReturn(false).when(mBatteryUtils).isBackgroundRestrictionEnabled(SDK_VERSION, UID,
+ PACKAGE_NAME);
assertThat(mBackgroundCheckAction.isActionActive(mAnomaly)).isTrue();
}
@Test
public void testIsActionActive_modeIgnored_returnFalse() {
- doReturn(AppOpsManager.MODE_IGNORED).when(mAppOpsManagerr).checkOpNoThrow(
- AppOpsManager.OP_RUN_IN_BACKGROUND, UID, PACKAGE_NAME);
+ doReturn(true).when(mBatteryUtils).isBackgroundRestrictionEnabled(SDK_VERSION, UID,
+ PACKAGE_NAME);
assertThat(mBackgroundCheckAction.isActionActive(mAnomaly)).isFalse();
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/action/StopAndBackgroundActionTest.java b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/action/StopAndBackgroundActionTest.java
new file mode 100644
index 0000000..c06bddd
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/action/StopAndBackgroundActionTest.java
@@ -0,0 +1,93 @@
+/*
+ * 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.fuelgauge.anomaly.action;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.verify;
+
+import android.content.Context;
+
+import com.android.settings.TestConfig;
+import com.android.settings.fuelgauge.anomaly.Anomaly;
+import com.android.settings.testutils.FakeFeatureFactory;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Answers;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.annotation.Config;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class StopAndBackgroundActionTest {
+ private static final String PACKAGE_NAME = "com.android.app";
+ private static final int UID = 111;
+ private static final int METRICS_KEY = 3;
+
+ @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+ private Context mContext;
+ @Mock
+ private BackgroundCheckAction mBackgroundCheckAction;
+ @Mock
+ private ForceStopAction mForceStopAction;
+ private StopAndBackgroundCheckAction mStopAndBackgroundCheckAction;
+ private Anomaly mAnomaly;
+
+ @Before
+ public void setUp() throws Exception {
+ MockitoAnnotations.initMocks(this);
+ mAnomaly = new Anomaly.Builder()
+ .setUid(UID)
+ .setPackageName(PACKAGE_NAME)
+ .build();
+
+ FakeFeatureFactory.setupForTest(mContext);
+ mStopAndBackgroundCheckAction = new StopAndBackgroundCheckAction(mContext, mForceStopAction,
+ mBackgroundCheckAction);
+ }
+
+ @Test
+ public void testHandlePositiveAction_stopAndBackgroundCheck() {
+ mStopAndBackgroundCheckAction.handlePositiveAction(mAnomaly, METRICS_KEY);
+
+ verify(mBackgroundCheckAction).handlePositiveAction(mAnomaly, METRICS_KEY);
+ verify(mForceStopAction).handlePositiveAction(mAnomaly, METRICS_KEY);
+ }
+
+ @Test
+ public void testIsActionActive_restrictionEnabled_returnFalse() {
+ doReturn(true).when(mForceStopAction).isActionActive(mAnomaly);
+
+ assertThat(mStopAndBackgroundCheckAction.isActionActive(mAnomaly)).isFalse();
+ }
+
+ @Test
+ public void testIsActionActive_appNotRunning_returnFalse() {
+ doReturn(true).when(mBackgroundCheckAction).isActionActive(mAnomaly);
+
+ assertThat(mStopAndBackgroundCheckAction.isActionActive(mAnomaly)).isFalse();
+ }
+
+ @Test
+ public void testIsActionActive_appStoppedAndRestrictionOn_returnFalse() {
+ assertThat(mStopAndBackgroundCheckAction.isActionActive(mAnomaly)).isFalse();
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/checker/BluetoothScanAnomalyDetectorTest.java b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/checker/BluetoothScanAnomalyDetectorTest.java
index a687e2f..d21687c 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/checker/BluetoothScanAnomalyDetectorTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/checker/BluetoothScanAnomalyDetectorTest.java
@@ -36,6 +36,7 @@
import com.android.settings.fuelgauge.BatteryUtils;
import com.android.settings.fuelgauge.anomaly.Anomaly;
import com.android.settings.fuelgauge.anomaly.AnomalyDetectionPolicy;
+import com.android.settings.fuelgauge.anomaly.AnomalyUtils;
import com.android.settings.fuelgauge.anomaly.action.AnomalyAction;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
@@ -80,6 +81,8 @@
private AnomalyDetectionPolicy mPolicy;
@Mock
private AnomalyAction mAnomalyAction;
+ @Mock
+ private AnomalyUtils mAnomalyUtils;
private BluetoothScanAnomalyDetector mBluetoothScanAnomalyDetector;
private Context mContext;
@@ -92,6 +95,7 @@
mContext = spy(RuntimeEnvironment.application);
ReflectionHelpers.setField(mPolicy, "bluetoothScanThreshold",
30 * DateUtils.MINUTE_IN_MILLIS);
+ doReturn(mAnomalyAction).when(mAnomalyUtils).getAnomalyAction(any());
mAnomalySipper.uidObj = mAnomalyUid;
doReturn(ANOMALY_UID).when(mAnomalyUid).getUid();
@@ -106,10 +110,9 @@
mUsageList.add(mTargetSipper);
doReturn(mUsageList).when(mBatteryStatsHelper).getUsageList();
- mBluetoothScanAnomalyDetector = spy(
- new BluetoothScanAnomalyDetector(mContext, mPolicy, mAnomalyAction));
+ mBluetoothScanAnomalyDetector = spy(new BluetoothScanAnomalyDetector(mContext, mPolicy,
+ mAnomalyUtils));
mBluetoothScanAnomalyDetector.mBatteryUtils = mBatteryUtils;
- mBluetoothScanAnomalyDetector.mAnomalyAction = mAnomalyAction;
doReturn(false).when(mBatteryUtils).shouldHideSipper(any());
doReturn(true).when(mAnomalyAction).isActionActive(any());
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/checker/WakeLockAnomalyDetectorTest.java b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/checker/WakeLockAnomalyDetectorTest.java
index 19ab7d6..f53e8a0 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/checker/WakeLockAnomalyDetectorTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/checker/WakeLockAnomalyDetectorTest.java
@@ -34,6 +34,7 @@
import com.android.internal.os.BatterySipper;
import com.android.internal.os.BatteryStatsHelper;
+import com.android.settings.fuelgauge.anomaly.AnomalyUtils;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig;
import com.android.settings.fuelgauge.BatteryUtils;
@@ -92,6 +93,8 @@
private AnomalyDetectionPolicy mPolicy;
@Mock
private AnomalyAction mAnomalyAction;
+ @Mock
+ private AnomalyUtils mAnomalyUtils;
private WakeLockAnomalyDetector mWakelockAnomalyDetector;
private Context mContext;
@@ -109,10 +112,11 @@
doReturn(mApplicationInfo).when(mPackageManager)
.getApplicationInfo(nullable(String.class), anyInt());
doReturn(true).when(mAnomalyAction).isActionActive(any());
+ doReturn(mAnomalyAction).when(mAnomalyUtils).getAnomalyAction(any());
- mWakelockAnomalyDetector = spy(new WakeLockAnomalyDetector(mContext, mPolicy));
+ mWakelockAnomalyDetector = spy(
+ new WakeLockAnomalyDetector(mContext, mPolicy, mAnomalyUtils));
mWakelockAnomalyDetector.mBatteryUtils = mBatteryUtils;
- mWakelockAnomalyDetector.mAnomalyAction = mAnomalyAction;
mAnomalySipper.uidObj = mAnomalyUid;
doReturn(ANOMALY_WAKELOCK_TIME_MS).when(mWakelockAnomalyDetector)
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/checker/WakeupAlarmAnomalyDetectorTest.java b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/checker/WakeupAlarmAnomalyDetectorTest.java
index e7c2664..a16db6e 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/checker/WakeupAlarmAnomalyDetectorTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/checker/WakeupAlarmAnomalyDetectorTest.java
@@ -33,6 +33,7 @@
import com.android.internal.os.BatterySipper;
import com.android.internal.os.BatteryStatsHelper;
+import com.android.settings.fuelgauge.anomaly.AnomalyUtils;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig;
import com.android.settings.fuelgauge.BatteryUtils;
@@ -89,6 +90,8 @@
private AnomalyDetectionPolicy mPolicy;
@Mock
private AnomalyAction mAnomalyAction;
+ @Mock
+ private AnomalyUtils mAnomalyUtils;
private WakeupAlarmAnomalyDetector mWakeupAlarmAnomalyDetector;
private Context mContext;
@@ -105,6 +108,7 @@
doReturn(RUNNING_TIME_MS).when(mBatteryUtils).calculateRunningTimeBasedOnStatsType(any(),
anyInt());
doReturn(true).when(mAnomalyAction).isActionActive(any());
+ doReturn(mAnomalyAction).when(mAnomalyUtils).getAnomalyAction(any());
mAnomalySipper.uidObj = mAnomalyUid;
doReturn(ANOMALY_UID).when(mAnomalyUid).getUid();
@@ -119,9 +123,9 @@
mUsageList.add(mTargetSipper);
doReturn(mUsageList).when(mBatteryStatsHelper).getUsageList();
- mWakeupAlarmAnomalyDetector = spy(new WakeupAlarmAnomalyDetector(mContext, mPolicy));
+ mWakeupAlarmAnomalyDetector = spy(
+ new WakeupAlarmAnomalyDetector(mContext, mPolicy, mAnomalyUtils));
mWakeupAlarmAnomalyDetector.mBatteryUtils = mBatteryUtils;
- mWakeupAlarmAnomalyDetector.mAnomalyAction = mAnomalyAction;
}
@Test