109b5228ae56283ebcb69d1c295033c74ea868ae5Jay Civelli 209b5228ae56283ebcb69d1c295033c74ea868ae5Jay Civelli/* 309b5228ae56283ebcb69d1c295033c74ea868ae5Jay Civelli * Copyright (C) 2014 The Android Open Source Project 409b5228ae56283ebcb69d1c295033c74ea868ae5Jay Civelli * 509b5228ae56283ebcb69d1c295033c74ea868ae5Jay Civelli * Licensed under the Apache License, Version 2.0 (the "License"); 609b5228ae56283ebcb69d1c295033c74ea868ae5Jay Civelli * you may not use this file except in compliance with the License. 709b5228ae56283ebcb69d1c295033c74ea868ae5Jay Civelli * You may obtain a copy of the License at 809b5228ae56283ebcb69d1c295033c74ea868ae5Jay Civelli * 909b5228ae56283ebcb69d1c295033c74ea868ae5Jay Civelli * http://www.apache.org/licenses/LICENSE-2.0 1009b5228ae56283ebcb69d1c295033c74ea868ae5Jay Civelli * 1109b5228ae56283ebcb69d1c295033c74ea868ae5Jay Civelli * Unless required by applicable law or agreed to in writing, software 1209b5228ae56283ebcb69d1c295033c74ea868ae5Jay Civelli * distributed under the License is distributed on an "AS IS" BASIS, 1309b5228ae56283ebcb69d1c295033c74ea868ae5Jay Civelli * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1409b5228ae56283ebcb69d1c295033c74ea868ae5Jay Civelli * See the License for the specific language governing permissions and 1509b5228ae56283ebcb69d1c295033c74ea868ae5Jay Civelli * limitations under the License. 1609b5228ae56283ebcb69d1c295033c74ea868ae5Jay Civelli */ 1709b5228ae56283ebcb69d1c295033c74ea868ae5Jay Civelli 1809b5228ae56283ebcb69d1c295033c74ea868ae5Jay Civellipackage com.android.settings; 1909b5228ae56283ebcb69d1c295033c74ea868ae5Jay Civelli 2009b5228ae56283ebcb69d1c295033c74ea868ae5Jay Civelliimport android.app.Activity; 2175fe9e027c2f280664c2aaa0a78457fc37bd0e8bJim Millerimport android.app.KeyguardManager; 220e111e69228f310187e02e5abeb82ab184845f77Benjamin Franzimport android.app.admin.DevicePolicyManager; 230e111e69228f310187e02e5abeb82ab184845f77Benjamin Franzimport android.content.Context; 2409b5228ae56283ebcb69d1c295033c74ea868ae5Jay Civelliimport android.content.Intent; 2509b5228ae56283ebcb69d1c295033c74ea868ae5Jay Civelliimport android.os.Bundle; 26c5cde055629a55475601b7e077c432e563258507Clara Bayarriimport android.os.UserManager; 2709b5228ae56283ebcb69d1c295033c74ea868ae5Jay Civelliimport android.util.Log; 2809b5228ae56283ebcb69d1c295033c74ea868ae5Jay Civelli 29b4d52ec370810aa0ebf9e769497d90f6e67d37b3Ricky Waiimport com.android.internal.widget.LockPatternUtils; 30b4d52ec370810aa0ebf9e769497d90f6e67d37b3Ricky Wai 3109b5228ae56283ebcb69d1c295033c74ea868ae5Jay Civelli/** 3209b5228ae56283ebcb69d1c295033c74ea868ae5Jay Civelli * Launch this when you want to confirm the user is present by asking them to enter their 3309b5228ae56283ebcb69d1c295033c74ea868ae5Jay Civelli * PIN/password/pattern. 3409b5228ae56283ebcb69d1c295033c74ea868ae5Jay Civelli */ 3509b5228ae56283ebcb69d1c295033c74ea868ae5Jay Civellipublic class ConfirmDeviceCredentialActivity extends Activity { 3609b5228ae56283ebcb69d1c295033c74ea868ae5Jay Civelli public static final String TAG = ConfirmDeviceCredentialActivity.class.getSimpleName(); 3709b5228ae56283ebcb69d1c295033c74ea868ae5Jay Civelli 38c5cde055629a55475601b7e077c432e563258507Clara Bayarri public static class InternalActivity extends ConfirmDeviceCredentialActivity { 39c5cde055629a55475601b7e077c432e563258507Clara Bayarri } 40c5cde055629a55475601b7e077c432e563258507Clara Bayarri 413ea423ae0ff56d249b6844b3a68c67ee5eba243dSvetoslav public static Intent createIntent(CharSequence title, CharSequence details) { 423ea423ae0ff56d249b6844b3a68c67ee5eba243dSvetoslav Intent intent = new Intent(); 433ea423ae0ff56d249b6844b3a68c67ee5eba243dSvetoslav intent.setClassName("com.android.settings", 443ea423ae0ff56d249b6844b3a68c67ee5eba243dSvetoslav ConfirmDeviceCredentialActivity.class.getName()); 453ea423ae0ff56d249b6844b3a68c67ee5eba243dSvetoslav intent.putExtra(KeyguardManager.EXTRA_TITLE, title); 463ea423ae0ff56d249b6844b3a68c67ee5eba243dSvetoslav intent.putExtra(KeyguardManager.EXTRA_DESCRIPTION, details); 473ea423ae0ff56d249b6844b3a68c67ee5eba243dSvetoslav return intent; 483ea423ae0ff56d249b6844b3a68c67ee5eba243dSvetoslav } 493ea423ae0ff56d249b6844b3a68c67ee5eba243dSvetoslav 506609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales public static Intent createIntent(CharSequence title, CharSequence details, long challenge) { 516609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales Intent intent = new Intent(); 526609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales intent.setClassName("com.android.settings", 536609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales ConfirmDeviceCredentialActivity.class.getName()); 546609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales intent.putExtra(KeyguardManager.EXTRA_TITLE, title); 556609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales intent.putExtra(KeyguardManager.EXTRA_DESCRIPTION, details); 566609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE, challenge); 576609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_HAS_CHALLENGE, true); 586609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales return intent; 596609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales } 606609b0c22ae89a24d1b07dc3c4143452616d4450Andres Morales 6109b5228ae56283ebcb69d1c295033c74ea868ae5Jay Civelli @Override 6209b5228ae56283ebcb69d1c295033c74ea868ae5Jay Civelli public void onCreate(Bundle savedInstanceState) { 6309b5228ae56283ebcb69d1c295033c74ea868ae5Jay Civelli super.onCreate(savedInstanceState); 6409b5228ae56283ebcb69d1c295033c74ea868ae5Jay Civelli 6509b5228ae56283ebcb69d1c295033c74ea868ae5Jay Civelli Intent intent = getIntent(); 6675fe9e027c2f280664c2aaa0a78457fc37bd0e8bJim Miller String title = intent.getStringExtra(KeyguardManager.EXTRA_TITLE); 6775fe9e027c2f280664c2aaa0a78457fc37bd0e8bJim Miller String details = intent.getStringExtra(KeyguardManager.EXTRA_DESCRIPTION); 68194300dff340d67255d12762ffb376b7ba201c87Benjamin Franz int userId = Utils.getCredentialOwnerUserId(this); 69c5cde055629a55475601b7e077c432e563258507Clara Bayarri if (isInternalActivity()) { 70194300dff340d67255d12762ffb376b7ba201c87Benjamin Franz try { 71194300dff340d67255d12762ffb376b7ba201c87Benjamin Franz userId = Utils.getUserIdFromBundle(this, intent.getExtras()); 72194300dff340d67255d12762ffb376b7ba201c87Benjamin Franz } catch (SecurityException se) { 73194300dff340d67255d12762ffb376b7ba201c87Benjamin Franz Log.e(TAG, "Invalid intent extra", se); 74c5cde055629a55475601b7e077c432e563258507Clara Bayarri } 75c5cde055629a55475601b7e077c432e563258507Clara Bayarri } 76b4d52ec370810aa0ebf9e769497d90f6e67d37b3Ricky Wai final boolean isManagedProfile = Utils.isManagedProfile(UserManager.get(this), userId); 770e111e69228f310187e02e5abeb82ab184845f77Benjamin Franz // if the client app did not hand in a title and we are about to show the work challenge, 780e111e69228f310187e02e5abeb82ab184845f77Benjamin Franz // check whether there is a policy setting the organization name and use that as title 79b4d52ec370810aa0ebf9e769497d90f6e67d37b3Ricky Wai if ((title == null) && isManagedProfile) { 800e111e69228f310187e02e5abeb82ab184845f77Benjamin Franz title = getTitleFromOrganizationName(userId); 810e111e69228f310187e02e5abeb82ab184845f77Benjamin Franz } 8274a2283d2425107f7b39a29d8db7947d8c6f8c7cJorim Jaggi ChooseLockSettingsHelper helper = new ChooseLockSettingsHelper(this); 83b4d52ec370810aa0ebf9e769497d90f6e67d37b3Ricky Wai final LockPatternUtils lockPatternUtils = new LockPatternUtils(this); 84b4d52ec370810aa0ebf9e769497d90f6e67d37b3Ricky Wai boolean launched; 85b4d52ec370810aa0ebf9e769497d90f6e67d37b3Ricky Wai // If the target is a managed user and user key not unlocked yet, we will force unlock 86b4d52ec370810aa0ebf9e769497d90f6e67d37b3Ricky Wai // tied profile so it will enable work mode and unlock managed profile, when personal 87b4d52ec370810aa0ebf9e769497d90f6e67d37b3Ricky Wai // challenge is unlocked. 88b4d52ec370810aa0ebf9e769497d90f6e67d37b3Ricky Wai if (isManagedProfile && isInternalActivity() 89b4d52ec370810aa0ebf9e769497d90f6e67d37b3Ricky Wai && !lockPatternUtils.isSeparateProfileChallengeEnabled(userId)) { 90b4d52ec370810aa0ebf9e769497d90f6e67d37b3Ricky Wai // We set the challenge as 0L, so it will force to unlock managed profile when it 91b4d52ec370810aa0ebf9e769497d90f6e67d37b3Ricky Wai // unlocks primary profile screen lock, by calling verifyTiedProfileChallenge() 925e0a46bff6d801a52d9c50d19e25286a2afc8b40Victor Chang launched = helper.launchConfirmationActivityWithExternalAndChallenge( 935e0a46bff6d801a52d9c50d19e25286a2afc8b40Victor Chang 0 /* request code */, null /* title */, title, details, true /* isExternal */, 945e0a46bff6d801a52d9c50d19e25286a2afc8b40Victor Chang 0L /* challenge */, userId); 95b4d52ec370810aa0ebf9e769497d90f6e67d37b3Ricky Wai } else { 96b4d52ec370810aa0ebf9e769497d90f6e67d37b3Ricky Wai launched = helper.launchConfirmationActivity(0 /* request code */, null /* title */, 97b4d52ec370810aa0ebf9e769497d90f6e67d37b3Ricky Wai title, details, false /* returnCredentials */, true /* isExternal */, userId); 98b4d52ec370810aa0ebf9e769497d90f6e67d37b3Ricky Wai } 99b4d52ec370810aa0ebf9e769497d90f6e67d37b3Ricky Wai if (!launched) { 10074a2283d2425107f7b39a29d8db7947d8c6f8c7cJorim Jaggi Log.d(TAG, "No pattern, password or PIN set."); 10174a2283d2425107f7b39a29d8db7947d8c6f8c7cJorim Jaggi setResult(Activity.RESULT_OK); 10209b5228ae56283ebcb69d1c295033c74ea868ae5Jay Civelli } 10309b5228ae56283ebcb69d1c295033c74ea868ae5Jay Civelli finish(); 10409b5228ae56283ebcb69d1c295033c74ea868ae5Jay Civelli } 105c5cde055629a55475601b7e077c432e563258507Clara Bayarri 106c5cde055629a55475601b7e077c432e563258507Clara Bayarri private boolean isInternalActivity() { 107c5cde055629a55475601b7e077c432e563258507Clara Bayarri return this instanceof ConfirmDeviceCredentialActivity.InternalActivity; 108c5cde055629a55475601b7e077c432e563258507Clara Bayarri } 1090e111e69228f310187e02e5abeb82ab184845f77Benjamin Franz 1100e111e69228f310187e02e5abeb82ab184845f77Benjamin Franz private String getTitleFromOrganizationName(int userId) { 1110e111e69228f310187e02e5abeb82ab184845f77Benjamin Franz DevicePolicyManager dpm = (DevicePolicyManager) getSystemService( 1120e111e69228f310187e02e5abeb82ab184845f77Benjamin Franz Context.DEVICE_POLICY_SERVICE); 113435ec6e6f4f49b7f7d968203724966c1f28281d7Michal Karpinski CharSequence organizationNameForUser = (dpm != null) 114435ec6e6f4f49b7f7d968203724966c1f28281d7Michal Karpinski ? dpm.getOrganizationNameForUser(userId) : null; 115435ec6e6f4f49b7f7d968203724966c1f28281d7Michal Karpinski return organizationNameForUser != null ? organizationNameForUser.toString() : null; 1160e111e69228f310187e02e5abeb82ab184845f77Benjamin Franz } 11709b5228ae56283ebcb69d1c295033c74ea868ae5Jay Civelli} 118