/* * Copyright (C) 2011 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.example.training.deviceadmin; import android.app.Activity; import android.app.admin.DeviceAdminReceiver; import android.app.admin.DevicePolicyManager; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.os.Build; public class Policy { public static final int REQUEST_ADD_DEVICE_ADMIN = 1; private static final String APP_PREF = "APP_PREF"; private static final String KEY_PASSWORD_LENGTH = "PW_LENGTH"; private static final String KEY_PASSWORD_QUALITY = "PW_QUALITY"; private static final String KEY_PASSWORD_MIN_UPPERCASE = "PW_MIN_UPPERCASE"; // Password quality values. This list must match the list // found in res/values/arrays.xml final static int[] PASSWORD_QUALITY_VALUES = new int[] { DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED, DevicePolicyManager.PASSWORD_QUALITY_SOMETHING, DevicePolicyManager.PASSWORD_QUALITY_NUMERIC, DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC, DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC, DevicePolicyManager.PASSWORD_QUALITY_COMPLEX }; private int mPasswordQuality; private int mPasswordLength; private int mPasswordMinUpperCase; private Context mContext; private DevicePolicyManager mDPM; private ComponentName mPolicyAdmin; public Policy(Context context) { mContext = context; mPasswordQuality = -1; mPasswordLength = 0; mPasswordMinUpperCase = 0; mDPM = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE); mPolicyAdmin = new ComponentName(context, PolicyAdmin.class); } /** * Saves the policy parameters. * * @param passwordQuality Password quality. * @param passwordLength Password minimum length. * @param passwordUppercase Password minimum number of upper case alphabets. */ public void saveToLocal(int passwordQuality, int passwordLength, int passwordMinUppercase) { SharedPreferences.Editor editor = mContext.getSharedPreferences(APP_PREF, Context.MODE_PRIVATE).edit(); if (mPasswordQuality != passwordQuality) { editor.putInt(KEY_PASSWORD_QUALITY, passwordQuality); mPasswordQuality = passwordQuality; } if (mPasswordLength != passwordLength) { editor.putInt(KEY_PASSWORD_LENGTH, passwordLength); mPasswordLength = passwordLength; } if (mPasswordMinUpperCase != passwordMinUppercase) { editor.putInt(KEY_PASSWORD_MIN_UPPERCASE, passwordMinUppercase); mPasswordMinUpperCase = passwordMinUppercase; } editor.commit(); } public void readFromLocal() { SharedPreferences prefs = mContext.getSharedPreferences(APP_PREF, Context.MODE_PRIVATE); mPasswordQuality = prefs.getInt(KEY_PASSWORD_QUALITY, -1); mPasswordLength = prefs.getInt(KEY_PASSWORD_LENGTH, -1); mPasswordMinUpperCase = prefs.getInt(KEY_PASSWORD_MIN_UPPERCASE, -1); } /** * Getter for password quality. * * @return */ public int getPasswordQuality() { return mPasswordQuality; } /** * Getter for password length. * * @return */ public int getPasswordLength() { return mPasswordLength; } /** * Getter for password minimum upper case alphabets. * * @return */ public int getPasswordMinUpperCase() { return mPasswordMinUpperCase; } /** * Getter for the policy administrator ComponentName object. * * @return */ public ComponentName getPolicyAdmin() { return mPolicyAdmin; } /** * Indicates whether the device administrator is currently active. * * @return */ public boolean isAdminActive() { return mDPM.isAdminActive(mPolicyAdmin); } public boolean isActivePasswordSufficient() { return mDPM.isActivePasswordSufficient(); } public boolean isDeviceSecured() { return isAdminActive() && isActivePasswordSufficient(); } /** * Configure policy defined in the object. */ public void configurePolicy() { mDPM.setPasswordQuality(mPolicyAdmin, PASSWORD_QUALITY_VALUES[mPasswordQuality]); mDPM.setPasswordMinimumLength(mPolicyAdmin, mPasswordLength); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { mDPM.setPasswordMinimumUpperCase(mPolicyAdmin, mPasswordMinUpperCase); } } /** * Through the PolicyAdmin receiver, the app can use this to trap various device * administration events, such as password change, incorrect password entry, etc. * */ public static class PolicyAdmin extends DeviceAdminReceiver { @Override public void onDisabled(Context context, Intent intent) { // Called when the app is about to be deactivated as a device administrator. // Deletes previously stored password policy. super.onDisabled(context, intent); SharedPreferences prefs = context.getSharedPreferences(APP_PREF, Activity.MODE_PRIVATE); prefs.edit().clear().commit(); } } }