aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYuichi Araki <yaraki@google.com>2017-01-12 06:52:04 +0000
committerandroid-build-merger <android-build-merger@google.com>2017-01-12 06:52:04 +0000
commitafdc194bdb2b29e5477847c50a9987e551449a23 (patch)
tree98f9e4d68a22c7915cca07e0be405faaf85e23e7
parent33e6c41e90acc0c1305a1cf8c0d8a52d99933ec0 (diff)
parent75c088894ac1483c215f88a578adaad6af3fe61c (diff)
downloadandroid-afdc194bdb2b29e5477847c50a9987e551449a23.tar.gz
PermissionRequest: Several updates am: b8f046bd2e
am: 75c088894a Change-Id: I5c9e79c65f34c1e3b06bc56a8f67aeccf0074d65
-rw-r--r--content/webview/PermissionRequest/Application/src/main/assets/sample.js12
-rw-r--r--content/webview/PermissionRequest/Application/src/main/java/com/example/android/permissionrequest/ConfirmationDialogFragment.java8
-rw-r--r--content/webview/PermissionRequest/Application/src/main/java/com/example/android/permissionrequest/MessageDialogFragment.java61
-rw-r--r--content/webview/PermissionRequest/Application/src/main/java/com/example/android/permissionrequest/PermissionRequestFragment.java49
-rw-r--r--content/webview/PermissionRequest/Application/src/main/java/com/example/android/permissionrequest/SimpleWebServer.java4
-rw-r--r--content/webview/PermissionRequest/Application/src/main/res/values/strings.xml1
6 files changed, 126 insertions, 9 deletions
diff --git a/content/webview/PermissionRequest/Application/src/main/assets/sample.js b/content/webview/PermissionRequest/Application/src/main/assets/sample.js
index e2806a0d..b9d2fdc7 100644
--- a/content/webview/PermissionRequest/Application/src/main/assets/sample.js
+++ b/content/webview/PermissionRequest/Application/src/main/assets/sample.js
@@ -20,7 +20,7 @@
navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia;
window.URL = window.URL || window.webkitURL;
- window.onload = function () {
+ document.addEventListener('DOMContentLoaded', function () {
var video = document.querySelector('#video'),
toggle = document.querySelector('#toggle'),
@@ -42,7 +42,13 @@
console.error('Error starting camera. Denied.');
});
} else {
- stream.stop();
+ if (stream.getTracks) {
+ stream.getTracks().forEach(function (track) {
+ track.stop();
+ });
+ } else if (stream.stop) {
+ stream.stop();
+ }
stream = null;
toggle.innerText = 'Start';
console.log('Stopped');
@@ -51,6 +57,6 @@
console.log('Page loaded');
- };
+ });
})();
diff --git a/content/webview/PermissionRequest/Application/src/main/java/com/example/android/permissionrequest/ConfirmationDialogFragment.java b/content/webview/PermissionRequest/Application/src/main/java/com/example/android/permissionrequest/ConfirmationDialogFragment.java
index 7dae56ef..2c8a5ab9 100644
--- a/content/webview/PermissionRequest/Application/src/main/java/com/example/android/permissionrequest/ConfirmationDialogFragment.java
+++ b/content/webview/PermissionRequest/Application/src/main/java/com/example/android/permissionrequest/ConfirmationDialogFragment.java
@@ -19,6 +19,7 @@ import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
+import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment;
import android.text.TextUtils;
@@ -32,7 +33,7 @@ public class ConfirmationDialogFragment extends DialogFragment {
/**
* Creates a new instance of ConfirmationDialogFragment.
*
- * @param resources The list of resources requested by PermissionRequeste.
+ * @param resources The list of resources requested by PermissionRequest.
* @return A new instance.
*/
public static ConfirmationDialogFragment newInstance(String[] resources) {
@@ -43,6 +44,7 @@ public class ConfirmationDialogFragment extends DialogFragment {
return fragment;
}
+ @NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
String[] resources = getArguments().getStringArray(ARG_RESOURCES);
@@ -69,11 +71,11 @@ public class ConfirmationDialogFragment extends DialogFragment {
public interface Listener {
/**
- * Called when the PermissoinRequest is allowed or denied by the user.
+ * Called when the PermissionRequest is allowed or denied by the user.
*
* @param allowed True if the user allowed the request.
*/
- public void onConfirmation(boolean allowed);
+ void onConfirmation(boolean allowed);
}
}
diff --git a/content/webview/PermissionRequest/Application/src/main/java/com/example/android/permissionrequest/MessageDialogFragment.java b/content/webview/PermissionRequest/Application/src/main/java/com/example/android/permissionrequest/MessageDialogFragment.java
new file mode 100644
index 00000000..7db96109
--- /dev/null
+++ b/content/webview/PermissionRequest/Application/src/main/java/com/example/android/permissionrequest/MessageDialogFragment.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2016 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.app.AlertDialog;
+import android.app.Dialog;
+import android.content.DialogInterface;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.annotation.StringRes;
+import android.support.v4.app.DialogFragment;
+
+/**
+ * Shows a dialog with a brief message.
+ */
+public class MessageDialogFragment extends DialogFragment {
+
+ private static final String ARG_MESSAGE_RES_ID = "message_res_id";
+
+ public static MessageDialogFragment newInstance(@StringRes int message) {
+ MessageDialogFragment fragment = new MessageDialogFragment();
+ Bundle args = new Bundle();
+ args.putInt(ARG_MESSAGE_RES_ID, message);
+ fragment.setArguments(args);
+ return fragment;
+ }
+
+ @NonNull
+ @Override
+ public Dialog onCreateDialog(Bundle savedInstanceState) {
+ return new AlertDialog.Builder(getContext())
+ .setMessage(getArguments().getInt(ARG_MESSAGE_RES_ID))
+ .setCancelable(false)
+ .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ ((Listener) getParentFragment()).onOkClicked();
+ }
+ })
+ .create();
+ }
+
+ public interface Listener {
+ void onOkClicked();
+ }
+
+}
diff --git a/content/webview/PermissionRequest/Application/src/main/java/com/example/android/permissionrequest/PermissionRequestFragment.java b/content/webview/PermissionRequest/Application/src/main/java/com/example/android/permissionrequest/PermissionRequestFragment.java
index 44f1d6ec..19fdc4ff 100644
--- a/content/webview/PermissionRequest/Application/src/main/java/com/example/android/permissionrequest/PermissionRequestFragment.java
+++ b/content/webview/PermissionRequest/Application/src/main/java/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.
@@ -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);
@@ -155,6 +193,11 @@ public class PermissionRequestFragment extends Fragment
};
@Override
+ public void onOkClicked() {
+ requestPermissions(new String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA_PERMISSION);
+ }
+
+ @Override
public void onConfirmation(boolean allowed) {
if (allowed) {
mPermissionRequest.grant(mPermissionRequest.getResources());
@@ -174,7 +217,7 @@ public class PermissionRequestFragment extends Fragment
* For testing.
*/
public interface ConsoleMonitor {
- public void onConsoleMessage(ConsoleMessage message);
+ void onConsoleMessage(ConsoleMessage message);
}
}
diff --git a/content/webview/PermissionRequest/Application/src/main/java/com/example/android/permissionrequest/SimpleWebServer.java b/content/webview/PermissionRequest/Application/src/main/java/com/example/android/permissionrequest/SimpleWebServer.java
index 36b7c469..b02275af 100644
--- a/content/webview/PermissionRequest/Application/src/main/java/com/example/android/permissionrequest/SimpleWebServer.java
+++ b/content/webview/PermissionRequest/Application/src/main/java/com/example/android/permissionrequest/SimpleWebServer.java
@@ -90,6 +90,10 @@ public class SimpleWebServer implements Runnable {
}
}
+ public int getPort() {
+ return mPort;
+ }
+
@Override
public void run() {
try {
diff --git a/content/webview/PermissionRequest/Application/src/main/res/values/strings.xml b/content/webview/PermissionRequest/Application/src/main/res/values/strings.xml
index c3e5574d..24887660 100644
--- a/content/webview/PermissionRequest/Application/src/main/res/values/strings.xml
+++ b/content/webview/PermissionRequest/Application/src/main/res/values/strings.xml
@@ -15,6 +15,7 @@
limitations under the License.
-->
<resources>
+ <string name="permission_message">This sample app uses camera.</string>
<string name="confirmation">This web page wants to use following resources:\n\n%s</string>
<string name="allow">Allow</string>
<string name="deny">Deny</string>