GeolocationPermissionsPrompt.java revision c9f6d7a165d90562d9d503bb0bbfa06e116aa67a
1/* 2 * Copyright (C) 2009 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 17package com.android.browser; 18 19import android.content.Context; 20import android.graphics.drawable.Drawable; 21import android.net.Uri; 22import android.util.AttributeSet; 23import android.view.Gravity; 24import android.view.LayoutInflater; 25import android.view.View; 26import android.webkit.WebView; 27import android.webkit.GeolocationPermissions; 28import android.widget.Button; 29import android.widget.CheckBox; 30import android.widget.LinearLayout; 31import android.widget.TextView; 32import android.widget.Toast; 33 34public class GeolocationPermissionsPrompt extends LinearLayout { 35 private LinearLayout mInner; 36 private TextView mMessage; 37 private Button mShareButton; 38 private Button mDontShareButton; 39 private CheckBox mRemember; 40 private GeolocationPermissions.Callback mCallback; 41 private String mOrigin; 42 43 public GeolocationPermissionsPrompt(Context context) { 44 this(context, null); 45 } 46 47 public GeolocationPermissionsPrompt(Context context, AttributeSet attrs) { 48 super(context, attrs); 49 LayoutInflater factory = LayoutInflater.from(context); 50 factory.inflate(R.layout.geolocation_permissions_prompt, this); 51 52 mInner = (LinearLayout) findViewById(R.id.inner); 53 mMessage = (TextView) findViewById(R.id.message); 54 mShareButton = (Button) findViewById(R.id.share_button); 55 mDontShareButton = (Button) findViewById(R.id.dont_share_button); 56 mRemember = (CheckBox) findViewById(R.id.remember); 57 setButtonClickListeners(); 58 } 59 60 /** 61 * Shows the prompt for the given origin. When the user clicks on one of 62 * the buttons, the supplied callback is be called. 63 */ 64 public void show(String origin, GeolocationPermissions.Callback callback) { 65 mOrigin = origin; 66 mCallback = callback; 67 Uri uri = Uri.parse(mOrigin); 68 setMessage("http".equals(uri.getScheme()) ? mOrigin.substring(7) : mOrigin); 69 // The checkbox should always be intially checked. 70 mRemember.setChecked(true); 71 showDialog(true); 72 } 73 74 /** 75 * Hides the prompt. 76 */ 77 public void hide() { 78 showDialog(false); 79 } 80 81 /** 82 * Sets the on click listeners for the buttons. 83 */ 84 private void setButtonClickListeners() { 85 final GeolocationPermissionsPrompt me = this; 86 mShareButton.setOnClickListener(new View.OnClickListener() { 87 public void onClick(View v) { 88 me.handleButtonClick(true); 89 } 90 }); 91 mDontShareButton.setOnClickListener(new View.OnClickListener() { 92 public void onClick(View v) { 93 me.handleButtonClick(false); 94 } 95 }); 96 } 97 98 /** 99 * Handles a click on one the buttons by invoking the callback. 100 */ 101 private void handleButtonClick(boolean allow) { 102 showDialog(false); 103 104 boolean remember = mRemember.isChecked(); 105 if (remember) { 106 Toast toast = Toast.makeText( 107 getContext(), 108 allow ? R.string.geolocation_permissions_prompt_toast_allowed : 109 R.string.geolocation_permissions_prompt_toast_disallowed, 110 Toast.LENGTH_LONG); 111 toast.setGravity(Gravity.BOTTOM, 0, 0); 112 toast.show(); 113 } 114 115 mCallback.invoke(mOrigin, allow, remember); 116 } 117 118 /** 119 * Sets the prompt's message. 120 */ 121 private void setMessage(CharSequence origin) { 122 mMessage.setText(String.format( 123 getResources().getString(R.string.geolocation_permissions_prompt_message), 124 origin)); 125 } 126 127 /** 128 * Shows or hides the prompt. 129 */ 130 private void showDialog(boolean shown) { 131 mInner.setVisibility(shown ? View.VISIBLE : View.GONE); 132 } 133} 134