diff options
5 files changed, 51 insertions, 2 deletions
diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java index 3035e3d94d77..2bb4e760f7d4 100644 --- a/core/java/android/app/ActivityManagerNative.java +++ b/core/java/android/app/ActivityManagerNative.java @@ -2217,6 +2217,14 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM              return true;          } +        case IS_SCREEN_CAPTURE_ALLOWED_ON_CURRENT_ACTIVITY_TRANSACTION: { +            data.enforceInterface(IActivityManager.descriptor); +            boolean res = isScreenCaptureAllowedOnCurrentActivity(); +            reply.writeNoException(); +            reply.writeInt(res ? 1 : 0); +            return true; +        } +          case KILL_UID_TRANSACTION: {              data.enforceInterface(IActivityManager.descriptor);              int uid = data.readInt(); @@ -5409,6 +5417,18 @@ class ActivityManagerProxy implements IActivityManager          return res;      } +    public boolean isScreenCaptureAllowedOnCurrentActivity() throws RemoteException { +        Parcel data = Parcel.obtain(); +        Parcel reply = Parcel.obtain(); +        data.writeInterfaceToken(IActivityManager.descriptor); +        mRemote.transact(IS_SCREEN_CAPTURE_ALLOWED_ON_CURRENT_ACTIVITY_TRANSACTION, data, reply, 0); +        reply.readException(); +        boolean res = reply.readInt() != 0; +        data.recycle(); +        reply.recycle(); +        return res; +    } +      public void killUid(int uid, String reason) throws RemoteException {          Parcel data = Parcel.obtain();          Parcel reply = Parcel.obtain(); diff --git a/core/java/android/app/IActivityManager.java b/core/java/android/app/IActivityManager.java index 0328708ff559..1423e4bae4de 100644 --- a/core/java/android/app/IActivityManager.java +++ b/core/java/android/app/IActivityManager.java @@ -441,6 +441,8 @@ public interface IActivityManager extends IInterface {      public boolean launchAssistIntent(Intent intent, int requestType, String hint, int userHandle,              Bundle args) throws RemoteException; +    public boolean isScreenCaptureAllowedOnCurrentActivity() throws RemoteException; +      public void killUid(int uid, String reason) throws RemoteException;      public void hang(IBinder who, boolean allowRestart) throws RemoteException; @@ -852,4 +854,6 @@ public interface IActivityManager extends IInterface {      int KEYGUARD_GOING_AWAY_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+296;      int REGISTER_UID_OBSERVER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+297;      int UNREGISTER_UID_OBSERVER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+298; +    int IS_SCREEN_CAPTURE_ALLOWED_ON_CURRENT_ACTIVITY_TRANSACTION +            = IBinder.FIRST_CALL_TRANSACTION+299;  } diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index 83e06d6c9805..7de21895330b 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -2402,6 +2402,9 @@ public class DevicePolicyManager {       * <p>The calling device admin must be a device or profile owner. If it is not, a       * security exception will be thrown.       * +     * <p>From version {@link android.os.Build.VERSION_CODES#MNC} disabling screen capture also +     * blocks assist requests for all activities of the relevant user. +     *       * @param admin Which {@link DeviceAdminReceiver} this request is associated with.       * @param disabled Whether screen capture is disabled or not.       */ diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index f031694c6bbd..432f5d658832 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -142,6 +142,7 @@ import android.app.Notification;  import android.app.NotificationManager;  import android.app.PendingIntent;  import android.app.backup.IBackupManager; +import android.app.admin.DevicePolicyManager;  import android.content.ActivityNotFoundException;  import android.content.BroadcastReceiver;  import android.content.ClipData; @@ -10688,6 +10689,21 @@ public final class ActivityManagerService extends ActivityManagerNative      }      @Override +    public boolean isScreenCaptureAllowedOnCurrentActivity() { +        int userId = mCurrentUserId; +        synchronized (this) { +            ActivityRecord activity = getFocusedStack().topActivity(); +            if (activity == null) { +                return false; +            } +            userId = activity.userId; +        } +        DevicePolicyManager dpm = (DevicePolicyManager) mContext.getSystemService( +                Context.DEVICE_POLICY_SERVICE); +        return (dpm == null) || (!dpm.getScreenCaptureDisabled(null, userId)); +    } + +    @Override      public void requestAssistContextExtras(int requestType, IResultReceiver receiver) {          enqueueAssistContext(requestType, null, null, receiver, UserHandle.getCallingUserId(),                  null, PENDING_ASSIST_EXTRAS_LONG_TIMEOUT); diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionSessionConnection.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionSessionConnection.java index cc6a9c52d8a5..549a511c98fa 100644 --- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionSessionConnection.java +++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionSessionConnection.java @@ -193,8 +193,14 @@ final class VoiceInteractionSessionConnection implements ServiceConnection {                          new UserHandle(mUser));              }              mShown = true; -            boolean allDataEnabled = Settings.Secure.getIntForUser(mContext.getContentResolver(), -                    Settings.Secure.ASSIST_STRUCTURE_ENABLED, 1, mUser) != 0; +            boolean isScreenCaptureAllowed = true; +            try { +                isScreenCaptureAllowed = mAm.isScreenCaptureAllowedOnCurrentActivity(); +            } catch (RemoteException e) { +            } +            boolean allDataEnabled = (Settings.Secure.getIntForUser(mContext.getContentResolver(), +                    Settings.Secure.ASSIST_STRUCTURE_ENABLED, 1, mUser) != 0) +                    && isScreenCaptureAllowed;              mShowArgs = args;              mShowFlags = flags;              mHaveAssistData = false;  |