diff options
| author | 2016-03-02 21:47:08 +0000 | |
|---|---|---|
| committer | 2016-03-02 21:47:13 +0000 | |
| commit | cc19ec809e45616449f332d2e72c754d7debf9fb (patch) | |
| tree | 9dd3746756bfcbc2d76a05be7fd9089847b5e391 | |
| parent | 649449dbb777e58ea5f6f1af61f84022d088190c (diff) | |
| parent | 88612912ac8406f2be0eeff97892274f98509017 (diff) | |
Merge "GUI: Move Surface.aidl here and implement for native" into nyc-dev
| -rw-r--r-- | aidl/gui/android/view/Surface.aidl | 20 | ||||
| -rw-r--r-- | include/gui/Surface.h | 39 | ||||
| -rw-r--r-- | libs/gui/Surface.cpp | 53 |
3 files changed, 112 insertions, 0 deletions
diff --git a/aidl/gui/android/view/Surface.aidl b/aidl/gui/android/view/Surface.aidl new file mode 100644 index 0000000000..674c16387e --- /dev/null +++ b/aidl/gui/android/view/Surface.aidl @@ -0,0 +1,20 @@ +/* //device/java/android/android/view/Surface.aidl +** +** Copyright 2007, 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. +*/ + +package android.view; + +parcelable Surface cpp_header "gui/Surface.h"; diff --git a/include/gui/Surface.h b/include/gui/Surface.h index 3afdaae561..9f51cdd8af 100644 --- a/include/gui/Surface.h +++ b/include/gui/Surface.h @@ -23,6 +23,8 @@ #include <ui/ANativeObjectBase.h> #include <ui/Region.h> +#include <binder/Parcelable.h> + #include <utils/RefBase.h> #include <utils/threads.h> #include <utils/KeyedVector.h> @@ -348,6 +350,43 @@ private: bool mSharedBufferHasBeenQueued; }; +namespace view { + +/** + * A simple holder for an IGraphicBufferProducer, to match the managed-side + * android.view.Surface parcelable behavior. + * + * This implements android/view/Surface.aidl + * + * TODO: Convert IGraphicBufferProducer into AIDL so that it can be directly + * used in managed Binder calls. + */ +class Surface : public Parcelable { + public: + + String16 name; + sp<IGraphicBufferProducer> graphicBufferProducer; + + virtual status_t writeToParcel(Parcel* parcel) const override; + virtual status_t readFromParcel(const Parcel* parcel) override; + + // nameAlreadyWritten set to true by Surface.java, because it splits + // Parceling itself between managed and native code, so it only wants a part + // of the full parceling to happen on its native side. + status_t writeToParcel(Parcel* parcel, bool nameAlreadyWritten) const; + + // nameAlreadyRead set to true by Surface.java, because it splits + // Parceling itself between managed and native code, so it only wants a part + // of the full parceling to happen on its native side. + status_t readFromParcel(const Parcel* parcel, bool nameAlreadyRead); + + private: + + static String16 readMaybeEmptyString16(const Parcel* parcel); +}; + +} // namespace view + }; // namespace android #endif // ANDROID_GUI_SURFACE_H diff --git a/libs/gui/Surface.cpp b/libs/gui/Surface.cpp index c2956841fd..8025ca58b5 100644 --- a/libs/gui/Surface.cpp +++ b/libs/gui/Surface.cpp @@ -1259,4 +1259,57 @@ status_t Surface::unlockAndPost() return err; } +namespace view { + +status_t Surface::writeToParcel(Parcel* parcel) const { + return writeToParcel(parcel, false); +} + +status_t Surface::writeToParcel(Parcel* parcel, bool nameAlreadyWritten) const { + if (parcel == nullptr) return BAD_VALUE; + + status_t res = OK; + + if (!nameAlreadyWritten) res = parcel->writeString16(name); + + if (res == OK) { + res = parcel->writeStrongBinder( + IGraphicBufferProducer::asBinder(graphicBufferProducer)); + } + return res; +} + +status_t Surface::readFromParcel(const Parcel* parcel) { + return readFromParcel(parcel, false); +} + +status_t Surface::readFromParcel(const Parcel* parcel, bool nameAlreadyRead) { + if (parcel == nullptr) return BAD_VALUE; + + if (!nameAlreadyRead) { + name = readMaybeEmptyString16(parcel); + } + + sp<IBinder> binder; + + status_t res = parcel->readStrongBinder(&binder); + if (res != OK) return res; + + graphicBufferProducer = interface_cast<IGraphicBufferProducer>(binder); + + return OK; +} + +String16 Surface::readMaybeEmptyString16(const Parcel* parcel) { + size_t len; + const char16_t* str = parcel->readString16Inplace(&len); + if (str != nullptr) { + return String16(str, len); + } else { + return String16(); + } +} + +} // namespace view + }; // namespace android |