Always ask for permissions

This commit is contained in:
Carmelo Messina 2021-11-20 19:02:36 +01:00
parent 785af3a5b2
commit 73c0ab9b36
No known key found for this signature in database
GPG key ID: 968894BE688289FD

View file

@ -0,0 +1,291 @@
From: uazo <uazo@users.noreply.github.com>
Date: Sat, 20 Nov 2021 15:23:48 +0000
Subject: Always ask for permissions
Always ask for permissions for location, microphone and camera in every session
---
.../java/res/xml/privacy_preferences.xml | 5 ++
.../download/FileAccessPermissionHelper.java | 2 +-
.../PermissionUpdateInfoBarDelegate.java | 10 ++-
...mission_update_infobar_delegate_android.cc | 11 ++-
.../strings/android_chrome_strings.grd | 8 ++
.../strings/android/browser_ui_strings.grd | 4 +
.../PermissionParamsListBuilder.java | 4 +
.../AndroidPermissionRequester.java | 81 ++++++++++++++++++-
.../PermissionDialogController.java | 3 +
9 files changed, 121 insertions(+), 7 deletions(-)
diff --git a/chrome/android/java/res/xml/privacy_preferences.xml b/chrome/android/java/res/xml/privacy_preferences.xml
--- a/chrome/android/java/res/xml/privacy_preferences.xml
+++ b/chrome/android/java/res/xml/privacy_preferences.xml
@@ -70,6 +70,11 @@
android:title="@string/open_external_links_incognito_title"
android:summary="@string/open_external_links_incognito_summary"
android:defaultValue="false" />
+ <org.chromium.components.browser_ui.settings.ChromeSwitchPreference
+ android:key="ask_permissions_to_user"
+ android:title="@string/ask_permissions_to_user_title"
+ android:summary="@string/ask_permissions_to_user_summary"
+ android:defaultValue="true" />
<PreferenceCategory
android:key="services_category"
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/FileAccessPermissionHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/download/FileAccessPermissionHelper.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/FileAccessPermissionHelper.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/FileAccessPermissionHelper.java
@@ -65,7 +65,7 @@ public class FileAccessPermissionHelper {
&& grantResults[0] == PackageManager.PERMISSION_GRANTED,
null));
- AndroidPermissionRequester.showMissingPermissionDialog(
+ AndroidPermissionRequester.showMissingPermissionDialogUnchecked(
ApplicationStatus.getLastTrackedFocusedActivity(),
org.chromium.chrome.R.string.missing_storage_permission_download_education_text,
()
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/infobar/PermissionUpdateInfoBarDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/infobar/PermissionUpdateInfoBarDelegate.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/infobar/PermissionUpdateInfoBarDelegate.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/infobar/PermissionUpdateInfoBarDelegate.java
@@ -23,6 +23,11 @@ import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
+import org.chromium.components.permissions.AndroidPermissionRequester;
+
+// remove this comment when moved to
+// chrome/android/java/src/org/chromium/chrome/browser/permissions/PermissionUpdateRequester.java
+
/**
* Handles requesting the android runtime permissions for the permission update infobar.
*/
@@ -131,7 +136,10 @@ class PermissionUpdateInfoBarDelegate implements PermissionCallback {
if (!mRequiredAndroidPermissions.contains(mAndroidPermisisons[i])) {
continue;
}
- hasAllPermissions &= windowAndroid.hasPermission(mAndroidPermisisons[i]);
+ boolean hasPermission = windowAndroid.hasPermission(mAndroidPermisisons[i]);
+ hasAllPermissions &= hasPermission;
+ if (hasPermission)
+ AndroidPermissionRequester.setUserGrantedPermission(mAndroidPermisisons[i]);
}
}
if (mNativePtr != 0) {
diff --git a/chrome/browser/permissions/permission_update_infobar_delegate_android.cc b/chrome/browser/permissions/permission_update_infobar_delegate_android.cc
--- a/chrome/browser/permissions/permission_update_infobar_delegate_android.cc
+++ b/chrome/browser/permissions/permission_update_infobar_delegate_android.cc
@@ -53,6 +53,9 @@ infobars::InfoBar* PermissionUpdateInfoBarDelegate::Create(
permissions::AppendOptionalAndroidPermissionsForContentSetting(
content_settings_type, &optional_permissions);
+ // in bromite there are other contentsettings defined as permission
+ // so in debug please don't crash
+ // moved to chrome/browser/permissions/permission_update_message_controller_android.cc
if (message_id == -1) {
if (content_settings_type == ContentSettingsType::GEOLOCATION) {
message_id = IDS_INFOBAR_MISSING_LOCATION_PERMISSION_TEXT;
@@ -65,16 +68,16 @@ infobars::InfoBar* PermissionUpdateInfoBarDelegate::Create(
} else if (content_settings_type == ContentSettingsType::AR) {
message_id = IDS_INFOBAR_MISSING_AR_CAMERA_PERMISSION_TEXT;
} else {
- NOTREACHED();
+ //NOTREACHED();
}
} else if (message_id == IDS_INFOBAR_MISSING_CAMERA_PERMISSION_TEXT) {
- DCHECK(content_settings_type == ContentSettingsType::MEDIASTREAM_MIC);
+ //DCHECK(content_settings_type == ContentSettingsType::MEDIASTREAM_MIC);
message_id = IDS_INFOBAR_MISSING_MICROPHONE_CAMERA_PERMISSIONS_TEXT;
} else if (message_id == IDS_INFOBAR_MISSING_MICROPHONE_PERMISSION_TEXT) {
- DCHECK(content_settings_type == ContentSettingsType::MEDIASTREAM_CAMERA);
+ //DCHECK(content_settings_type == ContentSettingsType::MEDIASTREAM_CAMERA);
message_id = IDS_INFOBAR_MISSING_MICROPHONE_CAMERA_PERMISSIONS_TEXT;
} else {
- NOTREACHED();
+ //NOTREACHED();
}
}
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
--- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
+++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -5237,6 +5237,14 @@ To change this setting, <ph name="BEGIN_LINK">&lt;resetlink&gt;</ph>reset sync<p
<message name="IDS_SETTINGS_HTTPS_FIRST_MODE_SUMMARY" desc="Secondary, continued explanation of HTTPS-First Mode in settings.">
Upgrade navigations to HTTPS and warn you before loading sites that dont support it
</message>
+
+ <!-- Ask permissions to user settings strings -->
+ <message name="IDS_ASK_PERMISSIONS_TO_USER_TITLE" desc="Title for always ask for permissions settings. [CHAR-LIMIT=32]">
+ Always ask for permissions
+ </message>
+ <message name="IDS_ASK_PERMISSIONS_TO_USER_SUMMARY" desc="Summary for always ask for permissions settings">
+ Always ask for permissions for location, microphone and camera in every session
+ </message>
</messages>
</release>
</grit>
diff --git a/components/browser_ui/strings/android/browser_ui_strings.grd b/components/browser_ui/strings/android/browser_ui_strings.grd
--- a/components/browser_ui/strings/android/browser_ui_strings.grd
+++ b/components/browser_ui/strings/android/browser_ui_strings.grd
@@ -568,6 +568,10 @@
<message name="IDS_PAGE_INFO_URL_TRUNCATED" desc="Accessibility announcement when the URL in PageInfo switches from full to truncated display">
URL truncated
</message>
+ <message name="IDS_PAGE_INFO_ANDROID_PERMISSION_USER_PERMISSION_REQUIRED"
+ desc="The label used in the About Page dialog to indicate an authorization has not yet been requested from the user">
+ User permission is required
+ </message>
<message name="IDS_COOKIES_TITLE" desc="Title for the Cookies settings screen [CHAR_LIMIT=32]">
Cookies
diff --git a/components/page_info/android/java/src/org/chromium/components/page_info/PermissionParamsListBuilder.java b/components/page_info/android/java/src/org/chromium/components/page_info/PermissionParamsListBuilder.java
--- a/components/page_info/android/java/src/org/chromium/components/page_info/PermissionParamsListBuilder.java
+++ b/components/page_info/android/java/src/org/chromium/components/page_info/PermissionParamsListBuilder.java
@@ -85,6 +85,10 @@ public class PermissionParamsListBuilder {
permissionParams.warningTextResource =
R.string.page_info_android_permission_blocked;
}
+ if (AndroidPermissionRequester.alreadyAskedPermissionToUser(permission.type) == false) {
+ permissionParams.warningTextResource =
+ R.string.page_info_android_permission_user_permission_required;
+ }
}
}
diff --git a/components/permissions/android/java/src/org/chromium/components/permissions/AndroidPermissionRequester.java b/components/permissions/android/java/src/org/chromium/components/permissions/AndroidPermissionRequester.java
--- a/components/permissions/android/java/src/org/chromium/components/permissions/AndroidPermissionRequester.java
+++ b/components/permissions/android/java/src/org/chromium/components/permissions/AndroidPermissionRequester.java
@@ -26,6 +26,10 @@ import org.chromium.ui.modelutil.PropertyModel;
import java.util.HashSet;
import java.util.Set;
+import java.util.Hashtable;
+import java.time.LocalDateTime;
+import java.time.temporal.ChronoUnit;
+import org.chromium.base.ContextUtils;
/**
* Methods to handle requesting native permissions from Android when the user grants a website a
@@ -79,6 +83,9 @@ public class AndroidPermissionRequester {
public static boolean hasRequiredAndroidPermissionsForContentSetting(
AndroidPermissionDelegate permissionDelegate,
@ContentSettingsType int contentSettingsType) {
+ if (alreadyAskedPermissionToUser(contentSettingsType) == false)
+ return false;
+
Set<String> missingPermissions = filterPermissionsKeepMissing(permissionDelegate,
PermissionUtil.getRequiredAndroidPermissionsForContentSetting(contentSettingsType));
@@ -148,6 +155,8 @@ public class AndroidPermissionRequester {
if (!windowAndroid.canRequestPermission(permissions[i])) {
allRequestable = false;
}
+ } else if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
+ setUserGrantedPermission(permissions[i]);
}
}
@@ -198,6 +207,13 @@ public class AndroidPermissionRequester {
return true;
}
+ public static void showMissingPermissionDialogUnchecked(Activity activity, @StringRes int messageId,
+ Runnable onPositiveButtonClicked, Runnable onCancelled) {
+ // permitted without any check for requestFileAccessPermissionHelper.FileAccessPermissionHelper
+ // used by download manager
+ showMissingPermissionDialog(activity, messageId, onPositiveButtonClicked, onCancelled);
+ }
+
/**
* Shows a dialog that informs the user about a missing Android permission.
* @param activity Current Activity. It should implement {@link ModalDialogManagerHolder}.
@@ -205,7 +221,7 @@ public class AndroidPermissionRequester {
* @param onPositiveButtonClicked Runnable that is executed on positive button click.
* @param onCancelled Runnable that is executed on cancellation.
*/
- public static void showMissingPermissionDialog(Activity activity, @StringRes int messageId,
+ private static void showMissingPermissionDialog(Activity activity, @StringRes int messageId,
Runnable onPositiveButtonClicked, Runnable onCancelled) {
assert activity
instanceof ModalDialogManagerHolder
@@ -244,4 +260,67 @@ public class AndroidPermissionRequester {
.build();
modalDialogManager.showDialog(dialogModel, ModalDialogManager.ModalDialogType.APP);
}
+
+ // Contains the time the user granted permission
+ static private Hashtable<Integer,LocalDateTime> m_LastPermissionRequestedDate =
+ new Hashtable<Integer,LocalDateTime>();
+
+ // Lazy array of the mapping between android permissions and contentsetting
+ static private SparseArray<Set<String>> m_ContentSettingsTypesToRequiredPermissionsMap;
+
+ private static SparseArray<Set<String>> getContentSettingsTypesToRequiredPermissionsMap() {
+ if (m_ContentSettingsTypesToRequiredPermissionsMap == null)
+ {
+ m_ContentSettingsTypesToRequiredPermissionsMap = new SparseArray<>();
+ for (@ContentSettingsType int type = 0; type < ContentSettingsType.NUM_TYPES; type++) {
+ final Set<String> requiredPermissions = CollectionUtil.newHashSet(
+ PermissionUtil.getRequiredAndroidPermissionsForContentSetting(
+ type));
+
+ m_ContentSettingsTypesToRequiredPermissionsMap.append(
+ type, requiredPermissions);
+ }
+ }
+ return m_ContentSettingsTypesToRequiredPermissionsMap;
+ }
+
+ // check if authorization has already been requested from the user in this session
+ static public boolean alreadyAskedPermissionToUser(@ContentSettingsType int contentSettingsType) {
+ // user disabled
+ if (!ContextUtils.getAppSharedPreferences().getBoolean("ask_permissions_to_user", true))
+ return true;
+
+ // check if android permission is needed
+ if (PermissionUtil.getRequiredAndroidPermissionsForContentSetting(contentSettingsType).length == 0)
+ return true;
+
+ // check if already asked
+ if (!m_LastPermissionRequestedDate.containsKey(contentSettingsType)) {
+ return false;
+ } else {
+ LocalDateTime lastRequest = m_LastPermissionRequestedDate.get(contentSettingsType);
+ if (lastRequest.until(LocalDateTime.now(), ChronoUnit.MINUTES) > 240)
+ return false;
+ }
+ return true;
+ }
+
+ // sets the time of the user's positive authorization request
+ static public void setUserGrantedPermission(String permission)
+ {
+ // The following permissions are currently managed
+ // ContentSettingsType: GEOLOCATION, MEDIASTREAM_MIC, MEDIASTREAM_CAMERA, AR
+ // Permission: LOCATION, MICROPHONE, CAMERA
+ SparseArray<Set<String>> contentSettingsTypesToRequiredPermissionsMap =
+ getContentSettingsTypesToRequiredPermissionsMap();
+ final int grantedContentSetting = getContentSettingType(
+ contentSettingsTypesToRequiredPermissionsMap, permission);
+
+ setUserGrantedContentSettings(grantedContentSetting);
+ }
+
+ static public void setUserGrantedContentSettings(int contentSettings)
+ {
+ m_LastPermissionRequestedDate.put(contentSettings, LocalDateTime.now());
+ }
}
diff --git a/components/permissions/android/java/src/org/chromium/components/permissions/PermissionDialogController.java b/components/permissions/android/java/src/org/chromium/components/permissions/PermissionDialogController.java
--- a/components/permissions/android/java/src/org/chromium/components/permissions/PermissionDialogController.java
+++ b/components/permissions/android/java/src/org/chromium/components/permissions/PermissionDialogController.java
@@ -146,6 +146,9 @@ public class PermissionDialogController
public void onAndroidPermissionAccepted() {
assert mState == State.REQUEST_ANDROID_PERMISSIONS;
+ for (int contentSettings : mDialogDelegate.getContentSettingsTypes())
+ AndroidPermissionRequester.setUserGrantedContentSettings(contentSettings);
+
// The tab may have navigated or been closed behind the Android permission prompt.
if (mDialogDelegate == null) {
mState = State.NOT_SHOWING;
--
2.20.1