Merge "Reworks lock screen flows." into nyc-dev

This commit is contained in:
Udam Saini
2016-02-10 17:54:58 +00:00
committed by Android (Google) Code Review
17 changed files with 538 additions and 147 deletions

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);
}
}