• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 
2 /*
3  * Copyright (C) 2014 The Android Open Source Project
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 
18 package com.android.settings.password;
19 
20 import android.app.Activity;
21 import android.app.KeyguardManager;
22 import android.app.admin.DevicePolicyManager;
23 import android.content.Context;
24 import android.content.Intent;
25 import android.os.Bundle;
26 import android.os.UserManager;
27 import android.util.Log;
28 
29 import com.android.internal.widget.LockPatternUtils;
30 import com.android.settings.Utils;
31 
32 /**
33  * Launch this when you want to confirm the user is present by asking them to enter their
34  * PIN/password/pattern.
35  */
36 public class ConfirmDeviceCredentialActivity extends Activity {
37     public static final String TAG = ConfirmDeviceCredentialActivity.class.getSimpleName();
38 
39     public static class InternalActivity extends ConfirmDeviceCredentialActivity {
40     }
41 
createIntent(CharSequence title, CharSequence details)42     public static Intent createIntent(CharSequence title, CharSequence details) {
43         Intent intent = new Intent();
44         intent.setClassName("com.android.settings",
45                 ConfirmDeviceCredentialActivity.class.getName());
46         intent.putExtra(KeyguardManager.EXTRA_TITLE, title);
47         intent.putExtra(KeyguardManager.EXTRA_DESCRIPTION, details);
48         return intent;
49     }
50 
createIntent(CharSequence title, CharSequence details, long challenge)51     public static Intent createIntent(CharSequence title, CharSequence details, long challenge) {
52         Intent intent = new Intent();
53         intent.setClassName("com.android.settings",
54                 ConfirmDeviceCredentialActivity.class.getName());
55         intent.putExtra(KeyguardManager.EXTRA_TITLE, title);
56         intent.putExtra(KeyguardManager.EXTRA_DESCRIPTION, details);
57         intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE, challenge);
58         intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_HAS_CHALLENGE, true);
59         return intent;
60     }
61 
62     @Override
onCreate(Bundle savedInstanceState)63     public void onCreate(Bundle savedInstanceState) {
64         super.onCreate(savedInstanceState);
65 
66         Intent intent = getIntent();
67         String title = intent.getStringExtra(KeyguardManager.EXTRA_TITLE);
68         String details = intent.getStringExtra(KeyguardManager.EXTRA_DESCRIPTION);
69         String alternateButton = intent.getStringExtra(
70                 KeyguardManager.EXTRA_ALTERNATE_BUTTON_LABEL);
71         boolean frp = KeyguardManager.ACTION_CONFIRM_FRP_CREDENTIAL.equals(intent.getAction());
72 
73         int userId = Utils.getCredentialOwnerUserId(this);
74         if (isInternalActivity()) {
75             try {
76                 userId = Utils.getUserIdFromBundle(this, intent.getExtras());
77             } catch (SecurityException se) {
78                 Log.e(TAG, "Invalid intent extra", se);
79             }
80         }
81         final boolean isManagedProfile = UserManager.get(this).isManagedProfile(userId);
82         // if the client app did not hand in a title and we are about to show the work challenge,
83         // check whether there is a policy setting the organization name and use that as title
84         if ((title == null) && isManagedProfile) {
85             title = getTitleFromOrganizationName(userId);
86         }
87         ChooseLockSettingsHelper helper = new ChooseLockSettingsHelper(this);
88         final LockPatternUtils lockPatternUtils = new LockPatternUtils(this);
89         boolean launched;
90         // If the target is a managed user and user key not unlocked yet, we will force unlock
91         // tied profile so it will enable work mode and unlock managed profile, when personal
92         // challenge is unlocked.
93         if (frp) {
94             launched = helper.launchFrpConfirmationActivity(0, title, details, alternateButton);
95         } else if (isManagedProfile && isInternalActivity()
96                 && !lockPatternUtils.isSeparateProfileChallengeEnabled(userId)) {
97             // We set the challenge as 0L, so it will force to unlock managed profile when it
98             // unlocks primary profile screen lock, by calling verifyTiedProfileChallenge()
99             launched = helper.launchConfirmationActivityWithExternalAndChallenge(
100                     0 /* request code */, null /* title */, title, details, true /* isExternal */,
101                     0L /* challenge */, userId);
102         } else {
103             launched = helper.launchConfirmationActivity(0 /* request code */, null /* title */,
104                     title, details, false /* returnCredentials */, true /* isExternal */, userId);
105         }
106         if (!launched) {
107             Log.d(TAG, "No pattern, password or PIN set.");
108             setResult(Activity.RESULT_OK);
109         }
110         finish();
111     }
112 
isInternalActivity()113     private boolean isInternalActivity() {
114         return this instanceof ConfirmDeviceCredentialActivity.InternalActivity;
115     }
116 
getTitleFromOrganizationName(int userId)117     private String getTitleFromOrganizationName(int userId) {
118         DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(
119                 Context.DEVICE_POLICY_SERVICE);
120         CharSequence organizationNameForUser = (dpm != null)
121                 ? dpm.getOrganizationNameForUser(userId) : null;
122         return organizationNameForUser != null ? organizationNameForUser.toString() : null;
123     }
124 }
125