move subwindow handling to UI

     added sub view creation to WebViewFactory
     removed WebView from subview layout
     use WebVIewFactory for creating the SubWebView
     moved layout/view related code to UI

Change-Id: Id5b1905e4c36814fe7cc047cbd97128235d7e65e
diff --git a/src/com/android/browser/BaseUi.java b/src/com/android/browser/BaseUi.java
index 2a23bb1..5f8944f 100644
--- a/src/com/android/browser/BaseUi.java
+++ b/src/com/android/browser/BaseUi.java
@@ -34,12 +34,15 @@
 import android.view.Menu;
 import android.view.MenuItem;
 import android.view.View;
+import android.view.View.OnClickListener;
 import android.view.ViewGroup;
+import android.view.ViewGroup.LayoutParams;
 import android.view.WindowManager;
 import android.webkit.WebChromeClient;
 import android.webkit.WebHistoryItem;
 import android.webkit.WebView;
 import android.widget.FrameLayout;
+import android.widget.ImageButton;
 import android.widget.LinearLayout;
 import android.widget.Toast;
 
@@ -164,6 +167,16 @@
         return w;
     }
 
+    @Override
+    public WebView createSubWebView(boolean privateBrowsing) {
+        ScrollWebView web = (ScrollWebView) createWebView(privateBrowsing);
+        if (mXLargeScreenSize) {
+            // no scroll listener for subview
+            web.setScrollListener(null);
+        }
+        return web;
+    }
+
     void stopWebViewScrolling() {
         ScrollWebView web = (ScrollWebView) mUiController.getCurrentWebView();
         if (web != null) {
@@ -415,6 +428,33 @@
     }
 
     /**
+     * create a sub window container and webview for the tab
+     * Note: this methods operates through side-effects for now
+     * it sets both the subView and subViewContainer for the given tab
+     * @param tab tab to create the sub window for
+     * @param subView webview to be set as a subwindow for the tab
+     */
+    @Override
+    public void createSubWindow(Tab tab, WebView subView) {
+        View subViewContainer = mActivity.getLayoutInflater().inflate(
+                R.layout.browser_subwindow, null);
+        ViewGroup inner = (ViewGroup) subViewContainer
+                .findViewById(R.id.inner_container);
+        inner.addView(subView, new LayoutParams(LayoutParams.MATCH_PARENT,
+                LayoutParams.MATCH_PARENT));
+        final ImageButton cancel = (ImageButton) subViewContainer
+                .findViewById(R.id.subwindow_close);
+        final WebView cancelSubView = subView;
+        cancel.setOnClickListener(new OnClickListener() {
+            public void onClick(View v) {
+                cancelSubView.getWebChromeClient().onCloseWindow(cancelSubView);
+            }
+        });
+        tab.setSubWebView(subView);
+        tab.setSubViewContainer(subViewContainer);
+    }
+
+    /**
      * Remove the sub window from the content view.
      */
     @Override
@@ -428,6 +468,10 @@
      */
     @Override
     public void attachSubWindow(View container) {
+        if (container.getParent() != null) {
+            // already attached, remove first
+            ((ViewGroup) container.getParent()).removeView(container);
+        }
         mContentView.addView(container, COVER_SCREEN_PARAMS);
     }
 
diff --git a/src/com/android/browser/Controller.java b/src/com/android/browser/Controller.java
index 9f9b451..e0b15b4 100644
--- a/src/com/android/browser/Controller.java
+++ b/src/com/android/browser/Controller.java
@@ -306,11 +306,22 @@
         mFactory = factory;
     }
 
-    WebViewFactory getWebViewFactory() {
+    @Override
+    public WebViewFactory getWebViewFactory() {
         return mFactory;
     }
 
     @Override
+    public void createSubWindow(Tab tab) {
+        endActionMode();
+        WebView mainView = tab.getWebView();
+        WebView subView = mFactory.createWebView((mainView == null)
+                ? false
+                : mainView.isPrivateBrowsingEnabled());
+        mUi.createSubWindow(tab, subView);
+    }
+
+    @Override
     public Activity getActivity() {
         return mActivity;
     }
diff --git a/src/com/android/browser/Tab.java b/src/com/android/browser/Tab.java
index ec42584..b12b317 100644
--- a/src/com/android/browser/Tab.java
+++ b/src/com/android/browser/Tab.java
@@ -36,7 +36,6 @@
 import android.view.KeyEvent;
 import android.view.LayoutInflater;
 import android.view.View;
-import android.view.View.OnClickListener;
 import android.view.ViewStub;
 import android.webkit.ConsoleMessage;
 import android.webkit.DownloadListener;
@@ -53,7 +52,6 @@
 import android.webkit.WebView;
 import android.webkit.WebViewClient;
 import android.widget.FrameLayout;
-import android.widget.ImageButton;
 import android.widget.LinearLayout;
 import android.widget.TextView;
 
@@ -1278,15 +1276,7 @@
      */
     boolean createSubWindow() {
         if (mSubView == null) {
-            mWebViewController.endActionMode();
-            mSubViewContainer = mInflateService.inflate(
-                    R.layout.browser_subwindow, null);
-            mSubView = (WebView) mSubViewContainer.findViewById(R.id.webview);
-            mSubView.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY);
-            // use trackball directly
-            mSubView.setMapTrackballToArrowKeys(false);
-            // Enable the built-in zoom
-            mSubView.getSettings().setBuiltInZoomControls(true);
+            mWebViewController.createSubWindow(this);
             mSubView.setWebViewClient(new SubWindowClient(mWebViewClient,
                     mWebViewController));
             mSubView.setWebChromeClient(new SubWindowChromeClient(
@@ -1307,15 +1297,6 @@
                 }
             });
             mSubView.setOnCreateContextMenuListener(mActivity);
-            final BrowserSettings s = BrowserSettings.getInstance();
-            s.addObserver(mSubView.getSettings()).update(s, null);
-            final ImageButton cancel = (ImageButton) mSubViewContainer
-                    .findViewById(R.id.subwindow_close);
-            cancel.setOnClickListener(new OnClickListener() {
-                public void onClick(View v) {
-                    mSubView.getWebChromeClient().onCloseWindow(mSubView);
-                }
-            });
             return true;
         }
         return false;
@@ -1463,10 +1444,18 @@
         return mSubView;
     }
 
+    void setSubWebView(WebView subView) {
+        mSubView = subView;
+    }
+
     View getSubViewContainer() {
         return mSubViewContainer;
     }
 
+    void setSubViewContainer(View subViewContainer) {
+        mSubViewContainer = subViewContainer;
+    }
+
     /**
      * @return The geolocation permissions prompt for this tab.
      */
diff --git a/src/com/android/browser/UI.java b/src/com/android/browser/UI.java
index 08cf33a..3a8a5cd 100644
--- a/src/com/android/browser/UI.java
+++ b/src/com/android/browser/UI.java
@@ -25,6 +25,7 @@
 import android.view.Menu;
 import android.view.View;
 import android.webkit.WebChromeClient.CustomViewCallback;
+import android.webkit.WebView;
 
 import java.util.List;
 
@@ -57,6 +58,8 @@
 
     public void attachTab(Tab tab);
 
+    public void createSubWindow(Tab tab, WebView subWebView);
+
     public void attachSubWindow(View subContainer);
 
     public void removeSubWindow(View subContainer);
diff --git a/src/com/android/browser/WebViewController.java b/src/com/android/browser/WebViewController.java
index fdd8ab1..8c99c58 100644
--- a/src/com/android/browser/WebViewController.java
+++ b/src/com/android/browser/WebViewController.java
@@ -39,6 +39,10 @@
 
     TabControl getTabControl();
 
+    WebViewFactory getWebViewFactory();
+
+    void createSubWindow(Tab tab);
+
     void onPageStarted(Tab tab, WebView view, String url, Bitmap favicon);
 
     void onPageFinished(Tab tab, String url);
diff --git a/src/com/android/browser/WebViewFactory.java b/src/com/android/browser/WebViewFactory.java
index 6047d1c..1186e65 100644
--- a/src/com/android/browser/WebViewFactory.java
+++ b/src/com/android/browser/WebViewFactory.java
@@ -25,4 +25,6 @@
 
     public WebView createWebView(boolean privateBrowsing);
 
+    public WebView createSubWebView(boolean privateBrowsing);
+
 }