Inheritance: android.widget.AbsoluteLayout, android.view.ViewTreeObserver.OnGlobalFocusChangeListener, android.view.ViewGroup.OnHierarchyChangeListener
        public virtual void onReceivedTitle(WebView view, String title)
        {

        }
        //public AndroidWebViewActivity __this;

        public override bool shouldOverrideUrlLoading(WebView view, string url)
        {
            //Log.i(TAG, "Processing webview url click...");
            view.loadUrl(url);
            return true;
        }
        public override void createAndAttachView(int id, FrameLayout frame)
        {
            // http://stackoverflow.com/questions/2761577/android-start-an-intent-into-a-framelayout
            // http://gamma-point.com/content/android-how-have-multiple-activities-under-single-tab-tabactivity#comment-37
            // http://stackoverflow.com/questions/4882776/start-another-activity-inside-the-framelayout-of-tabactivity

            //     Caused by: java.lang.RuntimeException: You must attach your view to the given frame in createAndAttachView()
            //at wei.mark.standout.ui.Window.<init>(Window.java:154)
            //at wei.mark.standout.StandOutWindow.show(StandOutWindow.java:1078)
            //at wei.mark.standout.StandOutWindow.onStartCommand(StandOutWindow.java:381)
            //at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2656)

            var ll = new LinearLayout(
               frame.getContext()
            );

            //ll.setAlpha(0.8f);

            ll.setOrientation(LinearLayout.VERTICAL);

            #region lltab
            var lltab = new LinearLayout(
              frame.getContext()
            );
            lltab.AttachTo(ll);


            var captionpadding = new TextView(frame.getContext());

            captionpadding.setText("    ");
            // http://stackoverflow.com/questions/3297437/shadow-effect-for-a-text-in-android
            captionpadding.setShadowLayer(1, 0, 0, Color.WHITE);
            captionpadding.setTextColor(Color.WHITE);
            captionpadding.setBackgroundColor(Color.argb(0x7F, 0, 0, 0));

            captionpadding.AttachTo(lltab);

            var caption = new TextView(frame.getContext());

            caption.setText("XWidgetsWindow");
            // http://stackoverflow.com/questions/3297437/shadow-effect-for-a-text-in-android
            caption.setShadowLayer(1, 0, 0, Color.WHITE);
            caption.setTextColor(Color.WHITE);
            caption.setBackgroundColor(Color.argb(0x7F, 0, 0, 0));

            caption.AttachTo(lltab);


            var close = new TextView(frame.getContext());

            close.setText("    x    ");
            // http://stackoverflow.com/questions/3297437/shadow-effect-for-a-text-in-android
            close.setShadowLayer(1, 0, 0, Color.RED);
            close.setTextColor(Color.RED);
            close.setBackgroundColor(Color.argb(0x7F, 0, 0, 0));

            close.AttachTo(lltab);
            close.setClickable(true);

            close.AtClick(
                delegate
                {

                    this.close(id);
                }
            );

            #endregion


            //wei.mark.standout.WindowCache r;

            #region WebView
            var webview = new WebView(frame.getContext());
            //webview.setAlpha(0.8f);

            //frame.startAnimation(new AlphaAnimation(1f, 0.7f));

            //     java.lang.NoSuchMethodError: android.webkit.WebView.setAlpha
            //at PopupWebView.Activities.XWidgetsWindow.createAndAttachView(XWidgetsWindow.java:83)
            //at wei.mark.standout.ui.Window.<init>(Window.java:142)
            //at wei.mark.standout.StandOutWindow.show(StandOutWindow.java:1026)
            //at wei.mark.standout.StandOutWindow.onStartCommand(StandOutWindow.java:381)
            //at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2043)
            //at android.app.ActivityThread.access$2800(ActivityThread.java:117)
            //at android.app.ActivityThread$H.handleMessage(ActivityThread.java:998)
            //at android.os.Handler.dispatchMessage(Handler.java:99)
            //at android.os.Looper.loop(Looper.java:123)
            //at android.app.ActivityThread.main(ActivityThread.java:3687)
            //at java.lang.reflect.Method.invokeNative(Native Method)
            //at java.lang.reflect.Method.invoke(Method.java:507)
            //at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
            //at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
            //at dalvik.system.NativeStart.main(Native Method)


            //getWindow().setFlags(
            //    WindowManager_LayoutParams.FLAG_HARDWARE_ACCELERATED,
            //    WindowManager_LayoutParams.FLAG_HARDWARE_ACCELERATED);

            //setContentView(webview);

            //webview.getSettings().setSupportZoom(true); 
            //webview.getSettings().setLoadsImagesAutomatically(true);
            webview.getSettings().setJavaScriptEnabled(true);
            //webview.getSettings().setBuiltInZoomControls(true);
            //webview.setInitialScale(1);

            webview.setWebViewClient(new MyWebViewClient
            {
                //__this = this 
            });

            webview.setWebChromeClient(
                new MyWebChromeClient
                {
                    yield_title =
                        // implicit version does not work?
                        value =>
                        {
                            caption.setText(value);

                            PersistentNotifications
                                .Where(k => k.id == id)
                                .WithEach(
                                n =>
                                {
                                    n.contentText = value;

                                    n.Notification.setLatestEventInfo(
                                        n.context,
                                        n.contentTitle,
                                        n.contentText,
                                        n.contentIntent
                                    );
                                    n.update();
                                }
                            );
                        }
                }
            );

            //webview.getSettings().setSupportZoom(true);
            //webview.setScrollBarStyle(WebView.SCROLLBARS_INSIDE_OVERLAY);

            //webview.getSettings().setJavaScriptEnabled(true);

            // no flash in emulator?
            // works on my phone!
            // no Flash since android 4.1.0!!!
            //webview.getSettings().setPluginsEnabled(true);
            //webview.getSettings().setPluginState(android.webkit.WebSettings.PluginState.ON);



            // OR, you can also load from an HTML string:
            //var summary = "<html><body>You scored <b>192</b> points.</body></html>";
            //webview.loadData(summary, "text/html", null);
            //Log.i(TAG, "loadUrl");

            //var uri = "http://cubiq.org/dropbox/3dcity/";
            var uri = "http://abstractatech.com";
            webview.loadUrl(uri);
            #endregion

            // http://forum.xda-developers.com/showthread.php?t=1688531

            var rr = new RelativeLayout(frame.getContext());

            rr.setBackgroundColor(Color.argb(0x1F, 255, 255, 255));

            webview.AttachTo(rr);

            var resizer = new Button(frame.getContext());

            resizer.setText(".:");
            //resizer.setAlpha(0.4f);

            resizer.setWidth(96);
            resizer.setHeight(96);
            resizer.setBackgroundColor(Color.argb(0x7F, 255, 255, 255));



            // http://stackoverflow.com/questions/8397152/androidlayout-alignparentbottom-by-code
            // http://stackoverflow.com/questions/8397152/androidlayout-alignparentbottom-by-code




            resizer.AttachTo(rr);

            RelativeLayout.LayoutParams p = new RelativeLayout.LayoutParams(
               RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT
             );

            //400, 250,
            p.setMargins(400 - 64, 250 - 64 - 32, 0, 0);
            resizer.setLayoutParams(p);



            resizer.setOnTouchListener(
                new __OnTouchListener
                {
                    yield = (view, e) =>
                    {
                        var ww = getWindow(id);

                        // handle dragging to move
                        var consumed = this.onTouchHandleResize(id,
                            ww,
                            view,
                            e
                        );

                        {
                            p.setMargins(ww.getWidth() - 64 + 10, ww.getHeight() - 64 - 20, 0, 0);
                            resizer.setLayoutParams(p);
                        }
                        return consumed;
                    }
                }
            );

            rr.AttachTo(ll);
            ll.AttachTo(frame);

            {
                //Caused by: java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams cannot be cast to wei.mark.standout.StandOutWindow$StandOutLayoutParams
                //at wei.mark.example.XWidgetsWindow.createAndAttachView(XWidgetsWindow.java:101)
                //at wei.mark.standout.ui.Window.<init>(Window.java:150)
                //at wei.mark.standout.StandOutWindow.show(StandOutWindow.java:1078)
                //at wei.mark.standout.StandOutWindow.onStartCommand(StandOutWindow.java:381)
                //at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2656)

                //p.setMargins(ww.getWidth() - 64, ww.getHeight() - 64 - 32, 0, 0);
                //resizer.setLayoutParams(p);
            }
        }
 public virtual bool shouldOverrideUrlLoading(WebView view, string url)
 {
     return default(bool);
 }
 public override void onReceivedTitle(WebView arg0, string arg1)
 {
     yield_title(arg1);
 }
            public override void onReceivedError(WebView view, int errorCode, string description, string failingUrl)
            {
                //Log.e(TAG, "Error: " + description);

                //__this.ShowToast("Oh no! " + description);

                //Toast.makeText(__this, "Oh no! " + description, Toast.LENGTH_SHORT).show();
                //__this.alertDialog.setTitle((CharSequence)(object)"Error");
                //__this.alertDialog.setMessage(description);
                //__this.alertDialog.setButton((CharSequence)(object)"OK", new DialogInterface.OnClickListener() {
                //    public void onClick(DialogInterface dialog, int which) {
                //        return;
                //    }
                //});
                //__this.alertDialog.show();
            }
        protected override void onCreate(Bundle savedInstanceState)
        {
            base.onCreate(savedInstanceState);

            height = getWindowManager().getDefaultDisplay().getHeight();
            width = getWindowManager().getDefaultDisplay().getWidth();

            this.ToFullscreen();

            if (width > height)
            {
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);


                // http://stackoverflow.com/questions/8469112/hide-ics-back-home-task-switcher-buttons
                // http://developer.android.com/reference/android/view/View.OnSystemUiVisibilityChangeListener.html
                // http://stackoverflow.com/questions/9131790/android-lights-out-mode-not-working
                // http://baroqueworksdev.blogspot.com/2012/02/request-that-visibility-of.html
            }


            var r = new System.Random();
            var port = r.Next(1024, 32000);


            uri = "http://" + getLocalIpAddress();

            uri += ":";
            uri += ((object)(port)).ToString();

            this.setTitle(uri);


            ServerSocket serversocket = null;
            bool isRunning = true;

            #region openFileFromAssets
            Func<string, InputStream> openFileFromAssets = (string spath) =>
            {
                InputStream value = null;
                try
                {
                    value = this.getResources().getAssets().open(spath);
                }
                catch
                {

                }
                return value;

            };
            #endregion

            #region getStringFromInput
            Func<BufferedReader, string> getStringFromInput = (BufferedReader input) =>
            {
                StringBuilder sb = new StringBuilder();
                string sTemp;

                try
                {
                    sTemp = input.readLine();

                    while (!(sTemp == ""))
                    {
                        sb.append(sTemp + "\n");
                        sTemp = input.readLine();
                    }
                }
                catch
                {
                    sb = new StringBuilder();
                }

                return sb.ToString();
            };
            #endregion

            #region AtConnection
            Action<Socket> AtConnection = (clientsocket) =>
            {
      


                BufferedReader input = null;
                OutputStream output = null;

                try
                {
                    input = new BufferedReader(new InputStreamReader(clientsocket.getInputStream(), "ISO-8859-2"));
                    output = clientsocket.getOutputStream();
                }
                catch
                {
                }

                #region send_text
                Action<string> send_text = (s) =>
                {
                    string header =
                            "HTTP/1.1 200 OK\n" +
                            "Connection: close\n" +
                            "Content-type: text/html; charset=utf-8\n";
                    //"Content-Length: " + s.Length + "\n" +
                    header += "\n";

                    var w = new OutputStreamWriter(output);

                    try
                    {
                        w.write(header + s);
                        w.flush();
                    }
                    catch
                    {

                    }


                };
                #endregion

                #region send_stream
                Action<InputStream, string> send_stream = (fis, contenttype) =>
                {
                    string header =
                         "HTTP/1.1 200 OK\n";

                    header += "Expires: Sun, 17 Jan 2038 19:14:07 GMT\n";

                    header += "Content-type: ";
                    header += contenttype;
                    header += "\n";

                    //header += "Content-Length: " + fis.available() + "\n" +
                    header += "\n";
                    try
                    {
                        var w = new OutputStreamWriter(output);
                        w.write(header);
                        w.flush();

                        sbyte[] buffer = new sbyte[0x10000];
                        int bytes = 0;

                        bytes = fis.read(buffer);
                        while (bytes != -1)
                        {
                            output.write(buffer, 0, bytes);
                            bytes = fis.read(buffer);
                        }

                    }
                    catch
                    {
                    }
                };
                #endregion

                new System.Threading.Thread(
                    delegate()
                    {

                        try
                        {


                            string sAll = getStringFromInput(input);

                            var i0 = sAll.IndexOf(" ", 0);
                            var i1 = sAll.IndexOf(" ", i0 + 1);


                            var path = sAll.Substring(i0, i1 - i0);

                            path = path.Replace("%20", " ");

                            if (path.Length > 0)
                                path = path.Substring(2);

                            if (path.Length > 1)
                            {
                                var last = path.Substring(path.Length - 1);

                                if (last == "/")
                                {
                                    path = path.Substring(0, path.Length - 1);
                                }
                            }

                            if (this.width > this.height)
                                if (path == "")
                                    path = this.ApplicationFile;


                            var asset = openFileFromAssets(path);



                            if (asset != null)
                            {
                                var _get = path;

                                _get += " size: ";
                                _get += ((object)asset.available()).ToString();

                                Log.i("jsc get", _get);


                                if (path.EndsWith(".gif"))
                                    send_stream(asset, "image/gif");
                                if (path.EndsWith(".htm"))
                                    send_stream(asset, "text/html");
                                else
                                    send_stream(asset, "application/octet-stream");
                            }
                            else
                            {
                                string firstpage = "<body style='padding: 0; margin: 0;'>";

                                #region AttachQRToElement
                                Action<string, string> AttachQRToElement =
                                    (itemuri, Container) =>
                                    {
                                        firstpage += "<script>";
                                        firstpage += "\n";
                                        firstpage += "var i = document.getElementById('";
                                        firstpage += Container;
                                        firstpage += "').appendChild( qr.image(";
                                        firstpage += "\n";
                                        firstpage += "{value:'";



                                        firstpage += itemuri;
                                        firstpage += "'}";
                                        firstpage += "\n";
                                        firstpage += "));";
                                        firstpage += "\n";
                                        firstpage += "</script>";

                                    };
                                #endregion


                                #region firstpage

                                firstpage += "<script src='/qr.js'></script>";
                                firstpage += "<center>";

                                firstpage += "<div style='background-color: black; color: white; padding: 2em;'>";
                                firstpage += "&laquo; Rotate your device to left to <b>launch</b>";
                                firstpage += "</div>";

                                firstpage += "<h1>";
                                firstpage += path;
                                firstpage += "</h1>";


                                firstpage += "<div  id='newdevice'>";


                                firstpage += "</div>";
                                AttachQRToElement(this.uri, "newdevice");




                                firstpage += "<br />";



                                var ApplicationFileLink = this.uri;

                                ApplicationFileLink += "/";
                                ApplicationFileLink += this.ApplicationFile;

                                firstpage += "<a";
                                firstpage += " href='";
                                firstpage += ApplicationFileLink;
                                firstpage += "' id='ApplicationFile";
                                firstpage += "'";
                                firstpage += ">";

                                firstpage += "<div>";
                                firstpage += "Connect any other device on the same network to";
                                firstpage += "</div>";

                                firstpage += "\n";
                                firstpage += "<div>";
                                firstpage += "<code>";
                                firstpage += this.uri;
                                firstpage += "</code>";
                                firstpage += "</div>";
                                firstpage += "</a>";
                                firstpage += "\n";


                                firstpage += "<div style='padding: 1em; margin: 0; overflow: hidden;'>";

                                //ScriptCoreLib.JavaScript.DOM.IStyle.OverflowEnum.hidden




                                var assets = this.getResources().getAssets();

                                var collection = assets.list(path);

                                var index = 0;

                                #region AtItem
                                Action<string> AtItem =
                                    item =>
                                    {
                                        index++;

                                        if (!item.Contains("."))
                                        {
                                            item += "/";
                                        }

                                        firstpage += "<div style='border-top: 0.3em solid black; padding: 1em; '>";


                                        firstpage += "<a";
                                        firstpage += " href='";
                                        firstpage += item;
                                        firstpage += "' id='item";
                                        firstpage += ((object)index).ToString();
                                        firstpage += "'";
                                        firstpage += ">";

                                        var path_preview = "assets.preview/";

                                        path_preview += item;
                                        path_preview += ".png";

                                        var asset_preview = openFileFromAssets(path_preview);
                                        if (asset_preview != null)
                                        {
                                            firstpage += "<div>";
                                            firstpage += "<img  src='";
                                            firstpage += path_preview;
                                            firstpage += "' />";
                                            firstpage += "</div>";
                                        }

                                        firstpage += "<div>";
                                        firstpage += item;
                                        firstpage += "</div>";
                                        firstpage += "\n";

                                        #region WithImage
                                        var WithImage = item.EndsWith(".gif");

                                        WithImage |= item.EndsWith(".png");

                                        if (WithImage)
                                        {
                                            firstpage += "<div>";

                                            firstpage += "<img src='";
                                            firstpage += item;
                                            firstpage += "' />";
                                            firstpage += "</div>";

                                        }
                                        #endregion



                                        firstpage += "</a>";

                                        firstpage += "</div>";

                                        #region WithQR
                                        var WithQR = item.EndsWith( ".apk");

                                        if (WithQR)
                                        {
                                            var ContainerID = "item";

                                            ContainerID += ((object)index).ToString();

                                            var itemuri = this.uri + "/";
                                            itemuri += item;

                                            AttachQRToElement(itemuri, ContainerID);
                                        }
                                        #endregion

                                        firstpage += "\n";


                                    };
                                #endregion

                                foreach (var xitem in collection)
                                {
                                    AtItem(xitem);
                                }

                                firstpage += "</center>";


                                firstpage += "<pre>";
                                firstpage += sAll;
                                firstpage += "</pre>";

                                firstpage += "</div>";
                                firstpage += "</body>";

                                send_text(firstpage);
                                #endregion

                            }

                            input.close();
                            output.close();
                        }
                        catch
                        {

                        }
                    }
                ).Start();
            };
            #endregion

            #region serverThread
            var serverThread = new System.Threading.Thread(
               delegate()
               {

                   try
                   {

                       serversocket = new ServerSocket(port);
                       serversocket.setReuseAddress(true);

                       while (isRunning)
                       {

                           var clientsocket = serversocket.accept();

                           AtConnection(clientsocket);

                       }
                   }
                   catch
                   {

                   }
               }
           );

            serverThread.Start();
            #endregion


            #region AtDestroy
            AtDestroy =
                delegate
                {
                    try
                    {
                        if (serversocket != null)
                            serversocket.close();
                    }
                    catch
                    {

                    }
                };
            #endregion


            // http://stackoverflow.com/questions/8955228/webview-with-an-iframe-android
            // http://www.chrisdanielson.com/tag/webviewclient/

            this.alertDialog = new AlertDialog.Builder(this).create();

            this.progressBar = ProgressDialog.show(this,
                "Get ready!",
                "Almost there..."
            );


            #region webview
            this.webview = new WebView(this);


            setContentView(webview);


            webview.getSettings().setBuiltInZoomControls(true);
            webview.getSettings().setSupportZoom(true);
            webview.getSettings().setLoadsImagesAutomatically(true);
            webview.getSettings().setJavaScriptEnabled(true);
            webview.setInitialScale(ApplicationScale);

            webview.setWebViewClient(new MyWebViewClient { __this = this });
            webview.getSettings().setSupportZoom(false);
            webview.setScrollBarStyle(WebView.SCROLLBARS_INSIDE_OVERLAY);

            //webview.getSettings().setJavaScriptEnabled(true);

            // no flash in emulator?
            // works on my phone!
            // no Flash since android 4.1.0!!!
            //webview.getSettings().setPluginsEnabled(true);
            //webview.getSettings().setPluginState(android.webkit.WebSettings.PluginState.ON);



            // OR, you can also load from an HTML string:
            //var summary = "<html><body>You scored <b>192</b> points.</body></html>";
            //webview.loadData(summary, "text/html", null);
            //Log.i(TAG, "loadUrl");
            webview.loadUrl(uri);
            #endregion


        }
            public override bool shouldOverrideUrlLoading(WebView view, string url)
            {
                if (url.EndsWith(".apk"))
                    return false;

                //Log.i(TAG, "Processing webview url click...");
                view.loadUrl(url);
                return true;
            }
            public override void onPageFinished(WebView view, string url)
            {
                //Log.i(TAG, "Finished loading URL: " + url);
                if (__this.progressBar.isShowing())
                {
                    __this.progressBar.dismiss();
                    __this.TryHideActionbar();

                    if (__this.onpagefinished != null)
                        __this.onpagefinished();
                }
            }
        // http://m0s-programming.blogspot.com/2011/02/file-upload-in-through-webview-on.html
        //protected void onActivityResult(int requestCode, int resultCode,
        //                           Intent intent)
        //{
        //    if (requestCode == FILECHOOSER_RESULTCODE)
        //    {
        //        if (null == mUploadMessage) return;
        //        Uri result = intent == null || resultCode != RESULT_OK ? null
        //                : intent.getData();
        //        mUploadMessage.onReceiveValue(result);
        //        mUploadMessage = null;

        //    }
        //}  

        protected override void onCreate(Bundle savedInstanceState)
        {
            // https://sites.google.com/a/jsc-solutions.net/backlog/knowledge-base/2012/20120-1/201208
            // this is a prototype implementation for ApplicationWebService on android
            // we need to serve assets at random port
            // we need a webbrowser
            // web browser works.
            // while loading we could display jsc logo, made in opengl
            // we need ip and port.
            // we need to show what assets we have
            // let's start using HttpRequest

            base.onCreate(savedInstanceState);


            #region assets
            var assets = this.getResources().getAssets();

            var aa = new List<InternalFileInfo>();
            //var a = new List<InternalFileInfo>();

            Action<string> GetAssets = null;

            GetAssets =
                (ParentDirectory) =>
                {
                    var collection = new string[0];

                    Log.wtf("ApplicationWebService", "GetAssets " + ParentDirectory);

                    try
                    {
                        collection = assets.list(ParentDirectory);
                    }
                    catch
                    {
                    }


                    foreach (var RelativeName in collection)
                    {
                        var FileName =
                            string.IsNullOrEmpty(ParentDirectory) ?
                            RelativeName : ParentDirectory + "/" + RelativeName;

                        var IsFile = false;
                        try
                        {
                            var rr = assets.open(FileName);

                            IsFile = true;
                            rr.close();
                        }
                        catch
                        {
                        }

                        if (IsFile)
                        {
                            aa.Add(
                                new InternalFileInfo
                                {
                                    Name = FileName,

                                }
                            );
                        }

                        if (FileName == "webkit")
                        {
                        }
                        else if (FileName == "sounds")
                        {
                        }
                        else if (FileName == "images")
                        {
                        }
                        else GetAssets(FileName);
                    }
                };

            GetAssets("");

            #endregion


            #region CreateServer at port
            var r = new System.Random();
            var port = r.Next(1024, 32000);
            var ip = getLocalIpAddress();
            var ipa = Dns.GetHostAddresses(getLocalIpAddress())[0];

            CreateServer(
                this,
                ipa,
                port,
                x =>
                {

                }, aa.ToArray()
            ).Start();
            #endregion


            #region uri
            var uri = "http://" + ip;

            uri += ":";
            uri += ((object)(port)).ToString();

            //var height = this.getWindowManager().getDefaultDisplay().getHeight();
            //var width = this.getWindowManager().getDefaultDisplay().getWidth();


            //if (width > height)
            //{
            //    this.ToFullscreen();
            //}
            //else
            uri += "/jsc?flag=foo#bar";

            #endregion


            #region WebView as UI at uri
            var webview = new WebView(this);

            webview.getSettings().setJavaScriptEnabled(true);

            webview.setWebViewClient(new MyWebViewClient { });
            webview.setWebChromeClient(
                new MyWebChromeClient
                {
                    //AtopenFileChooser =
                    //    (ValueCallback<Uri> uploadMsg) =>
                    //    {
                    //        //mUploadMessage = uploadMsg;  
                    //        //Intent i = new Intent(Intent.ACTION_GET_CONTENT);
                    //        //i.addCategory(Intent.CATEGORY_OPENABLE);
                    //        //i.setType("image/*");
                    //        //this.startActivityForResult(
                    //        //    Intent.createChooser(i, "File Chooser"), FILECHOOSER_RESULTCODE
                    //        //);
                    //    }
                }
            );

            this.setContentView(webview);

            this.AtKeyDown =
                (keyCode, e) =>
                {

                    if (keyCode == KeyEvent.KEYCODE_BACK)
                    {
                        if (webview.canGoBack())
                        {
                            webview.goBack();
                            return true;
                        }
                    }

                    return false;
                };
            this.setTitle(uri);
            webview.loadUrl(uri);
            #endregion

        }
 public override bool shouldOverrideUrlLoading(WebView view, string url)
 {
     view.loadUrl(url);
     return true;
 }
 public virtual void onReceivedTitle(WebView view, String title)
 {
 }
        //public ProgressDialog progressBar;
        //public AlertDialog alertDialog;

        protected override void onCreate(global::android.os.Bundle savedInstanceState)
        {
            base.onCreate(savedInstanceState);

            //this.ToFullscreen();

            // http://stackoverflow.com/questions/8955228/webview-with-an-iframe-android
            // http://www.chrisdanielson.com/tag/webviewclient/

            //this.alertDialog = new AlertDialog.Builder(this).create();

            //this.progressBar = ProgressDialog.show(this, "look here!", "Loading...");
            this.webview = new WebView(this);
            // http://googlechromereleases.blogspot.com/2015/03/android-webview-update.html

            //LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(300, 300);
            //this.getWindow().setLayoutParams(layoutParams);

            getWindow().setFlags(
                WindowManager_LayoutParams.FLAG_HARDWARE_ACCELERATED,
                WindowManager_LayoutParams.FLAG_HARDWARE_ACCELERATED);

            setContentView(webview);

            //webview.getSettings().setSupportZoom(true); 
            //webview.getSettings().setLoadsImagesAutomatically(true);
            webview.getSettings().setJavaScriptEnabled(true);
            webview.getSettings().setBuiltInZoomControls(true);
            //webview.setInitialScale(1);

            webview.setWebViewClient(new MyWebViewClient { __this = this });

            //webview.getSettings().setSupportZoom(true);
            //webview.setScrollBarStyle(WebView.SCROLLBARS_INSIDE_OVERLAY);

            //webview.getSettings().setJavaScriptEnabled(true);

            // no flash in emulator?
            // works on my phone!
            // no Flash since android 4.1.0!!!
            //webview.getSettings().setPluginsEnabled(true);
            //webview.getSettings().setPluginState(android.webkit.WebSettings.PluginState.ON);



            // OR, you can also load from an HTML string:
            //var summary = "<html><body>You scored <b>192</b> points.</body></html>";
            //webview.loadData(summary, "text/html", null);
            //Log.i(TAG, "loadUrl");

            //var uri = "http://cubiq.org/dropbox/3dcity/";
            var uri = "http://webglreport.com/";
            webview.loadUrl(uri);
            //this.ShowToast(uri);

            #region AtPrepareOptions
            AtPrepareOptions +=
                value =>
                {
                    value.clear();

                    var item2 = value.add(
                      (java.lang.CharSequence)(object)uri
                  );


                    item2.setIcon(android.R.drawable.ic_menu_view);

                    var i = new Intent(Intent.ACTION_VIEW,
                        android.net.Uri.parse(uri)
                    );

                    // http://vaibhavsarode.wordpress.com/2012/05/14/creating-our-own-activity-launcher-chooser-dialog-android-launcher-selection-dialog/
                    var ic = Intent.createChooser(i, uri);


                    item2.setIntent(
                        ic
                    );
                };
            #endregion

            vConfigurationChanged = e =>
            {
                var orientation = getScreenOrientation();

                var SystemUiVisibility = getWindow().getDecorView().getSystemUiVisibility();


                // X:\jsc.svn\examples\java\android\AndroidImmersiveWhileLandscape\AndroidImmersiveWhileLandscape\ApplicationActivity.cs



                if (orientation == Configuration.ORIENTATION_LANDSCAPE)
                {
                    hideSystemUI();
                }
                else
                {
                    showSystemUI();
                }
            };

            vConfigurationChanged(null);
        }
        public override void createAndAttachView(int id, FrameLayout frame)
        {
            // http://stackoverflow.com/questions/2761577/android-start-an-intent-into-a-framelayout
            // http://gamma-point.com/content/android-how-have-multiple-activities-under-single-tab-tabactivity#comment-37
            // http://stackoverflow.com/questions/4882776/start-another-activity-inside-the-framelayout-of-tabactivity

            //     Caused by: java.lang.RuntimeException: You must attach your view to the given frame in createAndAttachView()
            //at wei.mark.standout.ui.Window.<init>(Window.java:154)
            //at wei.mark.standout.StandOutWindow.show(StandOutWindow.java:1078)
            //at wei.mark.standout.StandOutWindow.onStartCommand(StandOutWindow.java:381)
            //at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2656)

            var ll = new LinearLayout(
               frame.getContext()
            );

            //ll.setAlpha(0.8f);

            ll.setOrientation(LinearLayout.VERTICAL);

            var lltab = new LinearLayout(
              frame.getContext()
            );
            lltab.AttachTo(ll);


            #region caption
            var caption = new TextView(frame.getContext());

            caption.setText(" XWidgetsWindow");
            // http://stackoverflow.com/questions/3297437/shadow-effect-for-a-text-in-android
            caption.setShadowLayer(1, 0, 0, Color.WHITE);
            caption.setTextColor(Color.WHITE);
            caption.setBackgroundColor(Color.BLACK);

            caption.AttachTo(lltab);
            #endregion


            #region close
            var close = new TextView(frame.getContext());

            close.setText("  x  ");
            // http://stackoverflow.com/questions/3297437/shadow-effect-for-a-text-in-android
            close.setShadowLayer(1, 0, 0, Color.RED);
            close.setTextColor(Color.RED);
            close.setBackgroundColor(Color.BLACK);

            close.AttachTo(lltab);
            close.setClickable(true);

            close.AtClick(
                delegate
                {

                    this.close(id);
                }
            );
            #endregion

            #region WebView
            var webview = new WebView(frame.getContext());
            webview.setAlpha(0.8f);

            //getWindow().setFlags(
            //    WindowManager_LayoutParams.FLAG_HARDWARE_ACCELERATED,
            //    WindowManager_LayoutParams.FLAG_HARDWARE_ACCELERATED);

            //setContentView(webview);

            //webview.getSettings().setSupportZoom(true); 
            //webview.getSettings().setLoadsImagesAutomatically(true);
            webview.getSettings().setJavaScriptEnabled(true);
            //webview.getSettings().setBuiltInZoomControls(true);
            //webview.setInitialScale(1);

            webview.setWebViewClient(new MyWebViewClient
            {
                //__this = this 
            });

            //webview.getSettings().setSupportZoom(true);
            //webview.setScrollBarStyle(WebView.SCROLLBARS_INSIDE_OVERLAY);

            //webview.getSettings().setJavaScriptEnabled(true);

            // no flash in emulator?
            // works on my phone!
            // no Flash since android 4.1.0!!!
            //webview.getSettings().setPluginsEnabled(true);
            //webview.getSettings().setPluginState(android.webkit.WebSettings.PluginState.ON);



            // OR, you can also load from an HTML string:
            //var summary = "<html><body>You scored <b>192</b> points.</body></html>";
            //webview.loadData(summary, "text/html", null);
            //Log.i(TAG, "loadUrl");

            //var uri = "http://cubiq.org/dropbox/3dcity/";
            //var uri = "http://abstractatech.com";
            var uri = "http://webglreport.com";
            webview.loadUrl(uri);
            #endregion

            // http://forum.xda-developers.com/showthread.php?t=1688531

            var rr = new RelativeLayout(frame.getContext());


            webview.AttachTo(rr);

            #region resizer

            var resizer = new Button(frame.getContext());

            resizer.setText(".:");
            resizer.setAlpha(0.4f);

            resizer.setWidth(72);
            resizer.setHeight(72);


            // http://stackoverflow.com/questions/8397152/androidlayout-alignparentbottom-by-code
            // http://stackoverflow.com/questions/8397152/androidlayout-alignparentbottom-by-code




            resizer.AttachTo(rr);

            RelativeLayout.LayoutParams p = new RelativeLayout.LayoutParams(
               RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT
             );

            p.setMargins(128 + 64, 128 + 64, 0, 0);
            resizer.setLayoutParams(p);



            resizer.setOnTouchListener(
                new __OnTouchListener
                {
                    yield = (view, e) =>
                    {
                        wei.mark.standout.ui.Window ww = getWindow(id);

                        // handle dragging to move
                        var consumed = this.onTouchHandleResize(id,
                            ww,
                            view,
                            e
                        );

                        {
                            p.setMargins(ww.getWidth() - 64 + 8, ww.getHeight() - 64 - 24, 0, 0);
                            resizer.setLayoutParams(p);
                        }
                        return consumed;
                    }
                }
            );
            #endregion

            rr.AttachTo(ll);
            ll.AttachTo(frame);

            {
                //Caused by: java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams cannot be cast to wei.mark.standout.StandOutWindow$StandOutLayoutParams
                //at wei.mark.example.XWidgetsWindow.createAndAttachView(XWidgetsWindow.java:101)
                //at wei.mark.standout.ui.Window.<init>(Window.java:150)
                //at wei.mark.standout.StandOutWindow.show(StandOutWindow.java:1078)
                //at wei.mark.standout.StandOutWindow.onStartCommand(StandOutWindow.java:381)
                //at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2656)

                //p.setMargins(ww.getWidth() - 64, ww.getHeight() - 64 - 32, 0, 0);
                //resizer.setLayoutParams(p);
            }
        }
        protected override void onCreate(Bundle savedInstanceState)
        {
            base.onCreate(savedInstanceState);


            var r = new System.Random();
            var port = r.Next(1024, 32000);


            var uri = "http://" + getLocalIpAddress();

            uri += ":";
            uri += ((object)(port)).ToString();

            this.setTitle((java.lang.CharSequence)(object)uri);

            serverThread = new ServerThread { mycontext = this, port = port };

            new Thread(serverThread).start();



            // http://stackoverflow.com/questions/8955228/webview-with-an-iframe-android
            // http://www.chrisdanielson.com/tag/webviewclient/

            this.alertDialog = new AlertDialog.Builder(this).create();

            this.progressBar = ProgressDialog.show(this, (CharSequence)(object)"look here!", (CharSequence)(object)"Loading...");


            this.webview = new WebView(this);


            setContentView(webview);



            //webview.getSettings().setSupportZoom(true); 
            webview.getSettings().setLoadsImagesAutomatically(true);
            webview.getSettings().setJavaScriptEnabled(true);
            webview.getSettings().setBuiltInZoomControls(true);
            //webview.setInitialScale(1);

            webview.setWebViewClient(new MyWebViewClient { __this = this });
            webview.getSettings().setSupportZoom(false);
            webview.setScrollBarStyle(WebView.SCROLLBARS_INSIDE_OVERLAY);

            //webview.getSettings().setJavaScriptEnabled(true);

            // no flash in emulator?
            // works on my phone!
            // no Flash since android 4.1.0!!!
            //webview.getSettings().setPluginsEnabled(true);
            //webview.getSettings().setPluginState(android.webkit.WebSettings.PluginState.ON);



            // OR, you can also load from an HTML string:
            //var summary = "<html><body>You scored <b>192</b> points.</body></html>";
            //webview.loadData(summary, "text/html", null);
            //Log.i(TAG, "loadUrl");
            webview.loadUrl(uri);

            //this.setContentView(sv);




        }
 public override void onPageFinished(WebView view, string url)
 {
     //Log.i(TAG, "Finished loading URL: " + url);
     if (__this.progressBar.isShowing())
     {
         __this.progressBar.dismiss();
     }
 }