Commit 54611887 authored by Jian Li's avatar Jian Li Committed by Commit Bot

Move ActivityAndroidPermissionDelegate out of ActivityWindowAndroid

This is in preparation to make it work for other types of activities.
No logic change is introduced. A couple temporary getters are added
to ActivityWindowAndroid in order to make everything compile.

Bug: none
Change-Id: I6bf5514a1fe84d9ae2f257e709e6b138aa22988d
Reviewed-on: https://chromium-review.googlesource.com/1002859
Commit-Queue: Jian Li <jianli@chromium.org>
Reviewed-by: default avatarTed Choc <tedchoc@chromium.org>
Cr-Commit-Position: refs/heads/master@{#549358}
parent d12fd0fd
......@@ -28,6 +28,7 @@ import org.chromium.chrome.R;
import org.chromium.chrome.browser.omnibox.OmniboxUrlEmphasizer;
import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.components.location.LocationUtils;
import org.chromium.ui.base.PermissionCallback;
import org.chromium.ui.base.WindowAndroid;
import org.chromium.ui.text.NoUnderlineClickableSpan;
import org.chromium.ui.text.SpanApplier;
......@@ -41,7 +42,7 @@ import org.chromium.ui.text.SpanApplier.SpanInfo;
* The dialog is shown by create() or show(), and always runs finishDialog() as it's closing.
*/
public class BluetoothChooserDialog
implements ItemChooserDialog.ItemSelectedCallback, WindowAndroid.PermissionCallback {
implements ItemChooserDialog.ItemSelectedCallback, PermissionCallback {
private static final String TAG = "Bluetooth";
// These constants match BluetoothChooserAndroid::ShowDiscoveryState, and are used in
......
......@@ -12,6 +12,7 @@ import org.chromium.chrome.browser.infobar.SimpleConfirmInfoBarBuilder;
import org.chromium.chrome.browser.metrics.WebApkUma;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.webapps.WebApkActivity;
import org.chromium.ui.base.ActivityAndroidPermissionDelegate;
import org.chromium.ui.base.ActivityWindowAndroid;
/**
......@@ -38,12 +39,18 @@ public class ChromeWindow extends ActivityWindowAndroid {
}
@Override
protected void logUMAOnRequestPermissionDenied(String permission) {
Activity activity = getActivity().get();
if (activity instanceof WebApkActivity
&& ((ChromeActivity) activity).didFinishNativeInitialization()) {
WebApkUma.recordAndroidRuntimePermissionDeniedInWebApk(new String[] {permission});
}
protected ActivityAndroidPermissionDelegate createAndroidPermissionDelegate() {
return new ActivityAndroidPermissionDelegate(getActivity()) {
@Override
protected void logUMAOnRequestPermissionDenied(String permission) {
Activity activity = getActivity().get();
if (activity instanceof WebApkActivity
&& ((ChromeActivity) activity).didFinishNativeInitialization()) {
WebApkUma.recordAndroidRuntimePermissionDeniedInWebApk(
new String[] {permission});
}
}
};
}
/**
......
......@@ -22,8 +22,8 @@ import org.chromium.base.annotations.CalledByNative;
import org.chromium.chrome.browser.UrlConstants;
import org.chromium.chrome.browser.tab.EmptyTabObserver;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.ui.base.PermissionCallback;
import org.chromium.ui.base.WindowAndroid;
import org.chromium.ui.base.WindowAndroid.PermissionCallback;
import java.io.File;
import java.util.Arrays;
......
......@@ -20,8 +20,8 @@ import org.chromium.chrome.browser.ChromeActivity;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tabmodel.TabModelSelector;
import org.chromium.content_public.browser.WebContents;
import org.chromium.ui.base.PermissionCallback;
import org.chromium.ui.base.WindowAndroid;
import org.chromium.ui.base.WindowAndroid.PermissionCallback;
/**
* Java counterpart of android DownloadController.
......
......@@ -55,8 +55,8 @@ import org.chromium.content_public.browser.NavigationController;
import org.chromium.content_public.browser.NavigationEntry;
import org.chromium.content_public.common.Referrer;
import org.chromium.ui.base.PageTransition;
import org.chromium.ui.base.PermissionCallback;
import org.chromium.ui.base.WindowAndroid;
import org.chromium.ui.base.WindowAndroid.PermissionCallback;
import org.chromium.webapk.lib.client.WebApkValidator;
import java.util.ArrayList;
......
......@@ -16,12 +16,13 @@ import org.chromium.base.annotations.CalledByNative;
import org.chromium.chrome.browser.metrics.WebApkUma;
import org.chromium.chrome.browser.webapps.WebApkActivity;
import org.chromium.content_public.browser.WebContents;
import org.chromium.ui.base.PermissionCallback;
import org.chromium.ui.base.WindowAndroid;
/**
* Handles requesting the android runtime permissions for the permission update infobar.
*/
class PermissionUpdateInfoBarDelegate implements WindowAndroid.PermissionCallback {
class PermissionUpdateInfoBarDelegate implements PermissionCallback {
private final WebContents mWebContents;
private final String[] mAndroidPermisisons;
private long mNativePtr;
......
......@@ -25,6 +25,7 @@ import org.chromium.chrome.browser.util.FeatureUtilities;
import org.chromium.content_public.browser.RenderFrameHost;
import org.chromium.content_public.browser.WebContents;
import org.chromium.content_public.browser.WebContentsObserver;
import org.chromium.ui.base.PermissionCallback;
import org.chromium.ui.base.WindowAndroid;
/**
......@@ -208,7 +209,7 @@ public class LocationBarVoiceRecognitionHandler {
if (!windowAndroid.hasPermission(Manifest.permission.RECORD_AUDIO)) {
if (windowAndroid.canRequestPermission(Manifest.permission.RECORD_AUDIO)) {
WindowAndroid.PermissionCallback callback = new WindowAndroid.PermissionCallback() {
PermissionCallback callback = new PermissionCallback() {
@Override
public void onRequestPermissionsResult(
String[] permissions, int[] grantResults) {
......
......@@ -80,8 +80,8 @@ import org.chromium.components.security_state.ConnectionSecurityLevel;
import org.chromium.content_public.browser.WebContents;
import org.chromium.content_public.browser.WebContentsObserver;
import org.chromium.ui.base.DeviceFormFactor;
import org.chromium.ui.base.PermissionCallback;
import org.chromium.ui.base.WindowAndroid;
import org.chromium.ui.base.WindowAndroid.PermissionCallback;
import org.chromium.ui.interpolators.BakedBezierInterpolator;
import org.chromium.ui.widget.Toast;
......
......@@ -18,8 +18,8 @@ import org.chromium.chrome.browser.metrics.WebApkUma;
import org.chromium.chrome.browser.preferences.PrefServiceBridge;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.webapps.WebApkActivity;
import org.chromium.ui.base.PermissionCallback;
import org.chromium.ui.base.WindowAndroid;
import org.chromium.ui.base.WindowAndroid.PermissionCallback;
import java.util.ArrayList;
import java.util.Collections;
......
......@@ -55,8 +55,8 @@ import org.chromium.content_public.browser.ContentViewCore;
import org.chromium.content_public.browser.ImeAdapter;
import org.chromium.content_public.browser.LoadUrlParams;
import org.chromium.content_public.common.BrowserControlsState;
import org.chromium.ui.base.PermissionCallback;
import org.chromium.ui.base.WindowAndroid;
import org.chromium.ui.base.WindowAndroid.PermissionCallback;
import org.chromium.ui.display.DisplayAndroid;
import org.chromium.ui.display.VirtualDisplayAndroid;
......
......@@ -16,6 +16,7 @@ import org.chromium.base.ApiCompatibilityUtils;
import org.chromium.base.ApplicationStatus;
import org.chromium.base.Callback;
import org.chromium.ui.base.AndroidPermissionDelegate;
import org.chromium.ui.base.PermissionCallback;
import org.chromium.ui.base.WindowAndroid;
import org.chromium.ui.display.DisplayAndroid;
......@@ -101,5 +102,9 @@ public class VrWindowAndroid extends WindowAndroid
Arrays.fill(grantResults, PackageManager.PERMISSION_DENIED);
callback.onRequestPermissionsResult(permissions, grantResults);
}
@Override
public void onRequestPermissionsResult(
int requestCode, String[] permissions, int[] grantResults) {}
}
}
......@@ -34,8 +34,8 @@ import org.chromium.content.browser.test.util.CriteriaHelper;
import org.chromium.content.browser.test.util.TouchCommon;
import org.chromium.ui.base.ActivityWindowAndroid;
import org.chromium.ui.base.AndroidPermissionDelegate;
import org.chromium.ui.base.PermissionCallback;
import org.chromium.ui.base.WindowAndroid;
import org.chromium.ui.base.WindowAndroid.PermissionCallback;
import org.chromium.ui.widget.TextViewWithClickableSpans;
/**
......@@ -446,6 +446,10 @@ public class BluetoothChooserDialogTest {
mCallback = callback;
}
}
@Override
public void onRequestPermissionsResult(
int requestCode, String[] permissions, int[] grantResults) {}
}
private static class FakeLocationUtils extends LocationUtils {
......
......@@ -30,7 +30,7 @@ import org.chromium.content.browser.test.util.CriteriaHelper;
import org.chromium.content_public.browser.WebContents;
import org.chromium.net.test.EmbeddedTestServer;
import org.chromium.ui.base.AndroidPermissionDelegate;
import org.chromium.ui.base.WindowAndroid.PermissionCallback;
import org.chromium.ui.base.PermissionCallback;
import java.util.ArrayList;
import java.util.Arrays;
......@@ -194,6 +194,10 @@ public class PermissionUpdateInfobarTest {
@Override
public void requestPermissions(String[] permissions, PermissionCallback callback) {
}
@Override
public void onRequestPermissionsResult(
int requestCode, String[] permissions, int[] grantResults) {}
}
}
......@@ -35,9 +35,9 @@ import org.chromium.chrome.test.util.OmniboxTestUtils.SuggestionsResult;
import org.chromium.chrome.test.util.OmniboxTestUtils.TestAutocompleteController;
import org.chromium.ui.base.ActivityWindowAndroid;
import org.chromium.ui.base.AndroidPermissionDelegate;
import org.chromium.ui.base.PermissionCallback;
import org.chromium.ui.base.WindowAndroid;
import org.chromium.ui.base.WindowAndroid.IntentCallback;
import org.chromium.ui.base.WindowAndroid.PermissionCallback;
import java.util.HashMap;
import java.util.List;
......@@ -368,6 +368,10 @@ public class LocationBarVoiceRecognitionHandlerTest {
}
callback.onRequestPermissionsResult(permissions, results);
}
@Override
public void onRequestPermissionsResult(
int requestCode, String[] permissions, int[] grantResults) {}
}
@Before
......
......@@ -201,12 +201,14 @@ android_library("ui_full_java") {
"java/src/org/chromium/ui/HorizontalListDividerDrawable.java",
"java/src/org/chromium/ui/OverscrollRefreshHandler.java",
"java/src/org/chromium/ui/VSyncMonitor.java",
"java/src/org/chromium/ui/base/ActivityAndroidPermissionDelegate.java",
"java/src/org/chromium/ui/base/ActivityWindowAndroid.java",
"java/src/org/chromium/ui/base/AndroidPermissionDelegate.java",
"java/src/org/chromium/ui/base/Clipboard.java",
"java/src/org/chromium/ui/base/DeviceFormFactor.java",
"java/src/org/chromium/ui/base/EventForwarder.java",
"java/src/org/chromium/ui/base/LocalizationUtils.java",
"java/src/org/chromium/ui/base/PermissionCallback.java",
"java/src/org/chromium/ui/base/ResourceBundle.java",
"java/src/org/chromium/ui/base/SelectFileDialog.java",
"java/src/org/chromium/ui/base/SPenSupport.java",
......
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.ui.base;
import android.app.Activity;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.PermissionInfo;
import android.os.Build;
import android.os.Handler;
import android.os.Process;
import android.text.TextUtils;
import android.util.SparseArray;
import org.chromium.base.ApiCompatibilityUtils;
import org.chromium.base.ContextUtils;
import java.lang.ref.WeakReference;
/**
* AndroidPermissionDelegate implementation for Activity.
*/
public class ActivityAndroidPermissionDelegate implements AndroidPermissionDelegate {
private WeakReference<Activity> mActivity;
private Handler mHandler;
private SparseArray<PermissionCallback> mOutstandingPermissionRequests;
private int mNextRequestCode;
// Constants used for permission request code bounding.
private static final int REQUEST_CODE_PREFIX = 1000;
private static final int REQUEST_CODE_RANGE_SIZE = 100;
private static final String PERMISSION_QUERIED_KEY_PREFIX = "HasRequestedAndroidPermission::";
public ActivityAndroidPermissionDelegate(WeakReference<Activity> activity) {
mActivity = activity;
mHandler = new Handler();
mOutstandingPermissionRequests = new SparseArray<PermissionCallback>();
}
@Override
public boolean hasPermission(String permission) {
return ApiCompatibilityUtils.checkPermission(ContextUtils.getApplicationContext(),
permission, Process.myPid(), Process.myUid())
== PackageManager.PERMISSION_GRANTED;
}
@Override
public boolean canRequestPermission(String permission) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) return false;
Activity activity = mActivity.get();
if (activity == null) return false;
if (isPermissionRevokedByPolicy(permission)) {
return false;
}
if (activity.shouldShowRequestPermissionRationale(permission)) {
return true;
}
// Check whether we have ever asked for this permission by checking whether we saved
// a preference associated with it before.
String permissionQueriedKey = getHasRequestedPermissionKey(permission);
SharedPreferences prefs = ContextUtils.getAppSharedPreferences();
if (!prefs.getBoolean(permissionQueriedKey, false)) return true;
logUMAOnRequestPermissionDenied(permission);
return false;
}
@Override
public boolean isPermissionRevokedByPolicy(String permission) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) return false;
Activity activity = mActivity.get();
if (activity == null) return false;
return activity.getPackageManager().isPermissionRevokedByPolicy(
permission, activity.getPackageName());
}
@Override
public void requestPermissions(final String[] permissions, final PermissionCallback callback) {
if (requestPermissionsInternal(permissions, callback)) return;
// If the permission request was not sent successfully, just post a response to the
// callback with whatever the current permission state is for all the requested
// permissions. The response is posted to keep the async behavior of this method
// consistent.
mHandler.post(new Runnable() {
@Override
public void run() {
int[] results = new int[permissions.length];
for (int i = 0; i < permissions.length; i++) {
results[i] = hasPermission(permissions[i]) ? PackageManager.PERMISSION_GRANTED
: PackageManager.PERMISSION_DENIED;
}
callback.onRequestPermissionsResult(permissions, results);
}
});
}
@Override
public void onRequestPermissionsResult(
int requestCode, String[] permissions, int[] grantResults) {
Activity activity = mActivity.get();
assert activity != null;
SharedPreferences.Editor editor = ContextUtils.getAppSharedPreferences().edit();
for (int i = 0; i < permissions.length; i++) {
editor.putBoolean(getHasRequestedPermissionKey(permissions[i]), true);
}
editor.apply();
PermissionCallback callback = mOutstandingPermissionRequests.get(requestCode);
mOutstandingPermissionRequests.delete(requestCode);
if (callback == null) return;
callback.onRequestPermissionsResult(permissions, grantResults);
}
protected void logUMAOnRequestPermissionDenied(String permission) {}
/**
* Issues the permission request and returns whether it was sent successfully.
*/
private boolean requestPermissionsInternal(String[] permissions, PermissionCallback callback) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) return false;
Activity activity = mActivity.get();
if (activity == null) return false;
int requestCode = REQUEST_CODE_PREFIX + mNextRequestCode;
mNextRequestCode = (mNextRequestCode + 1) % REQUEST_CODE_RANGE_SIZE;
mOutstandingPermissionRequests.put(requestCode, callback);
activity.requestPermissions(permissions, requestCode);
return true;
}
private String getHasRequestedPermissionKey(String permission) {
String permissionQueriedKey = permission;
// Prior to O, permissions were granted at the group level. Post O, each permission is
// granted individually.
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
try {
// Runtime permissions are controlled at the group level. So when determining
// whether we have requested a particular permission before, we should check whether
// we have requested any permission in that group as that mimics the logic in the
// Android framework.
//
// e.g. Requesting first the permission ACCESS_FINE_LOCATION will result in Chrome
// treating ACCESS_COARSE_LOCATION as if it had already been requested as well.
PermissionInfo permissionInfo =
ContextUtils.getApplicationContext().getPackageManager().getPermissionInfo(
permission, PackageManager.GET_META_DATA);
if (!TextUtils.isEmpty(permissionInfo.group)) {
permissionQueriedKey = permissionInfo.group;
}
} catch (NameNotFoundException e) {
// Unknown permission. Default back to the permission name instead of the group.
}
}
return PERMISSION_QUERIED_KEY_PREFIX + permissionQueriedKey;
}
}
......@@ -10,22 +10,11 @@ import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.content.IntentSender.SendIntentException;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.PermissionInfo;
import android.os.Build;
import android.os.Handler;
import android.os.Process;
import android.text.TextUtils;
import android.util.SparseArray;
import android.view.View;
import org.chromium.base.ActivityState;
import org.chromium.base.ApiCompatibilityUtils;
import org.chromium.base.ApplicationStatus;
import org.chromium.base.Callback;
import org.chromium.base.ContextUtils;
import org.chromium.ui.UiUtils;
import java.lang.ref.WeakReference;
......@@ -42,11 +31,6 @@ public class ActivityWindowAndroid
private static final int REQUEST_CODE_PREFIX = 1000;
private static final int REQUEST_CODE_RANGE_SIZE = 100;
private static final String PERMISSION_QUERIED_KEY_PREFIX = "HasRequestedAndroidPermission::";
private final Handler mHandler;
private final SparseArray<PermissionCallback> mOutstandingPermissionRequests;
private int mNextRequestCode;
/**
......@@ -70,13 +54,15 @@ public class ActivityWindowAndroid
if (activity == null) {
throw new IllegalArgumentException("Context is not and does not wrap an Activity");
}
mHandler = new Handler();
mOutstandingPermissionRequests = new SparseArray<PermissionCallback>();
if (listenToActivityState) {
ApplicationStatus.registerStateListenerForActivity(this, activity);
}
setAndroidPermissionDelegate(new ActivityAndroidPermissionDelegate());
setAndroidPermissionDelegate(createAndroidPermissionDelegate());
}
protected ActivityAndroidPermissionDelegate createAndroidPermissionDelegate() {
return new ActivityAndroidPermissionDelegate(getActivity());
}
@Override
......@@ -176,34 +162,6 @@ public class ActivityWindowAndroid
return false;
}
private String getHasRequestedPermissionKey(String permission) {
String permissionQueriedKey = permission;
// Prior to O, permissions were granted at the group level. Post O, each permission is
// granted individually.
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
try {
// Runtime permissions are controlled at the group level. So when determining
// whether we have requested a particular permission before, we should check whether
// we have requested any permission in that group as that mimics the logic in the
// Android framework.
//
// e.g. Requesting first the permission ACCESS_FINE_LOCATION will result in Chrome
// treating ACCESS_COARSE_LOCATION as if it had already been requested as well.
PermissionInfo permissionInfo =
getApplicationContext().getPackageManager().getPermissionInfo(
permission, PackageManager.GET_META_DATA);
if (!TextUtils.isEmpty(permissionInfo.group)) {
permissionQueriedKey = permissionInfo.group;
}
} catch (NameNotFoundException e) {
// Unknown permission. Default back to the permission name instead of the group.
}
}
return PERMISSION_QUERIED_KEY_PREFIX + permissionQueriedKey;
}
/**
* Responds to a pending permission result.
* @param requestCode The unique code for the permission request.
......@@ -213,19 +171,8 @@ public class ActivityWindowAndroid
*/
public boolean onRequestPermissionsResult(int requestCode, String[] permissions,
int[] grantResults) {
Activity activity = getActivity().get();
assert activity != null;
SharedPreferences.Editor editor = ContextUtils.getAppSharedPreferences().edit();
for (int i = 0; i < permissions.length; i++) {
editor.putBoolean(getHasRequestedPermissionKey(permissions[i]), true);
}
editor.apply();
PermissionCallback callback = mOutstandingPermissionRequests.get(requestCode);
mOutstandingPermissionRequests.delete(requestCode);
if (callback == null) return false;
callback.onRequestPermissionsResult(permissions, grantResults);
getAndroidPermissionDelegate().onRequestPermissionsResult(
requestCode, permissions, grantResults);
return true;
}
......@@ -249,8 +196,6 @@ public class ActivityWindowAndroid
keyboardVisibilityPossiblyChanged(UiUtils.isKeyboardShowing(getActivity().get(), v));
}
protected void logUMAOnRequestPermissionDenied(String permission) {}
private int generateNextRequestCode() {
int requestCode = REQUEST_CODE_PREFIX + mNextRequestCode;
mNextRequestCode = (mNextRequestCode + 1) % REQUEST_CODE_RANGE_SIZE;
......@@ -262,87 +207,4 @@ public class ActivityWindowAndroid
mIntentErrors.put(
requestCode, errorId == null ? null : mApplicationContext.getString(errorId));
}
private class ActivityAndroidPermissionDelegate implements AndroidPermissionDelegate {
@Override
public boolean hasPermission(String permission) {
return ApiCompatibilityUtils.checkPermission(
mApplicationContext, permission, Process.myPid(), Process.myUid())
== PackageManager.PERMISSION_GRANTED;
}
@Override
public boolean canRequestPermission(String permission) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) return false;
Activity activity = getActivity().get();
if (activity == null) return false;
if (isPermissionRevokedByPolicy(permission)) {
return false;
}
if (activity.shouldShowRequestPermissionRationale(permission)) {
return true;
}
// Check whether we have ever asked for this permission by checking whether we saved
// a preference associated with it before.
String permissionQueriedKey = getHasRequestedPermissionKey(permission);
SharedPreferences prefs = ContextUtils.getAppSharedPreferences();
if (!prefs.getBoolean(permissionQueriedKey, false)) return true;
logUMAOnRequestPermissionDenied(permission);
return false;
}
@Override
public boolean isPermissionRevokedByPolicy(String permission) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) return false;
Activity activity = getActivity().get();
if (activity == null) return false;
return activity.getPackageManager().isPermissionRevokedByPolicy(
permission, activity.getPackageName());
}
@Override
public void requestPermissions(
final String[] permissions, final PermissionCallback callback) {
if (requestPermissionsInternal(permissions, callback)) return;
// If the permission request was not sent successfully, just post a response to the
// callback with whatever the current permission state is for all the requested
// permissions. The response is posted to keep the async behavior of this method
// consistent.
mHandler.post(new Runnable() {
@Override
public void run() {
int[] results = new int[permissions.length];
for (int i = 0; i < permissions.length; i++) {
results[i] = hasPermission(permissions[i])
? PackageManager.PERMISSION_GRANTED
: PackageManager.PERMISSION_DENIED;
}
callback.onRequestPermissionsResult(permissions, results);
}
});
}
/**
* Issues the permission request and returns whether it was sent successfully.
*/
private boolean requestPermissionsInternal(
String[] permissions, PermissionCallback callback) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) return false;
Activity activity = getActivity().get();
if (activity == null) return false;
int requestCode = generateNextRequestCode();
mOutstandingPermissionRequests.put(requestCode, callback);
activity.requestPermissions(permissions, requestCode);
return true;
}
}
}
......@@ -4,8 +4,6 @@
package org.chromium.ui.base;
import org.chromium.ui.base.WindowAndroid.PermissionCallback;
/**
* Contains the functionality for interacting with the android permissions system.
*/
......@@ -45,4 +43,12 @@ public interface AndroidPermissionDelegate {
* @param callback The callback to be notified whether the permissions were granted.
*/
void requestPermissions(String[] permissions, PermissionCallback callback);
/**
* Callback for the result from requesting permissions.
* @param requestCode The request code passed in requestPermissions.
* @param permissions The list of requested permissions.
* @param grantResults The grant results for the corresponding permissions.
*/
void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults);
}
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.ui.base;
/**
* Callback for permission requests.
*/
public interface PermissionCallback {
/**
* Called upon completing a permission request.
* @param permissions The list of permissions in the result.
* @param grantResults Whether the permissions were granted.
*/
void onRequestPermissionsResult(String[] permissions, int[] grantResults);
}
......@@ -45,8 +45,8 @@ import java.util.concurrent.TimeUnit;
* a set of accepted file types. The path of the selected file is passed to the native dialog.
*/
@JNINamespace("ui")
public class SelectFileDialog implements WindowAndroid.IntentCallback,
WindowAndroid.PermissionCallback, PhotoPickerListener {
public class SelectFileDialog
implements WindowAndroid.IntentCallback, PermissionCallback, PhotoPickerListener {
private static final String TAG = "SelectFileDialog";
private static final String IMAGE_TYPE = "image/";
private static final String VIDEO_TYPE = "video/";
......
......@@ -249,6 +249,10 @@ public class WindowAndroid {
mNativeWindowAndroid = 0;
}
protected AndroidPermissionDelegate getAndroidPermissionDelegate() {
return mPermissionDelegate;
}
/**
* Set the delegate that will handle android permissions requests.
*/
......@@ -551,18 +555,6 @@ public class WindowAndroid {
void onIntentCompleted(WindowAndroid window, int resultCode, Intent data);
}
/**
* Callback for permission requests.
*/
public interface PermissionCallback {
/**
* Called upon completing a permission request.
* @param permissions The list of permissions in the result.
* @param grantResults Whether the permissions were granted.
*/
void onRequestPermissionsResult(String[] permissions, int[] grantResults);
}
/**
* Tests that an activity is available to handle the passed in intent.
* @param intent The intent to check.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment