Commit 99a1deab authored by Evan Stade's avatar Evan Stade Committed by Commit Bot

Remove some //chrome dependencies from PhotoPicker.

This prepares it for componentization and re-use by WebLayer.

Some PhotoPicker glue code is moved from UiUtils to SelectFileDialog
because UiUtils can't depend on WindowAndroid. SelectFileDialog is the
only client that calls showPhotoPicker, so it seems like a good place to
hold the delegate code.

Bug: 1110930
Change-Id: I21afcaf0bcccc739f63f75ee745d0c519331e763
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2361123Reviewed-by: default avatarTheresa  <twellington@chromium.org>
Reviewed-by: default avatarFinnur Thorarinsson <finnur@chromium.org>
Commit-Queue: Evan Stade <estade@chromium.org>
Cr-Commit-Position: refs/heads/master@{#799815}
parent a3125dfb
...@@ -93,10 +93,12 @@ import org.chromium.content_public.browser.ChildProcessLauncherHelper; ...@@ -93,10 +93,12 @@ import org.chromium.content_public.browser.ChildProcessLauncherHelper;
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.ContactsPickerListener;
import org.chromium.ui.PhotoPickerListener;
import org.chromium.ui.UiUtils; import org.chromium.ui.UiUtils;
import org.chromium.ui.base.Clipboard; import org.chromium.ui.base.Clipboard;
import org.chromium.ui.base.PhotoPickerDelegate;
import org.chromium.ui.base.PhotoPickerListener;
import org.chromium.ui.base.SelectFileDialog; import org.chromium.ui.base.SelectFileDialog;
import org.chromium.ui.base.WindowAndroid;
import java.io.File; import java.io.File;
import java.util.ArrayList; import java.util.ArrayList;
...@@ -213,14 +215,16 @@ public class ProcessInitializationHandler { ...@@ -213,14 +215,16 @@ public class ProcessInitializationHandler {
Clipboard.getInstance().setImageFileProvider(new ClipboardImageFileProvider()); Clipboard.getInstance().setImageFileProvider(new ClipboardImageFileProvider());
if (ChromeFeatureList.isEnabled(ChromeFeatureList.NEW_PHOTO_PICKER)) { if (ChromeFeatureList.isEnabled(ChromeFeatureList.NEW_PHOTO_PICKER)) {
UiUtils.setPhotoPickerDelegate(new UiUtils.PhotoPickerDelegate() { SelectFileDialog.setPhotoPickerDelegate(new PhotoPickerDelegate() {
private PhotoPickerDialog mDialog; private PhotoPickerDialog mDialog;
@Override @Override
public void showPhotoPicker(Context context, PhotoPickerListener listener, public void showPhotoPicker(WindowAndroid windowAndroid,
boolean allowMultiple, List<String> mimeTypes) { PhotoPickerListener listener, boolean allowMultiple,
mDialog = new PhotoPickerDialog(context, context.getContentResolver(), listener, List<String> mimeTypes) {
allowMultiple, mimeTypes); mDialog = new PhotoPickerDialog(windowAndroid,
windowAndroid.getContext().get().getContentResolver(), listener,
allowMultiple, mimeTypes, new VrModeProviderImpl());
mDialog.getWindow().getAttributes().windowAnimations = mDialog.getWindow().getAttributes().windowAnimations =
R.style.PickerDialogAnimation; R.style.PickerDialogAnimation;
mDialog.show(); mDialog.show();
......
...@@ -6,7 +6,6 @@ package org.chromium.chrome.browser.photo_picker; ...@@ -6,7 +6,6 @@ package org.chromium.chrome.browser.photo_picker;
import android.app.Activity; import android.app.Activity;
import android.content.ContentResolver; import android.content.ContentResolver;
import android.content.Context;
import android.net.Uri; import android.net.Uri;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
...@@ -17,7 +16,9 @@ import org.chromium.base.ApplicationStatus; ...@@ -17,7 +16,9 @@ import org.chromium.base.ApplicationStatus;
import org.chromium.base.ApplicationStatus.ActivityStateListener; import org.chromium.base.ApplicationStatus.ActivityStateListener;
import org.chromium.base.ContextUtils; import org.chromium.base.ContextUtils;
import org.chromium.chrome.R; import org.chromium.chrome.R;
import org.chromium.ui.PhotoPickerListener; import org.chromium.ui.base.PhotoPickerListener;
import org.chromium.ui.base.WindowAndroid;
import org.chromium.ui.vr.VrModeProvider;
import java.util.List; import java.util.List;
...@@ -27,8 +28,8 @@ import java.util.List; ...@@ -27,8 +28,8 @@ import java.util.List;
*/ */
public class PhotoPickerDialog public class PhotoPickerDialog
extends AlertDialog implements PhotoPickerToolbar.PhotoPickerToolbarDelegate { extends AlertDialog implements PhotoPickerToolbar.PhotoPickerToolbarDelegate {
// Our context. // Our window.
private Context mContext; private WindowAndroid mWindowAndroid;
// The category we're showing photos for. // The category we're showing photos for.
private PickerCategoryView mCategoryView; private PickerCategoryView mCategoryView;
...@@ -79,22 +80,25 @@ public class PhotoPickerDialog ...@@ -79,22 +80,25 @@ public class PhotoPickerDialog
/** /**
* The PhotoPickerDialog constructor. * The PhotoPickerDialog constructor.
* @param context The context to use. * @param windowAndroid The window of the hosting Activity.
* @param contentResolver The ContentResolver to use to retrieve image metadata from disk. * @param contentResolver The ContentResolver to use to retrieve image metadata from disk.
* @param listener The listener object that gets notified when an action is taken. * @param listener The listener object that gets notified when an action is taken.
* @param multiSelectionAllowed Whether the photo picker should allow multiple items to be * @param multiSelectionAllowed Whether the photo picker should allow multiple items to be
* selected. * selected.
* @param mimeTypes A list of mime types to show in the dialog. * @param mimeTypes A list of mime types to show in the dialog.
* @param vrModeProvider Used to query VR mode state.
*/ */
public PhotoPickerDialog(Context context, ContentResolver contentResolver, public PhotoPickerDialog(WindowAndroid windowAndroid, ContentResolver contentResolver,
PhotoPickerListener listener, boolean multiSelectionAllowed, List<String> mimeTypes) { PhotoPickerListener listener, boolean multiSelectionAllowed, List<String> mimeTypes,
super(context, R.style.Theme_Chromium_Fullscreen); VrModeProvider vrModeProvider) {
mContext = context; super(windowAndroid.getContext().get(), R.style.Theme_Chromium_Fullscreen);
mWindowAndroid = windowAndroid;
mListenerWrapper = new PhotoPickerListenerWrapper(listener); mListenerWrapper = new PhotoPickerListenerWrapper(listener);
// Initialize the main content view. // Initialize the main content view.
mCategoryView = mCategoryView = new PickerCategoryView(
new PickerCategoryView(context, contentResolver, multiSelectionAllowed, this); windowAndroid, contentResolver, multiSelectionAllowed, this, vrModeProvider);
mCategoryView.initialize(this, mListenerWrapper, mimeTypes); mCategoryView.initialize(this, mListenerWrapper, mimeTypes);
setView(mCategoryView); setView(mCategoryView);
} }
...@@ -131,7 +135,7 @@ public class PhotoPickerDialog ...@@ -131,7 +135,7 @@ public class PhotoPickerDialog
dismiss(); dismiss();
} }
} }
}, ContextUtils.activityFromContext(mContext)); }, ContextUtils.activityFromContext(mWindowAndroid.getContext().get()));
} }
} }
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
package org.chromium.chrome.browser.photo_picker; package org.chromium.chrome.browser.photo_picker;
import android.app.Activity;
import android.content.ContentResolver; import android.content.ContentResolver;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
...@@ -31,15 +32,16 @@ import org.chromium.base.DiscardableReferencePool.DiscardableReference; ...@@ -31,15 +32,16 @@ import org.chromium.base.DiscardableReferencePool.DiscardableReference;
import org.chromium.base.metrics.RecordHistogram; import org.chromium.base.metrics.RecordHistogram;
import org.chromium.base.task.AsyncTask; import org.chromium.base.task.AsyncTask;
import org.chromium.chrome.R; import org.chromium.chrome.R;
import org.chromium.chrome.browser.ChromeActivity;
import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.flags.ChromeFeatureList;
import org.chromium.chrome.browser.vr.VrModeProviderImpl;
import org.chromium.components.browser_ui.util.ConversionUtils; import org.chromium.components.browser_ui.util.ConversionUtils;
import org.chromium.components.browser_ui.util.GlobalDiscardableReferencePool;
import org.chromium.components.browser_ui.widget.selectable_list.SelectableListLayout; import org.chromium.components.browser_ui.widget.selectable_list.SelectableListLayout;
import org.chromium.components.browser_ui.widget.selectable_list.SelectionDelegate; import org.chromium.components.browser_ui.widget.selectable_list.SelectionDelegate;
import org.chromium.net.MimeTypeFilter; import org.chromium.net.MimeTypeFilter;
import org.chromium.ui.PhotoPickerListener; import org.chromium.ui.base.PhotoPickerListener;
import org.chromium.ui.UiUtils; import org.chromium.ui.base.SelectFileDialog;
import org.chromium.ui.base.WindowAndroid;
import org.chromium.ui.vr.VrModeProvider;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
...@@ -90,8 +92,8 @@ public class PickerCategoryView extends RelativeLayout ...@@ -90,8 +92,8 @@ public class PickerCategoryView extends RelativeLayout
// The view containing the RecyclerView and the toolbar, etc. // The view containing the RecyclerView and the toolbar, etc.
private SelectableListLayout<PickerBitmap> mSelectableListLayout; private SelectableListLayout<PickerBitmap> mSelectableListLayout;
// Our activity. // The {@link WindowAndroid} for the {@link Activity}.
private ChromeActivity mActivity; private WindowAndroid mWindowAndroid;
// The ContentResolver to use to retrieve image metadata from disk. // The ContentResolver to use to retrieve image metadata from disk.
private ContentResolver mContentResolver; private ContentResolver mContentResolver;
...@@ -190,15 +192,18 @@ public class PickerCategoryView extends RelativeLayout ...@@ -190,15 +192,18 @@ public class PickerCategoryView extends RelativeLayout
private ImageView mZoom; private ImageView mZoom;
/** /**
* @param context The context to use. * @param windowAndroid The window of the hosting {@link Activity}.
* @param contentResolver The ContentResolver to use to retrieve image metadata from disk. * @param contentResolver The ContentResolver to use to retrieve image metadata from disk.
* @param multiSelectionAllowed Whether to allow the user to select more than one image. * @param multiSelectionAllowed Whether to allow the user to select more than one image.
* @param vrModeProvider The VR mode provider for querying VR mode state.
*/ */
@SuppressWarnings("unchecked") // mSelectableListLayout @SuppressWarnings("unchecked") // mSelectableListLayout
public PickerCategoryView(Context context, ContentResolver contentResolver, public PickerCategoryView(WindowAndroid windowAndroid, ContentResolver contentResolver,
boolean multiSelectionAllowed, PhotoPickerToolbar.PhotoPickerToolbarDelegate delegate) { boolean multiSelectionAllowed, PhotoPickerToolbar.PhotoPickerToolbarDelegate delegate,
super(context); VrModeProvider vrModeProvider) {
mActivity = (ChromeActivity) context; super(windowAndroid.getContext().get());
mWindowAndroid = windowAndroid;
Context context = mWindowAndroid.getContext().get();
mContentResolver = contentResolver; mContentResolver = contentResolver;
mMultiSelectionAllowed = multiSelectionAllowed; mMultiSelectionAllowed = multiSelectionAllowed;
...@@ -221,7 +226,7 @@ public class PickerCategoryView extends RelativeLayout ...@@ -221,7 +226,7 @@ public class PickerCategoryView extends RelativeLayout
: R.string.photo_picker_select_image; : R.string.photo_picker_select_image;
PhotoPickerToolbar toolbar = (PhotoPickerToolbar) mSelectableListLayout.initializeToolbar( PhotoPickerToolbar toolbar = (PhotoPickerToolbar) mSelectableListLayout.initializeToolbar(
R.layout.photo_picker_toolbar, mSelectionDelegate, titleId, 0, 0, null, false, R.layout.photo_picker_toolbar, mSelectionDelegate, titleId, 0, 0, null, false,
false, new VrModeProviderImpl()); false, vrModeProvider);
toolbar.setNavigationOnClickListener(this); toolbar.setNavigationOnClickListener(this);
toolbar.setDelegate(delegate); toolbar.setDelegate(delegate);
Button doneButton = (Button) toolbar.findViewById(R.id.done); Button doneButton = (Button) toolbar.findViewById(R.id.done);
...@@ -231,7 +236,7 @@ public class PickerCategoryView extends RelativeLayout ...@@ -231,7 +236,7 @@ public class PickerCategoryView extends RelativeLayout
calculateGridMetrics(); calculateGridMetrics();
mLayoutManager = new GridLayoutManager(mActivity, mColumns); mLayoutManager = new GridLayoutManager(context, mColumns);
mRecyclerView.setHasFixedSize(true); mRecyclerView.setHasFixedSize(true);
mRecyclerView.setLayoutManager(mLayoutManager); mRecyclerView.setLayoutManager(mLayoutManager);
mSpacingDecoration = new GridSpacingItemDecoration(mColumns, mPadding); mSpacingDecoration = new GridSpacingItemDecoration(mColumns, mPadding);
...@@ -279,7 +284,7 @@ public class PickerCategoryView extends RelativeLayout ...@@ -279,7 +284,7 @@ public class PickerCategoryView extends RelativeLayout
} }
if (mDecoderServiceHost != null) { if (mDecoderServiceHost != null) {
mDecoderServiceHost.unbind(mActivity); mDecoderServiceHost.unbind(mWindowAndroid.getContext().get());
mDecoderServiceHost = null; mDecoderServiceHost = null;
} }
} }
...@@ -492,7 +497,7 @@ public class PickerCategoryView extends RelativeLayout ...@@ -492,7 +497,7 @@ public class PickerCategoryView extends RelativeLayout
public LruCache<String, Thumbnail> getLowResThumbnails() { public LruCache<String, Thumbnail> getLowResThumbnails() {
if (mLowResThumbnails == null || mLowResThumbnails.get() == null) { if (mLowResThumbnails == null || mLowResThumbnails.get() == null) {
mLowResThumbnails = mActivity.getReferencePool().put( mLowResThumbnails = GlobalDiscardableReferencePool.getReferencePool().put(
new LruCache<String, Thumbnail>(mCacheSizeSmall)); new LruCache<String, Thumbnail>(mCacheSizeSmall));
} }
return mLowResThumbnails.get(); return mLowResThumbnails.get();
...@@ -500,7 +505,7 @@ public class PickerCategoryView extends RelativeLayout ...@@ -500,7 +505,7 @@ public class PickerCategoryView extends RelativeLayout
public LruCache<String, Thumbnail> getHighResThumbnails() { public LruCache<String, Thumbnail> getHighResThumbnails() {
if (mHighResThumbnails == null || mHighResThumbnails.get() == null) { if (mHighResThumbnails == null || mHighResThumbnails.get() == null) {
mHighResThumbnails = mActivity.getReferencePool().put( mHighResThumbnails = GlobalDiscardableReferencePool.getReferencePool().put(
new LruCache<String, Thumbnail>(mCacheSizeLarge)); new LruCache<String, Thumbnail>(mCacheSizeLarge));
} }
return mHighResThumbnails.get(); return mHighResThumbnails.get();
...@@ -508,7 +513,7 @@ public class PickerCategoryView extends RelativeLayout ...@@ -508,7 +513,7 @@ public class PickerCategoryView extends RelativeLayout
public LruCache<String, Thumbnail> getFullScreenBitmaps() { public LruCache<String, Thumbnail> getFullScreenBitmaps() {
if (mFullScreenBitmaps == null || mFullScreenBitmaps.get() == null) { if (mFullScreenBitmaps == null || mFullScreenBitmaps.get() == null) {
mFullScreenBitmaps = mActivity.getReferencePool().put( mFullScreenBitmaps = GlobalDiscardableReferencePool.getReferencePool().put(
new LruCache<String, Thumbnail>(mCacheSizeFullScreen)); new LruCache<String, Thumbnail>(mCacheSizeFullScreen));
} }
return mFullScreenBitmaps.get(); return mFullScreenBitmaps.get();
...@@ -537,14 +542,15 @@ public class PickerCategoryView extends RelativeLayout ...@@ -537,14 +542,15 @@ public class PickerCategoryView extends RelativeLayout
*/ */
private void calculateGridMetrics() { private void calculateGridMetrics() {
DisplayMetrics displayMetrics = new DisplayMetrics(); DisplayMetrics displayMetrics = new DisplayMetrics();
mActivity.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); Activity activity = (Activity) mWindowAndroid.getContext().get();
activity.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
int width = displayMetrics.widthPixels; int width = displayMetrics.widthPixels;
int minSize = int minSize =
mActivity.getResources().getDimensionPixelSize(R.dimen.photo_picker_tile_min_size); activity.getResources().getDimensionPixelSize(R.dimen.photo_picker_tile_min_size);
mPadding = mMagnifyingMode mPadding = mMagnifyingMode
? 0 ? 0
: mActivity.getResources().getDimensionPixelSize(R.dimen.photo_picker_tile_gap); : activity.getResources().getDimensionPixelSize(R.dimen.photo_picker_tile_gap);
mColumns = mMagnifyingMode ? 1 : Math.max(1, (width - mPadding) / (minSize + mPadding)); mColumns = mMagnifyingMode ? 1 : Math.max(1, (width - mPadding) / (minSize + mPadding));
mImageWidth = (width - mPadding * (mColumns + 1)) / (mColumns); mImageWidth = (width - mPadding * (mColumns + 1)) / (mColumns);
mImageHeight = mMagnifyingMode mImageHeight = mMagnifyingMode
...@@ -572,7 +578,7 @@ public class PickerCategoryView extends RelativeLayout ...@@ -572,7 +578,7 @@ public class PickerCategoryView extends RelativeLayout
} }
mEnumStartTime = SystemClock.elapsedRealtime(); mEnumStartTime = SystemClock.elapsedRealtime();
mWorkerTask = new FileEnumWorkerTask(mActivity.getWindowAndroid(), this, mWorkerTask = new FileEnumWorkerTask(mWindowAndroid, this,
new MimeTypeFilter(mMimeTypes, true), mMimeTypes, mContentResolver); new MimeTypeFilter(mMimeTypes, true), mMimeTypes, mContentResolver);
mWorkerTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); mWorkerTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
} }
...@@ -648,7 +654,7 @@ public class PickerCategoryView extends RelativeLayout ...@@ -648,7 +654,7 @@ public class PickerCategoryView extends RelativeLayout
@PhotoPickerListener.PhotoPickerAction int action, Uri[] photos, int umaId) { @PhotoPickerListener.PhotoPickerAction int action, Uri[] photos, int umaId) {
mListener.onPhotoPickerUserAction(action, photos); mListener.onPhotoPickerUserAction(action, photos);
mDialog.dismiss(); mDialog.dismiss();
UiUtils.onPhotoPickerDismissed(); SelectFileDialog.onPhotoPickerDismissed();
recordFinalUmaStats(umaId); recordFinalUmaStats(umaId);
} }
......
...@@ -34,6 +34,7 @@ import org.chromium.base.test.util.UrlUtils; ...@@ -34,6 +34,7 @@ import org.chromium.base.test.util.UrlUtils;
import org.chromium.chrome.R; import org.chromium.chrome.R;
import org.chromium.chrome.browser.ChromeActivity; import org.chromium.chrome.browser.ChromeActivity;
import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.flags.ChromeSwitches;
import org.chromium.chrome.browser.vr.VrModeProviderImpl;
import org.chromium.chrome.test.ChromeActivityTestRule; import org.chromium.chrome.test.ChromeActivityTestRule;
import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
import org.chromium.chrome.test.util.ChromeRenderTestRule; import org.chromium.chrome.test.util.ChromeRenderTestRule;
...@@ -42,7 +43,7 @@ import org.chromium.components.browser_ui.widget.selectable_list.SelectionDelega ...@@ -42,7 +43,7 @@ import org.chromium.components.browser_ui.widget.selectable_list.SelectionDelega
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.test.util.TestThreadUtils; import org.chromium.content_public.browser.test.util.TestThreadUtils;
import org.chromium.content_public.browser.test.util.TouchCommon; import org.chromium.content_public.browser.test.util.TouchCommon;
import org.chromium.ui.PhotoPickerListener; import org.chromium.ui.base.PhotoPickerListener;
import org.chromium.ui.test.util.DisableAnimationsTestRule; import org.chromium.ui.test.util.DisableAnimationsTestRule;
import java.io.File; import java.io.File;
...@@ -257,8 +258,9 @@ public class PhotoPickerDialogTest implements PhotoPickerListener, SelectionObse ...@@ -257,8 +258,9 @@ public class PhotoPickerDialogTest implements PhotoPickerListener, SelectionObse
@Override @Override
public PhotoPickerDialog call() { public PhotoPickerDialog call() {
final PhotoPickerDialog dialog = new PhotoPickerDialog( final PhotoPickerDialog dialog = new PhotoPickerDialog(
mActivityTestRule.getActivity(), contentResolver, mActivityTestRule.getActivity().getWindowAndroid(), contentResolver,
PhotoPickerDialogTest.this, multiselect, mimeTypes); PhotoPickerDialogTest.this, multiselect, mimeTypes,
new VrModeProviderImpl());
dialog.show(); dialog.show();
return dialog; return dialog;
} }
......
...@@ -207,7 +207,6 @@ android_library("ui_utils_java") { ...@@ -207,7 +207,6 @@ android_library("ui_utils_java") {
sources = [ sources = [
"java/src/org/chromium/ui/ContactsPickerListener.java", "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/PhotoPickerListener.java",
"java/src/org/chromium/ui/UiUtils.java", "java/src/org/chromium/ui/UiUtils.java",
] ]
deps = [ deps = [
...@@ -255,6 +254,8 @@ android_library("ui_full_java") { ...@@ -255,6 +254,8 @@ android_library("ui_full_java") {
"java/src/org/chromium/ui/base/IntentWindowAndroid.java", "java/src/org/chromium/ui/base/IntentWindowAndroid.java",
"java/src/org/chromium/ui/base/LocalizationUtils.java", "java/src/org/chromium/ui/base/LocalizationUtils.java",
"java/src/org/chromium/ui/base/PermissionCallback.java", "java/src/org/chromium/ui/base/PermissionCallback.java",
"java/src/org/chromium/ui/base/PhotoPickerDelegate.java",
"java/src/org/chromium/ui/base/PhotoPickerListener.java",
"java/src/org/chromium/ui/base/ResourceBundle.java", "java/src/org/chromium/ui/base/ResourceBundle.java",
"java/src/org/chromium/ui/base/SPenSupport.java", "java/src/org/chromium/ui/base/SPenSupport.java",
"java/src/org/chromium/ui/base/SelectFileDialog.java", "java/src/org/chromium/ui/base/SelectFileDialog.java",
......
...@@ -79,9 +79,6 @@ public class UiUtils { ...@@ -79,9 +79,6 @@ public class UiUtils {
private UiUtils() { private UiUtils() {
} }
/** A delegate for the photo picker. */
private static PhotoPickerDelegate sPhotoPickerDelegate;
/** A delegate for the contacts picker. */ /** A delegate for the contacts picker. */
private static ContactsPickerDelegate sContactsPickerDelegate; private static ContactsPickerDelegate sContactsPickerDelegate;
...@@ -114,32 +111,6 @@ public class UiUtils { ...@@ -114,32 +111,6 @@ public class UiUtils {
void onContactsPickerDismissed(); void onContactsPickerDismissed();
} }
/**
* A delegate interface for the photo picker.
*/
public interface PhotoPickerDelegate {
/**
* Called to display the photo 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 the dialog should allow multiple images to be selected.
* @param mimeTypes A list of mime types to show in the dialog.
*/
void showPhotoPicker(Context context, PhotoPickerListener listener, boolean allowMultiple,
List<String> mimeTypes);
/**
* Called when the photo picker dialog has been dismissed.
*/
void onPhotoPickerDismissed();
/**
* Returns whether video decoding support is supported in the photo picker.
*/
boolean supportsVideos();
}
// ContactsPickerDelegate: // ContactsPickerDelegate:
/** /**
...@@ -180,55 +151,6 @@ public class UiUtils { ...@@ -180,55 +151,6 @@ public class UiUtils {
sContactsPickerDelegate.onContactsPickerDismissed(); sContactsPickerDelegate.onContactsPickerDismissed();
} }
// PhotoPickerDelegate:
/**
* Allows setting a delegate to override the default Android stock photo picker.
* @param delegate A {@link PhotoPickerDelegate} instance.
*/
public static void setPhotoPickerDelegate(PhotoPickerDelegate delegate) {
sPhotoPickerDelegate = delegate;
}
/**
* Returns whether a photo picker should be called.
*/
public static boolean shouldShowPhotoPicker() {
return sPhotoPickerDelegate != null;
}
/**
* Returns whether the photo picker supports showing videos.
*/
public static boolean photoPickerSupportsVideo() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) return false;
if (!shouldShowPhotoPicker()) return false;
return sPhotoPickerDelegate.supportsVideos();
}
/**
* Called to display the photo 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 the dialog should allow multiple images to be selected.
* @param mimeTypes A list of mime types to show in the dialog.
*/
public static boolean showPhotoPicker(Context context, PhotoPickerListener listener,
boolean allowMultiple, List<String> mimeTypes) {
if (sPhotoPickerDelegate == null) return false;
sPhotoPickerDelegate.showPhotoPicker(context, listener, allowMultiple, mimeTypes);
return true;
}
/**
* Called when the photo picker dialog has been dismissed.
*/
public static void onPhotoPickerDismissed() {
if (sPhotoPickerDelegate == null) return;
sPhotoPickerDelegate.onPhotoPickerDismissed();
}
/** /**
* 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.
......
// 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.ui.base;
import java.util.List;
/** A delegate interface for the photo picker. */
public interface PhotoPickerDelegate {
/**
* Called to display the photo picker.
* @param windowAndroid The window of the Activity.
* @param listener The listener that will be notified of the action the user took in the
* picker.
* @param allowMultiple Whether the dialog should allow multiple images to be selected.
* @param mimeTypes A list of mime types to show in the dialog.
*/
void showPhotoPicker(WindowAndroid windowAndroid, PhotoPickerListener listener,
boolean allowMultiple, List<String> mimeTypes);
/**
* Called when the photo picker dialog has been dismissed.
*/
void onPhotoPickerDismissed();
/**
* Returns whether video decoding support is supported in the photo picker.
*/
boolean supportsVideos();
}
...@@ -2,7 +2,7 @@ ...@@ -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.ui.base;
import android.net.Uri; import android.net.Uri;
......
...@@ -34,7 +34,6 @@ import org.chromium.base.metrics.RecordHistogram; ...@@ -34,7 +34,6 @@ import org.chromium.base.metrics.RecordHistogram;
import org.chromium.base.task.AsyncTask; import org.chromium.base.task.AsyncTask;
import org.chromium.base.task.PostTask; import org.chromium.base.task.PostTask;
import org.chromium.base.task.TaskTraits; import org.chromium.base.task.TaskTraits;
import org.chromium.ui.PhotoPickerListener;
import org.chromium.ui.R; import org.chromium.ui.R;
import org.chromium.ui.UiUtils; import org.chromium.ui.UiUtils;
...@@ -113,6 +112,25 @@ public class SelectFileDialog implements WindowAndroid.IntentCallback, PhotoPick ...@@ -113,6 +112,25 @@ public class SelectFileDialog implements WindowAndroid.IntentCallback, PhotoPick
/** Whether an Activity is available to capture audio. */ /** Whether an Activity is available to capture audio. */
private boolean mSupportsAudioCapture; private boolean mSupportsAudioCapture;
/** A delegate for the photo picker. */
private static PhotoPickerDelegate sPhotoPickerDelegate;
/**
* Allows setting a delegate to override the default Android stock photo picker.
* @param delegate A {@link PhotoPickerDelegate} instance.
*/
public static void setPhotoPickerDelegate(PhotoPickerDelegate delegate) {
sPhotoPickerDelegate = delegate;
}
/**
* Called when the photo picker dialog has been dismissed.
*/
public static void onPhotoPickerDismissed() {
if (sPhotoPickerDelegate == null) return;
sPhotoPickerDelegate.onPhotoPickerDismissed();
}
SelectFileDialog(long nativeSelectFileDialog) { SelectFileDialog(long nativeSelectFileDialog) {
mNativeSelectFileDialog = nativeSelectFileDialog; mNativeSelectFileDialog = nativeSelectFileDialog;
} }
...@@ -261,12 +279,10 @@ public class SelectFileDialog implements WindowAndroid.IntentCallback, PhotoPick ...@@ -261,12 +279,10 @@ public class SelectFileDialog implements WindowAndroid.IntentCallback, PhotoPick
if (mWindowAndroid.showIntent(soundRecorder, this, R.string.low_memory_error)) return; if (mWindowAndroid.showIntent(soundRecorder, this, R.string.low_memory_error)) return;
} }
Activity activity = mWindowAndroid.getActivity().get();
// Use the new photo picker, if available. // Use the new photo picker, if available.
List<String> imageMimeTypes = convertToSupportedPhotoPickerTypes(mFileTypes); List<String> imageMimeTypes = convertToSupportedPhotoPickerTypes(mFileTypes);
if (shouldUsePhotoPicker() if (shouldUsePhotoPicker()
&& UiUtils.showPhotoPicker(activity, this, mAllowMultiple, imageMimeTypes)) { && showPhotoPicker(mWindowAndroid, this, mAllowMultiple, imageMimeTypes)) {
return; return;
} }
...@@ -327,7 +343,7 @@ public class SelectFileDialog implements WindowAndroid.IntentCallback, PhotoPick ...@@ -327,7 +343,7 @@ public class SelectFileDialog implements WindowAndroid.IntentCallback, PhotoPick
*/ */
private boolean shouldUsePhotoPicker() { private boolean shouldUsePhotoPicker() {
List<String> mediaMimeTypes = convertToSupportedPhotoPickerTypes(mFileTypes); List<String> mediaMimeTypes = convertToSupportedPhotoPickerTypes(mFileTypes);
return !captureImage() && mediaMimeTypes != null && UiUtils.shouldShowPhotoPicker() return !captureImage() && mediaMimeTypes != null && shouldShowPhotoPicker()
&& mWindowAndroid.getActivity().get() != null; && mWindowAndroid.getActivity().get() != null;
} }
...@@ -345,7 +361,7 @@ public class SelectFileDialog implements WindowAndroid.IntentCallback, PhotoPick ...@@ -345,7 +361,7 @@ public class SelectFileDialog implements WindowAndroid.IntentCallback, PhotoPick
for (String type : fileTypes) { for (String type : fileTypes) {
String mimeType = ensureMimeType(type); String mimeType = ensureMimeType(type);
if (!mimeType.startsWith("image/")) { if (!mimeType.startsWith("image/")) {
if (!UiUtils.photoPickerSupportsVideo() || !mimeType.startsWith("video/")) { if (!photoPickerSupportsVideo() || !mimeType.startsWith("video/")) {
return null; return null;
} }
} }
...@@ -828,6 +844,23 @@ public class SelectFileDialog implements WindowAndroid.IntentCallback, PhotoPick ...@@ -828,6 +844,23 @@ public class SelectFileDialog implements WindowAndroid.IntentCallback, PhotoPick
RecordHistogram.recordCount100Histogram("Android.SelectFileDialogImgCount", count); RecordHistogram.recordCount100Histogram("Android.SelectFileDialogImgCount", count);
} }
private static boolean shouldShowPhotoPicker() {
return sPhotoPickerDelegate != null;
}
private static boolean photoPickerSupportsVideo() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) return false;
if (!shouldShowPhotoPicker()) return false;
return sPhotoPickerDelegate.supportsVideos();
}
private static boolean showPhotoPicker(WindowAndroid windowAndroid,
PhotoPickerListener listener, boolean allowMultiple, List<String> mimeTypes) {
if (sPhotoPickerDelegate == null) return false;
sPhotoPickerDelegate.showPhotoPicker(windowAndroid, listener, allowMultiple, mimeTypes);
return true;
}
@VisibleForTesting @VisibleForTesting
@CalledByNative @CalledByNative
static SelectFileDialog create(long nativeSelectFileDialog) { static SelectFileDialog create(long nativeSelectFileDialog) {
......
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