1 /* 2 * Copyright (C) 2010 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package com.android.browser; 17 18 import android.app.AlertDialog; 19 import android.content.Context; 20 import android.content.DialogInterface; 21 import android.view.KeyEvent; 22 import android.view.LayoutInflater; 23 import android.view.View; 24 import android.view.WindowManager; 25 import android.view.inputmethod.EditorInfo; 26 import android.widget.TextView; 27 import android.widget.TextView.OnEditorActionListener; 28 29 /** 30 * HTTP authentication dialog. 31 */ 32 public class HttpAuthenticationDialog { 33 34 private final Context mContext; 35 36 private final String mHost; 37 private final String mRealm; 38 39 private AlertDialog mDialog; 40 private TextView mUsernameView; 41 private TextView mPasswordView; 42 43 private OkListener mOkListener; 44 private CancelListener mCancelListener; 45 46 /** 47 * Creates an HTTP authentication dialog. 48 */ 49 public HttpAuthenticationDialog(Context context, String host, String realm) { 50 mContext = context; 51 mHost = host; 52 mRealm = realm; 53 createDialog(); 54 } 55 56 private String getUsername() { 57 return mUsernameView.getText().toString(); 58 } 59 60 private String getPassword() { 61 return mPasswordView.getText().toString(); 62 } 63 64 /** 65 * Sets the listener that will be notified when the user submits the credentials. 66 */ 67 public void setOkListener(OkListener okListener) { 68 mOkListener = okListener; 69 } 70 71 /** 72 * Sets the listener that will be notified when the user cancels the authentication 73 * dialog. 74 */ 75 public void setCancelListener(CancelListener cancelListener) { 76 mCancelListener = cancelListener; 77 } 78 79 /** 80 * Shows the dialog. 81 */ 82 public void show() { 83 mDialog.show(); 84 mUsernameView.requestFocus(); 85 } 86 87 /** 88 * Hides, recreates, and shows the dialog. This can be used to handle configuration changes. 89 */ 90 public void reshow() { 91 String username = getUsername(); 92 String password = getPassword(); 93 int focusId = mDialog.getCurrentFocus().getId(); 94 mDialog.dismiss(); 95 createDialog(); 96 mDialog.show(); 97 if (username != null) { 98 mUsernameView.setText(username); 99 } 100 if (password != null) { 101 mPasswordView.setText(password); 102 } 103 if (focusId != 0) { 104 mDialog.findViewById(focusId).requestFocus(); 105 } else { 106 mUsernameView.requestFocus(); 107 } 108 } 109 110 private void createDialog() { 111 LayoutInflater factory = LayoutInflater.from(mContext); 112 View v = factory.inflate(R.layout.http_authentication, null); 113 mUsernameView = (TextView) v.findViewById(R.id.username_edit); 114 mPasswordView = (TextView) v.findViewById(R.id.password_edit); 115 mPasswordView.setOnEditorActionListener(new OnEditorActionListener() { 116 @Override 117 public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 118 if (actionId == EditorInfo.IME_ACTION_DONE) { 119 mDialog.getButton(AlertDialog.BUTTON_POSITIVE).performClick(); 120 return true; 121 } 122 return false; 123 } 124 }); 125 126 String title = mContext.getText(R.string.sign_in_to).toString().replace( 127 "%s1", mHost).replace("%s2", mRealm); 128 129 mDialog = new AlertDialog.Builder(mContext) 130 .setTitle(title) 131 .setIconAttribute(android.R.attr.alertDialogIcon) 132 .setView(v) 133 .setPositiveButton(R.string.action, new DialogInterface.OnClickListener() { 134 public void onClick(DialogInterface dialog, int whichButton) { 135 if (mOkListener != null) { 136 mOkListener.onOk(mHost, mRealm, getUsername(), getPassword()); 137 } 138 }}) 139 .setNegativeButton(R.string.cancel,new DialogInterface.OnClickListener() { 140 public void onClick(DialogInterface dialog, int whichButton) { 141 if (mCancelListener != null) mCancelListener.onCancel(); 142 }}) 143 .setOnCancelListener(new DialogInterface.OnCancelListener() { 144 public void onCancel(DialogInterface dialog) { 145 if (mCancelListener != null) mCancelListener.onCancel(); 146 }}) 147 .create(); 148 149 // Make the IME appear when the dialog is displayed if applicable. 150 mDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); 151 } 152 153 /** 154 * Interface for listeners that are notified when the user submits the credentials. 155 */ 156 public interface OkListener { 157 void onOk(String host, String realm, String username, String password); 158 } 159 160 /** 161 * Interface for listeners that are notified when the user cancels the dialog. 162 */ 163 public interface CancelListener { 164 void onCancel(); 165 } 166 } 167