From c7839b9dc142547afa81ccd6387da40e351b3223 Mon Sep 17 00:00:00 2001 From: Alex Johnston Date: Fri, 22 Apr 2022 14:43:44 +0100 Subject: [PATCH] Prevent screenshot when admin disable screenshots for all users * An IT admin has the ability to disable screenshots for all users when the device has a DO or COPE PO * When screenshots are disabled for all users, prevent a screenshot from being taken instead of taking a black screenshot Bug: 217558483 Test: Manual testing with TestDPC Change-Id: I167996bb337cc906b5475089f674fd9c37dff808 --- packages/SystemUI/res/values/strings.xml | 2 ++ .../screenshot/TakeScreenshotService.java | 19 +++++++++++++++++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index f92d6238e8637..fadc6069d04ae 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -213,6 +213,8 @@ Taking screenshots isn\'t allowed by the app or your organization + + Taking screenshots is blocked by your IT admin Edit diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotService.java b/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotService.java index 924351df31176..7f3758e208dbf 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotService.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotService.java @@ -27,6 +27,7 @@ import static com.android.systemui.screenshot.LogConfig.logTag; import android.annotation.MainThread; import android.app.Service; +import android.app.admin.DevicePolicyManager; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; @@ -42,9 +43,11 @@ import android.os.Looper; import android.os.Message; import android.os.Messenger; import android.os.RemoteException; +import android.os.UserHandle; import android.os.UserManager; import android.util.Log; import android.view.WindowManager; +import android.widget.Toast; import androidx.annotation.NonNull; @@ -62,9 +65,11 @@ public class TakeScreenshotService extends Service { private ScreenshotController mScreenshot; private final UserManager mUserManager; + private final DevicePolicyManager mDevicePolicyManager; private final UiEventLogger mUiEventLogger; private final ScreenshotNotificationsController mNotificationsController; private final Handler mHandler; + private final Context mContext; private final BroadcastReceiver mCloseSystemDialogs = new BroadcastReceiver() { @Override @@ -91,16 +96,18 @@ public class TakeScreenshotService extends Service { @Inject public TakeScreenshotService(ScreenshotController screenshotController, UserManager userManager, - UiEventLogger uiEventLogger, - ScreenshotNotificationsController notificationsController) { + DevicePolicyManager devicePolicyManager, UiEventLogger uiEventLogger, + ScreenshotNotificationsController notificationsController, Context context) { if (DEBUG_SERVICE) { Log.d(TAG, "new " + this); } mHandler = new Handler(Looper.getMainLooper(), this::handleMessage); mScreenshot = screenshotController; mUserManager = userManager; + mDevicePolicyManager = devicePolicyManager; mUiEventLogger = uiEventLogger; mNotificationsController = notificationsController; + mContext = context; } @Override @@ -182,6 +189,14 @@ public class TakeScreenshotService extends Service { requestCallback.reportError(); return true; } + if(mDevicePolicyManager.getScreenCaptureDisabled(null, UserHandle.USER_ALL)) { + Log.w(TAG, "Skipping screenshot because an IT admin has disabled " + + "screenshots on the device"); + Toast.makeText(mContext, R.string.screenshot_blocked_by_admin, + Toast.LENGTH_SHORT).show(); + requestCallback.reportError(); + return true; + } ScreenshotHelper.ScreenshotRequest screenshotRequest = (ScreenshotHelper.ScreenshotRequest) msg.obj;