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

Commit a26367ee authored by Android Build Coastguard Worker's avatar Android Build Coastguard Worker
Browse files

Snap for 12368321 from 9b1b590a to 24Q4-release

Change-Id: I8106fa37679541a004b15d4074aa75d98eda9490
parents 66777628 9b1b590a
Loading
Loading
Loading
Loading
+24 −0
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ aconfig_declarations_group {
        "android.app.appfunctions.flags-aconfig-java",
        "android.app.contextualsearch.flags-aconfig-java",
        "android.app.flags-aconfig-java",
        "android.app.jank.flags-aconfig-java",
        "android.app.ondeviceintelligence-aconfig-java",
        "android.app.smartspace.flags-aconfig-java",
        "android.app.supervision.flags-aconfig-java",
@@ -77,6 +78,7 @@ aconfig_declarations_group {
        "android.view.inputmethod.flags-aconfig-java",
        "android.webkit.flags-aconfig-java",
        "android.widget.flags-aconfig-java",
        "art_exported_aconfig_flags_lib",
        "backstage_power_flags_lib",
        "backup_flags_lib",
        "camera_platform_flags_core_java_lib",
@@ -139,6 +141,14 @@ java_defaults {
    libs: ["fake_device_config"],
}

// ART
java_aconfig_library {
    name: "art_exported_aconfig_flags_lib",
    aconfig_declarations: "art-aconfig-flags",
    mode: "exported",
    defaults: ["framework-minus-apex-aconfig-java-defaults"],
}

// Camera
java_aconfig_library {
    name: "camera_platform_flags_core_java_lib",
@@ -1606,3 +1616,17 @@ java_aconfig_library {
    aconfig_declarations: "interaction_jank_monitor_flags",
    defaults: ["framework-minus-apex-aconfig-java-defaults"],
}

// App Jank
aconfig_declarations {
    name: "android.app.jank.flags-aconfig",
    package: "android.app.jank",
    container: "system",
    srcs: ["core/java/android/app/jank/flags.aconfig"],
}

java_aconfig_library {
    name: "android.app.jank.flags-aconfig-java",
    aconfig_declarations: "android.app.jank.flags-aconfig",
    defaults: ["framework-minus-apex-aconfig-java-defaults"],
}
+1 −0
Original line number Diff line number Diff line
@@ -427,6 +427,7 @@ java_defaults {
        "modules-utils-expresslog",
        "perfetto_trace_javastream_protos_jarjar",
        "libaconfig_java_proto_nano",
        "aconfig_device_paths_java",
    ],
}

+1 −0
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@ cc_binary {
        "libutils",
        "libbinder",
        "libjnigraphics",
        "libhwui",
        "libui",
        "libgui",
    ],
+100 −31
Original line number Diff line number Diff line
@@ -15,36 +15,28 @@
 */

#include <android/bitmap.h>
#include <android/graphics/bitmap.h>
#include <android/gui/DisplayCaptureArgs.h>
#include <binder/ProcessState.h>
#include <errno.h>
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <getopt.h>

#include <linux/fb.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <sys/wait.h>

#include <android/bitmap.h>

#include <binder/ProcessState.h>

#include <ftl/concat.h>
#include <ftl/optional.h>
#include <getopt.h>
#include <gui/ISurfaceComposer.h>
#include <gui/SurfaceComposerClient.h>
#include <gui/SyncScreenCaptureListener.h>

#include <linux/fb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <sys/wait.h>
#include <system/graphics.h>
#include <ui/GraphicTypes.h>
#include <ui/PixelFormat.h>

#include <system/graphics.h>

using namespace android;

#define COLORSPACE_UNKNOWN    0
@@ -85,10 +77,11 @@ enum {
};
}

static const struct option LONG_OPTIONS[] = {
        {"png", no_argument, nullptr, 'p'},
static const struct option LONG_OPTIONS[] = {{"png", no_argument, nullptr, 'p'},
                                             {"jpeg", no_argument, nullptr, 'j'},
                                             {"help", no_argument, nullptr, 'h'},
        {"hint-for-seamless", no_argument, nullptr, LongOpts::HintForSeamless},
                                             {"hint-for-seamless", no_argument, nullptr,
                                              LongOpts::HintForSeamless},
                                             {0, 0, 0, 0}};

static int32_t flinger2bitmapFormat(PixelFormat f)
@@ -170,10 +163,11 @@ status_t capture(const DisplayId displayId,
    return 0;
}

status_t saveImage(const char* fn, bool png, const ScreenCaptureResults& captureResults) {
status_t saveImage(const char* fn, std::optional<AndroidBitmapCompressFormat> format,
                   const ScreenCaptureResults& captureResults) {
    void* base = nullptr;
    ui::Dataspace dataspace = captureResults.capturedDataspace;
    sp<GraphicBuffer> buffer = captureResults.buffer;
    const sp<GraphicBuffer>& buffer = captureResults.buffer;

    status_t result = buffer->lock(GraphicBuffer::USAGE_SW_READ_OFTEN, &base);

@@ -188,22 +182,48 @@ status_t saveImage(const char* fn, bool png, const ScreenCaptureResults& capture
        return 1;
    }

    void* gainmapBase = nullptr;
    sp<GraphicBuffer> gainmap = captureResults.optionalGainMap;

    if (gainmap) {
        result = gainmap->lock(GraphicBuffer::USAGE_SW_READ_OFTEN, &gainmapBase);
        if (gainmapBase == nullptr || result != NO_ERROR) {
            fprintf(stderr, "Failed to capture gainmap with error code (%d)\n", result);
            gainmapBase = nullptr;
            // Fall-through: just don't attempt to write the gainmap
        }
    }

    int fd = -1;
    if (fn == nullptr) {
        fd = dup(STDOUT_FILENO);
        if (fd == -1) {
            fprintf(stderr, "Error writing to stdout. (%s)\n", strerror(errno));
            if (gainmapBase) {
                gainmap->unlock();
            }

            if (base) {
                buffer->unlock();
            }
            return 1;
        }
    } else {
        fd = open(fn, O_WRONLY | O_CREAT | O_TRUNC, 0664);
        if (fd == -1) {
            fprintf(stderr, "Error opening file: %s (%s)\n", fn, strerror(errno));
            if (gainmapBase) {
                gainmap->unlock();
            }

            if (base) {
                buffer->unlock();
            }
            return 1;
        }
    }

    if (png) {
    if (format) {
        AndroidBitmapInfo info;
        info.format = flinger2bitmapFormat(buffer->getPixelFormat());
        info.flags = ANDROID_BITMAP_FLAGS_ALPHA_PREMUL;
@@ -211,16 +231,31 @@ status_t saveImage(const char* fn, bool png, const ScreenCaptureResults& capture
        info.height = buffer->getHeight();
        info.stride = buffer->getStride() * bytesPerPixel(buffer->getPixelFormat());

        int result = AndroidBitmap_compress(&info, static_cast<int32_t>(dataspace), base,
                                            ANDROID_BITMAP_COMPRESS_FORMAT_PNG, 100, &fd,
        int result;

        if (gainmapBase) {
            result = ABitmap_compressWithGainmap(&info, static_cast<ADataSpace>(dataspace), base,
                                                 gainmapBase, captureResults.hdrSdrRatio, *format,
                                                 100, &fd,
                                                 [](void* fdPtr, const void* data,
                                                    size_t size) -> bool {
                                                     int bytesWritten =
                                                             write(*static_cast<int*>(fdPtr), data,
                                                                   size);
                                                     return bytesWritten == size;
                                                 });
        } else {
            result = AndroidBitmap_compress(&info, static_cast<int32_t>(dataspace), base, *format,
                                            100, &fd,
                                            [](void* fdPtr, const void* data, size_t size) -> bool {
                                                int bytesWritten = write(*static_cast<int*>(fdPtr),
                                                                         data, size);
                                                return bytesWritten == size;
                                            });
        }

        if (result != ANDROID_BITMAP_RESULT_SUCCESS) {
            fprintf(stderr, "Failed to compress PNG (error code: %d)\n", result);
            fprintf(stderr, "Failed to compress (error code: %d)\n", result);
        }

        if (fn != NULL) {
@@ -245,6 +280,14 @@ status_t saveImage(const char* fn, bool png, const ScreenCaptureResults& capture
    }
    close(fd);

    if (gainmapBase) {
        gainmap->unlock();
    }

    if (base) {
        buffer->unlock();
    }

    return 0;
}

@@ -262,13 +305,17 @@ int main(int argc, char** argv)
    gui::CaptureArgs captureArgs;
    const char* pname = argv[0];
    bool png = false;
    bool jpeg = false;
    bool all = false;
    int c;
    while ((c = getopt_long(argc, argv, "aphd:", LONG_OPTIONS, nullptr)) != -1) {
    while ((c = getopt_long(argc, argv, "apjhd:", LONG_OPTIONS, nullptr)) != -1) {
        switch (c) {
            case 'p':
                png = true;
                break;
            case 'j':
                jpeg = true;
                break;
            case 'd': {
                errno = 0;
                char* end = nullptr;
@@ -325,6 +372,14 @@ int main(int argc, char** argv)
            baseName = filename.substr(0, filename.size()-4);
            suffix = ".png";
            png = true;
        } else if (filename.ends_with(".jpeg")) {
            baseName = filename.substr(0, filename.size() - 5);
            suffix = ".jpeg";
            jpeg = true;
        } else if (filename.ends_with(".jpg")) {
            baseName = filename.substr(0, filename.size() - 4);
            suffix = ".jpg";
            jpeg = true;
        } else {
            baseName = filename;
        }
@@ -350,6 +405,20 @@ int main(int argc, char** argv)
        }
    }

    if (png && jpeg) {
        fprintf(stderr, "Ambiguous file type");
        return 1;
    }

    std::optional<AndroidBitmapCompressFormat> format = std::nullopt;

    if (png) {
        format = ANDROID_BITMAP_COMPRESS_FORMAT_PNG;
    } else if (jpeg) {
        format = ANDROID_BITMAP_COMPRESS_FORMAT_JPEG;
        captureArgs.attachGainmap = true;
    }

    // setThreadPoolMaxThreadCount(0) actually tells the kernel it's
    // not allowed to spawn any additional threads, but we still spawn
    // a binder thread from userspace when we call startThreadPool().
@@ -385,7 +454,7 @@ int main(int argc, char** argv)
        if (!filename.empty()) {
            fn = filename.c_str();
        }
        if (const status_t saveImageStatus = saveImage(fn, png, result) != 0) {
        if (const status_t saveImageStatus = saveImage(fn, format, result) != 0) {
            fprintf(stderr, "Saving image failed.\n");
            return saveImageStatus;
        }
+2 −0
Original line number Diff line number Diff line
@@ -6396,6 +6396,7 @@ package android.app {
    method public android.graphics.drawable.Icon getLargeIcon();
    method @Nullable public android.content.LocusId getLocusId();
    method public CharSequence getSettingsText();
    method @FlaggedApi("android.app.api_rich_ongoing") @Nullable public String getShortCriticalText();
    method public String getShortcutId();
    method public android.graphics.drawable.Icon getSmallIcon();
    method public String getSortKey();
@@ -6719,6 +6720,7 @@ package android.app {
    method @NonNull public android.app.Notification.Builder setPublicVersion(android.app.Notification);
    method @NonNull public android.app.Notification.Builder setRemoteInputHistory(CharSequence[]);
    method @NonNull public android.app.Notification.Builder setSettingsText(CharSequence);
    method @FlaggedApi("android.app.api_rich_ongoing") @NonNull public android.app.Notification.Builder setShortCriticalText(@Nullable String);
    method @NonNull public android.app.Notification.Builder setShortcutId(String);
    method @NonNull public android.app.Notification.Builder setShowWhen(boolean);
    method @NonNull public android.app.Notification.Builder setSmallIcon(@DrawableRes int);
Loading