Fixes tab title not updating correctly

  Bug: 3130982
  Fixes the bug where the tab title would stay the same until a new
  title was received. Now the title changes to "Loading..." until a
  new title is received, or changes to the URL if the page finishes
  or is canceled without receiving a title.

Change-Id: I667acbaeea5383b6a434c20337d404f49b947b0d
diff --git a/src/com/android/browser/SuggestionsAdapter.java b/src/com/android/browser/SuggestionsAdapter.java
index 7cfcc6b..626283a 100644
--- a/src/com/android/browser/SuggestionsAdapter.java
+++ b/src/com/android/browser/SuggestionsAdapter.java
@@ -60,10 +60,6 @@
     private static final String COMBINED_SELECTION =
             "(url LIKE ? OR url LIKE ? OR url LIKE ? OR url LIKE ? OR title LIKE ?)";
 
-    // Regular expression which matches http://, followed by some stuff, followed by
-    // optionally a trailing slash, all matched as separate groups.
-    private static final Pattern STRIP_URL_PATTERN = Pattern.compile("^(http://)(.*?)(/$)?");
-
     Context mContext;
     Filter mFilter;
     SuggestionResults mResults;
@@ -475,7 +471,7 @@
          */
         private String getTitle(String title, String url) {
             if (TextUtils.isEmpty(title) || TextUtils.getTrimmedLength(title) == 0) {
-                title = stripUrl(url);
+                title = UrlUtils.stripUrl(url);
             }
             return title;
         }
@@ -493,31 +489,9 @@
                     || title.equals(url)) {
                 return null;
             } else {
-                return stripUrl(url);
+                return UrlUtils.stripUrl(url);
             }
         }
-
-        /**
-         * Strips the provided url of preceding "http://" and any trailing "/". Does not
-         * strip "https://". If the provided string cannot be stripped, the original string
-         * is returned.
-         *
-         * TODO: Put this in TextUtils to be used by other packages doing something similar.
-         *
-         * @param url a url to strip, like "http://www.google.com/"
-         * @return a stripped url like "www.google.com", or the original string if it could
-         *         not be stripped
-         */
-        private String stripUrl(String url) {
-            if (url == null) return null;
-            Matcher m = STRIP_URL_PATTERN.matcher(url);
-            if (m.matches() && m.groupCount() == 3) {
-                return m.group(2);
-            } else {
-                return url;
-            }
-        }
-
     }
 
     class SearchesCursor extends CursorSource {
diff --git a/src/com/android/browser/Tab.java b/src/com/android/browser/Tab.java
index 910f753..2436e84 100644
--- a/src/com/android/browser/Tab.java
+++ b/src/com/android/browser/Tab.java
@@ -510,7 +510,7 @@
                 mActivity.onPageStarted(view, url, favicon);
             }
             if (getTabChangeListener() != null) {
-                getTabChangeListener().onPageStarted(Tab.this, favicon);
+                getTabChangeListener().onPageStarted(Tab.this, url, favicon);
             }
         }
 
diff --git a/src/com/android/browser/TabBar.java b/src/com/android/browser/TabBar.java
index 26b72f7..a939639 100644
--- a/src/com/android/browser/TabBar.java
+++ b/src/com/android/browser/TabBar.java
@@ -67,8 +67,10 @@
     private boolean mUserRequestedUrlbar;
     private boolean mTitleVisible;
     private boolean mShowUrlMode;
+    private boolean mHasReceivedTitle;
 
     private Drawable mGenericFavicon;
+    private String mLoadingText;
 
     public TabBar(BrowserActivity context, TabControl tabcontrol, TitleBarXLarge titlebar) {
         super(context);
@@ -89,6 +91,7 @@
         mNewTab = (ImageButton) findViewById(R.id.newtab);
         mNewTab.setOnClickListener(this);
         mGenericFavicon = res.getDrawable(R.drawable.app_web_browser_sm);
+        mLoadingText = res.getString(R.string.title_bar_loading);
 
         // TODO: Change enabled states based on whether you can go
         // back/forward.  Probably should be done inside onPageStarted.
@@ -355,7 +358,7 @@
                 if (title != null) {
                     mTabView.setDisplayTitle(title);
                 } else if (url != null) {
-                    mTabView.setDisplayTitle(url);
+                    mTabView.setDisplayTitle(UrlUtils.stripUrl(url));
                 }
             }
         }
@@ -437,6 +440,7 @@
 
     @Override
     public void onUrlAndTitle(Tab tab, String url, String title) {
+        mHasReceivedTitle = true;
         TabViewData tvd = mTabMap.get(tab);
         if (tvd != null) {
             tvd.setUrlAndTitle(url, title);
@@ -445,13 +449,21 @@
 
     @Override
     public void onPageFinished(Tab tab) {
+        if (!mHasReceivedTitle) {
+            TabViewData tvd = mTabMap.get(tab);
+            if (tvd != null) {
+                tvd.setUrlAndTitle(tvd.mUrl, null);
+            }
+        }
     }
 
     @Override
-    public void onPageStarted(Tab tab, Bitmap favicon) {
+    public void onPageStarted(Tab tab, String url, Bitmap favicon) {
+        mHasReceivedTitle = false;
         TabViewData tvd = mTabMap.get(tab);
         if (tvd != null) {
             tvd.setFavicon(favicon);
+            tvd.setUrlAndTitle(url, mLoadingText);
         }
     }
 
diff --git a/src/com/android/browser/TabControl.java b/src/com/android/browser/TabControl.java
index 55bfb48..fcccad1 100644
--- a/src/com/android/browser/TabControl.java
+++ b/src/com/android/browser/TabControl.java
@@ -695,7 +695,7 @@
 
         public void onFavicon(Tab tab, Bitmap favicon);
 
-        public void onPageStarted(Tab tab, Bitmap favicon);
+        public void onPageStarted(Tab tab, String url, Bitmap favicon);
 
         public void onPageFinished(Tab tab);
 
diff --git a/src/com/android/browser/UrlUtils.java b/src/com/android/browser/UrlUtils.java
new file mode 100644
index 0000000..cb6377a
--- /dev/null
+++ b/src/com/android/browser/UrlUtils.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2010 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.browser;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class UrlUtils {
+
+    // Regular expression which matches http://, followed by some stuff, followed by
+    // optionally a trailing slash, all matched as separate groups.
+    private static final Pattern STRIP_URL_PATTERN = Pattern.compile("^(http://)(.*?)(/$)?");
+
+    private UrlUtils() { /* cannot be instantiated */ }
+
+    /**
+     * Strips the provided url of preceding "http://" and any trailing "/". Does not
+     * strip "https://". If the provided string cannot be stripped, the original string
+     * is returned.
+     *
+     * TODO: Put this in TextUtils to be used by other packages doing something similar.
+     *
+     * @param url a url to strip, like "http://www.google.com/"
+     * @return a stripped url like "www.google.com", or the original string if it could
+     *         not be stripped
+     */
+    /* package */ static String stripUrl(String url) {
+        if (url == null) return null;
+        Matcher m = STRIP_URL_PATTERN.matcher(url);
+        if (m.matches() && m.groupCount() == 3) {
+            return m.group(2);
+        } else {
+            return url;
+        }
+    }
+}