/* * Copyright (C) 2014 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.example.android.permissionrequest; import android.annotation.SuppressLint; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.DialogFragment; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.webkit.ConsoleMessage; import android.webkit.PermissionRequest; import android.webkit.WebChromeClient; import android.webkit.WebSettings; import android.webkit.WebView; import com.example.android.common.logger.Log; /** * This fragment shows a {@link WebView} and loads a web app from the {@link SimpleWebServer}. */ public class PermissionRequestFragment extends Fragment implements ConfirmationDialogFragment.Listener { private static final String TAG = PermissionRequestFragment.class.getSimpleName(); private static final String FRAGMENT_DIALOG = "dialog"; /** * We use this web server to serve HTML files in the assets folder. This is because we cannot * use the JavaScript method "getUserMedia" from "file:///android_assets/..." URLs. */ private SimpleWebServer mWebServer; /** * A reference to the {@link WebView}. */ private WebView mWebView; /** * This field stores the {@link PermissionRequest} from the web application until it is allowed * or denied by user. */ private PermissionRequest mPermissionRequest; /** * For testing. */ private ConsoleMonitor mConsoleMonitor; @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_permission_request, container, false); } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { mWebView = (WebView) view.findViewById(R.id.web_view); // Here, we use #mWebChromeClient with implementation for handling PermissionRequests. mWebView.setWebChromeClient(mWebChromeClient); configureWebSettings(mWebView.getSettings()); } @Override public void onResume() { super.onResume(); final int port = 8080; mWebServer = new SimpleWebServer(port, getResources().getAssets()); mWebServer.start(); mWebView.loadUrl("http://localhost:" + port + "/sample.html"); } @Override public void onPause() { mWebServer.stop(); super.onPause(); } @SuppressLint("SetJavaScriptEnabled") private static void configureWebSettings(WebSettings settings) { settings.setJavaScriptEnabled(true); } /** * This {@link WebChromeClient} has implementation for handling {@link PermissionRequest}. */ private WebChromeClient mWebChromeClient = new WebChromeClient() { // This method is called when the web content is requesting permission to access some // resources. @Override public void onPermissionRequest(PermissionRequest request) { Log.i(TAG, "onPermissionRequest"); mPermissionRequest = request; ConfirmationDialogFragment.newInstance(request.getResources()) .show(getChildFragmentManager(), FRAGMENT_DIALOG); } // This method is called when the permission request is canceled by the web content. @Override public void onPermissionRequestCanceled(PermissionRequest request) { Log.i(TAG, "onPermissionRequestCanceled"); // We dismiss the prompt UI here as the request is no longer valid. mPermissionRequest = null; DialogFragment fragment = (DialogFragment) getChildFragmentManager() .findFragmentByTag(FRAGMENT_DIALOG); if (null != fragment) { fragment.dismiss(); } } @Override public boolean onConsoleMessage(@NonNull ConsoleMessage message) { switch (message.messageLevel()) { case TIP: Log.v(TAG, message.message()); break; case LOG: Log.i(TAG, message.message()); break; case WARNING: Log.w(TAG, message.message()); break; case ERROR: Log.e(TAG, message.message()); break; case DEBUG: Log.d(TAG, message.message()); break; } if (null != mConsoleMonitor) { mConsoleMonitor.onConsoleMessage(message); } return true; } }; @Override public void onConfirmation(boolean allowed) { if (allowed) { mPermissionRequest.grant(mPermissionRequest.getResources()); Log.d(TAG, "Permission granted."); } else { mPermissionRequest.deny(); Log.d(TAG, "Permission request denied."); } mPermissionRequest = null; } public void setConsoleMonitor(ConsoleMonitor monitor) { mConsoleMonitor = monitor; } /** * For testing. */ public interface ConsoleMonitor { public void onConsoleMessage(ConsoleMessage message); } }