/* * Copyright (C) 2010 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.android.apis.app; import com.example.android.apis.R; import android.app.Activity; import android.app.ActivityManager; import android.app.AlertDialog; import android.app.admin.DeviceAdminReceiver; import android.app.admin.DevicePolicyManager; import android.content.ComponentName; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemSelectedListener; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.Spinner; import android.widget.TextView; import android.widget.Toast; import java.text.DateFormat; import java.util.Date; /** * Example of a do-nothing admin class. When enabled, it lets you control * some of its policy and reports when there is interesting activity. */ public class DeviceAdminSample extends DeviceAdminReceiver { private static final String TAG = "DeviceAdminSample"; private static final long MS_PER_DAY = 86400 * 1000; private static final long MS_PER_HOUR = 3600 * 1000; private static final long MS_PER_MINUTE = 60 * 1000; static SharedPreferences getSamplePreferences(Context context) { return context.getSharedPreferences(DeviceAdminReceiver.class.getName(), 0); } static String PREF_PASSWORD_QUALITY = "password_quality"; static String PREF_PASSWORD_LENGTH = "password_length"; static String PREF_PASSWORD_MINIMUM_LETTERS = "password_minimum_letters"; static String PREF_PASSWORD_MINIMUM_UPPERCASE = "password_minimum_uppercase"; static String PREF_PASSWORD_MINIMUM_LOWERCASE = "password_minimum_lowercase"; static String PREF_PASSWORD_MINIMUM_NUMERIC = "password_minimum_numeric"; static String PREF_PASSWORD_MINIMUM_SYMBOLS = "password_minimum_symbols"; static String PREF_PASSWORD_MINIMUM_NONLETTER = "password_minimum_nonletter"; static String PREF_PASSWORD_HISTORY_LENGTH = "password_history_length"; static String PREF_PASSWORD_EXPIRATION_TIMEOUT = "password_expiration_timeout"; static String PREF_MAX_FAILED_PW = "max_failed_pw"; void showToast(Context context, CharSequence msg) { Toast.makeText(context, "Sample Device Admin: " + msg, Toast.LENGTH_SHORT).show(); } @Override public void onEnabled(Context context, Intent intent) { showToast(context, "enabled"); } @Override public CharSequence onDisableRequested(Context context, Intent intent) { return "This is an optional message to warn the user about disabling."; } @Override public void onDisabled(Context context, Intent intent) { showToast(context, "disabled"); } @Override public void onPasswordChanged(Context context, Intent intent) { showToast(context, "pw changed"); } @Override public void onPasswordFailed(Context context, Intent intent) { showToast(context, "pw failed"); } @Override public void onPasswordSucceeded(Context context, Intent intent) { showToast(context, "pw succeeded"); } static String countdownString(long time) { long days = time / MS_PER_DAY; long hours = (time / MS_PER_HOUR) % 24; long minutes = (time / MS_PER_MINUTE) % 60; return days + "d" + hours + "h" + minutes + "m"; } @Override public void onPasswordExpiring(Context context, Intent intent) { DevicePolicyManager dpm = (DevicePolicyManager) context.getSystemService( Context.DEVICE_POLICY_SERVICE); long expr = dpm.getPasswordExpiration(new ComponentName(context, DeviceAdminSample.class)); long delta = expr - System.currentTimeMillis(); boolean expired = delta < 0L; String msg = expired ? "Password expired " : "Password will expire " + countdownString(Math.abs(delta)) + (expired ? " ago" : " from now"); showToast(context, msg); Log.v(TAG, msg); } /** * <p>UI control for the sample device admin. This provides an interface * to enable, disable, and perform other operations with it to see * their effect.</p> * * <p>Note that this is implemented as an inner class only keep the sample * all together; typically this code would appear in some separate class. */ public static class Controller extends Activity { static final int REQUEST_CODE_ENABLE_ADMIN = 1; static final int REQUEST_CODE_START_ENCRYPTION = 2; private static final long MS_PER_MINUTE = 60*1000; DevicePolicyManager mDPM; ActivityManager mAM; ComponentName mDeviceAdminSample; Button mEnableButton; Button mDisableButton; // Password quality spinner choices // This list must match the list found in samples/ApiDemos/res/values/arrays.xml final static int mPasswordQualityValues[] = 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 }; Spinner mPasswordQuality; EditText mPasswordLength; EditText mPasswordMinimumLetters; EditText mPasswordMinimumUppercase; EditText mPasswordMinimumLowercase; EditText mPasswordMinimumNumeric; EditText mPasswordMinimumSymbols; EditText mPasswordMinimumNonLetter; EditText mPasswordHistoryLength; Button mSetPasswordButton; EditText mPassword; Button mResetPasswordButton; EditText mMaxFailedPw; Button mForceLockButton; Button mWipeDataButton; Button mWipeAllDataButton; private Button mTimeoutButton; private EditText mTimeout; private EditText mPasswordExpirationTimeout; private Button mPasswordExpirationButton; private TextView mPasswordExpirationStatus; private Button mPasswordExpirationStatusButton; private Button mEnableEncryptionButton; private Button mDisableEncryptionButton; private Button mActivateEncryptionButton; private Button mEncryptionStatusButton; private TextView mEncryptionStatus; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mDPM = (DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE); mAM = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE); mDeviceAdminSample = new ComponentName(Controller.this, DeviceAdminSample.class); setContentView(R.layout.device_admin_sample); // Watch for button clicks. mEnableButton = (Button)findViewById(R.id.enable); mEnableButton.setOnClickListener(mEnableListener); mDisableButton = (Button)findViewById(R.id.disable); mDisableButton.setOnClickListener(mDisableListener); mPasswordQuality = (Spinner)findViewById(R.id.password_quality); ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource( this, R.array.password_qualities, android.R.layout.simple_spinner_item); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); mPasswordQuality.setAdapter(adapter); mPasswordQuality.setOnItemSelectedListener( new OnItemSelectedListener() { public void onItemSelected( AdapterView<?> parent, View view, int position, long id) { setPasswordQuality(mPasswordQualityValues[position]); } public void onNothingSelected(AdapterView<?> parent) { setPasswordQuality(DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED); } }); mPasswordLength = (EditText)findViewById(R.id.password_length); mPasswordLength.addTextChangedListener(new TextWatcher() { public void afterTextChanged(Editable s) { } public void beforeTextChanged(CharSequence s, int start, int count, int after) { } public void onTextChanged(CharSequence s, int start, int before, int count) { try { setPasswordLength(Integer.parseInt(s.toString())); } catch (NumberFormatException e) { } } }); mPasswordMinimumLetters = (EditText)findViewById(R.id.password_minimum_letters); mPasswordMinimumLetters.addTextChangedListener(new TextWatcher() { public void afterTextChanged(Editable s) { } public void beforeTextChanged(CharSequence s, int start, int count, int after) { } public void onTextChanged(CharSequence s, int start, int before, int count) { try { setPasswordMinimumLetters(Integer.parseInt(s.toString())); } catch (NumberFormatException e) { } } }); mPasswordMinimumUppercase = (EditText)findViewById(R.id.password_minimum_uppercase); mPasswordMinimumUppercase.addTextChangedListener(new TextWatcher() { public void afterTextChanged(Editable s) { } public void beforeTextChanged(CharSequence s, int start, int count, int after) { } public void onTextChanged(CharSequence s, int start, int before, int count) { try { setPasswordMinimumUppercase(Integer.parseInt(s.toString())); } catch (NumberFormatException e) { } } }); mPasswordMinimumLowercase = (EditText)findViewById(R.id.password_minimum_lowercase); mPasswordMinimumLowercase.addTextChangedListener(new TextWatcher() { public void afterTextChanged(Editable s) { } public void beforeTextChanged(CharSequence s, int start, int count, int after) { } public void onTextChanged(CharSequence s, int start, int before, int count) { try { setPasswordMinimumLowercase(Integer.parseInt(s.toString())); } catch (NumberFormatException e) { } } }); mPasswordMinimumNumeric = (EditText)findViewById(R.id.password_minimum_numeric); mPasswordMinimumNumeric.addTextChangedListener(new TextWatcher() { public void afterTextChanged(Editable s) { } public void beforeTextChanged(CharSequence s, int start, int count, int after) { } public void onTextChanged(CharSequence s, int start, int before, int count) { try { setPasswordMinimumNumeric(Integer.parseInt(s.toString())); } catch (NumberFormatException e) { } } }); mPasswordMinimumSymbols = (EditText)findViewById(R.id.password_minimum_symbols); mPasswordMinimumSymbols.addTextChangedListener(new TextWatcher() { public void afterTextChanged(Editable s) { } public void beforeTextChanged(CharSequence s, int start, int count, int after) { } public void onTextChanged(CharSequence s, int start, int before, int count) { try { setPasswordMinimumSymbols(Integer.parseInt(s.toString())); } catch (NumberFormatException e) { } } }); mPasswordMinimumNonLetter = (EditText)findViewById(R.id.password_minimum_nonletter); mPasswordMinimumNonLetter.addTextChangedListener(new TextWatcher() { public void afterTextChanged(Editable s) { } public void beforeTextChanged(CharSequence s, int start, int count, int after) { } public void onTextChanged(CharSequence s, int start, int before, int count) { try { setPasswordMinimumNonLetter(Integer.parseInt(s.toString())); } catch (NumberFormatException e) { } } }); mPasswordHistoryLength = (EditText)findViewById(R.id.password_history_length); mPasswordHistoryLength.addTextChangedListener(new TextWatcher() { public void afterTextChanged(Editable s) { } public void beforeTextChanged(CharSequence s, int start, int count, int after) { } public void onTextChanged(CharSequence s, int start, int before, int count) { try { setPasswordHistoryLength(Integer.parseInt(s.toString())); } catch (NumberFormatException e) { } } }); mPasswordExpirationTimeout = (EditText)findViewById(R.id.password_expiration); mPasswordExpirationButton = (Button) findViewById(R.id.update_expiration_button); mPasswordExpirationButton.setOnClickListener(new OnClickListener() { public void onClick(View v) { try { setPasswordExpiration( Long.parseLong(mPasswordExpirationTimeout.getText().toString())); } catch (NumberFormatException nfe) { } updatePasswordExpirationStatus(); } }); mPasswordExpirationStatus = (TextView) findViewById(R.id.password_expiration_status); mPasswordExpirationStatusButton = (Button) findViewById(R.id.update_expiration_status_button); mPasswordExpirationStatusButton.setOnClickListener(new OnClickListener() { public void onClick(View v) { updatePasswordExpirationStatus(); } }); mSetPasswordButton = (Button)findViewById(R.id.set_password); mSetPasswordButton.setOnClickListener(mSetPasswordListener); mPassword = (EditText)findViewById(R.id.password); mResetPasswordButton = (Button)findViewById(R.id.reset_password); mResetPasswordButton.setOnClickListener(mResetPasswordListener); mMaxFailedPw = (EditText)findViewById(R.id.max_failed_pw); mMaxFailedPw.addTextChangedListener(new TextWatcher() { public void afterTextChanged(Editable s) { } public void beforeTextChanged(CharSequence s, int start, int count, int after) { } public void onTextChanged(CharSequence s, int start, int before, int count) { try { int maxFailCount = Integer.parseInt(s.toString()); if (maxFailCount > 0) { Toast.makeText(Controller.this, "WARNING: Phone will wipe after " + s + " incorrect passwords", Toast.LENGTH_SHORT).show(); } setMaxFailedPw(maxFailCount); } catch (NumberFormatException e) { } } }); mForceLockButton = (Button)findViewById(R.id.force_lock); mForceLockButton.setOnClickListener(mForceLockListener); mWipeDataButton = (Button)findViewById(R.id.wipe_data); mWipeDataButton.setOnClickListener(mWipeDataListener); mWipeAllDataButton = (Button)findViewById(R.id.wipe_all_data); mWipeAllDataButton.setOnClickListener(mWipeDataListener); mTimeout = (EditText) findViewById(R.id.timeout); mTimeoutButton = (Button) findViewById(R.id.set_timeout); mTimeoutButton.setOnClickListener(mSetTimeoutListener); mEnableEncryptionButton = (Button) findViewById(R.id.encryption_enable_button); mEnableEncryptionButton.setOnClickListener(mEncryptionButtonListener); mDisableEncryptionButton = (Button) findViewById(R.id.encryption_disable_button); mDisableEncryptionButton.setOnClickListener(mEncryptionButtonListener); mActivateEncryptionButton = (Button) findViewById(R.id.encryption_activate_button); mActivateEncryptionButton.setOnClickListener(mEncryptionButtonListener); mEncryptionStatusButton = (Button) findViewById(R.id.encryption_update_status_button); mEncryptionStatusButton.setOnClickListener(mEncryptionButtonListener); mEncryptionStatus = (TextView) findViewById(R.id.encryption_status); } void updateButtonStates() { boolean active = mDPM.isAdminActive(mDeviceAdminSample); if (active) { mEnableButton.setEnabled(false); mDisableButton.setEnabled(true); mPasswordQuality.setEnabled(true); mPasswordLength.setEnabled(true); mPasswordMinimumLetters.setEnabled(true); mPasswordMinimumUppercase.setEnabled(true); mPasswordMinimumLowercase.setEnabled(true); mPasswordMinimumSymbols.setEnabled(true); mPasswordMinimumNumeric.setEnabled(true); mPasswordMinimumNonLetter.setEnabled(true); mPasswordHistoryLength.setEnabled(true); mSetPasswordButton.setEnabled(true); mPassword.setEnabled(true); mResetPasswordButton.setEnabled(true); mForceLockButton.setEnabled(true); mWipeDataButton.setEnabled(true); mWipeAllDataButton.setEnabled(true); mEnableEncryptionButton.setEnabled(true); mDisableEncryptionButton.setEnabled(true); mActivateEncryptionButton.setEnabled(true); mEncryptionStatusButton.setEnabled(true); } else { mEnableButton.setEnabled(true); mDisableButton.setEnabled(false); mPasswordQuality.setEnabled(false); mPasswordLength.setEnabled(false); mPasswordMinimumLetters.setEnabled(false); mPasswordMinimumUppercase.setEnabled(false); mPasswordMinimumLowercase.setEnabled(false); mPasswordMinimumSymbols.setEnabled(false); mPasswordMinimumNumeric.setEnabled(false); mPasswordMinimumNonLetter.setEnabled(false); mPasswordHistoryLength.setEnabled(false); mSetPasswordButton.setEnabled(false); mPassword.setEnabled(false); mResetPasswordButton.setEnabled(false); mForceLockButton.setEnabled(false); mWipeDataButton.setEnabled(false); mWipeAllDataButton.setEnabled(false); mEnableEncryptionButton.setEnabled(false); mDisableEncryptionButton.setEnabled(false); mActivateEncryptionButton.setEnabled(false); mEncryptionStatusButton.setEnabled(false); } } void updateControls() { SharedPreferences prefs = getSamplePreferences(this); final int pwQuality = prefs.getInt(PREF_PASSWORD_QUALITY, DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED); final int pwLength = prefs.getInt(PREF_PASSWORD_LENGTH, 0); final int pwMinLetters = prefs.getInt(PREF_PASSWORD_MINIMUM_LETTERS, 0); final int pwMinUppercase = prefs.getInt(PREF_PASSWORD_MINIMUM_UPPERCASE, 0); final int pwMinLowercase = prefs.getInt(PREF_PASSWORD_MINIMUM_LOWERCASE, 0); final int pwMinNumeric = prefs.getInt(PREF_PASSWORD_MINIMUM_NUMERIC, 0); final int pwMinSymbols = prefs.getInt(PREF_PASSWORD_MINIMUM_SYMBOLS, 0); final int pwMinNonLetter = prefs.getInt(PREF_PASSWORD_MINIMUM_NONLETTER, 0); final int pwHistoryLength = prefs.getInt(PREF_PASSWORD_HISTORY_LENGTH, 0); final long pwExpirationTimeout = prefs.getLong(PREF_PASSWORD_EXPIRATION_TIMEOUT, 0L); final int maxFailedPw = prefs.getInt(PREF_MAX_FAILED_PW, 0); for (int i=0; i<mPasswordQualityValues.length; i++) { if (mPasswordQualityValues[i] == pwQuality) { mPasswordQuality.setSelection(i); } } mPasswordLength.setText(Integer.toString(pwLength)); mPasswordMinimumLetters.setText(Integer.toString(pwMinLetters)); mPasswordMinimumUppercase.setText(Integer.toString(pwMinUppercase)); mPasswordMinimumLowercase.setText(Integer.toString(pwMinLowercase)); mPasswordMinimumSymbols.setText(Integer.toString(pwMinSymbols)); mPasswordMinimumNumeric.setText(Integer.toString(pwMinNumeric)); mPasswordMinimumNonLetter.setText(Integer.toString(pwMinNonLetter)); mPasswordHistoryLength.setText(Integer.toString(pwHistoryLength)); mPasswordExpirationTimeout.setText(Long.toString(pwExpirationTimeout/MS_PER_MINUTE)); mMaxFailedPw.setText(Integer.toString(maxFailedPw)); } void updatePasswordExpirationStatus() { boolean active = mDPM.isAdminActive(mDeviceAdminSample); String statusText; if (active) { long now = System.currentTimeMillis(); // We'll query the DevicePolicyManager twice - first for the expiration values // set by the sample app, and later, for the system values (which may be different // if there is another administrator active.) long expirationDate = mDPM.getPasswordExpiration(mDeviceAdminSample); long mSecUntilExpiration = expirationDate - now; if (mSecUntilExpiration >= 0) { statusText = "Expiration in " + countdownString(mSecUntilExpiration); } else { statusText = "Expired " + countdownString(-mSecUntilExpiration) + " ago"; } // expirationTimeout is the cycle time between required password refresh long expirationTimeout = mDPM.getPasswordExpirationTimeout(mDeviceAdminSample); statusText += " / timeout period " + countdownString(expirationTimeout); // Now report the aggregate (global) expiration time statusText += " / Aggregate "; expirationDate = mDPM.getPasswordExpiration(null); mSecUntilExpiration = expirationDate - now; if (mSecUntilExpiration >= 0) { statusText += "expiration in " + countdownString(mSecUntilExpiration); } else { statusText += "expired " + countdownString(-mSecUntilExpiration) + " ago"; } } else { statusText = "<inactive>"; } mPasswordExpirationStatus.setText(statusText); } void updatePolicies() { SharedPreferences prefs = getSamplePreferences(this); final int pwQuality = prefs.getInt(PREF_PASSWORD_QUALITY, DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED); final int pwLength = prefs.getInt(PREF_PASSWORD_LENGTH, 0); final int pwMinLetters = prefs.getInt(PREF_PASSWORD_MINIMUM_LETTERS, 0); final int pwMinUppercase = prefs.getInt(PREF_PASSWORD_MINIMUM_UPPERCASE, 0); final int pwMinLowercase = prefs.getInt(PREF_PASSWORD_MINIMUM_LOWERCASE, 0); final int pwMinNumeric = prefs.getInt(PREF_PASSWORD_MINIMUM_NUMERIC, 0); final int pwMinSymbols = prefs.getInt(PREF_PASSWORD_MINIMUM_SYMBOLS, 0); final int pwMinNonLetter = prefs.getInt(PREF_PASSWORD_MINIMUM_NONLETTER, 0); final int pwHistoryLength = prefs.getInt(PREF_PASSWORD_HISTORY_LENGTH, 0); final long pwExpiration = prefs.getLong(PREF_PASSWORD_EXPIRATION_TIMEOUT, 0L); final int maxFailedPw = prefs.getInt(PREF_MAX_FAILED_PW, 0); boolean active = mDPM.isAdminActive(mDeviceAdminSample); if (active) { mDPM.setPasswordQuality(mDeviceAdminSample, pwQuality); mDPM.setPasswordMinimumLength(mDeviceAdminSample, pwLength); mDPM.setPasswordMinimumLetters(mDeviceAdminSample, pwMinLetters); mDPM.setPasswordMinimumUpperCase(mDeviceAdminSample, pwMinUppercase); mDPM.setPasswordMinimumLowerCase(mDeviceAdminSample, pwMinLowercase); mDPM.setPasswordMinimumNumeric(mDeviceAdminSample, pwMinNumeric); mDPM.setPasswordMinimumSymbols(mDeviceAdminSample, pwMinSymbols); mDPM.setPasswordMinimumNonLetter(mDeviceAdminSample, pwMinNonLetter); mDPM.setPasswordHistoryLength(mDeviceAdminSample, pwHistoryLength); mDPM.setMaximumFailedPasswordsForWipe(mDeviceAdminSample, maxFailedPw); mDPM.setPasswordExpirationTimeout(mDeviceAdminSample, pwExpiration); } } void setPasswordQuality(int quality) { SharedPreferences prefs = getSamplePreferences(this); prefs.edit().putInt(PREF_PASSWORD_QUALITY, quality).commit(); updatePolicies(); } void setPasswordLength(int length) { SharedPreferences prefs = getSamplePreferences(this); prefs.edit().putInt(PREF_PASSWORD_LENGTH, length).commit(); updatePolicies(); } void setPasswordMinimumLetters(int length) { SharedPreferences prefs = getSamplePreferences(this); prefs.edit().putInt(PREF_PASSWORD_MINIMUM_LETTERS, length).commit(); updatePolicies(); } void setPasswordMinimumUppercase(int length) { SharedPreferences prefs = getSamplePreferences(this); prefs.edit().putInt(PREF_PASSWORD_MINIMUM_UPPERCASE, length).commit(); updatePolicies(); } void setPasswordMinimumLowercase(int length) { SharedPreferences prefs = getSamplePreferences(this); prefs.edit().putInt(PREF_PASSWORD_MINIMUM_LOWERCASE, length).commit(); updatePolicies(); } void setPasswordMinimumNumeric(int length) { SharedPreferences prefs = getSamplePreferences(this); prefs.edit().putInt(PREF_PASSWORD_MINIMUM_NUMERIC, length).commit(); updatePolicies(); } void setPasswordMinimumSymbols(int length) { SharedPreferences prefs = getSamplePreferences(this); prefs.edit().putInt(PREF_PASSWORD_MINIMUM_SYMBOLS, length).commit(); updatePolicies(); } void setPasswordMinimumNonLetter(int length) { SharedPreferences prefs = getSamplePreferences(this); prefs.edit().putInt(PREF_PASSWORD_MINIMUM_NONLETTER, length).commit(); updatePolicies(); } void setPasswordHistoryLength(int length) { SharedPreferences prefs = getSamplePreferences(this); prefs.edit().putInt(PREF_PASSWORD_HISTORY_LENGTH, length).commit(); updatePolicies(); } void setPasswordExpiration(long expiration) { SharedPreferences prefs = getSamplePreferences(this); long exp = expiration * MS_PER_MINUTE; // convert from UI units to ms prefs.edit().putLong(PREF_PASSWORD_EXPIRATION_TIMEOUT, exp).commit(); updatePolicies(); // Show confirmation dialog long confirm = mDPM.getPasswordExpiration(mDeviceAdminSample); String date = DateFormat.getDateTimeInstance(DateFormat.DEFAULT, DateFormat.DEFAULT) .format(new Date(confirm)); new AlertDialog.Builder(this) .setMessage("Password will expire on " + date) .setPositiveButton("OK", null) .create() .show(); } void setMaxFailedPw(int length) { SharedPreferences prefs = getSamplePreferences(this); prefs.edit().putInt(PREF_MAX_FAILED_PW, length).commit(); updatePolicies(); } @Override protected void onResume() { super.onResume(); updateButtonStates(); updatePasswordExpirationStatus(); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case REQUEST_CODE_ENABLE_ADMIN: if (resultCode == Activity.RESULT_OK) { Log.i(TAG, "Admin enabled!"); } else { Log.i(TAG, "Admin enable FAILED!"); } return; case REQUEST_CODE_START_ENCRYPTION: updateEncryptionStatus(); return; } super.onActivityResult(requestCode, resultCode, data); } private OnClickListener mEnableListener = new OnClickListener() { public void onClick(View v) { // Launch the activity to have the user enable our admin. Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN); intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, mDeviceAdminSample); intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "Additional text explaining why this needs to be added."); startActivityForResult(intent, REQUEST_CODE_ENABLE_ADMIN); } }; private OnClickListener mDisableListener = new OnClickListener() { public void onClick(View v) { mDPM.removeActiveAdmin(mDeviceAdminSample); updateButtonStates(); } }; private OnClickListener mSetPasswordListener = new OnClickListener() { public void onClick(View v) { // Launch the activity to have the user set a new password. Intent intent = new Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD); startActivity(intent); } }; private OnClickListener mResetPasswordListener = new OnClickListener() { public void onClick(View v) { if (ActivityManager.isUserAMonkey()) { // Don't trust monkeys to do the right thing! AlertDialog.Builder builder = new AlertDialog.Builder(Controller.this); builder.setMessage("You can't reset my password because you are a monkey!"); builder.setPositiveButton("I admit defeat", null); builder.show(); return; } boolean active = mDPM.isAdminActive(mDeviceAdminSample); if (active) { mDPM.resetPassword(mPassword.getText().toString(), DevicePolicyManager.RESET_PASSWORD_REQUIRE_ENTRY); } } }; private OnClickListener mForceLockListener = new OnClickListener() { public void onClick(View v) { if (ActivityManager.isUserAMonkey()) { // Don't trust monkeys to do the right thing! AlertDialog.Builder builder = new AlertDialog.Builder(Controller.this); builder.setMessage("You can't lock my screen because you are a monkey!"); builder.setPositiveButton("I admit defeat", null); builder.show(); return; } boolean active = mDPM.isAdminActive(mDeviceAdminSample); if (active) { mDPM.lockNow(); } } }; private OnClickListener mWipeDataListener = new OnClickListener() { public void onClick(final View v) { if (ActivityManager.isUserAMonkey()) { // Don't trust monkeys to do the right thing! AlertDialog.Builder builder = new AlertDialog.Builder(Controller.this); builder.setMessage("You can't wipe my data because you are a monkey!"); builder.setPositiveButton("I admit defeat", null); builder.show(); return; } AlertDialog.Builder builder = new AlertDialog.Builder(Controller.this); builder.setMessage("This will erase all of your data. Are you sure?"); builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { AlertDialog.Builder builder = new AlertDialog.Builder(Controller.this); if (v == mWipeAllDataButton) { builder.setMessage("This is not a test. " + "This WILL erase all of your data, " + "including external storage! " + "Are you really absolutely sure?"); } else { builder.setMessage("This is not a test. " + "This WILL erase all of your data! " + "Are you really absolutely sure?"); } builder.setPositiveButton("BOOM!", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { boolean active = mDPM.isAdminActive(mDeviceAdminSample); if (active) { mDPM.wipeData(v == mWipeAllDataButton ? DevicePolicyManager.WIPE_EXTERNAL_STORAGE : 0); } } }); builder.setNegativeButton("Oops, run away!", null); builder.show(); } }); builder.setNegativeButton("No way!", null); builder.show(); } }; private OnClickListener mSetTimeoutListener = new OnClickListener() { public void onClick(View v) { if (ActivityManager.isUserAMonkey()) { // Don't trust monkeys to do the right thing! AlertDialog.Builder builder = new AlertDialog.Builder(Controller.this); builder.setMessage("You can't lock my screen because you are a monkey!"); builder.setPositiveButton("I admit defeat", null); builder.show(); return; } boolean active = mDPM.isAdminActive(mDeviceAdminSample); if (active) { long timeMs = 1000L*Long.parseLong(mTimeout.getText().toString()); mDPM.setMaximumTimeToLock(mDeviceAdminSample, timeMs); } } }; private OnClickListener mEncryptionButtonListener = new OnClickListener() { public void onClick(View v) { int buttonId = v.getId(); if (buttonId == R.id.encryption_enable_button) { mDPM.setStorageEncryption(mDeviceAdminSample, true); } else if (buttonId == R.id.encryption_disable_button) { mDPM.setStorageEncryption(mDeviceAdminSample, false); } else if (buttonId == R.id.encryption_activate_button) { if (ActivityManager.isUserAMonkey()) { // Don't trust monkeys to do the right thing! AlertDialog.Builder builder = new AlertDialog.Builder(Controller.this); builder.setMessage("You can't activate encryption, you're a monkey!"); builder.setPositiveButton("I admit defeat", null); builder.show(); return; } if (mDPM.getStorageEncryptionStatus() == DevicePolicyManager.ENCRYPTION_STATUS_UNSUPPORTED) { AlertDialog.Builder builder = new AlertDialog.Builder(Controller.this); builder.setMessage("Encryption is unsupported on this device."); builder.setPositiveButton("OK", null); builder.show(); return; } // Launch the activity to activate encryption. May or may not return! Intent intent = new Intent(DevicePolicyManager.ACTION_START_ENCRYPTION); startActivityForResult(intent, REQUEST_CODE_START_ENCRYPTION); } // In all cases, fall through to update status updateEncryptionStatus(); } }; private void updateEncryptionStatus() { boolean sampleAdminStatusValue = mDPM.getStorageEncryption(mDeviceAdminSample); String sampleAdminStatus = Boolean.toString(sampleAdminStatusValue); boolean adminStatusValue = mDPM.getStorageEncryption(null); String adminStatus = Boolean.toString(adminStatusValue); int deviceStatusCode = mDPM.getStorageEncryptionStatus(); String deviceStatus = statusCodeToString(deviceStatusCode); mEncryptionStatus.setText("sample:" + sampleAdminStatus + " admins:" + adminStatus + " device:" + deviceStatus); } private String statusCodeToString(int newStatusCode) { String newStatus = "unknown"; switch (newStatusCode) { case DevicePolicyManager.ENCRYPTION_STATUS_UNSUPPORTED: newStatus = "unsupported"; break; case DevicePolicyManager.ENCRYPTION_STATUS_INACTIVE: newStatus = "inactive"; break; case DevicePolicyManager.ENCRYPTION_STATUS_ACTIVATING: newStatus = "activating"; break; case DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE: newStatus = "active"; break; } return newStatus; } } }
This weblog only liked a combination of technical articles and writings have been using to keep. Many of the articles published in this blog do not belong to me, articles resources, am showing you care to publish the latter part of the articles.
No comments:
Post a Comment