1 /*
2  * Copyright (C) 2023 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.systemui.screenshot.appclips;
18 
19 import android.graphics.Bitmap;
20 import android.graphics.ColorSpace;
21 import android.graphics.ParcelableColorSpace;
22 import android.hardware.HardwareBuffer;
23 import android.os.Parcel;
24 import android.os.Parcelable;
25 import android.window.ScreenCapture.ScreenshotHardwareBuffer;
26 
27 /**
28  * An internal version of {@link ScreenshotHardwareBuffer} that helps with parceling the information
29  * necessary for creating a {@link Bitmap}.
30  */
31 class ScreenshotHardwareBufferInternal implements Parcelable {
32 
33     public static final Creator<ScreenshotHardwareBufferInternal> CREATOR =
34             new Creator<>() {
35                 @Override
36                 public ScreenshotHardwareBufferInternal createFromParcel(Parcel in) {
37                     return new ScreenshotHardwareBufferInternal(in);
38                 }
39 
40                 @Override
41                 public ScreenshotHardwareBufferInternal[] newArray(int size) {
42                     return new ScreenshotHardwareBufferInternal[size];
43                 }
44             };
45     private final HardwareBuffer mHardwareBuffer;
46     private final ParcelableColorSpace mParcelableColorSpace;
47 
ScreenshotHardwareBufferInternal( ScreenshotHardwareBuffer screenshotHardwareBuffer)48     ScreenshotHardwareBufferInternal(
49             ScreenshotHardwareBuffer screenshotHardwareBuffer) {
50         mHardwareBuffer = screenshotHardwareBuffer.getHardwareBuffer();
51         mParcelableColorSpace = new ParcelableColorSpace(
52                 screenshotHardwareBuffer.getColorSpace());
53     }
54 
ScreenshotHardwareBufferInternal(Parcel in)55     private ScreenshotHardwareBufferInternal(Parcel in) {
56         mHardwareBuffer = in.readParcelable(HardwareBuffer.class.getClassLoader(),
57                 HardwareBuffer.class);
58         mParcelableColorSpace = in.readParcelable(ParcelableColorSpace.class.getClassLoader(),
59                 ParcelableColorSpace.class);
60     }
61 
62     /**
63      * Returns a {@link Bitmap} represented by the underlying data and successively closes the
64      * internal {@link HardwareBuffer}. See,
65      * {@link Bitmap#wrapHardwareBuffer(HardwareBuffer, ColorSpace)} and
66      * {@link HardwareBuffer#close()} for more information.
67      */
createBitmapThenCloseBuffer()68     Bitmap createBitmapThenCloseBuffer() {
69         Bitmap bitmap = Bitmap.wrapHardwareBuffer(mHardwareBuffer,
70                 mParcelableColorSpace.getColorSpace());
71         mHardwareBuffer.close();
72         return bitmap;
73     }
74 
75     @Override
writeToParcel(Parcel dest, int flags)76     public void writeToParcel(Parcel dest, int flags) {
77         dest.writeParcelable(mHardwareBuffer, flags);
78         dest.writeParcelable(mParcelableColorSpace, flags);
79     }
80 
81     @Override
describeContents()82     public int describeContents() {
83         return 0;
84     }
85 
86     @Override
equals(Object obj)87     public boolean equals(Object obj) {
88         if (!(obj instanceof ScreenshotHardwareBufferInternal)) {
89             return false;
90         }
91 
92         ScreenshotHardwareBufferInternal other = (ScreenshotHardwareBufferInternal) obj;
93         return mHardwareBuffer.equals(other.mHardwareBuffer) && mParcelableColorSpace.equals(
94                 other.mParcelableColorSpace);
95     }
96 }
97