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.net.Uri;
21import android.util.AttributeSet;
22import android.view.Gravity;
23import android.view.View;
24import android.webkit.GeolocationPermissions;
25import android.widget.Button;
26import android.widget.CheckBox;
27import android.widget.RelativeLayout;
28import android.widget.TextView;
29import android.widget.Toast;
30
31public 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
39    public GeolocationPermissionsPrompt(Context context) {
40        this(context, null);
41    }
42
43    public GeolocationPermissionsPrompt(Context context, AttributeSet attrs) {
44        super(context, attrs);
45    }
46
47    @Override
48    protected void onFinishInflate() {
49        super.onFinishInflate();
50        init();
51    }
52
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     */
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     */
88    public void hide() {
89        setVisibility(View.GONE);
90    }
91
92    /**
93     * Handles a click on one the buttons by invoking the callback.
94     */
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     */
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