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