Merge "Channel settings updates" into oc-dev
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 02351e5..4f94bf8 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -2519,7 +2519,7 @@
<category android:name="android.intent.category.DEFAULT" />
<category android:name="com.android.settings.SHORTCUT" />
</intent-filter>
- <intent-filter android:priority="120">
+ <intent-filter android:priority="160">
<action android:name="com.android.settings.action.SETTINGS"/>
</intent-filter>
<meta-data android:name="com.android.settings.category"
@@ -2582,7 +2582,7 @@
<action android:name="com.android.settings.action.SETTINGS" />
</intent-filter>
<meta-data android:name="com.android.settings.category"
- android:value="com.android.settings.category.ia.apps" />
+ android:value="com.android.settings.category.ia.notifications" />
<meta-data android:name="com.android.settings.FRAGMENT_CLASS"
android:value="com.android.settings.applications.NotificationApps" />
</activity>
diff --git a/res/drawable/action_bar_dropshadow.xml b/res/drawable/action_bar_dropshadow.xml
new file mode 100644
index 0000000..dd85877
--- /dev/null
+++ b/res/drawable/action_bar_dropshadow.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ 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.
+ -->
+
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="rectangle">
+ <gradient
+ android:angle="270"
+ android:startColor="#4D000000"
+ android:endColor="@android:color/transparent"
+ android:type="linear" />
+ <size android:height="8dp" />
+</shape>
\ No newline at end of file
diff --git a/res/layout/app_details.xml b/res/layout/app_details.xml
index 5ffeec5..8cfa8b9 100644
--- a/res/layout/app_details.xml
+++ b/res/layout/app_details.xml
@@ -17,30 +17,24 @@
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/app_snippet"
- style="@style/EntityHeader"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_gravity="center_horizontal|top"
- android:orientation="vertical"
- android:paddingStart="?android:attr/listPreferredItemPaddingStart"
- android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
- android:paddingTop="24dp"
- android:paddingBottom="24dp"
- android:clipChildren="false"
- android:clipToPadding="false">
+ android:orientation="vertical">
<!-- App snippet with buttons -->
<RelativeLayout
+ android:id="@+id/app_snippet"
+ style="@style/EntityHeader"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:paddingStart="8dp"
- android:clipChildren="false"
- android:clipToPadding="false">
+ android:paddingStart="?android:attr/listPreferredItemPaddingStart"
+ android:paddingEnd="0dp"
+ android:paddingTop="24dp"
+ android:paddingBottom="24dp">
<FrameLayout android:id="@+id/app_icon_frame"
- android:layout_width="80dp"
- android:layout_height="80dp"
+ android:layout_width="56dp"
+ android:layout_height="56dp"
android:clipChildren="false"
android:clipToPadding="false">
<ImageView
@@ -54,8 +48,7 @@
android:layout_width="22dp"
android:layout_height="22dp"
android:layout_gravity="end|bottom"
- android:layout_margin="8dp"
- android:visibility="gone"
+ android:layout_margin="4dp"
android:elevation="20dp"
android:background="@drawable/ic_instant_apps_badge_bg"
android:src="@drawable/ic_instant_apps_badge" />
@@ -70,19 +63,22 @@
<ImageButton
android:id="@+id/right_button"
- style="@android:style/Widget.Material.Button.Borderless"
+ style="?android:attr/actionOverflowButtonStyle"
android:layout_width="wrap_content"
android:layout_weight="1"
android:layout_height="0dp"
+ android:minWidth="@dimen/min_tap_target_size"
android:src="@drawable/ic_settings_24dp"
android:tint="?android:attr/colorAccent"/>
<ImageButton
android:id="@+id/left_button"
- style="@android:style/Widget.Material.Button.Borderless"
+ style="?android:attr/actionOverflowButtonStyle"
android:layout_width="wrap_content"
android:layout_weight="1"
android:layout_height="0dp"
+ android:minWidth="@dimen/min_tap_target_size"
+ android:src="@null"
android:tint="?android:attr/colorAccent"/>
</LinearLayout>
@@ -131,4 +127,9 @@
</RelativeLayout>
+ <!-- Drop shadow -->
+ <View android:layout_width="match_parent"
+ android:layout_height="5dp"
+ android:background="@drawable/action_bar_dropshadow"/>
+
</LinearLayout>
\ No newline at end of file
diff --git a/res/layout/choose_lock_password.xml b/res/layout/choose_lock_password.xml
index 260db7f..0888b5e 100644
--- a/res/layout/choose_lock_password.xml
+++ b/res/layout/choose_lock_password.xml
@@ -20,6 +20,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:icon="@drawable/ic_lock"
+ settings:suwFooter="@layout/choose_lock_password_footer"
settings:suwHeaderText="@string/lockpassword_choose_your_password_header">
<LinearLayout
@@ -65,33 +66,6 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:clipChildren="false"
- android:clipToPadding="false"
- android:gravity="end"
- android:orientation="horizontal">
-
- <!-- left : cancel -->
- <Button android:id="@+id/cancel_button"
- style="@style/SetupWizardButton.Negative"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/lockpassword_cancel_label" />
-
- <Space
- android:layout_width="0dp"
- android:layout_height="0dp"
- android:layout_weight="1" />
-
- <!-- right : continue -->
- <Button android:id="@+id/next_button"
- style="@style/SetupWizardButton.Positive"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/lockpassword_continue_label" />
- </LinearLayout>
</LinearLayout>
</LinearLayout>
diff --git a/res/layout/choose_lock_password_footer.xml b/res/layout/choose_lock_password_footer.xml
new file mode 100644
index 0000000..57be320
--- /dev/null
+++ b/res/layout/choose_lock_password_footer.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ 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.
+-->
+
+<!-- TODO: Use aapt:attr when it is fixed (b/36809755) -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ style="@style/SuwGlifButtonBar"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
+
+ <!-- left : cancel -->
+ <Button android:id="@+id/cancel_button"
+ style="@style/SuwGlifButton.Secondary"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/lockpassword_cancel_label" />
+
+ <Space
+ android:layout_width="0dp"
+ android:layout_height="0dp"
+ android:layout_weight="1" />
+
+ <!-- right : continue -->
+ <Button android:id="@+id/next_button"
+ style="@style/SuwGlifButton.Primary"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/lockpassword_continue_label" />
+
+</LinearLayout>
diff --git a/res/layout/choose_lock_pattern_common.xml b/res/layout/choose_lock_pattern_common.xml
index 050479b..a54987d 100644
--- a/res/layout/choose_lock_pattern_common.xml
+++ b/res/layout/choose_lock_pattern_common.xml
@@ -22,6 +22,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:icon="@drawable/ic_lock"
+ settings:suwFooter="@layout/choose_lock_pattern_common_footer"
settings:suwHeaderText="@string/lockpassword_choose_your_pattern_header">
<com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient
@@ -56,35 +57,6 @@
android:layout_height="0dip"
android:layout_weight="4" />
- <!-- Buttons are hidden during setup, and use the buttons in setup navigation bar instead -->
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:clipChildren="false"
- android:clipToPadding="false"
- android:orientation="horizontal">
-
- <!-- left : cancel, or re-try -->
- <Button android:id="@+id/footerLeftButton"
- style="@style/SetupWizardButton.Negative"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/lockpattern_tutorial_cancel_label" />
-
- <Space
- android:layout_width="0dp"
- android:layout_height="0dp"
- android:layout_weight="1" />
-
- <!-- right : confirm or ok -->
- <Button android:id="@+id/footerRightButton"
- style="@style/SetupWizardButton.Positive"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/lockpattern_tutorial_continue_label" />
-
- </LinearLayout>
-
</LinearLayout>
<TextView android:id="@+id/footerText"
diff --git a/res/layout/choose_lock_pattern_common_footer.xml b/res/layout/choose_lock_pattern_common_footer.xml
new file mode 100644
index 0000000..d80702e
--- /dev/null
+++ b/res/layout/choose_lock_pattern_common_footer.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ 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.
+-->
+
+<!-- TODO: Use aapt:attr when it is fixed (b/36809755) -->
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ style="@style/SuwGlifButtonBar"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
+
+ <!-- left : cancel, or re-try -->
+ <Button android:id="@+id/footerLeftButton"
+ style="@style/SuwGlifButton.Secondary"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/lockpattern_tutorial_cancel_label" />
+
+ <Space
+ android:layout_width="0dp"
+ android:layout_height="0dp"
+ android:layout_weight="1" />
+
+ <!-- right : confirm or ok -->
+ <Button android:id="@+id/footerRightButton"
+ style="@style/SuwGlifButton.Primary"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/lockpattern_tutorial_continue_label" />
+
+</LinearLayout>
diff --git a/res/layout/confirm_lock_password_internal.xml b/res/layout/confirm_lock_password_internal.xml
index 4f22cfb..02d28b2 100644
--- a/res/layout/confirm_lock_password_internal.xml
+++ b/res/layout/confirm_lock_password_internal.xml
@@ -48,13 +48,6 @@
android:layout_marginStart="?attr/suwMarginSides"
android:layout_marginEnd="?attr/suwMarginSides" />
- <Button
- style="@style/SetupWizardButton.Negative"
- android:id="@+id/cancelButton"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/cancel" />
-
<Space
android:layout_width="match_parent"
android:layout_height="0dp"
@@ -94,5 +87,12 @@
android:contentDescription="@string/confirm_fingerprint_icon_content_description"
android:visibility="gone"/>
+ <Button
+ style="@style/SetupWizardButton.Negative"
+ android:id="@+id/cancelButton"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/cancel" />
+
</com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient>
</com.android.setupwizardlib.GlifLayout>
\ No newline at end of file
diff --git a/res/layout/confirm_lock_pattern_internal_base.xml b/res/layout/confirm_lock_pattern_internal_base.xml
index 359b51b..e20d04d 100644
--- a/res/layout/confirm_lock_pattern_internal_base.xml
+++ b/res/layout/confirm_lock_pattern_internal_base.xml
@@ -58,15 +58,6 @@
android:layout_marginStart="?attr/suwMarginSides"
android:layout_marginEnd="?attr/suwMarginSides" />
- <Button
- android:id="@+id/cancelButton"
- style="@style/SetupWizardButton.Negative"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginStart="?attr/suwMarginSides"
- android:layout_marginEnd="?attr/suwMarginSides"
- android:text="@string/cancel" />
-
</LinearLayout>
</ScrollView>
@@ -108,5 +99,15 @@
android:visibility="gone"/>
</LinearLayout>
+ <Button
+ android:id="@+id/cancelButton"
+ style="@style/SuwGlifButton.Secondary"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="?attr/suwMarginSides"
+ android:layout_marginEnd="?attr/suwMarginSides"
+ android:text="@string/cancel" />
+
</com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient>
+
</com.android.setupwizardlib.GlifLayout>
diff --git a/res/layout/encryption_interstitial.xml b/res/layout/encryption_interstitial.xml
new file mode 100644
index 0000000..f827e37
--- /dev/null
+++ b/res/layout/encryption_interstitial.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ 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.
+-->
+
+<com.android.setupwizardlib.GlifLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:icon="@drawable/ic_lock"
+ app:suwFooter="@layout/encryption_interstitial_footer">
+
+ <LinearLayout
+ style="@style/SuwContentFrame"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:clipChildren="false"
+ android:clipToPadding="false"
+ android:orientation="vertical">
+
+ <TextView
+ android:id="@+id/encryption_message"
+ style="@style/SuwDescription.Glif"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" />
+
+ </LinearLayout>
+
+</com.android.setupwizardlib.GlifLayout>
diff --git a/res/layout/encryption_interstitial_footer.xml b/res/layout/encryption_interstitial_footer.xml
new file mode 100644
index 0000000..2f876f3
--- /dev/null
+++ b/res/layout/encryption_interstitial_footer.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ 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.
+-->
+
+<!-- TODO: Use aapt:attr when it is fixed (b/36809755) -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ style="@style/SuwGlifButtonBar"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
+
+ <Button
+ android:id="@+id/encrypt_dont_require_password"
+ style="@style/SuwGlifButton.Secondary"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/encryption_interstitial_no" />
+
+ <Space
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ android:layout_weight="1" />
+
+ <Button
+ android:id="@+id/encrypt_require_password"
+ style="@style/SuwGlifButton.Primary"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/encryption_interstitial_yes" />
+
+</LinearLayout>
diff --git a/res/layout/encryption_interstitial_header.xml b/res/layout/encryption_interstitial_header.xml
deleted file mode 100644
index b4f6dbb..0000000
--- a/res/layout/encryption_interstitial_header.xml
+++ /dev/null
@@ -1,30 +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.
--->
-
-<TextView
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/encryption_interstitial_header"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:gravity="center_vertical"
- android:minHeight="56dp"
- android:paddingBottom="@dimen/suw_description_glif_margin_bottom_lists"
- android:paddingStart="?android:attr/listPreferredItemPaddingStart"
- android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
- android:paddingTop="@dimen/suw_description_glif_margin_top"
- android:lineSpacingExtra="@dimen/suw_description_line_spacing_extra"
- android:textAppearance="?android:attr/textAppearanceListItem" />
diff --git a/res/layout/fingerprint_enroll_find_sensor_base.xml b/res/layout/fingerprint_enroll_find_sensor_base.xml
index 60c8bc7..fa344ab 100644
--- a/res/layout/fingerprint_enroll_find_sensor_base.xml
+++ b/res/layout/fingerprint_enroll_find_sensor_base.xml
@@ -18,9 +18,9 @@
<com.android.setupwizardlib.GlifLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/setup_wizard_layout"
+ style="?attr/fingerprint_layout_theme"
android:layout_width="match_parent"
- android:layout_height="match_parent"
- style="?attr/fingerprint_layout_theme">
+ android:layout_height="match_parent">
<FrameLayout
android:layout_width="match_parent"
@@ -56,7 +56,7 @@
android:layout_weight="1"/>
<Button
- style="@style/SetupWizardButton.Positive"
+ style="@style/SuwGlifButton.Primary"
android:id="@+id/next_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
diff --git a/res/layout/fingerprint_enroll_finish_base.xml b/res/layout/fingerprint_enroll_finish_base.xml
index db099c3..6d9cf70 100644
--- a/res/layout/fingerprint_enroll_finish_base.xml
+++ b/res/layout/fingerprint_enroll_finish_base.xml
@@ -17,10 +17,12 @@
<com.android.setupwizardlib.GlifLayout
xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/setup_wizard_layout"
+ style="?attr/fingerprint_layout_theme"
android:layout_width="match_parent"
android:layout_height="match_parent"
- style="?attr/fingerprint_layout_theme">
+ app:suwFooter="@layout/fingerprint_enroll_finish_base_footer">
<LinearLayout
style="@style/SuwContentFrame"
@@ -71,35 +73,6 @@
android:layout_width="match_parent"
android:layout_weight="1"/>
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginBottom="4dp"
- android:clipChildren="false"
- android:clipToPadding="false"
- android:orientation="horizontal">
-
- <Button
- style="@style/SetupWizardButton.Negative"
- android:id="@+id/add_another_button"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/fingerprint_enroll_button_add" />
-
- <Space
- android:layout_width="0dp"
- android:layout_height="0dp"
- android:layout_weight="1" />
-
- <Button
- style="@style/SetupWizardButton.Positive"
- android:id="@+id/next_button"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/security_settings_fingerprint_enroll_done" />
-
- </LinearLayout>
-
</LinearLayout>
</com.android.setupwizardlib.GlifLayout>
diff --git a/res/layout/fingerprint_enroll_finish_base_footer.xml b/res/layout/fingerprint_enroll_finish_base_footer.xml
new file mode 100644
index 0000000..b3b9c74
--- /dev/null
+++ b/res/layout/fingerprint_enroll_finish_base_footer.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ 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.
+-->
+
+<!-- TODO: Use aapt:attr when it is fixed (b/36809755) -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ style="@style/SuwGlifButtonBar"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
+
+ <Button
+ style="@style/SuwGlifButton.Secondary"
+ android:id="@+id/add_another_button"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/fingerprint_enroll_button_add" />
+
+ <Space
+ android:layout_width="0dp"
+ android:layout_height="0dp"
+ android:layout_weight="1" />
+
+ <Button
+ style="@style/SuwGlifButton.Primary"
+ android:id="@+id/next_button"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/security_settings_fingerprint_enroll_done" />
+
+</LinearLayout>
diff --git a/res/layout/fingerprint_enroll_introduction.xml b/res/layout/fingerprint_enroll_introduction.xml
index 6d20756..4f73395 100644
--- a/res/layout/fingerprint_enroll_introduction.xml
+++ b/res/layout/fingerprint_enroll_introduction.xml
@@ -17,10 +17,12 @@
<com.android.setupwizardlib.GlifLayout
xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
style="?attr/fingerprint_layout_theme"
android:id="@+id/setup_wizard_layout"
android:layout_width="match_parent"
- android:layout_height="match_parent">
+ android:layout_height="match_parent"
+ app:suwFooter="@layout/fingerprint_enroll_introduction_footer">
<LinearLayout
style="@style/SuwContentFrame"
@@ -43,34 +45,6 @@
android:layout_width="match_parent"
android:layout_height="wrap_content" />
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:clipChildren="false"
- android:clipToPadding="false"
- android:orientation="horizontal">
-
- <Button
- android:id="@+id/fingerprint_cancel_button"
- style="@style/SetupWizardButton.Negative"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/security_settings_fingerprint_enroll_introduction_cancel" />
-
- <Space
- android:layout_width="0dp"
- android:layout_height="0dp"
- android:layout_weight="1" />
-
- <Button
- android:id="@+id/fingerprint_next_button"
- style="@style/SetupWizardButton.Positive"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/suw_next_button_label" />
-
- </LinearLayout>
-
</LinearLayout>
</com.android.setupwizardlib.GlifLayout>
diff --git a/res/layout/fingerprint_enroll_introduction_footer.xml b/res/layout/fingerprint_enroll_introduction_footer.xml
new file mode 100644
index 0000000..17420fe
--- /dev/null
+++ b/res/layout/fingerprint_enroll_introduction_footer.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ 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
+-->
+
+<!-- TODO: Use aapt:attr when it is fixed (b/36809755) -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ style="@style/SuwGlifButtonBar"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
+
+ <Button
+ android:id="@+id/fingerprint_cancel_button"
+ style="@style/SuwGlifButton.Secondary"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/security_settings_fingerprint_enroll_introduction_cancel" />
+
+ <Space
+ android:layout_width="0dp"
+ android:layout_height="0dp"
+ android:layout_weight="1" />
+
+ <Button
+ android:id="@+id/fingerprint_next_button"
+ style="@style/SuwGlifButton.Primary"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/suw_next_button_label" />
+
+</LinearLayout>
diff --git a/res/layout/preference_wallpaper_type.xml b/res/layout/preference_wallpaper_type.xml
deleted file mode 100644
index a35a24e..0000000
--- a/res/layout/preference_wallpaper_type.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2015 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:minHeight="?android:attr/listPreferredItemHeight"
- android:gravity="center_vertical"
- android:paddingStart="?android:attr/listPreferredItemPaddingStart"
- android:paddingEnd="?android:attr/listPreferredItemPaddingEnd" >
-
- <ImageView
- android:id="@android:id/icon"
- android:layout_width="40dp"
- android:layout_height="40dp"
- android:layout_gravity="center"
- android:scaleType="fitXY"
- android:layout_marginEnd="16dip"
- android:contentDescription="@null" />
-
- <TextView android:id="@android:id/title"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:singleLine="true"
- android:textAppearance="@android:style/TextAppearance.Material.Subhead"
- android:ellipsize="marquee"
- android:fadingEdge="horizontal"
- android:layout_weight="1" />
-
-</LinearLayout>
diff --git a/res/layout/redaction_interstitial.xml b/res/layout/redaction_interstitial.xml
index e48f20f..ecc122f 100644
--- a/res/layout/redaction_interstitial.xml
+++ b/res/layout/redaction_interstitial.xml
@@ -22,6 +22,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:icon="@drawable/ic_lock"
+ settings:suwFooter="@layout/redaction_interstitial_footer"
settings:suwHeaderText="@string/lock_screen_notifications_interstitial_title">
<LinearLayout
@@ -69,14 +70,6 @@
</RadioGroup>
- <Button
- android:id="@+id/redaction_done_button"
- style="@style/SetupWizardButton.Positive"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="end"
- android:text="@string/app_notifications_dialog_done" />
-
</LinearLayout>
</com.android.setupwizardlib.GlifLayout>
diff --git a/res/layout/redaction_interstitial_footer.xml b/res/layout/redaction_interstitial_footer.xml
new file mode 100644
index 0000000..1d8758b
--- /dev/null
+++ b/res/layout/redaction_interstitial_footer.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ 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
+-->
+
+<!-- TODO: Use aapt:attr when it is fixed (b/36809755) -->
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ style="@style/SuwGlifButtonBar"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
+
+ <Button
+ android:id="@+id/redaction_done_button"
+ style="@style/SuwGlifButton.Primary"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="end"
+ android:text="@string/app_notifications_dialog_done" />
+
+</FrameLayout>
diff --git a/res/layout/setup_encryption_interstitial_header.xml b/res/layout/setup_encryption_interstitial_header.xml
deleted file mode 100644
index 9601fa8..0000000
--- a/res/layout/setup_encryption_interstitial_header.xml
+++ /dev/null
@@ -1,28 +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.
--->
-
-<TextView xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:gravity="center_vertical"
- android:minHeight="56dp"
- android:paddingBottom="@dimen/suw_description_glif_margin_bottom_lists"
- android:paddingStart="?android:attr/listPreferredItemPaddingStart"
- android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
- android:paddingTop="@dimen/suw_description_glif_margin_top"
- android:lineSpacingExtra="@dimen/suw_description_line_spacing_extra"
- android:textAppearance="?android:attr/textAppearanceListItem" />
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 09f7cda..8173d8a 100755
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -22,6 +22,7 @@
<dimen name="action_bar_switch_padding">16dip</dimen>
<dimen name="app_icon_size">40dip</dimen>
+ <dimen name="min_tap_target_size">48dp</dimen>
<dimen name="screen_margin_sides">64dip</dimen>
<dimen name="screen_margin_top">72dip</dimen>
<dimen name="screen_margin_bottom">48dip</dimen>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 36643d3..ae2eb0a 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1628,6 +1628,8 @@
<string name="wifi_wakeup">Turn on Wi\u2011Fi automatically</string>
<!-- Checkbox summary for option to enable Wi-Fi when high quality saved networks are nearby-->
<string name="wifi_wakeup_summary">Wi\u2011Fi will turn back on near high\u2011quality saved networks, like your home network</string>
+ <!-- Checkbox summary for Wi-Fi wakeup option to explain that Wi-Fi wakeup is disabled because Wi-Fi scanning is turned off -->
+ <string name="wifi_wakeup_summary_scanning_disabled">Unavailable because Wi\u2011Fi scanning is turned off</string>
<!-- Checkbox title for option to toggle poor network detection -->
<string name="wifi_poor_network_detection">Avoid poor connections</string>
<!-- Checkbox summary for option to toggle poor network detection -->
@@ -7055,42 +7057,30 @@
<!-- Encryption interstitial button to continue with the shown setting. Appears on screen that asks the user to opt in/out of encrypting device with a pin/pattern/password. [CHAR LIMIT=NONE] -->
<string name="encryption_continue_button">Continue</string>
- <!-- Message shown on encryption interstitial to ask the user whether or not they want to use a PIN to encrypt the device. [CHAR LIMIT=NONE] -->
- <string name="encryption_interstitial_message_pin">
- You can further protect this device by requiring your PIN before it starts up. Until the device starts up, it can\u2019t receive calls, messages, or notifications, including alarms.
- \n\nThis helps protect data on lost or stolen devices.
+ <!-- Message shown on encryption interstitial to ask the user whether or not they want to use a PIN to encrypt the device. [CHAR LIMIT=NONE] [BACKUP_MESSAGE_ID=2317181134653424679] -->
+ <string name="encryption_interstitial_message_pin">You can further protect this device by requiring your PIN before it starts up. Until the device starts up, it can\u2019t receive calls, messages, or notifications, including alarms.
+ \n\nThis helps protect data on lost or stolen devices. Require PIN to start your device?
</string>
- <!-- Message shown on encryption interstitial to ask the user whether or not they want to use a pattern to encrypt the device. [CHAR LIMIT=NONE] -->
- <string name="encryption_interstitial_message_pattern">
- You can further protect this device by requiring your pattern before it starts up. Until the device starts up, it can\u2019t receive calls, messages, or notifications, including alarms.
- \n\nThis helps protect data on lost or stolen devices.
+ <!-- Message shown on encryption interstitial to ask the user whether or not they want to use a pattern to encrypt the device. [CHAR LIMIT=NONE] [BACKUP_MESSAGE_ID=7081249914068568570] -->
+ <string name="encryption_interstitial_message_pattern">You can further protect this device by requiring your pattern before it starts up. Until the device starts up, it can\u2019t receive calls, messages, or notifications, including alarms.
+ \n\nThis helps protect data on lost or stolen devices. Require pattern to start your device?
</string>
- <!-- Message shown on encryption interstitial to ask the user whether or not they want to use a password to encrypt the device. [CHAR LIMIT=NONE] -->
- <string name="encryption_interstitial_message_password">
- You can further protect this device by requiring your password before it starts up. Until the device starts up, it can\u2019t receive calls, messages, or notifications, including alarms.
- \n\nThis helps protect data on lost or stolen devices.
+ <!-- Message shown on encryption interstitial to ask the user whether or not they want to use a password to encrypt the device. [CHAR LIMIT=NONE] [BACKUP_MESSAGE_ID=7796567133897436443] -->
+ <string name="encryption_interstitial_message_password">You can further protect this device by requiring your password before it starts up. Until the device starts up, it can\u2019t receive calls, messages, or notifications, including alarms.
+ \n\nThis helps protect data on lost or stolen devices. Require password to start your device?
</string>
- <!-- Message shown on encryption interstitial to ask the user whether or not they want to use a PIN to encrypt the device while setting up fingerprint unlock. [CHAR LIMIT=NONE] -->
- <string name="encryption_interstitial_message_pin_for_fingerprint">In addition to using your fingerprint to unlock your device, you can further protect this device by requiring your PIN before it starts up. Until the device starts up, it can\u2019t receive calls, messages, or notifications, including alarms.\n\nThis helps protect data on lost or stolen devices.</string>
- <!-- Message shown on encryption interstitial to ask the user whether or not they want to use a pattern to encrypt the device while setting up fingerprint unlock. [CHAR LIMIT=NONE] -->
- <string name="encryption_interstitial_message_pattern_for_fingerprint">In addition to using your fingerprint to unlock your device, you can further protect this device by requiring your pattern before it starts up. Until the device starts up, it can\u2019t receive calls, messages, or notifications, including alarms.\n\nThis helps protect data on lost or stolen devices.</string>
- <!-- Message shown on encryption interstitial to ask the user whether or not they want to use a password to encrypt the device while setting up fingerprint unlock. [CHAR LIMIT=NONE] -->
- <string name="encryption_interstitial_message_password_for_fingerprint">In addition to using your fingerprint to unlock your device, you can further protect this device by requiring your password before it starts up. Until the device starts up, it can\u2019t receive calls, messages, or notifications, including alarms.\n\nThis helps protect data on lost or stolen devices.</string>
+ <!-- Message shown on encryption interstitial to ask the user whether or not they want to use a PIN to encrypt the device while setting up fingerprint unlock. [CHAR LIMIT=NONE] [BACKUP_MESSAGE_ID=4550632760119547492] -->
+ <string name="encryption_interstitial_message_pin_for_fingerprint">In addition to using your fingerprint to unlock your device, you can further protect this device by requiring your PIN before it starts up. Until the device starts up, it can\u2019t receive calls, messages, or notifications, including alarms.\n\nThis helps protect data on lost or stolen devices. Require PIN to start your device?</string>
+ <!-- Message shown on encryption interstitial to ask the user whether or not they want to use a pattern to encrypt the device while setting up fingerprint unlock. [CHAR LIMIT=NONE] [BACKUP_MESSAGE_ID=932184823193006087] -->
+ <string name="encryption_interstitial_message_pattern_for_fingerprint">In addition to using your fingerprint to unlock your device, you can further protect this device by requiring your pattern before it starts up. Until the device starts up, it can\u2019t receive calls, messages, or notifications, including alarms.\n\nThis helps protect data on lost or stolen devices. Require pattern to start your device?</string>
+ <!-- Message shown on encryption interstitial to ask the user whether or not they want to use a password to encrypt the device while setting up fingerprint unlock. [CHAR LIMIT=NONE] [BACKUP_MESSAGE_ID=5560954719370251702] -->
+ <string name="encryption_interstitial_message_password_for_fingerprint">In addition to using your fingerprint to unlock your device, you can further protect this device by requiring your password before it starts up. Until the device starts up, it can\u2019t receive calls, messages, or notifications, including alarms.\n\nThis helps protect data on lost or stolen devices. Require password to start your device></string>
- <!-- Radio button text that require a PIN to start device [CHAR LIMIT=NONE] -->
- <string name="encrypt_require_pin">Require PIN to start device</string>
- <!-- Radio button text that require a pattern to start device [CHAR LIMIT=NONE] -->
- <string name="encrypt_require_pattern">Require pattern to start device</string>
- <!-- Radio button text that require a password to start device [CHAR LIMIT=NONE] -->
- <string name="encrypt_require_password">Require password to start device</string>
-
- <!-- Radio button text that doesn't require a PIN to decrypt [CHAR LIMIT=NONE] -->
- <string name="encrypt_dont_require_pin">No thanks</string>
- <!-- Radio button text that doesn't require a pattern to decrypt [CHAR LIMIT=NONE] -->
- <string name="encrypt_dont_require_pattern">No thanks</string>
- <!-- Radio button text that doesn't require a password to decrypt [CHAR LIMIT=NONE] -->
- <string name="encrypt_dont_require_password">No thanks</string>
+ <!-- Button label to say yes to the question of whether to require PIN/password/pattern to start your device. [CHAR LIMIT=20] [BACKUP_MESSAGE_ID=4439509435889513411] -->
+ <string name="encryption_interstitial_yes">Yes</string>
+ <!-- Button label to say no to the question of whether to require PIN/password/pattern to start your device. [CHAR LIMIT=20] [BACKUP_MESSAGE_ID=8935031349097025137] -->
+ <string name="encryption_interstitial_no">No</string>
<!-- Title for encryption dialog that disables TalkBack. [CHAR_LIMIT=25] -->
<string name="encrypt_talkback_dialog_require_pin">Require PIN?</string>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index e9d25ff..bae36b3 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -416,7 +416,7 @@
<style name="TextAppearance.EntityHeaderTitle"
parent="@android:style/TextAppearance.Material.Subhead">
<item name="android:textColor">?android:attr/textColorPrimary</item>
- <item name="android:textSize">24sp</item>
+ <item name="android:textSize">16sp</item>
</style>
<style name="AppActionPrimaryButton" parent="android:Widget.Material.Button.Colored"/>
diff --git a/res/xml/configure_notification_settings.xml b/res/xml/configure_notification_settings.xml
index 626cd33..a6ffff4 100644
--- a/res/xml/configure_notification_settings.xml
+++ b/res/xml/configure_notification_settings.xml
@@ -18,6 +18,10 @@
android:title="@string/configure_notification_settings"
android:key="configure_notification_settings">
+ <PreferenceCategory
+ android:key="dashboard_tile_placeholder"
+ android:order="1"/>
+
<!-- Pulse notification light -->
<SwitchPreference
android:key="notification_pulse"
diff --git a/res/xml/security_settings_encryption_interstitial.xml b/res/xml/security_settings_encryption_interstitial.xml
deleted file mode 100644
index 576cbf0..0000000
--- a/res/xml/security_settings_encryption_interstitial.xml
+++ /dev/null
@@ -1,32 +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.
--->
-
-<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
- android:title="@string/lock_settings_picker_title"
- android:key="lock_settings_picker">
-
- <com.android.settings.MultiLinePreference
- android:icon="@drawable/ic_lock_list_icon"
- android:key="encrypt_require_password"
- android:persistent="false"/>
-
- <Preference
- android:icon="@drawable/ic_skip"
- android:key="encrypt_dont_require_password"
- android:persistent="false"/>
-
-</PreferenceScreen>
diff --git a/src/com/android/settings/EncryptionInterstitial.java b/src/com/android/settings/EncryptionInterstitial.java
index 4f24381..42ca516 100644
--- a/src/com/android/settings/EncryptionInterstitial.java
+++ b/src/com/android/settings/EncryptionInterstitial.java
@@ -23,21 +23,18 @@
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
-import android.content.res.Resources;
import android.os.Bundle;
-import android.support.v7.preference.Preference;
-import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.accessibility.AccessibilityManager;
+import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
-import com.android.settings.utils.SettingsDividerItemDecoration;
-import com.android.setupwizardlib.GlifPreferenceLayout;
+import com.android.setupwizardlib.GlifLayout;
import java.util.List;
@@ -78,15 +75,12 @@
}
public static class EncryptionInterstitialFragment extends SettingsPreferenceFragment
- implements DialogInterface.OnClickListener {
+ implements View.OnClickListener, DialogInterface.OnClickListener {
private static final int ACCESSIBILITY_WARNING_DIALOG = 1;
- private static final String KEY_ENCRYPT_REQUIRE_PASSWORD = "encrypt_require_password";
- private static final String KEY_ENCRYPT_DONT_REQUIRE_PASSWORD =
- "encrypt_dont_require_password";
- private Preference mRequirePasswordToDecrypt;
- private Preference mDontRequirePasswordToDecrypt;
+ private View mRequirePasswordToDecrypt;
+ private View mDontRequirePasswordToDecrypt;
private boolean mPasswordRequired;
private Intent mUnlockMethodIntent;
private int mRequestedPasswordQuality;
@@ -97,81 +91,52 @@
}
@Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
+ public View onCreateView(
+ LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ return inflater.inflate(R.layout.encryption_interstitial, container, false);
+ }
- addPreferencesFromResource(R.xml.security_settings_encryption_interstitial);
+ @Override
+ public void onViewCreated(View view, Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
- // Used for testing purposes
- findPreference(KEY_ENCRYPT_DONT_REQUIRE_PASSWORD)
- .setViewId(R.id.encrypt_dont_require_password);
-
- mRequirePasswordToDecrypt = findPreference(KEY_ENCRYPT_REQUIRE_PASSWORD);
- mDontRequirePasswordToDecrypt = findPreference(KEY_ENCRYPT_DONT_REQUIRE_PASSWORD);
+ mRequirePasswordToDecrypt = view.findViewById(R.id.encrypt_require_password);
+ mDontRequirePasswordToDecrypt = view.findViewById(R.id.encrypt_dont_require_password);
boolean forFingerprint = getActivity().getIntent().getBooleanExtra(
ChooseLockSettingsHelper.EXTRA_KEY_FOR_FINGERPRINT, false);
Intent intent = getActivity().getIntent();
mRequestedPasswordQuality = intent.getIntExtra(EXTRA_PASSWORD_QUALITY, 0);
mUnlockMethodIntent = intent.getParcelableExtra(EXTRA_UNLOCK_METHOD_INTENT);
final int msgId;
- final int enableId;
- final int disableId;
switch (mRequestedPasswordQuality) {
case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING:
msgId = forFingerprint ?
R.string.encryption_interstitial_message_pattern_for_fingerprint :
R.string.encryption_interstitial_message_pattern;
- enableId = R.string.encrypt_require_pattern;
- disableId = R.string.encrypt_dont_require_pattern;
break;
case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC:
case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX:
msgId = forFingerprint ?
R.string.encryption_interstitial_message_pin_for_fingerprint :
R.string.encryption_interstitial_message_pin;
- enableId = R.string.encrypt_require_pin;
- disableId = R.string.encrypt_dont_require_pin;
break;
default:
msgId = forFingerprint ?
R.string.encryption_interstitial_message_password_for_fingerprint :
R.string.encryption_interstitial_message_password;
- enableId = R.string.encrypt_require_password;
- disableId = R.string.encrypt_dont_require_password;
break;
}
- TextView message = (TextView) LayoutInflater.from(getActivity()).inflate(
- R.layout.encryption_interstitial_header, null, false);
+ TextView message = (TextView) getActivity().findViewById(R.id.encryption_message);
message.setText(msgId);
- setHeaderView(message);
- mRequirePasswordToDecrypt.setTitle(enableId);
-
- mDontRequirePasswordToDecrypt.setTitle(disableId);
+ mRequirePasswordToDecrypt.setOnClickListener(this);
+ mDontRequirePasswordToDecrypt.setOnClickListener(this);
setRequirePasswordState(getActivity().getIntent().getBooleanExtra(
EXTRA_REQUIRE_PASSWORD, true));
- }
- @Override
- public void onViewCreated(View view, Bundle savedInstanceState) {
- super.onViewCreated(view, savedInstanceState);
- GlifPreferenceLayout layout = (GlifPreferenceLayout) view;
- layout.setDividerItemDecoration(new SettingsDividerItemDecoration(getContext()));
-
- layout.setIcon(getContext().getDrawable(R.drawable.ic_lock));
+ GlifLayout layout = (GlifLayout) view;
layout.setHeaderText(getActivity().getTitle());
-
- // Use the dividers in SetupWizardRecyclerLayout. Suppress the dividers in
- // PreferenceFragment.
- setDivider(null);
- }
-
- @Override
- public RecyclerView onCreateRecyclerView(LayoutInflater inflater, ViewGroup parent,
- Bundle savedInstanceState) {
- GlifPreferenceLayout layout = (GlifPreferenceLayout) parent;
- return layout.onCreateRecyclerView(inflater, parent, savedInstanceState);
}
protected void startLockIntent() {
@@ -194,12 +159,8 @@
}
@Override
- public boolean onPreferenceTreeClick(Preference preference) {
- final String key = preference.getKey();
- if (key == null) {
- return super.onPreferenceTreeClick(preference);
- }
- if (key.equals(KEY_ENCRYPT_REQUIRE_PASSWORD)) {
+ public void onClick(View view) {
+ if (view == mRequirePasswordToDecrypt) {
final boolean accEn = AccessibilityManager.getInstance(getActivity()).isEnabled();
if (accEn && !mPasswordRequired) {
setRequirePasswordState(false); // clear the UI state
@@ -212,7 +173,6 @@
setRequirePasswordState(false);
startLockIntent();
}
- return true;
}
@Override
diff --git a/src/com/android/settings/SettingsPreferenceFragment.java b/src/com/android/settings/SettingsPreferenceFragment.java
index 70743e2..761e8cf 100644
--- a/src/com/android/settings/SettingsPreferenceFragment.java
+++ b/src/com/android/settings/SettingsPreferenceFragment.java
@@ -440,6 +440,7 @@
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+ super.onCreateOptionsMenu(menu, inflater);
if (mHelpUri != null && getActivity() != null) {
HelpUtils.prepareHelpMenuItem(getActivity(), menu, mHelpUri, getClass().getName());
}
diff --git a/src/com/android/settings/SetupChooseLockGeneric.java b/src/com/android/settings/SetupChooseLockGeneric.java
index 61545a6..2c8195d 100644
--- a/src/com/android/settings/SetupChooseLockGeneric.java
+++ b/src/com/android/settings/SetupChooseLockGeneric.java
@@ -17,10 +17,8 @@
package com.android.settings;
import android.app.admin.DevicePolicyManager;
-import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
-import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.os.Bundle;
import android.os.UserHandle;
@@ -120,12 +118,6 @@
data.putExtra(EXTRA_PASSWORD_QUALITY,
lockPatternUtils.getKeyguardStoredPasswordQuality(UserHandle.myUserId()));
- PackageManager packageManager = getPackageManager();
- ComponentName componentName = new ComponentName("com.android.settings",
- "com.android.settings.SetupRedactionInterstitial");
- packageManager.setComponentEnabledSetting(componentName,
- PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
- PackageManager.DONT_KILL_APP);
super.onActivityResult(requestCode, resultCode, data);
}
// If the started activity was cancelled (e.g. the user presses back), then this
diff --git a/src/com/android/settings/SetupChooseLockPassword.java b/src/com/android/settings/SetupChooseLockPassword.java
index f0a9a26..f2c24d0 100644
--- a/src/com/android/settings/SetupChooseLockPassword.java
+++ b/src/com/android/settings/SetupChooseLockPassword.java
@@ -87,6 +87,9 @@
@Override
protected Intent getRedactionInterstitialIntent(Context context) {
+ // Setup wizard's redaction interstitial is deferred to optional step. Enable that
+ // optional step if the lock screen was set up.
+ SetupRedactionInterstitial.setEnabled(context, true);
return null;
}
}
diff --git a/src/com/android/settings/SetupChooseLockPattern.java b/src/com/android/settings/SetupChooseLockPattern.java
index 09b951e..30a3c7c 100644
--- a/src/com/android/settings/SetupChooseLockPattern.java
+++ b/src/com/android/settings/SetupChooseLockPattern.java
@@ -73,6 +73,9 @@
@Override
protected Intent getRedactionInterstitialIntent(Context context) {
+ // Setup wizard's redaction interstitial is deferred to optional step. Enable that
+ // optional step if the lock screen was set up.
+ SetupRedactionInterstitial.setEnabled(context, false);
return null;
}
}
diff --git a/src/com/android/settings/SetupEncryptionInterstitial.java b/src/com/android/settings/SetupEncryptionInterstitial.java
index 59e4d07..4f30cc0 100644
--- a/src/com/android/settings/SetupEncryptionInterstitial.java
+++ b/src/com/android/settings/SetupEncryptionInterstitial.java
@@ -20,15 +20,8 @@
import android.content.Intent;
import android.content.res.Resources;
import android.os.Bundle;
-import android.support.v7.widget.RecyclerView;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
import android.widget.LinearLayout;
-import com.android.settings.utils.SettingsDividerItemDecoration;
-import com.android.setupwizardlib.GlifPreferenceLayout;
-
/**
* Setup Wizard's version of EncryptionInterstitial screen. It inherits the logic and basic
* structure from EncryptionInterstitial class, and should remain similar to that behaviorally. This
@@ -75,29 +68,5 @@
}
public static class SetupEncryptionInterstitialFragment extends EncryptionInterstitialFragment {
-
- @Override
- public void onViewCreated(View view, Bundle savedInstanceState) {
- super.onViewCreated(view, savedInstanceState);
-
- final GlifPreferenceLayout layout = (GlifPreferenceLayout) view;
- layout.setDividerItemDecoration(new SettingsDividerItemDecoration(getContext()));
- layout.setDividerInset(getContext().getResources().getDimensionPixelSize(
- R.dimen.suw_items_glif_icon_divider_inset));
- layout.setIcon(getContext().getDrawable(R.drawable.ic_lock));
-
- layout.setHeaderText(R.string.encryption_interstitial_header);
-
- // Use the dividers in SetupWizardRecyclerLayout. Suppress the dividers in
- // PreferenceFragment.
- setDivider(null);
- }
-
- @Override
- public RecyclerView onCreateRecyclerView(LayoutInflater inflater, ViewGroup parent,
- Bundle savedInstanceState) {
- GlifPreferenceLayout layout = (GlifPreferenceLayout) parent;
- return layout.onCreateRecyclerView(inflater, parent, savedInstanceState);
- }
}
}
diff --git a/src/com/android/settings/SetupRedactionInterstitial.java b/src/com/android/settings/SetupRedactionInterstitial.java
index d527585..321040e 100644
--- a/src/com/android/settings/SetupRedactionInterstitial.java
+++ b/src/com/android/settings/SetupRedactionInterstitial.java
@@ -16,11 +16,11 @@
package com.android.settings;
+import android.content.ComponentName;
+import android.content.Context;
import android.content.Intent;
+import android.content.pm.PackageManager;
import android.content.res.Resources;
-import android.os.Bundle;
-import android.view.View;
-import android.widget.Button;
import com.android.settings.notification.RedactionInterstitial;
@@ -33,6 +33,20 @@
*/
public class SetupRedactionInterstitial extends RedactionInterstitial {
+ /**
+ * Set the enabled state of SetupRedactionInterstitial activity to configure whether it is shown
+ * as part of setup wizard's optional steps.
+ */
+ public static void setEnabled(Context context, boolean enabled) {
+ PackageManager packageManager = context.getPackageManager();
+ ComponentName componentName = new ComponentName(context, SetupRedactionInterstitial.class);
+ packageManager.setComponentEnabledSetting(
+ componentName,
+ enabled ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED
+ : PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
+ PackageManager.DONT_KILL_APP);
+ }
+
@Override
public Intent getIntent() {
Intent modIntent = new Intent(super.getIntent());
diff --git a/src/com/android/settings/accessibility/AccessibilitySettings.java b/src/com/android/settings/accessibility/AccessibilitySettings.java
index ac618d0..1d3e125 100644
--- a/src/com/android/settings/accessibility/AccessibilitySettings.java
+++ b/src/com/android/settings/accessibility/AccessibilitySettings.java
@@ -389,6 +389,7 @@
// Display magnification.
mDisplayMagnificationPreferenceScreen = findPreference(
DISPLAY_MAGNIFICATION_PREFERENCE_SCREEN);
+ configureMagnificationPreferenceIfNeeded(mDisplayMagnificationPreferenceScreen);
// Font size.
mFontSizePreferenceScreen = findPreference(FONT_SIZE_PREFERENCE_SCREEN);
@@ -682,6 +683,19 @@
}
}
+ private static void configureMagnificationPreferenceIfNeeded(Preference preference) {
+ // Some devices support only a single magnification mode. In these cases, we redirect to
+ // the magnification mode's UI directly, rather than showing a PreferenceScreen with a
+ // single list item.
+ final Context context = preference.getContext();
+ if (!MagnificationPreferenceFragment.isApplicable(context.getResources())) {
+ preference.setFragment(ToggleScreenMagnificationPreferenceFragment.class.getName());
+ final Bundle extras = preference.getExtras();
+ MagnificationPreferenceFragment.populateMagnificationGesturesPreferenceExtras(extras,
+ context);
+ }
+ }
+
public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
new BaseSearchIndexProvider() {
@Override
diff --git a/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizard.java b/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizard.java
index 8c76fb7..55b79ba 100644
--- a/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizard.java
+++ b/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizard.java
@@ -18,9 +18,9 @@
import android.accessibilityservice.AccessibilityServiceInfo;
import android.content.ComponentName;
+import android.content.Context;
import android.content.pm.ServiceInfo;
import android.os.Bundle;
-import android.provider.Settings;
import android.support.v7.preference.Preference;
import android.text.TextUtils;
import android.view.accessibility.AccessibilityManager;
@@ -79,6 +79,7 @@
findService(SCREEN_READER_PACKAGE_NAME, SCREEN_READER_SERVICE_NAME));
updateAccessibilityServicePreference(mSelectToSpeakPreference,
findService(SELECT_TO_SPEAK_PACKAGE_NAME, SELECT_TO_SPEAK_SERVICE_NAME));
+ configureMagnificationPreferenceIfNeeded(mDisplayMagnificationPreference);
}
@Override
@@ -145,4 +146,18 @@
}
extras.putString(AccessibilitySettings.EXTRA_SUMMARY, description);
}
+
+ private static void configureMagnificationPreferenceIfNeeded(Preference preference) {
+ // Some devices support only a single magnification mode. In these cases, we redirect to
+ // the magnification mode's UI directly, rather than showing a PreferenceScreen with a
+ // single list item.
+ final Context context = preference.getContext();
+ if (!MagnificationPreferenceFragment.isApplicable(context.getResources())) {
+ preference.setFragment(
+ ToggleScreenMagnificationPreferenceFragmentForSetupWizard.class.getName());
+ final Bundle extras = preference.getExtras();
+ MagnificationPreferenceFragment.populateMagnificationGesturesPreferenceExtras(extras,
+ context);
+ }
+ }
}
diff --git a/src/com/android/settings/accessibility/MagnificationPreferenceFragment.java b/src/com/android/settings/accessibility/MagnificationPreferenceFragment.java
index 22706d7..83299e8 100644
--- a/src/com/android/settings/accessibility/MagnificationPreferenceFragment.java
+++ b/src/com/android/settings/accessibility/MagnificationPreferenceFragment.java
@@ -19,6 +19,7 @@
import android.accessibilityservice.AccessibilityServiceInfo;
import android.content.ComponentName;
import android.content.Context;
+import android.content.res.Resources;
import android.os.Bundle;
import android.provider.SearchIndexableResource;
import android.provider.Settings;
@@ -34,6 +35,7 @@
import com.android.settings.search.Indexable;
import java.util.Arrays;
+import java.util.Collections;
import java.util.List;
public final class MagnificationPreferenceFragment extends SettingsPreferenceFragment implements
@@ -123,18 +125,7 @@
private void handleMagnificationGesturesPreferenceScreenClick() {
Bundle extras = mMagnificationGesturesPreference.getExtras();
- extras.putString(AccessibilitySettings.EXTRA_PREFERENCE_KEY,
- Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED);
- extras.putString(AccessibilitySettings.EXTRA_TITLE, getString(
- R.string.accessibility_screen_magnification_gestures_title));
- extras.putCharSequence(AccessibilitySettings.EXTRA_SUMMARY,
- getActivity().getResources().getText(
- R.string.accessibility_screen_magnification_summary));
- extras.putBoolean(AccessibilitySettings.EXTRA_CHECKED,
- Settings.Secure.getInt(getContentResolver(),
- Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED, 0) == 1);
- extras.putInt(AccessibilitySettings.EXTRA_VIDEO_RAW_RESOURCE_ID,
- R.raw.accessibility_screen_magnification);
+ populateMagnificationGesturesPreferenceExtras(extras, getContext());
extras.putBoolean(AccessibilitySettings.EXTRA_LAUNCHED_FROM_SUW, mLaunchedFromSuw);
}
@@ -188,14 +179,40 @@
return null;
}
+ static void populateMagnificationGesturesPreferenceExtras(Bundle extras, Context context) {
+ extras.putString(AccessibilitySettings.EXTRA_PREFERENCE_KEY,
+ Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED);
+ extras.putString(AccessibilitySettings.EXTRA_TITLE, context.getString(
+ R.string.accessibility_screen_magnification_gestures_title));
+ extras.putCharSequence(AccessibilitySettings.EXTRA_SUMMARY, context.getResources().getText(
+ R.string.accessibility_screen_magnification_summary));
+ extras.putBoolean(AccessibilitySettings.EXTRA_CHECKED,
+ Settings.Secure.getInt(context.getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED, 0) == 1);
+ extras.putInt(AccessibilitySettings.EXTRA_VIDEO_RAW_RESOURCE_ID,
+ R.raw.accessibility_screen_magnification);
+ }
+
+ /**
+ * @return {@code true} if this fragment should be shown, {@code false} otherwise. This
+ * fragment is shown in the case that more than one magnification mode is available.
+ */
+ static boolean isApplicable(Resources res) {
+ return res.getBoolean(com.android.internal.R.bool.config_showNavigationBar);
+ }
+
public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
new BaseSearchIndexProvider() {
@Override
public List<SearchIndexableResource> getXmlResourcesToIndex(Context context,
boolean enabled) {
- final SearchIndexableResource sir = new SearchIndexableResource(context);
- sir.xmlResId = R.xml.accessibility_magnification_settings;
- return Arrays.asList(sir);
+ if (isApplicable(context.getResources())) {
+ final SearchIndexableResource sir = new SearchIndexableResource(context);
+ sir.xmlResId = R.xml.accessibility_magnification_settings;
+ return Arrays.asList(sir);
+ } else {
+ return Collections.emptyList();
+ }
}
};
}
diff --git a/src/com/android/settings/applications/AppAndNotificationDashboardFragment.java b/src/com/android/settings/applications/AppAndNotificationDashboardFragment.java
index 9018d9b..51225aa 100644
--- a/src/com/android/settings/applications/AppAndNotificationDashboardFragment.java
+++ b/src/com/android/settings/applications/AppAndNotificationDashboardFragment.java
@@ -25,6 +25,7 @@
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.search.BaseSearchIndexProvider;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -55,7 +56,13 @@
@Override
protected List<PreferenceController> getPreferenceControllers(Context context) {
- return null;
+ return buildPreferenceControllers(context);
+ }
+
+ private static List<PreferenceController> buildPreferenceControllers(Context context) {
+ final List<PreferenceController> controllers = new ArrayList<>();
+ controllers.add(new SpecialAppAccessPreferenceController(context));
+ return controllers;
}
public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
@@ -67,5 +74,10 @@
sir.xmlResId = R.xml.app_and_notification;
return Arrays.asList(sir);
}
+
+ @Override
+ public List<PreferenceController> getPreferenceControllers(Context context) {
+ return buildPreferenceControllers(context);
+ }
};
}
diff --git a/src/com/android/settings/applications/AppHeaderController.java b/src/com/android/settings/applications/AppHeaderController.java
index f3a086b..29acaa4 100644
--- a/src/com/android/settings/applications/AppHeaderController.java
+++ b/src/com/android/settings/applications/AppHeaderController.java
@@ -18,25 +18,25 @@
import android.annotation.IdRes;
import android.annotation.UserIdInt;
+import android.app.ActionBar;
+import android.app.Activity;
import android.app.Fragment;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.ResolveInfo;
-import android.content.res.Resources;
-import android.graphics.Outline;
-import android.graphics.drawable.AdaptiveIconDrawable;
import android.graphics.drawable.Drawable;
import android.os.UserHandle;
import android.support.annotation.IntDef;
+import android.support.annotation.VisibleForTesting;
import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
-import android.view.ViewOutlineProvider;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
+
import com.android.settings.AppHeader;
import com.android.settings.R;
import com.android.settings.Utils;
@@ -69,7 +69,6 @@
private final Fragment mFragment;
private final int mMetricsCategory;
private final View mAppHeader;
- private final int mIconElevation;
private Drawable mIcon;
private CharSequence mLabel;
@@ -96,8 +95,6 @@
mAppHeader = LayoutInflater.from(fragment.getContext())
.inflate(R.layout.app_details, null /* root */);
}
- mIconElevation = mContext.getResources()
- .getDimensionPixelSize(R.dimen.launcher_icon_elevation);
}
public AppHeaderController setIcon(Drawable icon) {
@@ -164,39 +161,10 @@
}
/**
- * Binds app header view and data from {@code PackageInfo} and {@code AppEntry}.
- */
- public void bindAppHeader(PackageInfo packageInfo, ApplicationsState.AppEntry appEntry) {
- final String versionName = packageInfo == null ? null : packageInfo.versionName;
- final Resources res = mAppHeader.getResources();
-
- // Set Icon
- final ImageView iconView = (ImageView) mAppHeader.findViewById(R.id.app_detail_icon);
- if (appEntry.icon != null) {
- iconView.setImageDrawable(appEntry.icon.getConstantState().newDrawable(res));
- }
-
- // Set application name.
- final TextView labelView = (TextView) mAppHeader.findViewById(R.id.app_detail_title);
- labelView.setText(appEntry.label);
-
- // Version number of application
- final TextView appVersion = (TextView) mAppHeader.findViewById(R.id.app_detail_summary);
-
- if (!TextUtils.isEmpty(versionName)) {
- appVersion.setSelected(true);
- appVersion.setVisibility(View.VISIBLE);
- appVersion.setText(res.getString(R.string.version_text, String.valueOf(versionName)));
- } else {
- appVersion.setVisibility(View.INVISIBLE);
- }
- }
-
- /**
* Done mutating appheader, rebinds everything and return a new {@link LayoutPreference}.
*/
- public LayoutPreference done(Context context) {
- final LayoutPreference pref = new LayoutPreference(context, done());
+ public LayoutPreference done(Activity activity, Context uiContext) {
+ final LayoutPreference pref = new LayoutPreference(uiContext, done(activity));
// Makes sure it's the first preference onscreen.
pref.setOrder(-1000);
pref.setKey(PREF_KEY_APP_HEADER);
@@ -204,17 +172,11 @@
}
/**
- * Done mutating appheader, rebinds everything.
- */
- public View done() {
- return done(true);
- }
-
- /**
* Done mutating appheader, rebinds everything (optionally skip rebinding buttons).
*/
- public View done(boolean rebindActions) {
- ImageView iconView = (ImageView) mAppHeader.findViewById(R.id.app_detail_icon);
+ public View done(Activity activity, boolean rebindActions) {
+ styleActionBar(activity);
+ ImageView iconView = mAppHeader.findViewById(R.id.app_detail_icon);
if (iconView != null) {
iconView.setImageDrawable(mIcon);
ImageView badgeView = mAppHeader.findViewById(R.id.app_icon_instant_apps_badge);
@@ -239,12 +201,39 @@
/**
* Only binds app header with button actions.
*/
- public void bindAppHeaderButtons() {
- ImageButton leftButton = (ImageButton) mAppHeader.findViewById(R.id.left_button);
- ImageButton rightButton = (ImageButton) mAppHeader.findViewById(R.id.right_button);
+ public AppHeaderController bindAppHeaderButtons() {
+ ImageButton leftButton = mAppHeader.findViewById(R.id.left_button);
+ ImageButton rightButton = mAppHeader.findViewById(R.id.right_button);
bindButton(leftButton, mLeftAction);
bindButton(rightButton, mRightAction);
+ return this;
+ }
+
+ public AppHeaderController styleActionBar(Activity activity) {
+ if (activity == null) {
+ Log.w(TAG, "No activity, cannot style actionbar.");
+ return this;
+ }
+ final ActionBar actionBar = activity.getActionBar();
+ if (actionBar == null) {
+ Log.w(TAG, "No actionbar, cannot style actionbar.");
+ return this;
+ }
+ final Drawable appHeaderBackground =
+ mAppHeader.findViewById(R.id.app_snippet).getBackground();
+ actionBar.setBackgroundDrawable(appHeaderBackground);
+ actionBar.setElevation(0);
+
+ return this;
+ }
+
+ /**
+ * Done mutating appheader, rebinds everything.
+ */
+ @VisibleForTesting
+ View done(Activity activity) {
+ return done(activity, true /* rebindActions */);
}
private void bindButton(ImageButton button, @ActionType int action) {
@@ -328,7 +317,7 @@
}
private void setText(@IdRes int id, CharSequence text) {
- TextView textView = (TextView) mAppHeader.findViewById(id);
+ TextView textView = mAppHeader.findViewById(id);
if (textView != null) {
textView.setText(text);
textView.setVisibility(TextUtils.isEmpty(text) ? View.GONE : View.VISIBLE);
diff --git a/src/com/android/settings/applications/AppInfoWithHeader.java b/src/com/android/settings/applications/AppInfoWithHeader.java
index 768a726..2c9599b 100644
--- a/src/com/android/settings/applications/AppInfoWithHeader.java
+++ b/src/com/android/settings/applications/AppInfoWithHeader.java
@@ -16,6 +16,8 @@
package com.android.settings.applications;
+import static com.android.settings.applications.AppHeaderController.ActionType;
+
import android.app.Activity;
import android.os.Bundle;
import android.support.v7.preference.Preference;
@@ -24,8 +26,6 @@
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.applications.AppUtils;
-import static com.android.settings.applications.AppHeaderController.ActionType;
-
public abstract class AppInfoWithHeader extends AppInfoBase {
private boolean mCreated;
@@ -41,16 +41,16 @@
if (mPackageInfo == null) return;
final Activity activity = getActivity();
final Preference pref = FeatureFactory.getFactory(activity)
- .getApplicationFeatureProvider(activity)
- .newAppHeaderController(this, null /* appHeader */)
- .setIcon(mPackageInfo.applicationInfo.loadIcon(mPm))
- .setLabel(mPackageInfo.applicationInfo.loadLabel(mPm))
- .setSummary(mPackageInfo)
- .setIsInstantApp(AppUtils.isInstant(mPackageInfo.applicationInfo))
- .setPackageName(mPackageName)
- .setUid(mPackageInfo.applicationInfo.uid)
- .setButtonActions(ActionType.ACTION_APP_INFO, ActionType.ACTION_NONE)
- .done(getPrefContext());
+ .getApplicationFeatureProvider(activity)
+ .newAppHeaderController(this, null /* appHeader */)
+ .setIcon(mPackageInfo.applicationInfo.loadIcon(mPm))
+ .setLabel(mPackageInfo.applicationInfo.loadLabel(mPm))
+ .setSummary(mPackageInfo)
+ .setIsInstantApp(AppUtils.isInstant(mPackageInfo.applicationInfo))
+ .setPackageName(mPackageName)
+ .setUid(mPackageInfo.applicationInfo.uid)
+ .setButtonActions(ActionType.ACTION_APP_INFO, ActionType.ACTION_NONE)
+ .done(activity, getPrefContext());
getPreferenceScreen().addPreference(pref);
}
}
diff --git a/src/com/android/settings/applications/FetchPackageStorageAsyncLoader.java b/src/com/android/settings/applications/FetchPackageStorageAsyncLoader.java
index 97e5b7b..b39ec3b 100644
--- a/src/com/android/settings/applications/FetchPackageStorageAsyncLoader.java
+++ b/src/com/android/settings/applications/FetchPackageStorageAsyncLoader.java
@@ -19,6 +19,7 @@
import android.annotation.NonNull;
import android.content.Context;
import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager.NameNotFoundException;
import android.os.UserHandle;
import android.util.Log;
@@ -27,6 +28,8 @@
import com.android.settingslib.applications.StorageStatsSource;
import com.android.settingslib.applications.StorageStatsSource.AppStorageStats;
+import java.io.IOException;
+
/**
* Fetches the storage stats using the StorageStatsManager for a given package and user tuple.
*/
@@ -49,7 +52,7 @@
AppStorageStats result = null;
try {
result = mSource.getStatsForPackage(mInfo.volumeUuid, mInfo.packageName, mUser);
- } catch (IllegalStateException e) {
+ } catch (NameNotFoundException | IOException e) {
Log.w(TAG, "Package may have been removed during query, failing gracefully", e);
}
return result;
diff --git a/src/com/android/settings/applications/InstalledAppDetails.java b/src/com/android/settings/applications/InstalledAppDetails.java
index 7510146..09771f2 100755
--- a/src/com/android/settings/applications/InstalledAppDetails.java
+++ b/src/com/android/settings/applications/InstalledAppDetails.java
@@ -16,8 +16,9 @@
package com.android.settings.applications;
+import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
+
import android.Manifest.permission;
-import android.annotation.IdRes;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.AlertDialog;
@@ -115,8 +116,6 @@
import java.util.List;
import java.util.Set;
-import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
-
/**
* Activity to display application information from Settings. This activity presents
* extended information associated with a package like code, data, total size, permissions
@@ -413,12 +412,13 @@
mHeader = (LayoutPreference) findPreference(KEY_HEADER);
mActionButtons = (LayoutPreference) findPreference(KEY_ACTION_BUTTONS);
FeatureFactory.getFactory(activity)
- .getApplicationFeatureProvider(activity)
- .newAppHeaderController(this, mHeader.findViewById(R.id.app_snippet))
- .setPackageName(mPackageName)
- .setButtonActions(AppHeaderController.ActionType.ACTION_STORE_DEEP_LINK,
- AppHeaderController.ActionType.ACTION_APP_PREFERENCE)
- .bindAppHeaderButtons();
+ .getApplicationFeatureProvider(activity)
+ .newAppHeaderController(this, mHeader.findViewById(R.id.app_snippet))
+ .setPackageName(mPackageName)
+ .setButtonActions(AppHeaderController.ActionType.ACTION_STORE_DEEP_LINK,
+ AppHeaderController.ActionType.ACTION_APP_PREFERENCE)
+ .styleActionBar(activity)
+ .bindAppHeaderButtons();
prepareUninstallAndStop();
mNotificationPreference = findPreference(KEY_NOTIFICATION);
@@ -590,7 +590,7 @@
.setIcon(mAppEntry)
.setSummary(summary)
.setIsInstantApp(isInstantApp)
- .done(false /* rebindActions */);
+ .done(activity, false /* rebindActions */);
mVersionPreference.setSummary(getString(R.string.version_text, pkgInfo.versionName));
}
diff --git a/src/com/android/settings/applications/MusicViewHolderController.java b/src/com/android/settings/applications/MusicViewHolderController.java
index 69f8958..1bca26a 100644
--- a/src/com/android/settings/applications/MusicViewHolderController.java
+++ b/src/com/android/settings/applications/MusicViewHolderController.java
@@ -23,15 +23,20 @@
import android.provider.DocumentsContract;
import android.support.annotation.WorkerThread;
import android.text.format.Formatter;
+import android.util.Log;
import com.android.settings.R;
import com.android.settings.Utils;
import com.android.settingslib.applications.StorageStatsSource;
+import java.io.IOException;
+
/**
* MusicViewHolderController controls an Audio/Music file view in the ManageApplications view.
*/
public class MusicViewHolderController implements FileViewHolderController {
+ private static final String TAG = "MusicViewHolderController";
+
private static final String AUTHORITY_MEDIA = "com.android.providers.media.documents";
private Context mContext;
@@ -51,7 +56,12 @@
@Override
@WorkerThread
public void queryStats() {
- mMusicSize = mSource.getExternalStorageStats(mVolumeUuid, mUser).audioBytes;
+ try {
+ mMusicSize = mSource.getExternalStorageStats(mVolumeUuid, mUser).audioBytes;
+ } catch (IOException e) {
+ mMusicSize = 0;
+ Log.w(TAG, e);
+ }
}
@Override
diff --git a/src/com/android/settings/applications/ProcessStatsDetail.java b/src/com/android/settings/applications/ProcessStatsDetail.java
index 9b6f41e..c23da04 100644
--- a/src/com/android/settings/applications/ProcessStatsDetail.java
+++ b/src/com/android/settings/applications/ProcessStatsDetail.java
@@ -16,6 +16,8 @@
package com.android.settings.applications;
+import static com.android.settings.applications.AppHeaderController.ActionType;
+
import android.app.Activity;
import android.app.ActivityManager;
import android.app.ActivityManager.RunningServiceInfo;
@@ -58,8 +60,6 @@
import java.util.HashMap;
import java.util.List;
-import static com.android.settings.applications.AppHeaderController.ActionType;
-
public class ProcessStatsDetail extends SettingsPreferenceFragment {
private static final String TAG = "ProcessStatsDetail";
@@ -137,7 +137,7 @@
? mApp.mUiTargetApp.uid
: UserHandle.USER_NULL)
.setButtonActions(ActionType.ACTION_APP_INFO, ActionType.ACTION_NONE)
- .done(getPrefContext());
+ .done(activity, getPrefContext());
getPreferenceScreen().addPreference(pref);
}
diff --git a/src/com/android/settings/applications/SpecialAppAccessPreferenceController.java b/src/com/android/settings/applications/SpecialAppAccessPreferenceController.java
new file mode 100644
index 0000000..5b05602
--- /dev/null
+++ b/src/com/android/settings/applications/SpecialAppAccessPreferenceController.java
@@ -0,0 +1,49 @@
+/*
+ * 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.applications;
+
+import android.content.Context;
+import android.support.v7.preference.Preference;
+import com.android.settings.R;
+import com.android.settings.core.PreferenceController;
+import com.android.settings.datausage.DataSaverBackend;
+
+public class SpecialAppAccessPreferenceController extends PreferenceController {
+
+ private static final String KEY_SPECIAL_ACCESS = "special_access";
+
+ private DataSaverBackend mDataSaverBackend;
+
+ public SpecialAppAccessPreferenceController(Context context) {
+ super(context);
+ mDataSaverBackend = new DataSaverBackend(context);
+ }
+
+ @Override
+ public boolean isAvailable() {
+ return true;
+ }
+
+ @Override
+ public String getPreferenceKey() {
+ return KEY_SPECIAL_ACCESS;
+ }
+
+ @Override
+ public void updateState(Preference preference) {
+ final int count = mDataSaverBackend.getWhitelistedCount();
+ preference.setSummary(mContext.getResources().getQuantityString(
+ R.plurals.special_access_summary, count, count));
+ }
+}
diff --git a/src/com/android/settings/dashboard/DashboardFragmentRegistry.java b/src/com/android/settings/dashboard/DashboardFragmentRegistry.java
index c65c316..dddfb1b 100644
--- a/src/com/android/settings/dashboard/DashboardFragmentRegistry.java
+++ b/src/com/android/settings/dashboard/DashboardFragmentRegistry.java
@@ -30,6 +30,7 @@
import com.android.settings.fuelgauge.PowerUsageSummary;
import com.android.settings.language.LanguageAndInputSettings;
import com.android.settings.network.NetworkDashboardFragment;
+import com.android.settings.notification.ConfigureNotificationSettings;
import com.android.settings.notification.SoundSettings;
import com.android.settings.system.SystemDashboardFragment;
import com.android.settingslib.drawer.CategoryKey;
@@ -83,6 +84,8 @@
CategoryKey.CATEGORY_SYSTEM_LANGUAGE);
PARENT_TO_CATEGORY_KEY_MAP.put(DevelopmentSettings.class.getName(),
CategoryKey.CATEGORY_SYSTEM_DEVELOPMENT);
+ PARENT_TO_CATEGORY_KEY_MAP.put(ConfigureNotificationSettings.class.getName(),
+ CategoryKey.CATEGORY_NOTIFICATIONS);
CATEGORY_KEY_TO_PARENT_MAP = new ArrayMap<>(PARENT_TO_CATEGORY_KEY_MAP.size());
diff --git a/src/com/android/settings/datausage/AppDataUsage.java b/src/com/android/settings/datausage/AppDataUsage.java
index 0431ce5..e98ca20 100644
--- a/src/com/android/settings/datausage/AppDataUsage.java
+++ b/src/com/android/settings/datausage/AppDataUsage.java
@@ -14,6 +14,8 @@
package com.android.settings.datausage;
+import static android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND;
+
import android.app.Activity;
import android.app.LoaderManager;
import android.content.Context;
@@ -57,8 +59,6 @@
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
-import static android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND;
-
public class AppDataUsage extends DataUsageBase implements Preference.OnPreferenceChangeListener,
DataSaverBackend.Listener {
@@ -362,7 +362,7 @@
.setUid(uid)
.setButtonActions(AppHeaderController.ActionType.ACTION_APP_INFO,
AppHeaderController.ActionType.ACTION_NONE)
- .done(getPrefContext());
+ .done(activity, getPrefContext());
getPreferenceScreen().addPreference(pref);
}
diff --git a/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java b/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java
index b5d7ddf..10df004 100644
--- a/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java
+++ b/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java
@@ -59,7 +59,6 @@
import com.android.settings.Utils;
import com.android.settings.applications.ManageApplications;
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
-import com.android.settings.deletionhelper.AutomaticStorageManagerSettings;
import com.android.settings.deviceinfo.StorageSettings.MountTask;
import com.android.settingslib.deviceinfo.StorageMeasurement;
import com.android.settingslib.deviceinfo.StorageMeasurement.MeasurementDetails;
@@ -126,7 +125,6 @@
private int mItemPoolIndex;
private Preference mExplore;
- private Preference mAutomaticStorageManagement;
private boolean mNeedsUpdate;
@@ -185,7 +183,6 @@
mCurrentUser = mUserManager.getUserInfo(UserHandle.myUserId());
mExplore = buildAction(R.string.storage_menu_explore);
- mAutomaticStorageManagement = buildAction(R.string.storage_menu_manage);
mNeedsUpdate = true;
@@ -212,9 +209,6 @@
screen.removeAll();
- if (getResources().getBoolean(R.bool.config_storage_manager_settings_enabled)) {
- addPreference(screen, mAutomaticStorageManagement);
- }
addPreference(screen, mSummary);
List<UserInfo> allUsers = mUserManager.getUsers();
@@ -331,6 +325,7 @@
private StorageItemPreference buildItem() {
final StorageItemPreference item = new StorageItemPreference(getPrefContext());
+ item.setIcon(R.drawable.empty_icon);
return item;
}
@@ -511,11 +506,6 @@
case R.string.storage_menu_explore: {
intent = mSharedVolume.buildBrowseIntent();
} break;
- case R.string.storage_menu_manage: {
- startFragment(this, AutomaticStorageManagerSettings.class.getCanonicalName(),
- R.string.automatic_storage_manager_settings, 0, null);
- return true;
- }
case 0: {
UserInfoFragment.show(this, pref.getTitle(), pref.getSummary());
return true;
diff --git a/src/com/android/settings/deviceinfo/StorageDashboardFragment.java b/src/com/android/settings/deviceinfo/StorageDashboardFragment.java
index bc64ffa..f7bb95d 100644
--- a/src/com/android/settings/deviceinfo/StorageDashboardFragment.java
+++ b/src/com/android/settings/deviceinfo/StorageDashboardFragment.java
@@ -16,6 +16,7 @@
package com.android.settings.deviceinfo;
+import android.app.Activity;
import android.app.LoaderManager;
import android.content.Context;
import android.content.Intent;
@@ -78,16 +79,15 @@
super.onCreate(icicle);
// Initialize the storage sizes that we can quickly calc.
- final Context context = getActivity();
- StorageManager sm = context.getSystemService(StorageManager.class);
+ final Activity activity = getActivity();
+ StorageManager sm = activity.getSystemService(StorageManager.class);
mVolume = Utils.maybeInitializeVolume(sm, getArguments());
if (mVolume == null) {
- getActivity().finish();
+ activity.finish();
return;
}
- mOptionMenuController = new PrivateVolumeOptionMenuController(
- context, mVolume, new PackageManagerWrapperImpl(context.getPackageManager()));
+ initializeOptionsMenu(activity);
final long sharedDataSize = mVolume.getPath().getTotalSpace();
long totalSize = sm.getPrimaryStorageSize();
@@ -114,6 +114,15 @@
}
}
+ @VisibleForTesting
+ void initializeOptionsMenu(Activity activity) {
+ mOptionMenuController = new PrivateVolumeOptionMenuController(
+ activity, mVolume, new PackageManagerWrapperImpl(activity.getPackageManager()));
+ getLifecycle().addObserver(mOptionMenuController);
+ setHasOptionsMenu(true);
+ activity.invalidateOptionsMenu();
+ }
+
@Override
public void onResume() {
super.onResume();
@@ -156,7 +165,6 @@
new AutomaticStorageManagementSwitchPreferenceController(
context, mMetricsFeatureProvider, getFragmentManager());
getLifecycle().addObserver(asmController);
- getLifecycle().addObserver(mOptionMenuController);
controllers.add(asmController);
return controllers;
}
diff --git a/src/com/android/settings/deviceinfo/storage/StorageAsyncLoader.java b/src/com/android/settings/deviceinfo/storage/StorageAsyncLoader.java
index cf0239d..8652804 100644
--- a/src/com/android/settings/deviceinfo/storage/StorageAsyncLoader.java
+++ b/src/com/android/settings/deviceinfo/storage/StorageAsyncLoader.java
@@ -23,6 +23,7 @@
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.UserInfo;
+import android.content.pm.PackageManager.NameNotFoundException;
import android.os.UserHandle;
import android.util.Log;
import android.util.SparseArray;
@@ -32,6 +33,7 @@
import com.android.settings.utils.AsyncLoader;
import com.android.settingslib.applications.StorageStatsSource;
+import java.io.IOException;
import java.util.List;
/**
@@ -83,7 +85,7 @@
StorageStatsSource.AppStorageStats stats;
try {
stats = mStatsManager.getStatsForPackage(mUuid, app.packageName, myUser);
- } catch (IllegalStateException e) {
+ } catch (NameNotFoundException | IOException e) {
// This may happen if the package was removed during our calculation.
Log.w("App unexpectedly not found", e);
continue;
@@ -122,7 +124,11 @@
}
Log.d(TAG, "Loading external stats");
- result.externalStats = mStatsManager.getExternalStorageStats(mUuid, UserHandle.of(userId));
+ try {
+ result.externalStats = mStatsManager.getExternalStorageStats(mUuid, UserHandle.of(userId));
+ } catch (IOException e) {
+ Log.w(TAG, e);
+ }
Log.d(TAG, "Obtaining result completed");
return result;
}
diff --git a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
index 2f8e28e..0c798a6 100644
--- a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
+++ b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
@@ -17,16 +17,12 @@
package com.android.settings.fuelgauge;
import android.app.Activity;
-import android.app.AlertDialog;
-import android.app.Dialog;
import android.app.admin.DevicePolicyManager;
import android.content.Context;
-import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.BatteryStats;
import android.os.Bundle;
-import android.os.SystemClock;
import android.os.UserHandle;
import android.os.UserManager;
import android.support.annotation.VisibleForTesting;
@@ -179,7 +175,7 @@
@VisibleForTesting
void initHeader() {
final View appSnippet = mHeaderPreference.findViewById(R.id.app_snippet);
- final Context context = getContext();
+ final Activity context = getActivity();
final Bundle bundle = getArguments();
AppHeaderController controller = FeatureFactory.getFactory(context)
.getApplicationFeatureProvider(context)
@@ -203,7 +199,7 @@
controller.setSummary(getString(Utils.getInstallationStatus(mAppEntry.info)));
}
- controller.done(true /* rebindActions */);
+ controller.done(context, true /* rebindActions */);
}
@Override
diff --git a/src/com/android/settings/fuelgauge/BatteryBroadcastReceiver.java b/src/com/android/settings/fuelgauge/BatteryBroadcastReceiver.java
new file mode 100644
index 0000000..9d37333
--- /dev/null
+++ b/src/com/android/settings/fuelgauge/BatteryBroadcastReceiver.java
@@ -0,0 +1,87 @@
+/*
+ * 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 android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.support.annotation.VisibleForTesting;
+
+import com.android.settings.Utils;
+
+/**
+ * Use this broadcastReceiver to listen to the battery change, and it will invoke
+ * {@link OnBatteryChangedListener} if any of the following happens:
+ *
+ * 1. Battery level has been changed
+ * 2. Battery status has been changed
+ */
+public class BatteryBroadcastReceiver extends BroadcastReceiver {
+
+ interface OnBatteryChangedListener {
+ void onBatteryChanged();
+ }
+
+ @VisibleForTesting
+ String mBatteryLevel;
+ @VisibleForTesting
+ String mBatteryStatus;
+ private OnBatteryChangedListener mBatteryListener;
+ private Context mContext;
+
+ public BatteryBroadcastReceiver(Context context) {
+ mContext = context;
+ }
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+ if (mBatteryListener != null && Intent.ACTION_BATTERY_CHANGED.equals(action)
+ && updateBatteryStatus(intent)) {
+ mBatteryListener.onBatteryChanged();
+ }
+ }
+
+ public void setBatteryChangedListener(OnBatteryChangedListener lsn) {
+ mBatteryListener = lsn;
+ }
+
+ public void register() {
+ mContext.registerReceiver(this,
+ new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
+ }
+
+ public void unRegister() {
+ mContext.unregisterReceiver(this);
+ }
+
+ private boolean updateBatteryStatus(Intent intent) {
+ if (intent != null) {
+ String batteryLevel = Utils.getBatteryPercentage(intent);
+ String batteryStatus = Utils.getBatteryStatus(
+ mContext.getResources(), intent);
+ if (!batteryLevel.equals(mBatteryLevel) || !batteryStatus.equals(mBatteryStatus)) {
+ mBatteryLevel = batteryLevel;
+ mBatteryStatus = batteryStatus;
+ return true;
+ }
+ }
+ return false;
+ }
+
+}
\ No newline at end of file
diff --git a/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java b/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java
index a0ebba8..722f4ad 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java
@@ -218,12 +218,14 @@
@VisibleForTesting
boolean shouldHideCategory(PowerUsageData powerUsageData) {
- if (powerUsageData.usageType == UsageType.UNACCOUNTED
- || powerUsageData.usageType == UsageType.OVERCOUNTED) {
- return true;
- }
+ return powerUsageData.usageType == UsageType.UNACCOUNTED
+ || powerUsageData.usageType == UsageType.OVERCOUNTED
+ || (powerUsageData.usageType == UsageType.USER && mUserManager.getUserCount() == 1);
+ }
- return false;
+ @VisibleForTesting
+ boolean shouldShowBatterySipper(BatterySipper batterySipper) {
+ return batterySipper.drainType != DrainType.SCREEN;
}
@VisibleForTesting
@@ -245,7 +247,9 @@
BatteryUtils.StatusType.FOREGROUND, sipper.uidObj, STATUS_TYPE);
}
usageData.totalUsageTimeMs += sipper.usageTimeMs;
- usageData.usageList.add(sipper);
+ if (shouldShowBatterySipper(sipper)) {
+ usageData.usageList.add(sipper);
+ }
}
final List<PowerUsageData> batteryDataList = new ArrayList<>(batteryDataMap.values());
@@ -309,6 +313,10 @@
void setPowerUsageFeatureProvider(PowerUsageFeatureProvider provider) {
mPowerUsageFeatureProvider = provider;
}
+ @VisibleForTesting
+ void setUserManager(UserManager userManager) {
+ mUserManager = userManager;
+ }
/**
* Class that contains data used in {@link PowerGaugePreference}.
diff --git a/src/com/android/settings/fuelgauge/PowerUsageBase.java b/src/com/android/settings/fuelgauge/PowerUsageBase.java
index 0236a30..1d9a228 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageBase.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageBase.java
@@ -45,9 +45,7 @@
protected BatteryStatsHelper mStatsHelper;
protected UserManager mUm;
-
- private String mBatteryLevel;
- private String mBatteryStatus;
+ private BatteryBroadcastReceiver mBatteryBroadcastReceiver;
@Override
public void onAttach(Activity activity) {
@@ -61,6 +59,13 @@
super.onCreate(icicle);
mStatsHelper.create(icicle);
setHasOptionsMenu(true);
+
+ mBatteryBroadcastReceiver = new BatteryBroadcastReceiver(getContext());
+ mBatteryBroadcastReceiver.setBatteryChangedListener(() -> {
+ if (!mHandler.hasMessages(MSG_REFRESH_STATS)) {
+ mHandler.sendEmptyMessageDelayed(MSG_REFRESH_STATS, 500);
+ }
+ });
}
@Override
@@ -73,8 +78,7 @@
public void onResume() {
super.onResume();
BatteryStatsHelper.dropFile(getActivity(), BatteryHistoryDetail.BATTERY_HISTORY_FILE);
- updateBatteryStatus(getActivity().registerReceiver(mBatteryInfoReceiver,
- new IntentFilter(Intent.ACTION_BATTERY_CHANGED)));
+ mBatteryBroadcastReceiver.register();
if (mHandler.hasMessages(MSG_REFRESH_STATS)) {
mHandler.removeMessages(MSG_REFRESH_STATS);
mStatsHelper.clearStats();
@@ -84,7 +88,7 @@
@Override
public void onPause() {
super.onPause();
- getActivity().unregisterReceiver(mBatteryInfoReceiver);
+ mBatteryBroadcastReceiver.unRegister();
}
@Override
@@ -109,20 +113,6 @@
historyPref.setStats(mStatsHelper);
}
- private boolean updateBatteryStatus(Intent intent) {
- if (intent != null) {
- String batteryLevel = com.android.settings.Utils.getBatteryPercentage(intent);
- String batteryStatus = com.android.settings.Utils.getBatteryStatus(getResources(),
- intent);
- if (!batteryLevel.equals(mBatteryLevel) || !batteryStatus.equals(mBatteryStatus)) {
- mBatteryLevel = batteryLevel;
- mBatteryStatus = batteryStatus;
- return true;
- }
- }
- return false;
- }
-
static final int MSG_REFRESH_STATS = 100;
private final Handler mHandler = new Handler() {
@@ -137,17 +127,4 @@
}
};
- private BroadcastReceiver mBatteryInfoReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- String action = intent.getAction();
- if (Intent.ACTION_BATTERY_CHANGED.equals(action)
- && updateBatteryStatus(intent)) {
- if (!mHandler.hasMessages(MSG_REFRESH_STATS)) {
- mHandler.sendEmptyMessageDelayed(MSG_REFRESH_STATS, 500);
- }
- }
- }
- };
-
}
diff --git a/src/com/android/settings/fuelgauge/PowerUsageSummary.java b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
index ac041b8..5f12d7c 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageSummary.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
@@ -683,22 +683,28 @@
private static class SummaryProvider implements SummaryLoader.SummaryProvider {
private final Context mContext;
private final SummaryLoader mLoader;
+ private final BatteryBroadcastReceiver mBatteryBroadcastReceiver;
private SummaryProvider(Context context, SummaryLoader loader) {
mContext = context;
mLoader = loader;
- }
-
- @Override
- public void setListening(boolean listening) {
- if (listening) {
- // TODO: Listen.
+ mBatteryBroadcastReceiver = new BatteryBroadcastReceiver(mContext);
+ mBatteryBroadcastReceiver.setBatteryChangedListener(() -> {
BatteryInfo.getBatteryInfo(mContext, new BatteryInfo.Callback() {
@Override
public void onBatteryInfoLoaded(BatteryInfo info) {
mLoader.setSummary(SummaryProvider.this, info.chargeLabelString);
}
});
+ });
+ }
+
+ @Override
+ public void setListening(boolean listening) {
+ if (listening) {
+ mBatteryBroadcastReceiver.register();
+ } else {
+ mBatteryBroadcastReceiver.unRegister();
}
}
}
diff --git a/src/com/android/settings/notification/AppNotificationSettings.java b/src/com/android/settings/notification/AppNotificationSettings.java
index 92e11b4..4b060cb 100644
--- a/src/com/android/settings/notification/AppNotificationSettings.java
+++ b/src/com/android/settings/notification/AppNotificationSettings.java
@@ -49,7 +49,6 @@
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
-import java.util.Objects;
/** These settings are per app, so should not be returned in global search results. */
public class AppNotificationSettings extends NotificationSettingsBase {
@@ -109,8 +108,9 @@
}
}.execute();
- final Preference pref = FeatureFactory.getFactory(getActivity())
- .getApplicationFeatureProvider(getActivity())
+ final Activity activity = getActivity();
+ final Preference pref = FeatureFactory.getFactory(activity)
+ .getApplicationFeatureProvider(activity)
.newAppHeaderController(this /* fragment */, null /* appHeader */)
.setIcon(mAppRow.icon)
.setLabel(mAppRow.label)
@@ -118,7 +118,7 @@
.setUid(mAppRow.uid)
.setButtonActions(AppHeaderController.ActionType.ACTION_APP_INFO,
AppHeaderController.ActionType.ACTION_NOTIF_PREFERENCE)
- .done(getPrefContext());
+ .done(activity, getPrefContext());
getPreferenceScreen().addPreference(pref);
if (mUid < 0 || TextUtils.isEmpty(mPkg) || mPkgInfo == null) {
diff --git a/src/com/android/settings/notification/ChannelNotificationSettings.java b/src/com/android/settings/notification/ChannelNotificationSettings.java
index 2b7a6d0..8ba5b8b 100644
--- a/src/com/android/settings/notification/ChannelNotificationSettings.java
+++ b/src/com/android/settings/notification/ChannelNotificationSettings.java
@@ -21,6 +21,7 @@
import static android.app.NotificationManager.IMPORTANCE_MIN;
import static android.app.NotificationManager.IMPORTANCE_NONE;
+import android.app.Activity;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
@@ -111,8 +112,9 @@
setupBlockAndImportance();
updateDependents();
}
- final Preference pref = FeatureFactory.getFactory(getActivity())
- .getApplicationFeatureProvider(getActivity())
+ final Activity activity = getActivity();
+ final Preference pref = FeatureFactory.getFactory(activity)
+ .getApplicationFeatureProvider(activity)
.newAppHeaderController(this /* fragment */, null /* appHeader */)
.setIcon(mAppRow.icon)
.setLabel(mChannel.getName())
@@ -121,7 +123,7 @@
.setUid(mAppRow.uid)
.setButtonActions(AppHeaderController.ActionType.ACTION_APP_INFO,
AppHeaderController.ActionType.ACTION_NOTIF_PREFERENCE)
- .done(getPrefContext());
+ .done(activity, getPrefContext());
getPreferenceScreen().addPreference(pref);
if (mAppRow.settingsIntent != null) {
diff --git a/src/com/android/settings/notification/RedactionInterstitial.java b/src/com/android/settings/notification/RedactionInterstitial.java
index 08474a0..b269062 100644
--- a/src/com/android/settings/notification/RedactionInterstitial.java
+++ b/src/com/android/settings/notification/RedactionInterstitial.java
@@ -16,7 +16,11 @@
package com.android.settings.notification;
-import android.app.admin.DevicePolicyManager;
+import static android.app.admin.DevicePolicyManager.KEYGUARD_DISABLE_SECURE_NOTIFICATIONS;
+import static android.app.admin.DevicePolicyManager.KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS;
+
+import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
+
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
@@ -26,7 +30,6 @@
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
-import android.widget.CompoundButton;
import android.widget.LinearLayout;
import android.widget.RadioButton;
import android.widget.RadioGroup;
@@ -34,18 +37,13 @@
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R;
-import com.android.settings.RestrictedCheckBox;
import com.android.settings.RestrictedRadioButton;
import com.android.settings.SettingsActivity;
import com.android.settings.SettingsPreferenceFragment;
+import com.android.settings.SetupRedactionInterstitial;
import com.android.settings.Utils;
import com.android.settingslib.RestrictedLockUtils;
-import static android.app.admin.DevicePolicyManager.KEYGUARD_DISABLE_SECURE_NOTIFICATIONS;
-import static android.app.admin.DevicePolicyManager.KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS;
-
-import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
-
public class RedactionInterstitial extends SettingsActivity {
@Override
@@ -128,6 +126,7 @@
@Override
public void onClick(View v) {
if (v.getId() == R.id.redaction_done_button) {
+ SetupRedactionInterstitial.setEnabled(getContext(), false);
final RedactionInterstitial activity = (RedactionInterstitial) getActivity();
if (activity != null) {
activity.setResult(RESULT_OK, null);
diff --git a/src/com/android/settings/wallpaper/WallpaperTypeSettings.java b/src/com/android/settings/wallpaper/WallpaperTypeSettings.java
index 6efdcf72..bef4777 100644
--- a/src/com/android/settings/wallpaper/WallpaperTypeSettings.java
+++ b/src/com/android/settings/wallpaper/WallpaperTypeSettings.java
@@ -67,7 +67,6 @@
// Add Preference items for each of the matching activities
for (ResolveInfo info : rList) {
Preference pref = new Preference(getPrefContext());
- pref.setLayoutResource(R.layout.preference_wallpaper_type);
Intent prefIntent = new Intent(intent);
prefIntent.setComponent(new ComponentName(
info.activityInfo.packageName, info.activityInfo.name));
diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java
index 38f5a43..01551da 100644
--- a/src/com/android/settings/wifi/WifiSettings.java
+++ b/src/com/android/settings/wifi/WifiSettings.java
@@ -90,6 +90,7 @@
WifiDialog.WifiDialogListener {
private static final String TAG = "WifiSettings";
+ private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
/* package */ static final int MENU_ID_WPS_PBC = Menu.FIRST;
private static final int MENU_ID_WPS_PIN = Menu.FIRST + 1;
@@ -203,6 +204,9 @@
mConfigureWifiSettingsPreference = findPreference(PREF_KEY_CONFIGURE_WIFI_SETTINGS);
mSavedNetworksPreference = findPreference(PREF_KEY_SAVED_NETWORKS);
+ // Hide additional settings until access points are shown during onStart
+ showAdditionalSettings(false);
+
Context prefContext = getPrefContext();
mAddPreference = new Preference(prefContext);
mAddPreference.setIcon(R.drawable.ic_menu_add_inset);
@@ -220,6 +224,17 @@
mBgThread.start();
}
+ // TODO(b/37429702): Figure out how to temporarily disable animations during startup and remove
+ // this method.
+ private void showAdditionalSettings(boolean visible) {
+ mAdditionalSettingsPreferenceCategory.setVisible(visible);
+ mAdditionalSettingsPreferenceCategory.removeAll();
+ if (visible) {
+ mAdditionalSettingsPreferenceCategory.addPreference(mConfigureWifiSettingsPreference);
+ mAdditionalSettingsPreferenceCategory.addPreference(mSavedNetworksPreference);
+ }
+ }
+
@Override
public void onDestroy() {
mBgThread.quit();
@@ -335,6 +350,17 @@
mWifiEnabler = createWifiEnabler();
mWifiTracker.startTracking();
+
+ if (!isUiRestricted() && mWifiManager.isWifiEnabled()) {
+ setProgressBarVisible(true);
+ mWifiTracker.forceUpdate();
+ if (DEBUG) Log.d(TAG, "WifiSettings onStart APs: " + mWifiTracker.getAccessPoints());
+
+ getView().removeCallbacks(mUpdateAccessPointsRunnable);
+ updateAccessPointPreferences();
+ }
+
+ showAdditionalSettings(true);
}
/**
@@ -353,8 +379,6 @@
if (mWifiEnabler != null) {
mWifiEnabler.resume(activity);
}
-
- activity.invalidateOptionsMenu();
}
@Override
@@ -370,6 +394,7 @@
mWifiTracker.stopTracking();
getView().removeCallbacks(mUpdateAccessPointsRunnable);
getView().removeCallbacks(mHideProgressBarRunnable);
+ showAdditionalSettings(false);
super.onStop();
}
@@ -733,7 +758,7 @@
removeCachedPrefs(mAccessPointsPreferenceCategory);
mAddPreference.setOrder(index);
mAccessPointsPreferenceCategory.addPreference(mAddPreference);
- setConfigureWifiSettingsVisibility();
+ setAdditionalSettingsSummaries();
if (!hasAvailableAccessPoints) {
setProgressBarVisible(true);
@@ -812,8 +837,8 @@
// in the Wifi Network Details Fragment
pref.getAccessPoint().saveWifiState(pref.getExtras());
pref.setFragment(WifiNetworkDetailsFragment.class.getName());
-
pref.refresh();
+
mConnectedAccessPointPreferenceCategory.addPreference(pref);
mConnectedAccessPointPreferenceCategory.setVisible(true);
}
@@ -824,7 +849,7 @@
mConnectedAccessPointPreferenceCategory.setVisible(false);
}
- private void setConfigureWifiSettingsVisibility() {
+ private void setAdditionalSettingsSummaries() {
mAdditionalSettingsPreferenceCategory.addPreference(mConfigureWifiSettingsPreference);
boolean wifiWakeupEnabled = Settings.Global.getInt(
getContentResolver(), Settings.Global.WIFI_WAKEUP_ENABLED, 0) == 1;
diff --git a/src/com/android/settings/wifi/WifiWakeupPreferenceController.java b/src/com/android/settings/wifi/WifiWakeupPreferenceController.java
index 122e524..2c33fc5 100644
--- a/src/com/android/settings/wifi/WifiWakeupPreferenceController.java
+++ b/src/com/android/settings/wifi/WifiWakeupPreferenceController.java
@@ -26,6 +26,7 @@
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceScreen;
import android.text.TextUtils;
+import com.android.settings.R;
import com.android.settings.core.PreferenceController;
import com.android.settings.core.lifecycle.Lifecycle;
@@ -97,10 +98,20 @@
return;
}
final SwitchPreference enableWifiWakeup = (SwitchPreference) preference;
+
enableWifiWakeup.setChecked(Settings.Global.getInt(mContext.getContentResolver(),
Settings.Global.WIFI_WAKEUP_ENABLED, 0) == 1);
- enableWifiWakeup.setEnabled(Settings.Global.getInt(mContext.getContentResolver(),
- Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED, 0) == 1);
+
+ boolean wifiScanningEnabled = Settings.Global.getInt(mContext.getContentResolver(),
+ Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE, 0) == 1;
+ boolean networkRecommendationsEnabled = Settings.Global.getInt(
+ mContext.getContentResolver(),
+ Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED, 0) == 1;
+ enableWifiWakeup.setEnabled(networkRecommendationsEnabled && wifiScanningEnabled);
+
+ enableWifiWakeup.setSummary(wifiScanningEnabled ?
+ R.string.wifi_wakeup_summary :
+ R.string.wifi_wakeup_summary_scanning_disabled);
}
class SettingObserver extends ContentObserver {
diff --git a/tests/app/src/com/android/settings/EncryptionInterstitialTest.java b/tests/app/src/com/android/settings/EncryptionInterstitialTest.java
index 6487818..f30d511 100644
--- a/tests/app/src/com/android/settings/EncryptionInterstitialTest.java
+++ b/tests/app/src/com/android/settings/EncryptionInterstitialTest.java
@@ -16,38 +16,89 @@
package com.android.settings;
+import static android.support.test.espresso.Espresso.onView;
+import static android.support.test.espresso.action.ViewActions.click;
+import static android.support.test.espresso.matcher.ViewMatchers.withId;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import android.app.Activity;
import android.app.Instrumentation;
+import android.app.Instrumentation.ActivityMonitor;
+import android.app.Instrumentation.ActivityResult;
import android.content.Context;
import android.content.Intent;
import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
+import android.support.test.filters.MediumTest;
import android.support.test.runner.AndroidJUnit4;
+import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import static android.support.test.espresso.Espresso.onView;
-import static android.support.test.espresso.matcher.ViewMatchers.withId;
-
@RunWith(AndroidJUnit4.class)
-@SmallTest
+@MediumTest
public class EncryptionInterstitialTest {
private Instrumentation mInstrumentation;
private Context mContext;
+ private TestActivityMonitor mActivityMonitor;
@Before
public void setUp() {
mInstrumentation = InstrumentationRegistry.getInstrumentation();
mContext = mInstrumentation.getTargetContext();
+ mActivityMonitor = new TestActivityMonitor();
+ mInstrumentation.addMonitor(mActivityMonitor);
+ }
+
+ @After
+ public void tearDown() {
+ mInstrumentation.removeMonitor(mActivityMonitor);
}
@Test
- public void clickHeader_shouldNotCrash() {
+ public void clickYes_shouldRequirePassword() {
mInstrumentation.startActivitySync(
- new Intent().setClassName(mContext, EncryptionInterstitial.class.getName()));
- onView(withId(R.id.encryption_interstitial_header));
- // Nothing should happen
+ new Intent(mContext, EncryptionInterstitial.class)
+ .putExtra("extra_unlock_method_intent", new Intent("test.unlock.intent")));
+ onView(withId(R.id.encrypt_require_password)).perform(click());
+
+ mActivityMonitor.waitForActivityWithTimeout(1000);
+ assertEquals(1, mActivityMonitor.getHits());
+
+ assertTrue(mActivityMonitor.mMatchedIntent.getBooleanExtra(
+ EncryptionInterstitial.EXTRA_REQUIRE_PASSWORD, false));
+ }
+
+ @Test
+ public void clickNo_shouldNotRequirePassword() {
+ mInstrumentation.startActivitySync(
+ new Intent(mContext, EncryptionInterstitial.class)
+ .putExtra("extra_unlock_method_intent", new Intent("test.unlock.intent")));
+ onView(withId(R.id.encrypt_dont_require_password)).perform(click());
+
+ mActivityMonitor.waitForActivityWithTimeout(1000);
+ assertEquals(1, mActivityMonitor.getHits());
+
+ assertFalse(mActivityMonitor.mMatchedIntent.getBooleanExtra(
+ EncryptionInterstitial.EXTRA_REQUIRE_PASSWORD, true));
+ }
+
+ private static class TestActivityMonitor extends ActivityMonitor {
+
+ Intent mMatchedIntent = null;
+
+ @Override
+ public ActivityResult onMatchIntent(Intent intent) {
+ if ("test.unlock.intent".equals(intent.getAction())) {
+ mMatchedIntent = intent;
+ return new ActivityResult(Activity.RESULT_OK, null);
+ }
+ return null;
+ }
}
}
diff --git a/tests/robotests/src/com/android/settings/applications/AppHeaderControllerTest.java b/tests/robotests/src/com/android/settings/applications/AppHeaderControllerTest.java
index 0d878ed..030978f 100644
--- a/tests/robotests/src/com/android/settings/applications/AppHeaderControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/AppHeaderControllerTest.java
@@ -17,6 +17,15 @@
package com.android.settings.applications;
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyInt;
+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.ActionBar;
import android.app.Activity;
import android.app.Fragment;
import android.content.Context;
@@ -24,6 +33,7 @@
import android.content.pm.ActivityInfo;
import android.content.pm.PackageInfo;
import android.content.pm.ResolveInfo;
+import android.graphics.drawable.Drawable;
import android.os.UserHandle;
import android.support.v7.preference.Preference;
import android.view.LayoutInflater;
@@ -34,7 +44,6 @@
import com.android.settings.R;
import com.android.settings.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig;
-import com.android.settingslib.applications.ApplicationsState;
import org.junit.Before;
import org.junit.Test;
@@ -45,14 +54,6 @@
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
-import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyInt;
-import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
@RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class AppHeaderControllerTest {
@@ -60,11 +61,9 @@
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
private Context mContext;
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
- private ApplicationsState.AppEntry mAppEntry;
+ private Activity mActivity;
@Mock
private Fragment mFragment;
- @Mock
- private View mAppHeader;
private Context mShadowContext;
private LayoutInflater mLayoutInflater;
@@ -85,7 +84,7 @@
@Test
public void testBuildView_constructedWithoutView_shouldCreateNewView() {
mController = new AppHeaderController(mShadowContext, mFragment, null);
- View view = mController.done();
+ View view = mController.done(mActivity);
assertThat(view).isNotNull();
}
@@ -93,7 +92,7 @@
@Test
public void testBuildView_withContext_shouldBuildPreference() {
mController = new AppHeaderController(mShadowContext, mFragment, null);
- Preference preference = mController.done(mShadowContext);
+ Preference preference = mController.done(mActivity, mShadowContext);
assertThat(preference instanceof LayoutPreference).isTrue();
}
@@ -102,7 +101,7 @@
public void testBuildView_constructedWithView_shouldReturnSameView() {
View inputView = mLayoutInflater.inflate(R.layout.app_details, null /* root */);
mController = new AppHeaderController(mShadowContext, mFragment, inputView);
- View view = mController.done();
+ View view = mController.done(mActivity);
assertThat(view).isSameAs(inputView);
}
@@ -111,14 +110,14 @@
public void bindViews_shouldBindAllData() {
final String testString = "test";
final View appHeader = mLayoutInflater.inflate(R.layout.app_details, null /* root */);
- final TextView label = (TextView) appHeader.findViewById(R.id.app_detail_title);
- final TextView version = (TextView) appHeader.findViewById(R.id.app_detail_summary);
+ final TextView label = appHeader.findViewById(R.id.app_detail_title);
+ final TextView version = appHeader.findViewById(R.id.app_detail_summary);
mController = new AppHeaderController(mShadowContext, mFragment, appHeader);
mController.setLabel(testString);
mController.setSummary(testString);
mController.setIcon(mShadowContext.getDrawable(R.drawable.ic_add));
- mController.done();
+ mController.done(mActivity);
assertThat(label.getText()).isEqualTo(testString);
assertThat(version.getText()).isEqualTo(testString);
@@ -139,7 +138,7 @@
mController.setButtonActions(
AppHeaderController.ActionType.ACTION_APP_PREFERENCE,
AppHeaderController.ActionType.ACTION_NONE);
- mController.done();
+ mController.done(mActivity);
assertThat(appLinks.findViewById(R.id.left_button).getVisibility())
.isEqualTo(View.VISIBLE);
@@ -164,7 +163,7 @@
mController.setButtonActions(
AppHeaderController.ActionType.ACTION_APP_PREFERENCE,
AppHeaderController.ActionType.ACTION_NONE);
- mController.done();
+ mController.done(mActivity);
assertThat(appLinks.findViewById(R.id.left_button).getVisibility())
.isEqualTo(View.GONE);
@@ -183,7 +182,7 @@
mController.setButtonActions(
AppHeaderController.ActionType.ACTION_STORE_DEEP_LINK,
AppHeaderController.ActionType.ACTION_NONE);
- mController.done();
+ mController.done(mActivity);
assertThat(appLinks.findViewById(R.id.left_button).getVisibility())
.isEqualTo(View.GONE);
@@ -201,7 +200,7 @@
.setButtonActions(
AppHeaderController.ActionType.ACTION_APP_INFO,
AppHeaderController.ActionType.ACTION_NONE);
- mController.done();
+ mController.done(mActivity);
assertThat(appLinks.findViewById(R.id.left_button).getVisibility())
.isEqualTo(View.GONE);
@@ -221,7 +220,7 @@
.setButtonActions(
AppHeaderController.ActionType.ACTION_APP_INFO,
AppHeaderController.ActionType.ACTION_NOTIF_PREFERENCE);
- mController.done();
+ mController.done(mActivity);
assertThat(appLinks.findViewById(R.id.left_button).getVisibility())
.isEqualTo(View.VISIBLE);
@@ -242,7 +241,7 @@
.setButtonActions(
AppHeaderController.ActionType.ACTION_APP_INFO,
AppHeaderController.ActionType.ACTION_NOTIF_PREFERENCE);
- mController.done();
+ mController.done(mActivity);
assertThat(appLinks.findViewById(R.id.left_button).getContentDescription())
.isEqualTo("App Info");
@@ -258,7 +257,7 @@
.setButtonActions(
AppHeaderController.ActionType.ACTION_NOTIF_PREFERENCE,
AppHeaderController.ActionType.ACTION_NONE);
- mController.done();
+ mController.done(mActivity);
assertThat(appLinks.findViewById(R.id.left_button).getVisibility())
.isEqualTo(View.VISIBLE);
@@ -272,7 +271,7 @@
public void instantApps_normalAppsDontGetLabel() {
final View appHeader = mLayoutInflater.inflate(R.layout.app_details, null /* root */);
mController = new AppHeaderController(mContext, mFragment, appHeader);
- mController.done();
+ mController.done(mActivity);
assertThat(appHeader.findViewById(R.id.install_type).getVisibility())
.isEqualTo(View.GONE);
}
@@ -283,7 +282,7 @@
public void instantApps_normalAppsDontGetInstantAppsBadge() {
final View appHeader = mLayoutInflater.inflate(R.layout.app_details, null /* root */);
mController = new AppHeaderController(mContext, mFragment, appHeader);
- mController.done();
+ mController.done(mActivity);
assertThat(appHeader.findViewById(R.id.app_icon_instant_apps_badge).getVisibility())
.isEqualTo(View.GONE);
}
@@ -294,8 +293,8 @@
final View appHeader = mLayoutInflater.inflate(R.layout.app_details, null /* root */);
mController = new AppHeaderController(mContext, mFragment, appHeader);
mController.setIsInstantApp(true);
- mController.done();
- TextView label = (TextView)appHeader.findViewById(R.id.install_type);
+ mController.done(mActivity);
+ TextView label = appHeader.findViewById(R.id.install_type);
ImageView badgeView = appHeader.findViewById(R.id.app_icon_instant_apps_badge);
assertThat(badgeView.getVisibility()).isEqualTo(View.VISIBLE);
assertThat(label.getVisibility()).isEqualTo(View.VISIBLE);
@@ -306,6 +305,29 @@
}
@Test
+ public void styleActionBar_invalidObjects_shouldNotCrash() {
+ mController = new AppHeaderController(mShadowContext, mFragment, null);
+ mController.styleActionBar(null);
+
+ when(mActivity.getActionBar()).thenReturn(null);
+ mController.styleActionBar(mActivity);
+
+ verify(mActivity).getActionBar();
+ }
+
+ @Test
+ public void styleActionBar_setElevationAndBackground() {
+ final ActionBar actionBar = mActivity.getActionBar();
+
+ mController = new AppHeaderController(mShadowContext, mFragment, null);
+ mController.styleActionBar(mActivity);
+
+ verify(actionBar).setElevation(0);
+ verify(actionBar).setBackgroundDrawable(any(Drawable.class));
+ }
+
+
+ @Test
public void initAppHeaderController_appHeaderNull_useFragmentContext() {
mController = new AppHeaderController(mContext, mFragment, null);
diff --git a/tests/robotests/src/com/android/settings/applications/FetchPackageStorageAsyncLoaderTest.java b/tests/robotests/src/com/android/settings/applications/FetchPackageStorageAsyncLoaderTest.java
index 04eeb02..36116c0 100644
--- a/tests/robotests/src/com/android/settings/applications/FetchPackageStorageAsyncLoaderTest.java
+++ b/tests/robotests/src/com/android/settings/applications/FetchPackageStorageAsyncLoaderTest.java
@@ -40,6 +40,8 @@
import org.mockito.MockitoAnnotations;
import org.robolectric.annotation.Config;
+import java.io.IOException;
+
@RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class FetchPackageStorageAsyncLoaderTest {
@@ -56,7 +58,7 @@
}
@Test
- public void worksForValidPackageNameAndUid() {
+ public void worksForValidPackageNameAndUid() throws Exception {
AppStorageStats stats = mock(AppStorageStats.class);
when(stats.getCodeBytes()).thenReturn(1L);
when(stats.getDataBytes()).thenReturn(2L);
@@ -72,9 +74,9 @@
}
@Test
- public void installerExceptionHandledCleanly() {
+ public void installerExceptionHandledCleanly() throws Exception {
when(mSource.getStatsForPackage(anyString(), anyString(), any(UserHandle.class))).
- thenThrow(new IllegalStateException("intentional failure"));
+ thenThrow(new IOException("intentional failure"));
ApplicationInfo info = new ApplicationInfo();
info.packageName = PACKAGE_NAME;
FetchPackageStorageAsyncLoader task = new FetchPackageStorageAsyncLoader(
diff --git a/tests/robotests/src/com/android/settings/applications/MusicViewHolderControllerTest.java b/tests/robotests/src/com/android/settings/applications/MusicViewHolderControllerTest.java
index 9bc7482..6440141 100644
--- a/tests/robotests/src/com/android/settings/applications/MusicViewHolderControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/MusicViewHolderControllerTest.java
@@ -81,7 +81,7 @@
}
@Test
- public void storageShouldRepresentStorageStatsQuery() {
+ public void storageShouldRepresentStorageStatsQuery() throws Exception {
when(mSource.getExternalStorageStats(any(String.class), any(UserHandle.class))).thenReturn(
new StorageStatsSource.ExternalStorageStats(1, 1, 0, 0));
diff --git a/tests/robotests/src/com/android/settings/applications/SpecialAppAccessPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/SpecialAppAccessPreferenceControllerTest.java
new file mode 100644
index 0000000..44ca9f7
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/applications/SpecialAppAccessPreferenceControllerTest.java
@@ -0,0 +1,78 @@
+/*
+ * 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.applications;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.support.v7.preference.Preference;
+import com.android.settings.R;
+import com.android.settings.SettingsRobolectricTestRunner;
+import com.android.settings.TestConfig;
+import com.android.settings.datausage.DataSaverBackend;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+import org.robolectric.util.ReflectionHelpers;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class SpecialAppAccessPreferenceControllerTest {
+ private Context mContext;
+ @Mock
+ private DataSaverBackend mBackend;
+ @Mock
+ private Preference mPreference;
+
+ private SpecialAppAccessPreferenceController mController;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mContext = RuntimeEnvironment.application;
+ mController = new SpecialAppAccessPreferenceController(mContext);
+ ReflectionHelpers.setField(mController, "mDataSaverBackend", mBackend);
+ }
+
+ @Test
+ public void isAvailable_shouldAlwaysReturnTrue() {
+ assertThat(mController.isAvailable()).isTrue();
+ }
+
+ @Test
+ public void updateState_shouldSetSummary() {
+ when(mBackend.getWhitelistedCount()).thenReturn(0);
+
+ mController.updateState(mPreference);
+
+ verify(mPreference).setSummary(mContext.getResources().getQuantityString(
+ R.plurals.special_access_summary, 0, 0));
+
+ when(mBackend.getWhitelistedCount()).thenReturn(1);
+
+ mController.updateState(mPreference);
+
+ verify(mPreference).setSummary(mContext.getResources().getQuantityString(
+ R.plurals.special_access_summary, 1, 1));
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/StorageDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/deviceinfo/StorageDashboardFragmentTest.java
index b3253f9..0c9988b 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/StorageDashboardFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/deviceinfo/StorageDashboardFragmentTest.java
@@ -18,6 +18,10 @@
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+
+import android.app.Activity;
import android.os.storage.StorageManager;
import android.provider.SearchIndexableResource;
@@ -56,6 +60,15 @@
}
@Test
+ public void test_initializeOptionsMenuInvalidatesExistingMenu() {
+ Activity activity = mock(Activity.class);
+
+ mFragment.initializeOptionsMenu(activity);
+
+ verify(activity).invalidateOptionsMenu();
+ }
+
+ @Test
public void testSearchIndexProvider_shouldIndexResource() {
final List<SearchIndexableResource> indexRes =
StorageDashboardFragment.SEARCH_INDEX_DATA_PROVIDER.getXmlResourcesToIndex(
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/StorageSettingsTest.java b/tests/robotests/src/com/android/settings/deviceinfo/StorageSettingsTest.java
index 95f9fbe..17abab1 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/StorageSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/deviceinfo/StorageSettingsTest.java
@@ -70,7 +70,7 @@
}
@Test
- public void updateSummary_shouldDisplayUsedPercentAndFreeSpace() {
+ public void updateSummary_shouldDisplayUsedPercentAndFreeSpace() throws Exception {
final SummaryLoader loader = mock(SummaryLoader.class);
final SummaryLoader.SummaryProvider provider =
StorageSettings.SUMMARY_PROVIDER_FACTORY.createSummaryProvider(mActivity, loader);
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
index 03892a3..801034c 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
@@ -17,7 +17,18 @@
package com.android.settings.fuelgauge;
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Matchers.anyLong;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import android.app.Activity;
import android.app.Fragment;
import android.content.Context;
import android.content.pm.ApplicationInfo;
@@ -25,12 +36,12 @@
import android.graphics.drawable.Drawable;
import android.os.BatteryStats;
import android.os.Bundle;
-import android.os.UserHandle;
import android.view.View;
import com.android.internal.os.BatterySipper;
import com.android.internal.os.BatteryStatsHelper;
import com.android.settings.SettingsActivity;
+import com.android.settings.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig;
import com.android.settings.applications.AppHeaderController;
import com.android.settings.applications.LayoutPreference;
@@ -46,22 +57,10 @@
import org.mockito.MockitoAnnotations;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
-import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
import org.robolectric.util.ReflectionHelpers;
-import static org.mockito.Matchers.anyLong;
-import static org.mockito.Matchers.anyInt;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyString;
-import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.doAnswer;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-
-@RunWith(RobolectricTestRunner.class)
+@RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class AdvancedPowerUsageDetailTest {
private static final String APP_LABEL = "app label";
@@ -77,6 +76,8 @@
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
private Context mContext;
+ @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+ private Activity mActivity;
@Mock
private AppHeaderController mAppHeaderController;
@Mock
@@ -86,8 +87,6 @@
@Mock
private ApplicationsState.AppEntry mAppEntry;
@Mock
- private Drawable mIconDrawable;
- @Mock
private Bundle mBundle;
@Mock
private BatteryEntry mBatteryEntry;
@@ -111,6 +110,7 @@
mFragment = spy(new AdvancedPowerUsageDetail());
doReturn(mContext).when(mFragment).getContext();
+ doReturn(mActivity).when(mFragment).getActivity();
doReturn(SUMMARY).when(mFragment).getString(anyInt());
doReturn(APP_LABEL).when(mBundle).getString(anyString());
doReturn(mBundle).when(mFragment).getArguments();
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryBroadcastReceiverTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryBroadcastReceiverTest.java
new file mode 100644
index 0000000..799dab9
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryBroadcastReceiverTest.java
@@ -0,0 +1,95 @@
+/*
+ * 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 android.content.Context;
+import android.content.Intent;
+import android.os.BatteryManager;
+
+import com.android.settings.SettingsRobolectricTestRunner;
+import com.android.settings.TestConfig;
+import com.android.settings.Utils;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class BatteryBroadcastReceiverTest {
+ private static final String BATTERY_INIT_LEVEL = "100%";
+ private static final String BATTERY_INIT_STATUS = "Not charging";
+ private static final int BATTERY_INTENT_LEVEL = 80;
+ private static final int BATTERY_INTENT_SCALE = 100;
+
+ @Mock
+ private BatteryBroadcastReceiver.OnBatteryChangedListener mBatteryListener;
+ private BatteryBroadcastReceiver mBatteryBroadcastReceiver;
+ private Context mContext;
+ private Intent mChargingIntent;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mContext = RuntimeEnvironment.application;
+
+ mBatteryBroadcastReceiver = new BatteryBroadcastReceiver(mContext);
+ mBatteryBroadcastReceiver.mBatteryLevel = BATTERY_INIT_LEVEL;
+ mBatteryBroadcastReceiver.mBatteryStatus = BATTERY_INIT_STATUS;
+ mBatteryBroadcastReceiver.setBatteryChangedListener(mBatteryListener);
+
+ mChargingIntent = new Intent(Intent.ACTION_BATTERY_CHANGED);
+ mChargingIntent.putExtra(BatteryManager.EXTRA_LEVEL, BATTERY_INTENT_LEVEL);
+ mChargingIntent.putExtra(BatteryManager.EXTRA_SCALE, BATTERY_INTENT_SCALE);
+ mChargingIntent.putExtra(BatteryManager.EXTRA_STATUS,
+ BatteryManager.BATTERY_STATUS_CHARGING);
+ }
+
+ @Test
+ public void testOnReceive_batteryDataChanged_dataUpdated() {
+ mBatteryBroadcastReceiver.onReceive(mContext, mChargingIntent);
+
+ assertThat(mBatteryBroadcastReceiver.mBatteryLevel).isEqualTo(
+ Utils.getBatteryPercentage(mChargingIntent));
+ assertThat(mBatteryBroadcastReceiver.mBatteryStatus).isEqualTo(
+ Utils.getBatteryStatus(mContext.getResources(), mChargingIntent));
+ verify(mBatteryListener).onBatteryChanged();
+ }
+
+ @Test
+ public void testOnReceive_batteryDataNotChanged_listenerNotInvoked() {
+ final String batteryLevel = Utils.getBatteryPercentage(mChargingIntent);
+ final String batteryStatus = Utils.getBatteryStatus(mContext.getResources(),
+ mChargingIntent);
+ mBatteryBroadcastReceiver.mBatteryLevel = batteryLevel;
+ mBatteryBroadcastReceiver.mBatteryStatus = batteryStatus;
+
+ mBatteryBroadcastReceiver.onReceive(mContext, mChargingIntent);
+
+ assertThat(mBatteryBroadcastReceiver.mBatteryLevel).isEqualTo(batteryLevel);
+ assertThat(mBatteryBroadcastReceiver.mBatteryStatus).isEqualTo(batteryStatus);
+ verify(mBatteryListener, never()).onBatteryChanged();
+ }
+
+}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageAdvancedTest.java b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageAdvancedTest.java
index 3f87bb4..66d2c1a 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageAdvancedTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageAdvancedTest.java
@@ -17,6 +17,7 @@
import android.content.Context;
import android.content.pm.PackageManager;
+import android.os.UserManager;
import com.android.internal.os.BatterySipper;
import com.android.internal.os.BatterySipper.DrainType;
@@ -75,6 +76,8 @@
private PowerUsageFeatureProvider mPowerUsageFeatureProvider;
@Mock
private PackageManager mPackageManager;
+ @Mock
+ private UserManager mUserManager;
private PowerUsageAdvanced mPowerUsageAdvanced;
private PowerUsageData mPowerUsageData;
private Context mShadowContext;
@@ -104,6 +107,7 @@
doReturn(STUB_STRING).when(mPowerUsageAdvanced).getString(anyInt(), any());
mPowerUsageAdvanced.setPackageManager(mPackageManager);
mPowerUsageAdvanced.setPowerUsageFeatureProvider(mPowerUsageFeatureProvider);
+ mPowerUsageAdvanced.setUserManager(mUserManager);
mPowerUsageData = new PowerUsageData(UsageType.APP);
mMaxBatterySipper.totalPowerMah = TYPE_BLUETOOTH_USAGE;
@@ -225,13 +229,12 @@
}
@Test
- public void testShouldHide_typeUnAccounted_returnTrue() {
+ public void testShouldHideCategory_typeUnAccounted_returnTrue() {
mPowerUsageData.usageType = UsageType.UNACCOUNTED;
assertThat(mPowerUsageAdvanced.shouldHideCategory(mPowerUsageData)).isTrue();
}
-
@Test
public void testShouldHideCategory_typeOverCounted_returnTrue() {
mPowerUsageData.usageType = UsageType.OVERCOUNTED;
@@ -240,6 +243,22 @@
}
@Test
+ public void testShouldHideCategory_typeUserAndOnlyOne_returnTrue() {
+ mPowerUsageData.usageType = UsageType.USER;
+ doReturn(1).when(mUserManager).getUserCount();
+
+ assertThat(mPowerUsageAdvanced.shouldHideCategory(mPowerUsageData)).isTrue();
+ }
+
+ @Test
+ public void testShouldHideCategory_typeUserAndMoreThanOne_returnFalse() {
+ mPowerUsageData.usageType = UsageType.USER;
+ doReturn(2).when(mUserManager).getUserCount();
+
+ assertThat(mPowerUsageAdvanced.shouldHideCategory(mPowerUsageData)).isFalse();
+ }
+
+ @Test
public void testShouldHideCategory_typeNormal_returnFalse() {
mPowerUsageData.usageType = UsageType.APP;
@@ -260,4 +279,18 @@
assertThat(mPowerUsageAdvanced.shouldHideSummary(mPowerUsageData)).isFalse();
}
+ @Test
+ public void testShouldShowBatterySipper_typeScreen_returnFalse() {
+ mNormalBatterySipper.drainType = DrainType.SCREEN;
+
+ assertThat(mPowerUsageAdvanced.shouldShowBatterySipper(mNormalBatterySipper)).isFalse();
+ }
+
+ @Test
+ public void testShouldShowBatterySipper_typeNormal_returnTrue() {
+ mNormalBatterySipper.drainType = DrainType.APP;
+
+ assertThat(mPowerUsageAdvanced.shouldShowBatterySipper(mNormalBatterySipper)).isTrue();
+ }
+
}
diff --git a/tests/robotests/src/com/android/settings/wifi/WifiWakeupPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/wifi/WifiWakeupPreferenceControllerTest.java
index d6243ac..7df5c9a 100644
--- a/tests/robotests/src/com/android/settings/wifi/WifiWakeupPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/WifiWakeupPreferenceControllerTest.java
@@ -17,6 +17,7 @@
package com.android.settings.wifi;
import static android.provider.Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED;
+import static android.provider.Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE;
import static android.provider.Settings.Global.WIFI_WAKEUP_ENABLED;
import static com.google.common.truth.Truth.assertThat;
@@ -29,6 +30,7 @@
import android.support.v14.preference.SwitchPreference;
import android.support.v7.preference.Preference;
+import com.android.settings.R;
import com.android.settings.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig;
import com.android.settings.core.lifecycle.Lifecycle;
@@ -52,6 +54,7 @@
MockitoAnnotations.initMocks(this);
mContext = RuntimeEnvironment.application;
mController = new WifiWakeupPreferenceController(mContext, mock(Lifecycle.class));
+ Settings.System.putInt(mContext.getContentResolver(), WIFI_SCAN_ALWAYS_AVAILABLE, 1);
}
@Test
@@ -95,6 +98,7 @@
verify(preference).setChecked(true);
verify(preference).setEnabled(true);
+ verify(preference).setSummary(R.string.wifi_wakeup_summary);
}
@Test
@@ -107,5 +111,20 @@
verify(preference).setChecked(false);
verify(preference).setEnabled(false);
+ verify(preference).setSummary(R.string.wifi_wakeup_summary);
+ }
+
+ @Test
+ public void updateState_preferenceSetUncheckedAndSetDisabledWhenWifiScanningDisabled() {
+ final SwitchPreference preference = mock(SwitchPreference.class);
+ Settings.System.putInt(mContext.getContentResolver(), NETWORK_RECOMMENDATIONS_ENABLED, 1);
+ Settings.System.putInt(mContext.getContentResolver(), WIFI_WAKEUP_ENABLED, 1);
+ Settings.System.putInt(mContext.getContentResolver(), WIFI_SCAN_ALWAYS_AVAILABLE, 0);
+
+ mController.updateState(preference);
+
+ verify(preference).setChecked(true);
+ verify(preference).setEnabled(false);
+ verify(preference).setSummary(R.string.wifi_wakeup_summary_scanning_disabled);
}
}
diff --git a/tests/unit/src/com/android/settings/WallpaperPreferenceLayoutTest.java b/tests/unit/src/com/android/settings/WallpaperPreferenceLayoutTest.java
deleted file mode 100644
index 4448307..0000000
--- a/tests/unit/src/com/android/settings/WallpaperPreferenceLayoutTest.java
+++ /dev/null
@@ -1,34 +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;
-
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
-import android.view.LayoutInflater;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@SmallTest
-@RunWith(AndroidJUnit4.class)
-public class WallpaperPreferenceLayoutTest {
- @Test
- public void testInflateWallpaperPreferenceLayout_doesNotCrash() {
- LayoutInflater.from(InstrumentationRegistry.getTargetContext())
- .inflate(R.layout.preference_wallpaper_type, null, false);
- }
-}
diff --git a/tests/unit/src/com/android/settings/deviceinfo/storage/StorageAsyncLoaderTest.java b/tests/unit/src/com/android/settings/deviceinfo/storage/StorageAsyncLoaderTest.java
index f7131b3..546ea4b 100644
--- a/tests/unit/src/com/android/settings/deviceinfo/storage/StorageAsyncLoaderTest.java
+++ b/tests/unit/src/com/android/settings/deviceinfo/storage/StorageAsyncLoaderTest.java
@@ -194,8 +194,8 @@
// Should not crash.
}
- private ApplicationInfo addPackage(
- String packageName, long cacheSize, long codeSize, long dataSize, int category) {
+ private ApplicationInfo addPackage(String packageName, long cacheSize, long codeSize,
+ long dataSize, int category) throws Exception {
StorageStatsSource.AppStorageStats storageStats =
mock(StorageStatsSource.AppStorageStats.class);
when(storageStats.getCodeBytes()).thenReturn(codeSize);
diff --git a/tests/unit/src/com/android/settings/display/NightDisplaySettingsActivityTest.java b/tests/unit/src/com/android/settings/display/NightDisplaySettingsActivityTest.java
new file mode 100644
index 0000000..4011d9a
--- /dev/null
+++ b/tests/unit/src/com/android/settings/display/NightDisplaySettingsActivityTest.java
@@ -0,0 +1,67 @@
+/*
+ * 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.display;
+
+import android.app.Instrumentation;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.provider.Settings;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import com.android.settings.Settings.NightDisplaySettingsActivity;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class NightDisplaySettingsActivityTest {
+
+ private Context mTargetContext;
+
+ @Before
+ public void setUp() throws Exception {
+ Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
+ mTargetContext = instrumentation.getTargetContext();
+ }
+
+ @Test
+ public void nightDisplaySettingsIntent_resolvesCorrectly() {
+ final boolean nightDisplayAvailable = mTargetContext.getResources().getBoolean(
+ com.android.internal.R.bool.config_nightDisplayAvailable);
+ final PackageManager pm = mTargetContext.getPackageManager();
+ final Intent intent = new Intent(Settings.ACTION_NIGHT_DISPLAY_SETTINGS);
+ final ResolveInfo ri = pm.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY);
+
+ if (nightDisplayAvailable) {
+ Assert.assertNotNull("No activity for " + Settings.ACTION_NIGHT_DISPLAY_SETTINGS, ri);
+ Assert.assertEquals(mTargetContext.getPackageName(), ri.activityInfo.packageName);
+ Assert.assertEquals(NightDisplaySettingsActivity.class.getName(),
+ ri.activityInfo.name);
+ } else {
+ Assert.assertNull("Should have no activity for "
+ + Settings.ACTION_NIGHT_DISPLAY_SETTINGS, ri);
+ }
+ }
+
+}