Skip to content

Commit 909addb

Browse files
committed
Notify when password quality is out of policy
Change-Id: Ibf387c6ab0e6e56dd3e70b9cfdb9f2f0a8f17fe9
1 parent 5379b25 commit 909addb

File tree

4 files changed

+72
-0
lines changed

4 files changed

+72
-0
lines changed

app/src/main/AndroidManifest.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
2525
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
2626
<uses-permission android:name="android.permission.INTERNET" />
27+
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
2728

2829
<application
2930
android:allowBackup="true"
@@ -102,6 +103,7 @@
102103
<intent-filter>
103104
<action android:name="android.app.action.DEVICE_ADMIN_ENABLED"/>
104105
<action android:name="android.app.action.PROFILE_PROVISIONING_COMPLETE"/>
106+
<action android:name="android.intent.action.BOOT_COMPLETED"/>
105107
</intent-filter>
106108
</receiver>
107109

app/src/main/java/com/afwsamples/testdpc/DeviceAdminReceiver.java

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@
2020
import android.accounts.AccountManager;
2121
import android.annotation.TargetApi;
2222
import android.app.admin.DevicePolicyManager;
23+
import android.app.Notification;
24+
import android.app.NotificationManager;
25+
import android.app.PendingIntent;
2326
import android.content.ComponentName;
2427
import android.content.Context;
2528
import android.content.Intent;
@@ -52,6 +55,24 @@
5255
public class DeviceAdminReceiver extends android.app.admin.DeviceAdminReceiver {
5356
private static final String TAG = "DeviceAdminReceiver";
5457

58+
public static final String ACTION_PASSWORD_REQUIREMENTS_CHANGED =
59+
"com.afwsamples.testdpc.policy.PASSWORD_REQUIREMENTS_CHANGED";
60+
61+
private static final int CHANGE_PASSWORD_NOTIFICATION_ID = 101;
62+
63+
@Override
64+
public void onReceive(Context context, Intent intent) {
65+
switch (intent.getAction()) {
66+
case ACTION_PASSWORD_REQUIREMENTS_CHANGED:
67+
case Intent.ACTION_BOOT_COMPLETED:
68+
updatePasswordQualityNotification(context);
69+
break;
70+
default:
71+
super.onReceive(context, intent);
72+
break;
73+
}
74+
}
75+
5576
@Override
5677
public void onProfileProvisioningComplete(Context context, Intent intent) {
5778
// Retreive the admin extras bundle, which we can use to determine the original context for
@@ -213,4 +234,30 @@ public String onChoosePrivateKeyAlias(Context context, Intent intent, int uid, U
213234
public static ComponentName getComponentName(Context context) {
214235
return new ComponentName(context.getApplicationContext(), DeviceAdminReceiver.class);
215236
}
237+
238+
@Override
239+
public void onPasswordChanged(Context context, Intent intent) {
240+
updatePasswordQualityNotification(context);
241+
}
242+
243+
private static void updatePasswordQualityNotification(Context context) {
244+
DevicePolicyManager devicePolicyManager = (DevicePolicyManager) context.getSystemService(
245+
Context.DEVICE_POLICY_SERVICE);
246+
NotificationManager nm = (NotificationManager)
247+
context.getSystemService(Context.NOTIFICATION_SERVICE);
248+
249+
if (!devicePolicyManager.isActivePasswordSufficient()) {
250+
Notification.Builder warn = new Notification.Builder(context)
251+
.setOngoing(true)
252+
.setSmallIcon(R.drawable.ic_launcher)
253+
.setTicker(context.getText(R.string.password_not_compliant_title))
254+
.setContentTitle(context.getText(R.string.password_not_compliant_title))
255+
.setContentText(context.getText(R.string.password_not_compliant_content))
256+
.setContentIntent(PendingIntent.getActivity(context, /*requestCode*/ -1,
257+
new Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD), /*flags*/ 0));
258+
nm.notify(CHANGE_PASSWORD_NOTIFICATION_ID, warn.getNotification());
259+
} else {
260+
nm.cancel(CHANGE_PASSWORD_NOTIFICATION_ID);
261+
}
262+
}
216263
}

app/src/main/java/com/afwsamples/testdpc/policy/keyguard/PasswordConstraintsFragment.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import android.app.admin.DevicePolicyManager;
2121
import android.content.ComponentName;
2222
import android.content.Context;
23+
import android.content.Intent;
2324
import android.os.Bundle;
2425
import android.text.Editable;
2526
import android.text.TextUtils;
@@ -153,13 +154,16 @@ public void onResume() {
153154
mMinUpperCase.setText(Integer.toString(mDpm.getPasswordMinimumUpperCase(mAdminComponent)));
154155
mMinSymbols.setText(Integer.toString(mDpm.getPasswordMinimumSymbols(mAdminComponent)));
155156
mMinNonLetter.setText(Integer.toString(mDpm.getPasswordMinimumNonLetter(mAdminComponent)));
157+
158+
sendPasswordChangedBroadcast();
156159
}
157160

158161
@Override
159162
public void onCheckedChanged(RadioGroup view, int checkedId) {
160163
if (view == mQualityGroup) {
161164
mDpm.setPasswordQuality(mAdminComponent, checkedId);
162165
}
166+
sendPasswordChangedBroadcast();
163167
}
164168

165169
@Override
@@ -191,6 +195,7 @@ public void afterTextChanged(Editable editable) {
191195
} else if (editable == mMinNonLetter.getEditableText()) {
192196
mDpm.setPasswordMinimumNonLetter(mAdminComponent, value);
193197
}
198+
sendPasswordChangedBroadcast();
194199
}
195200

196201
@Override
@@ -207,4 +212,19 @@ private EditText findAndPrepareField(View root, final int id) {
207212
return field;
208213
}
209214

215+
/**
216+
* Notify the admin receiver that something about the password has changed - in this context,
217+
* a minimum password requirement policy.
218+
*
219+
* This has to be sent manually because the system server only sends broadcasts for changes to
220+
* the actual password, not any of the constraints related it it.
221+
*
222+
* <p>May trigger a show/hide of the notification warning to change the password through
223+
* Settings.
224+
**/
225+
private void sendPasswordChangedBroadcast() {
226+
Intent changedIntent = new Intent(DeviceAdminReceiver.ACTION_PASSWORD_REQUIREMENTS_CHANGED);
227+
changedIntent.setComponent(mAdminComponent);
228+
getContext().sendBroadcast(changedIntent);
229+
}
210230
}

app/src/main/res/values/strings.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -476,6 +476,9 @@
476476
<string name="password_min_symbols">Minimum number of symbols:</string>
477477
<string name="password_min_nonletter">Minimum number of non-letters:</string>
478478

479+
<string name="password_not_compliant_title">Password is not compliant</string>
480+
<string name="password_not_compliant_content">Touch to set a new lock screen password.</string>
481+
479482
<!-- Strings for managing Settings -->
480483
<string name="settings_management_title">Settings management</string>
481484
<string name="stay_on_while_plugged_in">Keep the device on while plugged in</string>

0 commit comments

Comments
 (0)