Merge "dumpstate: Remove df from bugreport and add vold system dump"
diff --git a/core/java/android/widget/AutoCompleteTextView.java b/core/java/android/widget/AutoCompleteTextView.java
index 9537ba0..5482958 100644
--- a/core/java/android/widget/AutoCompleteTextView.java
+++ b/core/java/android/widget/AutoCompleteTextView.java
@@ -985,6 +985,11 @@
 
     /** {@inheritDoc} */
     public void onFilterComplete(int count) {
+        updateDropDownForFilter(count);
+
+    }
+
+    private void updateDropDownForFilter(int count) {
         // Not attached to window, don't update drop-down
         if (getWindowVisibility() == View.GONE) return;
 
@@ -1214,18 +1219,30 @@
         ViewGroup dropDownView;
         int otherHeights = 0;
 
-        if (mAdapter != null) {
+        final ListAdapter adapter = mAdapter;
+        if (adapter != null) {
             InputMethodManager imm = InputMethodManager.peekInstance();
             if (imm != null) {
-                int N = mAdapter.getCount();
-                if (N > 20) N = 20;
-                CompletionInfo[] completions = new CompletionInfo[N];
-                for (int i = 0; i < N; i++) {
-                    Object item = mAdapter.getItem(i);
-                    long id = mAdapter.getItemId(i);
-                    completions[i] = new CompletionInfo(id, i,
-                            convertSelectionToString(item));
+                final int count = Math.min(adapter.getCount(), 20);
+                CompletionInfo[] completions = new CompletionInfo[count];
+                int realCount = 0;
+
+                for (int i = 0; i < count; i++) {
+                    if (adapter.isEnabled(i)) {
+                        realCount++;
+                        Object item = adapter.getItem(i);
+                        long id = adapter.getItemId(i);
+                        completions[i] = new CompletionInfo(id, i,
+                                convertSelectionToString(item));
+                    }
                 }
+                
+                if (realCount != count) {
+                    CompletionInfo[] tmp = new CompletionInfo[realCount];
+                    System.arraycopy(completions, 0, tmp, 0, realCount);
+                    completions = tmp;
+                }
+
                 imm.displayCompletions(this, completions);
             }
         }
@@ -1253,7 +1270,7 @@
 
             mDropDownList = new DropDownListView(context);
             mDropDownList.setSelector(mDropDownListHighlight);
-            mDropDownList.setAdapter(mAdapter);
+            mDropDownList.setAdapter(adapter);
             mDropDownList.setVerticalFadingEdgeEnabled(true);
             mDropDownList.setOnItemClickListener(mDropDownItemClickListener);
             mDropDownList.setFocusable(true);
@@ -1599,6 +1616,16 @@
             if (isPopupShowing()) {
                 // This will resize the popup to fit the new adapter's content
                 showDropDown();
+            } else if (mAdapter != null) {
+                // If the popup is not showing already, showing it will cause
+                // the list of data set observers attached to the adapter to
+                // change. We can't do it from here, because we are in the middle
+                // of iterating throught he list of observers.
+                post(new Runnable() {
+                    public void run() {
+                        updateDropDownForFilter(mAdapter.getCount());
+                    }
+                });
             }
         }
 
diff --git a/core/res/res/layout-land/usb_storage_activity.xml b/core/res/res/layout-land/usb_storage_activity.xml
index d714479..50ca569 100644
--- a/core/res/res/layout-land/usb_storage_activity.xml
+++ b/core/res/res/layout-land/usb_storage_activity.xml
@@ -24,7 +24,7 @@
 
         <TextView android:id="@+id/banner"
             android:layout_centerHorizontal="true"
-            android:layout_below="@id/icon"
+            android:layout_alignParentTop="true"
             android:layout_marginTop="10dip"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
@@ -45,8 +45,8 @@
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_centerHorizontal="true"
-            android:layout_below="@id/message"
-            android:layout_marginTop="20dip"
+            android:layout_alignParentBottom="true"
+            android:layout_marginBottom="20dip"
             >
 
             <Button android:id="@+id/mount_button" 
@@ -64,6 +64,13 @@
                 android:paddingRight="18dip"
                 android:text="@string/usb_storage_stop_button_mount"
                 />
+            <ProgressBar android:id="@+id/progress"
+                android:visibility="gone"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:indeterminate="true"
+                style="?android:attr/progressBarStyle"
+                />
 
         </RelativeLayout>
     </RelativeLayout>
diff --git a/core/res/res/layout/usb_storage_activity.xml b/core/res/res/layout/usb_storage_activity.xml
index 86bfadb..76c30fd 100644
--- a/core/res/res/layout/usb_storage_activity.xml
+++ b/core/res/res/layout/usb_storage_activity.xml
@@ -37,8 +37,8 @@
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_centerHorizontal="true"
-        android:layout_below="@id/message"
-        android:layout_marginTop="20dip"
+        android:layout_alignParentBottom="true"
+        android:layout_marginBottom="20dip"
         >
 
         <Button android:id="@+id/mount_button" 
@@ -56,6 +56,13 @@
             android:paddingRight="18dip"
             android:text="@string/usb_storage_stop_button_mount"
             />
+        <ProgressBar android:id="@+id/progress"
+            android:visibility="gone"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:indeterminate="true"
+            style="?android:attr/progressBarStyle"
+            />
 
     </RelativeLayout>
 </RelativeLayout>
diff --git a/services/java/com/android/server/status/UsbStorageActivity.java b/services/java/com/android/server/status/UsbStorageActivity.java
index c1c8c22..b3ee257 100644
--- a/services/java/com/android/server/status/UsbStorageActivity.java
+++ b/services/java/com/android/server/status/UsbStorageActivity.java
@@ -28,6 +28,7 @@
 import android.content.DialogInterface.OnCancelListener;
 import android.os.Bundle;
 import android.os.Environment;
+import android.os.Handler;
 import android.os.IBinder;
 import android.os.storage.IMountService;
 import android.os.storage.StorageManager;
@@ -36,8 +37,10 @@
 import android.os.ServiceManager;
 import android.widget.ImageView;
 import android.widget.Button;
+import android.widget.ProgressBar;
 import android.widget.TextView;
 import android.view.View;
+import android.view.Window;
 import android.util.Log;
 
 /**
@@ -48,8 +51,10 @@
 public class UsbStorageActivity extends Activity
         implements View.OnClickListener, OnCancelListener {
     private static final String TAG = "UsbStorageActivity";
+
     private Button mMountButton;
     private Button mUnmountButton;
+    private ProgressBar mProgressBar;
     private TextView mBanner;
     private TextView mMessage;
     private ImageView mIcon;
@@ -71,11 +76,8 @@
     private StorageEventListener mStorageListener = new StorageEventListener() {
         @Override
         public void onStorageStateChanged(String path, String oldState, String newState) {
-            if (newState.equals(Environment.MEDIA_SHARED)) {
-                switchDisplay(true);
-            } else {
-                switchDisplay(false);
-            }
+            final boolean on = newState.equals(Environment.MEDIA_SHARED);
+            switchDisplay(on);
         }
     };
     
@@ -90,6 +92,9 @@
             }
         }
 
+        requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
+        setProgressBarIndeterminateVisibility(true);
+
         setTitle(getString(com.android.internal.R.string.usb_storage_activity_title));
 
         setContentView(com.android.internal.R.layout.usb_storage_activity);
@@ -102,16 +107,19 @@
         mMountButton.setOnClickListener(this);
         mUnmountButton = (Button) findViewById(com.android.internal.R.id.unmount_button);
         mUnmountButton.setOnClickListener(this);
+        mProgressBar = (ProgressBar) findViewById(com.android.internal.R.id.progress);
     }
 
     private void switchDisplay(boolean usbStorageInUse) {
         if (usbStorageInUse) {
+            mProgressBar.setVisibility(View.GONE);
             mUnmountButton.setVisibility(View.VISIBLE);
             mMountButton.setVisibility(View.GONE);
             mIcon.setImageResource(com.android.internal.R.drawable.usb_android_connected);
             mBanner.setText(com.android.internal.R.string.usb_storage_stop_title);
             mMessage.setText(com.android.internal.R.string.usb_storage_stop_message);
         } else {
+            mProgressBar.setVisibility(View.GONE);
             mUnmountButton.setVisibility(View.GONE);
             mMountButton.setVisibility(View.VISIBLE);
             mIcon.setImageResource(com.android.internal.R.drawable.usb_android);
@@ -189,6 +197,25 @@
         showDialog(id);
     }
 
+    private void switchUsbMassStorageAsync(boolean on) {
+        mUnmountButton.setVisibility(View.GONE);
+        mMountButton.setVisibility(View.GONE);
+
+        mProgressBar.setVisibility(View.VISIBLE);
+        // will be hidden once USB mass storage kicks in (or fails)
+        
+        final boolean _on = on;
+        new Thread() {
+            public void run() {
+                if (_on) {
+                    mStorageManager.enableUsbMassStorage();
+                } else {
+                    mStorageManager.disableUsbMassStorage();
+                }
+            }
+        }.start();
+    }
+
     private void checkStorageUsers() {
         IMountService ims = getMountService();
         if (ims == null) {
@@ -208,18 +235,17 @@
             showDialogInner(DLG_CONFIRM_KILL_STORAGE_USERS);
         } else {
             if (localLOGV) Log.i(TAG, "Enabling UMS");
-            mStorageManager.enableUsbMassStorage();
+            switchUsbMassStorageAsync(true);
         }
     }
 
     public void onClick(View v) {
-        Log.i(TAG, "Clicked button");
         if (v == mMountButton) {
            // Check for list of storage users and display dialog if needed.
             checkStorageUsers();
         } else if (v == mUnmountButton) {
             if (localLOGV) Log.i(TAG, "Disabling UMS");
-            mStorageManager.disableUsbMassStorage();
+            switchUsbMassStorageAsync(false);
         }
     }
 
diff --git a/tests/AndroidTests/src/com/android/unit_tests/internal/util/HanziToPinyinTest.java b/tests/AndroidTests/src/com/android/unit_tests/internal/util/HanziToPinyinTest.java
index 8e1ff0b..71a8ea7 100644
--- a/tests/AndroidTests/src/com/android/unit_tests/internal/util/HanziToPinyinTest.java
+++ b/tests/AndroidTests/src/com/android/unit_tests/internal/util/HanziToPinyinTest.java
@@ -17,6 +17,7 @@
 package com.android.unit_tests.internal.util;
 
 import java.text.Collator;
+import java.util.Arrays;
 import java.util.ArrayList;
 import java.util.Locale;
 
@@ -37,6 +38,9 @@
 
     @SmallTest
     public void testGetToken() throws Exception {
+        if (!Arrays.asList(Collator.getAvailableLocales()).contains(Locale.CHINA)) {
+            return;
+        }
         ArrayList<Token> tokens = HanziToPinyin.getInstance().get(ONE_HANZI);
         assertEquals(tokens.size(), 1);
         assertEquals(tokens.get(0).type, Token.PINYIN);