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