diff options
| -rw-r--r-- | cmds/installd/migrate_legacy_obb_data.sh | 8 | ||||
| -rw-r--r-- | libs/sensor/SensorManager.cpp | 2 | ||||
| -rw-r--r-- | services/surfaceflinger/Layer.cpp | 10 | ||||
| -rw-r--r-- | services/surfaceflinger/Layer.h | 2 | ||||
| -rw-r--r-- | services/surfaceflinger/TransactionCompletedThread.cpp | 10 | ||||
| -rw-r--r-- | services/surfaceflinger/TransactionCompletedThread.h | 2 | ||||
| -rw-r--r-- | services/surfaceflinger/tests/Transaction_test.cpp | 50 |
7 files changed, 78 insertions, 6 deletions
diff --git a/cmds/installd/migrate_legacy_obb_data.sh b/cmds/installd/migrate_legacy_obb_data.sh index 4f8a1ecb56..ef9be5c1a8 100644 --- a/cmds/installd/migrate_legacy_obb_data.sh +++ b/cmds/installd/migrate_legacy_obb_data.sh @@ -20,6 +20,14 @@ if ! test -d /data/media/obb ; then exit 0 fi +rm -rf /data/media/0/Android/obb/test_probe +touch /sdcard/Android/obb/test_probe +if ! test -f /data/media/0/Android/obb/test_probe ; then + log -p i -t migrate_legacy_obb_data "No support for 'unshared_obb'. Not migrating" + rm -rf /data/media/0/Android/obb/test_probe + exit 0 +fi + log -p i -t migrate_legacy_obb_data "Migrating legacy obb data." rm -rf /data/media/0/Android/obb cp -F -p -R -P -d /data/media/obb /data/media/0/Android diff --git a/libs/sensor/SensorManager.cpp b/libs/sensor/SensorManager.cpp index 5840d51079..96d5eb9d1f 100644 --- a/libs/sensor/SensorManager.cpp +++ b/libs/sensor/SensorManager.cpp @@ -94,7 +94,7 @@ SensorManager& SensorManager::getInstanceForPackage(const String16& packageName) SensorManager::SensorManager(const String16& opPackageName) : mSensorList(nullptr), mOpPackageName(opPackageName), mDirectConnectionHandle(1) { - // okay we're not locked here, but it's not needed during construction + Mutex::Autolock _l(mLock); assertStateLocked(); } diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index bda7e4308f..1318bc0b2a 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -1231,6 +1231,14 @@ bool Layer::isHiddenByPolicy() const { if (parent != nullptr && parent->isHiddenByPolicy()) { return true; } + if (usingRelativeZ(LayerVector::StateSet::Drawing)) { + auto zOrderRelativeOf = mDrawingState.zOrderRelativeOf.promote(); + if (zOrderRelativeOf != nullptr) { + if (zOrderRelativeOf->isHiddenByPolicy()) { + return true; + } + } + } return s.flags & layer_state_t::eLayerHidden; } @@ -1612,7 +1620,7 @@ int32_t Layer::getZ() const { return mDrawingState.z; } -bool Layer::usingRelativeZ(LayerVector::StateSet stateSet) { +bool Layer::usingRelativeZ(LayerVector::StateSet stateSet) const { const bool useDrawing = stateSet == LayerVector::StateSet::Drawing; const State& state = useDrawing ? mDrawingState : mCurrentState; return state.zOrderRelativeOf != nullptr; diff --git a/services/surfaceflinger/Layer.h b/services/surfaceflinger/Layer.h index 5c55111b40..8a80e15f29 100644 --- a/services/surfaceflinger/Layer.h +++ b/services/surfaceflinger/Layer.h @@ -824,7 +824,7 @@ public: protected: // ----------------------------------------------------------------------- - bool usingRelativeZ(LayerVector::StateSet stateSet); + bool usingRelativeZ(LayerVector::StateSet stateSet) const; bool mPremultipliedAlpha{true}; String8 mName; diff --git a/services/surfaceflinger/TransactionCompletedThread.cpp b/services/surfaceflinger/TransactionCompletedThread.cpp index 5cf8eb1a1d..fd466dedff 100644 --- a/services/surfaceflinger/TransactionCompletedThread.cpp +++ b/services/surfaceflinger/TransactionCompletedThread.cpp @@ -197,8 +197,14 @@ status_t TransactionCompletedThread::addCallbackHandle(const sp<CallbackHandle>& } transactionStats->latchTime = handle->latchTime; - transactionStats->surfaceStats.emplace_back(handle->surfaceControl, handle->acquireTime, - handle->previousReleaseFence); + // If the layer has already been destroyed, don't add the SurfaceControl to the callback. + // The client side keeps a sp<> to the SurfaceControl so if the SurfaceControl has been + // destroyed the client side is dead and there won't be anyone to send the callback to. + sp<IBinder> surfaceControl = handle->surfaceControl.promote(); + if (surfaceControl) { + transactionStats->surfaceStats.emplace_back(surfaceControl, handle->acquireTime, + handle->previousReleaseFence); + } return NO_ERROR; } diff --git a/services/surfaceflinger/TransactionCompletedThread.h b/services/surfaceflinger/TransactionCompletedThread.h index 21e2678701..e849f714d0 100644 --- a/services/surfaceflinger/TransactionCompletedThread.h +++ b/services/surfaceflinger/TransactionCompletedThread.h @@ -49,7 +49,7 @@ public: sp<ITransactionCompletedListener> listener; std::vector<CallbackId> callbackIds; - sp<IBinder> surfaceControl; + wp<IBinder> surfaceControl; bool releasePreviousBuffer = false; sp<Fence> previousReleaseFence; diff --git a/services/surfaceflinger/tests/Transaction_test.cpp b/services/surfaceflinger/tests/Transaction_test.cpp index f83b3eafe6..d5f65348d8 100644 --- a/services/surfaceflinger/tests/Transaction_test.cpp +++ b/services/surfaceflinger/tests/Transaction_test.cpp @@ -1115,6 +1115,56 @@ TEST_P(LayerTypeTransactionTest, SetLayerAndRelative) { } } +TEST_P(LayerTypeTransactionTest, HideRelativeParentHidesLayer) { + sp<SurfaceControl> parent = + LayerTransactionTest::createLayer("Parent", 0 /* buffer width */, 0 /* buffer height */, + ISurfaceComposerClient::eFXSurfaceColor); + sp<SurfaceControl> relativeParent = + LayerTransactionTest::createLayer("RelativeParent", 0 /* buffer width */, + 0 /* buffer height */, ISurfaceComposerClient::eFXSurfaceColor); + + sp<SurfaceControl> childLayer; + ASSERT_NO_FATAL_FAILURE( + childLayer = LayerTransactionTest::createLayer("childLayer", 0 /* buffer width */, + 0 /* buffer height */, + ISurfaceComposerClient::eFXSurfaceColor, + parent.get())); + Transaction() + .setColor(childLayer, half3{1.0f, 0.0f, 0.0f}) + .setColor(parent, half3{0.0f, 0.0f, 0.0f}) + .setColor(relativeParent, half3{0.0f, 1.0f, 0.0f}) + .show(childLayer) + .show(parent) + .show(relativeParent) + .setLayer(parent, mLayerZBase - 1) + .setLayer(relativeParent, mLayerZBase) + .apply(); + + Transaction() + .setRelativeLayer(childLayer, relativeParent->getHandle(), 1) + .apply(); + + { + SCOPED_TRACE("setLayer above"); + // Set layer should get applied and place the child above. + std::unique_ptr<ScreenCapture> screenshot; + ScreenCapture::captureScreen(&screenshot); + screenshot->expectColor(Rect(0, 0, 20, 30), Color::RED); + } + + Transaction() + .hide(relativeParent) + .apply(); + + { + SCOPED_TRACE("hide relative parent"); + // The relative should no longer be visible. + std::unique_ptr<ScreenCapture> screenshot; + ScreenCapture::captureScreen(&screenshot); + screenshot->expectColor(Rect(0, 0, 20, 30), Color::BLACK); + } +} + void LayerRenderTypeTransactionTest::setRelativeZGroupHelper(uint32_t layerType) { sp<SurfaceControl> layerR; sp<SurfaceControl> layerG; |