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