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;
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 
31 /**
32  * Launch this when you want to confirm the user is present by asking them to enter their
33  * PIN/password/pattern.
34  */
35 public class ConfirmDeviceCredentialActivity extends Activity {
36     public static final String TAG = ConfirmDeviceCredentialActivity.class.getSimpleName();
37 
38     public static class InternalActivity extends ConfirmDeviceCredentialActivity {
39     }
40 
createIntent(CharSequence title, CharSequence details)41     public static Intent createIntent(CharSequence title, CharSequence details) {
42         Intent intent = new Intent();
43         intent.setClassName("com.android.settings",
44                 ConfirmDeviceCredentialActivity.class.getName());
45         intent.putExtra(KeyguardManager.EXTRA_TITLE, title);
46         intent.putExtra(KeyguardManager.EXTRA_DESCRIPTION, details);
47         return intent;
48     }
49 
createIntent(CharSequence title, CharSequence details, long challenge)50     public static Intent createIntent(CharSequence title, CharSequence details, long challenge) {
51         Intent intent = new Intent();
52         intent.setClassName("com.android.settings",
53                 ConfirmDeviceCredentialActivity.class.getName());
54         intent.putExtra(KeyguardManager.EXTRA_TITLE, title);
55         intent.putExtra(KeyguardManager.EXTRA_DESCRIPTION, details);
56         intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE, challenge);
57         intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_HAS_CHALLENGE, true);
58         return intent;
59     }
60 
61     @Override
onCreate(Bundle savedInstanceState)62     public void onCreate(Bundle savedInstanceState) {
63         super.onCreate(savedInstanceState);
64 
65         Intent intent = getIntent();
66         String title = intent.getStringExtra(KeyguardManager.EXTRA_TITLE);
67         String details = intent.getStringExtra(KeyguardManager.EXTRA_DESCRIPTION);
68         int userId = Utils.getCredentialOwnerUserId(this);
69         if (isInternalActivity()) {
70             try {
71                 userId = Utils.getUserIdFromBundle(this, intent.getExtras());
72             } catch (SecurityException se) {
73                 Log.e(TAG, "Invalid intent extra", se);
74             }
75         }
76         final boolean isManagedProfile = Utils.isManagedProfile(UserManager.get(this), userId);
77         // if the client app did not hand in a title and we are about to show the work challenge,
78         // check whether there is a policy setting the organization name and use that as title
79         if ((title == null) && isManagedProfile) {
80             title = getTitleFromOrganizationName(userId);
81         }
82         ChooseLockSettingsHelper helper = new ChooseLockSettingsHelper(this);
83         final LockPatternUtils lockPatternUtils = new LockPatternUtils(this);
84         boolean launched;
85         // If the target is a managed user and user key not unlocked yet, we will force unlock
86         // tied profile so it will enable work mode and unlock managed profile, when personal
87         // challenge is unlocked.
88         if (isManagedProfile && isInternalActivity()
89                 && !lockPatternUtils.isSeparateProfileChallengeEnabled(userId)) {
90             // We set the challenge as 0L, so it will force to unlock managed profile when it
91             // unlocks primary profile screen lock, by calling verifyTiedProfileChallenge()
92             launched = helper.launchConfirmationActivityWithExternalAndChallenge(
93                     0 /* request code */, null /* title */, title, details, true /* isExternal */,
94                     0L /* challenge */, userId);
95         } else {
96             launched = helper.launchConfirmationActivity(0 /* request code */, null /* title */,
97                     title, details, false /* returnCredentials */, true /* isExternal */, userId);
98         }
99         if (!launched) {
100             Log.d(TAG, "No pattern, password or PIN set.");
101             setResult(Activity.RESULT_OK);
102         }
103         finish();
104     }
105 
isInternalActivity()106     private boolean isInternalActivity() {
107         return this instanceof ConfirmDeviceCredentialActivity.InternalActivity;
108     }
109 
getTitleFromOrganizationName(int userId)110     private String getTitleFromOrganizationName(int userId) {
111         DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(
112                 Context.DEVICE_POLICY_SERVICE);
113         CharSequence organizationNameForUser = (dpm != null)
114                 ? dpm.getOrganizationNameForUser(userId) : null;
115         return organizationNameForUser != null ? organizationNameForUser.toString() : null;
116     }
117 }
118