/*
 * Copyright (C) 2016 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License
 */

package com.android.settings;

import android.content.Context;
import android.content.Intent;

/**
 * Helper for handling managed passwords in security settings UI.
 * It provides resources that should be shown in settings UI when lock password quality is set to
 * {@link android.app.admin.DevicePolicyManager#PASSWORD_QUALITY_MANAGED} and hooks for implementing
 * an option for setting the password quality to
 * {@link android.app.admin.DevicePolicyManager#PASSWORD_QUALITY_MANAGED}.
 */
public class ManagedLockPasswordProvider {
    /** Factory method to make it easier to inject extended ManagedLockPasswordProviders. */
    static ManagedLockPasswordProvider get(Context context, int userId) {
        return new ManagedLockPasswordProvider();
    }

    protected ManagedLockPasswordProvider() {}

    /**
     * Whether choosing/setting a managed lock password is supported for the user.
     * Please update {@link #getPickerOptionTitle(boolean)} if overridden to return true.
     */
    boolean isSettingManagedPasswordSupported() { return false; }

    /**
     * Whether the user should be able to choose managed lock password.
     */
    boolean isManagedPasswordChoosable() { return false; }

    /**
     * Returns title for managed password preference in security (lock) setting picker.
     * Should be overridden if {@link #isManagedPasswordSupported()} returns true.
     * @param forFingerprint Whether fingerprint unlock is enabled.
     */
    String getPickerOptionTitle(boolean forFingerprint) { return ""; }

    /**
     * Gets resource id of the lock screen preference that should be displayed in security settings
     * if the current password quality is set to
     * {@link android.app.admin.DevicePolicyManager#PASSWORD_QUALITY_MANAGED}.
     * @param forProfile Whether the settings are shown for a user profile rather than a user.
     */
    int getResIdForLockUnlockScreen(boolean forProfile) {
        return forProfile ? R.xml.security_settings_password_profile
                : R.xml.security_settings_password;
    }

    /**
     * Gets resource id of the subscreen that should be shown after clicking gear icon for lock
     * screen preference in security settings if the current password quality is set to
     * {@link android.app.admin.DevicePolicyManager#PASSWORD_QUALITY_MANAGED}.
     */
    int getResIdForLockUnlockSubScreen() {
        return R.xml.security_settings_password_sub;
    }

    /**
     * Creates intent that should be launched when user chooses managed password in the lock
     * settings picker.
     * @param requirePasswordToDecrypt Whether a password is needed to decrypt the user.
     * @param password Current lock password.
     * @return Intent that should update lock password to a managed password.
     */
    Intent createIntent(boolean requirePasswordToDecrypt, String password) {
        return null;
    }
}
