Reworks lock screen flows.

This also adds frp warning dialogs in case the user skips lock
screen setup initially.

bug:26880444
Change-Id: I732b6a806e139fb6c1c1b334b8d1608c229f217c
This commit is contained in:
Udam Saini
2016-02-03 17:31:11 -08:00
parent 40f4bf2a1f
commit 8ef4c62003
17 changed files with 538 additions and 147 deletions

View File

@@ -22,3 +22,7 @@
-keepclassmembers class com.android.settings.inputmethod.UserDictionaryAddWordActivity {
*** onClick*(...);
}
-keep public class * extends com.android.setupwizardlib.items.ItemHierarchy {
public <init>(android.content.Context, android.util.AttributeSet);
}

View File

@@ -1,18 +1,19 @@
<!--
~ 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
-->
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
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="32dp"
android:height="32dp"

View File

@@ -0,0 +1,24 @@
<!--
Copyright (C) 2016 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="?attr/suwListItemIconColor"
android:pathData="M17.81,4.47c-0.08,0 -0.16,-0.02 -0.23,-0.06C15.66,3.42 14,3 12.01,3c-1.98,0 -3.86,0.47 -5.57,1.41 -0.24,0.13 -0.54,0.04 -0.68,-0.2 -0.13,-0.24 -0.04,-0.55 0.2,-0.68C7.82,2.52 9.86,2 12.01,2c2.13,0 3.99,0.47 6.03,1.52 0.25,0.13 0.34,0.43 0.21,0.67 -0.09,0.18 -0.26,0.28 -0.44,0.28zM3.5,9.72c-0.1,0 -0.2,-0.03 -0.29,-0.09 -0.23,-0.16 -0.28,-0.47 -0.12,-0.7 0.99,-1.4 2.25,-2.5 3.75,-3.27C9.98,4.04 14,4.03 17.15,5.65c1.5,0.77 2.76,1.86 3.75,3.25 0.16,0.22 0.11,0.54 -0.12,0.7 -0.23,0.16 -0.54,0.11 -0.7,-0.12 -0.9,-1.26 -2.04,-2.25 -3.39,-2.94 -2.87,-1.47 -6.54,-1.47 -9.4,0.01 -1.36,0.7 -2.5,1.7 -3.4,2.96 -0.08,0.14 -0.23,0.21 -0.39,0.21zM9.75,21.79c-0.13,0 -0.26,-0.05 -0.35,-0.15 -0.87,-0.87 -1.34,-1.43 -2.01,-2.64 -0.69,-1.23 -1.05,-2.73 -1.05,-4.34 0,-2.97 2.54,-5.39 5.66,-5.39s5.66,2.42 5.66,5.39c0,0.28 -0.22,0.5 -0.5,0.5s-0.5,-0.22 -0.5,-0.5c0,-2.42 -2.09,-4.39 -4.66,-4.39 -2.57,0 -4.66,1.97 -4.66,4.39 0,1.44 0.32,2.77 0.93,3.85 0.64,1.15 1.08,1.64 1.85,2.42 0.19,0.2 0.19,0.51 0,0.71 -0.11,0.1 -0.24,0.15 -0.37,0.15zM16.92,19.94c-1.19,0 -2.24,-0.3 -3.1,-0.89 -1.49,-1.01 -2.38,-2.65 -2.38,-4.39 0,-0.28 0.22,-0.5 0.5,-0.5s0.5,0.22 0.5,0.5c0,1.41 0.72,2.74 1.94,3.56 0.71,0.48 1.54,0.71 2.54,0.71 0.24,0 0.64,-0.03 1.04,-0.1 0.27,-0.05 0.53,0.13 0.58,0.41 0.05,0.27 -0.13,0.53 -0.41,0.58 -0.57,0.11 -1.07,0.12 -1.21,0.12zM14.91,22c-0.04,0 -0.09,-0.01 -0.13,-0.02 -1.59,-0.44 -2.63,-1.03 -3.72,-2.1 -1.4,-1.39 -2.17,-3.24 -2.17,-5.22 0,-1.62 1.38,-2.94 3.08,-2.94 1.7,0 3.08,1.32 3.08,2.94 0,1.07 0.93,1.94 2.08,1.94s2.08,-0.87 2.08,-1.94c0,-3.77 -3.25,-6.83 -7.25,-6.83 -2.84,0 -5.44,1.58 -6.61,4.03 -0.39,0.81 -0.59,1.76 -0.59,2.8 0,0.78 0.07,2.01 0.67,3.61 0.1,0.26 -0.03,0.55 -0.29,0.64 -0.26,0.1 -0.55,-0.04 -0.64,-0.29 -0.49,-1.31 -0.73,-2.61 -0.73,-3.96 0,-1.2 0.23,-2.29 0.68,-3.24 1.33,-2.79 4.28,-4.6 7.51,-4.6 4.55,0 8.25,3.51 8.25,7.83 0,1.62 -1.38,2.94 -3.08,2.94s-3.08,-1.32 -3.08,-2.94c0,-1.07 -0.93,-1.94 -2.08,-1.94s-2.08,0.87 -2.08,1.94c0,1.71 0.66,3.31 1.87,4.51 0.95,0.94 1.86,1.46 3.27,1.85 0.27,0.07 0.42,0.35 0.35,0.61 -0.05,0.23 -0.26,0.38 -0.47,0.38z"/>
</vector>

26
res/drawable/ic_skip.xml Normal file
View File

@@ -0,0 +1,26 @@
<!--
Copyright (C) 2016 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:autoMirrored="true">
<path
android:fillColor="?attr/suwListItemIconColor"
android:pathData="M18.4,10.6C16.55,8.99 14.15,8 11.5,8c-4.65,0 -8.58,3.03 -9.96,7.22L3.9,16c1.05,-3.19 4.05,-5.5 7.6,-5.5 1.95,0 3.73,0.72 5.12,1.88L13,16h9V7l-3.6,3.6z"/>
</vector>

View File

@@ -1,89 +1,24 @@
<?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
-->
Copyright (C) 2015 The Android Open Source Project
<com.android.setupwizardlib.SetupWizardLayout
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.SetupWizardItemsLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/setup_wizard_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
style="?attr/fingerprint_layout_theme">
<LinearLayout
style="@style/SuwContentFrame"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:clipToPadding="false"
android:clipChildren="false">
<TextView
style="@style/TextAppearance.FingerprintMessage"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/suw_description_margin_top"
android:text="@string/security_settings_fingerprint_enroll_introduction_message"/>
<TextView
style="@style/TextAppearance.FingerprintMessage"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:text="@string/security_settings_fingerprint_enroll_introduction_message_warning"/>
<TextView
style="@style/TextAppearance.FingerprintLink"
android:id="@+id/learn_more_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:text="@string/security_settings_fingerprint_enroll_introduction_risk_link_text"/>
<View
android:layout_height="0dp"
android:layout_width="match_parent"
android:layout_weight="1"/>
<LinearLayout
android:id="@+id/button_bar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="-12dp"
android:layout_marginBottom="4dp"
android:layout_gravity="end"
android:orientation="horizontal">
<Button
style="@style/Button.FingerprintButton"
android:id="@+id/cancel_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:text="@string/security_settings_fingerprint_enroll_introduction_cancel" />
<Button
style="@style/Button.FingerprintButton"
android:id="@+id/next_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="end|center_vertical"
android:text="@string/security_settings_fingerprint_enroll_introduction_continue" />
</LinearLayout>
</LinearLayout>
</com.android.setupwizardlib.SetupWizardLayout>
android:entries="@xml/fingerprint_enroll_introduction_items"
style="?attr/fingerprint_layout_theme" />

View File

@@ -0,0 +1,29 @@
<?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_margin_bottom"
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
android:paddingTop="@dimen/suw_description_margin_top"
android:text="@string/setup_lock_settings_picker_fingerprint_message"
android:lineSpacingExtra="@dimen/suw_description_line_spacing_extra"
android:textAppearance="?android:attr/textAppearanceListItem" />

View File

@@ -0,0 +1,29 @@
<?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_margin_bottom"
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
android:paddingTop="@dimen/suw_description_margin_top"
android:text="@string/setup_lock_settings_picker_message"
android:lineSpacingExtra="@dimen/suw_description_line_spacing_extra"
android:textAppearance="?android:attr/textAppearanceListItem" />

View File

@@ -1,18 +1,18 @@
<?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
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
-->
<com.android.setupwizardlib.SetupWizardLayout

View File

@@ -739,13 +739,27 @@
<!-- Introduction detail message shown in fingerprint enrollment dialog [CHAR LIMIT=NONE]-->
<string name="security_settings_fingerprint_enroll_introduction_message">Just touch the fingerprint sensor to unlock your phone, authorize purchases, or sign in to apps. \n\n Be careful whose fingerprints you add - any fingerprints added will be able to do these things.</string>
<!-- Introduction detail message shown in fingerprint enrollment dialog to warn the user [CHAR LIMIT=NONE]-->
<string name="security_settings_fingerprint_enroll_introduction_message_warning">Note: Your fingerprint may be less secure than a strong pattern or PIN.</string>
<!-- Link text shown bellow the warning to learn morn about fingerprint risk [CHAR LIMIT=22]-->
<string name="security_settings_fingerprint_enroll_introduction_risk_link_text">Learn more</string>
<string name="security_settings_fingerprint_enroll_introduction_message_warning">Note: Your fingerprint may be less secure than a strong pattern or PIN. <annotation id="url">Learn more</annotation></string>
<!-- Button text to cancel enrollment from the introduction [CHAR LIMIT=22] -->
<string name="security_settings_fingerprint_enroll_introduction_cancel">Cancel</string>
<!-- Button text to continue to the next screen from the introduction [CHAR LIMIT=22] -->
<string name="security_settings_fingerprint_enroll_introduction_continue">Continue</string>
<!-- Dialog text shown when the user tries to skip setting up a screen lock, warning them of potential consequences of not doing so, including loss of factory reset protection. (tablet) [CHAR LIMIT=NONE] -->
<string name="lock_screen_intro_skip_dialog_text_frp" product="tablet">Device protection features will not be activated. You won\u2019t be able to prevent others from using this tablet if it\u2019s lost, stolen or wiped.</string>
<!-- Dialog text shown when the user tries to skip setting up a screen lock, warning them of potential consequences of not doing so, including loss of factory reset protection. (device) [CHAR LIMIT=NONE] -->
<string name="lock_screen_intro_skip_dialog_text_frp" product="device">Device protection features will not be activated. You won\u2019t be able to prevent others from using this device if it\u2019s lost, stolen or wiped.</string>
<!-- Dialog text shown when the user tries to skip setting up a screen lock, warning them of potential consequences of not doing so, including loss of factory reset protection. (phone) [CHAR LIMIT=NONE] -->
<string name="lock_screen_intro_skip_dialog_text_frp" product="default">Device protection features will not be activated. You won\u2019t be able to prevent others from using this phone if it\u2019s lost, stolen or wiped.</string>
<!-- Dialog text shown when the user tries to skip setting up a screen lock, warning them of potential consequences of not doing so. (tablet) [CHAR LIMIT=NONE] -->
<string name="lock_screen_intro_skip_dialog_text" product="tablet">Device protection features will not be activated. You won\u2019t be able to prevent others from using this tablet if it\u2019s lost or stolen.</string>
<!-- Dialog text shown when the user tries to skip setting up a screen lock, warning them of potential consequences of not doing so. (device) [CHAR LIMIT=NONE] -->
<string name="lock_screen_intro_skip_dialog_text" product="device">Device protection features will not be activated. You won\u2019t be able to prevent others from using this device if it\u2019s lost or stolen.</string>
<!-- Dialog text shown when the user tries to skip setting up a screen lock, warning them of potential consequences of not doing so. (phone) [CHAR LIMIT=NONE] -->
<string name="lock_screen_intro_skip_dialog_text" product="default">Device protection features will not be activated. You won\u2019t be able to prevent others from using this phone if it\u2019s lost or stolen.</string>
<!-- Button for skipping a step after having been warned of a potential concern [CHAR LIMIT=30] -->
<string name="skip_anyway_button_label">Skip anyway</string>
<!-- Button for going to the previous screen or step [CHAR LIMIT=20] -->
<string name="go_back_button_label">Go back</string>
<!-- Introduction title shown in fingerprint enrollment dialog to locate the sensor [CHAR LIMIT=29] -->
<string name="security_settings_fingerprint_enroll_find_sensor_title">Find the sensor</string>
<!-- Message shown in fingerprint enrollment dialog to locate the sensor -->
@@ -972,8 +986,18 @@
<!-- Title for security picker to choose the unlock method: None/Pattern/PIN/Password [CHAR LIMIT=22] -->
<string name="lock_settings_picker_title">Choose screen lock</string>
<!-- Title for screen in setup wizard, prompting user to choose the unlock method: None/Pattern/PIN/Password [CHAR LIMIT=40] -->
<string name="setup_lock_settings_picker_title">Choose screen lock</string>
<!-- Title for security picker in setup wizard to choose the unlock method: None/Pattern/PIN/Password [CHAR LIMIT=22] -->
<string name="setup_lock_settings_picker_title">Protect your phone</string>
<!-- Title for screen in setup wizard, prompting user to choose the their backup screen lock method [CHAR LIMIT=NONE] -->
<string name="setup_lock_settings_picker_fingerprint_message">Fingerprint may be less secure than a strong pattern, PIN or password. Set up a backup lock screen to be secure.</string>
<!-- Description text for screen in setup wizard asking user to set up screen lock, explaining to the user how setting up a screen lock protect them from losing data. (tablet) [CHAR LIMIT=NONE] -->
<string name="setup_lock_settings_picker_message" product="tablet">Prevent others from using this tablet without your permission by activating device protection features. Choose the screen lock you want to use.</string>
<!-- Description text for screen in setup wizard asking user to set up screen lock, explaining to the user how setting up a screen lock protect them from losing data. (device) [CHAR LIMIT=NONE] -->
<string name="setup_lock_settings_picker_message" product="device">Prevent others from using this device without your permission by activating device protection features. Choose the screen lock you want to use.</string>
<!-- Description text for screen in setup wizard asking user to set up screen lock, explaining to the user how setting up a screen lock protect them from losing data. (phone) [CHAR LIMIT=NONE] -->
<string name="setup_lock_settings_picker_message" product="default">Prevent others from using this phone without your permission by activating device protection features. Choose the screen lock you want to use.</string>
<!-- Message shown in screen lock picker while setting up the backup/fallback screen lock method for fingerprint. Users can choose to use this method to unlock the screen instead of fingerprint, or when fingerprint is not accepted. [CHAR LIMIT=80] [BACKUP_MESSAGE_ID=2799884038398627882] -->
<string name="lock_settings_picker_fingerprint_message">Choose your backup screen lock method</string>
@@ -1016,6 +1040,9 @@
<!-- Title for preference that guides the user through creating an unlock password [CHAR LIMIT=45] -->
<string name="unlock_set_unlock_password_summary">High security</string>
<!-- Title for preference that allows the user to setup their lock screen preference later [CHAR LIMIT=22] -->
<string name="unlock_set_do_later_title">Not now</string>
<!-- Summary specifying that this is the current screen lock setting [CHAR LIMIT=45] -->
<string name="current_screen_lock">Current screen lock</string>

View File

@@ -283,8 +283,13 @@
</style>
<style name="Theme.FingerprintEnroll" parent="@*android:style/Theme.Material.Settings.NoActionBar">
<item name="android:listPreferredItemHeight">@dimen/suw_items_preferred_height</item>
<item name="android:listPreferredItemPaddingEnd">@dimen/suw_layout_margin_sides</item>
<item name="android:listPreferredItemPaddingStart">@dimen/suw_layout_margin_sides</item>
<item name="android:textAppearanceListItemSmall">@android:style/TextAppearance.Material.Body1</item>
<item name="android:windowAnimationStyle">@style/Animation.SuwWindowAnimation</item>
<item name="suwListItemIconColor">?android:attr/colorAccent</item>
<item name="suwMarginSides">@dimen/suw_layout_margin_sides</item>
</style>

View File

@@ -0,0 +1,40 @@
<?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.
-->
<ItemGroup xmlns:android="http://schemas.android.com/apk/res/android">
<Item
android:enabled="false"
android:layout="@layout/suw_items_description"
android:title="@string/security_settings_fingerprint_enroll_introduction_message" />
<Item
android:enabled="false"
android:id="@+id/fingerprint_introduction_message_warning"
android:layout="@layout/suw_items_description" />
<Item
android:id="@+id/next_button"
android:icon="@drawable/ic_fingerprint_list_icon"
android:title="@string/security_settings_fingerprint_enroll_introduction_continue" />
<Item
android:id="@+id/cancel_button"
android:icon="@drawable/ic_skip"
android:title="@string/security_settings_fingerprint_enroll_introduction_cancel" />
</ItemGroup>

View File

@@ -0,0 +1,52 @@
<?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.settingslib.RestrictedPreference
android:key="unlock_set_off"
android:title="@string/unlock_set_unlock_off_title"
android:persistent="false"/>
<com.android.settingslib.RestrictedPreference
android:key="unlock_set_none"
android:title="@string/unlock_set_unlock_none_title"
android:persistent="false"/>
<com.android.settingslib.RestrictedPreference
android:key="unlock_set_pattern"
android:title="@string/unlock_set_unlock_pattern_title"
android:persistent="false"/>
<com.android.settingslib.RestrictedPreference
android:key="unlock_set_pin"
android:title="@string/unlock_set_unlock_pin_title"
android:persistent="false"/>
<com.android.settingslib.RestrictedPreference
android:key="unlock_set_password"
android:title="@string/unlock_set_unlock_password_title"
android:persistent="false"/>
<com.android.settingslib.RestrictedPreference
android:key="unlock_set_do_later"
android:title="@string/unlock_set_do_later_title"
android:persistent="false"/>
</PreferenceScreen>

View File

@@ -104,7 +104,6 @@ public class ChooseLockGeneric extends SettingsActivity {
private int mEncryptionRequestQuality;
private boolean mEncryptionRequestDisabled;
private boolean mRequirePassword;
private boolean mForFingerprint = false;
private boolean mForChangeCredRequiredForBoot = false;
private String mUserPassword;
private LockPatternUtils mLockPatternUtils;
@@ -130,6 +129,8 @@ public class ChooseLockGeneric extends SettingsActivity {
}
};
protected boolean mForFingerprint = false;
@Override
protected int getMetricsCategory() {
return MetricsEvent.CHOOSE_LOCK_GENERIC;
@@ -204,6 +205,10 @@ public class ChooseLockGeneric extends SettingsActivity {
mWaitingForConfirmation = true;
}
}
addHeaderView();
}
protected void addHeaderView() {
if (mForFingerprint) {
setHeaderView(R.layout.choose_lock_generic_fingerprint_header);
}
@@ -323,7 +328,7 @@ public class ChooseLockGeneric extends SettingsActivity {
if (prefScreen != null) {
prefScreen.removeAll();
}
addPreferencesFromResource(R.xml.security_settings_picker);
addPreferences();
disableUnusablePreferences(quality, hideDisabledPrefs);
updatePreferenceText();
updateCurrentPreference();
@@ -333,6 +338,10 @@ public class ChooseLockGeneric extends SettingsActivity {
}
}
protected void addPreferences() {
addPreferencesFromResource(R.xml.security_settings_picker);
}
private void updatePreferenceText() {
if (mForFingerprint) {
Preference pattern = findPreference(KEY_UNLOCK_SET_PATTERN);

View File

@@ -23,10 +23,13 @@ import android.content.Intent;
import android.content.res.Resources;
import android.os.Bundle;
import android.os.UserHandle;
import android.support.v7.preference.Preference;
import android.support.v14.preference.PreferenceFragment;
import android.view.View;
import android.widget.Button;
import com.android.internal.widget.LockPatternUtils;
import com.android.settings.fingerprint.SetupSkipDialog;
import com.android.setupwizardlib.SetupWizardLayout;
import com.android.setupwizardlib.view.NavigationBar;
@@ -39,6 +42,8 @@ import com.android.setupwizardlib.view.NavigationBar;
*/
public class SetupChooseLockGeneric extends ChooseLockGeneric {
private static final String KEY_UNLOCK_SET_DO_LATER = "unlock_set_do_later";
@Override
protected boolean isValidFragment(String fragmentName) {
return SetupChooseLockGenericFragment.class.getName().equals(fragmentName);
@@ -58,7 +63,7 @@ public class SetupChooseLockGeneric extends ChooseLockGeneric {
public static class SetupChooseLockGenericFragment extends ChooseLockGenericFragment
implements NavigationBar.NavigationBarListener {
private static final String EXTRA_PASSWORD_QUALITY = ":settings:password_quality";
public static final String EXTRA_PASSWORD_QUALITY = ":settings:password_quality";
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
@@ -68,12 +73,28 @@ public class SetupChooseLockGeneric extends ChooseLockGeneric {
SetupWizardLayout layout = (SetupWizardLayout) view;
final NavigationBar navigationBar = layout.getNavigationBar();
navigationBar.getNextButton().setEnabled(false);
Button nextButton = navigationBar.getNextButton();
nextButton.setText(null);
nextButton.setEnabled(false);
navigationBar.setNavigationBarListener(this);
layout.setIllustration(R.drawable.setup_illustration_lock_screen,
R.drawable.setup_illustration_horizontal_tile);
layout.setHeaderText(R.string.setup_lock_settings_picker_title);
if (!mForFingerprint) {
layout.setHeaderText(R.string.setup_lock_settings_picker_title);
} else {
layout.setHeaderText(R.string.lock_settings_picker_title);
}
}
@Override
protected void addHeaderView() {
if (mForFingerprint) {
setHeaderView(R.layout.setup_choose_lock_generic_fingerprint_header);
} else {
setHeaderView(R.layout.setup_choose_lock_generic_header);
}
}
@Override
@@ -112,6 +133,28 @@ public class SetupChooseLockGeneric extends ChooseLockGeneric {
super.disableUnusablePreferencesImpl(newQuality, true /* hideDisabled */);
}
@Override
protected void addPreferences() {
if (mForFingerprint) {
super.addPreferences();
} else {
addPreferencesFromResource(R.xml.setup_security_settings_picker);
}
}
@Override
public boolean onPreferenceTreeClick(Preference preference) {
final String key = preference.getKey();
if (KEY_UNLOCK_SET_DO_LATER.equals(key)) {
// show warning.
SetupSkipDialog dialog = SetupSkipDialog.newInstance(getActivity().getIntent()
.getBooleanExtra(SetupSkipDialog.EXTRA_FRP_SUPPORTED, false));
dialog.show(getFragmentManager());
return true;
}
return super.onPreferenceTreeClick(preference);
}
@Override
protected Intent getLockPasswordIntent(Context context, int quality,
int minLength, final int maxLength,

View File

@@ -16,26 +16,43 @@
package com.android.settings.fingerprint;
import android.app.Activity;
import android.app.admin.DevicePolicyManager;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.hardware.fingerprint.FingerprintManager;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.UserHandle;
import android.text.Annotation;
import android.text.SpannableString;
import android.text.SpannableStringBuilder;
import android.text.TextPaint;
import android.text.method.LinkMovementMethod;
import android.text.style.URLSpan;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import com.android.internal.logging.MetricsProto.MetricsEvent;
import com.android.settings.ChooseLockGeneric;
import com.android.settings.ChooseLockSettingsHelper;
import com.android.settings.HelpUtils;
import com.android.settings.R;
import com.android.setupwizardlib.SetupWizardItemsLayout;
import com.android.setupwizardlib.items.Item;
import com.android.setupwizardlib.items.ItemAdapter;
/**
* Onboarding activity for fingerprint enrollment.
*/
public class FingerprintEnrollIntroduction extends FingerprintEnrollBase {
public class FingerprintEnrollIntroduction extends FingerprintEnrollBase
implements AdapterView.OnItemClickListener {
private static final int CHOOSE_LOCK_GENERIC_REQUEST = 1;
private static final int FINGERPRINT_FIND_SENSOR_REQUEST = 2;
protected static final int CHOOSE_LOCK_GENERIC_REQUEST = 1;
protected static final int FINGERPRINT_FIND_SENSOR_REQUEST = 2;
private boolean mHasPassword;
@@ -44,8 +61,14 @@ public class FingerprintEnrollIntroduction extends FingerprintEnrollBase {
super.onCreate(savedInstanceState);
setContentView(R.layout.fingerprint_enroll_introduction);
setHeaderText(R.string.security_settings_fingerprint_enroll_introduction_title);
findViewById(R.id.cancel_button).setOnClickListener(this);
findViewById(R.id.learn_more_button).setOnClickListener(this);
final SetupWizardItemsLayout layout =
(SetupWizardItemsLayout) findViewById(R.id.setup_wizard_layout);
layout.getListView().setOnItemClickListener(this);
final ItemAdapter adapter = (ItemAdapter) layout.getAdapter();
Item item = (Item) adapter.findItemById(R.id.fingerprint_introduction_message_warning);
item.setTitle(LearnMoreSpan.linkify(
getText(R.string.security_settings_fingerprint_enroll_introduction_message_warning),
getString(R.string.help_url_fingerprint)));
updatePasswordQuality();
}
@@ -107,7 +130,7 @@ public class FingerprintEnrollIntroduction extends FingerprintEnrollBase {
if (requestCode == FINGERPRINT_FIND_SENSOR_REQUEST) {
if (isResultFinished || resultCode == RESULT_SKIP) {
final int result = isResultFinished ? RESULT_OK : RESULT_SKIP;
setResult(result);
setResult(result, data);
finish();
return;
}
@@ -124,24 +147,66 @@ public class FingerprintEnrollIntroduction extends FingerprintEnrollBase {
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.cancel_button) {
finish();
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
final Item item = (Item) parent.getItemAtPosition(position);
switch (item.getId()) {
case R.id.next_button:
onNextButtonClick();
break;
case R.id.cancel_button:
onCancelButtonClick();
break;
}
if (v.getId() == R.id.learn_more_button) {
launchFingerprintHelp();
}
super.onClick(v);
}
private void launchFingerprintHelp() {
Intent helpIntent = HelpUtils.getHelpIntent(this,
getString(R.string.help_url_fingerprint), getClass().getName());
startActivity(helpIntent);
}
@Override
protected int getMetricsCategory() {
return MetricsEvent.FINGERPRINT_ENROLL_INTRO;
}
protected void onCancelButtonClick() {
finish();
}
private static class LearnMoreSpan extends URLSpan {
private static final String TAG = "LearnMoreSpan";
private static final Typeface TYPEFACE_MEDIUM =
Typeface.create("sans-serif-medium", Typeface.NORMAL);
private LearnMoreSpan(String url) {
super(url);
}
@Override
public void onClick(View widget) {
Context ctx = widget.getContext();
Intent intent = HelpUtils.getHelpIntent(ctx, getURL(), ctx.getClass().getName());
try {
((Activity) ctx).startActivity(intent);
} catch (ActivityNotFoundException e) {
Log.w(LearnMoreSpan.TAG,
"Actvity was not found for intent, " + intent.toString());
}
}
@Override
public void updateDrawState(TextPaint ds) {
super.updateDrawState(ds);
ds.setUnderlineText(false);
ds.setTypeface(TYPEFACE_MEDIUM);
}
public static CharSequence linkify(CharSequence rawText, String uri) {
SpannableString msg = new SpannableString(rawText);
Annotation[] spans = msg.getSpans(0, msg.length(), Annotation.class);
SpannableStringBuilder builder = new SpannableStringBuilder(msg);
for (Annotation annotation : spans) {
int start = msg.getSpanStart(annotation);
int end = msg.getSpanEnd(annotation);
LearnMoreSpan link = new LearnMoreSpan(uri);
builder.setSpan(link, start, end, msg.getSpanFlags(link));
}
return builder;
}
}
}

View File

@@ -18,10 +18,13 @@ package com.android.settings.fingerprint;
import android.content.Intent;
import android.content.res.Resources;
import android.os.UserHandle;
import android.support.v14.preference.PreferenceFragment;
import android.view.View;
import android.widget.Button;
import com.android.internal.logging.MetricsProto.MetricsEvent;
import com.android.internal.widget.LockPatternUtils;
import com.android.settings.R;
import com.android.settings.SetupChooseLockGeneric;
import com.android.settings.SetupWizardUtils;
@@ -53,18 +56,31 @@ public class SetupFingerprintEnrollIntroduction extends FingerprintEnrollIntrodu
@Override
protected void initViews() {
SetupWizardUtils.setImmersiveMode(this);
final View buttonBar = findViewById(R.id.button_bar);
if (buttonBar != null) {
buttonBar.setVisibility(View.GONE);
}
getNavigationBar().setNavigationBarListener(this);
Button nextButton = getNavigationBar().getNextButton();
nextButton.setText(null);
nextButton.setEnabled(false);
}
@Override
protected Button getNextButton() {
return getNavigationBar().getNextButton();
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == FINGERPRINT_FIND_SENSOR_REQUEST) {
if (data == null) {
data = new Intent();
}
LockPatternUtils lockPatternUtils = new LockPatternUtils(this);
data.putExtra(SetupChooseLockGeneric.
SetupChooseLockGenericFragment.EXTRA_PASSWORD_QUALITY,
lockPatternUtils.getKeyguardStoredPasswordQuality(UserHandle.myUserId()));
}
super.onActivityResult(requestCode, resultCode, data);
}
@Override
protected void onCancelButtonClick() {
SetupSkipDialog dialog = SetupSkipDialog.newInstance(
getIntent().getBooleanExtra(SetupSkipDialog.EXTRA_FRP_SUPPORTED, false));
dialog.show(getFragmentManager());
}
@Override
@@ -74,7 +90,7 @@ public class SetupFingerprintEnrollIntroduction extends FingerprintEnrollIntrodu
@Override
public void onNavigateNext() {
onNextButtonClick();
// next is handled via the onNextButtonClick method in FingerprintEnrollIntroduction
}
@Override

View File

@@ -0,0 +1,86 @@
/*
* 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.fingerprint;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.app.FragmentManager;
import android.content.DialogInterface;
import android.os.Build.VERSION;
import android.os.Build.VERSION_CODES;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.NonNull;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import com.android.settings.R;
import com.android.setupwizardlib.util.SystemBarHelper;
public class SetupSkipDialog extends DialogFragment implements DialogInterface.OnClickListener {
public static final String EXTRA_FRP_SUPPORTED = ":settings:frp_supported";
private static final String ARG_FRP_SUPPORTED = "frp_supported";
private static final String TAG_SKIP_DIALOG = "skip_dialog";
private static final int RESULT_SKIP = Activity.RESULT_FIRST_USER + 10;
public static SetupSkipDialog newInstance(boolean isFrpSupported) {
SetupSkipDialog dialog = new SetupSkipDialog();
Bundle args = new Bundle();
args.putBoolean(ARG_FRP_SUPPORTED, isFrpSupported);
dialog.setArguments(args);
return dialog;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final AlertDialog dialog = onCreateDialogBuilder().create();
// hide system status bar.
SystemBarHelper.hideSystemBars(dialog);
return dialog;
}
@NonNull
public AlertDialog.Builder onCreateDialogBuilder() {
Bundle args = getArguments();
return new AlertDialog.Builder(getContext())
.setPositiveButton(R.string.skip_anyway_button_label, this)
.setNegativeButton(R.string.go_back_button_label, this)
.setMessage(args.getBoolean(ARG_FRP_SUPPORTED) ?
R.string.lock_screen_intro_skip_dialog_text_frp :
R.string.lock_screen_intro_skip_dialog_text);
}
@Override
public void onClick(DialogInterface dialog, int button) {
switch (button) {
case DialogInterface.BUTTON_POSITIVE:
Activity activity = getActivity();
activity.setResult(RESULT_SKIP);
activity.finish();
break;
}
}
public void show(FragmentManager manager) {
show(manager, TAG_SKIP_DIALOG);
}
}