auto import from //depot/cupcake/@135843
diff --git a/tests/FrameworkTest/src/com/android/frameworktest/listview/ListViewHeight.java b/tests/FrameworkTest/src/com/android/frameworktest/listview/ListViewHeight.java
new file mode 100644
index 0000000..17222d9
--- /dev/null
+++ b/tests/FrameworkTest/src/com/android/frameworktest/listview/ListViewHeight.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright (C) 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 com.android.frameworktest.listview;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ArrayAdapter;
+import android.widget.ListView;
+
+import com.android.frameworktest.R;
+
+public class ListViewHeight extends Activity {
+
+    private View mButton1;
+    private View mButton2;
+    private View mButton3;
+    
+    private View mOuterLayout;
+    private ListView mInnerList;
+
+    ArrayAdapter<String> mAdapter;
+    private String[] mStrings = {
+            "Abbaye de Belloc", "Abbaye du Mont des Cats", "Abertam", "Abondance", "Ackawi" };
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        setContentView(R.layout.linear_layout_listview_height);
+
+        mButton1 = findViewById(R.id.button1);
+        mButton2 = findViewById(R.id.button2);
+        mButton3 = findViewById(R.id.button3);
+        
+        mOuterLayout = findViewById(R.id.layout);
+        mInnerList = (ListView)findViewById(R.id.inner_list);
+        
+        mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, 
+                                            mStrings);
+
+        // Clicking this button will show the list view and set it to a fixed height
+        // If you then hide the views, there is no problem.
+        mButton1.setOnClickListener(new View.OnClickListener() {
+            public void onClick(View v) {
+                // set listview to fixed height 
+                ViewGroup.MarginLayoutParams lp;
+                lp = (ViewGroup.MarginLayoutParams) mInnerList.getLayoutParams();
+                lp.height = 200;
+                mInnerList.setLayoutParams(lp);
+                // enable list adapter
+                mInnerList.setAdapter(mAdapter);
+                // and show it
+                mOuterLayout.setVisibility(View.VISIBLE);
+            }
+        });
+
+        // Clicking this button will show the list view and set it fill_parent height
+        // If you then hide the views, there is an NPE when calculating the ListView height.
+        mButton2.setOnClickListener(new View.OnClickListener() {
+            public void onClick(View v) {
+                // set listview to fill screen
+                ViewGroup.MarginLayoutParams lp;
+                lp = (ViewGroup.MarginLayoutParams) mInnerList.getLayoutParams();
+                lp.height = lp.FILL_PARENT;
+                mInnerList.setLayoutParams(lp);
+                // enable list adapter
+                mInnerList.setAdapter(mAdapter);
+                // and show it
+                mOuterLayout.setVisibility(View.VISIBLE);
+            }
+        });
+
+        // Clicking this button will remove the list adapter and hide the outer enclosing view.
+        // We have to climb all the way to the top because the bug (not checking visibility)
+        // only occurs at the very outer loop of ViewRoot.performTraversals and in the case of
+        // an Activity, this means you have to crawl all the way out to the root view.
+        // In the search manager, it's sufficient to simply show/hide the outer search manager
+        // view to trigger the same bug.
+        mButton3.setOnClickListener(new View.OnClickListener() {
+            public void onClick(View v) {
+                mInnerList.setAdapter(null);
+                // hide listview's owner
+                // as it turns out, the owner doesn't take us high enough
+                // because our activity includes a title bar, thus another layer
+                View parent = (View) mOuterLayout.getParent();      // FrameLayout (app container)
+                View grandpa = (View) parent.getParent();           // LinearLayout (title+app)
+                View great = (View) grandpa.getParent();            // PhoneWindow.DecorView
+                great.setVisibility(View.GONE);
+            }
+        });
+    }
+
+}