SF: Allow SurfaceFlinger to be subclassed

1) Make the destructor protected instead of private.
2) Make setClientStateLocked virtual for overriding.
3) Refactor commitTransaction to introduce a new virtual
   commitTransactionLocked for overriding.

Test: go/wm-smoke
Bug: 121291683
Change-Id: Iaa164b3c0f1f00ddf1e8ed468c0014e80adab843
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index 7928219..e556ff4 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -2566,53 +2566,55 @@
 
 void SurfaceFlinger::commitTransaction()
 {
-    withTracingLock([&]() {
-        if (!mLayersPendingRemoval.isEmpty()) {
-            // Notify removed layers now that they can't be drawn from
-            for (const auto& l : mLayersPendingRemoval) {
-                recordBufferingStats(l->getName().string(), l->getOccupancyHistory(true));
-
-                // Ensure any buffers set to display on any children are released.
-                if (l->isRemovedFromCurrentState()) {
-                    l->latchAndReleaseBuffer();
-                }
-
-                // If the layer has been removed and has no parent, then it will not be reachable
-                // when traversing layers on screen. Add the layer to the offscreenLayers set to
-                // ensure we can copy its current to drawing state.
-                if (!l->getParent()) {
-                    mOffscreenLayers.emplace(l.get());
-                }
-            }
-            mLayersPendingRemoval.clear();
-        }
-
-        // If this transaction is part of a window animation then the next frame
-        // we composite should be considered an animation as well.
-        mAnimCompositionPending = mAnimTransactionPending;
-
-        mDrawingState = mCurrentState;
-        // clear the "changed" flags in current state
-        mCurrentState.colorMatrixChanged = false;
-
-        mDrawingState.traverseInZOrder([&](Layer* layer) {
-            layer->commitChildList();
-
-            // If the layer can be reached when traversing mDrawingState, then the layer is no
-            // longer offscreen. Remove the layer from the offscreenLayer set.
-            if (mOffscreenLayers.count(layer)) {
-                mOffscreenLayers.erase(layer);
-            }
-        });
-
-        commitOffscreenLayers();
-    });
+    withTracingLock([this]() { commitTransactionLocked(); });
 
     mTransactionPending = false;
     mAnimTransactionPending = false;
     mTransactionCV.broadcast();
 }
 
+void SurfaceFlinger::commitTransactionLocked() {
+    if (!mLayersPendingRemoval.isEmpty()) {
+        // Notify removed layers now that they can't be drawn from
+        for (const auto& l : mLayersPendingRemoval) {
+            recordBufferingStats(l->getName().string(), l->getOccupancyHistory(true));
+
+            // Ensure any buffers set to display on any children are released.
+            if (l->isRemovedFromCurrentState()) {
+                l->latchAndReleaseBuffer();
+            }
+
+            // If the layer has been removed and has no parent, then it will not be reachable
+            // when traversing layers on screen. Add the layer to the offscreenLayers set to
+            // ensure we can copy its current to drawing state.
+            if (!l->getParent()) {
+                mOffscreenLayers.emplace(l.get());
+            }
+        }
+        mLayersPendingRemoval.clear();
+    }
+
+    // If this transaction is part of a window animation then the next frame
+    // we composite should be considered an animation as well.
+    mAnimCompositionPending = mAnimTransactionPending;
+
+    mDrawingState = mCurrentState;
+    // clear the "changed" flags in current state
+    mCurrentState.colorMatrixChanged = false;
+
+    mDrawingState.traverseInZOrder([&](Layer* layer) {
+        layer->commitChildList();
+
+        // If the layer can be reached when traversing mDrawingState, then the layer is no
+        // longer offscreen. Remove the layer from the offscreenLayer set.
+        if (mOffscreenLayers.count(layer)) {
+            mOffscreenLayers.erase(layer);
+        }
+    });
+
+    commitOffscreenLayers();
+}
+
 void SurfaceFlinger::withTracingLock(std::function<void()> lockedOperation) {
     if (mTracingEnabledChanged) {
         mTracingEnabled = mTracing.isEnabled();