Always ask for permissions
This commit is contained in:
parent
785af3a5b2
commit
73c0ab9b36
1 changed files with 291 additions and 0 deletions
291
build/patches/Always-ask-for-permissions.patch
Normal file
291
build/patches/Always-ask-for-permissions.patch
Normal 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"><resetlink></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 don’t 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
|
||||
|
Loading…
Add table
Reference in a new issue