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

Commit 8a5c41d3 authored by Prabir Pradhan's avatar Prabir Pradhan
Browse files

Use a strongly typed Uid in WindowInfo

Bug: 286428012
Test: presubmit
Change-Id: I039e2892274b293eeea4a167d748234a4170541e
parent 6778bd40
Loading
Loading
Loading
Loading
+6 −4
Original line number Original line Diff line number Diff line
@@ -90,8 +90,9 @@ status_t WindowInfo::writeToParcel(android::Parcel* parcel) const {
    }
    }
    parcel->writeInt32(1);
    parcel->writeInt32(1);


    // Ensure that the size of the flags that we use is 32 bits for writing into the parcel.
    // Ensure that the size of custom types are what we expect for writing into the parcel.
    static_assert(sizeof(inputConfig) == 4u);
    static_assert(sizeof(inputConfig) == 4u);
    static_assert(sizeof(ownerUid.val()) == 4u);


    // clang-format off
    // clang-format off
    status_t status = parcel->writeStrongBinder(token) ?:
    status_t status = parcel->writeStrongBinder(token) ?:
@@ -116,7 +117,7 @@ status_t WindowInfo::writeToParcel(android::Parcel* parcel) const {
        parcel->writeFloat(transform.ty()) ?:
        parcel->writeFloat(transform.ty()) ?:
        parcel->writeInt32(static_cast<int32_t>(touchOcclusionMode)) ?:
        parcel->writeInt32(static_cast<int32_t>(touchOcclusionMode)) ?:
        parcel->writeInt32(ownerPid) ?:
        parcel->writeInt32(ownerPid) ?:
        parcel->writeInt32(ownerUid) ?:
        parcel->writeInt32(ownerUid.val()) ?:
        parcel->writeUtf8AsUtf16(packageName) ?:
        parcel->writeUtf8AsUtf16(packageName) ?:
        parcel->writeInt32(inputConfig.get()) ?:
        parcel->writeInt32(inputConfig.get()) ?:
        parcel->writeInt32(displayId) ?:
        parcel->writeInt32(displayId) ?:
@@ -147,7 +148,7 @@ status_t WindowInfo::readFromParcel(const android::Parcel* parcel) {
    }
    }


    float dsdx, dtdx, tx, dtdy, dsdy, ty;
    float dsdx, dtdx, tx, dtdy, dsdy, ty;
    int32_t lpFlags, lpType, touchOcclusionModeInt, inputConfigInt;
    int32_t lpFlags, lpType, touchOcclusionModeInt, inputConfigInt, ownerUidInt;
    sp<IBinder> touchableRegionCropHandleSp;
    sp<IBinder> touchableRegionCropHandleSp;


    // clang-format off
    // clang-format off
@@ -168,7 +169,7 @@ status_t WindowInfo::readFromParcel(const android::Parcel* parcel) {
        parcel->readFloat(&ty) ?:
        parcel->readFloat(&ty) ?:
        parcel->readInt32(&touchOcclusionModeInt) ?:
        parcel->readInt32(&touchOcclusionModeInt) ?:
        parcel->readInt32(&ownerPid) ?:
        parcel->readInt32(&ownerPid) ?:
        parcel->readInt32(&ownerUid) ?:
        parcel->readInt32(&ownerUidInt) ?:
        parcel->readUtf8FromUtf16(&packageName) ?:
        parcel->readUtf8FromUtf16(&packageName) ?:
        parcel->readInt32(&inputConfigInt) ?:
        parcel->readInt32(&inputConfigInt) ?:
        parcel->readInt32(&displayId) ?:
        parcel->readInt32(&displayId) ?:
@@ -190,6 +191,7 @@ status_t WindowInfo::readFromParcel(const android::Parcel* parcel) {
    transform.set({dsdx, dtdx, tx, dtdy, dsdy, ty, 0, 0, 1});
    transform.set({dsdx, dtdx, tx, dtdy, dsdy, ty, 0, 0, 1});
    touchOcclusionMode = static_cast<TouchOcclusionMode>(touchOcclusionModeInt);
    touchOcclusionMode = static_cast<TouchOcclusionMode>(touchOcclusionModeInt);
    inputConfig = ftl::Flags<InputConfig>(inputConfigInt);
    inputConfig = ftl::Flags<InputConfig>(inputConfigInt);
    ownerUid = Uid{static_cast<uid_t>(ownerUidInt)};
    touchableRegionCropHandle = touchableRegionCropHandleSp;
    touchableRegionCropHandle = touchableRegionCropHandleSp;


    return OK;
    return OK;
+1 −1
Original line number Original line Diff line number Diff line
@@ -187,7 +187,7 @@ void SurfaceComposerClientFuzzer::getWindowInfo(gui::WindowInfo* windowInfo) {
    windowInfo->replaceTouchableRegionWithCrop = mFdp.ConsumeBool();
    windowInfo->replaceTouchableRegionWithCrop = mFdp.ConsumeBool();
    windowInfo->touchOcclusionMode = mFdp.PickValueInArray(kMode);
    windowInfo->touchOcclusionMode = mFdp.PickValueInArray(kMode);
    windowInfo->ownerPid = mFdp.ConsumeIntegral<int32_t>();
    windowInfo->ownerPid = mFdp.ConsumeIntegral<int32_t>();
    windowInfo->ownerUid = mFdp.ConsumeIntegral<int32_t>();
    windowInfo->ownerUid = gui::Uid{mFdp.ConsumeIntegral<uid_t>()};
    windowInfo->packageName = mFdp.ConsumeRandomLengthString(kRandomStringMaxBytes);
    windowInfo->packageName = mFdp.ConsumeRandomLengthString(kRandomStringMaxBytes);
    windowInfo->inputConfig = mFdp.PickValueInArray(kFeatures);
    windowInfo->inputConfig = mFdp.PickValueInArray(kFeatures);
}
}
+41 −0
Original line number Original line Diff line number Diff line
/*
 * Copyright 2023 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#pragma once

#include <ftl/mixins.h>
#include <sys/types.h>
#include <string>

namespace android::gui {

// Type-safe wrapper for a UID.
// We treat the unsigned equivalent of -1 as a singular invalid value.
struct Uid : ftl::Constructible<Uid, uid_t>, ftl::Equatable<Uid>, ftl::Orderable<Uid> {
    using Constructible::Constructible;

    const static Uid INVALID;

    constexpr auto val() const { return ftl::to_underlying(*this); }

    constexpr bool isValid() const { return val() != static_cast<uid_t>(-1); }

    std::string toString() const { return std::to_string(val()); }
};

const inline Uid Uid::INVALID{static_cast<uid_t>(-1)};

} // namespace android::gui
+3 −1
Original line number Original line Diff line number Diff line
@@ -21,6 +21,8 @@
#include <binder/Parcel.h>
#include <binder/Parcel.h>
#include <binder/Parcelable.h>
#include <binder/Parcelable.h>
#include <ftl/flags.h>
#include <ftl/flags.h>
#include <ftl/mixins.h>
#include <gui/Uid.h>
#include <gui/constants.h>
#include <gui/constants.h>
#include <ui/Rect.h>
#include <ui/Rect.h>
#include <ui/Region.h>
#include <ui/Region.h>
@@ -224,7 +226,7 @@ struct WindowInfo : public Parcelable {


    TouchOcclusionMode touchOcclusionMode = TouchOcclusionMode::BLOCK_UNTRUSTED;
    TouchOcclusionMode touchOcclusionMode = TouchOcclusionMode::BLOCK_UNTRUSTED;
    int32_t ownerPid = -1;
    int32_t ownerPid = -1;
    int32_t ownerUid = -1;
    Uid ownerUid = Uid::INVALID;
    std::string packageName;
    std::string packageName;
    ftl::Flags<InputConfig> inputConfig;
    ftl::Flags<InputConfig> inputConfig;
    int32_t displayId = ADISPLAY_ID_NONE;
    int32_t displayId = ADISPLAY_ID_NONE;
+11 −11
Original line number Original line Diff line number Diff line
@@ -821,7 +821,7 @@ TEST_F(InputSurfacesTest, touch_flag_obscured) {
    // with flag AMOTION_EVENT_FLAG_WINDOW_IS_OBSCURED
    // with flag AMOTION_EVENT_FLAG_WINDOW_IS_OBSCURED
    std::unique_ptr<InputSurface> nonTouchableSurface = makeSurface(100, 100);
    std::unique_ptr<InputSurface> nonTouchableSurface = makeSurface(100, 100);
    nonTouchableSurface->mInputInfo.setInputConfig(WindowInfo::InputConfig::NOT_TOUCHABLE, true);
    nonTouchableSurface->mInputInfo.setInputConfig(WindowInfo::InputConfig::NOT_TOUCHABLE, true);
    nonTouchableSurface->mInputInfo.ownerUid = 22222;
    nonTouchableSurface->mInputInfo.ownerUid = gui::Uid{22222};
    // Overriding occlusion mode otherwise the touch would be discarded at InputDispatcher by
    // Overriding occlusion mode otherwise the touch would be discarded at InputDispatcher by
    // the default obscured/untrusted touch filter introduced in S.
    // the default obscured/untrusted touch filter introduced in S.
    nonTouchableSurface->mInputInfo.touchOcclusionMode = TouchOcclusionMode::ALLOW;
    nonTouchableSurface->mInputInfo.touchOcclusionMode = TouchOcclusionMode::ALLOW;
@@ -842,8 +842,8 @@ TEST_F(InputSurfacesTest, touch_flag_partially_obscured_with_crop) {
    std::unique_ptr<InputSurface> nonTouchableSurface = makeSurface(100, 100);
    std::unique_ptr<InputSurface> nonTouchableSurface = makeSurface(100, 100);
    nonTouchableSurface->mInputInfo.setInputConfig(WindowInfo::InputConfig::NOT_TOUCHABLE, true);
    nonTouchableSurface->mInputInfo.setInputConfig(WindowInfo::InputConfig::NOT_TOUCHABLE, true);
    parentSurface->mInputInfo.setInputConfig(WindowInfo::InputConfig::NOT_TOUCHABLE, true);
    parentSurface->mInputInfo.setInputConfig(WindowInfo::InputConfig::NOT_TOUCHABLE, true);
    nonTouchableSurface->mInputInfo.ownerUid = 22222;
    nonTouchableSurface->mInputInfo.ownerUid = gui::Uid{22222};
    parentSurface->mInputInfo.ownerUid = 22222;
    parentSurface->mInputInfo.ownerUid = gui::Uid{22222};
    nonTouchableSurface->showAt(0, 0);
    nonTouchableSurface->showAt(0, 0);
    parentSurface->showAt(100, 100);
    parentSurface->showAt(100, 100);


@@ -866,8 +866,8 @@ TEST_F(InputSurfacesTest, touch_not_obscured_with_crop) {
    std::unique_ptr<InputSurface> nonTouchableSurface = makeSurface(100, 100);
    std::unique_ptr<InputSurface> nonTouchableSurface = makeSurface(100, 100);
    nonTouchableSurface->mInputInfo.setInputConfig(WindowInfo::InputConfig::NOT_TOUCHABLE, true);
    nonTouchableSurface->mInputInfo.setInputConfig(WindowInfo::InputConfig::NOT_TOUCHABLE, true);
    parentSurface->mInputInfo.setInputConfig(WindowInfo::InputConfig::NOT_TOUCHABLE, true);
    parentSurface->mInputInfo.setInputConfig(WindowInfo::InputConfig::NOT_TOUCHABLE, true);
    nonTouchableSurface->mInputInfo.ownerUid = 22222;
    nonTouchableSurface->mInputInfo.ownerUid = gui::Uid{22222};
    parentSurface->mInputInfo.ownerUid = 22222;
    parentSurface->mInputInfo.ownerUid = gui::Uid{22222};
    nonTouchableSurface->showAt(0, 0);
    nonTouchableSurface->showAt(0, 0);
    parentSurface->showAt(50, 50);
    parentSurface->showAt(50, 50);


@@ -886,7 +886,7 @@ TEST_F(InputSurfacesTest, touch_not_obscured_with_zero_sized_bql) {
    std::unique_ptr<InputSurface> bufferSurface =
    std::unique_ptr<InputSurface> bufferSurface =
            InputSurface::makeBufferInputSurface(mComposerClient, 0, 0);
            InputSurface::makeBufferInputSurface(mComposerClient, 0, 0);
    bufferSurface->mInputInfo.setInputConfig(WindowInfo::InputConfig::NOT_TOUCHABLE, true);
    bufferSurface->mInputInfo.setInputConfig(WindowInfo::InputConfig::NOT_TOUCHABLE, true);
    bufferSurface->mInputInfo.ownerUid = 22222;
    bufferSurface->mInputInfo.ownerUid = gui::Uid{22222};


    surface->showAt(10, 10);
    surface->showAt(10, 10);
    bufferSurface->showAt(50, 50, Rect::EMPTY_RECT);
    bufferSurface->showAt(50, 50, Rect::EMPTY_RECT);
@@ -901,7 +901,7 @@ TEST_F(InputSurfacesTest, touch_not_obscured_with_zero_sized_blast) {
    std::unique_ptr<BlastInputSurface> bufferSurface =
    std::unique_ptr<BlastInputSurface> bufferSurface =
            BlastInputSurface::makeBlastInputSurface(mComposerClient, 0, 0);
            BlastInputSurface::makeBlastInputSurface(mComposerClient, 0, 0);
    bufferSurface->mInputInfo.setInputConfig(WindowInfo::InputConfig::NOT_TOUCHABLE, true);
    bufferSurface->mInputInfo.setInputConfig(WindowInfo::InputConfig::NOT_TOUCHABLE, true);
    bufferSurface->mInputInfo.ownerUid = 22222;
    bufferSurface->mInputInfo.ownerUid = gui::Uid{22222};


    surface->showAt(10, 10);
    surface->showAt(10, 10);
    bufferSurface->showAt(50, 50, Rect::EMPTY_RECT);
    bufferSurface->showAt(50, 50, Rect::EMPTY_RECT);
@@ -948,13 +948,13 @@ TEST_F(InputSurfacesTest, strict_unobscured_input_scaled_without_crop_window) {


TEST_F(InputSurfacesTest, strict_unobscured_input_obscured_window) {
TEST_F(InputSurfacesTest, strict_unobscured_input_obscured_window) {
    std::unique_ptr<InputSurface> surface = makeSurface(100, 100);
    std::unique_ptr<InputSurface> surface = makeSurface(100, 100);
    surface->mInputInfo.ownerUid = 11111;
    surface->mInputInfo.ownerUid = gui::Uid{11111};
    surface->doTransaction(
    surface->doTransaction(
            [&](auto &t, auto &sc) { t.setDropInputMode(sc, gui::DropInputMode::OBSCURED); });
            [&](auto &t, auto &sc) { t.setDropInputMode(sc, gui::DropInputMode::OBSCURED); });
    surface->showAt(100, 100);
    surface->showAt(100, 100);
    std::unique_ptr<InputSurface> obscuringSurface = makeSurface(100, 100);
    std::unique_ptr<InputSurface> obscuringSurface = makeSurface(100, 100);
    obscuringSurface->mInputInfo.setInputConfig(WindowInfo::InputConfig::NOT_TOUCHABLE, true);
    obscuringSurface->mInputInfo.setInputConfig(WindowInfo::InputConfig::NOT_TOUCHABLE, true);
    obscuringSurface->mInputInfo.ownerUid = 22222;
    obscuringSurface->mInputInfo.ownerUid = gui::Uid{22222};
    obscuringSurface->showAt(100, 100);
    obscuringSurface->showAt(100, 100);
    injectTap(101, 101);
    injectTap(101, 101);
    EXPECT_EQ(surface->consumeEvent(100), nullptr);
    EXPECT_EQ(surface->consumeEvent(100), nullptr);
@@ -967,13 +967,13 @@ TEST_F(InputSurfacesTest, strict_unobscured_input_obscured_window) {


TEST_F(InputSurfacesTest, strict_unobscured_input_partially_obscured_window) {
TEST_F(InputSurfacesTest, strict_unobscured_input_partially_obscured_window) {
    std::unique_ptr<InputSurface> surface = makeSurface(100, 100);
    std::unique_ptr<InputSurface> surface = makeSurface(100, 100);
    surface->mInputInfo.ownerUid = 11111;
    surface->mInputInfo.ownerUid = gui::Uid{11111};
    surface->doTransaction(
    surface->doTransaction(
            [&](auto &t, auto &sc) { t.setDropInputMode(sc, gui::DropInputMode::OBSCURED); });
            [&](auto &t, auto &sc) { t.setDropInputMode(sc, gui::DropInputMode::OBSCURED); });
    surface->showAt(100, 100);
    surface->showAt(100, 100);
    std::unique_ptr<InputSurface> obscuringSurface = makeSurface(100, 100);
    std::unique_ptr<InputSurface> obscuringSurface = makeSurface(100, 100);
    obscuringSurface->mInputInfo.setInputConfig(WindowInfo::InputConfig::NOT_TOUCHABLE, true);
    obscuringSurface->mInputInfo.setInputConfig(WindowInfo::InputConfig::NOT_TOUCHABLE, true);
    obscuringSurface->mInputInfo.ownerUid = 22222;
    obscuringSurface->mInputInfo.ownerUid = gui::Uid{22222};
    obscuringSurface->showAt(190, 190);
    obscuringSurface->showAt(190, 190);


    injectTap(101, 101);
    injectTap(101, 101);
Loading