Skip to content

Commit 9435b8a

Browse files
jscott1989pfmaggi
authored andcommitted
No public description
PiperOrigin-RevId: 615508164
1 parent 8639be4 commit 9435b8a

19 files changed

+329
-135
lines changed

src/main/AndroidManifest.xml

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
tools:ignore="MissingClass"
2222
android:versionCode="9005"
2323
android:versionName="9.0.5">
24-
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="33"/>
24+
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="34"/>
2525

2626
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
2727
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
@@ -40,12 +40,35 @@
4040
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/>
4141
<uses-permission android:name="com.google.android.setupwizard.SETUP_COMPAT_SERVICE" />
4242
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
43+
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_SYSTEM_EXEMPTED"/>
4344
<uses-permission android:name="android.permission.MANAGE_DEVICE_POLICY_CERTIFICATES"/>
4445
<uses-permission android:name="android.permission.MANAGE_DEVICE_POLICY_SYSTEM_UPDATE_INFO"/>
46+
<uses-permission android:name="android.permission.MANAGE_DEVICE_POLICY_ACCOUNT_MANAGEMENT"/>
47+
<uses-permission android:name="android.permission.MANAGE_DEVICE_POLICY_APPS_CONTROL"/>
48+
<uses-permission android:name="android.permission.MANAGE_DEVICE_POLICY_DISPLAY"/>
49+
<uses-permission android:name="android.permission.MANAGE_DEVICE_POLICY_INSTALL_UNKNOWN_SOURCES"/>
50+
<uses-permission android:name="android.permission.MANAGE_DEVICE_POLICY_AUTOFILL"/>
51+
<uses-permission android:name="android.permission.MANAGE_DEVICE_POLICY_LOCALE"/>
52+
<uses-permission android:name="android.permission.MANAGE_DEVICE_POLICY_LOCATION"/>
53+
<uses-permission android:name="android.permission.MANAGE_DEVICE_POLICY_LOCK_CREDENTIALS"/>
54+
<uses-permission android:name="android.permission.MANAGE_DEVICE_POLICY_MOBILE_NETWORK"/>
55+
<uses-permission android:name="android.permission.MANAGE_DEVICE_POLICY_MODIFY_USERS"/>
56+
<uses-permission android:name="android.permission.MANAGE_DEVICE_POLICY_PACKAGE_STATE"/>
57+
<uses-permission android:name="android.permission.MANAGE_DEVICE_POLICY_RESTRICT_PRIVATE_DNS"/>
58+
<uses-permission android:name="android.permission.MANAGE_DEVICE_POLICY_CAMERA_TOGGLE"/>
59+
<uses-permission android:name="android.permission.MANAGE_DEVICE_POLICY_SAFE_BOOT"/>
60+
<uses-permission android:name="android.permission.MANAGE_DEVICE_POLICY_QUERY_SYSTEM_UPDATES"/>
61+
<uses-permission android:name="android.permission.MANAGE_DEVICE_POLICY_SMS"/>
62+
<uses-permission android:name="android.permission.MANAGE_DEVICE_POLICY_TIME"/>
63+
<uses-permission android:name="android.permission.MANAGE_DEVICE_POLICY_VPN"/>
64+
<uses-permission android:name="android.permission.MANAGE_DEVICE_POLICY_WALLPAPER"/>
65+
<uses-permission android:name="android.permission.MANAGE_DEVICE_POLICY_WIFI"/>
66+
<uses-permission android:name="android.permission.MANAGE_DEVICE_POLICY_CAMERA_TOGGLE"/>
67+
<uses-permission android:name="android.permission.UPDATE_DEVICE_MANAGEMENT_RESOURCES"/>
4568

4669
<uses-feature android:name="android.hardware.wifi" android:required="false" />
4770
<uses-feature android:name="android.hardware.touchscreen" android:required="false"/>
48-
71+
4972
<!-- TODO(b/201271137): Add non-testOnly build config. -->
5073
<!-- NOTE: android:testOnly will be stripped by build.gradle (stripTestOnlyForBuild()) -->
5174
<application
@@ -212,6 +235,7 @@
212235
<service android:name=".policy.resetpassword.ResetPasswordService"
213236
android:enabled="@bool/is_o_or_later"
214237
android:exported="false"
238+
android:foregroundServiceType="systemExempted"
215239
android:directBootAware="true" >
216240
</service>
217241

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

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -311,11 +311,25 @@ public String onChoosePrivateKeyAlias(
311311
return CommonReceiverOperations.onChoosePrivateKeyAlias(context, uid);
312312
}
313313

314+
/**
315+
* Get the ComponentName that DevicePolicyManager expects when calling its APIs.
316+
*
317+
* <p>This is the actual ComponentName of the DeviceAdminReceiver if we are calling as the DPC,
318+
* and null for other cases (delegates, Role Holder etc)
319+
*/
320+
public static ComponentName getComponentName(Context context) {
321+
if (Util.isDeviceOwner(context) || Util.isProfileOwner(context)) {
322+
return getReceiverComponentName(context);
323+
} else {
324+
return null;
325+
}
326+
}
327+
314328
/**
315329
* @param context The context of the application.
316330
* @return The component name of this component in the given context.
317331
*/
318-
public static ComponentName getComponentName(Context context) {
332+
public static ComponentName getReceiverComponentName(Context context) {
319333
return new ComponentName(context.getApplicationContext(), DeviceAdminReceiver.class);
320334
}
321335

src/main/java/com/afwsamples/testdpc/SetupManagementFragment.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@ private void maybeLaunchProvisioning(String intentAction, int requestCode) {
232232
if (Util.SDK_INT >= VERSION_CODES.M) {
233233
intent.putExtra(
234234
EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME,
235-
DeviceAdminReceiver.getComponentName(getActivity()));
235+
DeviceAdminReceiver.getReceiverComponentName(getActivity()));
236236
} else {
237237
intent.putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME, getActivity().getPackageName());
238238
}

src/main/java/com/afwsamples/testdpc/common/Util.java

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import android.app.Service;
2121
import android.app.UiModeManager;
2222
import android.app.admin.DevicePolicyManager;
23+
import android.app.role.RoleManager;
2324
import android.content.ActivityNotFoundException;
2425
import android.content.ComponentName;
2526
import android.content.Context;
@@ -67,6 +68,11 @@ public class Util {
6768
*/
6869
public static final int SDK_INT = IS_RUNNING_U ? VERSION_CODES.CUR_DEVELOPMENT : VERSION.SDK_INT;
6970

71+
// Copied over from RoleManager.ROLE_DEVICE_POLICY_MANAGEMENT, which can't be referenced directly
72+
// since it's a @SystemAPI.
73+
private static final String ROLE_DEVICE_POLICY_MANAGEMENT =
74+
"android.app.role.DEVICE_POLICY_MANAGEMENT";
75+
7076
/**
7177
* Format a friendly datetime for the current locale according to device policy documentation. If
7278
* the timestamp doesn't represent a real date, it will be interpreted as {@code null}.
@@ -122,7 +128,7 @@ public static boolean isManagedProfileOwner(Context context) {
122128

123129
if (Util.SDK_INT >= VERSION_CODES.N) {
124130
try {
125-
return dpm.isManagedProfile(DeviceAdminReceiver.getComponentName(context));
131+
return dpm.isManagedProfile(DeviceAdminReceiver.getReceiverComponentName(context));
126132
} catch (SecurityException ex) {
127133
// This is thrown if we are neither profile owner nor device owner.
128134
return false;
@@ -135,6 +141,16 @@ public static boolean isManagedProfileOwner(Context context) {
135141
return isProfileOwner(context);
136142
}
137143

144+
public static boolean isManagedProfile(Context context) {
145+
if (Util.SDK_INT >= VERSION_CODES.R) {
146+
UserManager userManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
147+
return userManager.isManagedProfile();
148+
}
149+
// There is no equivalent API before Android R, so fall back to previous behaviour that only
150+
// works correctly if we are the PO of a managed profile
151+
return isManagedProfileOwner(context);
152+
}
153+
138154
@TargetApi(VERSION_CODES.M)
139155
public static boolean isPrimaryUser(Context context) {
140156
if (Util.SDK_INT >= VERSION_CODES.M) {
@@ -159,6 +175,25 @@ public static boolean isProfileOwner(Context context) {
159175
return dpm.isProfileOwnerApp(context.getPackageName());
160176
}
161177

178+
@TargetApi(VERSION_CODES.O)
179+
public static boolean isDelegatedApp(Context context) {
180+
if (Util.SDK_INT < VERSION_CODES.O) {
181+
return false;
182+
}
183+
184+
DevicePolicyManager dpm = context.getSystemService(DevicePolicyManager.class);
185+
return !dpm.getDelegatedScopes(null, context.getPackageName()).isEmpty();
186+
}
187+
188+
@TargetApi(VERSION_CODES.S)
189+
public static boolean isDeviceManagementRoleHolder(Context context) {
190+
if (Util.SDK_INT < VERSION_CODES.S) {
191+
return false;
192+
}
193+
RoleManager rm = context.getSystemService(RoleManager.class);
194+
return rm.isRoleHeld(ROLE_DEVICE_POLICY_MANAGEMENT);
195+
}
196+
162197
@TargetApi(VERSION_CODES.O)
163198
public static List<UserHandle> getBindDeviceAdminTargetUsers(Context context) {
164199
if (Util.SDK_INT < VERSION_CODES.O) {

src/main/java/com/afwsamples/testdpc/common/preference/DpcEditTextPreference.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,16 @@ public void clearUserConstraint() {
9494
mHelper.clearUserConstraint();
9595
}
9696

97+
@Override
98+
public void setPermissionConstraint(String permissionConstraints) {
99+
mHelper.setPermissionConstraint(permissionConstraints);
100+
}
101+
102+
@Override
103+
public void clearPermissionConstraint() {
104+
mHelper.clearPermissionConstraint();
105+
}
106+
97107
@Override
98108
public void clearNonCustomConstraints() {
99109
mHelper.clearNonCustomConstraints();

src/main/java/com/afwsamples/testdpc/common/preference/DpcListPreference.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,16 @@ public void clearUserConstraint() {
9393
mHelper.clearUserConstraint();
9494
}
9595

96+
@Override
97+
public void setPermissionConstraint(String permissionConstraints) {
98+
mHelper.setPermissionConstraint(permissionConstraints);
99+
}
100+
101+
@Override
102+
public void clearPermissionConstraint() {
103+
mHelper.clearPermissionConstraint();
104+
}
105+
96106
@Override
97107
public void clearNonCustomConstraints() {
98108
mHelper.clearNonCustomConstraints();

src/main/java/com/afwsamples/testdpc/common/preference/DpcPreference.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,16 @@ public void clearUserConstraint() {
9393
mHelper.clearUserConstraint();
9494
}
9595

96+
@Override
97+
public void setPermissionConstraint(String permissionConstraints) {
98+
mHelper.setPermissionConstraint(permissionConstraints);
99+
}
100+
101+
@Override
102+
public void clearPermissionConstraint() {
103+
mHelper.clearPermissionConstraint();
104+
}
105+
96106
@Override
97107
public void clearNonCustomConstraints() {
98108
mHelper.clearNonCustomConstraints();

src/main/java/com/afwsamples/testdpc/common/preference/DpcPreferenceBase.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ public interface DpcPreferenceBase {
3030

3131
void clearUserConstraint();
3232

33+
void setPermissionConstraint(String permissionConstraints);
34+
35+
void clearPermissionConstraint();
36+
3337
void clearNonCustomConstraints();
3438

3539
void setCustomConstraint(@Nullable CustomConstraint customConstraint);

src/main/java/com/afwsamples/testdpc/common/preference/DpcPreferenceHelper.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,15 @@ public void clearUserConstraint() {
174174
setUserConstraint(USER_DEFAULT);
175175
}
176176

177+
void setPermissionConstraint(String permissionConstraints) {
178+
mPermissionConstraint = permissionConstraints;
179+
disableIfConstraintsNotMet();
180+
}
181+
182+
void clearPermissionConstraint() {
183+
setPermissionConstraint(null);
184+
}
185+
177186
/**
178187
* Clear the admin and user constraints for this preference.
179188
*
@@ -289,7 +298,7 @@ private int getCurrentUser() {
289298
return USER_PRIMARY_USER;
290299
}
291300

292-
if (Util.isManagedProfileOwner(mContext)) {
301+
if (Util.isManagedProfile(mContext)) {
293302
return USER_MANAGED_PROFILE;
294303
}
295304

src/main/java/com/afwsamples/testdpc/common/preference/DpcSwitchPreference.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,16 @@ public void clearUserConstraint() {
9494
mHelper.clearUserConstraint();
9595
}
9696

97+
@Override
98+
public void setPermissionConstraint(String permissionConstraints) {
99+
mHelper.setPermissionConstraint(permissionConstraints);
100+
}
101+
102+
@Override
103+
public void clearPermissionConstraint() {
104+
mHelper.clearPermissionConstraint();
105+
}
106+
97107
@Override
98108
public void clearNonCustomConstraints() {
99109
mHelper.clearNonCustomConstraints();

0 commit comments

Comments
 (0)