0

Move Contacts Picker code out of UiUtils.

The ui_utils_java target is not a suitable place for this code because
it needs to use WindowAndroid instead of Context (for WebLayer's sake),
and ui_utils_java can't depend on WindowAndroid.

This glue code is moved to org.chromium.content_public.browser.

Bug: 1117536,1016938
Change-Id: Ic18275e2f0eca0739b850418af6c71d2079c6da5
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2380343
Reviewed-by: John Abd-El-Malek <jam@chromium.org>
Reviewed-by: David Trainor <dtrainor@chromium.org>
Commit-Queue: Evan Stade <estade@chromium.org>
Cr-Commit-Position: refs/heads/master@{#804505}
This commit is contained in:
Evan Stade
2020-09-04 01:55:43 +00:00
committed by Commit Bot
parent 70f09b810c
commit dd1293630f
12 changed files with 127 additions and 102 deletions
chrome/android/java/src/org/chromium/chrome/browser/init
components/browser_ui/contacts_picker/android
content/public/android
ui/android
BUILD.gn
java
src
org
chromium

@@ -35,7 +35,6 @@ import org.chromium.chrome.browser.ChromeBackupAgent;
import org.chromium.chrome.browser.DefaultBrowserInfo; import org.chromium.chrome.browser.DefaultBrowserInfo;
import org.chromium.chrome.browser.DeferredStartupHandler; import org.chromium.chrome.browser.DeferredStartupHandler;
import org.chromium.chrome.browser.DevToolsServer; import org.chromium.chrome.browser.DevToolsServer;
import org.chromium.chrome.browser.app.ChromeActivity;
import org.chromium.chrome.browser.banners.AppBannerManager; import org.chromium.chrome.browser.banners.AppBannerManager;
import org.chromium.chrome.browser.bookmarkswidget.BookmarkWidgetProvider; import org.chromium.chrome.browser.bookmarkswidget.BookmarkWidgetProvider;
import org.chromium.chrome.browser.contacts_picker.ChromePickerAdapter; import org.chromium.chrome.browser.contacts_picker.ChromePickerAdapter;
@@ -89,10 +88,11 @@ import org.chromium.components.viz.common.VizSwitches;
import org.chromium.components.viz.common.display.DeJellyUtils; import org.chromium.components.viz.common.display.DeJellyUtils;
import org.chromium.content_public.browser.BrowserTaskExecutor; import org.chromium.content_public.browser.BrowserTaskExecutor;
import org.chromium.content_public.browser.ChildProcessLauncherHelper; import org.chromium.content_public.browser.ChildProcessLauncherHelper;
import org.chromium.content_public.browser.ContactsPicker;
import org.chromium.content_public.browser.ContactsPickerDelegate;
import org.chromium.content_public.browser.ContactsPickerListener;
import org.chromium.content_public.browser.UiThreadTaskTraits; import org.chromium.content_public.browser.UiThreadTaskTraits;
import org.chromium.content_public.common.ContentSwitches; import org.chromium.content_public.common.ContentSwitches;
import org.chromium.ui.ContactsPickerListener;
import org.chromium.ui.UiUtils;
import org.chromium.ui.base.Clipboard; import org.chromium.ui.base.Clipboard;
import org.chromium.ui.base.PhotoPicker; import org.chromium.ui.base.PhotoPicker;
import org.chromium.ui.base.PhotoPickerDelegate; import org.chromium.ui.base.PhotoPickerDelegate;
@@ -237,19 +237,17 @@ public class ProcessInitializationHandler {
}); });
} }
UiUtils.setContactsPickerDelegate(new UiUtils.ContactsPickerDelegate() { ContactsPicker.setContactsPickerDelegate(new ContactsPickerDelegate() {
private ContactsPickerDialog mDialog; private ContactsPickerDialog mDialog;
@Override @Override
public void showContactsPicker(Context context, ContactsPickerListener listener, public void showContactsPicker(WindowAndroid windowAndroid,
boolean allowMultiple, boolean includeNames, boolean includeEmails, ContactsPickerListener listener, boolean allowMultiple, boolean includeNames,
boolean includeTel, boolean includeAddresses, boolean includeIcons, boolean includeEmails, boolean includeTel, boolean includeAddresses,
String formattedOrigin) { boolean includeIcons, String formattedOrigin) {
// TODO(crbug.com/1117536): remove this cast. mDialog = new ContactsPickerDialog(windowAndroid, new ChromePickerAdapter(),
ChromeActivity activity = (ChromeActivity) context; listener, allowMultiple, includeNames, includeEmails, includeTel,
mDialog = new ContactsPickerDialog(activity.getWindowAndroid(), includeAddresses, includeIcons, formattedOrigin);
new ChromePickerAdapter(), listener, allowMultiple, includeNames,
includeEmails, includeTel, includeAddresses, includeIcons, formattedOrigin);
mDialog.getWindow().getAttributes().windowAnimations = mDialog.getWindow().getAttributes().windowAnimations =
R.style.PickerDialogAnimation; R.style.PickerDialogAnimation;
mDialog.show(); mDialog.show();

@@ -40,6 +40,7 @@ android_library("java") {
"//components/browser_ui/util/android:java", "//components/browser_ui/util/android:java",
"//components/browser_ui/widget/android:java", "//components/browser_ui/widget/android:java",
"//components/payments/mojom:mojom_java", "//components/payments/mojom:mojom_java",
"//content/public/android:content_java",
"//third_party/android_deps:androidx_annotation_annotation_java", "//third_party/android_deps:androidx_annotation_annotation_java",
"//third_party/android_deps:androidx_appcompat_appcompat_java", "//third_party/android_deps:androidx_appcompat_appcompat_java",
"//third_party/android_deps:androidx_core_core_java", "//third_party/android_deps:androidx_core_core_java",
@@ -95,6 +96,7 @@ android_library("javatests") {
"//components/browser_ui/widget/android:java", "//components/browser_ui/widget/android:java",
"//components/browser_ui/widget/android:test_support_java", "//components/browser_ui/widget/android:test_support_java",
"//components/payments/mojom:mojom_java", "//components/payments/mojom:mojom_java",
"//content/public/android:content_java",
"//content/public/test/android:content_java_test_support", "//content/public/test/android:content_java_test_support",
"//third_party/android_deps:androidx_annotation_annotation_java", "//third_party/android_deps:androidx_annotation_annotation_java",
"//third_party/android_deps:androidx_appcompat_appcompat_java", "//third_party/android_deps:androidx_appcompat_appcompat_java",

@@ -7,7 +7,7 @@ package org.chromium.components.browser_ui.contacts_picker;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AlertDialog;
import org.chromium.ui.ContactsPickerListener; import org.chromium.content_public.browser.ContactsPickerListener;
import org.chromium.ui.base.WindowAndroid; import org.chromium.ui.base.WindowAndroid;
/** /**

@@ -32,10 +32,10 @@ import org.chromium.blink.mojom.ContactIconBlob;
import org.chromium.components.browser_ui.widget.RecyclerViewTestUtils; import org.chromium.components.browser_ui.widget.RecyclerViewTestUtils;
import org.chromium.components.browser_ui.widget.selectable_list.SelectionDelegate; import org.chromium.components.browser_ui.widget.selectable_list.SelectionDelegate;
import org.chromium.components.browser_ui.widget.selectable_list.SelectionDelegate.SelectionObserver; import org.chromium.components.browser_ui.widget.selectable_list.SelectionDelegate.SelectionObserver;
import org.chromium.content_public.browser.ContactsPickerListener;
import org.chromium.content_public.browser.test.util.TestThreadUtils; import org.chromium.content_public.browser.test.util.TestThreadUtils;
import org.chromium.content_public.browser.test.util.TestTouchUtils; import org.chromium.content_public.browser.test.util.TestTouchUtils;
import org.chromium.payments.mojom.PaymentAddress; import org.chromium.payments.mojom.PaymentAddress;
import org.chromium.ui.ContactsPickerListener;
import org.chromium.ui.base.ActivityWindowAndroid; import org.chromium.ui.base.ActivityWindowAndroid;
import org.chromium.ui.base.WindowAndroid; import org.chromium.ui.base.WindowAndroid;
import org.chromium.ui.test.util.DisableAnimationsTestRule; import org.chromium.ui.test.util.DisableAnimationsTestRule;

@@ -28,8 +28,8 @@ import org.chromium.components.browser_ui.widget.selectable_list.SelectableListL
import org.chromium.components.browser_ui.widget.selectable_list.SelectableListToolbar; import org.chromium.components.browser_ui.widget.selectable_list.SelectableListToolbar;
import org.chromium.components.browser_ui.widget.selectable_list.SelectionDelegate; import org.chromium.components.browser_ui.widget.selectable_list.SelectionDelegate;
import org.chromium.content.browser.contacts.ContactsPickerPropertiesRequested; import org.chromium.content.browser.contacts.ContactsPickerPropertiesRequested;
import org.chromium.ui.ContactsPickerListener; import org.chromium.content_public.browser.ContactsPicker;
import org.chromium.ui.UiUtils; import org.chromium.content_public.browser.ContactsPickerListener;
import org.chromium.ui.base.WindowAndroid; import org.chromium.ui.base.WindowAndroid;
import org.chromium.ui.modaldialog.ModalDialogManager; import org.chromium.ui.modaldialog.ModalDialogManager;
import org.chromium.ui.widget.OptimizedFrameLayout; import org.chromium.ui.widget.OptimizedFrameLayout;
@@ -449,7 +449,7 @@ public class PickerCategoryView extends OptimizedFrameLayout
mListener.onContactsPickerUserAction( mListener.onContactsPickerUserAction(
action, contacts, percentageShared, propertiesRequested); action, contacts, percentageShared, propertiesRequested);
mDialog.dismiss(); mDialog.dismiss();
UiUtils.onContactsPickerDismissed(); ContactsPicker.onContactsPickerDismissed();
recordFinalUmaStats( recordFinalUmaStats(
umaId, contactCount, selectCount, percentageShared, propertiesRequested); umaId, contactCount, selectCount, percentageShared, propertiesRequested);
} }

@@ -79,6 +79,7 @@ android_library("content_java") {
"//base:base_java", "//base:base_java",
"//base:jni_java", "//base:jni_java",
"//components/download/public/common:public_java", "//components/download/public/common:public_java",
"//components/payments/mojom:mojom_java",
"//device/bluetooth:java", "//device/bluetooth:java",
"//device/gamepad:java", "//device/gamepad:java",
"//media/base/android:media_java", "//media/base/android:media_java",
@@ -277,6 +278,9 @@ android_library("content_java") {
"java/src/org/chromium/content_public/browser/BrowserTaskExecutor.java", "java/src/org/chromium/content_public/browser/BrowserTaskExecutor.java",
"java/src/org/chromium/content_public/browser/ChildProcessCreationParams.java", "java/src/org/chromium/content_public/browser/ChildProcessCreationParams.java",
"java/src/org/chromium/content_public/browser/ChildProcessLauncherHelper.java", "java/src/org/chromium/content_public/browser/ChildProcessLauncherHelper.java",
"java/src/org/chromium/content_public/browser/ContactsPicker.java",
"java/src/org/chromium/content_public/browser/ContactsPickerDelegate.java",
"java/src/org/chromium/content_public/browser/ContactsPickerListener.java",
"java/src/org/chromium/content_public/browser/ContentFeatureList.java", "java/src/org/chromium/content_public/browser/ContentFeatureList.java",
"java/src/org/chromium/content_public/browser/ContentViewStatics.java", "java/src/org/chromium/content_public/browser/ContentViewStatics.java",
"java/src/org/chromium/content_public/browser/DeviceUtils.java", "java/src/org/chromium/content_public/browser/DeviceUtils.java",

@@ -11,8 +11,8 @@ import android.text.TextUtils;
import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.JNINamespace; import org.chromium.base.annotations.JNINamespace;
import org.chromium.base.annotations.NativeMethods; import org.chromium.base.annotations.NativeMethods;
import org.chromium.ui.ContactsPickerListener; import org.chromium.content_public.browser.ContactsPicker;
import org.chromium.ui.UiUtils; import org.chromium.content_public.browser.ContactsPickerListener;
import org.chromium.ui.base.WindowAndroid; import org.chromium.ui.base.WindowAndroid;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
@@ -53,8 +53,8 @@ public class ContactsDialogHost implements ContactsPickerListener {
} }
if (mWindowAndroid.hasPermission(Manifest.permission.READ_CONTACTS)) { if (mWindowAndroid.hasPermission(Manifest.permission.READ_CONTACTS)) {
if (!UiUtils.showContactsPicker(mWindowAndroid.getActivity().get(), this, multiple, if (!ContactsPicker.showContactsPicker(mWindowAndroid, this, multiple, includeNames,
includeNames, includeEmails, includeTel, includeAddresses, includeIcons, includeEmails, includeTel, includeAddresses, includeIcons,
formattedOrigin)) { formattedOrigin)) {
ContactsDialogHostJni.get().endWithPermissionDenied(mNativeContactsProviderAndroid); ContactsDialogHostJni.get().endWithPermissionDenied(mNativeContactsProviderAndroid);
} }
@@ -71,9 +71,9 @@ public class ContactsDialogHost implements ContactsPickerListener {
if (permissions.length == 1 && grantResults.length == 1 if (permissions.length == 1 && grantResults.length == 1
&& TextUtils.equals(permissions[0], Manifest.permission.READ_CONTACTS) && TextUtils.equals(permissions[0], Manifest.permission.READ_CONTACTS)
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) { && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
if (!UiUtils.showContactsPicker(mWindowAndroid.getActivity().get(), this, if (!ContactsPicker.showContactsPicker(mWindowAndroid, this, multiple,
multiple, includeNames, includeEmails, includeTel, includeNames, includeEmails, includeTel, includeAddresses,
includeAddresses, includeIcons, formattedOrigin)) { includeIcons, formattedOrigin)) {
ContactsDialogHostJni.get().endWithPermissionDenied( ContactsDialogHostJni.get().endWithPermissionDenied(
mNativeContactsProviderAndroid); mNativeContactsProviderAndroid);
} }

@@ -0,0 +1,62 @@
// Copyright 2020 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.content_public.browser;
import org.chromium.ui.base.WindowAndroid;
/**
* A utility class that allows the embedder to provide a Contacts Picker implementation to content.
*/
public final class ContactsPicker {
/**
* The current delegate for the contacts picker, or null if navigator.contacts is not
* supported.
*/
private static ContactsPickerDelegate sContactsPickerDelegate;
private ContactsPicker() {}
/**
* Allows setting a delegate for an Android contacts picker.
* @param delegate A {@link ContactsPickerDelegate} instance.
*/
public static void setContactsPickerDelegate(ContactsPickerDelegate delegate) {
sContactsPickerDelegate = delegate;
}
/**
* Called to display the contacts picker.
* @param windowAndroid The window of the Web Contents that triggered this call.
* @param listener The listener that will be notified of the action the user took in the
* picker.
* @param allowMultiple Whether to allow multiple contacts to be selected.
* @param includeNames Whether to include names of the shared contacts.
* @param includeEmails Whether to include emails of the shared contacts.
* @param includeTel Whether to include telephone numbers of the shared contacts.
* @param includeAddresses Whether to include addresses of the shared contacts.
* @param includeIcons Whether to include icons of the shared contacts.
* @param formattedOrigin The origin the data will be shared with, formatted for display with
* the scheme omitted.
* @return whether a contacts picker is successfully shown.
*/
public static boolean showContactsPicker(WindowAndroid windowAndroid,
ContactsPickerListener listener, boolean allowMultiple, boolean includeNames,
boolean includeEmails, boolean includeTel, boolean includeAddresses,
boolean includeIcons, String formattedOrigin) {
if (sContactsPickerDelegate == null) return false;
sContactsPickerDelegate.showContactsPicker(windowAndroid, listener, allowMultiple,
includeNames, includeEmails, includeTel, includeAddresses, includeIcons,
formattedOrigin);
return true;
}
/**
* Called when the contacts picker dialog has been dismissed.
*/
public static void onContactsPickerDismissed() {
if (sContactsPickerDelegate == null) return;
sContactsPickerDelegate.onContactsPickerDismissed();
}
}

@@ -0,0 +1,35 @@
// Copyright 2020 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.content_public.browser;
import org.chromium.ui.base.WindowAndroid;
/**
* A delegate interface for the contacts picker.
*/
public interface ContactsPickerDelegate {
/**
* Called to display the contacts picker.
* @param windowAndroid The window of the Web Contents that triggered the dialog.
* @param listener The listener that will be notified of the action the user took in the
* picker.
* @param allowMultiple Whether to allow multiple contacts to be picked.
* @param includeNames Whether to include names of the shared contacts.
* @param includeEmails Whether to include emails of the shared contacts.
* @param includeTel Whether to include telephone numbers of the shared contacts.
* @param includeAddresses Whether to include addresses of the shared contacts.
* @param includeIcons Whether to include icons of the shared contacts.
* @param formattedOrigin The origin the data will be shared with, formatted for display
* with the scheme omitted.
*/
void showContactsPicker(WindowAndroid windowAndroid, ContactsPickerListener listener,
boolean allowMultiple, boolean includeNames, boolean includeEmails, boolean includeTel,
boolean includeAddresses, boolean includeIcons, String formattedOrigin);
/**
* Called when the contacts picker dialog has been dismissed.
*/
void onContactsPickerDismissed();
}

@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
package org.chromium.ui; package org.chromium.content_public.browser;
import androidx.annotation.IntDef; import androidx.annotation.IntDef;

@@ -205,19 +205,15 @@ java_group("ui_java") {
# unused JNI functions. # unused JNI functions.
android_library("ui_utils_java") { android_library("ui_utils_java") {
sources = [ sources = [
"java/src/org/chromium/ui/ContactsPickerListener.java",
"java/src/org/chromium/ui/KeyboardVisibilityDelegate.java", "java/src/org/chromium/ui/KeyboardVisibilityDelegate.java",
"java/src/org/chromium/ui/UiUtils.java", "java/src/org/chromium/ui/UiUtils.java",
] ]
deps = [ deps = [
"//base:base_java", "//base:base_java",
"//components/payments/mojom:mojom_java",
"//third_party/android_deps:androidx_annotation_annotation_java", "//third_party/android_deps:androidx_annotation_annotation_java",
"//third_party/android_deps:androidx_appcompat_appcompat_java", "//third_party/android_deps:androidx_appcompat_appcompat_java",
"//third_party/android_deps:androidx_appcompat_appcompat_resources_java", "//third_party/android_deps:androidx_appcompat_appcompat_resources_java",
"//third_party/android_deps:androidx_core_core_java", "//third_party/android_deps:androidx_core_core_java",
"//third_party/blink/public/mojom:android_mojo_bindings_java",
"//third_party/blink/public/mojom:mojom_platform_java",
] ]
} }

@@ -79,78 +79,6 @@ public class UiUtils {
private UiUtils() { private UiUtils() {
} }
/** A delegate for the contacts picker. */
private static ContactsPickerDelegate sContactsPickerDelegate;
/**
* A delegate interface for the contacts picker.
*/
public interface ContactsPickerDelegate {
/**
* Called to display the contacts picker.
* @param context The context to use.
* @param listener The listener that will be notified of the action the user took in the
* picker.
* @param allowMultiple Whether to allow multiple contacts to be picked.
* @param includeNames Whether to include names of the contacts shared.
* @param includeEmails Whether to include emails of the contacts shared.
* @param includeTel Whether to include telephone numbers of the contacts shared.
* @param includeAddresses Whether to include addresses of the contacts shared.
* @param includeIcons Whether to include addresses of the contacts shared.
* @param formattedOrigin The origin the data will be shared with, formatted for display
* with the scheme omitted.
*/
void showContactsPicker(Context context, ContactsPickerListener listener,
boolean allowMultiple, boolean includeNames, boolean includeEmails,
boolean includeTel, boolean includeAddresses, boolean includeIcons,
String formattedOrigin);
/**
* Called when the contacts picker dialog has been dismissed.
*/
void onContactsPickerDismissed();
}
// ContactsPickerDelegate:
/**
* Allows setting a delegate for an Android contacts picker.
* @param delegate A {@link ContactsPickerDelegate} instance.
*/
public static void setContactsPickerDelegate(ContactsPickerDelegate delegate) {
sContactsPickerDelegate = delegate;
}
/**
* Called to display the contacts picker.
* @param context The context to use.
* @param listener The listener that will be notified of the action the user took in the
* picker.
* @param allowMultiple Whether to allow multiple contacts to be selected.
* @param includeNames Whether to include names in the contact data returned.
* @param includeEmails Whether to include emails in the contact data returned.
* @param includeTel Whether to include telephone numbers in the contact data returned.
* @param includeAddresses Whether to include addresses of the contacts shared.
* @param includeIcons Whether to include icons of the contacts shared.
* @param formattedOrigin The origin the data will be shared with.
*/
public static boolean showContactsPicker(Context context, ContactsPickerListener listener,
boolean allowMultiple, boolean includeNames, boolean includeEmails, boolean includeTel,
boolean includeAddresses, boolean includeIcons, String formattedOrigin) {
if (sContactsPickerDelegate == null) return false;
sContactsPickerDelegate.showContactsPicker(context, listener, allowMultiple, includeNames,
includeEmails, includeTel, includeAddresses, includeIcons, formattedOrigin);
return true;
}
/**
* Called when the contacts picker dialog has been dismissed.
*/
public static void onContactsPickerDismissed() {
if (sContactsPickerDelegate == null) return;
sContactsPickerDelegate.onContactsPickerDismissed();
}
/** /**
* Gets the set of locales supported by the current enabled Input Methods. * Gets the set of locales supported by the current enabled Input Methods.
* @param context A {@link Context} instance. * @param context A {@link Context} instance.