diff options
Diffstat (limited to 'src/com/android/swe/browser/HttpAuthenticationDialog.java')
-rw-r--r-- | src/com/android/swe/browser/HttpAuthenticationDialog.java | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/src/com/android/swe/browser/HttpAuthenticationDialog.java b/src/com/android/swe/browser/HttpAuthenticationDialog.java new file mode 100644 index 00000000..0c16632f --- /dev/null +++ b/src/com/android/swe/browser/HttpAuthenticationDialog.java @@ -0,0 +1,166 @@ +/* + * 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 android.app.AlertDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.view.KeyEvent; +import android.view.LayoutInflater; +import android.view.View; +import android.view.WindowManager; +import android.view.inputmethod.EditorInfo; +import android.widget.TextView; +import android.widget.TextView.OnEditorActionListener; + +/** + * HTTP authentication dialog. + */ +public class HttpAuthenticationDialog { + + private final Context mContext; + + private final String mHost; + private final String mRealm; + + private AlertDialog mDialog; + private TextView mUsernameView; + private TextView mPasswordView; + + private OkListener mOkListener; + private CancelListener mCancelListener; + + /** + * Creates an HTTP authentication dialog. + */ + public HttpAuthenticationDialog(Context context, String host, String realm) { + mContext = context; + mHost = host; + mRealm = realm; + createDialog(); + } + + private String getUsername() { + return mUsernameView.getText().toString(); + } + + private String getPassword() { + return mPasswordView.getText().toString(); + } + + /** + * Sets the listener that will be notified when the user submits the credentials. + */ + public void setOkListener(OkListener okListener) { + mOkListener = okListener; + } + + /** + * Sets the listener that will be notified when the user cancels the authentication + * dialog. + */ + public void setCancelListener(CancelListener cancelListener) { + mCancelListener = cancelListener; + } + + /** + * Shows the dialog. + */ + public void show() { + mDialog.show(); + mUsernameView.requestFocus(); + } + + /** + * Hides, recreates, and shows the dialog. This can be used to handle configuration changes. + */ + public void reshow() { + String username = getUsername(); + String password = getPassword(); + int focusId = mDialog.getCurrentFocus().getId(); + mDialog.dismiss(); + createDialog(); + mDialog.show(); + if (username != null) { + mUsernameView.setText(username); + } + if (password != null) { + mPasswordView.setText(password); + } + if (focusId != 0) { + mDialog.findViewById(focusId).requestFocus(); + } else { + mUsernameView.requestFocus(); + } + } + + private void createDialog() { + LayoutInflater factory = LayoutInflater.from(mContext); + View v = factory.inflate(R.layout.http_authentication, null); + mUsernameView = (TextView) v.findViewById(R.id.username_edit); + mPasswordView = (TextView) v.findViewById(R.id.password_edit); + mPasswordView.setOnEditorActionListener(new OnEditorActionListener() { + @Override + public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { + if (actionId == EditorInfo.IME_ACTION_DONE) { + mDialog.getButton(AlertDialog.BUTTON_POSITIVE).performClick(); + return true; + } + return false; + } + }); + + String title = mContext.getText(R.string.sign_in_to).toString().replace( + "%s1", mHost).replace("%s2", mRealm); + + mDialog = new AlertDialog.Builder(mContext) + .setTitle(title) + .setIconAttribute(android.R.attr.alertDialogIcon) + .setView(v) + .setPositiveButton(R.string.action, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int whichButton) { + if (mOkListener != null) { + mOkListener.onOk(mHost, mRealm, getUsername(), getPassword()); + } + }}) + .setNegativeButton(R.string.cancel,new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int whichButton) { + if (mCancelListener != null) mCancelListener.onCancel(); + }}) + .setOnCancelListener(new DialogInterface.OnCancelListener() { + public void onCancel(DialogInterface dialog) { + if (mCancelListener != null) mCancelListener.onCancel(); + }}) + .create(); + + // Make the IME appear when the dialog is displayed if applicable. + mDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); + } + + /** + * Interface for listeners that are notified when the user submits the credentials. + */ + public interface OkListener { + void onOk(String host, String realm, String username, String password); + } + + /** + * Interface for listeners that are notified when the user cancels the dialog. + */ + public interface CancelListener { + void onCancel(); + } +} |