1e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai/*
2e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai * Copyright (C) 2014 The Android Open Source Project
3e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai *
4e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai * Licensed under the Apache License, Version 2.0 (the "License");
5e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai * you may not use this file except in compliance with the License.
6e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai * You may obtain a copy of the License at
7e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai *
8e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai *      http://www.apache.org/licenses/LICENSE-2.0
9e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai *
10e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai * Unless required by applicable law or agreed to in writing, software
11e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai * distributed under the License is distributed on an "AS IS" BASIS,
12e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai * See the License for the specific language governing permissions and
14e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai * limitations under the License.
15e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai */
16e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai
17e1b6b3b2f9c0dbf201234162101023770835df9eTao Baipackage com.android.browser;
18e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai
19e1b6b3b2f9c0dbf201234162101023770835df9eTao Baiimport android.content.Context;
20e1b6b3b2f9c0dbf201234162101023770835df9eTao Baiimport android.net.Uri;
21e1b6b3b2f9c0dbf201234162101023770835df9eTao Baiimport android.util.AttributeSet;
22e1b6b3b2f9c0dbf201234162101023770835df9eTao Baiimport android.view.Gravity;
23e1b6b3b2f9c0dbf201234162101023770835df9eTao Baiimport android.view.View;
24e1b6b3b2f9c0dbf201234162101023770835df9eTao Baiimport android.webkit.GeolocationPermissions;
25e1b6b3b2f9c0dbf201234162101023770835df9eTao Baiimport android.webkit.PermissionRequest;
26e1b6b3b2f9c0dbf201234162101023770835df9eTao Baiimport android.widget.Button;
27e1b6b3b2f9c0dbf201234162101023770835df9eTao Baiimport android.widget.CheckBox;
28e1b6b3b2f9c0dbf201234162101023770835df9eTao Baiimport android.widget.RelativeLayout;
29e1b6b3b2f9c0dbf201234162101023770835df9eTao Baiimport android.widget.TextView;
30e1b6b3b2f9c0dbf201234162101023770835df9eTao Baiimport android.widget.Toast;
31e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai
32e1b6b3b2f9c0dbf201234162101023770835df9eTao Baiimport java.util.Enumeration;
33e1b6b3b2f9c0dbf201234162101023770835df9eTao Baiimport java.util.Vector;
34e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai
35e1b6b3b2f9c0dbf201234162101023770835df9eTao Baipublic class PermissionsPrompt extends RelativeLayout {
36e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai    private TextView mMessage;
37e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai    private Button mAllowButton;
38e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai    private Button mDenyButton;
39e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai    private CheckBox mRemember;
40e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai    private PermissionRequest mRequest;
41e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai
42e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai    public PermissionsPrompt(Context context) {
43e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai        this(context, null);
44e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai    }
45e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai
46e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai    public PermissionsPrompt(Context context, AttributeSet attrs) {
47e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai        super(context, attrs);
48e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai    }
49e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai
50e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai    @Override
51e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai    protected void onFinishInflate() {
52e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai        super.onFinishInflate();
53e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai        init();
54e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai    }
55e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai
56e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai    private void init() {
57e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai        mMessage = (TextView) findViewById(R.id.message);
58e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai        mAllowButton = (Button) findViewById(R.id.allow_button);
59e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai        mDenyButton = (Button) findViewById(R.id.deny_button);
60e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai        mRemember = (CheckBox) findViewById(R.id.remember);
61e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai
62e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai        mAllowButton.setOnClickListener(new View.OnClickListener() {
63e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai            @Override
64e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai            public void onClick(View v) {
65e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai                handleButtonClick(true);
66e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai            }
67e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai        });
68e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai        mDenyButton.setOnClickListener(new View.OnClickListener() {
69e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai            @Override
70e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai            public void onClick(View v) {
71e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai                handleButtonClick(false);
72e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai            }
73e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai        });
74e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai    }
75e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai
76e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai    public void show(PermissionRequest request) {
77e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai        mRequest = request;
78e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai        setMessage();
79e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai        mRemember.setChecked(true);
80e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai        setVisibility(View.VISIBLE);
81e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai    }
82e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai
83e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai    public void setMessage() {
849971e3f4bad925e87fc7c4bd82a7e6b097ce3981Tao Bai        String[] resources = mRequest.getResources();
85e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai        Vector<String> strings = new Vector<String>();
869971e3f4bad925e87fc7c4bd82a7e6b097ce3981Tao Bai        for (String resource : resources) {
879971e3f4bad925e87fc7c4bd82a7e6b097ce3981Tao Bai            if (resource.equals(PermissionRequest.RESOURCE_VIDEO_CAPTURE))
889971e3f4bad925e87fc7c4bd82a7e6b097ce3981Tao Bai                strings.add(getResources().getString(R.string.resource_video_capture));
899971e3f4bad925e87fc7c4bd82a7e6b097ce3981Tao Bai            else if (resource.equals(PermissionRequest.RESOURCE_AUDIO_CAPTURE))
909971e3f4bad925e87fc7c4bd82a7e6b097ce3981Tao Bai                strings.add(getResources().getString(R.string.resource_audio_capture));
919971e3f4bad925e87fc7c4bd82a7e6b097ce3981Tao Bai            else if (resource.equals(PermissionRequest.RESOURCE_PROTECTED_MEDIA_ID))
929971e3f4bad925e87fc7c4bd82a7e6b097ce3981Tao Bai                strings.add(getResources().getString(R.string.resource_protected_media_id));
939971e3f4bad925e87fc7c4bd82a7e6b097ce3981Tao Bai        }
94e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai        if (strings.isEmpty()) return;
95e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai
96e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai        Enumeration<String> e = strings.elements();
97e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai        StringBuilder sb = new StringBuilder(e.nextElement());
98e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai        if (e.hasMoreElements()) {
99e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai            sb.append(", ");
100e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai            sb.append(e.nextElement());
101e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai        }
102e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai
103e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai        mMessage.setText(String.format(
104e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai                getResources().getString(R.string.permissions_prompt_message),
105e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai                mRequest.getOrigin(), sb.toString()));
106e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai    }
107e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai
108e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai    /**
109e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai     * Hides the prompt.
110e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai     */
111e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai    public void hide() {
112e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai        setVisibility(View.GONE);
113e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai    }
114e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai
115e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai    /**
116e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai     * Handles a click on one the buttons by invoking the callback.
117e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai     */
118e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai    private void handleButtonClick(boolean allow) {
119e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai        hide();
120e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai        if (allow)
121e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai            mRequest.grant(mRequest.getResources());
122e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai        else
123e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai            mRequest.deny();
124e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai    }
125e1b6b3b2f9c0dbf201234162101023770835df9eTao Bai}
126