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