diff options
| author | The Android Open Source Project <initial-contribution@android.com> | 2009-01-20 14:03:58 -0800 | 
|---|---|---|
| committer | The Android Open Source Project <initial-contribution@android.com> | 2009-01-20 14:03:58 -0800 | 
| commit | 22f7dfd23490a3de2f21ff96949ba47003aac8f8 (patch) | |
| tree | 41bc290bb2f1f08a0e37cfda4955742a85d42ecf /core/java/android/webkit | |
| parent | 9266c558bf1d21ff647525ff99f7dadbca417309 (diff) | |
| download | frameworks_base-22f7dfd23490a3de2f21ff96949ba47003aac8f8.zip frameworks_base-22f7dfd23490a3de2f21ff96949ba47003aac8f8.tar.gz frameworks_base-22f7dfd23490a3de2f21ff96949ba47003aac8f8.tar.bz2 | |
auto import from //branches/cupcake/...@127101
Diffstat (limited to 'core/java/android/webkit')
| -rw-r--r-- | core/java/android/webkit/CallbackProxy.java | 136 | ||||
| -rw-r--r-- | core/java/android/webkit/TextDialog.java | 49 | ||||
| -rw-r--r-- | core/java/android/webkit/WebView.java | 13 | 
3 files changed, 178 insertions, 20 deletions
| diff --git a/core/java/android/webkit/CallbackProxy.java b/core/java/android/webkit/CallbackProxy.java index cae94c9..4f8e5e4 100644 --- a/core/java/android/webkit/CallbackProxy.java +++ b/core/java/android/webkit/CallbackProxy.java @@ -16,8 +16,10 @@  package android.webkit; +import android.app.AlertDialog;  import android.content.ActivityNotFoundException;  import android.content.Context; +import android.content.DialogInterface;  import android.content.Intent;  import android.graphics.Bitmap;  import android.net.Uri; @@ -30,7 +32,14 @@ import android.os.SystemClock;  import android.util.Config;  import android.util.Log;  import android.view.KeyEvent; - +import android.view.LayoutInflater; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; +import com.android.internal.R; + +import java.net.MalformedURLException; +import java.net.URL;  import java.util.HashMap;  /** @@ -376,12 +385,24 @@ class CallbackProxy extends Handler {              case JS_ALERT:                  if (mWebChromeClient != null) { -                    JsResult res = (JsResult) msg.obj; +                    final JsResult res = (JsResult) msg.obj;                      String message = msg.getData().getString("message");                      String url = msg.getData().getString("url");                      if (!mWebChromeClient.onJsAlert(mWebView, url, message, -                                res)) { -                        res.handleDefault(); +                            res)) { +                        new AlertDialog.Builder(mContext) +                                .setTitle(getJsDialogTitle(url)) +                                .setMessage(message) +                                .setPositiveButton(R.string.ok, +                                        new AlertDialog.OnClickListener() { +                                            public void onClick( +                                                    DialogInterface dialog, +                                                    int which) { +                                                res.confirm(); +                                            } +                                        }) +                                .setCancelable(false) +                                .show();                      }                      res.setReady();                  } @@ -389,12 +410,29 @@ class CallbackProxy extends Handler {              case JS_CONFIRM:                  if (mWebChromeClient != null) { -                    JsResult res = (JsResult) msg.obj; +                    final JsResult res = (JsResult) msg.obj;                      String message = msg.getData().getString("message");                      String url = msg.getData().getString("url");                      if (!mWebChromeClient.onJsConfirm(mWebView, url, message, -                                res)) { -                        res.handleDefault(); +                            res)) { +                        new AlertDialog.Builder(mContext) +                                .setTitle(getJsDialogTitle(url)) +                                .setMessage(message) +                                .setPositiveButton(R.string.ok,  +                                        new DialogInterface.OnClickListener() { +                                            public void onClick( +                                                    DialogInterface dialog, +                                                    int which) { +                                                res.confirm(); +                                            }}) +                                .setNegativeButton(R.string.cancel,  +                                        new DialogInterface.OnClickListener() { +                                            public void onClick( +                                                    DialogInterface dialog, +                                                    int which) { +                                                res.cancel(); +                                            }}) +                                .show();                      }                      // Tell the JsResult that it is ready for client                      // interaction. @@ -404,13 +442,49 @@ class CallbackProxy extends Handler {              case JS_PROMPT:                  if (mWebChromeClient != null) { -                    JsPromptResult res = (JsPromptResult) msg.obj; +                    final JsPromptResult res = (JsPromptResult) msg.obj;                      String message = msg.getData().getString("message");                      String defaultVal = msg.getData().getString("default");                      String url = msg.getData().getString("url");                      if (!mWebChromeClient.onJsPrompt(mWebView, url, message,                                  defaultVal, res)) { -                        res.handleDefault(); +                        final LayoutInflater factory = LayoutInflater +                                .from(mContext); +                        final View view = factory.inflate(R.layout.js_prompt, +                                null); +                        final EditText v = (EditText) view +                                .findViewById(R.id.value); +                        v.setText(defaultVal); +                        ((TextView) view.findViewById(R.id.message)) +                                .setText(message); +                        new AlertDialog.Builder(mContext) +                                .setTitle(getJsDialogTitle(url)) +                                .setView(view) +                                .setPositiveButton(R.string.ok, +                                        new DialogInterface.OnClickListener() { +                                            public void onClick( +                                                    DialogInterface dialog, +                                                    int whichButton) { +                                                res.confirm(v.getText() +                                                        .toString()); +                                            } +                                        }) +                                .setNegativeButton(R.string.cancel, +                                        new DialogInterface.OnClickListener() { +                                            public void onClick( +                                                    DialogInterface dialog, +                                                    int whichButton) { +                                                res.cancel(); +                                            } +                                        }) +                                .setOnCancelListener( +                                        new DialogInterface.OnCancelListener() { +                                            public void onCancel( +                                                    DialogInterface dialog) { +                                                res.cancel(); +                                            } +                                        }) +                                .show();                      }                      // Tell the JsResult that it is ready for client                      // interaction. @@ -420,12 +494,32 @@ class CallbackProxy extends Handler {              case JS_UNLOAD:                  if (mWebChromeClient != null) { -                    JsResult res = (JsResult) msg.obj; +                    final JsResult res = (JsResult) msg.obj;                      String message = msg.getData().getString("message");                      String url = msg.getData().getString("url");                      if (!mWebChromeClient.onJsBeforeUnload(mWebView, url, -                                message, res)) { -                        res.handleDefault(); +                            message, res)) { +                        final String m = mContext.getString( +                                R.string.js_dialog_before_unload, message); +                        new AlertDialog.Builder(mContext) +                                .setMessage(m) +                                .setPositiveButton(R.string.ok, +                                        new DialogInterface.OnClickListener() { +                                            public void onClick( +                                                    DialogInterface dialog, +                                                    int which) { +                                                res.confirm(); +                                            } +                                        }) +                                .setNegativeButton(R.string.cancel, +                                        new DialogInterface.OnClickListener() { +                                            public void onClick( +                                                    DialogInterface dialog, +                                                    int which) { +                                                res.cancel(); +                                            } +                                        }) +                                .show();                      }                      res.setReady();                  } @@ -468,6 +562,24 @@ class CallbackProxy extends Handler {          sendMessage(obtainMessage(SWITCH_OUT_HISTORY));      } +    private String getJsDialogTitle(String url) { +        String title = url; +        if (URLUtil.isDataUrl(url)) { +            // For data: urls, we just display 'JavaScript' similar to Safari. +            title = mContext.getString(R.string.js_dialog_title_default); +        } else { +            try { +                URL aUrl = new URL(url); +                // For example: "The page at 'http://www.mit.edu' says:" +                title = mContext.getString(R.string.js_dialog_title, +                        aUrl.getProtocol() + "://" + aUrl.getHost()); +            } catch (MalformedURLException ex) { +                // do nothing. just use the url as the title +            } +        } +        return title; +    } +      //--------------------------------------------------------------------------      // WebViewClient functions.      // NOTE: shouldOverrideKeyEvent is never called from the WebCore thread so diff --git a/core/java/android/webkit/TextDialog.java b/core/java/android/webkit/TextDialog.java index 30b519a..b7b40b1 100644 --- a/core/java/android/webkit/TextDialog.java +++ b/core/java/android/webkit/TextDialog.java @@ -38,13 +38,20 @@ import android.text.method.MovementMethod;  import android.text.method.PasswordTransformationMethod;  import android.text.method.TextKeyListener;  import android.view.inputmethod.EditorInfo; +import android.view.inputmethod.InputMethodManager;  import android.view.KeyCharacterMap;  import android.view.KeyEvent;  import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup;  import android.view.View.MeasureSpec;  import android.view.ViewConfiguration;  import android.widget.AbsoluteLayout.LayoutParams; +import android.widget.ArrayAdapter;  import android.widget.AutoCompleteTextView; +import android.widget.TextView; + +import java.util.ArrayList;  /**   * TextDialog is a specialized version of EditText used by WebView @@ -281,7 +288,7 @@ import android.widget.AutoCompleteTextView;          }          return false;      } -     +      /**       *  Determine whether this TextDialog currently represents the node       *  represented by ptr. @@ -406,6 +413,9 @@ import android.widget.AutoCompleteTextView;       * focus to the host.       */      /* package */ void remove() { +        // hide the soft keyboard when the edit text is out of focus +        InputMethodManager.getInstance(mContext).hideSoftInputFromWindow( +                getWindowToken(), 0);          mHandler.removeMessages(LONGPRESS);          mWebView.removeView(this);          mWebView.requestFocus(); @@ -427,6 +437,43 @@ import android.widget.AutoCompleteTextView;          mWebView.passToJavaScript(getText().toString(), event);      } +    public void setAdapterCustom(AutoCompleteAdapter adapter) { +        adapter.setTextView(this); +        super.setAdapter(adapter); +    } + +    /** +     *  This is a special version of ArrayAdapter which changes its text size +     *  to match the text size of its host TextView. +     */ +    public static class AutoCompleteAdapter extends ArrayAdapter<String> { +        private TextView mTextView; + +        public AutoCompleteAdapter(Context context, ArrayList<String> entries) { +            super(context, com.android.internal.R.layout +                    .search_dropdown_item_1line, entries); +        } + +        /** +         * {@inheritDoc} +         */ +        public View getView(int position, View convertView, ViewGroup parent) { +            TextView tv = +                    (TextView) super.getView(position, convertView, parent); +            if (tv != null && mTextView != null) { +                tv.setTextSize(mTextView.getTextSize()); +            } +            return tv; +        } + +        /** +         * Set the TextView so we can match its text size. +         */ +        private void setTextView(TextView tv) { +            mTextView = tv; +        } +    } +      /**       * Determine whether to use the system-wide password disguising method,       * or to use none. diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java index f00238d..9cfc622 100644 --- a/core/java/android/webkit/WebView.java +++ b/core/java/android/webkit/WebView.java @@ -57,6 +57,7 @@ import android.view.ViewGroup;  import android.view.ViewParent;  import android.view.ViewTreeObserver;  import android.view.inputmethod.InputMethodManager; +import android.webkit.TextDialog.AutoCompleteAdapter;  import android.webkit.WebViewCore.EventHub;  import android.widget.AbsoluteLayout;  import android.widget.AdapterView; @@ -2819,10 +2820,8 @@ public class WebView extends AbsoluteLayout          public void run() {              ArrayList<String> pastEntries = mDatabase.getFormData(mUrl, mName);              if (pastEntries.size() > 0) { -                ArrayAdapter<String> adapter = new ArrayAdapter<String>( -                        mContext, com.android.internal.R.layout -                        .search_dropdown_item_1line, -                        pastEntries); +                AutoCompleteAdapter adapter = new +                        AutoCompleteAdapter(mContext, pastEntries);                  ((HashMap) mUpdateMessage.obj).put("adapter", adapter);                  mUpdateMessage.sendToTarget();              } @@ -4458,9 +4457,9 @@ public class WebView extends AbsoluteLayout                  case UPDATE_TEXT_ENTRY_ADAPTER:                      HashMap data = (HashMap) msg.obj;                      if (mTextEntry.isSameTextField(msg.arg1)) { -                        ArrayAdapter<String> adapter = -                                (ArrayAdapter<String>) data.get("adapter"); -                        mTextEntry.setAdapter(adapter); +                        AutoCompleteAdapter adapter = +                                (AutoCompleteAdapter) data.get("adapter"); +                        mTextEntry.setAdapterCustom(adapter);                      }                      break;                  case UPDATE_CLIPBOARD: | 
