From d973f9afb9c94eb9eedcff66630e39de91493733 Mon Sep 17 00:00:00 2001 From: Gil Cukierman Date: Mon, 27 Feb 2023 17:12:50 -0500 Subject: [PATCH] Notify Admin When DISALLOW_CELLULAR_2G Is Not Supported By Device Bug: 262383133 Test: atest android.devicepolicy.cts.UserRestrictionsTest#addDisallowCellular2g_sendHardwareUnsupportedBroadcastToAdmin Change-Id: I51bb6022a8538342d1658c77c45322aba2aeca7f --- .../devicepolicy/DevicePolicyEngine.java | 58 +++++++++++++++++-- 1 file changed, 52 insertions(+), 6 deletions(-) diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyEngine.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyEngine.java index ec101cd0d1fbe..7eeb51c842003 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyEngine.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyEngine.java @@ -16,10 +16,11 @@ package com.android.server.devicepolicy; -import static android.app.admin.PolicyUpdateResult.RESULT_FAILURE_CONFLICTING_ADMIN_POLICY; -import static android.app.admin.PolicyUpdateResult.RESULT_POLICY_CLEARED; import static android.app.admin.PolicyUpdateReceiver.EXTRA_POLICY_TARGET_USER_ID; import static android.app.admin.PolicyUpdateReceiver.EXTRA_POLICY_UPDATE_RESULT_KEY; +import static android.app.admin.PolicyUpdateResult.RESULT_FAILURE_CONFLICTING_ADMIN_POLICY; +import static android.app.admin.PolicyUpdateResult.RESULT_FAILURE_HARDWARE_LIMITATION; +import static android.app.admin.PolicyUpdateResult.RESULT_POLICY_CLEARED; import static android.app.admin.PolicyUpdateResult.RESULT_POLICY_SET; import static android.content.pm.UserProperties.INHERIT_DEVICE_POLICY_FROM_PARENT; import static android.provider.DeviceConfig.NAMESPACE_DEVICE_POLICY_MANAGER; @@ -27,6 +28,7 @@ import static android.provider.DeviceConfig.NAMESPACE_DEVICE_POLICY_MANAGER; import android.Manifest; import android.annotation.NonNull; import android.annotation.Nullable; +import android.app.admin.DevicePolicyIdentifiers; import android.app.admin.DevicePolicyManager; import android.app.admin.DevicePolicyState; import android.app.admin.PolicyKey; @@ -46,6 +48,7 @@ import android.os.Environment; import android.os.UserHandle; import android.os.UserManager; import android.provider.DeviceConfig; +import android.telephony.TelephonyManager; import android.util.AtomicFile; import android.util.Log; import android.util.SparseArray; @@ -79,6 +82,10 @@ import java.util.Set; final class DevicePolicyEngine { static final String TAG = "DevicePolicyEngine"; + private static final String CELLULAR_2G_USER_RESTRICTION_ID = + DevicePolicyIdentifiers.getIdentifierForUserRestriction( + UserManager.DISALLOW_CELLULAR_2G); + private static final String ENABLE_COEXISTENCE_FLAG = "enable_coexistence"; private static final boolean DEFAULT_ENABLE_COEXISTENCE_FLAG = true; @@ -380,6 +387,15 @@ final class DevicePolicyEngine { Objects.requireNonNull(value); synchronized (mLock) { + // TODO(b/270999567): Move error handling for DISALLOW_CELLULAR_2G into the code + // that honors the restriction once there's an API available + if (checkFor2gFailure(policyDefinition, enforcingAdmin)) { + Log.i(TAG, + "Device does not support capabilities required to disable 2g. Not setting" + + " global policy state."); + return; + } + PolicyState globalPolicyState = getGlobalPolicyStateLocked(policyDefinition); boolean policyChanged = globalPolicyState.addPolicy(enforcingAdmin, value); @@ -1162,6 +1178,36 @@ final class DevicePolicyEngine { DEFAULT_ENABLE_COEXISTENCE_FLAG); } + private boolean checkFor2gFailure(@NonNull PolicyDefinition policyDefinition, + @NonNull EnforcingAdmin enforcingAdmin) { + if (!policyDefinition.getPolicyKey().getIdentifier().equals( + CELLULAR_2G_USER_RESTRICTION_ID)) { + return false; + } + + boolean isCapabilitySupported; + try { + isCapabilitySupported = mContext.getSystemService( + TelephonyManager.class).isRadioInterfaceCapabilitySupported( + TelephonyManager.CAPABILITY_USES_ALLOWED_NETWORK_TYPES_BITMASK); + } catch (IllegalStateException e) { + // isRadioInterfaceCapabilitySupported can throw if there is no Telephony + // service initialized. + isCapabilitySupported = false; + } + + if (!isCapabilitySupported) { + sendPolicyResultToAdmin( + enforcingAdmin, + policyDefinition, + RESULT_FAILURE_HARDWARE_LIMITATION, + UserHandle.USER_ALL); + return true; + } + + return false; + } + private class DevicePoliciesReaderWriter { private static final String DEVICE_POLICIES_XML = "device_policy_state.xml"; private static final String TAG_LOCAL_POLICY_ENTRY = "local-policy-entry"; @@ -1316,8 +1362,8 @@ final class DevicePolicyEngine { if (adminsPolicy != null) { mLocalPolicies.get(userId).put(policyKey, adminsPolicy); } else { - Log.e(TAG, "Error parsing file, " + policyKey + "doesn't have an " - + "AdminsPolicy."); + Log.e(TAG, + "Error parsing file, " + policyKey + "doesn't have an " + "AdminsPolicy."); } } @@ -1328,8 +1374,8 @@ final class DevicePolicyEngine { if (adminsPolicy != null) { mGlobalPolicies.put(policyKey, adminsPolicy); } else { - Log.e(TAG, "Error parsing file, " + policyKey + "doesn't have an " - + "AdminsPolicy."); + Log.e(TAG, + "Error parsing file, " + policyKey + "doesn't have an " + "AdminsPolicy."); } }