OSDN Git Service

Merge "Change style of Preview screens (dark borders with "preview" on the bottom...
[android-x86/packages-apps-Settings.git] / src / com / android / settings / fingerprint / FingerprintEnrollIntroduction.java
1 /*
2  * Copyright (C) 2015 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License
15  */
16
17 package com.android.settings.fingerprint;
18
19 import android.app.Activity;
20 import android.app.admin.DevicePolicyManager;
21 import android.content.ActivityNotFoundException;
22 import android.content.Context;
23 import android.content.Intent;
24 import android.hardware.fingerprint.FingerprintManager;
25 import android.graphics.Typeface;
26 import android.graphics.drawable.Drawable;
27 import android.os.Bundle;
28 import android.os.UserHandle;
29 import android.text.Annotation;
30 import android.text.SpannableString;
31 import android.text.SpannableStringBuilder;
32 import android.text.TextPaint;
33 import android.text.method.LinkMovementMethod;
34 import android.text.style.URLSpan;
35 import android.util.Log;
36 import android.view.View;
37 import android.widget.AdapterView;
38
39 import com.android.internal.logging.MetricsProto.MetricsEvent;
40 import com.android.settings.ChooseLockGeneric;
41 import com.android.settings.ChooseLockSettingsHelper;
42 import com.android.settings.HelpUtils;
43 import com.android.settings.R;
44 import com.android.setupwizardlib.SetupWizardItemsLayout;
45 import com.android.setupwizardlib.items.Item;
46 import com.android.setupwizardlib.items.ItemAdapter;
47
48 /**
49  * Onboarding activity for fingerprint enrollment.
50  */
51 public class FingerprintEnrollIntroduction extends FingerprintEnrollBase
52         implements AdapterView.OnItemClickListener {
53
54     protected static final int CHOOSE_LOCK_GENERIC_REQUEST = 1;
55     protected static final int FINGERPRINT_FIND_SENSOR_REQUEST = 2;
56
57     private boolean mHasPassword;
58
59     @Override
60     protected void onCreate(Bundle savedInstanceState) {
61         super.onCreate(savedInstanceState);
62         setContentView(R.layout.fingerprint_enroll_introduction);
63         setHeaderText(R.string.security_settings_fingerprint_enroll_introduction_title);
64         final SetupWizardItemsLayout layout =
65                 (SetupWizardItemsLayout) findViewById(R.id.setup_wizard_layout);
66         layout.getListView().setOnItemClickListener(this);
67         final ItemAdapter adapter = (ItemAdapter) layout.getAdapter();
68         Item item = (Item) adapter.findItemById(R.id.fingerprint_introduction_message_warning);
69         item.setTitle(LearnMoreSpan.linkify(
70                 getText(R.string.security_settings_fingerprint_enroll_introduction_message_warning),
71                 getString(R.string.help_url_fingerprint)));
72         updatePasswordQuality();
73     }
74
75     private void updatePasswordQuality() {
76         final int passwordQuality = new ChooseLockSettingsHelper(this).utils()
77                 .getActivePasswordQuality(mUserId);
78         mHasPassword = passwordQuality != DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
79     }
80
81     @Override
82     protected void onNextButtonClick() {
83         if (!mHasPassword) {
84             // No fingerprints registered, launch into enrollment wizard.
85             launchChooseLock();
86         } else {
87             // Lock thingy is already set up, launch directly into find sensor step from wizard.
88             launchFindSensor(null);
89         }
90     }
91
92     private void launchChooseLock() {
93         Intent intent = getChooseLockIntent();
94         long challenge = getSystemService(FingerprintManager.class).preEnroll();
95         intent.putExtra(ChooseLockGeneric.ChooseLockGenericFragment.MINIMUM_QUALITY_KEY,
96                 DevicePolicyManager.PASSWORD_QUALITY_SOMETHING);
97         intent.putExtra(ChooseLockGeneric.ChooseLockGenericFragment.HIDE_DISABLED_PREFS, true);
98         intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_HAS_CHALLENGE, true);
99         intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE, challenge);
100         intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_FOR_FINGERPRINT, true);
101         if (mUserId != UserHandle.USER_NULL) {
102             intent.putExtra(Intent.EXTRA_USER_ID, mUserId);
103         }
104         startActivityForResult(intent, CHOOSE_LOCK_GENERIC_REQUEST);
105     }
106
107     private void launchFindSensor(byte[] token) {
108         Intent intent = getFindSensorIntent();
109         if (token != null) {
110             intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, token);
111         }
112         if (mUserId != UserHandle.USER_NULL) {
113             intent.putExtra(Intent.EXTRA_USER_ID, mUserId);
114         }
115         startActivityForResult(intent, FINGERPRINT_FIND_SENSOR_REQUEST);
116     }
117
118     protected Intent getChooseLockIntent() {
119         return new Intent(this, ChooseLockGeneric.class);
120     }
121
122     protected Intent getFindSensorIntent() {
123         Intent intent = new Intent(this, FingerprintEnrollFindSensor.class);
124         return intent;
125     }
126
127     @Override
128     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
129         final boolean isResultFinished = resultCode == RESULT_FINISHED;
130         if (requestCode == FINGERPRINT_FIND_SENSOR_REQUEST) {
131             if (isResultFinished || resultCode == RESULT_SKIP) {
132                 final int result = isResultFinished ? RESULT_OK : RESULT_SKIP;
133                 setResult(result, data);
134                 finish();
135                 return;
136             }
137         } else if (requestCode == CHOOSE_LOCK_GENERIC_REQUEST) {
138             if (isResultFinished) {
139                 updatePasswordQuality();
140                 byte[] token = data.getByteArrayExtra(
141                         ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN);
142                 launchFindSensor(token);
143                 return;
144             }
145         }
146         super.onActivityResult(requestCode, resultCode, data);
147     }
148
149     @Override
150     public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
151         final Item item = (Item) parent.getItemAtPosition(position);
152         switch (item.getId()) {
153             case R.id.next_button:
154                 onNextButtonClick();
155                 break;
156             case R.id.cancel_button:
157                 onCancelButtonClick();
158                 break;
159         }
160     }
161
162     @Override
163     protected int getMetricsCategory() {
164         return MetricsEvent.FINGERPRINT_ENROLL_INTRO;
165     }
166
167     protected void onCancelButtonClick() {
168         finish();
169     }
170
171     private static class LearnMoreSpan extends URLSpan {
172         private static final String TAG = "LearnMoreSpan";
173         private static final Typeface TYPEFACE_MEDIUM =
174                 Typeface.create("sans-serif-medium", Typeface.NORMAL);
175
176         private LearnMoreSpan(String url) {
177             super(url);
178         }
179
180         @Override
181         public void onClick(View widget) {
182             Context ctx = widget.getContext();
183             Intent intent = HelpUtils.getHelpIntent(ctx, getURL(), ctx.getClass().getName());
184             try {
185                 ((Activity) ctx).startActivity(intent);
186             } catch (ActivityNotFoundException e) {
187                 Log.w(LearnMoreSpan.TAG,
188                         "Actvity was not found for intent, " + intent.toString());
189             }
190         }
191
192         @Override
193         public void updateDrawState(TextPaint ds) {
194             super.updateDrawState(ds);
195             ds.setUnderlineText(false);
196             ds.setTypeface(TYPEFACE_MEDIUM);
197         }
198
199         public static CharSequence linkify(CharSequence rawText, String uri) {
200             SpannableString msg = new SpannableString(rawText);
201             Annotation[] spans = msg.getSpans(0, msg.length(), Annotation.class);
202             SpannableStringBuilder builder = new SpannableStringBuilder(msg);
203             for (Annotation annotation : spans) {
204                 int start = msg.getSpanStart(annotation);
205                 int end = msg.getSpanEnd(annotation);
206                 LearnMoreSpan link = new LearnMoreSpan(uri);
207                 builder.setSpan(link, start, end, msg.getSpanFlags(link));
208             }
209             return builder;
210         }
211     }
212 }