Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2c7bdc96 authored by Nan Wu's avatar Nan Wu Committed by Android Build Coastguard Worker
Browse files

DO NOT MERGE Disallow Wallpaper service to launch activity from background.

Add a flag so that when a foreground client binds to a service,
disallow the bound service to launch activity from background.
Modify the WallpaperManagerService to take advantage of the new flag.

Test: atest BackgroundActivityLaunchTest WallpaperManagerServiceTests
Bug: 261072174
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:4c065abfaf59bdc237f65ceb9704d76bf0819d3a)
Merged-In: Id4e4cb6144597cf3638f2aaa34ea455a239fa1a7
Change-Id: Id4e4cb6144597cf3638f2aaa34ea455a239fa1a7
parent 9bae0c86
Loading
Loading
Loading
Loading
+9 −0
Original line number Original line Diff line number Diff line
@@ -242,6 +242,7 @@ public abstract class Context {
            BIND_IMPORTANT,
            BIND_IMPORTANT,
            BIND_ADJUST_WITH_ACTIVITY,
            BIND_ADJUST_WITH_ACTIVITY,
            BIND_NOT_PERCEPTIBLE,
            BIND_NOT_PERCEPTIBLE,
            BIND_DENY_ACTIVITY_STARTS,
            BIND_INCLUDE_CAPABILITIES
            BIND_INCLUDE_CAPABILITIES
    })
    })
    @Retention(RetentionPolicy.SOURCE)
    @Retention(RetentionPolicy.SOURCE)
@@ -355,6 +356,14 @@ public abstract class Context {
    /***********    Public flags above this line ***********/
    /***********    Public flags above this line ***********/
    /***********    Hidden flags below this line ***********/
    /***********    Hidden flags below this line ***********/


    /**
     * Flag for {@link #bindService}: If binding from an app that is visible, the bound service is
     * allowed to start an activity from background. Add a flag so that this behavior can be opted
     * out.
     * @hide
     */
    public static final int BIND_DENY_ACTIVITY_STARTS = 0X000004000;

    /**
    /**
     * Flag for {@link #bindService}: This flag is intended to be used only by the system to adjust
     * Flag for {@link #bindService}: This flag is intended to be used only by the system to adjust
     * the scheduling policy for IMEs (and any other out-of-process user-visible components that
     * the scheduling policy for IMEs (and any other out-of-process user-visible components that
+1 −0
Original line number Original line Diff line number Diff line
@@ -524,6 +524,7 @@ message ConnectionRecordProto {
        DEAD = 15;
        DEAD = 15;
        NOT_PERCEPTIBLE = 16;
        NOT_PERCEPTIBLE = 16;
        INCLUDE_CAPABILITIES = 17;
        INCLUDE_CAPABILITIES = 17;
        DENY_ACTIVITY_STARTS = 18;
    }
    }
    repeated Flag flags = 3;
    repeated Flag flags = 3;
    optional string service_name = 4;
    optional string service_name = 4;
+5 −0
Original line number Original line Diff line number Diff line
@@ -67,6 +67,7 @@ final class ConnectionRecord {
            Context.BIND_NOT_VISIBLE,
            Context.BIND_NOT_VISIBLE,
            Context.BIND_NOT_PERCEPTIBLE,
            Context.BIND_NOT_PERCEPTIBLE,
            Context.BIND_INCLUDE_CAPABILITIES,
            Context.BIND_INCLUDE_CAPABILITIES,
            Context.BIND_DENY_ACTIVITY_STARTS,
    };
    };
    private static final int[] BIND_PROTO_ENUMS = new int[] {
    private static final int[] BIND_PROTO_ENUMS = new int[] {
            ConnectionRecordProto.AUTO_CREATE,
            ConnectionRecordProto.AUTO_CREATE,
@@ -86,6 +87,7 @@ final class ConnectionRecord {
            ConnectionRecordProto.NOT_VISIBLE,
            ConnectionRecordProto.NOT_VISIBLE,
            ConnectionRecordProto.NOT_PERCEPTIBLE,
            ConnectionRecordProto.NOT_PERCEPTIBLE,
            ConnectionRecordProto.INCLUDE_CAPABILITIES,
            ConnectionRecordProto.INCLUDE_CAPABILITIES,
            ConnectionRecordProto.DENY_ACTIVITY_STARTS,
    };
    };


    void dump(PrintWriter pw, String prefix) {
    void dump(PrintWriter pw, String prefix) {
@@ -219,6 +221,9 @@ final class ConnectionRecord {
        if ((flags & Context.BIND_NOT_PERCEPTIBLE) != 0) {
        if ((flags & Context.BIND_NOT_PERCEPTIBLE) != 0) {
            sb.append("!PRCP ");
            sb.append("!PRCP ");
        }
        }
        if ((flags & Context.BIND_DENY_ACTIVITY_STARTS) != 0) {
            sb.append("BALFD ");
        }
        if ((flags & Context.BIND_INCLUDE_CAPABILITIES) != 0) {
        if ((flags & Context.BIND_INCLUDE_CAPABILITIES) != 0) {
            sb.append("CAPS ");
            sb.append("CAPS ");
        }
        }
+12 −8
Original line number Original line Diff line number Diff line
@@ -1341,14 +1341,14 @@ class ProcessRecord implements WindowProcessListener {
                !mAllowBackgroundActivityStartsTokens.isEmpty());
                !mAllowBackgroundActivityStartsTokens.isEmpty());
    }
    }


    void addBoundClientUid(int clientUid) {
    void addBoundClientUid(int clientUid, String clientPackageName, int bindFlags) {
        mBoundClientUids.add(clientUid);
        mBoundClientUids.add(clientUid);
        mWindowProcessController.setBoundClientUids(mBoundClientUids);
        mWindowProcessController.addBoundClientUid(clientUid, clientPackageName, bindFlags);
    }
    }


    void updateBoundClientUids() {
    void updateBoundClientUids() {
        if (mServices.isEmpty()) {
        clearBoundClientUids();
        clearBoundClientUids();
        if (mServices.isEmpty()) {
            return;
            return;
        }
        }
        // grab a set of clientUids of all connections of all services
        // grab a set of clientUids of all connections of all services
@@ -1361,12 +1361,14 @@ class ProcessRecord implements WindowProcessListener {
            for (int conni = 0; conni < N; conni++) {
            for (int conni = 0; conni < N; conni++) {
                ArrayList<ConnectionRecord> c = conns.valueAt(conni);
                ArrayList<ConnectionRecord> c = conns.valueAt(conni);
                for (int i = 0; i < c.size(); i++) {
                for (int i = 0; i < c.size(); i++) {
                    boundClientUids.add(c.get(i).clientUid);
                    ConnectionRecord cr = c.get(i);
                    boundClientUids.add(cr.clientUid);
                    mWindowProcessController
                            .addBoundClientUid(cr.clientUid, cr.clientPackageName, cr.flags);
                }
                }
            }
            }
        }
        }
        mBoundClientUids = boundClientUids;
        mBoundClientUids = boundClientUids;
        mWindowProcessController.setBoundClientUids(mBoundClientUids);
    }
    }


    void addBoundClientUidsOfNewService(ServiceRecord sr) {
    void addBoundClientUidsOfNewService(ServiceRecord sr) {
@@ -1377,15 +1379,17 @@ class ProcessRecord implements WindowProcessListener {
        for (int conni = conns.size() - 1; conni >= 0; conni--) {
        for (int conni = conns.size() - 1; conni >= 0; conni--) {
            ArrayList<ConnectionRecord> c = conns.valueAt(conni);
            ArrayList<ConnectionRecord> c = conns.valueAt(conni);
            for (int i = 0; i < c.size(); i++) {
            for (int i = 0; i < c.size(); i++) {
                mBoundClientUids.add(c.get(i).clientUid);
                ConnectionRecord cr = c.get(i);
                mBoundClientUids.add(cr.clientUid);
                mWindowProcessController
                        .addBoundClientUid(cr.clientUid, cr.clientPackageName, cr.flags);
            }
            }
        }
        }
        mWindowProcessController.setBoundClientUids(mBoundClientUids);
    }
    }


    void clearBoundClientUids() {
    void clearBoundClientUids() {
        mBoundClientUids.clear();
        mBoundClientUids.clear();
        mWindowProcessController.setBoundClientUids(mBoundClientUids);
        mWindowProcessController.clearBoundClientUids();
    }
    }


    void setActiveInstrumentation(ActiveInstrumentation instr) {
    void setActiveInstrumentation(ActiveInstrumentation instr) {
+1 −1
Original line number Original line Diff line number Diff line
@@ -627,7 +627,7 @@ final class ServiceRecord extends Binder implements ComponentName.WithComponentN


        // if we have a process attached, add bound client uid of this connection to it
        // if we have a process attached, add bound client uid of this connection to it
        if (app != null) {
        if (app != null) {
            app.addBoundClientUid(c.clientUid);
            app.addBoundClientUid(c.clientUid, c.clientPackageName, c.flags);
        }
        }
    }
    }


Loading