diff options
Diffstat (limited to 'samples/browseable/PermissionRequest/src/com.example.android.permissionrequest/PermissionRequestFragment.java')
-rw-r--r-- | samples/browseable/PermissionRequest/src/com.example.android.permissionrequest/PermissionRequestFragment.java | 67 |
1 files changed, 59 insertions, 8 deletions
diff --git a/samples/browseable/PermissionRequest/src/com.example.android.permissionrequest/PermissionRequestFragment.java b/samples/browseable/PermissionRequest/src/com.example.android.permissionrequest/PermissionRequestFragment.java index 44f1d6ec5..418c90d34 100644 --- a/samples/browseable/PermissionRequest/src/com.example.android.permissionrequest/PermissionRequestFragment.java +++ b/samples/browseable/PermissionRequest/src/com.example.android.permissionrequest/PermissionRequestFragment.java @@ -16,12 +16,15 @@ package com.example.android.permissionrequest; +import android.Manifest; import android.annotation.SuppressLint; +import android.content.pm.PackageManager; 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.support.v4.content.ContextCompat; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -37,12 +40,14 @@ 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 { + implements ConfirmationDialogFragment.Listener, MessageDialogFragment.Listener { private static final String TAG = PermissionRequestFragment.class.getSimpleName(); private static final String FRAGMENT_DIALOG = "dialog"; + private static final int REQUEST_CAMERA_PERMISSION = 1; + /** * 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. @@ -67,7 +72,7 @@ public class PermissionRequestFragment extends Fragment @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, - @Nullable Bundle savedInstanceState) { + @Nullable Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_permission_request, container, false); } @@ -85,7 +90,14 @@ public class PermissionRequestFragment extends Fragment final int port = 8080; mWebServer = new SimpleWebServer(port, getResources().getAssets()); mWebServer.start(); - mWebView.loadUrl("http://localhost:" + port + "/sample.html"); + // This is for runtime permission on Marshmallow and above; It is not directly related to + // PermissionRequest API. + if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.CAMERA) + != PackageManager.PERMISSION_GRANTED) { + requestCameraPermission(); + } else { + mWebView.loadUrl("http://localhost:" + port + "/sample.html"); + } } @Override @@ -94,6 +106,32 @@ public class PermissionRequestFragment extends Fragment super.onPause(); } + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, + @NonNull int[] grantResults) { + // This is for runtime permission on Marshmallow and above; It is not directly related to + // PermissionRequest API. + if (requestCode == REQUEST_CAMERA_PERMISSION) { + if (permissions.length != 1 || grantResults.length != 1 || + grantResults[0] != PackageManager.PERMISSION_GRANTED) { + Log.e(TAG, "Camera permission not granted."); + } else if (mWebView != null && mWebServer != null) { + mWebView.loadUrl("http://localhost:" + mWebServer.getPort() + "/sample.html"); + } + } else { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + } + } + + private void requestCameraPermission() { + if (shouldShowRequestPermissionRationale(Manifest.permission.CAMERA)) { + MessageDialogFragment.newInstance(R.string.permission_message) + .show(getChildFragmentManager(), FRAGMENT_DIALOG); + } else { + requestPermissions(new String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA_PERMISSION); + } + } + @SuppressLint("SetJavaScriptEnabled") private static void configureWebSettings(WebSettings settings) { settings.setJavaScriptEnabled(true); @@ -110,8 +148,16 @@ public class PermissionRequestFragment extends Fragment public void onPermissionRequest(PermissionRequest request) { Log.i(TAG, "onPermissionRequest"); mPermissionRequest = request; - ConfirmationDialogFragment.newInstance(request.getResources()) - .show(getChildFragmentManager(), FRAGMENT_DIALOG); + final String[] requestedResources = request.getResources(); + for (String r : requestedResources) { + if (r.equals(PermissionRequest.RESOURCE_VIDEO_CAPTURE)) { + // In this sample, we only accept video capture request. + ConfirmationDialogFragment + .newInstance(new String[]{PermissionRequest.RESOURCE_VIDEO_CAPTURE}) + .show(getChildFragmentManager(), FRAGMENT_DIALOG); + break; + } + } } // This method is called when the permission request is canceled by the web content. @@ -155,9 +201,14 @@ public class PermissionRequestFragment extends Fragment }; @Override - public void onConfirmation(boolean allowed) { + public void onOkClicked() { + requestPermissions(new String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA_PERMISSION); + } + + @Override + public void onConfirmation(boolean allowed, String[] resources) { if (allowed) { - mPermissionRequest.grant(mPermissionRequest.getResources()); + mPermissionRequest.grant(resources); Log.d(TAG, "Permission granted."); } else { mPermissionRequest.deny(); @@ -174,7 +225,7 @@ public class PermissionRequestFragment extends Fragment * For testing. */ public interface ConsoleMonitor { - public void onConsoleMessage(ConsoleMessage message); + void onConsoleMessage(ConsoleMessage message); } } |