Fix destroyHardwareResources

 The UI thread needs to know whether or not the display list is
 valid, so bring back View.destroyHardwareResources and instead
 have the native side assert that View did the right thing

Change-Id: I4f8dee6e9c13ec7ab520becdc5cfe20e92a76f8f
diff --git a/libs/hwui/RenderNode.cpp b/libs/hwui/RenderNode.cpp
index 89105ea..3cf625f 100644
--- a/libs/hwui/RenderNode.cpp
+++ b/libs/hwui/RenderNode.cpp
@@ -211,7 +211,8 @@
         // This will also release the hardware layer if we have one as
         // isRenderable() will return false, thus causing pushLayerUpdate
         // to recycle the hardware layer
-        setStagingDisplayList(NULL);
+        LOG_ALWAYS_FATAL_IF(mStagingDisplayListData || (mDisplayListData && !mNeedsDisplayListDataSync),
+                "View.destroyHardwareResources wasn't called!");
         break;
     }
 
@@ -260,7 +261,11 @@
         mNeedsDisplayListDataSync = false;
         // Do a push pass on the old tree to handle freeing DisplayListData
         // that are no longer used
-        TreeInfo oldTreeInfo(TreeInfo::MODE_MAYBE_DETACHING, info);
+        TreeInfo::TraversalMode mode = TreeInfo::MODE_MAYBE_DETACHING;
+        if (CC_UNLIKELY(info.mode == TreeInfo::MODE_DESTROY_RESOURCES)) {
+            mode = TreeInfo::MODE_DESTROY_RESOURCES;
+        }
+        TreeInfo oldTreeInfo(mode, info);
         prepareSubTree(oldTreeInfo, mDisplayListData);
         delete mDisplayListData;
         mDisplayListData = mStagingDisplayListData;