Updates to add bookmark.

Bug:2953515

Create an empty view for the list showing sub folders.

Update the text in the new folder button.

When the user changes bread crumbs, cancel folder naming.

Change-Id: I8c3f33b5b3bb6e07cd0fd421199eb905f40e45f4
diff --git a/res/layout/browser_add_bookmark.xml b/res/layout/browser_add_bookmark.xml
index aa8e1a2..7e518dd 100644
--- a/res/layout/browser_add_bookmark.xml
+++ b/res/layout/browser_add_bookmark.xml
@@ -39,7 +39,7 @@
             android:layout_alignParentRight="true"
             android:layout_alignBaseline="@+id/crumbs"
             android:drawableLeft="@drawable/ic_add_string"
-            android:text="@string/add_new_folder"
+            android:text="@string/new_folder"
             android:visibility="gone"
             android:textAppearance="?android:attr/textAppearanceMedium" />
         <ImageView android:id="@+id/add_divider"
@@ -164,6 +164,16 @@
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             />
+        <TextView
+            android:id="@+id/empty"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:visibility="gone"
+            android:layout_marginLeft="16dip"
+            android:layout_marginTop="16dip"
+            android:text="@string/no_subfolders"
+            android:textStyle="italic"
+            android:textAppearance="?android:attr/textAppearanceMedium" />
         <EditText
             android:id="@+id/folder_namer"
             android:layout_marginLeft="16dip"
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 3e7c644..c51bc41 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -125,11 +125,12 @@
     <string name="location">Address</string>
     <!-- Field label in Bookmark dialog box: refers to the folder in which to save the bookmark -->
     <string name="containing_folder">Add to</string>
-    <!-- Button text for a button that allows the user to add a new folder.  Also used as the title of the add bookmarks dialog on the page
-         that allows choosing the folder to place it in. -->
-    <string name="add_new_folder">Add new folder</string>
-    <!-- Default name for a new folder -->
+    <!-- Default name for a new folder and label for a button that allows the user to create a new folder
+         in the add bookmark dialog -->
     <string name="new_folder">New folder</string>
+    <!-- Label stating that the currently open folder has no subfolders
+         in the add bookmark dialog [CHAR-LIMIT=none]-->
+    <string name="no_subfolders">No subfolders</string>
     <!-- Field label in Bookmark dialog box: title that the user wishes to use for the bookmark -->
     <string name="name">Label</string>
     <!-- Initial value in Location field in Bookmark dialog box -->
diff --git a/src/com/android/browser/AddBookmarkPage.java b/src/com/android/browser/AddBookmarkPage.java
index d0679e1..9e5b349 100644
--- a/src/com/android/browser/AddBookmarkPage.java
+++ b/src/com/android/browser/AddBookmarkPage.java
@@ -97,6 +97,7 @@
     private BreadCrumbView mCrumbs;
     private TextView mFakeTitle;
     private View mCrumbHolder;
+    private ListView mListView;
 
     private static class Folder {
         String Name;
@@ -128,6 +129,9 @@
         loader.setUri(uri);
         loader.forceLoad();
         updateVisible();
+        if (mFolderNamer.getVisibility() == View.VISIBLE) {
+            completeOrCancelFolderNaming(true);
+        }
     }
 
     /**
@@ -169,7 +173,7 @@
                 if (actionId == EditorInfo.IME_NULL) {
                     // Only want to do this once.
                     if (event.getAction() == KeyEvent.ACTION_UP) {
-                        completeFolderNaming();
+                        completeOrCancelFolderNaming(false);
                     }
                 }
             }
@@ -200,7 +204,7 @@
             if (mFolderSelector.getVisibility() == View.VISIBLE) {
                 // We are showing the folder selector.
                 if (mFolderNamer.getVisibility() == View.VISIBLE) {
-                    completeFolderNaming();
+                    completeOrCancelFolderNaming(false);
                 } else {
                     // User has selected a folder.  Go back to the opening page
                     switchToDefaultView(true);
@@ -210,9 +214,7 @@
             }
         } else if (v == mCancelButton) {
             if (mFolderNamer.getVisibility() == View.VISIBLE) {
-                mFolderNamer.setVisibility(View.GONE);
-                mAddNewFolder.setVisibility(View.VISIBLE);
-                mAddSeparator.setVisibility(View.VISIBLE);
+                completeOrCancelFolderNaming(true);
             } else if (mFolderSelector.getVisibility() == View.VISIBLE) {
                 switchToDefaultView(false);
             } else {
@@ -224,6 +226,7 @@
             mFolderNamer.setVisibility(View.VISIBLE);
             mFolderNamer.setText(R.string.new_folder);
             mFolderNamer.requestFocus();
+            updateList();
             mAddNewFolder.setVisibility(View.GONE);
             mAddSeparator.setVisibility(View.GONE);
             getInputMethodManager().showSoftInput(mFolderNamer,
@@ -231,17 +234,27 @@
         }
     }
 
-    private void completeFolderNaming() {
-        if (!TextUtils.isEmpty(mFolderNamer.getText())) {
+    // Refresh the ListView to hide or show the empty view, as necessary.
+    // Should be called after mFolderNamer is shown or hidden.
+    private void updateList() {
+        if (mAdapter.getCount() == 0) {
+            // XXX: Is there a better way to refresh the ListView?
+            mListView.setAdapter(mAdapter);
+        }
+    }
+
+    private void completeOrCancelFolderNaming(boolean cancel) {
+        if (!cancel && !TextUtils.isEmpty(mFolderNamer.getText())) {
             String name = mFolderNamer.getText().toString();
             long id = addFolderToCurrent(mFolderNamer.getText().toString());
             descendInto(name, id);
-            mFolderNamer.setVisibility(View.GONE);
-            mAddNewFolder.setVisibility(View.VISIBLE);
-            mAddSeparator.setVisibility(View.VISIBLE);
-            getInputMethodManager().hideSoftInputFromWindow(
-                    mFolderNamer.getWindowToken(), 0);
         }
+        mFolderNamer.setVisibility(View.GONE);
+        mAddNewFolder.setVisibility(View.VISIBLE);
+        mAddSeparator.setVisibility(View.VISIBLE);
+        getInputMethodManager().hideSoftInputFromWindow(
+                mFolderNamer.getWindowToken(), 0);
+        updateList();
     }
 
     private long addFolderToCurrent(String name) {
@@ -398,6 +411,12 @@
                     getDrawable(android.R.drawable.list_selector_background));
             return view;
         }
+
+        @Override
+        public boolean isEmpty() {
+            // Do not show the empty view if the user is creating a new folder.
+            return super.isEmpty() && mFolderNamer.getVisibility() == View.GONE;
+        }
     }
 
     protected void onCreate(Bundle icicle) {
@@ -484,9 +503,11 @@
         mCrumbHolder = findViewById(R.id.crumb_holder);
 
         mAdapter = new FolderAdapter(this);
-        ListView list = (ListView) findViewById(R.id.list);
-        list.setAdapter(mAdapter);
-        list.setOnItemClickListener(this);
+        mListView = (ListView) findViewById(R.id.list);
+        View empty = findViewById(R.id.empty);
+        mListView.setEmptyView(empty);
+        mListView.setAdapter(mAdapter);
+        mListView.setOnItemClickListener(this);
         LoaderManager manager = getLoaderManager();
         if (mCurrentFolder != BrowserProvider2.FIXED_ID_ROOT) {
             // Find all the folders