| /* |
| * 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.R.menu; |
| 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.ArrayAdapter; |
| import android.widget.Button; |
| import android.widget.EditText; |
| import android.widget.Spinner; |
| import android.widget.Toast; |
| import android.widget.AdapterView.OnItemSelectedListener; |
| |
| import java.net.InetSocketAddress; |
| import java.net.Proxy; |
| import java.text.DateFormat; |
| import java.util.Arrays; |
| import java.util.Date; |
| import java.util.List; |
| |
| /** |
| * 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 RESULT_ENABLE = 1; |
| 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; |
| EditText mPasswordExpirationTimeout; |
| Button mSetPasswordButton; |
| |
| EditText mPassword; |
| Button mResetPasswordButton; |
| |
| EditText mMaxFailedPw; |
| |
| Button mForceLockButton; |
| Button mWipeDataButton; |
| Button mWipeAllDataButton; |
| |
| private Button mTimeoutButton; |
| |
| private EditText mTimeout; |
| |
| EditText mProxyHost; |
| EditText mProxyList; |
| Button mProxyButton; |
| |
| private Button mPasswordExpirationButton; |
| |
| @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) { |
| setPasswordExpiration( |
| Long.parseLong(mPasswordExpirationTimeout.getText().toString())); |
| } |
| }); |
| |
| 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); |
| |
| mProxyHost = (EditText) findViewById(R.id.proxyhost); |
| mProxyList = (EditText) findViewById(R.id.proxylist); |
| mProxyButton = (Button) findViewById(R.id.set_proxy); |
| mProxyButton.setOnClickListener(mSetProxyListener); |
| } |
| |
| 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); |
| } 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); |
| } |
| } |
| |
| 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 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(); |
| } |
| |
| @Override |
| protected void onActivityResult(int requestCode, int resultCode, Intent data) { |
| switch (requestCode) { |
| case RESULT_ENABLE: |
| if (resultCode == Activity.RESULT_OK) { |
| Log.i(TAG, "Admin enabled!"); |
| } else { |
| Log.i(TAG, "Admin enable FAILED!"); |
| } |
| 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, RESULT_ENABLE); |
| } |
| }; |
| |
| 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 (mAM.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 (mAM.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 (mAM.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 (mAM.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 mSetProxyListener = new OnClickListener() { |
| |
| public void onClick(View v) { |
| boolean active = mDPM.isAdminActive(mDeviceAdminSample); |
| String proxySpec = mProxyHost.getText().toString(); |
| String proxyList = mProxyList.getText().toString(); |
| Proxy instProxy; |
| List<String> exclList; |
| |
| if ((proxySpec.length() == 0) || (proxySpec == null)) { |
| instProxy = Proxy.NO_PROXY; |
| } else { |
| String[] proxyComponents = proxySpec.split(":"); |
| if (proxyComponents.length != 2) { |
| Toast.makeText(Controller.this, "Wrong proxy specification.", |
| Toast.LENGTH_SHORT).show(); |
| return; |
| } |
| instProxy = new Proxy(Proxy.Type.HTTP, |
| new InetSocketAddress(proxyComponents[0], |
| Integer.parseInt(proxyComponents[1]))); |
| } |
| if ((proxyList == null) || (proxyList.length() == 0)) { |
| exclList = null; |
| } else { |
| String[] listDoms = proxyList.split(","); |
| if (listDoms.length == 0) { |
| Toast.makeText(Controller.this, "Wrong exclusion list format.", |
| Toast.LENGTH_SHORT).show(); |
| } |
| exclList = Arrays.asList(listDoms); |
| } |
| if (active) { |
| mDPM.setGlobalProxy(mDeviceAdminSample, instProxy, exclList); |
| ComponentName proxyAdmin = mDPM.getGlobalProxyAdmin(); |
| if ((proxyAdmin != null) && (proxyAdmin.equals(mDeviceAdminSample))) { |
| Toast.makeText(Controller.this, "Global Proxy set by device admin.", |
| Toast.LENGTH_SHORT).show(); |
| } |
| } |
| } |
| }; |
| |
| } |
| } |