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

Commit fcdff3e7 authored by Chris Ye's avatar Chris Ye
Browse files

Change InputWindowInfo::isTrustedOverlay() to be permission and flag based.

Add private flag to WindowManager.LayoutParams. If the flag is set,
check if caller has INTERNAL_SYSTEM_WINDOW permission.

Bug: 155781676
Test: atest WindowManagerServiceTests
Change-Id: I58cf9f38c496e0ae8b2193dca45c0805e831bc9e
parent f3193804
Loading
Loading
Loading
Loading
+8 −8
Original line number Original line Diff line number Diff line
@@ -116,7 +116,6 @@ struct InputWindowInfo {
        TYPE_DOCK_DIVIDER = FIRST_SYSTEM_WINDOW + 34,
        TYPE_DOCK_DIVIDER = FIRST_SYSTEM_WINDOW + 34,
        TYPE_ACCESSIBILITY_MAGNIFICATION_OVERLAY = FIRST_SYSTEM_WINDOW + 39,
        TYPE_ACCESSIBILITY_MAGNIFICATION_OVERLAY = FIRST_SYSTEM_WINDOW + 39,
        TYPE_NOTIFICATION_SHADE = FIRST_SYSTEM_WINDOW + 40,
        TYPE_NOTIFICATION_SHADE = FIRST_SYSTEM_WINDOW + 40,
        TYPE_TRUSTED_APPLICATION_OVERLAY = FIRST_SYSTEM_WINDOW + 42,
        LAST_SYSTEM_WINDOW = 2999,
        LAST_SYSTEM_WINDOW = 2999,
    };
    };


@@ -171,6 +170,12 @@ struct InputWindowInfo {
    bool hasFocus = false;
    bool hasFocus = false;
    bool hasWallpaper = false;
    bool hasWallpaper = false;
    bool paused = false;
    bool paused = false;
    /* This flag is set when the window is of a trusted type that is allowed to silently
     * overlay other windows for the purpose of implementing the secure views feature.
     * Trusted overlays, such as IME windows, can partly obscure other windows without causing
     * motion events to be delivered to them with AMOTION_EVENT_FLAG_WINDOW_IS_OBSCURED.
     */
    bool trustedOverlay = false;
    int32_t ownerPid = -1;
    int32_t ownerPid = -1;
    int32_t ownerUid = -1;
    int32_t ownerUid = -1;
    int32_t inputFeatures = 0;
    int32_t inputFeatures = 0;
@@ -183,20 +188,15 @@ struct InputWindowInfo {
    void addTouchableRegion(const Rect& region);
    void addTouchableRegion(const Rect& region);


    bool touchableRegionContainsPoint(int32_t x, int32_t y) const;
    bool touchableRegionContainsPoint(int32_t x, int32_t y) const;
    bool frameContainsPoint(int32_t x, int32_t y) const;


    /* Returns true if the window is of a trusted type that is allowed to silently
    bool frameContainsPoint(int32_t x, int32_t y) const;
     * overlay other windows for the purpose of implementing the secure views feature.
     * Trusted overlays, such as IME windows, can partly obscure other windows without causing
     * motion events to be delivered to them with AMOTION_EVENT_FLAG_WINDOW_IS_OBSCURED.
     */
    bool isTrustedOverlay() const;


    bool supportsSplitTouch() const;
    bool supportsSplitTouch() const;


    bool overlaps(const InputWindowInfo* other) const;
    bool overlaps(const InputWindowInfo* other) const;


    status_t write(Parcel& output) const;
    status_t write(Parcel& output) const;

    static InputWindowInfo read(const Parcel& from);
    static InputWindowInfo read(const Parcel& from);
};
};


+2 −15
Original line number Original line Diff line number Diff line
@@ -155,21 +155,6 @@ bool InputWindowInfo::frameContainsPoint(int32_t x, int32_t y) const {
            && y >= frameTop && y < frameBottom;
            && y >= frameTop && y < frameBottom;
}
}


// TODO(b/155781676): Remove and replace call points with trustedOverlay when that is ready.
bool InputWindowInfo::isTrustedOverlay() const {
    return layoutParamsType == TYPE_ACCESSIBILITY_MAGNIFICATION_OVERLAY ||
            layoutParamsType == TYPE_INPUT_METHOD || layoutParamsType == TYPE_INPUT_METHOD_DIALOG ||
            layoutParamsType == TYPE_MAGNIFICATION_OVERLAY || layoutParamsType == TYPE_STATUS_BAR ||
            layoutParamsType == TYPE_NOTIFICATION_SHADE ||
            layoutParamsType == TYPE_NAVIGATION_BAR ||
            layoutParamsType == TYPE_NAVIGATION_BAR_PANEL ||
            layoutParamsType == TYPE_SECURE_SYSTEM_OVERLAY ||
            layoutParamsType == TYPE_DOCK_DIVIDER ||
            layoutParamsType == TYPE_ACCESSIBILITY_OVERLAY ||
            layoutParamsType == TYPE_INPUT_CONSUMER ||
            layoutParamsType == TYPE_TRUSTED_APPLICATION_OVERLAY;
}

bool InputWindowInfo::supportsSplitTouch() const {
bool InputWindowInfo::supportsSplitTouch() const {
    return layoutParamsFlags & FLAG_SPLIT_TOUCH;
    return layoutParamsFlags & FLAG_SPLIT_TOUCH;
}
}
@@ -206,6 +191,7 @@ status_t InputWindowInfo::write(Parcel& output) const {
    output.writeBool(hasFocus);
    output.writeBool(hasFocus);
    output.writeBool(hasWallpaper);
    output.writeBool(hasWallpaper);
    output.writeBool(paused);
    output.writeBool(paused);
    output.writeBool(trustedOverlay);
    output.writeInt32(ownerPid);
    output.writeInt32(ownerPid);
    output.writeInt32(ownerUid);
    output.writeInt32(ownerUid);
    output.writeInt32(inputFeatures);
    output.writeInt32(inputFeatures);
@@ -244,6 +230,7 @@ InputWindowInfo InputWindowInfo::read(const Parcel& from) {
    ret.hasFocus = from.readBool();
    ret.hasFocus = from.readBool();
    ret.hasWallpaper = from.readBool();
    ret.hasWallpaper = from.readBool();
    ret.paused = from.readBool();
    ret.paused = from.readBool();
    ret.trustedOverlay = from.readBool();
    ret.ownerPid = from.readInt32();
    ret.ownerPid = from.readInt32();
    ret.ownerUid = from.readInt32();
    ret.ownerUid = from.readInt32();
    ret.inputFeatures = from.readInt32();
    ret.inputFeatures = from.readInt32();
+1 −1
Original line number Original line Diff line number Diff line
@@ -1969,7 +1969,7 @@ static bool canBeObscuredBy(const sp<InputWindowHandle>& windowHandle,
      // windows with an input channel from the same PID as occluding, and so we
      // windows with an input channel from the same PID as occluding, and so we
      // preserve this behavior with the getToken() == null check.
      // preserve this behavior with the getToken() == null check.
        return false;
        return false;
    } else if (otherInfo->isTrustedOverlay()) {
    } else if (otherInfo->trustedOverlay) {
        return false;
        return false;
    } else if (otherInfo->displayId != info->displayId) {
    } else if (otherInfo->displayId != info->displayId) {
        return false;
        return false;